feat(sdk): 通用长按事件 (agent-191, 用户定案) — MEOW_EV_LONG_PRESS 坐标式事件+meow_ui_set_long_press_cb/ms(opt-in,默认500ms,移动>12px取消,长按后抬手抑制TAP/SWIPE); 按钮按住视觉阈值同源; files 长按从App层迁入 SDK

meow_ui.a 4335c33a→6de89c27; hello→72fb20da; files→b1c4f58f
宿主 widgets(含6条长按断言)/p1p2p3/ime_fix/test_fsx 全 PASS; 未改 meow_ui_events 结构(防 -Wmissing-field-initializers 破坏既有App)
This commit is contained in:
MeowOS committed 2026-08-31 05:04:26 +08:00
1 parent 60072a08f1
commit e95552b949
14 files changed
+200 -35

No files matched your search

+60
View File
@@ -92,6 +92,9 @@ static void free_all(void)
g_wn = 0;
}
/* §6.3 通用长按测试回调(开闸长按判定用;事件本身经 meow_input_pop 断言)。 */
static void lp_recv(int x, int y) { (void)x; (void)y; }
int main(void)
{
setenv("MEOW_UI_DUMP", "/tmp/b2.ppm", 1);
@@ -301,6 +304,63 @@ int main(void)
meow_sheet_free(sh);
printf("PASS dialog/sheet: create/set_items/add_item (blocking show skipped)\n");
/* ---------- §6.3 通用长按:触发/取消/短按不受影响(模拟时序) ----------
* 用 meow_input_touch_set(按下+已按住时长回拨)驱动 SDK 触摸状态机,meow_input_long_press_poll
* 检测阈值跨越;meow_input_touch_release 走真实 touch_release(含长按后抑制 TAP/SWIPE)。
* 断言:① 长按触发(poll=1 + 入队 LONG_PRESS);② 长按后抬手不再产生 TAP;③ 短按不受影响;
* ④ 移动超容忍取消长按;⑤ 阈值可配;⑥ 未注册回调 = 长按关闭(opt-in,hello 等零回归)。 */
{
meow_input_ev e;
meow_input_drain();
meow_input_touch_set(0, 0, 0, 0); /* 复位(清任何残留按住态) */
meow_ui_set_long_press_ms(500); /* 显式回默认,防其它段干扰 */
/* ⑥ opt-in:未注册回调 → 长按判定关闭:poll=0(即使 hold≥阈值),抬手照常 TAP。 */
assert(meow_input_long_press_poll() == 0);
meow_input_touch_set(1, 130, 310, 700);
assert(meow_input_long_press_poll() == 0); /* 未注册回调:不触发 */
meow_input_touch_release();
assert(meow_input_pop(&e) == 1 && e.type == MEOW_EV_TAP);
meow_ui_set_long_press_cb(lp_recv);
/* ① 长按触发:hold=700ms(≥500)→ poll=1,LONG_PRESS 入队且坐标=按下点。 */
meow_input_touch_set(1, 120, 300, 700);
assert(meow_input_long_press_poll() == 1);
assert(meow_input_pop(&e) == 1 && e.type == MEOW_EV_LONG_PRESS && e.a == 120 && e.b == 300);
/* ② 长按后抬手:点击被抑制(不再产生 TAP)。 */
meow_input_touch_release();
assert(meow_input_pop(&e) == 0);
/* ③ 短按不受影响:hold=100ms(<500)→ poll=0(不触发);抬手 → TAP 正常。 */
meow_input_touch_set(1, 200, 400, 100);
assert(meow_input_long_press_poll() == 0);
meow_input_touch_release();
assert(meow_input_pop(&e) == 1 && e.type == MEOW_EV_TAP && e.a == 200 && e.b == 400);
/* ④ 长按取消(移动超容忍):hold=700ms 但按下后位移 30px(>12)→ poll=0;抬手仍 TAP
* (位移 < SWIPE_THRESH 65,手势判定为点击)。 */
meow_input_touch_set(1, 300, 500, 700);
meow_input_touch_move(300 + 30, 500);
assert(meow_input_long_press_poll() == 0);
meow_input_touch_release();
assert(meow_input_pop(&e) == 1 && e.type == MEOW_EV_TAP);
/* ⑤ 阈值可配:设 200ms → hold=250ms 也触发;恢复默认。 */
meow_ui_set_long_press_ms(200);
assert(meow_ui_long_press_ms() == 200);
meow_input_touch_set(1, 180, 260, 250);
assert(meow_input_long_press_poll() == 1);
meow_input_touch_release();
meow_ui_set_long_press_ms(500);
assert(meow_ui_long_press_ms() == 500);
meow_ui_set_long_press_cb(NULL); /* 复位,避免影响其它段 */
meow_input_touch_set(0, 0, 0, 0); /* 复位,避免影响后续绘制 */
meow_input_drain();
printf("PASS long-press: trigger/suppress-tap/short-tap/cancel-move/configurable/opt-in\n");
}
/* ---------- 绘制所有控件到 back_buf(5x7 兜底),flush 出屏幕 ---------- */
const meow_theme *th = meow_theme_get();
meow_ui_clear(th->bg);