docs: APPS.md §3.5 看门狗表对齐现状(虚拟返回键M2.21已移除/SIGUSR1仅裸沉浸App+SDK护栏) + KEY_CONTROL_DESIGN 偏差3/4标已落地(M2.81 NowPlaying横划+媒体键路由)

This commit is contained in:
MeowOS committed 2026-08-31 20:08:27 +08:00
1 parent 4e3edd7952
commit 673f85e4ab
2 files changed
+6 -6

No files matched your search

+4 -4
View File
@@ -184,16 +184,16 @@
| 特性 | 行为 |
|---|---|
| 虚拟返回键 | 看门狗独立 mmap `/dev/fb0`(RGB565 自适应),每 100ms 重画左上角 48×48 返回按钮(深色底+白箭头);读 `/dev/input/event1` 触摸,按下落在按钮区 → `SIGTERM` 应用 → 1s 后 `SIGKILL`(应用卡死也能退出)。**v6.4 防抖**(针对"启动误杀"):`last_x/y=-1` 起始(无坐标的按下丢弃)、BTN_TOUCH 按实际值匹配边沿(消除失同步翻转)、仅短按 ≤600ms 有效、启动后先 drain 一次、**冷却期 2.5s**(实测幽灵触摸窗口 1.2–2.25s;此窗内返回键不响应,改 `COOLDOWN_MS` 可调) |
| 沉浸模式 | 应用写 `/tmp/meowapp_state` 内容为 `1` → 看门狗不画按钮、只识别「左缘 24px 内起点向右滑 >50px」手势 → 发 `SIGUSR1`;写 `0` 或删除 → 恢复虚拟键 |
| 虚拟返回键 | **已移除(M2.21 起)**:全局左缘返回手势取代左上角返回键,看门狗不再画按钮。历史行为:独立 mmap fb0 画 48×48 返回键 + 命中 SIGTERM(保留备查) |
| 沉浸模式 | 应用写 `/tmp/meowapp_state` 内容为 `1` → 看门狗识别「左缘 24px 内起点向右滑 >50px」手势。**M2.89 起 SIGUSR1 只对「裸沉浸 App」(非 framework=1 且 immersive)发送**(236:SDK 框架 App 走 `on_swipe` 处理返回,发 SIGUSR1 会误杀——ncm signal=16 崩溃的根因);SDK 侧另有 SIGUSR1 护栏(`sigusr1_guard`,记日志+吞掉)双保险 |
| 看门狗自退出 | 应用进程消失(`kill(pid,0)` ESRCH)或 launcher SIGTERM → 退出 |
| 强制退出兜底 | 应用运行期(launcher 处于 waitpid):**音量减连按 3 次**(间隔 < `hotkey_seq_gap`,与主序列同阈值)→ SIGTERM → 0.5s → SIGKILL → 恢复。⚠️ 响应音量键的应用(如示例 hello)会先自行退出(`exit:key`),强杀序列是**不响应音量键/卡死应用**的兜底 |
| 长按电源 | 硬件级强制关机(设备固有),最终兜底 |
| 测试模式 | `meow_watchdog <pid> --sim-tap N` / `--sim-swipe N`,无触摸设备也可验证 |
**应用协议约定**:
- 默认(非沉浸)由看门狗画返回键,应用**不必**处理返回手势
- **⚠️ 返回键信号 = `SIGTERM`**(看门狗 `handle_touch` 按钮命中 → `kill(app_pid, SIGTERM)`→1s→`SIGKILL`);`SIGUSR1` **仅**是沉浸左缘滑动手势,不是返回键。com 与 SIGTERM 默认终止会**不画 BYE** 直接死,故示例 hello 安装 `SIGTERM` 处理器:画 BYE + `exit(0)`,使返回键呈现确定性的「bye → 立即退出」(v6.8,Bug 2)。
- 默认(非沉浸)SDK 框架 App 由 SDK `on_swipe` 处理左缘返回;**看门狗虚拟返回键已移除(M2.21)**,返回语义全走手势
- **⚠️ `SIGUSR1` 仅**是裸沉浸 App 的左缘滑动手势(M2.89 起看门狗不对 framework=1 的 SDK App 发),不是返回键;框架 App 另有 SDK `sigusr1_guard` 护栏吞掉漏网 SIGUSR1。裸 App 的 SIGTERM 默认终止会**不画 BYE** 直接死,故示例 hello 安装 `SIGTERM` 处理器:画 BYE + `exit(0)`(v6.8,Bug 2)。
- **⚠️ 应用启动后须防 goodix 幽灵触摸**(v6.8,Bug 2 根因):goodix 在启动触摸的尾部发出一段幽灵触摸(实测启动后 1.2-2.25s,§18.16),无防护时应用会**误把幽灵当下按而立即退出画 BYE**,且 launcher 菜单会把同一幽灵重放成行点击而**重开应用**(用户看到「bye 后又回 hello 主界面、需再点一次」)。hello v6.8 增加 `COOLDOWN_MS=2500`:启动后前 2.5s 忽略一切按下边沿,只有用户**真正**的下按才触发退出。launcher 侧同步在应用退出后 drain + 冷却(见 §4.7)。
- 沉浸应用写 `/tmp/meowapp_state`,处理 `SIGUSR1` 作为「返回事件」
- 应用异常卡死 → 虚拟返回键(若可见)→ SIGKILL;沉浸态卡死 → 音量减连按 3 次(强杀序列)
+2 -2
View File
@@ -95,7 +95,7 @@ watchdog 主循环(`for(;;)`)加按键轮询(`read /dev/input/event0/event
偏差(实现以稳妥为准,记录如下):
1. **8s 强关拆分**:设计给 watchdog,但为避免与菜单内 `pm_interacted` 冲突(用户正点选时被强关抢先),落地为「launcher 菜单内 8s 强关(pm_interacted 保护)+ watchdog 8s 兜底(仅当菜单未接管,即 `/tmp/meow_power_menu_active` 未出现)」。
2. **音量跳步**:watchdog 每按下边沿按 `audio.volume_step` 一步(不做 launcher 的线性渐变);短按与 launcher 菜单一致,长按不连续爬(媒体落地后可补)。launcher 应用返回时 `settings_load()` 同步。
3. **左右滑切屏**:菜单触摸段已留 `menu swipe (dx,dy) — no launch` 判定,未实现切换逻辑。
4. **媒体键**:仅抓消费(日志 `media key captured (code N) -> consumed, no route`),路由待阶段 D。
3. **左右滑切屏**:**已落地(M2.81 Now Playing 横划页)**——主界面左滑进 Now Playing 大页;左缘返回手势保留。此处旧注「未实现切换逻辑」作废。
4. **媒体键**:**已落地(M2.81 起路由最近活跃媒体会话)**——播放/上下曲路由到最近活跃媒体会话(MSG_PLAYCTL),无会话时「抓住」不动作。此处旧注「路由待阶段 D」作废。
真机验收要点(§7):应用内电源单击/长按菜单/8s 强关、音量±调音量、播放/上下曲无反应(被抓住)、launcher 菜单同样一致、电源菜单任何界面可弹(含应用内)、息屏后任意键唤醒。