diff --git a/meow_ui_internal.h b/meow_ui_internal.h index ff151e2..702a97b 100644 --- a/meow_ui_internal.h +++ b/meow_ui_internal.h @@ -8,6 +8,33 @@ #include #include "meow_ui.h" +/* ---- 系统状态喂入(Stage-One 状态栏收敛;meow_ui_sys.c 提供)---- + * launcher(系统进程)不跑 SDK 事件循环(无 meow_ui_run),SDK 的 meow_ui_sys_refresh() + * 不会在 launcher 里自动触发;且电量/音量/亮度等权威值本就在 launcher 的 g_sys 快照里 + * (launcher 是背光/音量写入方)。故此 API 让 launcher 把权威快照喂进 SDK 的系统状态, + * 喂入即置状态栏 force,下一次 present() 重画顶条。SDK 自身 meow_ui_sys_refresh() 仍按 + * 同源兜底(供 App 流程 meow_ui_run 使用)。只填 SDK 快照所需最小字段,与 launcher 的 + * meow_sys_state(meow_launcherd.c)字段名交叉映射,二者是不同 TU 的异名类型,故用此 + * 专用喂入结构,避免 launcher 引入 meow_ui_sys.h 造成 typedef 重定义。 */ +typedef struct meow_ui_feed { + int batt; /* 电量 %,-1 未知 */ + int charging; /* 1 充电/满 0 放电 */ + int wifi_on; /* 1 网卡 up(operstate==up) */ + int bt_seen; /* hci0 节点存在 */ + int bt_on; /* 实际上电 */ + int vol; /* 音量 0-100 */ + int brightness; /* 背光 1-100;<=0 视为未知/屏关不入顶条 */ +} meow_ui_feed; +void meow_ui_sys_feed(const meow_ui_feed *f); /* 喂权威快照 + 置 force 重绘顶条 */ + +/* ---- 主题(meow_ui_theme.c 提供)---- + * 重置主题缓存,使下一次 meow_theme_get() 重读 settings.conf(display.theme / + * display.theme_mode / display.theme_dark_start|end)。launcher 在 statusbar 刷新前调用, + * 让 SDK 状态栏(其主题是缓存的)跟手 launcher 侧主题变更,避免「launcher 界面已换肤、 + * 状态栏滞留旧主题」。App 无需调用(主题变更本就由 Settings 改 settings.conf,下一个 + * set_mode/get 自然读到——缓存仅挡「同会话内 settings 被外部改写」的即时反映)。 */ +void meow_theme_reload(void); + /* ---- 渲染后端(meow_ui_gfx.c)提供 ---- */ /* 把 RGBA 像素(stb_image 输出,4 通道 straight alpha)blit 进 back_buf; * alpha 为全局不透明度 0-255(255 时仍用像素自身 alpha 做逐像素混合)。 */ diff --git a/meow_ui_sys.c b/meow_ui_sys.c index e21900e..99d7d3b 100644 --- a/meow_ui_sys.c +++ b/meow_ui_sys.c @@ -91,11 +91,26 @@ static int settings_vol(void) return meow_ui_vol_clamp(vol, vol_max); } +/* 亮度:读 settings.conf 的 display.brightness(launcher 同源),并 clamp 到 + * [display.brightness_min, 100](与 launcher clamp_brightness 同口径,下限默认 1=极暗非全黑)。 + * Stage-One 状态栏收敛(launcher 退役自绘状态栏)后,launcher 侧用 meow_ui_sys_feed() 喂 + * 即时值(写入方=launcher);此处兜底让 App(meow_ui_run 的 1s 轻刷)也读到并显示亮度, + * 保证「launcher / App 同一实现、同日/夜」。 */ +static int settings_bright(void) +{ + int v = meow_ui_vol_read(MEOW_SETTINGS_FILE, "display.brightness", 101); + int mn = meow_ui_vol_read(MEOW_SETTINGS_FILE, "display.brightness_min", 1); + if (v < mn) v = mn; + if (v > 100) v = 100; + return v; +} + int meow_ui_sys_init(void) { memset(&g_sys, 0, sizeof g_sys); g_sys.batt = -1; g_sys.vol = settings_vol(); + g_sys.brightness = settings_bright(); g_statusbar_on = 1; g_fullscreen = 0; g_statusbar_force = 1; @@ -117,6 +132,7 @@ void meow_ui_sys_refresh(void) g_sys.wifi_on = !strcmp(op, "up") ? 1 : 0; g_sys.vol = settings_vol(); + g_sys.brightness = settings_bright(); /* 兜底读 settings;launcher 喂入会覆盖(更即时) */ /* 蓝牙:hci0 存在性检查便宜;上电状态贵(hciconfig spawn),30s 缓存。 */ static uint64_t last_bt_ms = 0; @@ -136,6 +152,25 @@ void meow_ui_sys_refresh(void) const meow_sys_state *meow_ui_sys_get(void) { return &g_sys; } +/* ---- 系统进程(launcher)喂入权威快照(Stage-One 状态栏收敛)---- + * launcher 不跑 SDK 事件循环,其 g_sys(meow_sys_refresh/light + 事件路径维护)是权威数据源 + * (尤其亮度/音量,写入方=launcher)。此处把它覆盖进 SDK 快照并置 force,驱动下一次 + * present() 重画顶条。不喂的字段保持 SDK 现有值(由 meow_ui_sys_refresh 同源兜底)。 */ +void meow_ui_sys_feed(const meow_ui_feed *f) +{ + if (!f) return; + g_sys.batt = f->batt; + g_sys.charging = f->charging; + g_sys.wifi_on = f->wifi_on; + g_sys.bt_seen = f->bt_seen; + g_sys.bt_on = f->bt_on; + g_sys.vol = f->vol; + if (f->brightness <= 0) g_sys.brightness = 0; /* 未知/屏关:不入顶条(>0 才显示) */ + else if (f->brightness > 100) g_sys.brightness = 100; + else g_sys.brightness = f->brightness; + g_statusbar_force = 1; /* 数据已变 → 顶条必重画 */ +} + /* ---- 公共 API ---- */ void meow_ui_set_statusbar(int visible) { @@ -190,20 +225,25 @@ int meow_ui_sys_statusbar_force(void) return f; } -/* 状态栏右侧信息串:batt% WIFI 蓝牙/蓝牙 VOL nn%(同 launcher statusbar_right_str) */ +/* 状态栏右侧信息串:batt% WIFI 蓝牙 VOL nn% 亮度nn%(同 launcher 状态栏右侧语义,文本式)。 + * mfont 就绪用 CJK「蓝牙/亮度」,否则回退 ASCII "BT/BRI"(28px 栏紧凑,避免超宽叠到时钟)。 + * 顺序与 launcher 右侧簇一致:电量 → WiFi → 蓝牙 → 音量 → 亮度。*/ static void statusbar_right_str(char *out, size_t n) { - char batt[16] = "", wifi[16] = "", vol[20] = "", bt[16] = ""; + char batt[16] = "", wifi[16] = "", vol[20] = "", bt[16] = "", bri[20] = ""; if (g_sys.batt >= 0) snprintf(batt, sizeof batt, "%d%%", g_sys.batt); if (g_sys.wifi_on) snprintf(wifi, sizeof wifi, "WIFI"); snprintf(vol, sizeof vol, "VOL %d%%", g_sys.vol); if (g_sys.bt_seen && g_sys.bt_on) snprintf(bt, sizeof bt, meow_gfx_mfont_ready() ? "蓝牙" : "BT"); + if (g_sys.brightness > 0) /* >0 才显示(屏常亮态);0=屏关/未知不入 */ + snprintf(bri, sizeof bri, meow_gfx_mfont_ready() ? "亮度%d%%" : "BRI %d%%", g_sys.brightness); out[0] = 0; if (batt[0]) strcat(out, batt); if (wifi[0]) { if (out[0]) strcat(out, " "); strcat(out, wifi); } if (bt[0]) { if (out[0]) strcat(out, " "); strcat(out, bt); } if (vol[0]) { if (out[0]) strcat(out, " "); strcat(out, vol); } + if (bri[0]) { if (out[0]) strcat(out, " "); strcat(out, bri); } } void meow_ui_sys_statusbar_render(void) diff --git a/meow_ui_sys.h b/meow_ui_sys.h index de80a7d..070e61b 100644 --- a/meow_ui_sys.h +++ b/meow_ui_sys.h @@ -27,6 +27,8 @@ typedef struct meow_sys_state { int bt_seen; /* hci0 节点存在 */ int bt_on; /* 实际上电(hciconfig UP) */ int vol; /* 音量 0-100 */ + int brightness; /* 背光/亮度 1-100;只有 >0 才显示(屏常亮态)。由 launcher 喂入 + * (launcher 是背光写入/clamp 方),SDK 自己亦用 settings 兜底读。 */ } meow_sys_state; /* 顶部状态栏几何(与 launcher SB_BAR_H=28 / SB_FONT=20 对齐,视觉统一)。 diff --git a/meow_ui_theme.c b/meow_ui_theme.c index 305ad9a..c567ee8 100644 --- a/meow_ui_theme.c +++ b/meow_ui_theme.c @@ -11,6 +11,7 @@ * 切换即广播 listener。AUTO 解析只在查询时按当前系统时间计算(不缓存)。 */ #include "meow_ui.h" +#include "meow_ui_internal.h" /* meow_theme_reload() 定义(供 launcher 逼重读 settings) */ #include #include #include @@ -168,6 +169,14 @@ void meow_theme_set_mode(meow_theme_mode m) broadcast(); } +/* 重置缓存:下一次 meow_theme_get()/get_mode()/defaults() 重读 settings.conf。 + * launcher 在 statusbar 刷新前调用,让 SDK 全局状态栏(其主题缓存于 g_loaded)跟手 + * launcher 侧主题变更(settings.conf 被改后立即反映),避免「界面已换肤、状态栏滞留旧主题」。 */ +void meow_theme_reload(void) +{ + g_loaded = 0; +} + meow_theme meow_theme_defaults(meow_theme_mode m) { switch (resolve_mode(m)) {