启动器SDK改造 阶段一: 状态栏收敛单一SDK全局(agent-136)
- launcher meow_ui_set_statusbar(1) 启用SDK全局状态栏; 旧自绘(draw_statusbar/sb_redraw等)#if0退役(保留回退)
- 新增 SDK meow_ui_sys_feed(): launcher 喂 batt/charging/wifi/bt/vol/brightness 进SDK快照+置force+标脏顶条(0,0,xres,28)→present只重画顶条
- meow_ui_theme_reload(): SDK状态栏跟手launcher换肤; meow_sys_state 增 brightness
- 主界面/设置页/电源菜单/通知中心 顶部28px 由SDK全局状态栏统一绘制; 与App同实现/同主题/同日·夜
- ⚠️ 状态栏由MD3图标式→SDK文本式(HH:MM:SS …81% WIFI 蓝牙 VOL 亮度) — 用户拍板"用SDK的"既定结果; 图标MD3化属后续
- meow_ui.a=110c820a(仅新增符号,向后兼容) launcher=d4f108dd hello=12f48840(重编确认App不破坏); 0warning
- devdocs/plan/LAUNCHER_SDK_REWRITE.md 方案先行
This commit is contained in:
1 parent
143c11ac94
commit
9f4143af22
4 files changed
+80
-2
No files matched your search
@@ -8,6 +8,33 @@
|
||||
#include <stdint.h>
|
||||
#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 做逐像素混合)。 */
|
||||
|
||||
+42
-2
@@ -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)
|
||||
|
||||
@@ -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 对齐,视觉统一)。
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
* 切换即广播 listener。AUTO 解析只在查询时按当前系统时间计算(不缓存)。
|
||||
*/
|
||||
#include "meow_ui.h"
|
||||
#include "meow_ui_internal.h" /* meow_theme_reload() 定义(供 launcher 逼重读 settings) */
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
@@ -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)) {
|
||||
|
||||
Reference in new issue
Block a user