From 2b17f69f24eba0ce645f9ae5c84169593cfbcb2c Mon Sep 17 00:00:00 2001 From: MeowOS Date: Sun, 30 Aug 2026 15:59:23 +0800 Subject: [PATCH] =?UTF-8?q?=E9=98=B6=E6=AE=B5B=20=E9=80=9A=E7=9F=A5?= =?UTF-8?q?=E4=B8=AD=E5=BF=83UI(agent-123)=20+=20=E8=BF=9B=E7=A8=8B?= =?UTF-8?q?=E6=A8=A1=E5=9E=8B/=E6=96=87=E6=A1=A3=E5=AE=8C=E6=95=B4(agent-1?= =?UTF-8?q?24)=20+=20=E5=AF=B9=E5=A4=96README(agent-125)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 通知中心=launcher侧系统级叠加层(§6.1③ 仅内部): meow_notif_panel.h(纯逻辑) + meow_launcherd.c(内联 draw/run_notif_center + run_menu顶部热区下滑接入) + test_notif_panel.c(56单测) - 通知中心零旁路走 meow_settings_*; 通知列表读 meow_notif; 左缘返回复用 meow_edge_back; 局部脏区; 系统级控件无公共API(App无法自建悬浮层) - meow_ui.a 零改动(d249c6e6); meow_launcherd=4652901a(0warn) - FRAMEWORK_DESIGN §10 进程模型/Supervisor树(svcd服务子进程化隔离防级联崩) ; MEOW_APP_SDK §6.1 系统UI归launcher+SDK/APP进程隔离; NOTIFICATION_SYSTEM §9 归属; SYSTEM_SETTINGS/SPEC_REF/DEVELOPMENT_PLAN 补齐 - README 重写为面向第三方(进度/架构/构建/部署/SDK开发; 固件打包标注本地工具不入库, 无敏感) - 遗留: SDK(App进程)侧通知中心/activity跳转 依赖 M3 导航栈(独立里程碑); 真机待验证 --- DEVELOPMENT_PLAN.md | 15 + FRAMEWORK_DESIGN.md | 57 ++ MEOW_APP_SDK.md | 10 +- NOTIFICATION_SYSTEM.md | 9 +- README.md | 346 ++++++++-- SYSTEM_SETTINGS.md | 2 +- docs/MEOWOS_SPEC_REF.md | 3 + patch_v2/meow_launcherd/meow_launcherd | Bin 394428 -> 478348 bytes patch_v2/meow_launcherd/meow_launcherd.c | 764 ++++++++++++++++++++- patch_v2/meow_launcherd/meow_notif_panel.h | 116 ++++ patch_v2/meow_launcherd/test_notif_panel.c | 236 +++++++ 11 files changed, 1498 insertions(+), 60 deletions(-) create mode 100644 patch_v2/meow_launcherd/meow_notif_panel.h create mode 100644 patch_v2/meow_launcherd/test_notif_panel.c diff --git a/DEVELOPMENT_PLAN.md b/DEVELOPMENT_PLAN.md index 0ee5456..0c42c4a 100644 --- a/DEVELOPMENT_PLAN.md +++ b/DEVELOPMENT_PLAN.md @@ -2,6 +2,21 @@ > 目标:把 R3 Pro II 打造成可扩展的"第二系统"。**MeowOS 作为主控层优先启动、拥有屏幕与输入;HibyOS 播放器降级为 MeowOS 启动的一个内置系统应用**(Android home/launcher 模型)。MeowLauncher(即 MeowOS 核心)、MeowAPPs、MeowPanel 均为其组成部分。 > 本文档是路线图与分阶段计划。当前技术档案见 `ANALYSIS.md`,应用规范见 `APPS.md`,框架协议见 `FRAMEWORK_DESIGN.md`。 +> **⚠️ 本文档为公开路线图,自身已过时**:里程碑/阶段划分以**实际进度为准**(权威现状见 `devdocs/WORK_STATE.md`,本仓库 gitignore 不入库)。截至 **M2.61(0.7.56)** 已达成;下方「当前主线」为实际推进序列,**按依赖因果排列,非平行**;旧「阶段拓扑序」仅作背景参考,勿按它安排开发。 + +--- + +## 当前主线(按依赖因果 [源:2026-08-30]) + +> 每项必须在其依赖落地后才推进(不在依赖未满足时抢先实现上层)。✅=已达成。 + +1. **阶段 B 通知中心 UI(进行中)** —— 依赖 M2 通知存储 + SDK 控件基座 + B2a 后端。顶部快捷按钮/亮度滑条走 `meow_settings_*` 零旁路;通知列表读 launcher `meow_notif`;手势(状态栏下拉开、上滑/点外关、左缘返回关)。 +2. **启动器 SDK 改造** —— 依赖上游 SDK 控件基座(阶段 B 沉淀的 MD3 基座)。状态栏收敛单一 SDK 全局(launcher 退役 `draw_statusbar`);主界面/设置页/电源菜单迁到 SDK 控件;MD3 化、日/夜主题、全局 UI 统一。(见 FRAMEWORK_DESIGN §10.4) +3. **系统基建线:meow_svcd 隔离 + meow_sysui 总监** —— 服务全部子进程化(fork+exec+setpgid)+ svcd 崩溃隔离;新增 meow_sysui 系统进程总监统一监管 launcher/svcd/mdns/媒体服务/MeowPanel(见 FRAMEWORK_DESIGN §10.1)。**与 1/2 串行**(共享 launcher/SDK 文件,避免并发改同批文件)。 +4. **M3 导航栈 + M5 通知整合 + 媒体会话** —— M3 依赖阶段 0 让位退役;M5 依赖 M2 存储 + B 的 UI + M3;媒体会话(MPRIS)依赖 M3+M4+阶段 0。 +5. **SDK 缺失件**:`meow_config_*`(app 配置读写)/ `meow_media_*`(媒体会话)/ 崩溃捕获·看门狗。 +6. **蓝牙/WiFi 子页 + MeowPanel** —— 均消费 B2a 后端 / 通知后端。 +7. **文档一致性收尾 + 推 main**(审后)。 --- diff --git a/FRAMEWORK_DESIGN.md b/FRAMEWORK_DESIGN.md index e8a6d1d..1ec4cf5 100644 --- a/FRAMEWORK_DESIGN.md +++ b/FRAMEWORK_DESIGN.md @@ -111,6 +111,63 @@ M0 IPC 骨架(含 meow_ipc 测试钩子)→ M1 路由表+解析 → M2 通 --- +## 10. 进程模型 / Supervisor 树 [源:2026-08-30 定案] + +> 定位:本文档 §1-§9 聚焦「MeowAPP ↔ 启动器」的 Activity/通知 IPC;本节补齐**系统层面进程架构**——各系统进程的职责边界、监管关系与故障隔离,落实「一个崩不全部崩」。与 §5 后台服务保活**互补**:§5 管 MeowAPP 注册的**后台服务**,本节管 **MeowOS 自身系统进程**。跨文档:MEOW_APP_SDK §6.1、NOTIFICATION_SYSTEM §9、docs/MEOWOS_SPEC_REF §3.1/§5.1。 + +### 10.1 进程角色与 Supervisor 树 + +| 进程 | 职责 | 监管关系 | 崩溃隔离(核心诉求) | +|---|---|---|---| +| **meow_sysui**(新增,meow_svcd 托管) | **系统进程总监**:监管所有系统进程,监控存活 + 逐个拉起 | 监管 launcher / meow_svcd / meow_mdns / 未来媒体服务 / MeowPanel | 自身**最小依赖、不渲染、不承载重逻辑** → 最稳;**一个进程崩→只拉起它,绝不级联、绝不拖垮自身** | +| **meow_launcherd** | **系统 UI 渲染宿主**:SDK 全局状态栏、通知中心(下拉)、电源菜单、全局左缘返回/滑条;另含启动器主界面、设置页 | 被 sysui 监管;与 APP 进程独立 | 与 APP 渲染进程独立(见 §10.2) | +| **meow_svcd** | **服务管理器**:每个服务 = 独立子进程(fork+exec+setpgid) | 被 sysui 监管;其服务子进程由 svcd 托管 | 服务崩→svcd 捕获(waitpid)+只重启该子进程;**svcd 自身绝不因服务崩而崩**(信号/超时/僵死隔离) | +| **APP 进程** | 只渲染自己内容(经 SDK 语义事件) | 框架(IPC/launch)管理 | 崩→不连累 launcher / sysui / svcd | + +**Supervisor 树(目标架构):** + +``` +meow_sysui(系统进程总监,meow_svcd 托管;最小依赖/不渲染/最稳) + ├─ meow_launcherd 系统 UI 渲染宿主(主界面/设置页/电源菜单/全局状态栏/通知中心/全局手势) + ├─ meow_svcd 服务管理器(服务=独立子进程;逐个子进程崩溃隔离) + │ ├─ meow_mdns mDNS 应答器(板载 /usr/data/meow/services.d/mdnsd.conf,trigger=boot) + │ └─ 未来媒体服务 / 其它 services.d 服务(TF MeowOS/services.d/…) + ├─ 未来媒体服务 / MeowPanel(后置) +``` + +> **托管关系澄清**:定案中的「meow_sysui(新增,meow_svcd 托管)」指 sysui 由**开机启动链**拉起(现网 S89 init.d/S90 bootmenu 归属,后续归 sysui 自身),并居于 svcd **之上**为总监——**不是** svcd 的子进程。监管方向固定:**sysui 总监 → svcd 被监管 → 服务为 svcd 子进程**。即便将来引导顺序先起 svcd 再起 sysui,此方向不变。 + +**监管语义(权威)**: +- **一个崩、只拉起它**:任一被监管进程崩溃(非零退出/被信号杀)→ 所属 supervisor **只重启该进程**,不级联重启、不影响相邻进程、不拖垮 supervisor 自身。 +- **svcd 崩 → sysui 拉起**;launcher 崩 → sysui 拉起;mdns 崩 → svcd 拉起(或 sysui 兜底)。 +- **「一个崩不全部崩」= 每进程独立 + 总监逐个拉起 + 单项故障不扩散**;「服务崩溃不导致 meow_svcd 崩溃」= **服务全部子进程化**(fork+exec+setpgid,svcd 只 waitpid 感知,绝不 dlopen/共享内存接服务)。 + +**现网 vs 定案(迁移说明,避免矛盾)**: +- 现网:launcher 由 bootmenu `execv` 起动(S90meow_bootmenu);svcd 由固件 `etc/init.d/S89meow_svcd` 自启(`-f` 前台)。二者**当前互不监管**。 +- 定案:改为 **meow_sysui 统一监管** launcher/svcd/mdns/媒体服务/MeowPanel。属**系统基建线**(渐进迁移,非一次性推翻现网 S89/S90)。在此落地前,现网的「bootmenu+init.d 各自拉起」仍有效,但**不得**新增依赖打破「进程独立 + 崩溃隔离」约束。 + +### 10.2 系统 UI 归属与进程隔离 [源:2026-08-30] + +- **系统组件渲染归系统进程(launcher)**:状态栏 / 通知中心(下拉)/ 电源菜单 / 全局左缘返回与滑条等**全局叠加层**,一律由系统进程(meow_launcherd)负责渲染;**APP 进程不渲染系统 UI**(跨引用 MEOW_APP_SDK §6.1 ③「系统级控件仅系统内部」)。 +- **SDK 提供系统组件 API 仅供系统进程链接调用**:SDK 内保留系统级控件的内部接口位(§6.1 ③);**用户 App 拿不到**、**不可自建悬浮层/全局叠加**(会引入遮挡、冲突、性能与安全风险)。App 这类需求只能走 SDK 标准能力。 +- **进程隔离**:SDK 负责**系统组件渲染**的进程(launcher)与负责 **APP 渲染**的进程**相互独立**——APP 卡死/崩溃时,系统 UI(launcher)**不崩**,始终可息屏/返回/下拉通知中心(对应「物理键全局接管,APP 禁映射」APPS §3.4.1)。 +- **APP 侧职责**:只画自己的内容;经 IPC 上报**全屏声明**(`fullscreen`/`route..fullscreen`)、**内容区域**(inset)与**前台 activity**;系统 UI 据此做叠画(复用 fb 双缓冲 `fb_backup/restore/pan`)与 hits 命中分流(MEOW_APP_SDK §6.1 交互分层:③ 系统全局 → ② App 全局 → ① 当前 Activity 页面控件)。 + +### 10.3 通知中心归属 [源:2026-08-30] + +- **通知中心 UI 渲染主体 = 系统进程(launcher),非 APP**(跨引用 NOTIFICATION_SYSTEM §9)。 +- **数据**:通知列表经 IPC 从通知存储/通知服务读(`MSG_NOTIFY_LIST` 重同步等),launcher 只做 UI 呈现与手势。 +- **交互**:状态栏下滑展开、上滑/点面板外关、左缘返回关(与全局左缘返回/顶部滑条按起始位置分流,见 docs/MEOWOS_SPEC_REF §5.1)。 +- **协议/约束**:遵守 freedesktop 字段、配额(每 App 4 类型×每类型 4、媒体单例)、TTL、转储(10s+10MB ring)、urgency/icon/progress(见 NOTIFICATION_SYSTEM §5-§8)。 + +### 10.4 启动器 SDK 改造 [源:2026-08-30] + +- **状态栏收敛为单一 SDK 全局**:launcher 现状私有 `draw_statusbar()` **退役移除**,统一走 SDK 全局状态栏(`meow_ui.h` §3.1;28px,默认显示,APP 声明全屏/`fullscreen` 才隐藏/收合)。 +- **launcher 主界面 / 设置页 / 电源菜单全部迁到 SDK 控件**:逻辑/渲染走 SDK(MEOW_APP_SDK §6.1 ② App 跨 Activity 控件、§5.4 A① 分组设置表单、§5.7 B④ 面板等模板),MD3 化、日/夜主题(`display.theme_mode`)、全局 UI 统一。 +- **不让 app 自建叠加**:app 一律经 SDK 标准能力;系统级叠加(状态栏/通知中心/电源菜单/全局手势)只在系统进程内实现。迁移后 launcher 与 APP 用同一套 SDK 渲染地基,观感/生命周期统一。 + +--- + ## 附录 A(用户追加):后台运行 / 后台播放权限 **需求**:允许应用声明后台运行、后台播放等能力,避免播放类应用切到后台被直接终止。hiby 播放器作为系统应用单独适配。 diff --git a/MEOW_APP_SDK.md b/MEOW_APP_SDK.md index e6e0cfb..2b28101 100644 --- a/MEOW_APP_SDK.md +++ b/MEOW_APP_SDK.md @@ -543,7 +543,15 @@ void meow_ui_global_remove(int id); - **对象复用(非销毁)**:§6.1 的「Activity 内对象池复用」本轮**从简落地**——控件对象不随 pop 销毁,SDK 不维护独立对象池;App 自行持有控件指针(hello 用静态全局),弹栈回来自动恢复命中(零重建)。注册表按**指针去重**(`live_btn_register` 查重),故反复 push/pop 不重复注册、不泄漏。 - **② 为可用骨架**:SDK 维护全局控件列表(`meow_ui_global.c`),渲染帧 `meow_ui_global_render()` 在 active activity 内容之上、全局状态栏之下调用 render_cb;触摸 TAP 先 `meow_ui_global_hit()`(返回 1=消费),否则落 `on_tap`。无 z 序细分/无按压态管理/无命中区排布(待 B2 细化);同 id `global_add` 幂等。 - **③ 系统级(状态栏/通知中心/返回滑条/电源菜单)**:未开放任何公共悬浮/叠加层 API,既有状态栏/返回滑条逻辑原样保留。 -``` + +#### 系统 UI 归属与进程隔离(源:2026-08-30 定案,跨引用 FRAMEWORK_DESIGN §10.2) + +> 把「系统组件归谁渲染」在 SDK 规范层面钉死,明确 **APP 进程不渲染系统 UI**、**SDK 负责系统组件的进程与负责 APP 的进程相互独立**。 + +- **系统组件渲染归系统进程(launcher)**:状态栏 / 通知中心(下拉)/ 电源菜单 / 全局左缘返回与滑条等**全局叠加层**,由系统进程(meow_launcherd)负责;**APP 进程不渲染系统 UI**。 +- **SDK 提供系统组件 API 仅供系统进程链接调用**:SDK 保留系统级控件内部接口位(上面 ③);**用户 App 拿不到**、**不可自建悬浮层/全局叠加**——App 这类需求只能走 SDK 标准能力。 +- **进程隔离(核心)**:SDK 负责**系统组件渲染**的进程(launcher)与负责 **APP 渲染**的进程**相互独立**——APP 卡死/崩溃时,系统 UI(launcher)**不崩**,始终可息屏/返回/下拉通知中心(对应 APPS §3.4.1 物理键全局接管、APP 禁映射)。 +- **APP 侧职责**:只画自己的内容;经 IPC 上报**全屏声明**(`fullscreen`/`route..fullscreen`)、**内容区域**(inset)与**前台 activity**;系统 UI 据此做叠画 + 命中分流(§6.1 交互分层:③ 系统全局 → ② App 全局 → ① 当前 Activity 页面控件)。 --- diff --git a/NOTIFICATION_SYSTEM.md b/NOTIFICATION_SYSTEM.md index c0a26b9..1080b84 100644 --- a/NOTIFICATION_SYSTEM.md +++ b/NOTIFICATION_SYSTEM.md @@ -66,8 +66,13 @@ target_activity(可选, 来自 hints) / progress(可选 int) / urgency(0-3, 缺 - **启动时清板载 + 清内存通知表**:开机(含异常关机后)清理板载残留通知数据,并**清空内存通知表**(在既有「异常关机:开机时清理板载残留」基础上**补充内存表一并清**);正常关机/重启前先转储未上卡通知再清板载(沿用既有规则)`[源:用户 2026-08-30]`。 - **无 TF 卡**:系统可运行(内存态通知即可),不依赖卡。 -## 9. 通知中心 UI(阶段 B) -- 状态栏下滑打开通知中心(用户已定),列表显示通知(app 图标 + summary + body + target Activity),点击按路由表解析跳转(M3 导航栈),下拉关闭/清除。**此部分依赖 M2 存储 + M3,后置。** +## 9. 通知中心 UI(阶段 B)—— 归属定案 [源:2026-08-30] + +- **渲染主体 = 系统进程(meow_launcherd),非 APP**:通知中心 UI 由系统进程负责渲染(复用 SDK 控件/状态栏基底);**APP 进程不渲染通知中心**(系统级控件仅内部,见 MEOW_APP_SDK §6.1 ③、FRAMEWORK_DESIGN §10.2)。 +- **数据来源**:通知列表经 IPC 从通知存储/通知服务读(如 `MSG_NOTIFY_LIST` 重同步、`target_activity`/`progress`/`icon` 等字段),launcher 只做 UI 呈现与手势,不各画各的。 +- **交互**:**状态栏下滑展开**(用户已定);**上滑 / 点面板外关**;**左缘返回关**(与全局左缘返回/顶部滑条按起始位置分流,见 spec-ref §5.1)。列表显示通知(app 图标 + summary + body + target Activity),点击按路由表解析跳转(M3 导航栈),下拉关闭/清除。 +- **协议/约束**:遵守 freedesktop 字段(summary/body/app_icon/actions/hints/expire_timeout/replaces_id)、配额(每 App 4 类型×每类型 4、媒体单例)、TTL、转储(10s + `MeowOS/notifications/` 10MB ring)、`urgency`/`icon`/`progress`(见 §5-§8)。 +- **依赖**:M2 存储 + M3 导航栈(点击跳转)+ SDK 控件基座。**阶段 B 进行中。**(叠加/与播放器帧备份的互斥边界见 DEV_NOTES #16。) ## 10. 分步实施建议 1. **M2a 通知存储 + 原生 IPC**:按上面的配额(category 级)+ TTL 10s 转储钩子 + 系统事件源(系统作 App)。→ 可先落地。 diff --git a/README.md b/README.md index d3c4206..26246a7 100644 --- a/README.md +++ b/README.md @@ -1,67 +1,303 @@ # MeowOS for HiBy R3 Pro II -把 R3 Pro II(君正 X1600E,HiBy OS / Linux 4.4)打造成可扩展的"第二系统":MeowOS 作为主控层,双系统互斥(引导选单),HibyOS 播放器由 MeowOS 托管,MeowAPPs / MeowPanel / Activity 框架持续扩展。 +> 把 HiBy R3 Pro II 便携播放器(君正 X1600,MIPS32r2 / mipsel / musl 静态软浮点,480×720,无 GPU 软渲染)变成一个可扩展的「第二系统 + 应用框架」。 +> MeowOS 与官方 HibyOS 共存于同一台设备:开机由引导选单二选一;启动后 MeowOS 作为主控层,提供自己的桌面 UI、应用框架、服务管理与系统组件。 +> +> 许可证:Apache-2.0(见 [`LICENSE`](LICENSE))。本仓库为非官方第三方项目。 -## 核心文档(先读这些) +--- -> **总索引(单一来源)**:`docs/MEOWOS_SPEC_REF.md` —— 各路径/接口/功能/约定的权威速查,含「已知矛盾/待确认」清单。 +## 1. 项目简介 + +**MeowOS 是什么**:一个运行在 HiBy R3 Pro II 上的自制系统与运行时,它提供: + +- **双系统共存**:官方 HibyOS 原样保留;开机引导选单决定本次进入哪个系统(MeowOS / HibyOS),两者互斥运行,任一时刻只跑一个。 +- **应用框架**:一套 C 应用 SDK(`meow_ui`),第三方 App 用统一控件 / 输入 / 主题 / 字体 / 通知 API 开发,无需自读帧缓冲、自读输入、自管返回——把每个 App 都要踩一遍的坑收口到框架里。 +- **系统组件**:状态栏、通知中心、电源菜单、全局左缘返回手势、主界面(应用列表)、设置页、服务管理器、mDNS 广播。 +- **进程隔离**:系统 UI 渲染进程与 App 进程相互独立,App 卡死不会冻结整个 UI。 + +**面向谁**: + +- **R3 Pro II 玩家**:刷入后获得可切换的「第二系统」,与官方系统互切使用。 +- **开发者**:用 `meow_ui` SDK 编写 MeowAPP,部署到 TF 卡即可热更新,无需重刷固件;也可参与固件 / 框架源码的开发。 + +**硬件基线(贯穿全文)** + +- SoC 君正 X1600;CPU MIPS32r2(little-endian,`mipsel`);libc musl(**静态**链接,soft-float)。 +- 屏幕 **480×720**、24-bit RGB(内部转 RGB565);**无 GPU**,全部 CPU 软渲染。 +- 帧缓冲 `fb0` 为**双缓冲**(虚拟高 1440 = 2×720,显示帧由 `yoffset` 决定,需 `FBIOPAN_DISPLAY` 翻页)。 +- 板载存储紧张(`/data` 约 16MB):所有大件(日志/字库/媒体/应用)一律写 TF 卡,板载只存 KB 级设置。 + +--- + +## 2. 核心架构 + +### 2.1 进程模型(Supervisor 树)——「一个崩不连累全部」 + +每个系统组件都是一个独立的静态进程(固件 `/usr/bin`,只读 squashfs): + +``` +init (rcS) + ├─ /etc/init.d/S89meow_svcd 开机自启 meow_svcd(服务管理器) + ├─ /etc/init.d/S90meow_bootmenu Supervisor / 开机引导选单 + │ ├─(选 MeowOS)拉起 meow_launcherd ← 系统 UI 渲染宿主 + │ │ └─ 用户点 App → fork/exec MeowAPP + meow_watchdog(每 App 一个) + │ └─(选 HiByOS)exec hiby_player + └─ meow_svcd 托管的服务(如 meow_mdns)= 独立子进程 +``` + +- **当前 supervisor = `meow_bootmenu`**:开机引导选单(决定进入哪个系统),并接管关机 / 升级;系统组件由它 / init 逐个拉起。 +- **目标架构(设计定案,见 `docs/MEOWOS_SPEC_REF.md` §4,属「系统基建线」)**:新增统一的 `meow_sysui` 系统进程总监,监管 launcher / svcd / mdns / 媒体服务 / MeowPanel——一个进程崩只拉起它,绝不级联、绝不拖垮自身。这是定案与渐进迁移方向,**当前固件仍以 `meow_bootmenu` 为 supervisor**。 +- **隔离保证(现已落地)**:系统组件各自独立进程;App 进程与系统 UI 渲染进程独立;svcd 的**每个服务是独立子进程**(服务崩只重启该服务,不拖垮 svcd)。任何 App / 服务崩溃都不冻结系统 UI。 + +### 2.2 双系统引导(bootmenu) + +- `meow_bootmenu`(`/usr/bin/meow_bootmenu`,只读 squashfs)开机绘制轻量选单(fb 绘制 + 触摸/按键),选中后 `exec` 对应系统。 +- **boot.default 权威文件 = 板载 `/data/meow_boot_default`**(单值、O_TRUNC、不累积):`0 = MeowOS`、`1 = HiByOS`。bootmenu 读它决定默认高亮项;`boot.default` 设置变更同步写该文件;`meow.conf` 不再承担 boot_default。 +- **双系统互斥**:任一时刻只跑一个。HibyOS 播放器需**开机连续内存**(`sa_hgl_dma` 1.32MB DMA)才能启动,不能"杀+重拉"。因此: + - **HibyOS → MeowOS**:用热键切换(杀播放器即可,MeowOS 界面不需要 HGL,接管无缝)。 + - **MeowOS → HibyOS**:只能**重启回到选单**(播放器需开机连续内存再次启动)。 + +### 2.3 launcher —— 系统 UI 渲染宿主 + +`/usr/bin/meow_launcherd`(源码 `patch_v2/meow_launcherd/`)是 MeowOS 的核心进程,负责渲染**系统级 UI**: + +- 状态栏(28px:时钟 / 电量 / WiFi / 蓝牙 / 音量); +- 通知中心(顶部下滑打开); +- 电源菜单、全局左缘返回手势、全屏提示线; +- 主界面(应用列表)、设置页。 + +**渲染与 App 进程隔离**:launcher 是系统进程,App 是独立进程。App 卡死/崩溃只影响该 App,系统 UI(状态栏/返回/通知中心)始终可用。 + +> ⚠️ `meow_launcherd` 本身就是系统进程,**不要远程 kill 它**——否则会整机重启。 + +### 2.4 SDK(meow_ui)—— App 开发框架 + +`patch_v2/sdk/` 构建出 **`meow_ui.a`**(mipsel 静态库,内含 `meow_font.o` + `stb_image` 图片解码)。App 只链它 + `libz.a` + `-lpthread`,用 API 写业务,不重复造轮子。 + +- App **不** `open /dev/fb0`、不 mmap、不 ioctl、不 `open /dev/input/event*`;屏幕/输入由 SDK 在 App 启动时建立、退出时释放。 +- 渲染统一走 `back_buf`(RGB565)+ `meow_present(dirty)`:App 画到离屏缓冲区,`meow_ui_flush()` 时才单次原子 blit 到 fb0(等垂直同步 + 脏区,无撕裂、无频闪、不整屏重绘)。 +- 分层:绘制层 / 控件层 / 图片层(stb_image 解 PNG/JPEG/BMP)/ 输入层(语义事件)/ 主题 / 字体。 + +**三层控件模型(Activity 栈 + 控件归属)**——控件严格归属创建它的 Activity,不跨页面共享(根治「跨页残留」:旧按钮已不可见但仍被触摸命中): + +| 层 | 谁负责 | 谁能用 | 生命周期 | +|---|---|---|---| +| **① 页面控件** | 归属唯一 owner Activity | App | 随 Activity 栈;owner 在栈顶(active)才绘制 + 响应触摸 | +| **② App 跨 Activity 控件** | **SDK 托管**(逻辑 + 渲染) | App 可声明使用 | 钉在 App 的 Activity 栈**之上**,跨 Activity 常驻 | +| **③ 系统级控件** | MeowOS / SDK 框架内部 | **仅系统组件,用户 App 禁调用** | 随系统,不开放 | + +- **交互命中分流**:③ 系统全局 → ② App 全局 → ① 当前 Activity 页面控件;某层命中即消费,否则落到下一层。 +- **系统 UI 归属与进程隔离(核心)**:状态栏 / 通知中心 / 电源菜单 / 全局返回滑条等**系统级组件由系统进程(launcher)渲染,App 进程不渲染系统 UI**;SDK 系统组件 API **仅供系统进程链接调用**,App 拿不到、不可自建悬浮层 / 全局叠加。 +- 控件 API:`meow_ui_activity_push/pop`(Activity 栈)、`meow_btn/slider/switch/list_create`、`meow_ui_global_add/remove`(② 层)。对象不随 pop 销毁(复用),弹栈回来自动恢复命中。 + +### 2.5 服务 + +- **meow_svcd(服务管理器)**:类 systemd/systemctl,`/usr/bin/meow_svcd`,`etc/init.d/S89meow_svcd` 开机自启。**每个服务 = svcd 的独立子进程**(fork+execv),服务崩只重启它,不拖垮 svcd。 + - **双源 services.d**:板载 `/usr/data/meow/services.d/.conf`(Data 区,拔卡保留,权威优先)+ TF `MeowOS/services.d/.conf`(随卡存在/消失)。同名**板载优先**(TF 被屏蔽 + WARN)。 + - 目录式 `key=value`:`exec`(必填)/`args`/`env`/`enabled`/`restart`/`backoff_ms`/`max_restart`/`trigger`(`boot`/`card-mount`/`wifi-up`,默认 `card-mount`)。 + - 状态机 `DISABLED/STOPPED/RUNNING/STOPPING/FAILED`;CLI(SSH 直呼):`status` / `reload` / `start|stop|restart ` / `pid`。 +- **meow_mdns(mDNS 应答器,自研)**:`/usr/bin/meow_mdns`,**IPv4-only**(该设备内核无 IPv6,完整 mDNSResponder/SAResponder 均无法运行),应答 `.local` 的 A 记录与 `_ssh._tcp` 的 PTR/SRV/TXT。由 `meow_svcd` 托管(板载 `services.d/mdnsd.conf`,`trigger=boot`)。 + - **hostname = `meowos`**(设置键 `system.hostname`,缺省 `meowos`;`S89meow_svcd` 开机 `sethostname`)→ 即 `meowos.local`。 + - 注:手机热点会丢弃设备→主机的组播应答,`avahi-resolve meowos.local` 在上网热点下会超时(网络层热点隔离,非应答器缺陷),主机可用 DNS 兜底。 + +### 2.6 通知系统 + +后端 = 通知存储 + 分发,遵循 **freedesktop.org Desktop Notifications**(`org.freedesktop.Notifications`)标准字段:`app_name` / `replaces_id` / `app_icon` / `summary` / `body` / `actions[]` / `hints{}` / `expire_timeout`,返回通知 id。MeowOS 扩展:`hints` 内 `meow.target_activity`(点击跳转)与 `meow.progress`(进度)。 + +- **来源**:MeowAPP(原生 IPC `MSG_NOTIFY`)+ 系统事件(抽象为 `app_id=system`,走同一配额)+ 外部桌面 App(D-Bus 桥 `meow_notify_dbus`,规划)。 +- **配额**:每 App 最多 **4 个**通知类型(category);每类型活跃 **≤4**;媒体通知单例(每 App 仅 1 条,可多 App)。系统事件同配额。 +- **TTL / 转储**:通知创建 **10s** 后追加写入 TF `MeowOS/notifications/`(CSV 行,滚动保留**最新 10MB**,不被电源事件清);正常关机先转储再清板载;开机清板载残留 + 清内存表;**无 TF 卡可运行**(仅内存态)。`urgency`(0-3)、`icon`、`progress`(实时进度仅改内存活跃槽,里程碑落盘,不每帧写卡)。 +- 通知数据模型补全(SDK→IPC→存储→dump 全链路):`meow_notify_send` 返回 id、`meow_notify_update_progress`、`urgency`/`icon` 字段。通知中心 UI 由系统进程(launcher)渲染,数据经 IPC 从存储读取(该部分/阶段 B/D,部分为规划)。 + +### 2.7 字体系统 + +- 多字体库在 TF 卡 **`MeowOS/fonts///`**(每套三件套:`font.png` + `font.idx` + `font.json`),由 `font/gen/gen_font.py` 生成(`--weight` 写字重、`--charset` 档位)。 +- 字体列表索引 **`MeowOS/config/fonts/index`**:launcher 扫描后落盘(`family,weight,path,label,tier,glyph_count` CSV);SDK 读该文件枚举字库,**不自行发现**。 +- `font.file` 设置键选默认套(缺省 `MeowOS/fonts/default/regular/font.png`);`font.json` 标 `weight` / `charset`(`common`≈4k / `gbk`≈20k+ / `full`)/ `glyph_count`;缺失件 → 该套跳过 + 日志。 +- 字库档位:默认用小字库(`common`≈4k);App 声明需大字库(`app.json "fonts":"full"`)才加载大字库;`font.load_full` 强制全系统大字库。 +- 多字体(`display.multi_font`):按字符类别(CJK/LATIN/NUM/…)逐字符路由,可各选一套。 +- **App 未自带字库 → 跟随系统 `font.file`**:launcher 启动 App 前把当前生效字体注入为 env `MEOW_FONT_PNG`/`MEOW_FONT_IDX`(绝对路径),SDK 优先读 env;无 env 回退卡默认 → 固件内置。SDK `meow_font_has_glyph(cp)` 预判当前字库是否含某码位(缺字回退/提示)。 +- 应用自带字库(`MeowAPPs//fonts//`,多句柄 `_h` API)为**草案/未实现**;当前 App 只能跟随系统字体。 + +### 2.8 设置后端 + +`meow_settings_*`(C API:`get/set` int/str/enum/bool + listener 变更通知)读写**板载 `/usr/data/meow/settings.conf`**(UBIFS,几十行、<10KB),跨换卡/掉卡保留配置。板载只存 KB 级设置;日志/字库/媒体等大件一律 TF 卡(无卡优雅降级)。 + +贯穿子系统的键(详见 `SYSTEM_SETTINGS.md` / `docs/MEOWOS_SPEC_REF.md`):开机 `boot.default`、刷新率 `display.refresh_rate`(60/30/15)、亮度 `display.brightness`(clamp ≥ `display.brightness_min`,下限 **1**)、息屏 `display.screen_off_timeout`(默认 30s)、主题 `display.theme_mode`、主机名 `system.hostname`(=meowos)、字体 `font.file`/`display.multi_font`/`font.load_full`、通知配额 `notify.*` 等。 + +--- + +## 3. 目录结构 + +> 标注「入库」= 本仓库已提交;未标注的为**本地构建 / 开发资产**(gitignore 不入库,需本地生成)。 + +- **`patch_v2/`(入库)**—— MeowOS 核心源码: + - `bootmenu/` 引导选单 + Supervisor(`meow_bootmenu`) + - `meow_launcherd/` launcher(系统 UI 宿主)、`meow_ipc`、`meow_settings`、`meow_font`、`meow_notif`、`meow_card_path.sh` + - `sdk/` meow_ui SDK 源码 + `build_sdk.sh`(→ `meow_ui.a`) + - `hello_app/` 示例 App(`hello.c` + `build_hello.sh`) + - `meow_svcd/` 服务管理器;`meow_watchdog/` 应用看门狗;`meowpkg/` 包管理;`uinput_tap/` +- **`mips-repo/`(入库)**—— mipsel 交叉编译软件仓库:`bins/`(`meow_mdns` / `mdnsd` 等二进制工具 + `build.sh` + `manifest.md`)、`mpk/`(`.mpk` 应用包)。 +- **`docs/`(入库)**—— `MEOWOS_SPEC_REF.md` 权威速查总索引。 +- **`font/`(入库)**—— 字形系统:`gen/gen_font.py` 生成器、`meow_font.c/.h` 渲染库、`demo/`、`src/`(字体源文件)。 +- **`bootlogos/`(入库)**—— 启动 / 关机 logo。 +- **`LICENSE`** —— Apache-2.0。 +- **顶层文档(入库)**—— `APPS.md`、`MEOW_APP_SDK.md`、`FRAMEWORK_DESIGN.md`、`SYSTEM_SETTINGS.md`、`NOTIFICATION_SYSTEM.md`、`TF_CARD_LAYOUT.md`、`DEVELOPMENT_PLAN.md`、`GESTURE_BACK_DESIGN.md`、`KEY_CONTROL_DESIGN.md`、`PERF_SCHEDULER.md`、`MEOWOS_API.md`。 +- **本地构建资产(gitignore,不入库)**—— `scripts/build/`(固件打包脚本)、`fw_apps/`(固件组装产物)、官方固件基线 rootfs、交叉工具链、本地开发文档、设备密钥等。详见「构建」与「部署」。 + +--- + +## 4. 构建 + +整条构建是 **mipsel-linux-muslsf 静态交叉编译**链,需要本地交叉工具链(`zig-mipsel-cc`,目标 `mips-linux-musl`)+ `mipsel-linux-muslsf` sysroot(这类工具链为本地大件,gitignore 不入库)。 + +**1. 构建 SDK**(入库脚本) +```sh +patch_v2/sdk/build_sdk.sh # → patch_v2/sdk/meow_ui.a +``` +> 注:SDK 编译期引用 launcher 的 `meow_ipc.h` 共享协议头(`meow_notify_ipc.c` 复用同一份,杜绝两端漂移),属**已知设计**;运行时 App 只链 `meow_ui.a`(含 `meow_font.o`),不会链入 launcher 符号。SDK 库**不进固件**,只随 App 链接。 + +**2. 构建示例 App**(入库脚本) +```sh +patch_v2/hello_app/build_hello.sh # 链 meow_ui.a + libz.a + -lpthread → hello(静态 MIPS32r2) +``` +产物放 TF 卡 `MeowAPPs/os.meow.hello/`(见「部署」)。 + +**3. 构建固件(本地流程)** + +固件 = 官方 v1.4 固件基线 rootfs + SSH 工具集 + MeowOS 系统组件(`meow_bootmenu` / `meow_launcherd` / `meow_watchdog` / `meow_svcd` / `meow_mdns` + 相关 init 脚本 + `/etc/meowos_version`)。特点: + +- 打包脚本 `scripts/build/build_fw_apps_m2NN.sh` 是**本地构建工具(gitignore 不入库)**——本仓库只提交源码与文档,需本地交叉工具链 + 官方固件基线 rootfs 才能复现。 +- **rootfs 上限 45,088,768 B(≈45MB)**;产物 `fw_apps/r3proii_m2NN.upt`。 +- `/usr/bin` 各组件为静态 MIPS32r2;版本号以 `/etc/meowos_version` 为单点。 +- 外围 CLI(curl/socat/tmux/jq/…)已迁 TF 卡 `MeowOS/opt/bin/`(不进固件);固件**不含** SDK 库(`meow_ui.a` 只随 App 链接),`hiby_player` 保持官方原样。 + +> 第三方开发者通常**不需要**重打包固件:用 `build_hello.sh` 类似方式构建 SDK App 后直接部署到 TF 卡即可热更新(见「部署」)。 + +--- + +## 5. 部署 / 刷机 + +**刷机(整机刷新 MeowOS 固件)** + +- 打包产物名 `r3proii_m2NN.upt`;要刷机时把它**复制为 TF 卡根目录的 `r3proii.upt`**。 +- 关机(failsafe)后按住**音量加 + 电源**进入升级模式,从卡根 `r3proii.upt` 升级。避免使用播放器 UI 里那个会卡死的升级按钮。 +- 回退:用官方固件重刷,或从 `backups/`(NAND 全量备份,本地)恢复。 + +**部署 / 热更新 App(无需重刷固件)** + +- TF 卡布局见 `TF_CARD_LAYOUT.md`。App 目录 `MeowAPPs//`(`package` = `app.json` 的 `package`,如 `os.meow.hello`):`app.json` + 静态 MIPS 二进制 + 资源;数据在 `MeowData//{data,cache}`。 +- **热更新**:把构建产物放入 `MeowAPPs/os.meow.hello/` 即可;launcher 每次打开菜单重扫卡,立即可见。App 二进制/资源在卡上;拔卡会优雅降级(应用列表"未插卡"/字体回退/日志回退内存环),不崩系统。 +- 应用日志:`MeowOS/logs/apps//logs/_.log`(每次启动新文件,单文件 2MB 轮转、每 App 总量上限)。包管理 CLI `nyai`(放 `MeowOS/opt/bin/nyai`):`nyai install /` 等。 + +**TF 卡目录(关键)** +``` +/usr/data/mnt/sd_0/ +├── Music/ # 音乐库 +├── MeowData//{data,cache} +├── MeowAPPs// # 应用(app.json + 二进制 + 资源) +└── MeowOS/ + ├── fonts/// # 多字体库 + ├── config/fonts/index # 字体列表索引 + ├── notifications/ # 通知转储(10MB 滚动) + ├── logs/ # 系统 / 应用日志 + ├── services.d/.conf # 服务配置(TF 源,与板载双源) + └── opt/bin/ … # 外围工具(nyai/curl/…) +``` + +--- + +## 6. 开发 SDK App + +### 6.1 app.json + +```json +{ + "name": "Hello App", + "exec": "/usr/data/mnt/sd_0/MeowAPPs/os.meow.hello/hello", + "package": "os.meow.hello", + "version": "0.1", + "author": "whoever" +} +``` + +| 字段 | 必填 | 说明 | +|---|---|---| +| `name` | ✓ | 列表显示名(v2 仅支持 ASCII) | +| `exec` | ✓ | 可执行文件绝对路径(必须为**静态** MIPS32r2 ELF) | +| `package` | — | 反域名权威 app_id(= 目录名;缺省回退目录名,两者不同 → WARN) | +| `version` / `author` | — | 保留字段 | +| `fullscreen` | — | app 级全屏:状态栏**收合至提示线** + 保留左缘返回 / 顶部提示线 / 下滑通知中心(activity 级用 `route..fullscreen`) | +| `fonts` | — | 字库档位声明 `"full" | "gbk" | "common"`(默认 `common`≈4k) | + +其他扩展(launcher 极简解析、不校验 JSON):`icon` / `framework` / `immersive` / `route.`(路由表)/ `awake.`(keep_awake)/ `service.`。应用数上限 8,扫描深度 1 级。 + +### 6.2 链接与入口 + +- 链接:`meow_ui.a` + `libz.a` + `-lpthread`(见 `patch_v2/hello_app/build_hello.sh`)。 +- 事件循环:`meow_ui_init(&opts)` → 注册控件 → `meow_ui_run(&ev)`(阻塞);`meow_ui_request_exit()` 退出;`meow_ui_time_ms()` 单调时间(动画用)。 + +### 6.3 事件回调(meow_ui_events) + +| 回调 | 触发 | +|---|---| +| `on_key(keycode, is_down)` | SDK 已消化系统语义的按键;**不要**用它实现「电源 = exit」这类映射 | +| `on_tap(x, y)` | 触摸抬起落点 | +| `on_swipe(dir, dx, dy)` | 左缘返回手势 = `MEOW_SWIPE_LEFT`;中部滑动 = `RIGHT/UP/DOWN` | +| `on_swipe_progress(x_start, dx)` | 左缘返回手势实时进度(SDK 自动画顶部提示条 `meow_ui_swipe_hint`) | +| `on_tick()` | 空闲周期回调(动画 / 时钟) | + +返回语义:`on_swipe(LEFT)` 里调用 `meow_ui_request_exit()` 回应用列表,或页内处理不退出。 + +### 6.4 控件 / 主题 / 字体 / 通知 API + +- **控件**:`meow_btn_create` / `meow_slider_create` / `meow_switch_create` / `meow_list_create(count, src, ctx)` + `meow_widget_draw/hit`;`meow_ui_activity_push/pop`(Activity 栈,控件归属当前 Activity)、`meow_ui_global_add/remove`(② 层 App 跨 Activity 全局控件)。 +- **图片**:`meow_img_load_file/mem` + `meow_ui_img/scaled/alpha/cover`(stb_image 解 PNG/JPEG/BMP;`cover` = 居中裁方)。 +- **IME**:`meow_ui_text_input` / `_async`(仅英文/数字 ASCII,键盘占底部)。 +- **主题**:`meow_theme_set_mode(light/dark/auto)` + `meow_theme{bg,fg,accent,dim}`,切换即时生效。 +- **字体**:`meow_font_get_available_count/enumerate`(读 `MeowOS/config/fonts/index`)、`meow_font_select_by_id`、`meow_font_has_glyph(cp)`;多字体 `meow_font_config_multifont` / `meow_font_load_slot`。 +- **通知**:`meow_notify_register_type(cat)`(每 App ≤4 类)/ `meow_notify_send(const meow_notify*)`(返回 id)/ `meow_notify_cancel(id)` / `meow_notify_update_progress`;常量 `MEOW_NOTIFY_MAX_TYPES=4`、`MEOW_NOTIFY_MAX_PER_TYPE=4`、`MEOW_NOTIFY_MAX_MEDIA=1`。 +- **日志**:`meow_log(lvl, fmt, ...)`(`MEOW_LOG_DEBUG/INFO/WARN/ERROR`)→ `MeowOS/logs/apps//logs/`。 + +### 6.5 物理键规范(红线) + +- **物理按键是系统资源,语义由 MeowOS 统一管理,App 禁止映射。** 任何非系统组件不得把物理键映射为任何行为(如电源→OK/exit、音量→确认/选择、播放→返回)。 +- 语义只有一份:**电源 = 息屏 / 亮屏**(长按 = 电源菜单,8s = 强关);**音量 = 调音量**;**播放 / 上下曲 = 媒体控制**。返回走**触摸**(左缘左滑 / 虚拟返回键),不是物理键。 +- App **不读** `/dev/input/event*`、不 open/mmap fb0、不处理物理 keycode;想返回/退出用 `meow_ui_request_exit()` 或左滑。SDK `on_key` 回调只做语义事件,不承载"电源 = exit"类映射。 +- 屏幕导航一律走触摸(返回按钮 / 左缘左滑);任何 MeowOS 界面(含设置页)也不可私自定义按键行为。 + +### 6.6 Activity 用法(进阶) + +- 冷启动跳转 / 逻辑深度由框架按**路由表**解析:`app.json` 扁平行 `route.=path`(如 `route.nowplaying=home;search;nowplaying`),经 env `MEOW_ACTIVITY` / `MEOW_CHAIN` 注入;App 用 `meow_ui_activity_push/pop` 管理栈。详见 `FRAMEWORK_DESIGN.md` / `MEOW_APP_SDK.md`。 + +--- + +## 7. 文档索引 | 文档 | 内容 | |---|---| -| `docs/MEOWOS_SPEC_REF.md` | 权威速查总索引(首选入口;常量/路径照抄原文 + 出处 + 矛盾清单) | -| `devdocs/ANALYSIS.md` | 主技术档案(**本地开发档,gitignore 不入库**):固件逆向、启动链、fb 双缓冲、HGL、一切踩坑与纪律(§ 章节持续累积) | -| `DEVELOPMENT_PLAN.md` | 路线图与分阶段计划(**自身已过时,以实际进度为准**;阶段 0 双系统 / A 稳定化 / B 状态栏通知中心 / B2 系统设置 / C MeowPanel / D Activity 框架 / E 网易云) | -| `FRAMEWORK_DESIGN.md` | Activity / 通知 IPC 框架协议(IPC、路由表、导航栈、后台权限、媒体会话) | -| `SYSTEM_SETTINGS.md` | 系统设置子系统设计(统一存储 + C API + 实体 UI + web 复用 + 导入导出) | -| `MEOWOS_API.md` | 统一 API 蓝本(命名规范、返回码、设置 API、HTTP 映射、扩展指南) | -| `APPS.md` | MeowAPPs 应用规范(目录、app.json、生命周期、边界、日志、返回键) | +| `docs/MEOWOS_SPEC_REF.md` | **权威速查总索引**(首选入口):路径 / 常量 / 接口 / 约定 + 「已知矛盾 / 待确认」清单 | +| `FRAMEWORK_DESIGN.md` | Activity / 通知 IPC 框架协议(AF_UNIX socket、路由表、导航栈、后台权限、媒体会话、freedesktop/MPRIS/XDG 对齐) | +| `MEOW_APP_SDK.md` | SDK 设计:架构分层、绘制/控件/图片/输入/主题/字体/通知 API、三层控件模型、Activity 栈、动画与性能 | +| `APPS.md` | MeowAPPs 应用规范:目录、`app.json` 字段、生命周期、边界、返回键、`.mpk` 包与 `nyai` | +| `NOTIFICATION_SYSTEM.md` | 通知系统:freedesktop 标准、配额、TTL/转储、存储分层 | +| `SYSTEM_SETTINGS.md` | 设置子系统:统一存储 + `meow_settings_*` C API + 变更通知 + 导入导出 | +| `TF_CARD_LAYOUT.md` | TF 卡目录布局 + 「固件 / 卡」分头原则(拔卡降级) | +| `DEVELOPMENT_PLAN.md` | 路线图与分阶段计划(**部分已过时,以实际进度为准**) | | `GESTURE_BACK_DESIGN.md` / `KEY_CONTROL_DESIGN.md` / `PERF_SCHEDULER.md` | 左缘返回 / 按键契约与信号 / 帧率调度 | +| `mips-repo/README.md` | mipsel 软件仓库(`bins/` 工具 + `mpk/` 应用包)与 meow_svcd CLI | -> 一次性/阶段性设计文档(已过时或未实施)移至 `devdocs/plan/` 归档(移动不删、保留历史;`devdocs/` 为本地开发档,不入库):`BOOT_SELECTOR_DESIGN`、`CHARGING_SCREEN`、`MAIN_MD3_PLAN`、`MD3_UI_SPEC`、`MEOW_TOUCH_DESIGN`、`MIGRATION_AC`、`BLUETOOTH_MANAGER_PLAN`、`APP_LOG_MANAGER`。 +> 文档收敛规则:新功能在对应权威文档(`MEOW_APP_SDK.md` / `APPS.md` / `SYSTEM_SETTINGS.md` 等)补小节;新增决策/检查点记录在本地开发文档;过时的一次性设计归档。 -**文档收敛规则**:不再为每个功能新增设计 md;新功能在对应权威文档(`MEOW_APP_SDK.md`/`APPS.md`/`SYSTEM_SETTINGS.md` 等)补小节;新增决策/检查点写 `devdocs/DEV_NOTES.md`;过时一次性设计进 `devdocs/plan/`。 +--- -## 当前架构与组件(2026-08-30 快照) +## 8. 约束 / 硬件 -- **SDK 统一日志 + 通知(M2.52/53 已落地 + 模型补全)**:`meow_log()` 按 app 分目录、每次启动新文件 `MeowOS/logs/apps//logs/_.log`,单文件 2MB 轮转、每 App 总量 50MB 删最旧;通知 API `meow_notify_*`(4 类型×每类型 4、媒体单例);**#5 SDK↔IPC 桥**(`meow_notify_ipc.c/.h`:app→launcher 中央存储,send/cancel 接入、回填 launcher `nid`,无 socket 降级不崩)。**通知模型补全(agent-107)**:SDK 补 `icon`+`meow_notify_update_progress`,IPC `m_notify_t` 补 `urgency`(复用 pad)+`MSG_NOTIFY_PROGRESS`,存储补 urgency + icon 回退 + progress(内存实时/里程碑落盘),dump CSV 加 3 列;**#6 TF 转储**已落地(`MeowOS/notifications/` appended CSV + 10MB 滚动 + 开机清板载/内存表)。通知中心 UI / D-Bus 桥为后续任务。 -- **TF 卡多字体库 + 字重结构(M2.5x/M2.58)**:`MeowOS/fonts///`(`font.png`+`font.idx`+`font.json` 三件套),默认 `MeowOS/fonts/default/regular`;`font.file` 设置键选默认套(**family 点开→字重子菜单**,两级扫描 fam/wt/name 数组);`gen_font.py --weight` 写 `font.json.weight` + `--charset` 档位(common/gbk/full);SDK `load_font` **优先读 env `MEOW_FONT_PNG/IDX`**(launcher 每次 `launch_app` 注入),app 未自带字库时**跟随系统 `font.file`**;多字体 6 类(按字符类别路由) + `font.load_full` 大字库开关 + 档位按需加载;≤16 套卡内(防爆);§5.7 字体管理 + 应用字库(多句柄,**草案未实现/**字体索引 agent-113 进行中)。已迁移卡上 8 套到 `/regular/`(default / google_sans / meslo / misans / source_han_sans / source_han_serif / ubuntu_mono / ztest,位深 4)。 -- **全屏机制(M2.5x)**:`app.json fullscreen`(app 级)+`route..fullscreen`(activity 级)+env `MEOW_FULLSCREEN` 注入,launcher 启动 app/切 activity 前预设 SDK 全屏;进入/退出全屏=**状态栏上收出屏顶只剩提示线(4px)**+自然过渡;全屏下保留左缘返回手势+顶部伸缩滑条+顶部下滑开通知中心(热区缩小)。⚠️ 全屏滑条仍有已知问题在跟进(agent-112)。 -- **包名/目录安卓化**:`app.json` `package`(反域名**权威 app_id**,==目录名,缺省回退目录名)→ 示例 `os.meow.hello`;目录 `MeowAPPs/os.meow.hello`;数据 `MeowData//{data,cache}`。 -- **meow_svcd 服务管理器**(`patch_v2/meow_svcd/`,mipsel 静态 ~99KB,进固件不入卡):类 systemd/systemctl;**已接入固件开机链**(`etc/init.d/S89meow_svcd` 开机自启,`-f` 前台 + 重挂循环,置于 S84ssh 后、S90 前;bootmenu/launcher `fork/exec`+`waitpid` 托管仍为备选);**双源 services.d**(板载 `/usr/data/meow/services.d/` + TF `MeowOS/services.d/.conf`,同名板载优先+WARN;目录式 `key=value`,未知键忽略/前向兼容);服务=svcd **独立子进程**(崩溃隔离:服务挂不影响 svcd/supervisor);事件触发 `boot`/`card-mount`/`wifi-up`(1s 轮询);`-f` 前台便于 supervisor `waitpid`;状态机 DISABLED/STOPPED/RUNNING/STOPPING/FAILED + CLI。 -- **mDNS(自研 `meow_mdns`,IPv4-only)+ `meow_svcd` 双源服务**:完整 mDNSResponder/SAResponder 均因内核无 IPv6(`socket(AF_INET6)` 失败)被否,改**自研 `meow_mdns`**(mipsel 静态 ~79KB)→ **进固件 `/usr/bin/meow_mdns`**(不入卡),由 `meow_svcd` 托管。`meow_svcd` **双源 services.d**(板载 `/usr/data/meow/services.d/` + TF `MeowOS/services.d/`,同名板载优先+WARN),`etc/init.d/S89meow_svcd` 开机自启并预置 `mdnsd.conf`(trigger=boot);hostname=**meowos**(`system.hostname`,S89 应用)。⚠️ **手机热点组播隔离**:设备→主机组播被热点丢弃 → 该热点下 `avahi-resolve .local` 超时(网络层限制,非缺陷),主机需 DNS 兜底。**`MeowOpt` 已废弃并入 `MeowOS/opt`**。 -- **boot 默认→板载**:**`/data/meow_boot_default`**(O_TRUNC 单值、不递增、权威);bootmenu 读它定默认;**meow.conf 不再承担 boot_default**(其 O_APPEND 累积 bug 已修,设备已清)。 -- **状态栏 40→28px**:SDK `MUI_SBAR_H=28`(字号 20)+ launcher `SB_BAR_H=28`/`SB_FONT=20`;状态栏两条实现(SDK `meow_ui_sys_statusbar_render` / launcher `draw_statusbar`)**待 MD3 收敛为单一 SDK 全局状态栏**(launcher 退役 draw_statusbar 复用 SDK)。 -- **系统修复(agent-104/106,M2.56)**:亮度开机被播放器覆盖→launcher 接管压回用户值;SDK 状态栏音量读取修复(空格匹配 + clamp `volume_max`);设置开关 `meow_settings_get_switch/set_switch` 修复(SET_INT{0,1});**「关于本机」**(设置最底,只读弹窗:hostname=meowos/版本/内存/存储/WiFi);bootmenu 版本显示读 `/etc/meowos_version`(替换硬编码 0.7.9);boot 默认板载 `/data/meow_boot_default`;SDK 拆分触发线(>1200 行才拆,现状 meow_ui_gfx.c=839 行保持扁平)。 -- **键码/阈值修正**:`MEOW_KEY_PREVIOUS=165`(19 是另一码,[A-6] 定案);左缘返回阈值 **65px**([A-4] 90vs65 定案 65);亮度下限 1([A-3]);热键窗口下限 60ms([A-1]);日志路径统一 `MeowOS/logs`([A-7])。 -- **TF 卡资产**:包管理 CLI `nyai`(部署 `MeowOS/opt/bin/nyai`,同 launcher 包语义);应用日志 `MeowOS/logs/apps//logs/_.log`;服务定义 `MeowOS/services.d/.conf`。 -- **mips-repo/**(宿主侧 mipsel 软件仓库):`bins/`(二进制工具:交叉编译产物 + `build.sh` + `manifest.md`)+ `mpk/`(`.mpk` 软件包),供后续固件/TF 复用(见「目录速览」)。 -- **仓库公开净化**:净化后基线单提交 `245bee2` + 本开发批次 8 提交(领先 origin/main 8),HEAD 敏感 0 命中;`devdocs/`(本地开发文档 + WORK_STATE/DEV_NOTES)、`scripts/build/`(固件打包脚本)**gitignore 不入库**;`mips-repo/`(mipsel 软件仓库)入库。 - -## 目录速览 - -- `patch_v2/` — meow_launcherd(MeowOS 核心)、bootmenu(引导选单)、watchdog、meow_svcd(服务管理器)、sdk(meow_ui SDK)、meowpkg(包管理);源码与构建脚本 -- `mips-repo/` — mipsel 交叉编译软件仓库(`bins/`=二进制工具=`meow_mdns`、`mdnsd` 等;`mpk/`=`.mpk` 软件包),供后续固件/TF 复用 -- `font/` — 预渲染字形系统(gen 生成器、meow_font 渲染库、atlas 产物) -- `fw_apps/` — 固件组装产物(`.upt` 不入库,由 `scripts/build/build_fw_apps*.sh` 重新打包) -- `bootlogos/` — 用户定制启动图/关机 logo -- `scripts/build/` — 固件打包脚本 `build_fw_apps_m*.sh`(**本地 gitignore 不入库**) -- `devdocs/` — 本地开发文档(ANALYSIS / WORK_STATE / DEV_NOTES / OPEN_QUESTIONS / FLASH_SSH / TEST_ON_DEVICE / device_test / plan 归档;**gitignore 不入库**) -- `ssh_keys/`, `.tools/` — SSH 密钥、交叉工具链(不入库,按需) - -## 构建/刷机 - -- 固件打包:`scripts/build/build_fw_apps_m258.sh`(**现 M2.58 / 0.7.53**;需交叉工具链 `zig-mipsel-cc` + musl.cc,见 `devdocs/ANALYSIS.md` 第 10 节) -- 升级锁根:SD 卡根 `r3proii.upt`(固件由 `build_fw_apps*.sh` 打包成 `.upt` 再刷) -- 刷机:failsafe(关机后按住 音量加+电源)从 SD 卡根 `r3proii.upt` 升级;勿用播放器 UI 卡死的升级按钮 -- 组件归属:**launcher / bootmenu / watchdog 为固件组件**(`/usr/bin`,只读 squashfs);`/usr/data` 下的同名文件仅 dev 手动 exec 快速下发,开机不用。**真机验证字体/包名/通知须重打固件 + 刷机 + reboot**。 -- 回退:官方固件 / `backups/`(NAND 全量备份)重刷 - -## 关键纪律(红线) - -- 严禁对 `hiby_player` 发未注册信号(SIGUSR1 导致整机重启);不 killall;禁经 `hiby_player.sh` -- 勿远程 kill `meow_launcherd`(整机重启) -- 播放器不能"杀+重拉"(HGL 连续内存);双系统互斥,MeowOS→HibyOS 只能重启 -- 日志/字库/媒体等大数据只写 TF 卡;板载只写 KB 级 `meow/settings.conf` -- 绝对不对挂载点 `rm -rf` - -详见 `devdocs/ANALYSIS.md` 纪律章节。 +- **无 GPU,全 CPU 软渲染**;480×720 双缓冲(虚拟高 1440、yoffset 翻页)。 +- **性能铁律:局部脏区刷新,不整屏重绘**。渲染走 `back_buf` + `meow_present(dirty)`(脏区矩形合并集、相交吸 bbox、超过阈值转全屏、裁可视区);状态栏时钟 / 格按需局部标脏;等垂直同步 + 单次原子 memcpy。刷新率调度 `display.refresh_rate` 60/30/15 + 自适应降档(连续 12 帧超预算降一档、远低预算升一档)。 +- **rootfs 上限 45,088,768 B(≈45MB)**;`/usr/bin` 各组件静态 MIPS32r2。 +- **板载存储极小**(`/data` 约 16MB):只写 KB 级设置(`/usr/data/meow/settings.conf`);日志 / 字库 / 媒体 / 应用一律写 TF 卡;无卡优雅降级(不崩不死)。 +- **mtd 分区**(勿写 NAND):mtd0=uboot、mtd1=kernel、mtd2=rootfs、mtd3=kernel2、mtd4=rootfs2、mtd5=ota(8M 标记)、mtd6=userdata。 +- **安全红线**:不要远程 kill 常驻 `meow_launcherd`(整机重启);`hiby_player` 只能 SIGSTOP/SIGCONT,严禁 killall / 对其发未注册信号(如 SIGUSR1 导致整机重启)/ 走 `hiby_player.sh`;严禁触碰 NAND / `recovery_all`;播放器不能「杀+重拉」(HGL 连续内存)。 +- 本仓库为**非官方第三方项目**,修改并与官方固件共存;刷机有一定的变砖风险(可用官方固件刷回),请自行评估。所有「真机验证」项请以实机为准。 diff --git a/SYSTEM_SETTINGS.md b/SYSTEM_SETTINGS.md index 246199e..c9dd9ab 100644 --- a/SYSTEM_SETTINGS.md +++ b/SYSTEM_SETTINGS.md @@ -27,7 +27,7 @@ | **电源** | `power.longpress_menu_ms` | int | 3000 | 长按电源弹电源菜单阈值 | | | `power.forceoff_ms` | int | 8000 | 长按电源强关阈值 | | | `power.defeat_hotkey` | string | `power_voldown` | 切系统/切 MeowOS 热键组合 | -| **开机** | `boot.default` | enum | `meow` | 开机默认进入 | +| **开机** | `boot.default` | enum | `meow` | 开机默认进入。**权威文件 = 板载 `/data/meow_boot_default`(O_TRUNC 单值:0=MeowOS / 1=HiByOS);`boot.default` 每次保存同步写该文件**(launcher `meow_settings_save` 同步;bootmenu `set_boot_default_meow`/launcher `set_boot_default_hiby` 同文件同语义);init 读入不触发、不反向覆盖。`meow.conf` 不再承担 boot_default [源:M2.61 同步修复][源:2026-08-30] | | | `boot.menu_enabled` | bool | true | 是否显示引导选单 | | | `boot.timeout_ms` | int | 5000 | 选单超时(有输入暂停重计) | | **输入** | `input.hotkey_seq` | string | `volup,volup,volup` | 应用列表热键序列 | diff --git a/docs/MEOWOS_SPEC_REF.md b/docs/MEOWOS_SPEC_REF.md index dcf67d0..5e3e72f 100644 --- a/docs/MEOWOS_SPEC_REF.md +++ b/docs/MEOWOS_SPEC_REF.md @@ -11,6 +11,7 @@ - **板载服务目录**:`/usr/data/meow/services.d/.conf`(M2.54,Data 区,恒定存在、权威优先;首启由 `S89meow_svcd` 预置 `mdnsd.conf`)。与 TF `MeowOS/services.d/` 双源,同名板载优先 + WARN;板载 `trigger=boot` 服务不依赖卡(拔卡保留)`[meow_svcd.md][meow_svcd.c]` - **主机名**:设置键 `system.hostname`(SET_STR,默认 `meowos`;RFC1035 首标签),`S89meow_svcd` 开机读 settings `sethostname`;供自研 mDNS 应答器公布 `.local` `[SYSTEM_SETTINGS §1][mips-repo/bins/meow_mdns]` - `/etc/meowos_version`:版本唯一来源(launcher 运行时 `load_meowos_version` 读;`MEOWOS_VERSION` 宏仅作 dev 占位兜底)`[DEV_NOTES #4]` +- **`/data/meow_boot_default`:开机默认权威标记(O_TRUNC 单值:`0`=MeowOS / `1`=HiByOS)**。由 launcher `meow_settings_save()` 在保存 `boot.default` 时同步写;bootmenu `set_boot_default_meow()`(写 0)/ launcher `set_boot_default_hiby()`(写 1)同文件同语义;bootmenu 开机读它定默认;init 读入不触发、不反向覆盖;`meow.conf` 不再承担 boot_default `[M2.61 同步修复][README][meow_settings.c][meow_bootmenu.c]` - `/tmp`:tmpfs,开机清空;开机模式标记 `/tmp/meow_boot_mode`、电源菜单 `/tmp/meow_power_menu{,_active}`、app 沉浸 `/tmp/meowapp_state` `[BOOT_SELECTOR §1][KEY_CONTROL §9][APPS §3.5]` - 日志启动缓冲 `/tmp/meow_boot.log`(256KB 滚动,卡出现后自动迁卡)`[APPS §4.5]` - IPC socket:`/usr/data/meow_ipc.sock`(AF_UNIX SOCK_STREAM,0666,backlog 4)`[FRAMEWORK_DESIGN §1][WORK_STATE]` @@ -37,6 +38,7 @@ ``` `[TF_CARD_LAYOUT §1][APPS 附录][NOTIFICATION_SYSTEM §5]` - 环境注入(launcher 每次启动 app 前):`MEOW_DATA_DIR`/`MEOW_CACHE_DIR`/`MEOW_LOG_DIR`/`MEOW_LOG_APP`(app_id=package)/`MEOW_LOG_LEVEL`/`MEOW_ACTIVITY`/`MEOW_CHAIN`;XDG:`XDG_DATA_HOME`/`XDG_CACHE_HOME`/`XDG_CONFIG_HOME`(=MeowData//{data,cache,config})`[APPS 附录 §2][FRAMEWORK_DESIGN 附录 D2]` +- **升级/刷机契约**:升级镜像 = 卡根固定名 **`r3proii.upt`**(`build_fw_apps*.sh` 打包);升级模式=uboot 读 mtd5=`ota:kernel2` 引导 kernel2 自动刷(非传统 UI 升级按钮);failsafe(关机按住 音量加+电源)从卡根 `r3proii.upt` 升级;**`/data/recovery_all`=恢复出厂,危险勿触发**(调试/部署前必须 `rm -f /data/recovery_all`;发现即删+告警——highest-priority 红线)。刷 rootfs 分区不丢卡数据 `[WORK_STATE][APPS §1.3/§6]` ### 1.3 板载 vs TF 划分原则(拔卡降级) - 板载只放**稳定框架+KB 级设置**;日志/字库/媒体等大件一律 TF 卡 `[TF_CARD_LAYOUT §0][SYSTEM_SETTINGS §2]` @@ -116,6 +118,7 @@ --- ## 4. SDK 之外系统组件 +- **系统进程 supervisor 树(源:2026-08-30 定案)**:`meow_sysui`(新增,meow_svcd 托管)= 系统进程总监,监管 launcher/svcd/mdns/未来媒体服务/MeowPanel,**一个崩→只拉起它,绝不级联**;`meow_launcherd`=系统 UI 渲染宿主(状态栏/通知中心/电源菜单/全局手势,与 APP 进程独立);`meow_svcd`=服务管理器(服务全子进程化,svcd 自身不死);APP 进程只渲染自己内容,崩不连累系统 UI。**系统组件渲染归系统进程(launcher),APP 进程不渲染系统 UI**(SDK 系统组件 API 仅系统进程可链,App 不可自建悬浮层);通知中心 UI 渲染主体=系统进程,数据经 IPC 从通知存储读。现网(bootmenu execv launcher + S89 svcd 自启)→ 定案(sysui 统一监管)为渐进迁移,属系统基建线。`[FRAMEWORK_DESIGN §10][MEOW_APP_SDK §6.1][NOTIFICATION_SYSTEM §9]` - 通知(SDK `meow_notify_*`,M2.53 最小版 `[meow_ui.h §9.1]`): - 常量:`MEOW_NOTIFY_MAX_TYPES=4`/`MEOW_NOTIFY_MAX_PER_TYPE=4`/`MEOW_NOTIFY_MAX_MEDIA=1`/`MEOW_NOTIFY_TIMEOUT_ONGOING=-1`/`MEOW_NOTIFY_TIMEOUT_NEVER=0` - 分类:`CAT_GENERAL/MESSAGE/EMAIL/EVENT/PROGRESS/MEDIA(=5)/COUNT`;紧急度 `URG_LOW/NORMAL/HIGH/CRITICAL` diff --git a/patch_v2/meow_launcherd/meow_launcherd b/patch_v2/meow_launcherd/meow_launcherd index 3f39389170fa2449418aec6cf44ff0b0ab11f939..5be96a2a6fd5f9934c8fd9ec11b2cfd163bf396a 100755 GIT binary patch delta 212053 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

