diff --git a/patch_v2/hello_app/hello b/patch_v2/hello_app/hello index 8e18428..bf190e4 100755 Binary files a/patch_v2/hello_app/hello and b/patch_v2/hello_app/hello differ diff --git a/patch_v2/meow_launcherd/meow_launcherd b/patch_v2/meow_launcherd/meow_launcherd index 4044dd8..2364438 100755 Binary files a/patch_v2/meow_launcherd/meow_launcherd and b/patch_v2/meow_launcherd/meow_launcherd differ diff --git a/patch_v2/sdk/meow_ui_gfx.c b/patch_v2/sdk/meow_ui_gfx.c index 6c7d3a5..b23c363 100644 --- a/patch_v2/sdk/meow_ui_gfx.c +++ b/patch_v2/sdk/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); }