diff --git a/patch_v2/meow_launcherd/meow_launcherd b/patch_v2/meow_launcherd/meow_launcherd index 9e01344..a4c4733 100755 Binary files a/patch_v2/meow_launcherd/meow_launcherd and b/patch_v2/meow_launcherd/meow_launcherd differ diff --git a/patch_v2/meow_launcherd/now_playing.c b/patch_v2/meow_launcherd/now_playing.c index dbff86e..097160b 100644 --- a/patch_v2/meow_launcherd/now_playing.c +++ b/patch_v2/meow_launcherd/now_playing.c @@ -218,12 +218,18 @@ void run_now_playing(void) unsigned long long touch_cooldown_until = now_ms() + 300; struct keypoll kp_keys; kp_open(&kp_keys, DEV_KEYS); + struct keypoll kp_power; /* M2.92:NP 页接管电源键(修「页内电源键无反应」) */ + kp_open(&kp_power, DEV_POWER); struct kd_state kd_play; memset(&kd_play, 0, sizeof kd_play); /* 读播放键按住态(用于边沿) */ int m_prev_play = 0; for (int w = 0; w < KEYBUF_WORDS; w++) if (kp_keys.cur[w] & (1UL << (KEY_PLAYPAUSE % 32))) m_prev_play = 1; + int np_prev_power = 0; /* 电源键边沿跟踪 */ + for (int w = 0; w < KEYBUF_WORDS; w++) + if (kp_power.cur[w] & (1UL << (KEY_POWER % 32))) np_prev_power = 1; + unsigned long long np_last_input = now_ms(); /* 自动息屏计时(M2.92:NP 页也遵守 display.screen_off_timeout) */ int td = 0, td_ok = 0, tdx = -1, tdy = -1, tlx = -1, tly = -1; unsigned long long last_prog = now_ms(); @@ -256,7 +262,8 @@ void run_now_playing(void) if (td && !td_ok && tlx >= 0 && tly >= 0) { tdx = tlx; tdy = tly; td_ok = 1; } } else if (type == EV_KEY && code == BTN_TOUCH) { if (val && !td) { - if (now_ms() >= touch_cooldown_until) { td = 1; td_ok = 0; tlx = tly = -1; } + if (now_ms() >= touch_cooldown_until) { td = 1; td_ok = 0; tlx = tly = -1; + np_last_input = now_ms(); } } else if (!val && td) { td = 0; if (td_ok) { @@ -288,9 +295,34 @@ void run_now_playing(void) if (play && !m_prev_play) { const meow_media_session_t *s = meow_media_current(); if (s) meow_media_playctl((s->state == MEOW_MEDIA_PLAYING) ? 2u : 1u, 0); + np_last_input = now_ms(); } m_prev_play = play; + /* M2.92:NP 页电源键接管——单击边沿 = 息屏/亮屏(与主界面语义一致; + * 修「NP 页电源键无反应」。3s 电源菜单仍由 watchdog→/tmp 标记→主循环消费, + * NP 退出后生效(可接受偏差,记日志)。 */ + kp_poll(&kp_power, NULL, NULL); + int pwr = 0; + for (int w = 0; w < KEYBUF_WORDS; w++) + if (kp_power.cur[w] & (1UL << (KEY_POWER % 32))) pwr = 1; + if (pwr && !np_prev_power) { + np_last_input = now_ms(); + if (meow_screen_on) { meow_panel_off(); logmsg("nowplaying: power tap -> panel off"); } + else { meow_panel_on(); need_redraw = 1; logmsg("nowplaying: power tap -> panel on"); } + } + np_prev_power = pwr; + + /* M2.92:NP 页自动息屏(与主界面同超时;页面无触摸/按键计时器不走主循环) */ + if (screen_off_timeout > 0 && meow_screen_on && + now_ms() - np_last_input >= (unsigned long long)screen_off_timeout * 1000) { + meow_panel_off(); + meow_auto_slept = 1; + logmsg("nowplaying: idle %ds -> auto panel off", screen_off_timeout); + } + /* 息屏期只低频轮询按键(唤醒用),不重画不读触摸(FBIOBLANK 已挂起 goodix) */ + if (!meow_screen_on) { usleep(100 * 1000); continue; } + /* 媒体变化检测(元数据/源/状态):立即整页重画 */ const meow_media_session_t *s = meow_media_current(); int meta_changed = !s || strcmp(last_app, s->app_id) || @@ -303,8 +335,8 @@ void run_now_playing(void) } else { last_app[0] = 0; last_title[0] = 0; last_state = 0xFFFFFFFFu; } need_redraw = 1; } - /* 空态/无源:立即重画(清占位/回空态) */ - if (!s || s->state == MEOW_MEDIA_STOPPED) need_redraw = 1; + /* M2.92 修死循环:空态/停止态只在「变化」时画一次(meta_changed 已覆盖 + * NULL↔会话切换),不再每 10ms 整页重画(旧行为 = 100% CPU 忙刷 → 卡死观感)。 */ if (need_redraw) { np_draw_page(0); @@ -321,6 +353,7 @@ void run_now_playing(void) } if (tfd >= 0) close(tfd); kp_close(&kp_keys); + kp_close(&kp_power); if (g_np_cover) { meow_img_free(g_np_cover); g_np_cover = NULL; } g_np_cover_path[0] = 0; } diff --git a/patch_v2/sdk/meow_ui_internal.h b/patch_v2/sdk/meow_ui_internal.h index a091f01..013c73c 100644 --- a/patch_v2/sdk/meow_ui_internal.h +++ b/patch_v2/sdk/meow_ui_internal.h @@ -62,6 +62,7 @@ void meow_ui_sys_statusbar_render_off(int yoff); #define MEOW_SB_ICON_BT_CONN 11 #define MEOW_SB_ICON_BT_DIS 12 #define MEOW_SB_ICON_BT_SEARCH 13 +#define MEOW_SB_ICON_BATT_CHG 14 /* 状态栏右下布局常量(与 launcher SB_* 对齐):图标右缘↔文字间隙 / 相邻项间隙 / 图标目标 ink 高 / * 右簇左缘相对时钟右缘安全间距 / 图标 ink 垂直中心(=状态栏文字中心,28px 栏约 14)。 */ diff --git a/patch_v2/sdk/meow_ui_sys.c b/patch_v2/sdk/meow_ui_sys.c index 3df3327..6bce425 100644 --- a/patch_v2/sdk/meow_ui_sys.c +++ b/patch_v2/sdk/meow_ui_sys.c @@ -371,6 +371,8 @@ void meow_ui_sys_statusbar_render_off(int yoff) if (g_sys.batt >= 0) { /* 电量:图标+%(未知不画)——最右项 */ snprintf(val, sizeof val, "%d%%", g_sys.batt); sb_r_place(&xr, MEOW_SB_ICON_BATT, val, col, MEOW_SB_ICON_INK, ty, ycy); + if (g_sys.charging) /* 充电中:电量图标左邻加闪电(M2.92) */ + sb_r_place(&xr, MEOW_SB_ICON_BATT_CHG, NULL, col, MEOW_SB_ICON_INK, ty, ycy); } snprintf(val, sizeof val, "%d%%", g_sys.vol); sb_r_place(&xr, MEOW_SB_ICON_VOL, val, col, MEOW_SB_ICON_INK, ty, ycy); /* 音量:图标+% */ diff --git a/patch_v2/sdk/sb_icons.h b/patch_v2/sdk/sb_icons.h index c082b26..db7570f 100644 --- a/patch_v2/sdk/sb_icons.h +++ b/patch_v2/sdk/sb_icons.h @@ -191,6 +191,11 @@ static const unsigned char SB_ICON_BT_SEARCH[1024]={ 0,0,0,0,0,2,3,2,0,0,2,0,190,252,251,252,81,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,190,255,251,83,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,64,178,77,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; + +static const unsigned char SB_ICON_BATT_CHG[1024]={ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,191,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,63,255,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,207,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,95,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,239,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,255,255,223,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,255,255,255,191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,159,255,255,255,191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,63,255,255,255,255,207,63,63,63,63,63,63,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,191,255,255,255,255,255,255,255,255,255,255,191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,95,255,255,255,255,255,255,255,255,255,255,239,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,223,255,255,255,255,255,255,255,255,255,255,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,255,255,255,255,255,255,255,255,255,255,191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,239,255,255,255,255,255,255,255,255,255,239,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,111,255,255,255,255,79,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,175,255,255,255,175,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,239,255,255,239,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,47,255,255,255,79,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,95,255,255,175,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,159,255,239,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,223,255,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,255,143,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,79,223,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,143,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,95,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +}; + static const sb_icon_t sb_icons[] = { { SB_ICON_WIFI }, { SB_ICON_BT }, @@ -206,11 +211,12 @@ static const sb_icon_t sb_icons[] = { { SB_ICON_BT_CONN }, { SB_ICON_BT_DIS }, { SB_ICON_BT_SEARCH }, + { SB_ICON_BATT_CHG }, }; /* 枚举索引(与 sb_icons[] 对应) */ enum { SB_I_WIFI=0, SB_I_BT=1, SB_I_BATT=2, SB_I_VOL=3, SB_I_BRIGHT=4, SB_I_WIFI_STRONG=5, SB_I_WIFI_MEDIUM=6, SB_I_WIFI_WEAK=7, SB_I_WIFI_NO=8, SB_I_WIFI_OFF=9, SB_I_BT_NO=10, SB_I_BT_CONN=11, - SB_I_BT_DIS=12, SB_I_BT_SEARCH=13 }; + SB_I_BT_DIS=12, SB_I_BT_SEARCH=13, SB_I_BATT_CHG=14 }; #endif /* SB_ICONS_H */ \ No newline at end of file diff --git a/scripts/build/fw_content.conf b/scripts/build/fw_content.conf index 0be19e3..904b1aa 100644 --- a/scripts/build/fw_content.conf +++ b/scripts/build/fw_content.conf @@ -28,7 +28,7 @@ # ---- 用户态/服务守护二进制(usr/bin,全部 chmod 755 静态 MIPS)---- patch_v2/bootmenu/meow_bootmenu|/usr/bin/meow_bootmenu|4441822d87e76bfce2ce584604ac3830|引导选单 M2.85(sysui让位 agent-216) -patch_v2/meow_launcherd/meow_launcherd|/usr/bin/meow_launcherd|7be1d4eb786ff08f4b20f3be775a8151|主屏 launcher(插孔消抖+ramp 3s 上限+亮度写日志;耳机插拔 ADC 幽灵音量键修复) +patch_v2/meow_launcherd/meow_launcherd|/usr/bin/meow_launcherd|6de9762881245a57f547d53102e996be|主屏 launcher M2.92(NP页死循环/电源键/自动息屏修复+充电闪电图标+255插孔消抖并入) patch_v2/meow_watchdog/meow_watchdog|/usr/bin/meow_watchdog|baa997ea9100b04e1cc96e25c16f7e4b|应用看门狗(插孔消抖:插拔瞬态忽略音量键 800ms;M2.89 SIGUSR1 仅裸沉浸 App) patch_v2/meow_svcd/meow_svcd|/usr/bin/meow_svcd|605646c4cc93f2baf29071ea6bc870ea|服务管理器 M2.77(+崩溃上报 meow_crash agent-187) mips-repo/bins/meow_mdns/bin/meow_mdns|/usr/bin/meow_mdns|d6b0151bda26768f19952dae1342610d|mDNS 应答器 M2.78(启动竞态+换IP重检 agent-194)