- meow_ui_sys_set_system_mode: launcher置1才渲染, App默认0→不画状态栏; app_overlay_statusbar在launch_app循环~1s叠加28px顶条(不SIGSTOP App) - 数据源唯一(launcher g_sys→meow_ui_sys_feed; wifi_level/batt/vol/bri/clock), 根治"launcher有亮度App没有" - 右侧=MD3图标+变量值(statusbar_right_str文本退役→图标簇, 复用sb_icons.h/MEOW_SB_ICON_*/meow_gfx_blit_icon); 颜色随meow_theme - ui.style换图标集(meow_ui_style/set_style读ui.style md3/miuix, MIUIx暂MD3占位) - hello最小改动(redraw非全屏只清inset=28之下, 不冲系统顶条); 开放点: App不SIGSTOP/inset28/MIUIx占位/set_statusbar系统模式门 - meow_ui.a=3da5af7b launcher=a2b1c096 hello=67075741 0warning; 宿主test_sb_statusbar ALL PASS + render PPM目检(左时钟右亮度/WiFi/蓝牙/音量/电量) - 遗留: 真机验证(无双画/数据一致/顶条叠加/inset/ui.style); 运行时fullscreen沉浸叠画待M3; MIUIx图标占位
169 lines
9.8 KiB
C
169 lines
9.8 KiB
C
/*
|
||
* meow_ui_internal.h — SDK 内部各 TU 共享声明(不随 meow_ui.h 发布给应用)。
|
||
* 仅供 meow_ui_*.c 之间协作:渲染后端底层能力 + 输入事件队列 + 主题取用。
|
||
*/
|
||
#ifndef MEOW_UI_INTERNAL_H
|
||
#define MEOW_UI_INTERNAL_H
|
||
|
||
#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(射频开) */
|
||
int wifi_connected;/* 1 已关联 AP(operstate up);WiFi 图标分档用 */
|
||
int wifi_level; /* 信号 dBm(<-1000=未知);≥-60 强 / -75 中 / 更弱弱 */
|
||
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 重绘顶条 */
|
||
|
||
/* ---- 系统 UI 模式(「同一个状态栏」闭环,§3.1 / FRAMEWORK_DESIGN §10.2)----
|
||
* 状态栏 = 系统级组件,仅系统进程(launcher)渲染。SDK 在 App 进程与 launcher 进程都链接,
|
||
* 但顶条/提示线的**渲染**仅当本进程为系统 UI(launcher 置 system_mode=1)才进行;App 进程
|
||
* 不渲染(meow_ui_sys_statusbar_active()/meow_ui_statusbar_height() 不受此开关影响 → App 仍
|
||
* inset 28、热区可用,只是不画顶条、由 launcher 叠加)。launcher init 后调
|
||
* meow_ui_sys_set_system_mode(1);App 保持默认 0。 */
|
||
void meow_ui_sys_set_system_mode(int on); /* 1=本进程为系统 UI(渲染顶条/提示线) */
|
||
int meow_ui_sys_render_enabled(void); /* 当前进程是否渲染系统顶条 */
|
||
/* 把全局状态栏画进本进程 back_buf 顶部 MUI_SBAR_H 行(仅系统进程调用,见 render_enabled)。
|
||
* launcher 的 App 前台叠加(launch_app 循环)直接调它 + 标脏顶条上屏。实现见 meow_ui_sys.c。 */
|
||
void meow_ui_sys_statusbar_render(void);
|
||
|
||
/* ---- 状态栏 MD3 图标簇(meow_ui_sys.c 渲染右侧;位图在 SDK 侧 sb_icons.h)----
|
||
* meow_ui_gfx.c 的 meow_gfx_blit_icon(idx,...) 用这些索引查 sb_icons[]。
|
||
* 索引值与 launcher sb_icons.h 的 SB_I_* 一一对应(位图同源,勿改序)。 */
|
||
#define MEOW_SB_ICON_WIFI 0
|
||
#define MEOW_SB_ICON_BT 1
|
||
#define MEOW_SB_ICON_BATT 2
|
||
#define MEOW_SB_ICON_VOL 3
|
||
#define MEOW_SB_ICON_BRIGHT 4
|
||
#define MEOW_SB_ICON_WIFI_STRONG 5
|
||
#define MEOW_SB_ICON_WIFI_MEDIUM 6
|
||
#define MEOW_SB_ICON_WIFI_WEAK 7
|
||
#define MEOW_SB_ICON_WIFI_NO 8
|
||
#define MEOW_SB_ICON_WIFI_OFF 9
|
||
#define MEOW_SB_ICON_BT_NO 10
|
||
#define MEOW_SB_ICON_BT_CONN 11
|
||
#define MEOW_SB_ICON_BT_DIS 12
|
||
#define MEOW_SB_ICON_BT_SEARCH 13
|
||
|
||
/* 状态栏右下布局常量(与 launcher SB_* 对齐):图标右缘↔文字间隙 / 相邻项间隙 / 图标目标 ink 高 /
|
||
* 右簇左缘相对时钟右缘安全间距 / 图标 ink 垂直中心(=状态栏文字中心,28px 栏约 14)。 */
|
||
#define MEOW_SB_TGAP 6
|
||
#define MEOW_SB_XGAP 10
|
||
#define MEOW_SB_ICON_INK 16
|
||
#define MEOW_SB_CLK_MARGIN 14
|
||
#define MEOW_SB_ICON_CY 14
|
||
#define MEOW_SB_ICON_SIZE 32 /* 图标槽宽(= sb_icons.h SB_ICON_SIZE,勿改序) */
|
||
|
||
/* 把第 idx 个 MD3 图标(sb_icons[])按 ink 等比 blit 进 back_buf;x=槽左缘、ink_h=目标 ink 高
|
||
* (0=自然 ink,WiFi 强弱档用)、fg=24bit 前景、cy=ink 垂直中心线。见 meow_ui_gfx.c。 */
|
||
void meow_gfx_blit_icon(int idx, int x, int y, int ink_h, uint32_t fg, int cy);
|
||
|
||
/* ---- 顶级主题风格族(§8.1.2,minimal):状态栏图标集/配色随 ui.style(md3/miuix)----
|
||
* meow_ui_theme.c 实现:读 settings.conf 的 ui.style(md3→0 / miuix→1),缓存,随
|
||
* meow_theme_reload() 重读。launcher settings 改 ui.style 后经 sb_sdk_refresh→theme_reload
|
||
* →本值更新 → 状态栏图标集跟手切。公共版见 meow_ui.h(meow_ui_set_style/meow_ui_style)。 */
|
||
int meow_ui_style(void);
|
||
|
||
/* ---- 主题(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 做逐像素混合)。 */
|
||
void meow_gfx_blit_rgba(int x, int y, int w, int h, const uint8_t *rgba, int alpha);
|
||
|
||
/* 标记一个区域脏(供非标准绘制使用)。 */
|
||
void meow_gfx_mark_dirty(int x, int y, int w, int h);
|
||
|
||
/* 标记整帧脏(launcher 手动脏模型桥接:自绘 raw 像素后标全屏,present 走 SDK)。 */
|
||
void meow_gfx_mark_full(void);
|
||
|
||
/* 返回离屏 back_buf 指针(launcher 系统组件与 SDK 共用同一 back_buf 用)。 */
|
||
unsigned char *meow_ui_back_buf(void);
|
||
|
||
/* 实心圆角矩形(控件按钮底色用;公共 §3 只有空心 draw_rect_round)。[D3] */
|
||
void meow_gfx_fill_round(int x, int y, int w, int h, int r, uint32_t color);
|
||
|
||
/* 是否运行于真实 fb 之上(0 = 头less/离屏,qemu/宿主)。 */
|
||
int meow_gfx_is_device(void);
|
||
|
||
/* 中文/日文字库(mfont)是否已加载(状态栏「蓝牙」CJK 与回退 "BT" 二选一)。 */
|
||
int meow_gfx_mfont_ready(void);
|
||
|
||
/* ---- 输入层(meow_ui_input.c)---- */
|
||
/* 语义事件:由输入线程解析后压入队列,run/IME 循环弹出。 */
|
||
#define MEOW_EV_KEY 1 /* a=keycode, b=1 按下 / 0 抬起 */
|
||
#define MEOW_EV_TAP 2 /* a=x, b=y(触摸抬起落点) */
|
||
#define MEOW_EV_SWIPE 3 /* a=MEOW_SWIPE_*, b=距离(px) */
|
||
#define MEOW_EV_SWIPE_PROGRESS 4 /* a=按下X(t_dx), b=当前X(t_cx);dx=b-a(>0=左缘向内划=返回手势) */
|
||
|
||
typedef struct meow_input_ev {
|
||
uint8_t type;
|
||
int a, b;
|
||
} meow_input_ev;
|
||
|
||
/* 启动输入线程(幂等)。无设备时仅空转。 */
|
||
void meow_input_start(void);
|
||
/* 从队列弹出一个事件;无事件返回 0。 */
|
||
int meow_input_pop(meow_input_ev *ev);
|
||
/* 注入一条语义事件(宿主验证手势分发/进度条用;设备上无调用方)。 */
|
||
void meow_input_inject(int type, int a, int b);
|
||
/* 清空队列(IME 打开前丢弃残留触摸,避免误敲)。 */
|
||
void meow_input_drain(void);
|
||
|
||
/* ---- 实时触摸态(供控件绘制按压/按住视觉;输入线程写、app 主线读)----
|
||
* 与语义事件队列无关:这些直接读输入线程的触摸状态机当前值,让 meow_widget_draw
|
||
* 在「手指按下期间」能如实反映按钮的按下/按住视觉,而无需 app 自行追踪按下。 */
|
||
int meow_input_touch_down(void); /* 当前是否有触摸按下 */
|
||
int meow_input_touch_x(void); /* 当前 X(无按下=-1) */
|
||
int meow_input_touch_y(void); /* 当前 Y(无按下=-1) */
|
||
unsigned int meow_input_touch_hold_ms(void); /* 按下已持续毫秒(抬起后 0) */
|
||
|
||
/* 宿主单测/内部注入:模拟一次按压。down=1 时 x,y 为压点、hold_ms 可指定「已按住时长」
|
||
* (把按下时刻回拨),便于测按住态;down=0 复位。设备运行时无调用方。 */
|
||
void meow_input_touch_set(int down, int x, int y, unsigned hold_ms);
|
||
|
||
/* ---- 控件层实时刷新(meow_ui_widget.c)----
|
||
* 每帧由 meow_ui_run 调用(主线程):实时触摸按下/释放/按住达阈值时,重绘命中的按钮区
|
||
* 并局部上屏,让按压/按住/释放视觉即时反映,无需 app 在 on_tick/on_tap 重绘(agent-119)。
|
||
* 仅作用于 SDK 控件按钮(meow_widget_draw 的 W_BTN);app 纯自绘不适用。 */
|
||
void meow_widget_touch_refresh(void);
|
||
|
||
/* ---- App 跨 Activity 全局控件(meow_ui_global.c,§6.1 ②骨架)----
|
||
* 渲染帧(meow_ui_gfx present())在 active activity 内容之上、全局状态栏之下调用
|
||
* meow_ui_global_render;触摸 TAP 分发先给 meow_ui_global_hit(命中返回 1=消费,
|
||
* 否则落到 active activity 页面控件)。跨 Activity 常驻,由 SDK 调度。 */
|
||
void meow_ui_global_render(void);
|
||
int meow_ui_global_hit(int x, int y);
|
||
|
||
/* ---- IME(meow_ui_ime.c)---- */
|
||
/* 当前是否显示软键盘。 */
|
||
int meow_ime_active(void);
|
||
/* 软键盘拦截一次触摸。返回 1=已消费(供 IME 转键/提交),0=未命中(透传给 app)。 */
|
||
int meow_ime_handle_tap(int x, int y);
|
||
/* 软键盘绘制覆盖层(每次 flush 前调用;覆盖底部约 40%)。 */
|
||
void meow_ime_draw(void);
|
||
/* 关闭 IME 并交付最终结果(result: 1=确认 0=取消)。 */
|
||
void meow_ime_close(int result);
|
||
|
||
#endif /* MEOW_UI_INTERNAL_H */
|