- sdk/meow_time32: 抽出可独立链接的 o32 time32 取时/睡眠设施(不依赖 meow_ui.a, watchdog 等独立静态组件可直接链;可选 -DMEOW_TIME32_LIBC_OVERRIDES 接管 libc 入口) - watchdog: now_ms/usleep 改走 time32(修复 held 变天文数字→每次单击都弹菜单); 阈值读 power.longpress_menu_ms/forceoff_ms(缺省 3000/8000),删除 PWR_TOGGLE_MS==PWR_MENU_MS;新增 wd_power.h 纯判定 + 宿主行为矩阵测试 - launcher: App 前台电源菜单补齐 §10.5(notif 全抑制 + 帧恢复 + SIGCONT 排空 + 标记翻回前台);show_power_menu 恢复进入前背景帧(关闭后不再停留菜单画面); 重绘挪到首轮按键采样之后;activity 标记排空窗 + 会话入口清理 + manual_off 去闩锁 - lock_screen: 电源改按下边沿 + 进场 300ms 才熄屏;电源熄屏退出也恢复底层帧; launcher 在 SIGCONT 前写 /tmp/meow_app_repaint,SDK present 消费并 dirty_full - power_menu: 菜单内强关接 power.forceoff_ms(按 longpress 抵扣),日志不再谎称 8s - 重编 meow_ui.a 并重链 meow_launcherd/ncm/files/hello/reader(picbrowser 无源码) - fw_content.conf: 同步 launcherd/watchdog 新 md5;顺带修正 M35 遗留的 nyai 失效钉值 Host: test_wd_fw 66/66、test_overlay_gate 40/40、test_meow_time64/time/repaint PASS。 真机未验证(设备关机);未刷机、未写设备。
40 lines
1.8 KiB
C
40 lines
1.8 KiB
C
/* meow_ui_repaint.h — 解锁后「强制 App 整帧重画」请求文件(M40 F5/P5-P6)。
|
||
*
|
||
* 背景:锁屏/电源菜单是整帧不透明覆盖。关闭后 launcher 会恢复它快照的底层帧,但 App
|
||
* 进程只按自己的脏矩形 present;锁屏期间它可能被 SIGSTOP 冻结,从未观测到
|
||
* /tmp/meow_notif_active 的抑制态,因此 SDK 的「抑制→恢复」整帧重画边沿不会触发 ——
|
||
* PIN 帧/菜单帧会残留在屏幕上,直到用户点到某个控件产生新脏区才刷新(真机 P6)。
|
||
*
|
||
* 机制:launcher 在 SIGCONT 前写 /tmp/meow_app_repaint;App 的 SDK present 看到文件就
|
||
* dirty_full() 一次并删除(消费一次即失效)。请求在 present 最前面检查,**抑制期也消费**
|
||
* (先置 dirty_full,等标记翻回前台后的下一帧整屏上屏),避免排空窗口把请求吃掉后不生效。
|
||
*
|
||
* 实现放在头文件里(static inline):present 层(meow_ui_gfx.c)直接调用;宿主单测只
|
||
* include 本头即可验证写/读/删语义,不必链接整个渲染栈。路径可用 MEOW_APP_REPAINT_FILE
|
||
* 覆盖(宿主单测隔离;真机无 env 走默认)。
|
||
*/
|
||
#ifndef MEOW_UI_REPAINT_H
|
||
#define MEOW_UI_REPAINT_H
|
||
|
||
#include <stdlib.h>
|
||
#include <unistd.h>
|
||
|
||
#define MEOW_APP_REPAINT_DEFAULT "/tmp/meow_app_repaint"
|
||
|
||
static inline const char *meow_ui_repaint_path(void)
|
||
{
|
||
const char *e = getenv("MEOW_APP_REPAINT_FILE");
|
||
return (e && e[0]) ? e : MEOW_APP_REPAINT_DEFAULT;
|
||
}
|
||
|
||
/* 返回 1=消费了一次重画请求(调用方应 dirty_full);0=无请求。 */
|
||
static inline int meow_ui_repaint_requested(void)
|
||
{
|
||
const char *p = meow_ui_repaint_path();
|
||
if (access(p, F_OK) != 0) return 0;
|
||
unlink(p); /* 一次性请求:读到即消费,防每帧整帧重画 */
|
||
return 1;
|
||
}
|
||
|
||
#endif /* MEOW_UI_REPAINT_H */
|