T 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�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 F{{y?n>>&UE delta 133724 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 diff --git a/patch_v2/meow_launcherd/meow_launcherd.c b/patch_v2/meow_launcherd/meow_launcherd.c index 7019d0b..d9c0ead 100644 --- a/patch_v2/meow_launcherd/meow_launcherd.c +++ b/patch_v2/meow_launcherd/meow_launcherd.c @@ -325,7 +325,7 @@ #include #include #include -#include +#include /* 0-warning:musl 把 重定向到 ,用后者消除 -W#warnings */ #include "meow_touch.h" /* M2.25:Launcher 统一触摸接口(电源菜单/确认框复用) */ #include "pm_icons.h" /* M2.32:Material Symbols rounded 图标(电源菜单圆钮,alpha 位图+主题色) */ #include "sb_icons.h" /* MD3 状态栏/通知中心图标(Material Symbols rounded,32x32 单通道 alpha) */ @@ -343,6 +343,7 @@ #include "meow_notif.h" /* M2a:通知存储 + 分发(NOTIFICATION_SYSTEM.md §4/§7/§8) */ #include "meow_ui.h" /* A-1/A-2:launcher 用 SDK 渲染栈(meow_ui_fill_rect/text/flush/theme) */ #include "meow_ui_internal.h" /* A-1/A-2:launcher 与 SDK 共用 back_buf + 手动脏模型桥接(mark_full/back_buf) */ +#include "meow_notif_panel.h" /* 阶段B:通知中心面板纯逻辑(header-only,可单测) */ /* ---- paths ---- */ #define DEV_POWER "/dev/input/event0" /* md-gpio-keys: KEY_POWER, KEY_PREVIOUS */ @@ -3286,6 +3287,11 @@ static int launch_app(struct app *a); * 「系统设置」行时调用,返回后由调用方重置按键防抖基线防面板误切换)。 */ static void run_settings_page(void); +/* 阶段B:通知中心面板(定义在下方 run_settings_page 之后;run_menu 顶部热区下滑调用)。 + * *want_launch 初始为 -1;若点击通知命中可启动 app,返回时置为 apps[] 下标(run_menu 据此 + * 走标准启动链路)。返回后由调用方重置按键防抖基线防面板误切换。 */ +static void run_notif_center(struct app *apps, int napps, int *want_launch); + static int touch_fd = -1; static int t_last_x = -1, t_last_y = -1; static int t_down = 0; @@ -4432,6 +4438,43 @@ static void run_menu(struct app apps[MAX_APPS], int napps, int state, t_down_valid = 0; logmsg("menu tap at %d,%d (up %d,%d, d=(%d,%d))", tx, ty, t_last_x, t_last_y, dx, dy); + /* 阶段B:顶部热区下滑打开通知中心。判定在「滑动」分支内先于左缘返回—— + * 左缘(down_x notification center"); + menu_arm_touch(TAP_ARM_DELAY_MS); + int want_launch = -1; + run_notif_center(apps, napps, &want_launch); + /* 重播按键防抖基线,防面板内电源/音量边沿被 run_menu 误判(M2.25 同款)。 */ + memset(&kd_pwr, 0, sizeof kd_pwr); + memset(&kd_vold, 0, sizeof kd_vold); + memset(&kd_volu, 0, sizeof kd_volu); + memset(&kd_play, 0, sizeof kd_play); + kp_poll(&kp_power, NULL, NULL); + kp_poll(&kp_keys, NULL, NULL); + m_prev_pwr = kp_is_down(&kp_power, KEY_POWER); + m_prev_vold = kp_is_down(&kp_keys, KEY_VOLUMEDOWN); + m_prev_volu = kp_is_down(&kp_keys, KEY_VOLUMEUP); + m_prev_play = kp_is_down(&kp_keys, KEY_PLAYPAUSE); + last_input_ms = now_ms(); + menu_arm_touch(800); + dirty = 1; + /* 点击通知命中可启动 app → 走标准启动链路(与触摸行同路径)。 */ + if (want_launch >= 0 && want_launch < napps) { + logmsg("menu: notification launch app idx=%d", want_launch); + int ret = launch_app(&apps[want_launch]); + menu_after_app_exit(ret == 0); + last_input_ms = now_ms(); + dirty = 1; + if (ret != 0) { + snprintf(toast, sizeof toast, "CANNOT START: %s", + apps[want_launch].name); + toast_ms = TOAST_MS; + } + } + continue; /* 本圈不再按 tap/其余处理 */ + } /* M2.23 滑动不启动:抬手位移 >= 阈值 → 判为滑动,不 launch、 * 不进行行判定(为将来左右滑切屏预留;本轮只判滑动、不打事件)。 */ if (adx >= MENU_SWIPE_THRESH || ady >= MENU_SWIPE_THRESH) { @@ -6715,6 +6758,725 @@ done: logmsg("settings page closed"); } +/* ================================================================== */ +/* 阶段B:通知中心面板(状态栏下滑,系统级叠加层,§6.1 ③ 仅框架内部) */ +/* - 入口:run_menu 顶部热区下滑 → run_notif_center 阻塞子循环。 */ +/* - 结构:顶部把手/标题 + 快捷开关行(WiFi/蓝牙/主题/亮度/音量) + */ +/* 亮度/音量滑条 + 通知列表(app 图标+标题+内容+时间+进度)。 */ +/* - 只读写 meow_settings_* / meow_notif 存储,零旁路;MD3 接 s_ui_theme()。*/ +/* - 手势:面板内上滑/点空白/左缘左滑关闭(左缘复用 meow_edge_back)。 */ +/* - 物理键:系统语义不变(电源=息屏/亮屏/菜单/8s强关、音量=调音量、 */ +/* 播放=媒体预留),绝不映射为返回/确认/exit(APPS §3.4.1)。 */ +/* - 性能:打开/交互只标面板体区域脏(状态栏 0-27 由 draw_statusbar */ +/* 单独维护),绝不整屏重绘;滑条拖动实时 set_*(后端 clamp),抬手落盘。*/ +/* ================================================================== */ + +/* ---- 面板布局常量 ---- */ +#define NCP_TOP SB_BAR_H /* 28:面板顶缘(状态栏下) */ +#define NCP_GRAB_Y 32 +#define NCP_TITLE_Y 46 +#define NCP_CHIP_Y 86 +#define NCP_CHIP_H 44 +#define NCP_CHIP_W 70 +#define NCP_CHIP_GAP 8 +#define NCP_CHIP_N 5 +#define NCP_SLIDER_X 20 +#define NCP_SLIDER_W (fb_xres - 40) +#define NCP_SL1_Y 162 /* 亮度滑条 track 顶(label 在 -26 =136) */ +#define NCP_SL2_Y 214 /* 音量滑条 track 顶(label 在 -26 =188) */ +#define NCP_DIV_Y 258 +#define NCP_LIST_TOP 266 +#define NCP_LIST_BOT 694 +#define NCP_ROW_H 92 +#define NCP_ROW_X 12 +#define NCP_ROW_W (fb_xres - 24) +#define NCP_ICON_X 26 +#define NCP_TEXT_X 72 +#define NCP_TEXT_W (NCP_ROW_W - (NCP_TEXT_X - NCP_ROW_X) - 10) +#define NCP_FOOT_Y 700 +#define NCP_MAX_ROWS 24 /* 面板一次缓冲的通知行上限(防御) */ + +/* chip 索引 */ +enum { NCP_CHIP_WIFI=0, NCP_CHIP_BT=1, NCP_CHIP_THEME=2, NCP_CHIP_BRIGHT=3, + NCP_CHIP_VOL=4, NCP_CHIP_COUNT=5 }; + +/* 通知行快照(面板读取字段 + 缓存的 icon 句柄)。 */ +typedef struct { + uint32_t id; + char app_id[MEOW_NOTIF_APP_ID_MAX]; + char summary[MEOW_NOTIF_SUMMARY_MAX]; + char body[MEOW_NOTIF_BODY_MAX]; + char icon[MEOW_NOTIF_ICON_MAX]; + char target[MEOW_NOTIF_ACTIVITY_MAX]; + uint64_t created_ms; + int progress; + uint8_t urgency; + meow_img *img; /* 缓存图标(meow_img_load_file 结果;NULL=回退首字符圆点) */ +} ncp_row_t; + +static ncp_row_t g_rows[NCP_MAX_ROWS]; +static int g_nrows = 0; +static struct app *g_ncp_apps = NULL; /* run_notif_center 注入(通知点击找 app 用) */ +static int g_ncp_napps = 0; + +/* 短串拷贝(同 meow_notif.c 语义:保证 NUL + 截断) */ +static void ncp_strncpy(char *dst, const char *src, size_t len) +{ + if (!dst || len == 0) return; + if (!src) { dst[0] = 0; return; } + strncpy(dst, src, len - 1); + dst[len - 1] = 0; +} + +/* app_id → 显示名(apps[] 匹配则用 name,否则原样 app_id;无则空串) */ +static const char *ncp_app_name(const char *app_id) +{ + if (app_id && g_ncp_apps) + for (int i = 0; i < g_ncp_napps; i++) + if (!strcmp(g_ncp_apps[i].id, app_id)) return g_ncp_apps[i].name; + return app_id ? app_id : ""; +} + +/* 通知图标加载回调:把 app_icon(相对卡根/绝对)解成绝对路径,加载 meow_img。 */ +static void ncp_load_icon(ncp_row_t *r) +{ + if (!r) return; + r->img = NULL; + if (!r->icon[0]) return; + char path[MEOW_NOTIF_ICON_MAX + 80]; + if (r->icon[0] == '/') snprintf(path, sizeof path, "%s", r->icon); + else snprintf(path, sizeof path, "/usr/data/mnt/sd_0/%s", r->icon); + r->img = meow_img_load_file(path); +} + +static int ncp_collect_cb(const meow_notif_t *n, void *ctx) +{ + (void)ctx; + if (g_nrows >= NCP_MAX_ROWS) return 1; /* 满:中止遍历 */ + ncp_row_t *r = &g_rows[g_nrows++]; + memset(r, 0, sizeof *r); + r->id = n->id; + ncp_strncpy(r->app_id, n->app_id, sizeof r->app_id); + ncp_strncpy(r->summary, n->summary, sizeof r->summary); + ncp_strncpy(r->body, n->body, sizeof r->body); + ncp_strncpy(r->icon, n->app_icon, sizeof r->icon); + ncp_strncpy(r->target, n->target_activity, sizeof r->target); + r->created_ms = n->created_ms; + r->progress = n->progress; + r->urgency = n->urgency; + ncp_load_icon(r); + return 0; +} + +/* 释放全部缓存图标 + 清行数(面板关闭/列表刷新前用)。 */ +static void ncp_rows_free(void) +{ + for (int i = 0; i < g_nrows; i++) + if (g_rows[i].img) { meow_img_free(g_rows[i].img); g_rows[i].img = NULL; } + g_nrows = 0; +} + +/* 重新采集通知列表(比 meow_notif_count 变化时调用)。 */ +static int ncp_refresh_rows(void) +{ + ncp_rows_free(); + meow_notif_list(NULL, ncp_collect_cb, NULL); + return g_nrows; +} + +/* 通知列表是否变化(简单按活跃数比;新条/撤下/TTL 释放都反映在 count)。 */ +static int ncp_rows_changed(void) +{ + int c = meow_notif_count(NULL); + if (c > NCP_MAX_ROWS) c = NCP_MAX_ROWS; + return c != g_nrows; +} + +/* 把文本按宽度截断(UTF-8 安全:不切开多字节码),超出加 "..."。 */ +static void ncp_text(int x, int y, const char *s, int size, uint32_t color, int maxw) +{ + if (!s) s = ""; + if (ui_width(s, size) <= maxw) { ui_draw(x, y, s, color, size); return; } + int ell = ui_width("...", size); + int limit = maxw - ell; + int len = 0; + char buf[128]; + while (s[len] && len < (int)sizeof buf - 8) { + /* 取当前字节对应的 UTF-8 码长(1-4),避免切断多字节字符 */ + unsigned char c0 = (unsigned char)s[len]; + int cp = 1; + if ((c0 & 0xE0) == 0xC0) cp = 2; + else if ((c0 & 0xF0) == 0xE0) cp = 3; + else if ((c0 & 0xF8) == 0xF0) cp = 4; + if (len + cp >= (int)sizeof buf - 1) break; + for (int k = 0; k < cp; k++) buf[len + k] = s[len + k]; + buf[len + cp] = 0; + if (ui_width(buf, size) > limit) { buf[len] = 0; break; } + len += cp; + } + if (len > 0) { + if (len + 3 < (int)sizeof buf) { buf[len] = '.'; buf[len+1] = '.'; buf[len+2] = '.'; buf[len+3] = 0; } + ui_draw(x, y, buf, color, size); + } else { + ui_draw(x, y, "...", color, size); + } +} + +/* 画一个小圆点(近似圆 = 圆角方 r=radius;主题 chip 用)。 */ +static void ncp_dot(int cx, int cy, int r, uint32_t col) +{ + meow_gfx_fill_round(cx - r, cy - r, r * 2, r * 2, r, col); +} + +/* 画 32×32 图标(复用 sb_blit_icon;ink 垂直中心对齐 cy)。 */ +static void ncp_sb_icon(int icon, int slot_x, int cy, uint32_t col, int ink_h) +{ + int saved = g_sb_icon_cy; + g_sb_icon_cy = cy; + sb_blit_icon(icon, slot_x, col, ink_h); + g_sb_icon_cy = saved; +} + +/* chip 位置(5 个,居中排布)。返回下标对应 chip 的 x 左缘。 */ +static int ncp_chip_x(int chip) +{ + int total = NCP_CHIP_N * NCP_CHIP_W + (NCP_CHIP_N - 1) * NCP_CHIP_GAP; + int x0 = (fb_xres - total) / 2; + return x0 + chip * (NCP_CHIP_W + NCP_CHIP_GAP); +} +static int ncp_chip_hit(int chip, int tx, int ty) +{ + int x = ncp_chip_x(chip); + return (tx >= x && tx < x + NCP_CHIP_W && ty >= NCP_CHIP_Y && ty < NCP_CHIP_Y + NCP_CHIP_H); +} + +/* 面板当前 5 个 chip 的状态(① 能否写入/取值在 meow_settings_*;② 显示用)。 */ +static void ncp_chip_state(int chip, int *on, char *val, int vlen) +{ + *on = 0; + if (val && vlen > 0) val[0] = 0; + if (chip == NCP_CHIP_WIFI) { + int v = 0; meow_settings_get_switch("network.wifi_enabled", &v); + *on = v; + } else if (chip == NCP_CHIP_BT) { + int v = 0; meow_settings_get_switch("network.bluetooth_enabled", &v); + *on = v; + } else if (chip == NCP_CHIP_THEME) { + int v = 0; meow_settings_get_enum("display.theme", &v); /* dark=0, light=1 */ + *on = (v == 1); + if (val && vlen > 0) snprintf(val, vlen, "%s", *on ? "浅色" : "深色"); + } else if (chip == NCP_CHIP_BRIGHT) { + int v = 0; meow_settings_get_int("display.brightness", &v); + int vmin = 1; meow_settings_get_int("display.brightness_min", &vmin); + int vc = mnp_brightness_clamp(v, vmin); + if (val && vlen > 0) snprintf(val, vlen, "%d%%", vc); + *on = (vc >= 50); /* 过半视为"亮"态 */ + } else if (chip == NCP_CHIP_VOL) { + int v = 0; meow_settings_get_int("audio.volume", &v); + if (val && vlen > 0) snprintf(val, vlen, "%d%%", v); + *on = (v > 0); /* 非静音=开 */ + } +} + +/* chip 快捷动作(写 meow_settings_* + 侧效应;零手写文件)。 + * 返回 1=主题变化(需重刷状态栏);0=其它。 */ +static int ncp_chip_apply(int chip) +{ + if (chip == NCP_CHIP_WIFI) { + int v = 0; meow_settings_get_switch("network.wifi_enabled", &v); + meow_settings_set_switch("network.wifi_enabled", !v); + s_net_toggle_wifi(!v); + s_net_refresh(); + } else if (chip == NCP_CHIP_BT) { + int v = 0; meow_settings_get_switch("network.bluetooth_enabled", &v); + meow_settings_set_switch("network.bluetooth_enabled", !v); + s_net_toggle_bt(!v); + s_net_refresh(); + } else if (chip == NCP_CHIP_THEME) { + /* 快捷主题:切到 manual(确保生效),再翻转 dark/light(display.theme)。 */ + int mode = THEME_MODE_MANUAL; + meow_settings_get_enum("display.theme_mode", &mode); + if (mode != THEME_MODE_MANUAL) meow_settings_set_enum("display.theme_mode", THEME_MODE_MANUAL); + int v = 0; meow_settings_get_enum("display.theme", &v); + meow_settings_set_enum("display.theme", v ? 0 : 1); + paint_sb_right(); /* 状态栏文字/底色随主题刷新 */ + meow_settings_save(); + return 1; /* 主题变化 → 重刷状态栏 */ + } else if (chip == NCP_CHIP_BRIGHT) { + /* 快捷亮度:在「极暗(下限)」与「100」之间切换。 */ + int cur = 0; meow_settings_get_int("display.brightness", &cur); + int vmin = 1; meow_settings_get_int("display.brightness_min", &vmin); + if (mnp_brightness_clamp(cur, vmin) < 100) { + meow_settings_set_int("display.brightness", 100); + write_brightness(100); + g_sys.brightness = 100; + } else { + meow_settings_set_int("display.brightness", vmin); + write_brightness(vmin); + g_sys.brightness = vmin; + } + paint_sb_right(); + } else if (chip == NCP_CHIP_VOL) { + /* 快捷音量:静音<->恢复上一次非零音量。 */ + static int last_nz = 60; + int cur = 0; meow_settings_get_int("audio.volume", &cur); + if (cur > 0) { last_nz = vol_clamp(cur); meow_settings_set_int("audio.volume", 0); } + else { meow_settings_set_int("audio.volume", vol_clamp(last_nz)); } + g_sys.vol = settings_volume_get(); + paint_sb_right(); + meow_dac_vol_flush(); /* 抬手=无条件直写真实 DAC */ + } + meow_settings_save(); + return 0; +} + +/* 绘制通知列表可见区(scroll=像素偏移)。每行:图标 + app名 + 标题 + 内容 + 时间 + 进度。 */ +static void ncp_draw_list(int scroll) +{ + const meow_ui_theme_t *th = s_ui_theme(); + if (g_nrows == 0) { + ui_draw(NCP_ROW_X + 8, NCP_LIST_TOP + 40, "暂无通知", th->on_surface_variant, 22); + return; + } + int total = g_nrows * NCP_ROW_H; + scroll = mnp_scroll_clamp(scroll, total, NCP_LIST_BOT - NCP_LIST_TOP); + for (int i = 0; i < g_nrows; i++) { + int ry = NCP_LIST_TOP + i * NCP_ROW_H - scroll; + if (ry + NCP_ROW_H < NCP_LIST_TOP || ry >= NCP_LIST_BOT) continue; /* 视口外整行跳过 */ + const ncp_row_t *r = &g_rows[i]; + meow_gfx_fill_round(NCP_ROW_X, ry, NCP_ROW_W, NCP_ROW_H - 6, 12, th->surface_container); + /* 图标 */ + int icx = NCP_ICON_X, icy = ry + (NCP_ROW_H - 32) / 2; + if (r->img) meow_ui_img_cover(icx, icy, 32, r->img); + else { + /* 回退:主题色圆点 + 首字符 */ + const char *nm = ncp_app_name(r->app_id); + ncp_dot(icx + 16, icy + 16, 16, th->primary); + char ch = nm[0] ? nm[0] : '?'; + char cbuf[4] = { ch, 0, 0, 0 }; + /* 首字符若是多字节(中文),取整码 */ + if ((unsigned char)ch >= 0x80 && nm[1]) { cbuf[1] = nm[1]; cbuf[2] = 0; + if ((unsigned char)ch >= 0xE0 && nm[2]) { cbuf[2] = nm[2]; cbuf[3] = 0; } } + int cw = ui_width(cbuf, 20); + ui_draw(icx + 16 - cw / 2, icy + 16 - meow_font_line_height(20) / 2, cbuf, 0xFFFFFF, 20); + } + /* app 名 + 时间 */ + ui_draw(NCP_TEXT_X, ry + 10, ncp_app_name(r->app_id), th->on_surface_variant, 16); + char tbuf[32]; mnp_time_ago(r->created_ms, (uint64_t)time(NULL) * 1000u, tbuf, sizeof tbuf); + ui_draw(NCP_ROW_X + NCP_ROW_W - 8 - ui_width(tbuf, 16), ry + 12, tbuf, th->on_surface_variant, 16); + /* 标题 + 内容 */ + ncp_text(NCP_TEXT_X, ry + 30, r->summary, 20, th->on_surface, NCP_TEXT_W); + ncp_text(NCP_TEXT_X, ry + 56, r->body, 18, th->on_surface_variant, NCP_TEXT_W); + /* 进度(progress>=0):细条 */ + if (r->progress >= 0) { + int px = NCP_TEXT_X, pw = NCP_TEXT_W, py = ry + NCP_ROW_H - 14; + fill_rect(px, py, pw, 4, th->surface_variant); + int fw = r->progress * pw / 100; + if (fw > 0) fill_rect(px, py, fw, 4, th->primary); + } + } + /* 滚动条 */ + if (total > NCP_LIST_BOT - NCP_LIST_TOP) { + int view = NCP_LIST_BOT - NCP_LIST_TOP; + int thumb_h = view * view / total; if (thumb_h < 24) thumb_h = 24; + int ty = NCP_LIST_TOP + (view - thumb_h) * scroll / (total - view); + meow_gfx_fill_round(fb_xres - 8, NCP_LIST_TOP, 5, view, 3, th->surface_container); + meow_gfx_fill_round(fb_xres - 8, ty, 5, thumb_h, 3, th->on_surface_variant); + } +} + +/* 绘制整个通知中心面板(画进 SDK back_buf;redraw_sb=1 时另绘状态栏在最顶)。 + * 性能:面板体单独;(0..27) 状态栏只在打开/主题变化时 redraw_sb=1 重绘,交互时跳过, + * 使脏区仅限面板体,绝不整屏重绘。 */ +static void draw_notif_center(int scroll, int redraw_sb) +{ + const meow_ui_theme_t *th = s_ui_theme(); + int W = fb_xres, H = fb_yres; + fill_rect(0, 0, W, H, th->surface); + /* 面板体(状态栏之下 surface_variant) */ + fill_rect(0, NCP_TOP, W, H - NCP_TOP, th->surface_variant); + + /* 把手 */ + int grab_w = 44, grab_x = (W - grab_w) / 2; + meow_gfx_fill_round(grab_x, NCP_GRAB_Y, grab_w, 6, 3, th->outline); + /* 标题 + 「上滑/点空白关闭」 提示 */ + ui_draw(24, NCP_TITLE_Y, "通知中心", th->on_surface, 22); + ui_draw(W - 24 - ui_width("点空白关闭", 16), NCP_TITLE_Y + 2, "点空白关闭", th->on_surface_variant, 16); + + /* 快捷开关行 */ + static const char *chip_lbl[NCP_CHIP_COUNT] = { "WiFi", "蓝牙", "主题", "亮度", "音量" }; + int total_chip = NCP_CHIP_N * NCP_CHIP_W + (NCP_CHIP_N - 1) * NCP_CHIP_GAP; + int chip_x0 = (W - total_chip) / 2; + for (int c = 0; c < NCP_CHIP_N; c++) { + int cx = chip_x0 + c * (NCP_CHIP_W + NCP_CHIP_GAP); + int on = 0; char val[16] = ""; ncp_chip_state(c, &on, val, sizeof val); + uint32_t bg = on ? th->primary : th->surface_container; + uint32_t fg = on ? 0xFFFFFF : th->on_surface_variant; + meow_gfx_fill_round(cx, NCP_CHIP_Y, NCP_CHIP_W, NCP_CHIP_H, 12, bg); + int icon_cx = cx + (NCP_CHIP_W - SB_ICON_SIZE) / 2; + int icon_cy = NCP_CHIP_Y + 14; + if (c == NCP_CHIP_WIFI) ncp_sb_icon(on ? SB_I_WIFI : SB_I_WIFI_OFF, icon_cx, icon_cy, fg, 22); + else if (c == NCP_CHIP_BT) ncp_sb_icon(on ? SB_I_BT : SB_I_BT_DIS, icon_cx, icon_cy, fg, 22); + else if (c == NCP_CHIP_THEME) { + if (on) ncp_dot(icon_cx + 16, icon_cy, 11, fg); + else { ncp_dot(icon_cx + 16, icon_cy, 11, fg); ncp_dot(icon_cx + 16, icon_cy, 6, bg); } + } + else if (c == NCP_CHIP_BRIGHT) ncp_sb_icon(SB_I_BRIGHT, icon_cx, icon_cy, fg, 22); + else if (c == NCP_CHIP_VOL) ncp_sb_icon(SB_I_VOL, icon_cx, icon_cy, fg, 22); + char label[24]; + snprintf(label, sizeof label, "%s", chip_lbl[c]); + if (val[0] && (c == NCP_CHIP_BRIGHT || c == NCP_CHIP_VOL)) + snprintf(label, sizeof label, "%.9s", val); /* chip 下示值 */ + ui_draw(cx + (NCP_CHIP_W - ui_width(label, 14)) / 2, NCP_CHIP_Y + NCP_CHIP_H - 18, + label, fg, 14); + } + + /* 亮度滑条 */ + int bmin = 1; meow_settings_get_int("display.brightness_min", &bmin); + int bval = 0; meow_settings_get_int("display.brightness", &bval); + bval = mnp_brightness_clamp(bval, bmin); + ui_draw(NCP_SLIDER_X, NCP_SL1_Y - 26, "亮度", th->on_surface, 18); + char vbb[16]; snprintf(vbb, sizeof vbb, "%d%%", bval); + ui_draw(NCP_SLIDER_X + NCP_SLIDER_W - ui_width(vbb, 18), NCP_SL1_Y - 26, vbb, + th->on_surface_variant, 18); + s_draw_slider(NCP_SLIDER_X, NCP_SL1_Y, NCP_SLIDER_W, bval, bmin, 100, th); + + /* 音量滑条 */ + int vval = 0; meow_settings_get_int("audio.volume", &vval); + vval = vol_clamp(vval); + ui_draw(NCP_SLIDER_X, NCP_SL2_Y - 26, "音量", th->on_surface, 18); + char vbl[16]; snprintf(vbl, sizeof vbl, "%d%%", vval); + ui_draw(NCP_SLIDER_X + NCP_SLIDER_W - ui_width(vbl, 18), NCP_SL2_Y - 26, vbl, + th->on_surface_variant, 18); + s_draw_slider(NCP_SLIDER_X, NCP_SL2_Y, NCP_SLIDER_W, vval, 0, vol_clamp(100), th); + + /* 分隔线 */ + fill_rect(12, NCP_DIV_Y, W - 24, 1, th->outline); + + /* 通知列表 */ + ncp_draw_list(scroll); + + /* 底部提示 */ + ui_draw((W - ui_width("上滑或点空白关闭", 16)) / 2, NCP_FOOT_Y, "上滑或点空白关闭", + th->on_surface_variant, 16); + + /* 状态栏画在面板体之上(0-27 单独由 draw_statusbar 维护/标脏,不落面板体脏区)。 + * 仅 redraw_sb=1(打开/主题变化)才重绘,交互时跳过以保持脏区只限面板体。 */ + if (redraw_sb) draw_statusbar(); +} + +/* 触摸滑条带命中:origin 落在 (slugX, slugY) 的滑条行带内。返回 1=命中。 */ +static int ncp_slider_band(int tx, int ty, int sy) +{ + return (tx >= NCP_SLIDER_X - 14 && tx <= NCP_SLIDER_X + NCP_SLIDER_W + 14 && + ty >= sy - 30 && ty <= sy + 24); +} + +/* 滑条值应用(拖动实时 set_*,save_now=抬手落盘;亮度 clamp、音量 clamp)。 */ +static void ncp_slider_apply(int which, int tx, int save_now) +{ + if (which == 1) { + int bmin = 1; meow_settings_get_int("display.brightness_min", &bmin); + int v = mnp_slider_val_from_x(tx, NCP_SLIDER_X, NCP_SLIDER_W, bmin, 100); + meow_settings_set_int("display.brightness", v); + write_brightness(v); + g_sys.brightness = v; + paint_sb_right(); + if (save_now) meow_settings_save(); + } else if (which == 2) { + int v = mnp_slider_val_from_x(tx, NCP_SLIDER_X, NCP_SLIDER_W, 0, + vol_clamp(settings_volume_max)); + meow_settings_set_int("audio.volume", v); + g_sys.vol = settings_volume_get(); + paint_sb_right(); + if (save_now) { meow_dac_vol_flush(); meow_settings_save(); } + else meow_dac_vol_write_throttled(); + } +} + +/* 通知点击:dismiss(标记阅读)+ 若 app 有 entry 记录则请求启动。返回 1=应关闭面板。 */ +static int ncp_row_tap(int tx, int ty, int scroll, int *want_launch) +{ + int eff = ty - NCP_LIST_TOP + scroll; + int row = mnp_row_at(eff, 0, g_nrows * NCP_ROW_H, NCP_ROW_H); + if (row < 0 || row >= g_nrows) return 0; + const ncp_row_t *r = &g_rows[row]; + meow_notif_dismiss(r->id); /* 点击 = 阅读,撤下 */ + /* 跳转:app entry 记录(apps[] 内且 ok)→ 记 want_launch(run_menu 走标准启动)。 + * target_activity 为后续 M3 导航预留下的跳转目标(activity 级路由后置)。 */ + if (want_launch) *want_launch = -1; + if (g_ncp_apps) + for (int i = 0; i < g_ncp_napps; i++) + if (!strcmp(g_ncp_apps[i].id, r->app_id) && g_ncp_apps[i].ok) { + if (want_launch) *want_launch = i; + break; + } + return 1; /* 点击即关(启动由 run_menu 执行;无记录则仅关闭) */ +} + +/* ---- 通知中心面板主循环(阻塞;参照 run_settings_page 交互惯用法)---- */ +static void run_notif_center(struct app *apps, int napps, int *want_launch) +{ + if (want_launch) *want_launch = -1; + int list_scroll = 0; + unsigned char evbuf16[16]; + g_ncp_apps = apps; g_ncp_napps = napps; + + struct keypoll kp_power, kp_keys; + kp_open(&kp_power, DEV_POWER); kp_open(&kp_keys, DEV_KEYS); + struct kd_state kd_vold, kd_volu, kd_play, kd_pwr; + memset(&kd_vold, 0, sizeof kd_vold); memset(&kd_volu, 0, sizeof kd_volu); + memset(&kd_play, 0, sizeof kd_play); memset(&kd_pwr, 0, sizeof kd_pwr); + int m_prev_vold = 0, m_prev_volu = 0, m_prev_play = 0, m_prev_pwr = 0; + for (int w = 0; w < KEYBUF_WORDS; w++) { + if (kp_keys.cur[w] & (1UL << (KEY_VOLUMEDOWN % 32))) m_prev_vold = 1; + if (kp_keys.cur[w] & (1UL << (KEY_VOLUMEUP % 32))) m_prev_volu = 1; + if (kp_keys.cur[w] & (1UL << (KEY_PLAYPAUSE % 32))) m_prev_play = 1; + if (kp_power.cur[w] & (1UL << (KEY_POWER % 32))) m_prev_pwr = 1; + } + int tfd = open(DEV_TOUCH, O_RDONLY | O_NONBLOCK); + if (tfd >= 0) { unsigned char ev[16]; while (read(tfd, ev, sizeof ev) == 16) {} } + unsigned long long touch_cooldown_until = now_ms() + 300; + unsigned long long last_tick = now_ms(); + unsigned long long last_act = now_ms(); + unsigned long long last_listchk = now_ms(); + + int td = 0, td_ok = 0, tdx = -1, tdy = -1, tlx = -1, tly = -1; + int drag_slider = 0; /* 0=无, 1=亮度, 2=音量 */ + int closed = 0; /* 本次触发放置:关面板(跳回 run_menu) */ + int after_modal = 0; /* 电源菜单返回:整帧重绘还原被 dim 的状态栏 */ + int wake_suppress = 0; + unsigned long long pwr_hold_at = 0; + int pwr_menu_state = 0, pwr_woke = 0, pwr_suppress_click = 0; + + int need_sb = 1; /* 打开/主题变化时重绘状态栏;其余交互跳过(脏区只限面板体) */ + + /* 首次绘制 */ + ncp_refresh_rows(); + list_scroll = mnp_scroll_clamp(0, g_nrows * NCP_ROW_H, NCP_LIST_BOT - NCP_LIST_TOP); + draw_notif_center(list_scroll, 1); + meow_dirty_full(); meow_ui_flush(); + need_sb = 0; + + for (;;) { + unsigned long long now = now_ms(); + if (sigterm_flag) break; + int need_paint = 0; + + /* 自动息屏(同设置页语义) */ + if (meow_auto_slept && !meow_screen_on) { + kp_poll(&kp_power, NULL, NULL); kp_poll(&kp_keys, NULL, NULL); + int wak = 0; + for (int w = 0; w < KEYBUF_WORDS; w++) { + if (kp_power.cur[w] & (1UL << (KEY_POWER % 32))) wak = 1; + if (kp_keys.cur[w] & (1UL << (KEY_VOLUMEDOWN % 32))) wak = 1; + if (kp_keys.cur[w] & (1UL << (KEY_VOLUMEUP % 32))) wak = 1; + if (kp_keys.cur[w] & (1UL << (KEY_PLAYPAUSE % 32))) wak = 1; + } + if (!wak && screen_off_mode == 1 && tfd >= 0) { + struct pollfd spfd = { tfd, POLLIN, 0 }; + if (poll(&spfd, 1, 0) > 0) { + unsigned char ev[16]; + while (read(tfd, ev, sizeof ev) == 16) { + uint16_t type = *(uint16_t *)(ev + 8), code = *(uint16_t *)(ev + 10); + int32_t val = *(int32_t *)(ev + 12); + if (type == EV_KEY && code == BTN_TOUCH && val) wak = 1; + } + } + } + if (wak) { + meow_panel_on(); meow_auto_slept = 0; wake_suppress = 1; last_act = now_ms(); + memset(&kd_pwr, 0, sizeof kd_pwr); memset(&kd_vold, 0, sizeof kd_vold); + memset(&kd_volu, 0, sizeof kd_volu); memset(&kd_play, 0, sizeof kd_play); + kp_poll(&kp_power, NULL, NULL); kp_poll(&kp_keys, NULL, NULL); + m_prev_pwr = kp_is_down(&kp_power, KEY_POWER); + m_prev_vold = kp_is_down(&kp_keys, KEY_VOLUMEDOWN); + m_prev_volu = kp_is_down(&kp_keys, KEY_VOLUMEUP); + m_prev_play = kp_is_down(&kp_keys, KEY_PLAYPAUSE); + touch_cooldown_until = now_ms() + 300; + td = 0; td_ok = 0; drag_slider = 0; tlx = tly = -1; + draw_notif_center(list_scroll, 1); + meow_dirty_full(); meow_ui_flush(); + need_sb = 0; + } + usleep(POLL_MS * 1000); + continue; + } + + /* 按键:系统语义(APP §3.4.1 红线——不映射返回/确认) */ + kp_poll(&kp_power, NULL, NULL); kp_poll(&kp_keys, NULL, NULL); + int vold = 0, volu = 0, play = 0, pwr = 0; + for (int w = 0; w < KEYBUF_WORDS; w++) { + if (kp_keys.cur[w] & (1UL << (KEY_VOLUMEDOWN % 32))) vold = 1; + if (kp_keys.cur[w] & (1UL << (KEY_VOLUMEUP % 32))) volu = 1; + if (kp_keys.cur[w] & (1UL << (KEY_PLAYPAUSE % 32))) play = 1; + if (kp_power.cur[w] & (1UL << (KEY_POWER % 32))) pwr = 1; + } + (void)kd_tick(&kd_vold, vold); (void)kd_tick(&kd_volu, volu); + (void)kd_tick(&kd_play, play); (void)kd_tick(&kd_pwr, pwr); + vold = kd_vold.stable; volu = kd_volu.stable; + play = kd_play.stable; pwr = kd_pwr.stable; + if (wake_suppress) { + if (!pwr && !vold && !volu && !play) wake_suppress = 0; + } else { + if (vold && !m_prev_vold) { settings_volume_adj(-settings_volume_step); need_paint = 1; } + if (volu && !m_prev_volu) { settings_volume_adj(+settings_volume_step); need_paint = 1; } + if (play && !m_prev_play) { + logmsg("notif-center: play key caught (media-reserved, no exit)"); + last_act = now; + } + if (pwr && !m_prev_pwr) { + pwr_hold_at = now; pwr_menu_state = 0; pwr_suppress_click = 0; last_act = now; + if (meow_auto_slept && !meow_screen_on) pwr_woke = 1; + } + if (pwr && pwr_hold_at) { + if (now - pwr_hold_at >= power_forceoff_ms && !pwr_menu_state) { + if (sim_no_exec) logmsg("notif-center pm: [sim-no-exec] hold %dms -> would forceoff", power_forceoff_ms); + else { logmsg("notif-center pm: hold %dms -> force poweroff", power_forceoff_ms); sys_do_reboot(LINUX_REBOOT_CMD_POWER_OFF); } + } else if (now - pwr_hold_at >= power_longpress_menu_ms && !pwr_menu_state) { + pwr_menu_state = 1; + logmsg("notif-center pm: hold %dms -> power menu", power_longpress_menu_ms); + show_power_menu(); + last_act = now_ms(); + pwr_hold_at = 0; pwr_menu_state = 0; pwr_woke = 0; pwr_suppress_click = 1; + memset(&kd_pwr, 0, sizeof kd_pwr); memset(&kd_vold, 0, sizeof kd_vold); + memset(&kd_volu, 0, sizeof kd_volu); memset(&kd_play, 0, sizeof kd_play); + kp_poll(&kp_power, NULL, NULL); kp_poll(&kp_keys, NULL, NULL); + m_prev_pwr = kp_is_down(&kp_power, KEY_POWER); + m_prev_vold = kp_is_down(&kp_keys, KEY_VOLUMEDOWN); + m_prev_volu = kp_is_down(&kp_keys, KEY_VOLUMEUP); + m_prev_play = kp_is_down(&kp_keys, KEY_PLAYPAUSE); + after_modal = 1; need_paint = 1; + goto ncp_keys_seeded; + } + } + if (!pwr && m_prev_pwr) { + if (pwr_suppress_click) + logmsg("notif-center pm: release after menu -> no toggle"); + else if (pwr_hold_at && (now - pwr_hold_at < power_longpress_menu_ms) && !pwr_menu_state && !pwr_woke) { + logmsg("notif-center pm: single-click -> toggle panel"); + meow_toggle_panel(); meow_auto_slept = 0; last_act = now_ms(); need_paint = 1; + } else if (pwr_woke) { + logmsg("notif-center pm: release after wake -> no toggle"); + } + pwr_hold_at = 0; pwr_menu_state = 0; pwr_woke = 0; pwr_suppress_click = 0; + } + } + if (vol_ramp_dir != 0) { + int held = (vol_ramp_dir > 0) ? volu : vold; + int going = vol_ramp_tick(held); + g_sys.vol = settings_volume_get(); + paint_sb_right(); + need_paint = 1; + if (!going) logmsg("notif-center vol ramp end -> %d", g_sys.vol); + } + m_prev_vold = vold; m_prev_volu = volu; m_prev_play = play; m_prev_pwr = pwr; + ncp_keys_seeded: + ; + + /* 触摸 */ + if (tfd >= 0 && meow_screen_on) { + struct pollfd pfd = { tfd, POLLIN, 0 }; + if (poll(&pfd, 1, 0) > 0) { + while (read(tfd, evbuf16, sizeof evbuf16) == 16) { + uint16_t type = *(uint16_t *)(evbuf16 + 8), code = *(uint16_t *)(evbuf16 + 10); + int32_t val = *(int32_t *)(evbuf16 + 12); + if (type == EV_ABS) { + if (code == ABS_X || code == ABS_MT_POSITION_X) tlx = val; + else if (code == ABS_Y || code == ABS_MT_POSITION_Y) tly = val; + if (td && !td_ok && tlx >= 0 && tly >= 0) { + tdx = tlx; tdy = tly; td_ok = 1; + /* 按下原点落在滑条带 → 开始拖动 */ + if (drag_slider == 0) { + if (ncp_slider_band(tlx, tly, NCP_SL1_Y)) { drag_slider = 1; ncp_slider_apply(1, tlx, 0); } + else if (ncp_slider_band(tlx, tly, NCP_SL2_Y)) { drag_slider = 2; ncp_slider_apply(2, tlx, 0); } + } + } + if (drag_slider == 1 && td_ok) { ncp_slider_apply(1, tlx, 0); need_paint = 1; } + else if (drag_slider == 2 && td_ok) { ncp_slider_apply(2, tlx, 0); need_paint = 1; } + } else if (type == EV_KEY && code == BTN_TOUCH) { + if (val && !td) { + if (now_ms() < touch_cooldown_until) { tlx = tly = -1; } + else { td = 1; td_ok = 0; tlx = -1; tly = -1; drag_slider = 0; } + } else if (!val && td) { + td = 0; + if (drag_slider) { /* 滑条拖动结束 → 落盘 */ + ncp_slider_apply(drag_slider, tlx >= 0 ? tlx : tdx, 1); + drag_slider = 0; need_paint = 1; + } else if (td_ok) { + int dx = tlx - tdx, dy = tly - tdy; + int adx = dx < 0 ? -dx : dx, ady = dy < 0 ? -dy : dy; + /* 左缘左滑 = 关闭(复用全局左缘返回语义) */ + if (meow_edge_back(tdx, dx, dy)) { closed = 1; break; } + if (adx < 60 && ady < 60) { /* tap */ + int tx = tdx, ty = tdy; + int hit = 0; + for (int c = 0; c < NCP_CHIP_COUNT; c++) + if (ncp_chip_hit(c, tx, ty)) { + if (ncp_chip_apply(c)) need_sb = 1; /* 主题变化 → 重刷状态栏 */ + hit = 1; need_paint = 1; break; + } + if (!hit && ncp_slider_band(tx, ty, NCP_SL1_Y)) { ncp_slider_apply(1, tx, 1); hit = 1; need_paint = 1; } + else if (!hit && ncp_slider_band(tx, ty, NCP_SL2_Y)) { ncp_slider_apply(2, tx, 1); hit = 1; need_paint = 1; } + if (!hit && ty >= NCP_LIST_TOP && ty < NCP_LIST_BOT) { + if (ncp_row_tap(tx, ty, list_scroll, want_launch)) { + hit = 1; + closed = 1; /* 点击通知:dismiss + 记录启动 → 关面板 */ + break; + } + } + if (!hit) { closed = 1; break; } /* 点空白(标题/把手/提示/分隔线/列表外)→ 关闭 */ + } else if (mnp_vertical_up(dx, dy, MENU_SWIPE_THRESH)) { + closed = 1; break; /* 面板内上滑 → 关闭 */ + } + /* 其余横滑/下滑忽略(不关闭不动作) */ + } + td_ok = 0; + } + } + } + } + } + if (closed) break; /* 上滑 / 点空白 / 左缘左滑 / 通知点击 → 关面板返回 run_menu */ + + /* 列表变化检测:~500ms 对比 count;变化重采集 + 重绘列表区 */ + if (now - last_listchk >= 500) { + last_listchk = now; + meow_notif_tick(); + if (ncp_rows_changed()) { + ncp_refresh_rows(); + list_scroll = mnp_scroll_clamp(list_scroll, g_nrows * NCP_ROW_H, + NCP_LIST_BOT - NCP_LIST_TOP); + need_paint = 1; + } + } + + /* 重绘(面板体区域;状态栏 0-27 由 draw_statusbar 单独维护,不落入此脏区)。 + * need_sb=1(打开/主题变化)时 draw_notif_center 内另绘状态栏并标其脏——脏区仍 + * 只含「面板体 + 28px 状态栏」两带,绝不整屏重绘。 */ + if (need_paint) { + last_act = now; + draw_notif_center(list_scroll, need_sb); + need_sb = 0; + if (after_modal) { meow_dirty_full(); after_modal = 0; } + else meow_dirty_add(0, NCP_TOP, fb_xres, fb_yres - NCP_TOP); + meow_ui_flush(); + } + /* ~1s 状态栏时钟 */ + if (now - last_tick >= 1000) { + last_tick = now; + draw_clock(); + fb_norm_buf0(); + meow_ui_flush(); + } + usleep(POLL_MS * 1000); + } + if (tfd >= 0) close(tfd); + kp_close(&kp_power); kp_close(&kp_keys); + ncp_rows_free(); + logmsg("notification center closed"); +} + /* Bring the panel up for the menu, but ONLY when it is actually dark: * brightness 0 (the player's own screen-off/standby writes brightness 0 * then FBIOBLANK(4); on this device bl_power stays 0, so brightness==0 is diff --git a/patch_v2/meow_launcherd/meow_notif_panel.h b/patch_v2/meow_launcherd/meow_notif_panel.h new file mode 100644 index 0000000..4912891 --- /dev/null +++ b/patch_v2/meow_launcherd/meow_notif_panel.h @@ -0,0 +1,116 @@ +/* meow_notif_panel.h — 通知中心面板的纯逻辑(header-only,宿主可单测)。 + * + * 定位:把通知中心面板里「无副作用、可独立判定」的部分抽成 static inline, + * 供 launcher(meow_launcherd.c 内嵌面板)与宿主单测(test_notif_panel.c)共用同一份实现, + * 避免两端漂移;绘制/触摸循环等依赖 launcher static 符号的部分留在 meow_launcherd.c 内。 + * + * 不依赖 launcher 头 / SDK 头,仅 —— 纯宿主可编。 + */ +#ifndef MEOW_NOTIF_PANEL_H +#define MEOW_NOTIF_PANEL_H + +#include +#include +#include +#include + +/* ---- 手势判定 ---- */ + +/* 左缘宽度:与 launcher meow_touch.h MEOW_EDGE_W(24) / SDK 全局左缘返回同口径。 + * 顶部下滑打开通知中心时,左缘起点保留给「左缘返回」,不与其抢占(spec-ref §5.1)。 */ +#ifndef MNP_EDGE_W +#define MNP_EDGE_W 24 +#endif + +/* 顶部热区下滑 → 打开通知中心(纯函数)。 + * down_x/down_y=抬手原点;dx/dy=抬手位移(当前-原点,即 t_last - t_down);hotzone=顶部热区高 + * (launcher=SB_BAR_H=28);thresh=下滑触发位移阈值(launcher=MENU_SWIPE_THRESH=65)。 + * 返回 1=应打开。约束:起点不在左缘(down_x>=MNP_EDGE_W,左缘保留给返回)+ 起点落在顶部热区 + * (down_y ∈ [0,hotzone))+ 向下主导(dy>=thresh 且 |dy|>|dx|)。调用方通常先判左缘返回 + * (meow_edge_back)+ 本函数,两者互斥。 */ +static inline int mnp_top_swipe_down(int down_x, int down_y, int dx, int dy, + int hotzone, int thresh) +{ + if (down_x < MNP_EDGE_W) return 0; /* 左缘保留给返回手势 */ + if (down_y < 0 || down_y >= hotzone) return 0; + if (dy < thresh) return 0; /* 未达下滑阈值 / 向上 */ + int ax = dx < 0 ? -dx : dx; + return ax < dy; /* 向下主导(横向位移小于竖向) */ +} + +/* 竖向主导上滑(面板内关闭):dy<=-thresh 且 |dy|>|dx|。返回 1=应关闭。 */ +static inline int mnp_vertical_up(int dx, int dy, int thresh) +{ + if (dy > -thresh) return 0; + int ax = dx < 0 ? -dx : dx; + return ax < -dy; +} + +/* ---- 滑条 ---- */ + +/* 滑条值映射:px(屏幕坐标)→ 值,clamp 到 [min,max]。sx=track 左缘、sw=track 宽。 + * 与 launcher 设置页 s_slider_val_from_x 同构(此处参数化,供面板亮度/音量滑条与单测用)。 */ +static inline int mnp_slider_val_from_x(int px, int sx, int sw, int min, int max) +{ + int range = max - min; + int v = min + (range ? (px - sx) * range / sw : 0); + if (v < min) v = min; + if (v > max) v = max; + return v; +} + +/* ---- 亮度 clamp ---- */ + +/* 亮度 clamp:下限 vmin(=display.brightness_min,≥1 防黑屏)、上限 100(防闪屏)。 + * vmin<1 时钳到 1。与 SYSTEM_SETTINGS §1 / spec-ref A-3 一致(旧文档 25 为陈旧值)。 */ +static inline int mnp_brightness_clamp(int v, int vmin) +{ + if (vmin < 1) vmin = 1; + if (v < vmin) v = vmin; + if (v > 100) v = 100; + return v; +} + +/* ---- 时间显示 ---- */ + +/* 通知时间(created_ms 墙钟 epoch ms)→ 显示串。 + * <60s「刚刚」;<60min「N分钟前」;否则本地「HH:MM」。now_ms=当前墙钟 epoch ms。 */ +static inline void mnp_time_ago(uint64_t created_ms, uint64_t now_ms, char *buf, int len) +{ + if (!buf || len <= 0) return; + if (now_ms < created_ms) now_ms = created_ms; /* 时钟回拨防御 */ + uint64_t diff = now_ms - created_ms; + if (diff < 60000u) { if (len >= 1) snprintf(buf, (size_t)len, "刚刚"); return; } + if (diff < 3600000u) { + snprintf(buf, (size_t)len, "%llu分钟前", (unsigned long long)(diff / 60000u)); + return; + } + time_t t = (time_t)(created_ms / 1000u); + struct tm tm; + if (localtime_r(&t, &tm)) + snprintf(buf, (size_t)len, "%02d:%02d", tm.tm_hour, tm.tm_min); + else if (len >= 1) snprintf(buf, (size_t)len, "--:--"); +} + +/* ---- 列表命中 ---- */ + +/* 通知列表行命中:y 为绝对纵坐标;list_top/list_bot 为列表区上下缘;row_h 为行高。 + * 返回行号(0 起);越界返回 -1。 */ +static inline int mnp_row_at(int y, int list_top, int list_bot, int row_h) +{ + if (y < list_top || y >= list_bot) return -1; + int r = (y - list_top) / row_h; + return r; +} + +/* 列表滚动 clainmp:把 scroll 钳到 [0, total-view]。content 高度=total(总行数*row_h)。 */ +static inline int mnp_scroll_clamp(int scroll, int total, int view) +{ + if (total <= view) return 0; + int mx = total - view; + if (scroll < 0) scroll = 0; + if (scroll > mx) scroll = mx; + return scroll; +} + +#endif /* MEOW_NOTIF_PANEL_H */ diff --git a/patch_v2/meow_launcherd/test_notif_panel.c b/patch_v2/meow_launcherd/test_notif_panel.c new file mode 100644 index 0000000..2355798 --- /dev/null +++ b/patch_v2/meow_launcherd/test_notif_panel.c @@ -0,0 +1,236 @@ +/* test_notif_panel.c — 宿主单测:阶段B 通知中心面板(纯逻辑 + 面板读取的存储契约)。 + * + * 直接 #include "meow_notif.c" + "meow_settings.c" 于同一 TU(同 test_notif_tf.c 手法), + * 以「真实 meow_notif 存储 + 真实 meow_settings 后端」验证面板真正读取的字段契约; + * 再测 meow_notif_panel.h 的纯逻辑(滑条映射/亮度 clamp/顶部下滑判定/时间显示/行命中/滚动钳位)。 + * 不依赖 launcher 其它 static / fb / 触摸。 + * + * 运行:gcc -D_GNU_SOURCE -o test_notif_panel test_notif_panel.c && ./test_notif_panel + */ +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include + +/* stub:meow_notif.c 的 read_quota() 经 meow_settings_get_int 读 notify.* 配额。 + * <0 => 键缺失 => 用默认(MEOW_NOTIF_CATS_DEF=4 / CAT_QUOTA_DEF=4 / MEDIA_QUOTA_DEF=1)。 + * meow_notif.c 对 meow_settings 的唯一依赖就是这一个函数。 */ +int meow_settings_get_int(const char *key, int *out) +{ + (void)key; (void)out; + return -2; /* MEOW_ERR_NOENT */ +} + +/* 先把 tf 转储路径指向临时目录,避免污染真实卡路径(meow_notif_init 会 clear tf)*/ +static char g_tflog[600]; + +#include "meow_notif.c" /* 真实通知存储:post/list/count/dismiss/update_progress/... */ +#include "meow_notif_panel.h" /* 面板纯逻辑(header-only) */ + +static int g_fail = 0; +#define CHECK(cond, msg) do { \ + if (!(cond)) { fprintf(stderr, "FAIL: %s (%s:%d)\n", msg, __FILE__, __LINE__); g_fail++; } \ + else fprintf(stderr, "ok: %s\n", msg); \ +} while (0) + +/* 收集列表到固定槽(回调式,模拟面板 ncp_collect_cb 的字段读取) */ +#define MAXG 16 +typedef struct { uint32_t id; char summary[96]; char body[96]; char icon[64]; + char app[48]; char tgt[48]; int progress; uint8_t urgency; uint64_t ms; } gslot_t; +static gslot_t g_got[MAXG]; static int g_nslots = 0; +static int list_grab_cb(const meow_notif_t *n, void *ctx) +{ + (void)ctx; + if (g_nslots >= MAXG) return 1; + gslot_t *s = &g_got[g_nslots++]; + memset(s, 0, sizeof *s); + s->id = n->id; + snprintf(s->summary, sizeof s->summary, "%s", n->summary); + snprintf(s->body, sizeof s->body, "%s", n->body); + snprintf(s->icon, sizeof s->icon, "%s", n->app_icon); + snprintf(s->app, sizeof s->app, "%s", n->app_id); + snprintf(s->tgt, sizeof s->tgt, "%s", n->target_activity); + s->progress = n->progress; + s->urgency = n->urgency; + s->ms = n->created_ms; + return 0; +} +static int grab_list(void) +{ + g_nslots = 0; + meow_notif_list(NULL, list_grab_cb, NULL); + return g_nslots; +} +static gslot_t *find_slot(const char *summary) +{ + for (int i = 0; i < g_nslots; i++) + if (!strcmp(g_got[i].summary, summary)) return &g_got[i]; + return NULL; +} + +static uint64_t wall_now_ms(void) +{ + struct timespec ts; clock_gettime(CLOCK_REALTIME, &ts); + return (uint64_t)ts.tv_sec * 1000 + (uint64_t)ts.tv_nsec / 1000000; +} + +static void test_pure_logic(void) +{ + fprintf(stderr, "--- P1 pure logic ---\n"); + /* mnp_top_swipe_down */ + CHECK(mnp_top_swipe_down(40, 5, 3, 90, 28, 65) == 1, "top hotzone down-dominant -> open"); + CHECK(mnp_top_swipe_down(10, 5, 3, 90, 28, 65) == 0, "left-edge (down_x<24) reserved -> no open"); + CHECK(mnp_top_swipe_down(40, 30, 3, 90, 28, 65) == 0, "origin below hotzone -> no open"); + CHECK(mnp_top_swipe_down(40, 5, 3, 40, 28, 65) == 0, "below swipe threshold -> no open"); + CHECK(mnp_top_swipe_down(40, 5, 100, 70, 28, 65) == 0, "horizontal-dominant -> no open"); + CHECK(mnp_top_swipe_down(40, 5, -3, 90, 28, 65) == 1, "down with minor left drift still opens"); + + /* mnp_slider_val_from_x */ + CHECK(mnp_slider_val_from_x(20, 20, 440, 1, 100) == 1, "slider x=left -> min"); + CHECK(mnp_slider_val_from_x(460, 20, 440, 1, 100) == 100, "slider x=right -> max"); + int mid = mnp_slider_val_from_x(240, 20, 440, 1, 100); + CHECK(mid >= 1 && mid <= 100, "slider x=mid within [min,max]"); + CHECK(mnp_slider_val_from_x(0, 20, 440, 1, 100) == 1, "slider x out-left clamped to min"); + CHECK(mnp_slider_val_from_x(999, 20, 440, 1, 100) == 100, "slider x out-right clamped to max"); + + /* mnp_brightness_clamp */ + CHECK(mnp_brightness_clamp(0, 1) == 1, "brightness clamp below min -> min"); + CHECK(mnp_brightness_clamp(150, 1) == 100, "brightness clamp above 100 -> 100"); + CHECK(mnp_brightness_clamp(50, 1) == 50, "brightness 50 kept"); + CHECK(mnp_brightness_clamp(3, 5) == 5, "brightness below custom min -> custom min"); + CHECK(mnp_brightness_clamp(-7, -3) == 1, "brightness clamp forces vmin>=1"); + + /* mnp_time_ago */ + uint64_t now = wall_now_ms(); + char tb[32]; + mnp_time_ago(now - 5000, now, tb, sizeof tb); + CHECK(!strcmp(tb, "刚刚"), "time_ago <60s -> 刚刚"); + mnp_time_ago(now - 5 * 60000u, now, tb, sizeof tb); + CHECK(!strcmp(tb, "5分钟前"), "time_ago 5min -> 5分钟前"); + mnp_time_ago(now - 3 * 3600000u, now, tb, sizeof tb); + CHECK(strlen(tb) == 5 && tb[2] == ':', "time_ago >1h -> HH:MM"); + + /* mnp_row_at */ + CHECK(mnp_row_at(250, 252, 696, 92) == -1, "row_at above list -> -1"); + CHECK(mnp_row_at(300, 252, 696, 92) == 0, "row_at first row -> 0"); + CHECK(mnp_row_at(400, 252, 696, 92) == 1, "row_at second row -> 1"); + CHECK(mnp_row_at(700, 252, 696, 92) == -1, "row_at below list -> -1"); + + /* mnp_scroll_clamp */ + CHECK(mnp_scroll_clamp(0, 2000, 444) == 0, "scroll clamp lower -> 0"); + CHECK(mnp_scroll_clamp(9999, 2000, 444) == 1556, "scroll clamp upper -> total-view"); + CHECK(mnp_scroll_clamp(-5, 2000, 444) == 0, "scroll clamp negative -> 0"); + CHECK(mnp_scroll_clamp(5, 400, 444) == 0, "content fits view -> 0"); +} + +static void test_storage_contract(void) +{ + fprintf(stderr, "--- P0 storage contract (panel reads) ---\n"); + /* meow_notif_init:应清内存表 + 清 tf 文件(路径已指临时);配额用默认(stub 返回 NOENT) */ + CHECK(meow_notif_init() == NOTIF_OK, "meow_notif_init ok"); + CHECK(meow_notif_count(NULL) == 0, "init clears memory table"); + CHECK(g_max_cats == 4 && g_cat_quota == 4 && g_media_quota == 1, + "quota defaults from meow_settings backend (stub NOENT -> defaults)"); + + meow_notif_t n; memset(&n, 0, sizeof n); + snprintf(n.app_id, sizeof n.app_id, "os.meow.hello"); + snprintf(n.category, sizeof n.category, "general"); + snprintf(n.summary, sizeof n.summary, "你好世界"); + snprintf(n.body, sizeof n.body, "这是正文第二行"); + snprintf(n.app_icon, sizeof n.app_icon, "apps/os.meow.hello/icon.png"); + snprintf(n.target_activity, sizeof n.target_activity, "activity_main"); + n.expire_timeout = 0; n.progress = -1; n.urgency = 1; + uint32_t id1 = 0; + CHECK(meow_notif_post(&n, &id1) == NOTIF_OK, "post general ok"); + CHECK(id1 != 0, "post assigns id"); + + /* 媒体通知:ongoing + 进度 */ + memset(&n, 0, sizeof n); + snprintf(n.app_id, sizeof n.app_id, "os.meow.hello"); + snprintf(n.category, sizeof n.category, "media"); + snprintf(n.summary, sizeof n.summary, "正在播放"); + n.expire_timeout = 0xFFFFFFFFu; n.ongoing = 1; n.progress = 20; n.urgency = 2; + uint32_t id2 = 0; + CHECK(meow_notif_post(&n, &id2) == NOTIF_OK, "post media ok"); + + /* 高紧急 + 进度 */ + memset(&n, 0, sizeof n); + snprintf(n.app_id, sizeof n.app_id, "system"); + snprintf(n.category, sizeof n.category, "event"); + snprintf(n.summary, sizeof n.summary, "系统提醒"); + snprintf(n.body, sizeof n.body, "电量低"); + n.progress = 50; n.urgency = 3; + uint32_t id3 = 0; + CHECK(meow_notif_post(&n, &id3) == NOTIF_OK, "post event(high) ok"); + + CHECK(meow_notif_count(NULL) == 3, "count == 3 after posts"); + + /* 遍历(面板 ncp_collect_cb 同款字段读取)*/ + int got = grab_list(); + CHECK(got == 3, "list returns 3 active notifs"); + + gslot_t *s1 = find_slot("你好世界"); + CHECK(s1 != NULL, "panel sees summary 你好世界"); + if (s1) { + CHECK(!strcmp(s1->app, "os.meow.hello"), "app_id"); + CHECK(!strcmp(s1->body, "这是正文第二行"), "body"); + CHECK(!strcmp(s1->icon, "apps/os.meow.hello/icon.png"), "app_icon"); + CHECK(!strcmp(s1->tgt, "activity_main"), "target_activity"); + CHECK(s1->progress == -1, "general progress=-1 (none)"); + CHECK(s1->urgency == 1, "general urgency=NORMAL(1)"); + CHECK(s1->ms > 0, "created_ms set"); + } + gslot_t *s2 = find_slot("正在播放"); + CHECK(s2 != NULL && s2->progress == 20 && s2->urgency == 2, "media progress=20 urgency=HIGH(2)"); + gslot_t *s3 = find_slot("系统提醒"); + CHECK(s3 != NULL && s3->progress == 50 && s3->urgency == 3, "event progress=50 urgency=CRITICAL(3)"); + + /* dismiss → 面板列表减一(点通知=阅读)*/ + CHECK(meow_notif_dismiss(id1) == NOTIF_OK, "dismiss general ok"); + CHECK(meow_notif_count(NULL) == 2, "count == 2 after dismiss"); + grab_list(); + CHECK(find_slot("你好世界") == NULL, "dismissed notif no longer listed"); + + /* 里程碑 100% → 释放(非 ONGOING):面板列表再减一 */ + CHECK(meow_notif_update_progress(id3, 100) == NOTIF_OK, "update_progress(100) ok"); + CHECK(meow_notif_count(NULL) == 1, "milestone released event slot -> count 1"); + grab_list(); + CHECK(find_slot("系统提醒") == NULL, "100% milestone notif no longer listed"); + + /* 剩余媒体通知仍活跃(ONGOING 常驻)*/ + CHECK(find_slot("正在播放") != NULL, "ongoing media stays listed"); + + /* 配额:单 app 媒体单例(media_quota=1)——再发一条 media 顶掉旧媒体 */ + memset(&n, 0, sizeof n); + snprintf(n.app_id, sizeof n.app_id, "os.meow.hello"); + snprintf(n.category, sizeof n.category, "media"); + snprintf(n.summary, sizeof n.summary, "下一首"); + n.expire_timeout = 0xFFFFFFFFu; n.ongoing = 1; n.progress = 60; + uint32_t id4 = 0; + CHECK(meow_notif_post(&n, &id4) == NOTIF_OK, "post second media ok"); + CHECK(meow_notif_count(NULL) == 1, "media quota=1 -> old media replaced, count stays 1"); + grab_list(); + CHECK(find_slot("下一首") != NULL && find_slot("正在播放") == NULL, + "media singleton replaced oldest"); +} + +int main(void) +{ + char tmp[] = "/tmp/meow_notif_panel_XXXXXX"; + char *dir = mkdtemp(tmp); + if (!dir) { perror("mkdtemp"); return 2; } + snprintf(g_tflog, sizeof g_tflog, "%s/notif.log", dir); + meow_notif_set_tf_path(g_tflog); + meow_notif_set_tf_max(1024 * 1024); + + test_pure_logic(); + test_storage_contract(); + + unlink(g_tflog); rmdir(dir); + + fprintf(stderr, "\n%s (failures=%d)\n", g_fail ? "== TEST FAILED ==" : "== TEST PASSED ==", g_fail); + return g_fail ? 1 : 0; +}