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
@@ -11,6 +11,7 @@
|
||||
* 纯逻辑在 lock_screen.c(可宿主单测);本文件只做 UI 与输入胶水。
|
||||
*/
|
||||
#include "meow_launcher_internal.h"
|
||||
#include "overlay_gate.h" /* OVERLAY_LOCK_COVER_MS(锁屏重铺阈值,与单测同源) */
|
||||
|
||||
/* §310 残影:锁屏处于 App 前台叠加会话时置位当前前台 App pid(run_app_lock_overlay 写入)。
|
||||
* run_lock_screen 每圈据此探测 App 是否已死(组合 App 冻结缓冲 evdev 会在解锁瞬间回放成点击 /
|
||||
@@ -158,9 +159,11 @@ int run_lock_screen(void)
|
||||
return 1;
|
||||
}
|
||||
|
||||
lk_draw(entered, status, lock_until); /* 首帧 */
|
||||
lk_draw(entered, status, lock_until); /* 首帧(fill_rect 全屏不透明主题底 + 键盘) */
|
||||
|
||||
int unlocked = 0;
|
||||
unsigned long long entry_ms = now_ms();
|
||||
int covered_once = 0; /* §310 问题2-②:标记节流窗后重铺一次全屏底,盖掉 App 残帧 */
|
||||
for (;;) {
|
||||
time_t now = time(NULL);
|
||||
int redraw = 0;
|
||||
@@ -173,6 +176,15 @@ int run_lock_screen(void)
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* §310 问题2-②:媒体保活 App 不冻结、SDK present 抑制有 ≤200ms 标记节流窗——锁屏首扑后
|
||||
* App 仍可能再进 1-2 帧(部分脏区盖到锁屏上)。等标记窗过后(≥300ms)重铺一次全屏不透明底
|
||||
* 盖掉 App 残帧;App 此后被抑制不再上屏,锁屏稳定遮盖(真机「App 控件盖到锁屏上」)。 */
|
||||
if (!covered_once && now_ms() - entry_ms >= OVERLAY_LOCK_COVER_MS) {
|
||||
covered_once = 1;
|
||||
logmsg("lock: re-cover full opaque after marker window (app stave suppressed)");
|
||||
lk_draw(entered, status, lock_until);
|
||||
}
|
||||
|
||||
/* §310 残影:锁屏叠加期 App 崩溃(僵尸)→ 中止锁屏走统一退出路径(交回 waitpid 循环
|
||||
* 回收 + run_menu 重绘主屏含状态栏)。仅当 run_app_lock_overlay 置位 g_lock_overlay_pid
|
||||
* 才探(菜单直接锁屏无 App 可死,恒不中止)。 */
|
||||
|
||||
Reference in new issue
Block a user