fix(launcher): §310 追加两修——未冻结App锁屏输入穿透(独占触控) + 主界面应用名截断
真机 M6.3 反馈(bcef8e0 三连修复未好全,追加两问题):
P1 锁屏 PIN 输入穿透仍在(媒体保活 App 实时读 evdev)
根因:媒体保活 App(播放中)从不 SIGSTOP(保 PCM),SDK 输入线程实时读 evdev,不走缓冲。
bcef8e0 的「SIGCONT 排空」只作用于冻结 App;对未冻结 App,隔离全靠 /tmp/meow_notif_active
让 SDK 排空——若 App 的 meow_ui.a 缺该排空(或节流窗内漏网),锁屏期触摸依旧抵达 App。
修法:run_lock_screen() 与 lck_input_pin_modal() 打开 DEV_TOUCH 后 EVIOCGRAB 独占触控设备
(真机 goodix 实测 EVIOCGRAB 返回 0)——抓取期事件只投递抓取者、不为其它 fd 缓冲/回放,
故**任何**前台进程(冻结或未冻结)锁屏期都收不到触摸(真全模态)。失败时记日志降级
(仍靠标记+SIGSTOP 隔离)。overlay_gate.h 增 overlay_keepalive_needs_grab 判据。
P2 主界面应用名只显示 5 字(「流媒体客户」式,半字残形)
根因:app_launcher.c `strncpy(a->name, name, 16)` 仍把显示名硬截 16 字节——M6.3 只扩了
name[49]+json_str 整序列,漏改此二处。UTF-8 下 16B = 5 汉字 + 「端」首字节 + 无 NUL,
显示成「流媒体客户」+ 残形;main_menu.c menu_name_fit 按字节回退又停在半截字符、加 "..." 溢出。
修法:新增 meow_utf8.h(meow_utf8_char_len / meow_utf8_copy_bounded,纯决策可单测)——
app_launcher.c 两处 strncpy(16) 改 app_name_copy(=copy_bounded, 拷满 sizeof name=49);
menu_name_fit 改整字符前进 + 预留省略号宽度(mfont 用「…」/点阵用 "..."),总宽 ≤ maxw,
绝不劈开多字节字符。
新增 test_utf8_name.c(14 断言:整字符长/整序列有界拷贝,含 cap=16/17/12 边界不劈字)+
test_overlay_gate.c 扩展(S1b 未冻结 App 靠 EVIOCGRAB 隔离 4 断言)。launcher 全量宿主回归
+ SDK 叠加/状态栏/输入回归全 PASS;mipsel 交叉 -Wall -Wextra 0 warning。
md5 56dac860841c3884b4322707246e22af(/usr/bin 只读,待固件打包 M6.4;fw_content.conf 未动)。
This commit is contained in:
1 parent
67aa5fc7a8
commit
c730333776
8 files changed
+224
-14
No files matched your search
@@ -126,6 +126,17 @@ int run_lock_screen(void)
|
||||
|
||||
meow_touch mt; mt_reset(&mt);
|
||||
int tfd = open(DEV_TOUCH, O_RDONLY | O_NONBLOCK);
|
||||
/* §310 输入穿透(媒体保活 App 不被 SIGSTOP,实时读 evdev):锁屏页独占触控设备——
|
||||
* EVIOCGRAB 使本 fd 之外的其它进程(保活 App 的 SDK 输入线程 / watchdog 手势)在该设备
|
||||
* 上收不到事件(事件仅投递抓取者),且抓取期事件不会为未抓取 fd 缓冲/回放。由此无论 App
|
||||
* 冻结与否,锁屏期**任何** App 都收不到触摸(真全模态)。失败(驱动不支持)则记日志降级,
|
||||
* 仍靠 keep_running/SIGSTOP+标记隔离。关闭 tfd 时抓取自动解除(仍显式释放一次)。 */
|
||||
if (tfd >= 0) {
|
||||
int grab = 1;
|
||||
if (ioctl(tfd, EVIOCGRAB, &grab) < 0)
|
||||
logmsg("lock: EVIOCGRAB touch fail: %s (graceful degrade, marker+SIGSTOP isola only)",
|
||||
strerror(errno));
|
||||
}
|
||||
struct keypoll kp_power, kp_keys;
|
||||
kp_open(&kp_power, DEV_POWER);
|
||||
kp_open(&kp_keys, DEV_KEYS);
|
||||
@@ -272,13 +283,21 @@ int run_lock_screen(void)
|
||||
usleep(POLL_MS * 1000);
|
||||
}
|
||||
done:
|
||||
if (tfd >= 0) close(tfd);
|
||||
if (tfd >= 0) {
|
||||
int grab = 0; /* 显式释放 EVIOCGRAB(关闭 tfd 也会自动解除,双保险) */
|
||||
ioctl(tfd, EVIOCGRAB, &grab);
|
||||
close(tfd);
|
||||
}
|
||||
kp_close(&kp_power);
|
||||
kp_close(&kp_keys);
|
||||
logmsg("lock: exit unlocked=%d screen_on=%d", unlocked, meow_screen_on);
|
||||
return unlocked;
|
||||
died:
|
||||
if (tfd >= 0) close(tfd);
|
||||
if (tfd >= 0) {
|
||||
int grab = 0;
|
||||
ioctl(tfd, EVIOCGRAB, &grab);
|
||||
close(tfd);
|
||||
}
|
||||
kp_close(&kp_power);
|
||||
kp_close(&kp_keys);
|
||||
logmsg("lock: exit overlay-app-died -> LCK_OVERLAY_RET_DIED");
|
||||
@@ -316,6 +335,13 @@ int lck_input_pin_modal(const char *title, char *out, int outcap)
|
||||
fb_pan_buf0_force();
|
||||
meow_touch mt; mt_reset(&mt);
|
||||
int tfd = open(DEV_TOUCH, O_RDONLY | O_NONBLOCK);
|
||||
/* §310 输入穿透:设置页 PIN 模态同样独占触控设备(后台保活 App 不冻结实时读 evdev,防其
|
||||
* 同坐标控件被 PIN 键盘点击双重触发)。失败降级(仍靠标记+SIGSTOP 隔离)。 */
|
||||
if (tfd >= 0) {
|
||||
int grab = 1;
|
||||
if (ioctl(tfd, EVIOCGRAB, &grab) < 0)
|
||||
logmsg("pin-modal: EVIOCGRAB touch fail: %s (graceful degrade)", strerror(errno));
|
||||
}
|
||||
struct keypoll kp_power, kp_keys;
|
||||
kp_open(&kp_power, DEV_POWER);
|
||||
kp_open(&kp_keys, DEV_KEYS);
|
||||
@@ -412,7 +438,11 @@ int lck_input_pin_modal(const char *title, char *out, int outcap)
|
||||
usleep(POLL_MS * 1000);
|
||||
}
|
||||
done2:
|
||||
if (tfd >= 0) close(tfd);
|
||||
if (tfd >= 0) {
|
||||
int grab = 0; /* 显式释放 EVIOCGRAB(关闭 tfd 亦自动解除,双保险) */
|
||||
ioctl(tfd, EVIOCGRAB, &grab);
|
||||
close(tfd);
|
||||
}
|
||||
kp_close(&kp_power);
|
||||
kp_close(&kp_keys);
|
||||
return result;
|
||||
|
||||
Reference in new issue
Block a user