fix(bt): 批①叠加/穿透根治 — /tmp/meow_notif_active从布尔标志改为内容=前台归属app_id(App用MEOW_LOG_APP比较:前台照常上屏收输入/后台常驻自抑+排空输入/空=全抑制),SDK present+input共用共享判定meow_ui_overlay_suppressed_active,launcher 7处转场改写;宿主test_overlay_suppress(T2c)/notif_gesture/overlay_gate/bg全过,0warning;meow_ui.a变M6.36需重编+重链四App
This commit is contained in:
1 parent
6bab304660
commit
7a276f609e
6 files changed
+168
-77
No files matched your search
@@ -974,16 +974,33 @@ static int statusbar_touched(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* ---- §10.5 叠加让位自抑(present 层)----
|
||||
* /tmp/meow_notif_active 存在 = 通知中心叠加会话进行中(launcher 正在 fb 上渲染面板)。
|
||||
* App 进程(非系统 UI 渲染者)此时不上屏;200ms 节流缓存存在性(别每帧 stat)。
|
||||
/* ---- §10.5 叠加让位自抑(present / input 共用判定)----
|
||||
* /tmp/meow_notif_active = 前台屏幕归属标记,**内容=当前前台 app_id**(空=菜单/叠加层覆盖/
|
||||
* 无前台单元,即「抑制全部 App」)。App 进程(非系统 UI 渲染者)据此判「我是否前台」:
|
||||
* - 内容==本进程 app_id(env MEOW_LOG_APP)→ 前台 → 照常上屏 / 收输入;
|
||||
* - 内容为空 → 菜单前台或被叠加层覆盖 → 全抑制(含自身);
|
||||
* - 内容为其它 app_id → 后台常驻(批①多 App)/非前台 → 自抑上屏 + 排空输入。
|
||||
* 200ms 节流缓存存在性+内容(别每帧 open/stat)。
|
||||
* 计数 g_overlay_suppressed 供宿主单测断言(meow_gfx_overlay_suppressed_count)。 */
|
||||
static unsigned long long g_overlay_suppressed = 0;
|
||||
/* §后台化保活-残帧:记录「上一次 present 是否处于叠加自抑态」,用于在抑制→不抑制的恢复边沿
|
||||
* 强制整帧重画(盖掉 launcher 在后台化期间画进 buffer0 的桌面/主界面帧)。 */
|
||||
static int g_was_overlay_suppressed = 0;
|
||||
|
||||
static int overlay_present_suppressed(void)
|
||||
/* 本进程 app_id(env MEOW_LOG_APP,launcher 注入)= 判「我是否前台」的身份锚。 */
|
||||
static const char *overlay_own_app(void)
|
||||
{
|
||||
static const char *s = NULL;
|
||||
if (!s) {
|
||||
const char *e = getenv("MEOW_LOG_APP");
|
||||
s = (e && e[0]) ? e : "";
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
/* §批①多 App 后台常驻:present 层与 input 层共用的「是否自抑」判定(单一实现,防两端漂移)。
|
||||
* 系统 UI(launcher 渲染面板/主界面)恒 0。返回 1=本进程应自抑上屏+排空输入。 */
|
||||
int meow_ui_overlay_suppressed_active(void)
|
||||
{
|
||||
if (meow_ui_sys_render_enabled()) return 0; /* launcher(系统 UI)渲染面板,照常上屏 */
|
||||
static char s_path[108];
|
||||
@@ -998,7 +1015,29 @@ static int overlay_present_suppressed(void)
|
||||
unsigned long long now = now_ms();
|
||||
if (s_last_chk && now - s_last_chk < MEOW_OVERLAY_CHK_MS) return s_last_res;
|
||||
s_last_chk = now;
|
||||
s_last_res = (access(s_path, F_OK) == 0) ? 1 : 0;
|
||||
{
|
||||
char owner[48];
|
||||
int have = 0;
|
||||
owner[0] = 0;
|
||||
int fd = open(s_path, O_RDONLY);
|
||||
if (fd >= 0) {
|
||||
ssize_t n = read(fd, owner, sizeof(owner) - 1);
|
||||
close(fd);
|
||||
if (n > 0) owner[n] = 0;
|
||||
have = 1; /* 文件存在(无论内容)→ 处于抑制管控 */
|
||||
} else {
|
||||
have = 0; /* 文件不存在 → 无抑制 */
|
||||
}
|
||||
if (!have) {
|
||||
s_last_res = 0;
|
||||
} else if (owner[0] == 0) {
|
||||
s_last_res = 1; /* 空内容=全抑制(菜单前台/叠加层覆盖) */
|
||||
} else {
|
||||
const char *me = overlay_own_app();
|
||||
/* 内容==本进程 app_id → 前台不抑制;否则(后台常驻/非前台)→ 抑制 */
|
||||
s_last_res = (strcmp(owner, me) == 0) ? 0 : 1;
|
||||
}
|
||||
}
|
||||
return s_last_res;
|
||||
}
|
||||
|
||||
@@ -1010,9 +1049,10 @@ static void present(void)
|
||||
if (!(g_dirty_full || g_ndirty > 0)) return;
|
||||
/* §10.5 叠加让位自抑(仅 App 进程):App 前台播放中唤起通知中心时 launcher 不 SIGSTOP
|
||||
* (保 PCM 供流,ncm 播放线程同进程),改由 App 进程在此自抑上屏——绘制照常进 back_buf,
|
||||
* 只是不 present 到 fb,防 App 重绘穿透 launcher 叠加层。系统 UI 进程(launcher 渲染面板)
|
||||
* 不抑制。抑制期脏区保留累积(超上限自然升级整帧),标记消失后下一次 present 一次上屏。 */
|
||||
if (overlay_present_suppressed()) { g_overlay_suppressed++; g_was_overlay_suppressed = 1; return; }
|
||||
* 只是不 present 到 fb,防 App 重绘穿透 launcher 叠加层;后台常驻(批①)App 同判据自抑。
|
||||
* 系统 UI 进程(launcher 渲染面板)不抑制。抑制期脏区保留累积(超上限自然升级整帧),
|
||||
* 判定为「回到前台」后下一次 present 一次上屏。 */
|
||||
if (meow_ui_overlay_suppressed_active()) { g_overlay_suppressed++; g_was_overlay_suppressed = 1; return; }
|
||||
/* §后台化保活-残帧:抑制→不抑制的**恢复边沿**强制整帧重画。App 被 launcher 转后台保活
|
||||
* (/tmp/meow_notif_active 存在)期间 present 被自抑,back_buf 仍保留 App 自己的完整帧;
|
||||
* 但 launcher 已把桌面/主界面整帧画进 buffer0 盖在 App 残帧上。恢复前台时若只 present
|
||||
|
||||
Reference in new issue
Block a user