diff --git a/patch_v2/meow_launcherd/main_menu.c b/patch_v2/meow_launcherd/main_menu.c index 5f8dcb0..ea2b8eb 100644 --- a/patch_v2/meow_launcherd/main_menu.c +++ b/patch_v2/meow_launcherd/main_menu.c @@ -1670,6 +1670,10 @@ static void usage(void) } +/* /tmp/meow_boot_mode:开机模式标记(bootmenu 在 S90 选定后写 "meow"/"hiby",tmpfs 开机清空)。 + * M2.89 回归修复用,见 main() 内「开机选单期不抢屏」。 */ +#define MEOW_BOOT_MODE_PATH "/tmp/meow_boot_mode" + int main(int argc, char **argv) { long sim_hotkey = 0, sim_tap = 0, sim_exit = 0, dumpkeys = 0; @@ -1877,7 +1881,34 @@ int main(int argc, char **argv) * - BACK TO PLAYER → 显示「需重启」提示并留在主界面(不渲染死帧); * - 仅 SIGTERM 退出(rcS/SSH 关停),退出时屏幕保持应用列表主界面(无残帧)。 * 若此时竟有存活播放器(不应用于 MeowOS,防御性),回落到下面的旧覆盖路径。 */ - meow_mode = is_meow_mode(); + /* ===== M2.89 回归修复:开机选单期不抢屏 ===== + * sysui 在 S70 即拉起 launcher(早于 S90 bootmenu 写 /tmp/meow_boot_mode)。 + * 旧判定 is_meow_mode()=find_hiby_pid()<=0 在选单阶段恒真(播放器尚未启动), + * launcher 误入 MeowOS 主屏 → 与选单/HibyOS 播放器抢 fb0 与触摸输入 + * (开机选 HibyOS 后黑屏/选单被主屏重绘覆盖的回归根因)。 + * 修复:mode 文件不存在且 bootmenu 存活 → 怠速等它写(选单无超时,不设等待上限; + * bootmenu 消失且仍无文件 → 非开机语境如 SSH 手跑/S92 兜底,回退旧判定)。 + * 读到 hiby → 怠速守护(不碰 fb):轮询 mode 文件,变 meow(HibyOS 热键切换)→ 落地主屏。 */ + char boot_mode[16] = { 0 }; + if (!sigterm_flag) { + int announced = 0; + while (access(MEOW_BOOT_MODE_PATH, F_OK) != 0 && !sigterm_flag) { + if (proc_by_comm("meow_bootmenu") <= 0) break; /* 非开机语境:回退旧判定 */ + if (!announced) { logmsg("boot: mode undecided, bootmenu active -> idle wait (no fb grab)"); announced = 1; } + usleep(200 * 1000); + } + FILE *mf = fopen(MEOW_BOOT_MODE_PATH, "r"); + if (mf) { if (fscanf(mf, "%15s", boot_mode) != 1) boot_mode[0] = 0; fclose(mf); } + while (!sigterm_flag && !strcmp(boot_mode, "hiby")) { + /* HibyOS 会话怠速:bootmenu supervisor 管热键/播放器;mode 变 meow(热键切换)即落地。 */ + usleep(500 * 1000); + mf = fopen(MEOW_BOOT_MODE_PATH, "r"); + if (mf) { if (fscanf(mf, "%15s", boot_mode) != 1) boot_mode[0] = 0; fclose(mf); } + } + if (boot_mode[0]) logmsg("boot mode = %s", boot_mode); + } + meow_mode = !strcmp(boot_mode, "meow") ? 1 : + !strcmp(boot_mode, "hiby") ? 0 : is_meow_mode(); /* M2.12:卡在则把 /usr/data/mnt/sd_0/MeowOS/opt/bin 前插 PATH(外围 CLI 已迁卡, * 按需可用;卡不在跳过,绝不崩)。SSH 会话另由 rootfs /etc/profile.d/meow_card_path.sh 处理。 */ if (ensure_card_mounted() || sd_mounted()) { @@ -1886,7 +1917,7 @@ int main(int argc, char **argv) } else { logmsg("PATH: no card, MeowOS/opt/bin skipped"); } - if (meow_mode) { + if (!sigterm_flag && meow_mode) { /* M2.89:怠速等待期间被 sysui stop(HibyOS 选定)→ 直走退出尾 */ /* M2.2 拔营:启动即尝试挂 TF 卡 + 联网(非阻塞);失败由 run_menu 后台周期重试。 */ ensure_card_mounted(); ensure_wifi(); diff --git a/patch_v2/meow_launcherd/meow_launcherd b/patch_v2/meow_launcherd/meow_launcherd index 72296c3..46ce2cd 100755 Binary files a/patch_v2/meow_launcherd/meow_launcherd and b/patch_v2/meow_launcherd/meow_launcherd differ