图库: 锁屏长按退格在真机可达(仅在锁屏页启用长按)

M29 评审 P2-1:SDK 长按是 opt-in,全仓没有运行时调用
meow_ui_set_long_press_cb,meow_input_long_press_poll 恒返回 0,真机上
MEOW_EV_LONG_PRESS 永不产生——「长按退格清空」只表现为删一位。

- app.c 注册 no-op 长按回调,但只在 ACT_LOCK 为顶层页时启用(进主循环前对齐
  一次 + on_tick 每拍对齐),解锁 pop 后置 NULL。全程开启会让长按触发后的
  抬手不再产生 TAP/SWIPE,吞掉书库/阅读器里「按住 >=500ms」的点击。
- test_settings_lock_host:长按用例改走真实 SDK 路径——未注册 poll==0(P2
  根因)、注册后按住 700ms 产出 LONG_PRESS 且坐标=退格键心、被锁屏 view 消费、
  抬手不补发 TAP、解锁后关掉再 poll==0。
- lock.c 头注释补上该 opt-in 依赖,避免以后只看锁屏页时误判可达。
This commit is contained in:
AskaEth committed 2026-11-06 11:46:31 +08:00
1 parent 606a04a44e
commit 87f4ad0a82
3 files changed
+64 -10

No files matched your search

+36 -9
View File
@@ -11,7 +11,8 @@
* 主题模式切换后整帧重绘不崩,以及两条端到端路径:
* - **锁屏页内自绘 12 键数字键盘**(1-9 / 退格·0·确认):错 PIN 留在锁屏 → 对 PIN
* page_pop 回书库;位数不足确认不可用、超长输入截断、退格/长按清空、错误后清空重输;
* 键高/间距/屏底 28px 热区几何契约;
* 键高/间距/屏底 28px 热区几何契约;长按退格走真实 SDK opt-in 路径(未注册回调不产生
* MEOW_EV_LONG_PRESS = M29 评审 P2 的根因,注册后才清空);
* - 设置页两遍输入开启 PIN(仍走真实 MEOW_IME_NUM 键盘注入)。
*
* 编译:见 test/run_tests.sh —— 它把本测试、settings/lock/pin 源码与 SDK 源码
@@ -124,12 +125,8 @@ static void lock_type(meow_view *lock, const char *digits)
for (const char *s = digits; *s; s++) lock_tap_key(lock, lock_key_idx(*s));
}
static void lock_long_back(meow_view *lock)
{
int cx, cy;
if (lock_key_center(lock, LK_KBACK, &cx, &cy))
meow_view_dispatch_event(MEOW_EV_LONG_PRESS, cx, cy);
}
/* app.c 注册的 no-op 长按回调(事件先经 view 分发,锁屏页消费;其它页落到这里)。 */
static void app_long_press_noop(int x, int y) { (void)x; (void)y; }
static void settings_tap_pin_row(void){
/* 布局:sb + 56 顶栏 + 6 + 段头34 + 方向行64 + 12 + 段头34 → PIN 列表首行中心 +32 */
@@ -287,16 +284,46 @@ int main(void)
lock_tap_key(lock, LK_KOK);
CHECK(meow_ui_activity_active() == ACT_LIBRARY, "backspace on empty buffer is a no-op");
/* 长按退格清空:先输 3 位 → 长按清空 → 再输 4 位正确 PIN 才解锁。 */
/* 长按退格清空(M29 评审 P2-1)走真实 SDK 路径:
* SDK 长按是 opt-in —— 未注册回调时 meow_input_long_press_poll 恒返回 0,
* MEOW_EV_LONG_PRESS 永远不会产生(真机上「长按清空」只会退化成单删一位,P2 的根因);
* app.c 在锁屏为顶层页时注册 no-op 回调后,按住 700ms(≥500 阈值)应真正产出 LONG_PRESS,
* 并按主循环顺序先交 view 分发(锁屏页消费),且其抬手不再补一个 TAP。 */
meow_view_page_push(ACT_LOCK);
int bx = 0, by = 0;
CHECK(lock_key_center(lock, LK_KBACK, &bx, &by), "backspace key has a rect");
meow_ui_set_long_press_cb(NULL);
meow_input_touch_set(1, bx, by, 700);
CHECK(meow_input_long_press_poll() == 0,
"no LONG_PRESS while callback unregistered (opt-in gate = P2 root cause)");
meow_input_touch_release();
meow_input_drain(); /* 未成长按的这次按压,抬手会补一个 TAP,清掉 */
lock_type(lock, "135");
lock_long_back(lock);
meow_ui_set_long_press_cb(app_long_press_noop); /* 同 app.c:锁屏为顶层页时注册 */
meow_input_touch_set(1, bx, by, 700);
CHECK(meow_input_long_press_poll() == 1, "registered long-press crosses the 500ms threshold");
meow_input_ev lp = { 0, 0, 0 };
CHECK(meow_input_pop(&lp) == 1 && lp.type == MEOW_EV_LONG_PRESS &&
lp.a == bx && lp.b == by, "LONG_PRESS queued at the pressed backspace key");
CHECK(meow_view_dispatch_event(MEOW_EV_LONG_PRESS, lp.a, lp.b) == 1,
"lock view consumes LONG_PRESS before the no-op callback");
meow_input_touch_release();
CHECK(meow_input_pop(&lp) == 0, "long-press release does not emit a stray TAP");
lock_tap_key(lock, LK_KOK);
CHECK(meow_ui_activity_active() == ACT_LOCK, "long-press backspace cleared input");
lock_type(lock, "1357");
lock_tap_key(lock, LK_KOK);
CHECK(meow_ui_activity_active() == ACT_LIBRARY, "unlock after long-press clear");
/* 解锁后 app.c 关掉长按:不得把长按语义泄漏到书库/阅读器(按住稍久的点击仍算 TAP)。 */
meow_ui_set_long_press_cb(NULL);
meow_input_touch_set(1, bx, by, 700);
CHECK(meow_input_long_press_poll() == 0, "long-press off again after leaving the lock page");
meow_input_touch_release();
meow_input_drain();
/* ---- 设置页两遍输入开启 PIN(MEOW_IME_NUM) ---- */
mr_pin_disable();
meow_view_page_push(ACT_SETTINGS);