/* meow_touch.c — 实现 Launcher 统一触摸接口(见 meow_touch.h)。 */ #include "meow_touch.h" void mt_reset(meow_touch *mt) { mt->down = 0; mt->valid = 0; mt->down_x = -1; mt->down_y = -1; mt->last_x = -1; mt->last_y = -1; } void mt_abs(meow_touch *mt, int x, int y) { if (x >= 0) mt->last_x = x; if (y >= 0) mt->last_y = y; /* 已按下且原点未锁,且两轴终于都有效 → 锁原点(goodix 时序免疫:只认 down 之后 * 的首个有效坐标,绝不锁残留 -1/上一手势旧坐标)。 */ if (mt->down && !mt->valid && mt->last_x >= 0 && mt->last_y >= 0) { mt->down_x = mt->last_x; mt->down_y = mt->last_y; mt->valid = 1; } } int mt_down(meow_touch *mt) { mt->down = 1; mt->valid = 0; /* 本次以「无坐标」起步:BTN_TOUCH 先于 ABS(本设备实测),down 前的 last 是上一 * 手势残留(-1/旧坐标),必须丢弃,只认 down 后到来的首个有效 ABS。 */ mt->last_x = -1; mt->last_y = -1; return 1; } int mt_up(meow_touch *mt, int *dx, int *dy) { int tx = mt->down_x, ty = mt->down_y; int was_valid = mt->valid; int ddx = mt->last_x - tx, ddy = mt->last_y - ty; int adx = ddx < 0 ? -ddx : ddx, ady = ddy < 0 ? -ddy : ddy; if (dx) *dx = ddx; if (dy) *dy = ddy; /* 复位手势态(down/valid);保留 down_x/y 供 mt_in 判定按钮命中,调用方下一手势 * 再由 mt_down 重置。 */ mt->down = 0; mt->valid = 0; if (!was_valid || tx < 0 || ty < 0) return 0; /* 从未锁到有效坐标:ghost/残留,丢本次 */ if (adx >= MEOW_TOUCH_SWIPE_THRESH || ady >= MEOW_TOUCH_SWIPE_THRESH) return 0; /* 滑动 */ return 1; /* 有效 tap */ } int mt_in(meow_touch *mt, int x, int y, int w, int h) { return mt->down_x >= x && mt->down_x < x + w && mt->down_y >= y && mt->down_y < y + h; } /* 全局左缘返回判定(A-0):原点在左缘 + 向右位移≥MEOW_EDGE_SWIPE 且横向主导。 * 与 SDK meow_ui_input.c 的 EDGE_W/SWIPE_THRESH 同一语义,供设置页/应用列表复用。 */ int meow_edge_back(int down_x, int dx, int dy) { int ady = dy < 0 ? -dy : dy; if (down_x >= 0 && down_x < MEOW_EDGE_W && dx >= MEOW_EDGE_SWIPE && ady < dx) return 1; return 0; }