From 5ee99265d2985927ff7fb3b09a68c80752176985 Mon Sep 17 00:00:00 2001 From: MeowOS Date: Sun, 30 Aug 2026 19:54:48 +0800 Subject: [PATCH] =?UTF-8?q?fix(statusbar):=20present()=20=E5=B0=8A?= =?UTF-8?q?=E9=87=8D=20inset=20=E2=80=94=20App=E8=BF=9B=E7=A8=8B=E4=B8=8D?= =?UTF-8?q?=E5=86=99=E9=A1=B6=E6=9D=A128px=E5=8C=BA,=20=E6=A0=B9=E6=B2=BB?= =?UTF-8?q?=E8=BF=9BApp=E9=A1=B6=E6=9D=A1=E9=BB=911s(agent-145)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 根因: 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 --- meow_ui_gfx.c | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/meow_ui_gfx.c b/meow_ui_gfx.c index 6c7d3a5..b23c363 100644 --- a/meow_ui_gfx.c +++ b/meow_ui_gfx.c @@ -736,13 +736,37 @@ static void present(void) if (g_fb_mem) { ioctl(g_fb_fd, FBIO_WAITFORVSYNC, 0); /* 等垂直同步 */ 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) { - 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 { int bppb = g_bpp / 8; for (int i = 0; i < g_ndirty; i++) { - int rw = g_dirty[i][2], ry = g_dirty[i][1]; - for (int yy = 0; yy < g_dirty[i][3]; yy++) { + int rw = g_dirty[i][2], ry = g_dirty[i][1], rh = g_dirty[i][3]; + 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; memcpy(g_fb_mem + off, g_back_buf + off, (size_t)rw * bppb); }