Files
MeowOS-For-R3P2/patch_v2/sdk/meow_ui_internal.h
T
MeowOS 7300fc0a13 状态栏正确闭环(agent-142): 系统进程统一渲染+App不画+覆盖叠加+数据唯一+MD3图标式+主题换图标
- 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图标占位
2026-08-30 19:32:40 +08:00

169 lines
9.8 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* 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 */