/* meow_touch.h — Launcher 统一触摸接口(轻量,不依赖 SDK)。 * * 背景:Launcher 的低性能 UI(应用列表 / 电源菜单 / 确认框)各自有一套独立、重复的 * 触摸解析,除应用列表(M2.23 已修原点锁定)外其余都踩同一个 goodix 依赖 bug: * BTN_TOUCH=1 按下边沿到来时 ABS 坐标可能尚未更新(goodix 时序不保证 ABS 与 * BTN_TOUCH 先后),旧代码在按下边沿用「当时 t_last_x/y」立即锁原点 → 锁到上一手势 * 残留(-1/旧坐标)→ 抬手命中按钮失败 → 「点两下」。本接口把「坐标时序免疫」的 * 手势解析收敛成一份,供各 UI 复用,语义与 M2.23 应用列表修法一致。 * * 关键语义: * - mt_down() 不立即锁原点:只标「已按下」,并把 last 坐标归 -1(本次以无坐标起步), * 原点由 mt_abs() 在 down 之后出现的首个有效坐标锁定(BOTH >=0 才锁)。杜绝 GOODIX * 残留,与 M2.23 应用列表 t_down_valid 同源。 * - mt_up() 算抬手位移:abs(dx)>=MEOW_TOUCH_SWIPE_THRESH || abs(dy)>=… → 判滑动 * (返回 0,供将来切屏),否则有效 tap(返回 1)。抬手后复位手势态(down/valid), * 但保留 down_x/y 供 mt_in() 判定按钮命中 —— 调用方处理完再开下一手势。 * - mt_reset() 彻底清空,杜绝跨手势污染。 * * 与应用列表(run_menu 内联,M2.23 直接内联实现)语义一致;列表保留内联(含 cooldown * 丢弃/滑动日志/行带判定等额外逻辑),其余 UI 迁到本接口。 */ #ifndef MEOW_TOUCH_H #define MEOW_TOUCH_H typedef struct meow_touch { int down, valid; /* down=已按下;valid=原点已锁(down 后首个有效 ABS) */ int down_x, down_y; /* 按下原点(goodix 时序免疫:等 down 后首个有效坐标才锁) */ int last_x, last_y; /* 最新坐标(-1=本次尚未见到有效坐标) */ } meow_touch; /* 抬手位移 >= 阈值判为滑动(不命中);与 launcher MENU_SWIPE_THRESH(65) 一致。 */ #define MEOW_TOUCH_SWIPE_THRESH 65 /* 全局左缘返回判定(A-0 方案,M2.39 抽出共享,供设置页/应用列表等 system 界面复用, * 与 SDK meow_ui_input.c 的 EDGE_W(24)/SWIPE_THRESH(65) 对齐——同一套"左缘起点+右滑≥阈值" * 语义,避免各界面自造重复判定。 */ #define MEOW_EDGE_W 24 /* 左缘起点宽度(down_x < 此值才认返回手势) */ #define MEOW_EDGE_SWIPE 65 /* 向右位移阈值(dx >= 此值且横向主导 → 左缘返回) */ /* 左缘返回判定:down_x=按下原点X,dx/dy=抬手位移。 * 返回 1=命中(left-edge + 向右≥MEOW_EDGE_SWIPE 且横向主导);0=否。 * 供设置页/应用列表等系统界面复用;SDK 手势引擎对 APP 用 on_swipe(LEFT) 同语义。 */ int meow_edge_back(int down_x, int dx, int dy); /* 手势结束彻底清空(下一手势零污染;也用于起始初始化)。 */ void mt_reset(meow_touch *mt); /* 喂 ABS_X/ABS_Y(调用方按事件逐个喂:AX 事件传 (val, mt->last_y),AY 事件传 * (mt->last_x, val)):更新 last;若已按下且未锁原点且两轴均有效 → 锁原点。 */ void mt_abs(meow_touch *mt, int x, int y); /* BTN_TOUCH=1 按下边沿:标 down + last 归 -1(本次以无坐标起步,只认 down 后首个有效 * ABS 作原点)。返回 1=接受此按下(是否进一步处理由调用方决定,如 cooldown/日志)。 */ int mt_down(meow_touch *mt); /* BTN_TOUCH=0 抬手边沿:计算位移写入 dx/dy 输出参数;复位 down/valid(保留 down_x/y 供 mt_in)。 * 返回 1=有效 tap,0=滑动(位移>=阈值)或从未锁到有效坐标(ghost/残留)。 */ int mt_up(meow_touch *mt, int *dx, int *dy); /* 按下原点是否落在矩形 [x, x+w) × [y, y+h)(tap 命中;须在 mt_up() 返回 1 后调用)。 */ int mt_in(meow_touch *mt, int x, int y, int w, int h); #endif /* MEOW_TOUCH_H */