fix(launcher): Now Playing 死循环修复(空态不再每帧整页重画,修100%CPU/卡死) + NP页接管电源键(单击息屏/亮屏) + NP页自动息屏 + 状态栏充电闪电图标(sb_icons 新增 bolt, charging 时电量图标左邻显示)。宿主 test_sb_statusbar PASS; launcher 6de97628 待入 M2.92
This commit is contained in:
1 parent
4bafdb5d69
commit
614694ad4a
6 files changed
+47
-5
No files matched your search
Binary file not shown.
@@ -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;
|
||||
}
|
||||
@@ -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)。 */
|
||||
|
||||
@@ -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); /* 音量:图标+% */
|
||||
|
||||
@@ -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 */
|
||||
Reference in new issue
Block a user