fix(statusbar): present() 尊重 inset — App进程不写顶条28px区, 根治进App顶条黑1s(agent-145)

- 根因: App首帧 present() 全屏拷贝 meow_ui_gfx.c:739 把顶条区写成黑(g_back_buf新缓冲顶条行未初始化)→覆盖launcher叠画顶条; 下次叠加~1s后→黑1s
- 修: SDK present() 真实fb拷贝加 sb_clip 截断(App进程 !meow_ui_sys_render_enabled() 不写 ins 区[0,statusbar_height)); launcher(sb_clip=0)行为不变
- hello 零改动(SDK通用覆盖所有App); launcher立即预画(:9132)+1s刷新 结果不再被冲掉
- meow_ui.a=900205ea launcher=97b73cbf hello=91da9ab0 0warning; 宿主 test_sb_statusbar/test_sb_clamp ALL PASS
- ②App内下拉通知中心: 评估确认属 ④App内通知中心(M3)完整专项(launch_app不读触摸/输入移交竞态/SIGSTOP会话/不调meow_ipc_process), 未冒风险落固件, 标注M3
This commit is contained in:
MeowOS committed 2026-08-30 19:54:48 +08:00
1 parent f8cfa9a54a
commit 03962fffac
3 files changed
+27 -3

No files matched your search

Binary file not shown.
Binary file not shown.
+27 -3
View File
@@ -736,13 +736,37 @@ static void present(void)
if (g_fb_mem) { if (g_fb_mem) {
ioctl(g_fb_fd, FBIO_WAITFORVSYNC, 0); /* 等垂直同步 */ ioctl(g_fb_fd, FBIO_WAITFORVSYNC, 0); /* 等垂直同步 */
unsigned long long tbg = now_ms(); unsigned long long tbg = now_ms();
/* 「同一个状态栏」闭环:App 进程不渲染状态栏(meow_ui_sys_render_enabled()==0),也绝不向
* 真实 fb 写顶条 inset 区(顶条由 launcher 系统进程叠加绘制)。否则 App 首帧全量拷贝
* (meow_ui_init 置 dirty_full)会把 launcher 刚叠画的顶条冲成未初始化数据——真机
* 「进入 App 顶条黑 1 秒再出现」。sb_clip = 本进程当前状态栏 inset(展开=28 / 收合=4 /
* 隐藏=0):全量拷贝只拷 [sb, yres) 行;逐 dirty 矩形把上沿截断到 y>=sb,整块落在顶条区则跳过。
* 仅 App 进程(非系统 UI)截断;launcher(系统 UI)sb_clip=0,行为不变。 */
int sb_clip = 0;
if (!meow_ui_sys_render_enabled()) sb_clip = meow_ui_statusbar_height();
if (sb_clip < 0) sb_clip = 0;
if (sb_clip > g_yres) sb_clip = g_yres;
if (g_dirty_full) { if (g_dirty_full) {
memcpy(g_fb_mem, g_back_buf, (size_t)g_line * (size_t)g_yres); if (sb_clip > 0) {
memcpy(g_fb_mem + (size_t)sb_clip * g_line,
g_back_buf + (size_t)sb_clip * g_line,
(size_t)g_line * (size_t)(g_yres - sb_clip));
} else {
memcpy(g_fb_mem, g_back_buf, (size_t)g_line * (size_t)g_yres);
}
} else { } else {
int bppb = g_bpp / 8; int bppb = g_bpp / 8;
for (int i = 0; i < g_ndirty; i++) { for (int i = 0; i < g_ndirty; i++) {
int rw = g_dirty[i][2], ry = g_dirty[i][1]; int rw = g_dirty[i][2], ry = g_dirty[i][1], rh = g_dirty[i][3];
for (int yy = 0; yy < g_dirty[i][3]; yy++) { if (sb_clip > 0) {
if (ry + rh <= sb_clip) continue; /* 整块在顶条 inset 区:App 不写 */
if (ry < sb_clip) { /* 上沿与顶条区相交:截断到 sb_clip */
rh -= (sb_clip - ry);
ry = sb_clip;
if (rh <= 0 || rw <= 0) continue;
}
}
for (int yy = 0; yy < rh; yy++) {
size_t off = (size_t)(ry + yy) * g_line + (size_t)g_dirty[i][0] * bppb; size_t off = (size_t)(ry + yy) * g_line + (size_t)g_dirty[i][0] * bppb;
memcpy(g_fb_mem + off, g_back_buf + off, (size_t)rw * bppb); memcpy(g_fb_mem + off, g_back_buf + off, (size_t)rw * bppb);
} }