Compare commits

..
2 Commits
3 changed files with 39 additions and 14 deletions

No files matched your search

+11
View File
@@ -2004,7 +2004,17 @@ static int launch_app_chain(struct app *a, const char *chain)
memcpy(save_pow, kp_power.cur, sizeof save_pow); memcpy(save_pow, kp_power.cur, sizeof save_pow);
memcpy(save_keys, kp_keys.cur, sizeof save_keys); memcpy(save_keys, kp_keys.cur, sizeof save_keys);
app_last_input = now_ms(); app_last_input = now_ms();
/* M6.24 bug:App 前台单按电源息屏后,同一次按压的**松开**边沿被误判为唤醒——
* watchdog 在松开边沿执行 wd_panel_off(背光 0),下一圈本循环 read_brightness()
* ==0 置 app_panel_manual_off=1,而 save_* 基线仍是「按下」态,于是这次「松开」
* 被 key_edge 捕获,再命中 manual_off → meow_panel_on + 锁屏 overlay → 用户看到
* 「黑一下又自动亮 PIN;再按才真正熄屏」。修法=唤醒必须来自**新的按压**:要求
* 当前确有键按下(cur 任一 bit),松散开边沿(无键按住)不唤醒。 */
if (meow_auto_slept || app_panel_manual_off) { if (meow_auto_slept || app_panel_manual_off) {
int any_down = 0;
for (int w = 0; w < KEYBUF_WORDS; w++)
if (kp_power.cur[w] || kp_keys.cur[w]) { any_down = 1; break; }
if (any_down) {
logmsg("screen-off (app): key wake (auto=%d manual=%d)", logmsg("screen-off (app): key wake (auto=%d manual=%d)",
meow_auto_slept, app_panel_manual_off); meow_auto_slept, app_panel_manual_off);
meow_panel_on(); meow_panel_on();
@@ -2024,6 +2034,7 @@ static int launch_app_chain(struct app *a, const char *chain)
} }
} }
} }
}
if (screen_off_timeout > 0 && meow_screen_on && !meow_auto_slept && !fg_keep_awake()) { if (screen_off_timeout > 0 && meow_screen_on && !meow_auto_slept && !fg_keep_awake()) {
if (now_ms() - app_last_input >= (unsigned long long)screen_off_timeout * 1000) { if (now_ms() - app_last_input >= (unsigned long long)screen_off_timeout * 1000) {
meow_panel_off(); meow_panel_off();
+27 -13
View File
@@ -98,7 +98,8 @@ static int g_lyr_meta_y; /* 顶部元信息 y(避开状态
/* 歌词布局暂存(每次 plr_draw_lyrics 重建;UI 线程串行,静态复用) */ /* 歌词布局暂存(每次 plr_draw_lyrics 重建;UI 线程串行,静态复用) */
static char s_lyr_seg[LYR_MAX_ROWS][LYR_SEG_SZ]; /* 折行段复用缓冲(一次画一个条目) */ static char s_lyr_seg[LYR_MAX_ROWS][LYR_SEG_SZ]; /* 折行段复用缓冲(一次画一个条目) */
static int s_lyr_ent[LYR_MAX_ROWS]; /* 可见条目 → 歌词行下标 */ static int s_lyr_ent[LYR_MAX_ROWS]; /* 可见条目 → 歌词行下标 */
static int s_lyr_rw[LYR_MAX_ROWS]; /* 条目折行段数 */ static int s_lyr_rw[LYR_MAX_ROWS]; /* 条目原文折行段数(画原文;当前行翻译紧随其后) */
static int s_lyr_bh[LYR_MAX_ROWS]; /* 条目块高(子行数)= 原文折行数 + 当前行翻译占 1 行 */
static int s_lyr_sz[LYR_MAX_ROWS]; /* 条目标题字号 */ static int s_lyr_sz[LYR_MAX_ROWS]; /* 条目标题字号 */
static int s_lyr_y[LYR_MAX_ROWS]; /* 条目块顶 y */ static int s_lyr_y[LYR_MAX_ROWS]; /* 条目块顶 y */
@@ -177,17 +178,26 @@ static int lyr_wrap_lines(const char *txt, int size, int maxw,
/* 歌词可见条目布局:活动行块中心锚定在 g_lyr_anchor(屏中线偏上,需求3 中间偏上), /* 歌词可见条目布局:活动行块中心锚定在 g_lyr_anchor(屏中线偏上,需求3 中间偏上),
* 活动行上方保底 ≥LYR_ABOVE_MIN 行已过歌词,下方填满,总视觉行数 ≤ LYR_MAX_ROWS(≤9)。 * 活动行上方保底 ≥LYR_ABOVE_MIN 行已过歌词,下方填满,总视觉行数 ≤ LYR_MAX_ROWS(≤9)。
* 结果写 s_lyr_ent/rw/sz/y(s_lyr_y 自上向下排好;当前行块中心 = g_lyr_anchor)。 */ * 条目块高 s_lyr_bh(子行数)= 原文折行数 s_lyr_rw + 当前行翻译占 1 个子行(其余条目无翻译,bh=rw)。
* 结果写 s_lyr_ent/rw/bh/sz/y(s_lyr_y 自上向下排好;活动行(白色原文)中心 = g_lyr_anchor)。 */
static int lyr_layout(int n, int cur, int maxw) static int lyr_layout(int n, int cur, int maxw)
{ {
/* 清静态暂存(防帧间残留:上帧条目数 > 本周,绘制循环读到陈旧 s_lyr_* 越界复用) */ /* 清静态暂存(防帧间残留:上帧条目数 > 本周,绘制循环读到陈旧 s_lyr_* 越界复用) */
for (int k = 0; k < LYR_MAX_ROWS; k++) { s_lyr_rw[k] = 0; s_lyr_ent[k] = -1; s_lyr_y[k] = 0; } for (int k = 0; k < LYR_MAX_ROWS; k++) {
s_lyr_rw[k] = 0; s_lyr_bh[k] = 0; s_lyr_ent[k] = -1; s_lyr_y[k] = 0;
}
if (cur < 0 || cur >= n) return 0; if (cur < 0 || cur >= n) return 0;
int rc = lyr_wrap_lines(lyric_line_text(cur), LYR_CUR_SZ, maxw, s_lyr_seg, LYR_MAX_ROWS); int rc = lyr_wrap_lines(lyric_line_text(cur), LYR_CUR_SZ, maxw, s_lyr_seg, LYR_MAX_ROWS);
if (rc > LYR_MAX_ROWS) rc = LYR_MAX_ROWS; if (rc > LYR_MAX_ROWS) rc = LYR_MAX_ROWS;
/* 当前行翻译(次级色小字)紧随其原文行、占块高 1 个子行:块高必须含它,否则下一歌词条目
* 被排到与翻译重叠的 y(英文歌原文折行多 → 翻译叠进下一行被压住,Bug ②)。 */
const char *tl = lyric_line_tl(cur);
int has_tl = (tl && tl[0]) ? 1 : 0;
int rc_tot = rc + has_tl; /* 活动行块总子行数(原文折行 + 翻译行) */
int cap = LYR_MAX_ROWS - rc; /* 当前行之外可用的视觉行数 */ int cap = LYR_MAX_ROWS - rc_tot; /* 活动行之外可用的视觉行数 */
if (cap < 0) cap = 0;
int above_want = (cap * 2) / 5; /* 偏上锚定:约 40% 行给上方 */ int above_want = (cap * 2) / 5; /* 偏上锚定:约 40% 行给上方 */
if (above_want > cur) above_want = cur; /* 上方行数上限 = 已过行数 */ if (above_want > cur) above_want = cur; /* 上方行数上限 = 已过行数 */
if (above_want < LYR_ABOVE_MIN) above_want = (cur >= LYR_ABOVE_MIN) ? LYR_ABOVE_MIN : cur; if (above_want < LYR_ABOVE_MIN) above_want = (cur >= LYR_ABOVE_MIN) ? LYR_ABOVE_MIN : cur;
@@ -200,12 +210,14 @@ static int lyr_layout(int n, int cur, int maxw)
if (usedA + rr > above_want) break; if (usedA + rr > above_want) break;
for (int k = a_cnt; k > 0; k--) { for (int k = a_cnt; k > 0; k--) {
s_lyr_ent[k] = s_lyr_ent[k - 1]; s_lyr_rw[k] = s_lyr_rw[k - 1]; s_lyr_ent[k] = s_lyr_ent[k - 1]; s_lyr_rw[k] = s_lyr_rw[k - 1];
s_lyr_bh[k] = s_lyr_bh[k - 1];
s_lyr_sz[k] = s_lyr_sz[k - 1]; s_lyr_sz[k] = s_lyr_sz[k - 1];
} }
s_lyr_ent[0] = i; s_lyr_rw[0] = rr; s_lyr_sz[0] = LYR_OTH_SZ; a_cnt++; usedA += rr; s_lyr_ent[0] = i; s_lyr_rw[0] = rr; s_lyr_bh[0] = rr; s_lyr_sz[0] = LYR_OTH_SZ;
a_cnt++; usedA += rr;
} }
/* 2) 当前行(下标 a_cnt) */ /* 2) 当前行(下标 a_cnt):原文 rc 段 + 翻译 1 段(有翻译时) */
s_lyr_ent[a_cnt] = cur; s_lyr_rw[a_cnt] = rc; s_lyr_sz[a_cnt] = LYR_CUR_SZ; s_lyr_ent[a_cnt] = cur; s_lyr_rw[a_cnt] = rc; s_lyr_bh[a_cnt] = rc_tot; s_lyr_sz[a_cnt] = LYR_CUR_SZ;
/* 3) 下方(cur+1 向下):余量 = cap - actual 上方行数 */ /* 3) 下方(cur+1 向下):余量 = cap - actual 上方行数 */
int below_want = cap - usedA; int below_want = cap - usedA;
if (below_want > (n - 1 - cur)) below_want = n - 1 - cur; /* 下方行数上限 */ if (below_want > (n - 1 - cur)) below_want = n - 1 - cur; /* 下方行数上限 */
@@ -214,17 +226,19 @@ static int lyr_layout(int n, int cur, int maxw)
int rr = lyr_wrap_lines(lyric_line_text(i), LYR_OTH_SZ, maxw, s_lyr_seg, LYR_MAX_ROWS); int rr = lyr_wrap_lines(lyric_line_text(i), LYR_OTH_SZ, maxw, s_lyr_seg, LYR_MAX_ROWS);
if (usedB + rr > below_want) break; if (usedB + rr > below_want) break;
int k = a_cnt + 1 + b_cnt; int k = a_cnt + 1 + b_cnt;
s_lyr_ent[k] = i; s_lyr_rw[k] = rr; s_lyr_sz[k] = LYR_OTH_SZ; b_cnt++; usedB += rr; s_lyr_ent[k] = i; s_lyr_rw[k] = rr; s_lyr_bh[k] = rr; s_lyr_sz[k] = LYR_OTH_SZ;
b_cnt++; usedB += rr;
} }
int cnt = a_cnt + 1 + b_cnt; int cnt = a_cnt + 1 + b_cnt;
if (cnt == 0) return 0; if (cnt == 0) return 0;
/* 4) y 位置:活动行块中心 = g_lyr_anchor;上方向上加、下方向下加(块间无缝隙) */ /* 4) y 位置:活动行(白色原文)中心 = g_lyr_anchor;上方向上、下方向下加(块间无缝隙)。
* 块高用 s_lyr_bh(含翻译行),使下一条目始于翻译行之后(不重叠)。 */
s_lyr_y[a_cnt] = g_lyr_anchor - rc * LYR_SUB_LH / 2; s_lyr_y[a_cnt] = g_lyr_anchor - rc * LYR_SUB_LH / 2;
for (int k = a_cnt + 1; k < cnt; k++) for (int k = a_cnt + 1; k < cnt; k++)
s_lyr_y[k] = s_lyr_y[k - 1] + s_lyr_rw[k - 1] * LYR_SUB_LH; s_lyr_y[k] = s_lyr_y[k - 1] + s_lyr_bh[k - 1] * LYR_SUB_LH;
for (int k = a_cnt - 1; k >= 0; k--) for (int k = a_cnt - 1; k >= 0; k--)
s_lyr_y[k] = s_lyr_y[k + 1] - s_lyr_rw[k] * LYR_SUB_LH; s_lyr_y[k] = s_lyr_y[k + 1] - s_lyr_bh[k] * LYR_SUB_LH;
return cnt; return cnt;
} }
@@ -611,7 +625,7 @@ static void player_reset_touch(void)
} }
/* 歌词页:点行 seek(用与绘制一致的可见条目布局把 tap y 命中最临近行; /* 歌词页:点行 seek(用与绘制一致的可见条目布局把 tap y 命中最临近行;
* 活动行已偏上锚定,非屏中线,故按 s_lyr_y/rw 逐块扫描而非 cx 偏移)。 */ * 活动行已偏上锚定,非屏中线,故按 s_lyr_y/bh 逐块扫描而非 cx 偏移)。 */
static int lyrics_line_tap(int y) static int lyrics_line_tap(int y)
{ {
int n = lyric_count(); int n = lyric_count();
@@ -626,7 +640,7 @@ static int lyrics_line_tap(int y)
if (cnt <= 0) return -1; if (cnt <= 0) return -1;
for (int k = 0; k < cnt; k++) { for (int k = 0; k < cnt; k++) {
int yb = s_lyr_y[k]; int yb = s_lyr_y[k];
int yh = s_lyr_rw[k] * LYR_SUB_LH; int yh = s_lyr_bh[k] * LYR_SUB_LH; /* 块高含当前行翻译,点翻译行归本行 */
if (y >= yb && y < yb + yh) return s_lyr_ent[k]; if (y >= yb && y < yb + yh) return s_lyr_ent[k];
} }
/* 落在可见块之外 → 就近取整(顶部元信息/底部指示点已在上面排除) */ /* 落在可见块之外 → 就近取整(顶部元信息/底部指示点已在上面排除) */
+1 -1
View File
@@ -28,7 +28,7 @@
# ---- 用户态/服务守护二进制(usr/bin,全部 chmod 755 静态 MIPS)---- # ---- 用户态/服务守护二进制(usr/bin,全部 chmod 755 静态 MIPS)----
patch_v2/bootmenu/meow_bootmenu|/usr/bin/meow_bootmenu|4441822d87e76bfce2ce584604ac3830|引导选单 M2.85(sysui让位 agent-216) 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|dd9e619df3e0ab7544850133ac6db7df|M6.22 播放页返回根因修复(np_exit 退出外层主循环) patch_v2/meow_launcherd/meow_launcherd|/usr/bin/meow_launcherd|932bc985be34c89aadc6875e55cc9bae|M6.24 App内电源键锁屏时序(释放边沿误判唤醒)
patch_v2/meow_watchdog/meow_watchdog|/usr/bin/meow_watchdog|34ddbf0275526eaf9be988134845c3af|应用看门狗 M6.23(亮屏亮度按用户设置 display.brightness 恢复,修 panel ON 固定60跳变) patch_v2/meow_watchdog/meow_watchdog|/usr/bin/meow_watchdog|34ddbf0275526eaf9be988134845c3af|应用看门狗 M6.23(亮屏亮度按用户设置 display.brightness 恢复,修 panel ON 固定60跳变)
patch_v2/meow_svcd/meow_svcd|/usr/bin/meow_svcd|605646c4cc93f2baf29071ea6bc870ea|服务管理器 M2.77(+崩溃上报 meow_crash agent-187) 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) mips-repo/bins/meow_mdns/bin/meow_mdns|/usr/bin/meow_mdns|d6b0151bda26768f19952dae1342610d|mDNS 应答器 M2.78(启动竞态+换IP重检 agent-194)