Files
MeowOS-For-R3P2/patch_v2/meow_launcherd/meow_touch.c
T
MeowOS Dev 245bee2946 MeowOS for HiBy R3 Pro II — 公共发布版本(历史已重置)
• 全新单提交:清除含敏感信息的旧历史(sudo 口令、内网 IP、SSH 密钥路径、热点 SSID、设备 MAC)
• 本地开发文档/测试记录/构建脚本全部移入 gitignored 的 devdocs/ 与 scripts/build/(不入库)
• 保留:MeowOS 源码(launcher/watchdog/bootmenu/meow_svcd/SDK)、项目规范文档、mips-repo
增补组件:SDK 统一日志+通知 API、meow_svcd 服务管理器、mips-repo 软件仓库
2026-08-30 01:12:34 +08:00

70 lines
2.3 KiB
C

/* 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;
}