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

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

+25
View File
@@ -81,8 +81,32 @@ static void app_on_swipe(int dir, int dx, int dy)
if (app_active() == ACT_LIBRARY) library_on_swipe(dir, dx);
}
/* 通用长按(SDK §6.3)是 opt-in:未注册回调时 meow_input_long_press_poll 直接返回 0,
* MEOW_EV_LONG_PRESS 永远不会产生 —— 锁屏的「长按退格清空」在真机上就退化成单删一位。
* 这里注册一个 no-op 回调把长按打开;事件仍然先经 meow_view_dispatch_event 路由,锁屏页
* 自己消费 LONG_PRESS(其它页命中不到就走 no-op)。
*
* 只在锁屏为顶层页时启用:长按一旦触发,其抬手不再产生 TAP/SWIPE(SDK 抑制点击),
* 全程开启会让书库/阅读器里「按住稍久」的点击被吞掉。锁屏页解锁 pop 后由 app_on_tick
* 下一拍关掉,避免把长按语义泄漏到其它页。 */
static int g_long_press_on;
static void app_on_long_press(int x, int y)
{
(void)x; (void)y; /* 锁屏已在 view 分发里消费;其余页没有长按语义 */
}
static void app_sync_long_press(void)
{
int on = (app_active() == ACT_LOCK);
if (on == g_long_press_on) return;
meow_ui_set_long_press_cb(on ? app_on_long_press : NULL);
g_long_press_on = on;
}
static void app_on_tick(void)
{
app_sync_long_press();
library_on_tick();
}
@@ -126,6 +150,7 @@ int main(void)
meow_view *lock = lock_view_create();
meow_view_page_push(lock_view_should_show() ? ACT_LOCK : ACT_LIBRARY);
app_sync_long_press(); /* 进主循环前先对齐一次:启动即锁屏时首帧长按就可用 */
meow_ui_events ev = {
app_on_key, app_on_tap, app_on_swipe, app_on_tick,