feat: M6.10–M6.19 批量收编 + M6.19 推卡验收
- M7 launcher 重写 5 期(虚拟化宫格/meow_theme 单一权威/横幅动画/自定义 PIN 键盘) - OOM 通用化(cachegov 上收 SDK)、自动切歌根治、meowpanel jv_free 泄漏修复、Hello 滚动卡顿修复 - ncm 歌词 UI / 媒体通知封面 / 封面分辨率 640 - 5 bug 修复:ncm 后台化 UI 叠层+点击穿透、再进 ncm 桌面叠层、播放页新旧 UI 叠层抢刷脏区(meow_ui_gfx 恢复边沿整帧重画)、PIN 亮屏亮度跳(keys.c meow_panel_on 按 settings_brightness_clamped 恢复)、通知中心封面显歌单封面(cover.c save_cover_raw 加 is_song + 命中块守卫) - 四 App 统一重链新 meow_ui.a 51caee4a;M6.19=0.8.19 固件 2d2331f2 推卡自刷验收全绿
This commit is contained in:
1 parent
c2ee7626a4
commit
3d70a3dd2c
176 files changed
+15507
-597
No files matched your search
+202
-2
@@ -465,6 +465,35 @@ int meow_listview_set_empty_text(meow_widget *lv, const char *text);
|
||||
> T4 自绘、T5 焦点/fling 联动)+ 全量回归 widgets/dispatch/box/anim/scroll/ime/pinyin/overlay/notif/
|
||||
> sdk_input_keys/p1p2p3 全 PASS;交叉 -Wall -Wextra 0 warning。
|
||||
|
||||
#### 左滑删除(swipe-delete,M7.3 通知中心缺口 #9)
|
||||
|
||||
> **定位**:给 `meow_listview` 的行加**横向左滑手势 + 删除/回弹动画**(配合行自绘 `set_item_draw`)。
|
||||
> SDK 在自绘行前把该行横向偏移 `swipe_dx` 传给 `x`,并画出右露的**删除区**(主题 `error`/`onError`);
|
||||
> 手势由 App 在 `on_touch_move` 喂三级,**不修改** `tap_at`/滚动语义(`meow_ui_widgets.h` 追加)。
|
||||
|
||||
**手势判定表**(`swipe_begin/move/end` 三级,App 在触摸回调里喂):
|
||||
- **横向** `|dx|>|dy|` 且超容差 = 滑动(`move` 返回 1,本列表消费——App 不要再去 `scroll_by`);
|
||||
- **纵向** `|dy|>|dx|` 且超容差 = 滚动手势优先(返回 0,取消本行 swipe,App 照常滚动);
|
||||
- **点按** 无位移(`end` 时未 started)= 行点击(返回 0,App 照常 `tap_at`)。
|
||||
|
||||
**动画**:超阈值 → 行滑出动画(`meow_anim`,§12.2),结束后回调 `on_delete(idx)`;未超 → 回弹。
|
||||
`swipe_offset` 返回当前滑动行的 `dx`(<0=左移),自绘行绘制时据此位移;`swipe_active`=1 表示有行处于滑动/动画中。
|
||||
|
||||
**API 一览(`include/meow_ui_widgets.h`,§5.5)**:
|
||||
```c
|
||||
typedef void (*meow_listview_swipe_fn)(int idx, void *ctx);
|
||||
void meow_listview_set_swipe_delete(meow_widget *lv, int enabled,
|
||||
meow_listview_swipe_fn on_delete, void *ctx);
|
||||
int meow_listview_swipe_begin(meow_widget *lv, int x, int y); /* touch-down:1=命中可滑行行(喂后续 move) */
|
||||
int meow_listview_swipe_move(meow_widget *lv, int x, int y); /* touch-move:1=消费(横向);0=让位(取消/纵向) */
|
||||
int meow_listview_swipe_end(meow_widget *lv, int x, int y); /* release:1=消费(删/回弹动画);0=未滑动(tap) */
|
||||
int meow_listview_swipe_active(meow_widget *lv); /* 1=有行处于滑动/动画中 */
|
||||
int meow_listview_swipe_offset(meow_widget *lv); /* 当前滑动行的 dx(<0=左移;自绘行画用) */
|
||||
```
|
||||
> **兼容/内存**:纯手势 + 动画层(配合 `set_item_draw` 自绘),不新增常驻结构;删除动画走 §12.2
|
||||
> `meow_anim` 静态池(≤16),热路径零 malloc;与行点击/滚动互不冲突(见上判定表)。
|
||||
> **M7 用途**:通知中心(M7.3)通知条左滑删除(缺口 #9)。
|
||||
|
||||
---
|
||||
|
||||
### 5.6 设计模板 B③ 弹窗/对话框 [源:2026-08-30]
|
||||
@@ -865,6 +894,35 @@ meow_widget *meow_layout_spacer(int w, int h);
|
||||
|
||||
**同步重编注意(关键)**:`meow_ui_theme` 追加字段 / `meow_widget` 结构变化 → **`meow_ui.a` ABI 变化** → 需按 §9/§10「**同步重编 hello**(App 也链 `meow_ui.a meow_font.a libz.a -lpthread`)」一并处理;`build_sdk.sh` 一键重编 + `hello_app/build_hello.sh` 重链。**B1 既有控件与模板零改动**(§5.8.1/§5.8.2 均向后兼容)。
|
||||
|
||||
#### 5.8.9 枚举 / 预设选择器(`meow_select`,M7.2 设置页缺口 #4)
|
||||
|
||||
> **定位**:给「枚举 / 预设选择器」一个开箱即用的**下拉模态**(`include/meow_select.h`,追加入 `meow_ui.h` 伞头)——
|
||||
> 采样率/码率/主题/语言等枚举、均衡器预设等。封装 = **BottomSheet(标题 + 选项列表)+ `meow_listview`(SINGLE) 单选列表**:
|
||||
> 选项数组 + 当前选中(高亮)+ 点选项 = 选中 + 关闭 + `on_change` 回调;点面板外/左缘返回 = 取消。
|
||||
> 阻塞式(内层 `meow_input_pop` 轮询,与 `meow_dialog` 同构);打开前排空残留触摸。
|
||||
> 复用 `meow_dialog` 的遮罩/快照恢复(scrim 只叠一层、关闭无残影)。
|
||||
|
||||
**API(`include/meow_select.h`)**:
|
||||
```c
|
||||
typedef struct meow_select meow_select;
|
||||
typedef void (*meow_select_fn)(int idx, void *ctx); /* on_change:idx=选中项下标(0..n-1) */
|
||||
#define MEOW_SELECT_MAX_ITEMS 32 /* 选项上限(静态数组;越界 add 忽略并返回 -1) */
|
||||
|
||||
/* 组件式(可复用 + on_change 回调) */
|
||||
meow_select *meow_select_create(const char *title, int cur); /* cur=初始选中项;越界 clamp */
|
||||
int meow_select_add_item(meow_select *s, const char *label); /* 返回项下标;满/无效= -1 */
|
||||
void meow_select_set_on_change(meow_select *s, meow_select_fn cb, void *ctx);
|
||||
int meow_select_open(meow_select *s); /* 阻塞到确认/取消:选中→result=idx+on_change(idx)+返回 idx;取消→-1 */
|
||||
void meow_select_free(meow_select *s);
|
||||
|
||||
/* 一次性(无回调,返回值即选择);opts=const char* 数组;n=个数;cur=初始选中 */
|
||||
int meow_select_show(const char *title, const char *const *opts, int n, int cur);
|
||||
```
|
||||
- **内存纪律**:选项数组**定长**(≤`MEOW_SELECT_MAX_ITEMS`,栈/数组持有,非 malloc 长列表;越界 `add_item` 返回 -1);
|
||||
列表在 `open` 时创建(冷路径)、`close` 时释放;**open 循环零 malloc**。
|
||||
- **选择语义**:确认 → 置 `result` + 调 `on_change(idx)` + 返回 `idx`;取消/点面板外/左缘返回 → 返回 `-1`(不调 `on_change`)。
|
||||
- **M7 用途**:设置页(M7.2)采样率/码率/主题/语言等枚举选择(缺口 #4)。
|
||||
|
||||
---
|
||||
|
||||
### 5.9 音频客户端 API(`meow_audio_*`,M2.90 落地)
|
||||
@@ -985,6 +1043,11 @@ void meow_ui_global_remove(int id);
|
||||
- **SDK 提供系统组件 API 仅供系统进程链接调用**:SDK 保留系统级控件内部接口位(上面 ③);**用户 App 拿不到**、**不可自建悬浮层/全局叠加**——App 这类需求只能走 SDK 标准能力。
|
||||
- **进程隔离(核心)**:SDK 负责**系统组件渲染**的进程(launcher)与负责 **APP 渲染**的进程**相互独立**——APP 卡死/崩溃时,系统 UI(launcher)**不崩**,始终可息屏/返回/下拉通知中心(对应 APPS §3.4.1 物理键全局接管、APP 禁映射)。
|
||||
- **APP 侧职责**:只画自己的内容;经 IPC 上报**全屏声明**(`fullscreen`/`route.<id>.fullscreen`)、**内容区域**(inset)与**前台 activity**;系统 UI 据此做叠画 + 命中分流(§6.1 交互分层:③ 系统全局 → ② App 全局 → ① 当前 Activity 页面控件)。
|
||||
- **前台 activity / keep_awake(M2.17,`meow_ipc.h`)**:前台 App 经 IPC 向 launcher 上报当前顶层 activity
|
||||
(`MSG_ACT_FOCUS=0x0033` 上报顶层 / `MSG_ACT_BACK=0x0034` 回到根·清 keep_awake,号以 `meow_ipc.h` 为准);
|
||||
系统侧 `fg_keep_awake()` 依注册表判断该 activity 是否声明 keep_awake(`app.json` 的 `awake.<id>=1` 或
|
||||
`route.<id>.keep_awake=1`,运行时同类),决定是否**前台保活**(超时不自动息屏)。App 只上报 activity,不写保活判定
|
||||
(主界面无上报/空 = 非 keep_awake,照常超时息屏)。
|
||||
- **App 前台划出通知中心(跨进程,[源:2026-08-30],M2.82 已实现)**:全屏 App 前台时顶部下滑——**App 进程 SDK 只检测手势
|
||||
(`MEOW_EV_NOTIF_PULL`→`meow_ui_sys_notif_pull()`)并经 IPC 上报**(`MSG_NOTIF_OPEN=0x0028`/`MSG_NOTIF_CLOSE=0x0029`,号以 `meow_ipc.h` 为准),**不渲染系统 UI**;
|
||||
通知中心由 launcher 渲染(SIGSTOP App+读回其帧+叠加 `run_notif_center`+接管输入+关闭恢复,面板内 App 崩溃即关),
|
||||
@@ -1452,7 +1515,73 @@ void meow_scroll_set_friction(meow_scroll *s, int tau_ms); /* 默认 180ms
|
||||
|
||||
- **内存纪律**:静态池(应用侧按需建会话),track/fling/tick 全程零 malloc;无 fling 时 meow_scroll 不参与节拍(由 `meow_anim_tick` 活动计数保证零开销)。**不引 libm**(SDK 免 `-lm` 约定)。
|
||||
|
||||
### 12.4 对既有 App 的零影响(迁移说明)
|
||||
### 12.4 2 维虚拟化宫格(`meow_lazygrid`,M7.4 主界面前置)
|
||||
|
||||
> **性质**:给「卡片/图标宫格」提供**二维虚拟化**(`include/meow_lazygrid.h`,追加入 `meow_ui.h` 伞头)——
|
||||
> 应用入口宫格、图标墙、设置快捷卡等。只实例化**可见行**(视口内),行高/列几何(`cols`+`cell_w/h`+`gap`);
|
||||
> 滚动复用 §12.3 `meow_scroll`(fling/snap,与 listview 同款惯性);命中 `hit`/`tap_at` 把滚动+网格坐标映射回 `item idx`。
|
||||
> **非 `meow_widget`**:自包含控件(不注册 z 序/绘制注册表),由宿主(launcher session)在 draw 阶段调
|
||||
> `meow_lazygrid_draw`、命中阶段调 `hit`/`tap_at`、滚动喂 `meow_scroll`——与 `meow_scroll`/`meow_box` 同为**正交模块**,
|
||||
> 不侵入 `struct meow_widget`(**全追加式**)。
|
||||
|
||||
**数据源 / 渲染**:
|
||||
- 数据源:`count_fn()` 返回总项数(任意长),`bind_fn(index, item, ctx)` 仅当 item「进入视口」(绑定到固定池槽)时调一次;
|
||||
回滚命中同槽不重绑(同 listview 池语义);`count` 每帧实时查(支持动态长度/搜索过滤)。
|
||||
- 固定 item 池:池容量 = 视口行数 + 2(× cols),静态有界(≤`MEOW_LAZYGRID_POOL_MAX`=96)。
|
||||
- 渲染:默认 renderer 画「圆角卡片(icon+名+状态)」;App 也可经 `set_item_draw` 完全自绘
|
||||
(主界面卡片宫格用:icon+名+后台标注)。支持选中高亮/禁用变淡/空态占位。
|
||||
|
||||
**API(`include/meow_lazygrid.h`)**:
|
||||
```c
|
||||
typedef struct meow_lazygrid meow_lazygrid;
|
||||
typedef struct meow_lazygrid_item {
|
||||
const char *title, *subtitle; /* 主/副文本(subtitle 可空);title 必填 */
|
||||
const meow_img *icon; /* 格内图标(NULL=无) */
|
||||
int enabled; /* 1=可交互;0=变淡不响应 */
|
||||
void *user; /* App 私有(跨 bind 保存业务态;SDK 不碰) */
|
||||
} meow_lazygrid_item;
|
||||
typedef int (*meow_lazygrid_count_fn)(void *ctx);
|
||||
typedef void (*meow_lazygrid_bind_fn)(int index, meow_lazygrid_item *item, void *ctx);
|
||||
typedef void (*meow_lazygrid_draw_fn)(int index, int x, int y, int w, int h, int state, void *ctx);
|
||||
typedef void (*meow_lazygrid_tap_fn)(int idx, void *ctx);
|
||||
#define MEOW_LAZYGRID_POOL_MAX 96
|
||||
|
||||
/* 生命周期(冷路径 create/free;热路径 draw/hit/scroll 零 malloc) */
|
||||
meow_lazygrid *meow_lazygrid_create(int x, int y, int w, int h, int cols, int cell_w, int cell_h, int gap);
|
||||
void meow_lazygrid_free(meow_lazygrid *g);
|
||||
void meow_lazygrid_set_rect(meow_lazygrid *g, int x, int y, int w, int h); /* 视口矩形(绝对坐标) */
|
||||
void meow_lazygrid_set_cols(meow_lazygrid *g, int cols);
|
||||
void meow_lazygrid_set_cell(meow_lazygrid *g, int cell_w, int cell_h, int gap);
|
||||
|
||||
/* 数据源 + 渲染 */
|
||||
int meow_lazygrid_set_vsource(meow_lazygrid *g, meow_lazygrid_count_fn count,
|
||||
meow_lazygrid_bind_fn bind, void *ctx);
|
||||
int meow_lazygrid_set_item_draw(meow_lazygrid *g, meow_lazygrid_draw_fn draw, void *ctx); /* NULL=默认卡片 */
|
||||
int meow_lazygrid_set_empty_text(meow_lazygrid *g, const char *text);
|
||||
|
||||
/* 滚动(像素级;可视行数按 offset 实时推) */
|
||||
void meow_lazygrid_set_scroll(meow_lazygrid *g, int off);
|
||||
void meow_lazygrid_scroll_by(meow_lazygrid *g, int dy);
|
||||
int meow_lazygrid_scroll(meow_lazygrid *g);
|
||||
int meow_lazygrid_max_scroll(meow_lazygrid *g); /* max(0, 内容高 - 视口高) */
|
||||
int meow_lazygrid_row_h(const meow_lazygrid *g); /* 行高(=cell_h+gap) */
|
||||
meow_scroll *meow_lazygrid_scroll_attach(meow_lazygrid *g); /* 包一个 meow_scroll 会话;NULL=池满 */
|
||||
|
||||
/* 选中 / 命中 */
|
||||
void meow_lazygrid_set_on_tap(meow_lazygrid *g, meow_lazygrid_tap_fn cb, void *ctx);
|
||||
void meow_lazygrid_set_sel(meow_lazygrid *g, int idx); /* 越界 clamp;<0 清除;标脏 */
|
||||
int meow_lazygrid_sel(const meow_lazygrid *g);
|
||||
int meow_lazygrid_hit(meow_lazygrid *g, int x, int y); /* 命中项 idx(滚动+网格坐标映射);-1=未命中/禁用 */
|
||||
int meow_lazygrid_tap_at(meow_lazygrid *g, int x, int y);/* 命中:置选中+回调+返回 idx/-1 */
|
||||
|
||||
/* 绘制 */
|
||||
void meow_lazygrid_draw(meow_lazygrid *g, const meow_theme *th);
|
||||
```
|
||||
- **内存纪律**:静态有界 item 池(冷路径 create/set_vsource 分配,热路径 draw/hit/scroll **零 malloc**),与
|
||||
listview 池同源;不常驻 count 个 item 对象。
|
||||
- **M7 用途**:主界面(M7.4)应用入口/图标墙**虚拟化宫格**(并行+回退位)。
|
||||
|
||||
### 12.5 对既有 App 的零影响(迁移说明)
|
||||
|
||||
- **追加式**:三块全为新 API;既有 `meow_row/column/box`(§5.8.5)与全部 `meow_*_create/hit/scroll` 签名一行未改。
|
||||
- **旧绝对坐标永远有效**:box 只是把坐标算进 `meow_widget`(`meow_widget_set_rect`);不用 box 的 App 照旧 `on_layout`/绝对定位。
|
||||
@@ -1516,7 +1645,78 @@ locale 权威值 = 板载 `settings.conf` 的 `ui.locale`(默认 `zh_cn`)。
|
||||
|
||||
---
|
||||
|
||||
## 14. 遗留 / 待实现
|
||||
## 14. SDK 系统侧通道(网络自愿 / 磁盘缓存治理)
|
||||
|
||||
> **性质**:App 与系统治理模块(netmgrd / svc_perf)之间的**自愿自治**接口——不强制(防君子不防小人),
|
||||
> best-effort,失败静默不影响业务。`include/meow_ui_net.h` 与 `include/meow_cachegov.h` 均**追加入 `meow_ui.h` 伞头**。
|
||||
|
||||
### 14.1 网络自愿通道(`meow_ui_net`,netmgrd 期4)
|
||||
|
||||
> **性质**:框架 App 联网前的**自愿策略自查**通道 + **自愿字节上报**。权威方案
|
||||
> `devdocs/plan/NETMGR_DESIGN.md` §6.3/§4(内核无 per-socket/per-uid 字节计数器,§4 的「字节级精确记账走 SDK 自报通道」由此落地)。
|
||||
|
||||
**API(`include/meow_ui_net.h`)**:
|
||||
```c
|
||||
/* 检查 host 是否被策略放行。0=allow(可联网);1=block(策略拒绝,App 应中止本次联网)。
|
||||
* host 为域名(如流媒体客户端 API 主机名);判定以当前 App(MEOW_LOG_APP)为实体,服务端策略引擎权威执行。
|
||||
* netmgrd 不在 / 超时 → 返回 0(乐观放行,绝不因监控不可用而误封业务)。 */
|
||||
int meow_net_policy_check(const char *host);
|
||||
|
||||
/* 上报本进程累计收发字节(best-effort,失败静默)。netmgrd 记入 per-实体统计(status JSON `entity_bytes`)。 */
|
||||
void meow_net_report(uint32_t rx, uint32_t tx);
|
||||
```
|
||||
- **用法**:App 在发起 HTTP/TLS 前调 `meow_net_policy_check(host)`;返回 1 则按产品语义处理(如提示被限)。
|
||||
- **代价**:单查询/单上报,无常驻状态,失败静默不影响业务;热路径零 malloc。
|
||||
- **用途**:框架 App(阅读器/流媒体客户端/文件等)联网前自查 + 自愿上报流量(netmgrd 期4 收口)。
|
||||
|
||||
### 14.2 磁盘缓存治理(`meow_cachegov`,OOM page-cache 治理 A 侧)
|
||||
|
||||
> **性质**:磁盘缓存 **page-cache** 治理 SDK 库。归属(`devdocs/plan/ARCHITECTURE_PRINCIPLES.md` ③混合):
|
||||
> **A(DONTNEED 热路径,需要 read_pos)** 随 SDK 库(进程内直读 read_pos,无 IPC);**C(设备级
|
||||
> `/proc/meminfo` Cached 监控降载)** 归系统服务 `meow_svc_perf`,本模块只读其共享状态文件
|
||||
> (`MEOW_CACHEGOV_C_FILE`)作为「降载」信号;**App(如流媒体客户端)侧只调本库接口**:登记文件 + read_pos
|
||||
> 回调 + tick + drop_finished + 查询降载,不写自己的治理算法。权威方案 `devdocs/plan/OOM_PAGECACHE_GOVERNANCE.md`。
|
||||
|
||||
**分级(§2.2,红线 L2)**:
|
||||
- **L0(默认,安全)**:曲终/commit 后对整文件 `posix_fadvise(DONTNEED)`——播放器已退出解码循环。
|
||||
- **L1(可选,主杠杆)**:播放中丢已读前缀 `[0, read_pos-keep_hot)`,保 `keep_hot` 窗口供倒带;
|
||||
仅 `drop_mode>=1` 且 A 未回退到 ≥2 时执行。
|
||||
- **L2(禁止,红线)**:绝不丢 read_pos 前方/当前未解码页。
|
||||
- **underrun 回退(§2.3,SDK 内置)**:App 在 pread 慢(数据在盘上但 >threshold ms)处上报
|
||||
`meow_cachegov_note_refault()`;本库滚窗 10s,超门限逐级回退(放大 keep_hot → 降 L0 → 关 A)。
|
||||
|
||||
**API(`include/meow_cachegov.h`)**:
|
||||
```c
|
||||
typedef struct meow_cachegov_cfg {
|
||||
int enabled; /* 总开关:0=A 完全不丢页(register/tick/drop_finished 全部 no-op) */
|
||||
int cached_threshold_kb; /* 保留:C 侧阈值归 svc_perf(本库恒 0,只读不控,防误用) */
|
||||
int dirty_warn_kb; /* 保留:同上(svc_perf 用;本库只透传日志) */
|
||||
size_t keep_hot_bytes; /* L1 保留窗口:read_pos 之后保多少不丢(回退时自动放大) */
|
||||
size_t min_hot_ahead; /* L2 红线:read_pos 前方至少保多少——仅防御注释,绝不参与 drop */
|
||||
int drop_mode; /* 0=仅曲终(L0);1=曲终+播放中丢已读前缀(L0+L1,配 seek 回退) */
|
||||
int refault_backoff; /* 10s 窗口内 refault 触发回退的门限(次数) */
|
||||
} meow_cachegov_cfg_t;
|
||||
|
||||
int meow_cachegov_register(const char *path, uint64_t size,
|
||||
uint64_t (*read_pos_fn)(void *ctx), void *ctx); /* 登记缓存文件;重复 path 幂等 */
|
||||
int meow_cachegov_unregister(const char *path); /* 注销(曲终/切歌后清理);找到并删/不在册 */
|
||||
int meow_cachegov_tick(void); /* 周期调用:①按回退档丢已读前缀 ②评估 refault 滚窗回退 */
|
||||
int meow_cachegov_drop_finished(const char *path); /* 曲终/commit:整文件 L0 DONTNEED + 注销条目 */
|
||||
int meow_cachegov_download_paused(void); /* 1=应暂停(A 回退硬暂停 OR svc_perf C 降载) */
|
||||
int meow_cachegov_prefetch_paused(void);
|
||||
int meow_cachegov_set_cfg(const meow_cachegov_cfg_t *cfg);
|
||||
int meow_cachegov_get_cfg(meow_cachegov_cfg_t *cfg);
|
||||
void meow_cachegov_note_refault(void); /* pread 慢处上报一次 refault(线程安全) */
|
||||
int meow_cachegov_backoff_level(void); /* 0=正常 1=keep_hot 放大 2=降 L0 3=A 关 */
|
||||
```
|
||||
- **内存/代价**:自含(pthread + meow_log),热路径零 malloc;`set_cfg` 运行时覆盖编译期默认。
|
||||
- **红线**:`min_hot_ahead` 只是防御注释、**绝不参与 drop**;本库无论何档都不丢 `[read_pos, ...)` 任何未解码区。
|
||||
- **M7 用途**:流媒体客户端(dev.player.ncm)缓存文件治理(登记缓存 + read_pos + tick + 曲终 `drop_finished`);
|
||||
与 `meow_svc_perf` 的 C 侧降载协同,治 OOM 的 page-cache 驻留。
|
||||
|
||||
---
|
||||
|
||||
## 15. 遗留 / 待实现
|
||||
|
||||
1. `meow_ui` 渲染后端需从 launcher 里**抽公共绘制实现**(`back_buf`/`meow_dirty_*`/`meow_present`/`meow_font_bind` 目前是 launcher 静态函数——需提取为可链接的 `meow_ui_gfx` 或改为共享 obj,注意 launcher 与 app 是**不同进程**,不能共享同一 back_buf;`meow_ui.a` 是**独立库**,内部自建 fb 上下文,不复用 launcher 的全局 `g_dirty`)。
|
||||
2. 输入线程优先级:vs 主循环 10ms 热键轮询的竞态,需在 B1 实现时定义清楚(应用进程内独立事件循环,不与 launcher 抢)。
|
||||
|
||||
Reference in new issue
Block a user