fix(launcher,lock): §310 M6.5 追加两修——App 内手动息屏不锁屏 + 锁屏脏区被 App 覆盖
真机 M6.4 反馈(c730333 EVIOCGRAB 之后仍未好全):
P1 App 内电源键手动息屏→亮屏无锁屏(桌面/超时路径都有锁、唯独此路径丢)
根因:App 会话内电源键单击息屏由 **watchdog** 处理(meow_watchdog.c handle_power →
wd_panel_off,直接 blank 面板背光 0),**不置** meow_auto_slept;而 launcher app 会话循环的
唤醒锁屏只在 `if (meow_auto_slept)`(超时路径 set)内触发(app_launcher.c:1996/2029)。
手动路径唤醒时 meow_auto_slept==0 → 不锁屏(真机实测)。
修法(app_launcher.c):App 循环每圈以读背光 `==0` 补判 watchdog 手动息屏(app_panel_manual_off),
唤醒分支改 `meow_auto_slept || app_panel_manual_off`,两类唤醒都走 lck_wake_should_lock 锁屏,
两条路径对齐。overlay_gate.h 增 overlay_wake_should_lock 判据。
P2 锁屏脏区被 App 覆盖(App 刷新控件盖到锁屏上 / 未刷新区显示锁屏自带脏区)
根因:媒体保活 App 不冻结仍在绘制;SDK present 抑制(/tmp/meow_notif_active)有 ≤200ms
标记节流窗(meow_ui_gfx.c MEOW_OVERLAY_CHK_MS)——锁屏首扑后 App 仍可能进 1-2 帧,其
部分脏区落在锁屏上(App 控件覆盖),未覆盖区才是锁屏。另外锁屏关闭需整帧重绘消残影。
修法:
① lk_draw 首帧已 fill_rect(0,0,xres,yres,th->surface) 全屏不透明底(复核满足);
② run_lock_screen 进场 300ms(OVERLAY_LOCK_COVER_MS > 200ms 标记窗)后**重铺一次全屏
不透明底**盖掉 App 抑制窗内的 1-2 帧残影;App 此后被抑制不再上屏,锁屏稳定遮盖;
③ 锁屏关闭(run_app_lock_overlay 关闭路径)已 pm_capture_app_frame+meow_ui_flush+
app_overlay_statusbar 整帧重绘含状态栏(复核满足)。
新增 test_lock_render.c(6 断言:首帧整帧不透明覆盖断言 + 部分填充漏区对照)+ test_overlay_gate.c
扩展(S1c 手动息屏触发锁屏 4 断言 + S2b 重铺阈值>200ms 2 断言)。launcher 全量宿主回归 +
SDK 叠加/状态栏/输入回归全 PASS;mipsel 交叉 -Wall -Wextra 0 warning。
md5 62c817c204b9d9751a4d8f411d1eb69b(/usr/bin 只读,待 M6.5 固件打包;fw_content.conf 未动)。
This commit is contained in:
1 parent
986944ff24
commit
a3d6e21db5
6 files changed
+134
-6
No files matched your search
@@ -1874,6 +1874,12 @@ static int launch_app_chain(struct app *a, const char *chain)
|
||||
int app_seq_hits = 0;
|
||||
unsigned long long app_seq_last = 0;
|
||||
struct vol_snap app_vol0 = { -1, -1 };
|
||||
/* M6.5 §310 问题1:watchdog 电源键手动息屏在 App 内直接 blank 面板(背光 0),**不置**
|
||||
* meow_auto_slept(那是本循环超时息屏路径的私有标志)。故手动息屏→电源键唤醒时机内
|
||||
* meow_auto_slept==0,唤醒分支不锁屏(超时路径天然有锁、手动路径丢了——用户真机实测)。
|
||||
* 修法:本循环以「背光==0 且非超时」补判手动息屏,唤醒时按 meow_auto_slept||manual 一并触发
|
||||
* lck_wake_should_lock 锁屏,两条路径对齐。 */
|
||||
int app_panel_manual_off = 0;
|
||||
/* M2.11 D:应用二进制/资源若在卡上,卡被拔可能 SIGBUS 崩。启动前记录,运行期监测卡移除。
|
||||
* (拷贝到内存/板载 staging 的方案先不做,仅记录 APPS.md 规范。) */
|
||||
int app_on_card = (strncmp(a->exec, MEOWAPPS, strlen(MEOWAPPS)) == 0);
|
||||
@@ -1984,8 +1990,13 @@ static int launch_app_chain(struct app *a, const char *chain)
|
||||
if (kp_keys.cur[w] & (1UL << (KEY_VOLUMEDOWN % 32))) vold = 1;
|
||||
}
|
||||
/* M2.17 自动息屏(app 会话):任意物理键边沿重置计时;空闲>timeout 且非 keep_awake → 息屏;
|
||||
* 息屏后再按键 → 唤醒(fb_pan_buf0_force 兜底 LCDC 落 buffer0,内容随应用输入重绘)。 */
|
||||
* 息屏后再按键 → 唤醒(fb_pan_buf0_force 兜底 LCDC 落 buffer0,内容随应用输入重绘)。
|
||||
* M6.5 §310 问题1:watchdog 电源键手动息屏(背光 0、不置 meow_auto_slept)→ 唤醒时按
|
||||
* app_panel_manual_off 一并锁屏,与超时路径(meow_auto_slept)对齐。 */
|
||||
{
|
||||
/* 背光==0 => 面板已关(超时路径已置 auto_slept;手动路径靠此补判)。
|
||||
* read_brightness() 失败返回 -1(≠0),不误置位。 */
|
||||
if (read_brightness() == 0) app_panel_manual_off = 1;
|
||||
int key_edge = 0;
|
||||
for (int w = 0; w < KEYBUF_WORDS; w++)
|
||||
if (kp_power.cur[w] != save_pow[w] || kp_keys.cur[w] != save_keys[w]) { key_edge = 1; break; }
|
||||
@@ -1993,10 +2004,12 @@ static int launch_app_chain(struct app *a, const char *chain)
|
||||
memcpy(save_pow, kp_power.cur, sizeof save_pow);
|
||||
memcpy(save_keys, kp_keys.cur, sizeof save_keys);
|
||||
app_last_input = now_ms();
|
||||
if (meow_auto_slept) {
|
||||
logmsg("auto screen-off (app): key wake");
|
||||
if (meow_auto_slept || app_panel_manual_off) {
|
||||
logmsg("screen-off (app): key wake (auto=%d manual=%d)",
|
||||
meow_auto_slept, app_panel_manual_off);
|
||||
meow_panel_on();
|
||||
meow_auto_slept = 0;
|
||||
app_panel_manual_off = 0;
|
||||
fb_pan_buf0_force();
|
||||
/* M2.x 锁屏:App 前台唤醒后若需锁屏 → SIGSTOP 叠加锁屏页;解锁/SIGCONT 回应用。
|
||||
* §310:叠加期 App 崩溃(LR==LCK_OVERLAY_RET_DIED)→ 回收僵尸走统一退出路径
|
||||
@@ -2026,10 +2039,12 @@ static int launch_app_chain(struct app *a, const char *chain)
|
||||
if (access(MEOW_APP_ACTIVITY_FILE, F_OK) == 0) {
|
||||
unlink(MEOW_APP_ACTIVITY_FILE);
|
||||
app_last_input = now_ms();
|
||||
if (meow_auto_slept) {
|
||||
logmsg("auto screen-off (app): touch wake");
|
||||
if (meow_auto_slept || app_panel_manual_off) {
|
||||
logmsg("screen-off (app): touch wake (auto=%d manual=%d)",
|
||||
meow_auto_slept, app_panel_manual_off);
|
||||
meow_panel_on();
|
||||
meow_auto_slept = 0;
|
||||
app_panel_manual_off = 0;
|
||||
fb_pan_buf0_force();
|
||||
/* M2.x 锁屏:App 前台唤醒后若需锁屏 → SIGSTOP 叠加锁屏页;解锁/SIGCONT 回应用。
|
||||
* §310:叠加期 App 崩溃 → 回收僵尸走统一退出路径(launcher 不崩、run_menu 重绘主屏)。 */
|
||||
|
||||
Reference in new issue
Block a user