From 19a001f007787dafeaea02486c0d14850c69700e Mon Sep 17 00:00:00 2001 From: MeowOS Dev Date: Sun, 30 Aug 2026 14:14:30 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=A8=E5=B1=8F=E6=BB=91=E6=9D=A1=E7=BB=9F?= =?UTF-8?q?=E4=B8=80=E8=B7=AF=E5=BE=84+=E5=AF=B9=E6=AF=94=E8=89=B2(112/115?= =?UTF-8?q?)=20+=20=E5=AD=97=E4=BD=93=E7=B4=A2=E5=BC=95+=E6=9F=A5=E5=88=97?= =?UTF-8?q?=E8=A1=A8+=E4=B8=A2=E5=A4=B1=E9=99=8D=E7=BA=A7(113)=20+=20?= =?UTF-8?q?=E6=96=87=E6=A1=A3=E5=88=B7=E6=96=B0(114)=20+=20svcd=20CLI?= =?UTF-8?q?=E6=96=87=E6=A1=A3+mips-repo=E6=8B=86bins/mpk(116)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 18 +- docs/MEOWOS_SPEC_REF.md | 43 ++-- font/meow_font.c | 194 +++++++++++++++++++ font/meow_font.h | 48 +++++ mips-repo/README.md | 93 +++++++-- mips-repo/{ => bins}/mdnsd/bin/mdnsd | Bin mips-repo/{ => bins}/mdnsd/bin/mdnsd.bin | Bin mips-repo/{ => bins}/mdnsd/build.sh | 0 mips-repo/{ => bins}/mdnsd/manifest.md | 0 mips-repo/{ => bins}/meow_mdns/bin/meow_mdns | Bin mips-repo/{ => bins}/meow_mdns/build.sh | 0 mips-repo/{ => bins}/meow_mdns/manifest.md | 0 mips-repo/{ => bins}/meow_mdns/meow_mdns.c | 0 mips-repo/mpk/README.md | 49 +++++ patch_v2/hello_app/hello | Bin 194044 -> 197628 bytes patch_v2/meow_launcherd/meow_font.h | 48 +++++ patch_v2/meow_launcherd/meow_launcherd | Bin 387484 -> 392700 bytes patch_v2/meow_launcherd/meow_launcherd.c | 157 +++++++++++---- patch_v2/meow_svcd/meow_svcd.md | 26 +++ patch_v2/sdk/meow_ui.h | 35 ++++ patch_v2/sdk/meow_ui_gfx.c | 27 +-- patch_v2/sdk/meow_ui_input.c | 57 ++---- 22 files changed, 666 insertions(+), 129 deletions(-) rename mips-repo/{ => bins}/mdnsd/bin/mdnsd (100%) rename mips-repo/{ => bins}/mdnsd/bin/mdnsd.bin (100%) rename mips-repo/{ => bins}/mdnsd/build.sh (100%) rename mips-repo/{ => bins}/mdnsd/manifest.md (100%) rename mips-repo/{ => bins}/meow_mdns/bin/meow_mdns (100%) rename mips-repo/{ => bins}/meow_mdns/build.sh (100%) rename mips-repo/{ => bins}/meow_mdns/manifest.md (100%) rename mips-repo/{ => bins}/meow_mdns/meow_mdns.c (100%) create mode 100644 mips-repo/mpk/README.md diff --git a/README.md b/README.md index 1b87617..d3c4206 100644 --- a/README.md +++ b/README.md @@ -23,22 +23,24 @@ ## 当前架构与组件(2026-08-30 快照) -- **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 降级不崩)。通知中心 UI / D-Bus 桥 / TF 转储为后续任务。 -- **TF 卡多字体库(M2.6 字重结构)**:`MeowOS/fonts///`(`font.png`+`font.idx`+`font.json` 三件套),默认 `MeowOS/fonts/default/regular`;`font.file` 设置键选默认套(family→字重两级子菜单);SDK `load_font` **优先读 env `MEOW_FONT_PNG/IDX`**(launcher 每次 `launch_app` 注入),app 未自带字库时**跟随系统 `font.file`**;≤16 套卡内(防爆);§5.7 字体管理 + 应用字库(多句柄,**草案未实现**)。已部署 6 套(思源宋体 / MiSans / GoogleSans / Meslo / 思源黑体 / Ubuntu Mono,`/regular`,位深 4)。 +- **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,由 supervisor(bootmenu/launcher)`fork/exec` 托管;读 TF `MeowOS/services.d/.conf`(目录式 `key=value`,未知键忽略/前向兼容);服务=svcd **独立子进程**(崩溃隔离:服务挂不影响 svcd/supervisor);事件触发 `boot`/`card-mount`/`wifi-up`(1s 轮询);`-f` 前台便于 supervisor `waitpid`;状态机 DISABLED/STOPPED/RUNNING/STOPPING/FAILED + CLI。**接入 supervisor 启动链未做**。 -- **mDNS 方案A(已拍板)**:完整 **`mdnsd`**(994KB,mipsel 静态)放 TF `MeowOS/opt/mdnsd/mdnsd`,由 meow_svcd 托管(需 root/setcap `cap_net_bind_service,cap_net_raw` 绑 UDP5353+组播 224.0.0.251);SAResponder(885KB)因"单服务注册型"无法按名访问设备(`ingenic.local`)被排除。⚠️ 手机热点组播常在客户端间丢失 → mDNS 有风险,主机 DNS 兜底。**`MeowOpt` 已废弃并入 `MeowOS/opt`**(二进制归 MeowOS/opt,拔卡降级不崩)。 +- **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 软件仓库):交叉编译产物 + `build.sh` + `manifest.md`,供后续固件/TF 复用(见「目录速览」)。 -- **仓库公开净化**:本地 main 单提交,HEAD 敏感 0 命中;`devdocs/`(本地开发文档 + WORK_STATE/DEV_NOTES)、`scripts/build/`(固件打包脚本)**gitignore 不入库**;`mips-repo/`(mipsel 软件仓库)入库。 +- **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 交叉编译软件仓库(mdnsd 等:`README.md`+`bin/`),供后续固件/TF 复用 +- `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 @@ -48,7 +50,7 @@ ## 构建/刷机 -- 固件打包:`scripts/build/build_fw_apps_m253.sh`(**现 M2.53 / 0.7.48**;需交叉工具链 `zig-mipsel-cc` + musl.cc,见 `devdocs/ANALYSIS.md` 第 10 节) +- 固件打包:`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**。 diff --git a/docs/MEOWOS_SPEC_REF.md b/docs/MEOWOS_SPEC_REF.md index 1fabc8f..04a7342 100644 --- a/docs/MEOWOS_SPEC_REF.md +++ b/docs/MEOWOS_SPEC_REF.md @@ -9,7 +9,7 @@ ### 1.1 板载(NAND rootfs / /data) - 设置持久化:**板载** `/usr/data/meow/settings.conf`(UBIFS,小文件 <10KB,跨换卡保留)`[SYSTEM_SETTINGS §2][MEOWOS_API §3]` - **板载服务目录**:`/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/meow_mdns]` +- **主机名**:设置键 `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]` - `/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]` @@ -22,17 +22,17 @@ ├── Music/ # 播放器标准索引目录 ├── MeowData//{data,cache} # 应用专属数据(exFAT 无软链,用 env 注入) ├── MeowAPPs/ # 应用(=app.json.package=目录名;app.json+二进制+资源, fonts/, backgrounds/;日志已入 MeowOS/logs[源:审计 2026-08-30]) -├── MeowOpt/ # 板载外部工具/二进制(如 mdnsd/,卡上加载,拔卡降级不崩)`[DEV_NOTES][meow_svcd.md]` -└── MeowOS/ # MeowOS 专属(一切非必要文件) +└── MeowOS/ # MeowOS 专属(一切非必要文件;**MeowOpt 已废弃并入此处的 opt/**) ├── backups/settings/setting.bak # 设置导出默认路径 ├── services.d/ # 服务配置(meow_svcd 的 .conf;TF 源,与板载 /usr/data/meow/services.d 双源,同名板载优先)`[meow_svcd.md]` ├── fonts/// # 多字体库(每 / 一套三件套;见 §5.2) │ ├── font.png # 预渲染灰度 PNG(bit depth 4|8,gen/gen_font.py 产物) │ ├── font.idx # 索引(MFNI v2,gen/gen_font.py 产物) - │ └── font.json # 元数据 + sha256 完整性校验(schema 见 §5.2) + │ └── font.json # 元数据 + sha256 完整性校验(schema 见 §5.2;含 weight+charset+glyph_count) + ├── config/fonts/index # 字体列表索引(M2.58:CSV family,weight,path,label,tier,glyph_count;见 §5.7) ├── logs/ # 系统日志 meow_.log + apps/...(见 §3 日志) - ├── notifications/(转储区,保留最新 10MB,不被电源事件清) - ├── opt/{bin,nyai,sources.list}, lib/, tools/ + ├── notifications/(转储区,保留最新 10MB,不被电源事件清;文件 = notifications.log,appended CSV 行) + ├── opt/{bin,nyai,sources.list}, lib/, tools/ # 外围工具/二进制(MeowOpt 已废弃并入;mDNS 自研 meow_mdns 在固件,不入此) └── themes/charging// # 充电屏主题(theme.json manifest) ``` `[TF_CARD_LAYOUT §1][APPS 附录][NOTIFICATION_SYSTEM §5]` @@ -129,10 +129,11 @@ - 类 systemd/systemctl。**已接入系统启动链(M2.54)**:固件 `etc/init.d/S89meow_svcd` 开机自启(`-f` 前台 + 重挂循环,失败不死;置于 S84ssh 之后、S90meow_bootmenu 之前——因 S90 exec 引导选单阻塞 rcS)。由 bootmenu/launcher `fork/exec` + `waitpid` 托管仍为备选。 - **双源 services.d**(板载优先):板载 `/usr/data/meow/services.d/.conf` + TF **`MeowOS/services.d/.conf`**,两处都读;同名服务板载优先(TF 同名跳过 + WARN「 板载与 TF 都存在,采用板载」)。目录式 `key=value`,未知键忽略/前向兼容:`exec`(必填)/`args`/`env`/`enabled`(0=永不自动启动,默认0)/`restart`(`always`/`on-fail`/`never`,默认on-fail)/`backoff_ms`(默认1000)/`max_restart`(默认5)/`cap`(本阶段仅解析不实装)/`trigger`(`boot`/`card-mount`/`wifi-up`,默认card-mount)。 - **板载-trigger=boot 语义**:板载服务恒定存在,boot 触发不依赖卡(拔卡保留);TF 服务 boot 仍需卡。 + - **服务目录规则**:**固件工具**→板载 `/usr/data/meow/services.d/.conf`(Data 区,拔卡保留);**TF 工具/第三方**→TF `MeowOS/services.d/.conf`(随卡存在/消失);**双源板载优先**(TF 同名被板载屏蔽 + WARN「 板载与 TF 都存在,采用板载」)。 - 崩溃隔离:服务=svcd **独立子进程**(`fork+execv`),svcd 只 `waitpid`/`SIGCHLD` 感知;服务死不影响 svcd/supervisor;重启受 `backoff_ms` 退避防热循环。 - - 状态机:`DISABLED/STOPPED/RUNNING/STOPPING/FAILED`;稳定运行 30s 清零 restart_count。CLI:`status/reload/start|stop|restart /pid`(AF_UNIX 单行文本 `/tmp/meow_svcd.sock`)。 -- **卡上外部工具 = `MeowOpt/`**(TF 根下平级目录,如 `MeowOpt/mdnsd/mdnsd`):MeowOS 启动时从卡加载,拔卡降级不崩 `[DEV_NOTES][meow_svcd.md]`。 -- **mDNS 应答器 = `meow_mdns`(自研,已拍板替代完整 mdnsd)**:`mips-repo/meow_mdns/`,**IPv4-only**(内核无 IPv6,完整 mDNSResponder/SAResponder 均 `socket(AF_INET6)` 失败),mipsel 静态 ~79KB(md5 b23de7ce)。**进固件 `/usr/bin/meow_mdns`**(不入卡),由 meow_svcd 托管(板载 `/usr/data/meow/services.d/mdnsd.conf`,`trigger=boot`、root 即可绑 5353/组播,`cap=` 空)。功能:join `224.0.0.251:5353`,应答 `.local` A(wlan0 IPv4)/`_ssh._tcp` PTR/SRV/TXT/`_services._dns-sd` PTR;支持 `MEOW_MDNS_HOST`/`_ADDR`/`_PORT`/`_TTL`/`_CF`/`_QD`/`_MCAST`/`_MIF`/`_DBG`。⚠️ **手机热点隔离**:设备→主机组播被热点丢弃,avahi 只收组播应答 → 该热点下 `avahi-resolve .local` 超时(网络层限制,非应答器缺陷),主机需 DNS 兜底 `[mips-repo/meow_mdns/manifest.md][meow_svcd.md]`。 + - 状态机:`DISABLED/STOPPED/RUNNING/STOPPING/FAILED`;稳定运行 30s 清零 restart_count。CLI(systemctl 式,SSH 直呼):`status/reload/start|stop|restart /pid`,示例 `meow_svcd status`/`meow_svcd restart mdnsd`/`meow_svcd stop all`/`meow_svcd reload`;控制走 AF_UNIX 单行文本 `/tmp/meow_svcd.sock`;守护默认后台,`-f/--foreground` 前台供 supervisor 托管。 +- **卡上外部工具 = `MeowOS/opt/`**(`{bin,nyai,sources.list}, lib/, tools/`):MeowOS 启动时从卡加载,拔卡降级不崩。**`MeowOpt` 已废弃并入此处**;mDNS 已改为自研 `meow_mdns`(固件 `/usr/bin`),不再放卡。`[DEV_NOTES][meow_svcd.md]`。 +- **mDNS 应答器 = `meow_mdns`(自研,已拍板替代完整 mdnsd)**:`mips-repo/bins/meow_mdns/`,**IPv4-only**(内核无 IPv6,完整 mDNSResponder/SAResponder 均 `socket(AF_INET6)` 失败),mipsel 静态 ~79KB(md5 b23de7ce)。**进固件 `/usr/bin/meow_mdns`**(不入卡),由 meow_svcd 托管(板载 `/usr/data/meow/services.d/mdnsd.conf`,`trigger=boot`、root 即可绑 5353/组播,`cap=` 空)。功能:join `224.0.0.251:5353`,应答 `.local` A(wlan0 IPv4)/`_ssh._tcp` PTR/SRV/TXT/`_services._dns-sd` PTR;支持 `MEOW_MDNS_HOST`/`_ADDR`/`_PORT`/`_TTL`/`_CF`/`_QD`/`_MCAST`/`_MIF`/`_DBG`。⚠️ **手机热点隔离**:设备→主机组播被热点丢弃,avahi 只收组播应答 → 该热点下 `avahi-resolve .local` 超时(网络层限制,非应答器缺陷),主机需 DNS 兜底 `[mips-repo/bins/meow_mdns/manifest.md][meow_svcd.md]`。 - `meow_settings_*`(设置后端,已定)/`meowcli`/`meow_sys_devattr`/`meow_devattr_set` `[MEOWOS_API]` - 后台权限:`MSG_HELLO/MSG_REGISTER.flags` 扩展 `MF_BACKGROUND`/`MF_PLAYBACK`;`PERF_BACKGROUND`/`PERF_AUDIO_BACKGROUND`(规划)`[FRAMEWORK_DESIGN 附录 A]` @@ -184,7 +185,7 @@ - 刷新率:`display.refresh_rate` enum 60/30/15(默认 60);`display.refresh_always_max` bool false(关=允许 60→30→15 降档)。governor:连续 12 帧超预算降一档,连续 4 批≈48 帧远低预算升一档 `[SYSTEM_SETTINGS §1][PERF_SCHEDULER][MIGRATION_AC §12.1]` - 息屏:`display.screen_off_timeout` int 秒 默认 **30**(0=常亮);`display.screen_off_mode` enum `panel`(面板下电+背光0+FBIOPBLANK)/`black`(背光0全黑+双击亮屏) `[SYSTEM_SETTINGS §1]` - 亮度 clamp:`display.brightness` 0-255 默认 101(clamp ≥ `display.brightness_min`);`display.brightness_min` 默认 **1**(M2.39 由 25 改 1)——**与旧文档 25 冲突见 §A** `[SYSTEM_SETTINGS §1]` -- **主机名(M2.54)**:`system.hostname`(SET_STR 默认 `meowos`,RFC1035 首标签);`S89meow_svcd` 开机读板载 `settings.conf` 应用 `sethostname`,缺省 `meowos`/系统名;供 `meow_mdns` 公布 `.local`。settings 无该键 → 默认 `meowos`。`[SYSTEM_SETTINGS §1][mips-repo/meow_mdns/manifest.md]` +- **主机名(M2.54)**:`system.hostname`(SET_STR 默认 `meowos`,RFC1035 首标签);`S89meow_svcd` 开机读板载 `settings.conf` 应用 `sethostname`,缺省 `meowos`/系统名;供 `meow_mdns` 公布 `.local`。settings 无该键 → 默认 `meowos`。`[SYSTEM_SETTINGS §1][mips-repo/bins/meow_mdns/manifest.md]` ### 5.5 MeowAPPs 包结构 / .mpk / 数据 - `/` = 程序主体+app.json+资源;`MeowData//{data,cache}` = 数据;首次启动自动建 data/cache 并经 env 注入,exFAT 无软链 `[APPS 附录 §1/§2]` @@ -199,13 +200,14 @@ ### 5.7 字体管理 + 应用字库接口(扩展 → SDK 统一接口 / 应用自带字库 / 多句柄) > 在 §5.2「TF 卡多字体库(M2.5x)」基础上**扩展**:把 MeowOS 字体管理器定义为可用字库的**唯一权威来源**,向 SDK 提供统一查询/选用接口,并支持**应用自带字库**与**多句柄(多字体)**。 -> ⚠️ **凡 `meow_font_*_h` / `meow_ui_*_h` / 列表枚举 / 句柄加载类接口均为「草案/待定案」**:当前 SDK 只有单字体 `meow_font_*` 与 `meow_ui_text*`(用当前默认字体),本小节为新功能、**未实现**,勿当作已落地。 +> ⚠️ **状态分级(2026-08-30)**:launcher 侧字体管理器(§5.7.1)与 **两级扫描/字重子菜单(agent-111,M2.58)**、`meow_font_has_glyph` 已实现;**列表枚举(§5.7.1/§5.7.2)** 落地(**agent-113,M2.58**):「扫描结果落盘 `MeowOS/config/fonts/index`(family/weight/path/label/tier/glyph_count),SDK `meow_font_get_available_count/enumerate` 从该文件读、不依赖 launcher 内存数组;字库丢失→降级默认+日志;render 走 env `MEOW_FONT_PNG/IDX`,list 枚举走 index——两路明确」。**应用自带字库(§5.7.3)/ 多句柄(§5.7.4)/ 凡 `_h` 接口仍为「草案/未实现」**,勿当作已落地;当前 SDK 只有单字体 `meow_font_*` 与 `meow_ui_text*`(用当前默认字体)。 > `[源:meow_font.h][源:agent-79 实现][源:meow_ui.h]` > **app 未自带字库 → 跟随系统 `font.file`(M2.x 已落地)**:launcher 每次 `launch_app` 前把「当前生效字体」注入为环境变量 `MEOW_FONT_PNG`/`MEOW_FONT_IDX`(绝对路径,可选 `MEOW_FONT_APP=`);SDK `meow_ui_gfx.c load_font()` **优先读 env**,无 env 则回退卡默认 `MeowOS/fonts/default` → 固件。§5.7.3 的 `load_handle`(app 自带字库)**未实现**,故当前 app 只能跟随系统字体;一旦实现自带字库,其加载优先级应高于 env。 - **5.7.1 字体管理器(launcher 侧)= 可用字库唯一权威来源** - - 唯一维护并扫描 `MeowOS/fonts///`(+默认),产出「字体列表」(family slug / weight slug / 显示名 / glyph_count / size_list / bit_depth)。**SDK 不自行发现字库**,一律经本接口取 launcher 扫描结果。 + - 唯一维护并扫描 `MeowOS/fonts///`(+默认),产出「字体列表」(family slug / weight slug / 显示名 / glyph_count / size_list / bit_depth)。**SDK 不自行发现字库**,一律经本接口取 launcher 扫描结果。**扫描结果落盘 `MeowOS/config/fonts/index`**(family/weight/path/label/tier/glyph_count);SDK 读该文件(不依赖 launcher 内存数组)。 + - **释放语义(agent-113 落地结论)**:持久来源 = index 文件;`font_presets*`/`*_buf` 为「静态、有界(`FONT_PRESETS_MAX=17`)、非堆」数组 → 无内存泄漏、无运行期 free;「释放」= 两个扫描点(启动/进设置页)重建 + 固定上限防膨胀,离开字体列表视图无需显式 free(下次进设置/重扫自动重建)。⚠️ **未做「启动后即清空数组」**:`meow_font_effective_paths_tiered`(launch_app 大字库档位选库)与 `meow_font_reload_multifont` 运行期持续读 `font_presets_n`,清空会造成大字库档位退化(red line「保持档位/多字体行为」);如需「零驻留」,须把这几个核心路径改为直接读 index(较大重构,留待后续)。 - 扫描与校验规则沿用 §5.2:三件套 `font.png/font.idx/font.json` **缺任一件 → 该套跳过 + 日志**;`font.json` 解析 `name`(缺回退目录名)/`weight`(缺省 `regular`)/`glyph_count`/`size_list`/`bit_depth`;`sha256_png/sha256_idx` 仅 **WARN** 不硬失败(该套仍可选)。 - 列表上限沿用 `FONT_PRESETS_MAX = 17`(1 默认 + ≤16 卡内套装,防爆);顺序 = 默认(0) + 扫描顺序。扫描时机不变(启动 / 进设置页),**勿放热路径** `[源:agent-79 实现]`。 - 权威列表数据模型(SDK 侧快照,枚举时填充): @@ -221,17 +223,20 @@ char path_png[320]; /* 系统库:相对卡根 MeowOS/fonts///font.png */ } meow_font_info; ``` -- **5.7.2 应用可读 TF 卡字体列表(统一规范接口,app 面向)** `[源:agent-79 实现][源:meow_font.h]` +- **5.7.2 应用可读 TF 卡字体列表(统一规范接口,app 面向;已落地,M2.58)** `[源:agent-79 实现][源:agent-113 实现][源:meow_font.h]` + - **读取来源 = `MeowOS/config/fonts/index`**(launcher 扫 `MeowOS/fonts///` 后落盘;CSV 每套一条 `"family","weight","path","label","tier",glyph_count`,path=卡根相对 `font.png`,label=显示名+字重+尺寸标记,tier=common|gbk|full;默认行恒为 index0)。`meow_font_get_available_count/enumerate` **只读该文件**,不再依赖 launcher 内存数组;无卡/无 index → 仅板载默认项(family=default,count=1)。index 解析在 `font/meow_font.c`(`meow_font_index_load`),SDK 经 `meow_ui.h §5.7` 暴露。 ```c - int meow_font_get_available_count(void); /* 可用字库数(含默认) */ + int meow_font_get_available_count(void); /* 可用字库数(含默认;无卡→1) */ int meow_font_enumerate(int idx, meow_font_info *out); /* 按序号取,越界返回 0 */ typedef int (*meow_font_enum_cb)(const meow_font_info *info, void *ctx); int meow_font_enumerate_cb(meow_font_enum_cb cb, void *ctx); /* 回调式,返回套数 */ int meow_font_select_by_id(int id); /* 选该套为 app 会话默认字体 */ ``` - - 语义:`id` = 列表序号(§5.7.1 快照);`0` = **跟随系统默认**(用户 `font.file` 所选,app 会话不覆盖);`>0` = **app 会话内固定用该套**(覆盖 `font.file` 至 app 结束)。成功 0,越界/加载失败返回负值。 + - 语义:`id` = 列表序号(index 行号);`0` = **跟随系统默认**(用户 `font.file` 所选,经 env `MEOW_FONT_PNG/IDX`,app 会话不覆盖);`>0` = **app 会话内固定用该套**(覆盖 `font.file` 至 app 结束)。成功 0,越界返回负值。 + - **字库丢失降级默认(不丢请求)+ 日志**:`select_by_id(id>0)` 加载失败(png 缺失/坏)→ **降级**到系统默认(env→卡默认→固件),并 `meow_log(MEOW_LOG_WARN, "font missing, fallback default")`(落 app 日志 = SDK meow_log);请求不丢(仍按"选过"处理)。渲染仍走 env `MEOW_FONT_PNG/IDX`(选中的那一套),**列表枚举走 index 文件**——两路明确匹配。 - **列表快照是临时的**:launcher 仅启动/进设置页重扫,期间拔卡或改卡内字库不刷新;app 应**每次会话重新枚举**、按 `family` 持久化,勿缓存数值 id。 - 覆盖范围:系统库 `MeowOS/fonts///` 与默认(含固件 `/usr/share/meowos/font` 回退)都反映在列表里;app 侧「选用已有字库」**只用本接口,不直接拼路径**。 + - **launcher 侧系统设置同样降级 + 系统日志**:`font.file` 选中字体缺失 → `meow_font_ensure`/`meow_font_reload_multifont` 兜底链(font.file→卡默认→固件)回退默认,并 `logmsg("meow_font: selected font %s missing, fallback default")`(系统日志 = launcher logmsg;多字体类别缺失 → `multi_font: class %s font %s missing, fallback global`)。app 日志(SDK meow_log)与系统日志(launcher logmsg)分流明确。 - **5.7.3 应用自带字库(按 handle 加载)** `[源:meow_font.h]` - 目录:`MeowAPPs//fonts//{font.png,font.idx,font.json}`;`` = `app.json.package`(反域名 app_id,见 §5.5),`` = 应用自设名字(如 `lyrics`/`reader`)。 - `app.json` 声明(**可选**):`"fonts": ["lyrics","reader"]`。作用 = MeowPanel 打包校验 / launcher 装包校验 / SDK 提供取证;**不声明也可运行时按 handle 加载**。 @@ -329,10 +334,10 @@ - **A-6 KEY_PREVIOUS(code)**:KEY_CONTROL §3 明注「KEY_PREVIOUSSONG 是 **165**;19 是另一码」;meow_ui.h `#define MEOW_KEY_PREVIOUS 19 /* KEY_PREVIOUSSONG */` 注释标错。→ **19 的标签应改**(值 19 非 prevsong;165 才是),属 meow_ui.h 注释误导。 - **A-7 app 日志路径**:APP_LOG_MANAGER §4 写 `apps/.log`(单文件);meow_ui.h §9 / DEV_NOTES #9 为 **`apps/<包名>/logs/<启动时间>_.log`**(每次启动新文件)——用户已纠正,勿用单文件。→ 以 meow_ui.h/DEV_NOTES(M2.51)为准,APP_LOG_MANAGER 目录小节过时。 - **A-8 状态栏高**:MEOW_APP_SDK §3.1「slim ~20-40px」;实际定案 **40px**([D6] MIGRATION_AC §11.1),后被用户改为 **28px**(MUI_SBAR_H=28,字号 20,图标 ink 16/中线 14,见 M2.x 状态栏压缩)。→ 现取 28。 -- **A-9 SDK 通知转储**:NOTIFICATION_SYSTEM §8「创建 10s 后自动转储到 TF」;meow_ui.h 现仅「活动表+meow_log 打日志,真实投递 UI/D-Bus 为后续」。→ 10s 转储/TF 尚未实现,属"已定未做"。 +- **A-9 SDK 通知转储**:NOTIFICATION_SYSTEM §8「创建 10s 后自动转储到 TF」;meow_ui.h 现仅「活动表+meow_log 打日志,真实投递 UI/D-Bus 为后续」。→ **10s 转储/TF 已实现(M2.5x,#6)**:launcher 侧带 TTL 10s 转储钩子,dump 到 `MeowOS/notifications/notifications.log`(appended CSV + 10MB 滚动 + 开机清板载/内存表);meow_ui.h 注释「真实投递 UI/D-Bus 为后续」仍指**通知中心 UI / D-Bus 桥**未做。 - **A-10 版本来源细解**:DEV_NOTES #4「/etc/meowos_version 唯一来源;MEOWOS_VERSION 宏仅 dev 占位永不动」;APPS.md §4.6「MEOWOS_VERSION 宏=单一来源,build 时 sed 写入 etc/meowos_version」。→ 两者都强调"写入同源",但"谁是源头"措辞矛盾;实践上 build 脚本 echo 生成 /etc/meowos_version,宏作屏显 dev 占位。 -- **A-11 `MeowOS/opt/` vs `MeowOpt/`**:§1.2 树中 `MeowOS/opt/{bin,nyai,sources.list},lib/,tools/`(nyai 包管 + 工具)与新增顶层 `MeowOpt/`(板载外部工具/二进制,如 mdnsd)并存,命名仅大小写之差、语义可能重叠。→ **两者是否为同一用途/是否需归并待确认**;当前按各自文档记录,勿混用。 -- **A-12 `fullscreen` 字段(已定 → 本次实现)**:§5.5 与 MEOW_APP_SDK §9 将 `fullscreen` 列为 app.json 字段,但 `meow_parse_app_json()` **此前并未读取该键**(实现只解析 name/exec/icon/package/framework/immersive/route./awake./service.),属"已定未做"。→ **本次实现**:launcher 启动 app/切 activity 据 `app.json fullscreen`/`route..fullscreen` 预设 SDK 全屏(env `MEOW_FULLSCREEN`),见 §5.1/§3.1。注意全屏语义由「隐藏状态栏+隐藏返回键」细化为「状态栏收合至提示线 + 保留左缘返回+顶部提示线+下滑通知中心(热区缩小)」(见 A-13)。 -- **A-13 全屏语义细化(状态栏「隐藏」→「收合至提示线」)**:既有 §3.1/§5.1 描述全屏=隐藏状态栏(`meow_ui_statusbar_height()`=0、隐藏返回键=沉浸);本次定案细化为**进入/退出全屏:状态栏向上收出屏顶、只留一条提示线高度**,**全屏下保留**左缘返回手势 + 顶部动态伸缩提示线,且**顶部下滑仍可开通知中心(顶部热区缩小)**。→ 需在 SDK 端明确「收合(collapsed)」状态(新增 `meow_ui_statusbar_collapsed()` 等)与「隐藏」的差异,UI 依此绘制提示线。 +- **A-11 `MeowOS/opt/` vs `MeowOpt/`(已归并)**:曾有顶层 `MeowOpt/`(板载外部工具/二进制,如 mdnsd)与 `MeowOS/opt/{bin,nyai,sources.list},lib/,tools/`(nyai 包管 + 工具)并存、命名仅大小写之差。→ **已归并**:`MeowOpt` 废弃并入 `MeowOS/opt/`;mDNS 由完整 mdnsd(TF MeowOS/opt/mdnsd)改为**自研 `meow_mdns`(固件 `/usr/bin`,IPv4-only)**,不再放卡。全仓库统一用 `MeowOS/opt/`。 +- **A-12 `fullscreen` 字段(已定 → 已实现,M2.5x)**:§5.5 与 MEOW_APP_SDK §9 将 `fullscreen` 列为 app.json 字段,但 `meow_parse_app_json()` **此前并未读取该键**(实现只解析 name/exec/icon/package/framework/immersive/route./awake./service.),属"已定未做"。→ **已实现**:launcher 启动 app/切 activity 据 `app.json fullscreen`/`route..fullscreen` 预设 SDK 全屏(env `MEOW_FULLSCREEN`),见 §5.1/§3.1。全屏语义由「隐藏状态栏+隐藏返回键」细化为「状态栏收合至提示线 + 保留左缘返回+顶部提示线+下滑通知中心(热区缩小)」(见 A-13)。 +- **A-13 全屏语义细化(状态栏「隐藏」→「收合至提示线」)**:既有 §3.1/§5.1 描述全屏=隐藏状态栏(`meow_ui_statusbar_height()`=0、隐藏返回键=沉浸);本次定案细化为**进入/退出全屏:状态栏向上收出屏顶、只留一条提示线高度**,**全屏下保留**左缘返回手势 + 顶部动态伸缩提示线,且**顶部下滑仍可开通知中心(顶部热区缩小)**。→ **已实现(M2.5x)**:SDK 端明确「收合(collapsed)=状态栏缩为提示线(4px)」vs「隐藏=高度0」;全屏下保留左缘返回+顶部伸缩滑条+顶部下滑通知中心(热区缩小)。⚠️ **全屏顶部动态伸缩滑条仍有已知问题在跟进(agent-112)**。 - **A-14 `fonts` 键二义**:§5.7.3 `"fonts":[…]`=应用自带字库句柄数组;§5.2/§5.7.8 `"fonts":"full"|"gbk"|"common"`=字库档位字符串。→ 同名键两种语义,解析器需区分(字符串→档位 / 数组→句柄);若避免歧义可改用专键如 `"font_tier"`(**未拍板**)。 `[各源标注见上]` diff --git a/font/meow_font.c b/font/meow_font.c index 05f0a34..9283978 100644 --- a/font/meow_font.c +++ b/font/meow_font.c @@ -22,6 +22,7 @@ #include #include #include +#include /* access():字库缺失判定用 */ /* ---------------- 最小 zlib ABI 声明(与 libz.a 匹配,mipsel 32-bit unsigned long=4B) ------- */ typedef unsigned char mzf_Bytef; @@ -721,3 +722,196 @@ int meow_font_config_multifont(int on, if (distinct) *distinct = d_n; return 0; } + +/* ================================================================== */ +/* M2.58 字体索引 + 应用字库查询(规格 §5.7:索引文件 / 查列表 / 丢失降级默认) */ +/* ================================================================== */ +/* SDK 可选日志:SDK 链 meow_log 强符号(→app 日志);launcher 无 meow_log(弱符号 → NULL, + * 静默跳过)——避免 meow_font.o 依赖 SDK,launcher 链接不至于为未定义 meow_log 而失败。 */ +extern void meow_log(int lvl, const char *fmt, ...) __attribute__((weak)); +#define MEOW_FONT_INDEX_MAX 32 /* index 条数上限(实际 ≤17,留余量) */ + +#define MEOW_FONT_DEF_PNG "/usr/data/mnt/sd_0/MeowOS/fonts/default/regular/font.png" +#define MEOW_FONT_DEF_IDX "/usr/data/mnt/sd_0/MeowOS/fonts/default/regular/font.idx" +#define MEOW_FONT_SYS_PNG "/usr/share/meowos/font/font.png" +#define MEOW_FONT_SYS_IDX "/usr/share/meowos/font/font.idx" + +const char *meow_font_card_root(void) +{ + const char *e = getenv("MEOW_CARD_ROOT"); + return (e && e[0]) ? e : "/usr/data/mnt/sd_0"; +} + +int meow_font_index_path(char *out, int olen) +{ + if (!out || olen <= 0) return -1; + snprintf(out, (size_t)olen, "%s/%s", meow_font_card_root(), MEOW_FONT_INDEX_REL); + return 0; +} + +/* 合成「板载默认」条目(index0;无卡/无 index 时唯一项)。 */ +static void meow_font_default_entry(meow_font_info *out) +{ + if (!out) return; + memset(out, 0, sizeof *out); + snprintf(out->family, sizeof out->family, "default"); + snprintf(out->name, sizeof out->name, "默认字体"); + snprintf(out->weight, sizeof out->weight, "regular"); + snprintf(out->tier, sizeof out->tier, "common"); + out->glyph_count = 0; + snprintf(out->label, sizeof out->label, "默认字体 Regular(common)"); + snprintf(out->path_png, sizeof out->path_png, "MeowOS/fonts/default/regular/font.png"); +} + +/* CSV 单字段读取(支持双引号包裹 + 内嵌双引号转义)。p 走到下一字段/行尾。 */ +static int csv_field(const char **pp, char *out, int olen) +{ + const char *p = *pp; + if (!out || olen <= 0) return 0; + int o = 0; + if (*p == '"') { + p++; + while (*p && o < olen - 1) { + if (*p == '"') { + if (p[1] == '"') { out[o++] = '"'; p += 2; continue; } + p++; /* 结束引号 */ + break; + } + out[o++] = *p++; + } + if (*p == ',') p++; + else if (*p == '\r' || *p == '\n') { /* 行尾,由外层清理 */ } + } else { + while (*p && *p != ',' && *p != '\r' && *p != '\n' && o < olen - 1) + out[o++] = *p++; + if (*p == ',') p++; + } + out[o] = 0; + *pp = p; + return 1; +} + +/* 有界复制(字符串入 dst≤dlen 且保证 NUL;避免 -Wformat-truncation 之类告警)。 */ +static void fcpy(char *dst, int dlen, const char *src) +{ + if (dlen <= 0) return; + size_t n = src ? strlen(src) : 0; + if (n >= (size_t)dlen) n = (size_t)dlen - 1; + memcpy(dst, src, n); + dst[n] = 0; +} + +/* 解析一行 index(CSV 6 字段)。成功填 info 并返回 1;path 为空 → 0(跳过)。 */ +static int meow_font_parse_index_line(char *line, meow_font_info *info) +{ + if (!line || !info) return 0; + const char *p = line; + char f[6][360]; + for (int i = 0; i < 6; i++) { + if (!csv_field(&p, f[i], (int)sizeof f[i])) return 0; + if (!f[i][0]) return 0; + } + memset(info, 0, sizeof *info); + fcpy(info->family, sizeof info->family, f[0]); + fcpy(info->name, sizeof info->name, f[0]); /* index 无单列 name → 回退 family */ + fcpy(info->weight, sizeof info->weight, f[1]); + fcpy(info->path_png, sizeof info->path_png, f[2]); + fcpy(info->label, sizeof info->label, f[3]); + fcpy(info->tier, sizeof info->tier, f[4]); + info->glyph_count = atoi(f[5]); + return info->path_png[0] ? 1 : 0; +} + +int meow_font_index_load(meow_font_info *out, int max) +{ + if (!out || max <= 0) return 0; + char path[450]; + if (meow_font_index_path(path, sizeof path) != 0) return 0; + FILE *f = fopen(path, "r"); + if (!f) { meow_font_default_entry(&out[0]); return 1; } /* 无卡/无 index → 仅板载默认 */ + int n = 0, total = 0; + char line[1024]; + while (fgets(line, sizeof line, f)) { + char *s = line; + while (*s == ' ' || *s == '\t') s++; + if (!*s || *s == '\n' || *s == '\r' || *s == '#') continue; /* 忽略空行/注释 */ + meow_font_info tmp; + if (!meow_font_parse_index_line(s, &tmp)) continue; + total++; + if (n < max) { out[n] = tmp; n++; } + } + fclose(f); + if (total == 0) { meow_font_default_entry(&out[0]); return 1; } + return total; +} + +int meow_font_get_available_count(void) +{ + meow_font_info buf[1]; + return meow_font_index_load(buf, 1); /* max=1:只统计总数,不要求全填 */ +} + +int meow_font_enumerate(int idx, meow_font_info *out) +{ + if (!out || idx < 0) return 0; + meow_font_info buf[MEOW_FONT_INDEX_MAX]; + int n = meow_font_index_load(buf, MEOW_FONT_INDEX_MAX); + if (idx >= n) return 0; + memcpy(out, &buf[idx], sizeof *out); + return 1; +} + +/* 相对路径按卡根解析为绝对路径(绝对路径原样返回)。 */ +static void font_abs_path(const char *rel, char *out, int olen) +{ + if (!rel || !rel[0]) { if (olen > 0) out[0] = 0; return; } + if (rel[0] == '/') { snprintf(out, (size_t)olen, "%s", rel); return; } + snprintf(out, (size_t)olen, "%s/%s", meow_font_card_root(), rel); +} + +/* 由 png 绝对路径派生同目录 font.idx(.png → .idx)。0=成功。 */ +static int font_idx_from_png(const char *png, char *out, int olen) +{ + if (!png || olen <= 0) return -1; + snprintf(out, (size_t)olen, "%s", png); + size_t n = strlen(out); + if (n > 4 && !strcmp(out + n - 4, ".png")) { + out[n-4]='.'; out[n-3]='i'; out[n-2]='d'; out[n-1]='x'; out[n]=0; + return 0; + } + return -1; +} + +/* 装载系统默认字体(跟随 font.file,经 env MEOW_FONT_PNG/IDX → 卡默认 → 固件)。 + * 与 SDK meow_ui_gfx load_font 的优先级一致;app 经 select_by_id(0) 或任何降级回退时走此路径。 */ +static int meow_font_load_system_default(void) +{ + const char *ep = getenv("MEOW_FONT_PNG"); + const char *ei = getenv("MEOW_FONT_IDX"); + char idxbuf[400]; + if (ep && ep[0]) { + if (!ei || !ei[0]) { + if (font_idx_from_png(ep, idxbuf, sizeof idxbuf) != 0) ei = NULL; + else ei = idxbuf; + } + if (ei && meow_font_load(ep, ei) == 0) return 0; + } + if (meow_font_load(MEOW_FONT_DEF_PNG, MEOW_FONT_DEF_IDX) == 0) return 0; + if (meow_font_load(MEOW_FONT_SYS_PNG, MEOW_FONT_SYS_IDX) == 0) return 0; + return -1; +} + +int meow_font_select_by_id(int id) +{ + if (id == 0) return meow_font_load_system_default(); /* 跟随系统默认(font.file) */ + meow_font_info info; + if (!meow_font_enumerate(id, &info)) return -1; /* 越界 → 负值 */ + if (!info.path_png[0]) return -1; + char png[400], idx[400]; + font_abs_path(info.path_png, png, sizeof png); + if (font_idx_from_png(png, idx, sizeof idx) != 0) return -1; + if (access(png, R_OK) == 0 && meow_font_load(png, idx) == 0) return 0; + /* 字库缺失 → 降级默认(不丢请求)+ WARN(app 日志;meow_log 为 SDK 统一日志) */ + if (meow_log) meow_log(2 /* MEOW_LOG_WARN */, "font %s missing, fallback default", png); + return meow_font_load_system_default(); +} diff --git a/font/meow_font.h b/font/meow_font.h index eb6b8ff..7860d54 100644 --- a/font/meow_font.h +++ b/font/meow_font.h @@ -117,6 +117,54 @@ int meow_font_config_multifont(int on, int meow_font_import_zip(const char *zip_path); /* TODO:MeowPanel */ int meow_font_export_zip(const char *family, const char *out_zip); /* TODO:MeowPanel */ +/* ================================================================== */ +/* M2.58 字体索引 + 应用字库查询(规格 §5.7:索引文件 / 查列表 / 丢失降级默认) */ +/* ================================================================== */ +/* 系统字体列表的持久化快照 = TF 卡 /MeowOS/config/fonts/index(CSV,每套一条: + * "family","weight","path","label","tier",glyph_count + * path = 卡根相对 font.png(如 MeowOS/fonts/misans/regular/font.png) + * label = 显示名(含字重 + 尺寸标记,如 `MiSans Regular(common≈4k)`) + * tier = common|gbk|full(档位,信息用 + 驱动按需加载) + * launcher 扫描 MeowOS/fonts/// 后写该文件(覆盖,含默认行 index0); + * SDK 侧 meow_font_get_available_count()/enumerate() 只从这个文件读,不依赖 launcher 内存数组; + * 无卡/无 index → 仅 1 项板载默认(family=default)。 */ +#define MEOW_FONT_INDEX_REL "MeowOS/config/fonts/index" + +/* 权威列表数据模型(SDK 侧快照,枚举时填充;规格 §5.7.1)。 */ +#ifndef MEOW_FONT_INFO_DEFINED +#define MEOW_FONT_INFO_DEFINED +typedef struct meow_font_info { + char family[64]; /* family slug = MeowOS/fonts// 一级目录名 */ + char name[64]; /* 显示名(index 无单列 → 回退 family) */ + char weight[32]; /* weight slug(regular|bold|…,缺省 regular) */ + char tier[8]; /* 档位 common|gbk|full(info 用) */ + int glyph_count; /* font.json glyph_count(info 用) */ + char label[128]; /* index 显示名(含字重 + 尺寸标记) */ + int size_list[16]; /* 原生字号表(index 无 → 空) */ + int size_count; /* 有效字号数 */ + int bit_depth; /* 4|8(index 无 → 0) */ + char path_png[320]; /* 卡根相对 MeowOS/fonts///font.png */ +} meow_font_info; +#endif + +/* 卡根:env MEOW_CARD_ROOT 优先,否则默认 /usr/data/mnt/sd_0。 */ +const char *meow_font_card_root(void); +/* /MeowOS/config/fonts/index 绝对路径写入 out;0=成功。 */ +int meow_font_index_path(char *out, int olen); +/* 读 index → 填充 out 数组(最多 max 条),返回「总条数」(无 index/不可读/空 → 1=合成默认行)。 + * 注意 out[i].path_png 为「卡根相对」路径,需经卡根解析为绝对路径再使用。 */ +int meow_font_index_load(meow_font_info *out, int max); + +/* 应用可读 TF 卡字体列表(规格 §5.7.2): + * - get_available_count():可用字库数(含默认;无卡 → 1)。 + * - enumerate(idx, out):按序号取,越界返回 0;idx=0=默认行(family=default)。 + * - select_by_id(id):id=0 跟随系统默认(font.file,经 env MEOW_FONT_PNG/IDX); + * id>0 会话内固定用该套;该套字库缺失 → 降级默认(不丢请求)+ WARN 日志 + * (meow_log→app 日志)。成功 0,越界负值。 */ +int meow_font_get_available_count(void); +int meow_font_enumerate(int idx, meow_font_info *out); +int meow_font_select_by_id(int id); + #ifdef __cplusplus } #endif diff --git a/mips-repo/README.md b/mips-repo/README.md index c6b2c88..1974e72 100644 --- a/mips-repo/README.md +++ b/mips-repo/README.md @@ -2,24 +2,42 @@ 目标设备:R3 Pro II / MeowOS 固件(**mipsel-linux-muslsf**,静态,无 glibc 依赖)。 用途:存放针对该设备的交叉编译二进制与构建信息,便于**复用**到后续固件 / TF 卡 -(MeowOpt 目录;`MeowLib` 未定义/未用——`MeowOpt` 与 `MeowOS/opt` 命名需归一:代码用 `MeowOS/opt`,文档 `MeowOpt` 指卡上外部工具目录。[源:审计 2026-08-30])。 +(`MeowOS/opt` 目录;`MeowLib` 未定义/未用——`MeowOpt` 与 `MeowOS/opt` 命名需归一:代码用 `MeowOS/opt`,文档 `MeowOpt` 指卡上外部工具目录。[源:审计 2026-08-30])。 + +## 仓库结构(**两半**:`bins/` 普通二进制工具 + `mpk/` `.mpk` 软件包) -## 仓库结构(每工具一个目录) ``` mips-repo/ README.md # 本文件 - / - build.sh # 交叉编译脚本(可重复执行) - manifest.md # 元信息:来源/版本/arch/校验/产物路径/安装目标 - bin/ # 交叉编译产物(静态 mipsel,如存在) + bins/ # 「普通二进制/工具」仓库:交叉编译产物 + 构建/元信息 + / + build.sh # 交叉编译脚本(可重复执行;可搬,路径相对本目录) + manifest.md # 元信息:来源/版本/arch/校验/产物路径/安装目标 + bin/ # 交叉编译产物(静态 mipsel,如存在) + (.c 源码如自研也放此) + mpk/ # 「.mpk 文件」仓库:MeowAPPs 软件包(.mpk = tar.gz) + README.md # .mpk 规范说明(格式/字段/安装) + .mpk # 成品包(app.json + meow 二进制 + 资源;不含 data/cache) ``` +> 两者定位不同:`bins/` 是**宿主侧工具**(服务/二进制,如 mDNS 应答器、netd),由 +> **meow_svcd** 托管、打进固件或按需从卡 `MeowOS/opt//` 部署;`mpk/` 是**应用层 +> 软件包**(MeowAPP 分发单元),用 **`nyai`** 安装到 `MeowAPPs/<包名>/`。 + ## 当前已入库工具 -- **mdnsd/**:Apple mDNSResponder-2881.0.25 交叉编译产物(`mipsel-linux-muslsf` 静态)。两种变体同在 `bin/`: + +### bins/(普通二进制 / 工具仓库) + +- **bins/mdnsd/**:Apple mDNSResponder-2881.0.25 交叉编译产物(`mipsel-linux-muslsf` 静态)。两种变体同在 `bin/`: - `bin/mdnsd` = **SAResponder**(mDNSResponderPosix,单服务注册型,`-n/-f` 只发布/回指定服务)strip 后 **885.6 KB**; - `bin/mdnsd.bin` = **完整 mdnsd** 守护进程(通用宿主响应器,回任意 `.local` 查询)strip 后 **994 KB**。 - ⚠️ 实测(内核无 IPv6)**两者均失败**:`socket AF_INET6: Address family not supported by protocol`;且即便 `make HAVE_IPV6=0` 编译通过、daemon 能跑,**也不发布主机名 A 记录**(IPC 服务型守护进程,等客户端注册)。故 mDNS 方案A 判为**不达标**,由 `meow_mdns/` 替代(见下)。 -- **meow_mdns/**:自研极简 IPv4-only mDNS 应答器(~77.6 KB,`mipsel-linux-muslsf` 静态)。join `224.0.0.251:5353`,应答 `.local` A + `_ssh._tcp.local` PTR/SRV/TXT;零 IPv6 依赖。部署到 TF `MeowOS/opt/mdnsd/mdnsd`(95 KB < 阈值,可考虑进固件)。详见 `meow_mdns/manifest.md`。⚠️ 手机热点**丢弃客户端间组播**→ 设备能应答、主机收不到(avahi 只认组播应答),`avahi-resolve *.local` 仍超时(网络层热点隔离,非应答器缺陷),需主机 DNS 兜底。 + ⚠️ 实测(内核无 IPv6)**两者均失败**:`socket AF_INET6: Address family not supported by protocol`;且即便 `make HAVE_IPV6=0` 编译通过、daemon 能跑,**也不发布主机名 A 记录**(IPC 服务型守护进程,等客户端注册)。故 mDNS 方案A 判为**不达标**,由 `bins/meow_mdns/` 替代(见下)。 +- **bins/meow_mdns/**:自研极简 IPv4-only mDNS 应答器(~77.6 KB,`mipsel-linux-muslsf` 静态)。join `224.0.0.251:5353`,应答 `.local` A + `_ssh._tcp.local` PTR/SRV/TXT;零 IPv6 依赖。部署到 TF `MeowOS/opt/mdnsd/mdnsd`(95 KB < 阈值,可考虑进固件,实际已改板载 `/usr/bin/meow_mdns`,见下)。详见 `bins/meow_mdns/manifest.md`。⚠️ 手机热点**丢弃客户端间组播**→ 设备能应答、主机收不到(avahi 只认组播应答),`avahi-resolve *.local` 仍超时(网络层热点隔离,非应答器缺陷),需主机 DNS 兜底。 + +### mpk/(`.mpk` 软件包仓库) + +- 目前**为空**(仅 `README.md` 说明规范)。MeowAPPs 成品包 `.mpk` 集中放此,供 `nyai` 经 + `sources.list`(本地源 = `MeowOS/opt/repo`)或 `nyai install ` 直接安装。 ## 目标架构与工具链 - 架构:`mipsel`(MIPS32r2, little-endian) @@ -27,13 +45,54 @@ mips-repo/ - 交叉编译器:`~/.tools/zig-mipsel-cc`(zig 目标 mips-linux-musl) - 目标静态库 sysroot:`~/.tools/mipsel-linux-muslsf-cross/mipsel-linux-muslsf` -## 新增一个工具的流程 -1. `mkdir -p /bin`,写 `/build.sh`(用 zig-mipsel-cc,`-Os -static`)。 -2. 跑 `build.sh`,产出放 `/bin/`。 -3. 写 `/manifest.md`:来源(如 Apple-OSS/mDNSResponder 版本)、ARCH、`file` - 输出摘要、`ls -l` 大小、构建命令、安装路径(固件 or TF MeowOpt)。 +## 服务管理:meow_svcd CLI(托管 `bins/` 下的服务) + +`bins/` 里的常驻服务(如 `meow_mdns`)由 **meow_svcd**(类 systemd/systemctl,固件 +`/usr/bin/meow_svcd`,板载 `etc/init.d/S89meow_svcd` 开机自启)托管,SSH 到设备后可直接用: + +``` +meow_svcd status # 列出所有服务与状态(card_present/wifi_up/services=N) +meow_svcd restart meow_mdns # 重启单服务(如板载 mDNS 应答器) +meow_svcd stop all # 停止全部服务 +meow_svcd reload # 重读板载+TF 双源 services.d +meow_svcd start meow_mdns # 启动单服务 +meow_svcd pid # 打印守护进程 pid +``` + +- 控制走 AF_UNIX 单行文本,默认 socket `/tmp/meow_svcd.sock`;应答 `OK` / `ERR no-such-service` / + 多行 `svc= state=… pid=… restart=… exit=…`。守护默认**后台**;`-f/--foreground` 前台(供 + supervisor `fork/exec`+`waitpid` 托管)。 +- **服务目录规则(双源板载优先)**:固件工具 → 板载 `/usr/data/meow/services.d/.conf`(Data 区, + 拔卡保留);TF 工具/第三方 → TF `MeowOS/services.d/.conf`(随卡存在/消失);同名板载优先(TF 被屏蔽 + WARN)。 +- 详见 `patch_v2/meow_svcd/meow_svcd.md` / `docs/MEOWOS_SPEC_REF.md §4`。 + +## 应用包:`.mpk` 规范 & `nyai` + +`.mpk` 是 MeowOS 的应用分发单元(`MeowAPPs`),规范与 `nyai` 用法见 `APPS.md 附录 §3(.mpk) / §5(nyai)`。 +要点: + +- **包名 = 文件名茎 = `app.json` 的 `package`**(如 `os.meow.hello` → `os.meow.hello.mpk`)。 +- **格式**:`.mpk` = tar.gz,含 `app.json` + `meow` 二进制 + 资源,**不含 data/cache**(运行时按设备生成)。 +- **安装**:`nyai install `;`nyai index ` 为目录生成 `Packages` 索引 + (Package/Version/Filename/Size/SHA256/Depends/Description);`nyai export ` 打包导出。 +- **部署 `nyai`**:`MeowOS/opt/bin/nyai`(卡,随 TF_CARD_LAYOUT 外围工具目录)。M2.12+ 固件 + `meow_card_path.sh` 已前插 `MeowOS/opt/bin` 可直呼;更早固件上 SSH 需绝对路径 + `/usr/data/mnt/sd_0/MeowOS/opt/bin/nyai` 或 `export PATH=/usr/data/mnt/sd_0/MeowOS/opt/bin:$PATH`。 + +## 新增一个工具/包的流程 + +- **工具(进 `bins/`)**: + 1. `mkdir -p bins//bin`,写 `bins//build.sh`(用 zig-mipsel-cc,`-Os -static`)。 + 2. 跑 `build.sh`,产出放 `bins//bin/`。 + 3. 写 `bins//manifest.md`:来源(如 Apple-OSS/mDNSResponder 版本)、ARCH、`file` + 输出摘要、`ls -l` 大小、构建命令、安装路径(固件 or TF MeowOpt)。 +- **应用包(进 `mpk/`)**: + 1. 打包不含 data/cache 的 `MeowAPPs/<包名>/` → `mpk/<包名>.mpk`(或 `nyai export`)。 + 2. `nyai index mpk/` 生成/刷新 `Packages` 索引(供经源安装)。 + 3. `.mpk` 字段与安装语义见 `mpk/README.md` / `APPS.md 附录 §3`。 ## 部署到哪里 -- 体积小(约 <200KB)→ 可直接打进固件(/usr/bin 或由 supervisor 启动)。 -- 体积大 → 放 TF 卡 `MeowOpt//`,由 MeowOS 启动时从卡加载(拔卡降级不崩)。 -- **按需取用**:从 `MeowOpt//` 按需部署,不一定要全部入库;若某工具体积仍偏重(如 mdnsd 的 885~994KB),可评估更小方案(OpenWrt linkd / libmdns,或自研极简响应器——仅回 A 记录 + `_ssh` 服务)以塞进固件 <200KB。 +- 体积小(约 <200KB)→ 可直接打进固件(/usr/bin 或由 supervisor/meow_svcd 启动)。 +- 体积大 → 放 TF 卡 `MeowOS/opt//`,由 MeowOS 启动时从卡加载(拔卡降级不崩)。 +- **按需取用**:从 `MeowOS/opt//` 按需部署,不一定要全部入库;若某工具体积仍偏重(如 mdnsd 的 885~994KB),可评估更小方案(OpenWrt linkd / libmdns,或自研极简响应器——仅回 A 记录 + `_ssh` 服务)以塞进固件 <200KB。 +- `.mpk` → 经 `nyai` 装到 `MeowAPPs/<包名>/`(数据建 `MeowData/<包名>/{data,cache}`)。 diff --git a/mips-repo/mdnsd/bin/mdnsd b/mips-repo/bins/mdnsd/bin/mdnsd similarity index 100% rename from mips-repo/mdnsd/bin/mdnsd rename to mips-repo/bins/mdnsd/bin/mdnsd diff --git a/mips-repo/mdnsd/bin/mdnsd.bin b/mips-repo/bins/mdnsd/bin/mdnsd.bin similarity index 100% rename from mips-repo/mdnsd/bin/mdnsd.bin rename to mips-repo/bins/mdnsd/bin/mdnsd.bin diff --git a/mips-repo/mdnsd/build.sh b/mips-repo/bins/mdnsd/build.sh similarity index 100% rename from mips-repo/mdnsd/build.sh rename to mips-repo/bins/mdnsd/build.sh diff --git a/mips-repo/mdnsd/manifest.md b/mips-repo/bins/mdnsd/manifest.md similarity index 100% rename from mips-repo/mdnsd/manifest.md rename to mips-repo/bins/mdnsd/manifest.md diff --git a/mips-repo/meow_mdns/bin/meow_mdns b/mips-repo/bins/meow_mdns/bin/meow_mdns similarity index 100% rename from mips-repo/meow_mdns/bin/meow_mdns rename to mips-repo/bins/meow_mdns/bin/meow_mdns diff --git a/mips-repo/meow_mdns/build.sh b/mips-repo/bins/meow_mdns/build.sh similarity index 100% rename from mips-repo/meow_mdns/build.sh rename to mips-repo/bins/meow_mdns/build.sh diff --git a/mips-repo/meow_mdns/manifest.md b/mips-repo/bins/meow_mdns/manifest.md similarity index 100% rename from mips-repo/meow_mdns/manifest.md rename to mips-repo/bins/meow_mdns/manifest.md diff --git a/mips-repo/meow_mdns/meow_mdns.c b/mips-repo/bins/meow_mdns/meow_mdns.c similarity index 100% rename from mips-repo/meow_mdns/meow_mdns.c rename to mips-repo/bins/meow_mdns/meow_mdns.c diff --git a/mips-repo/mpk/README.md b/mips-repo/mpk/README.md new file mode 100644 index 0000000..7bec691 --- /dev/null +++ b/mips-repo/mpk/README.md @@ -0,0 +1,49 @@ +# mips-repo/mpk/ — MeowOS `.mpk` 软件包仓库 + +本目录存放 MeowAPPs 的成品**`.mpk`** 软件包(应用分发单元),供 `nyai` 安装。规范见 +`APPS.md 附录 §3(.mpk) / §5(nyai)`,此处为速览与示例。 + +目前仓库为**空**(仅说明);首个包入仓后形如: + +``` +mpk/ + README.md # 本文件 + .mpk # 成品包(tar.gz) + Packages # 可选:nyai index mpk/ 生成的索引 +``` + +## `.mpk` 规范 + +- **包名 `` = 文件名茎 = `app.json` 的 `package`**(如 `os.meow.hello` → `os.meow.hello.mpk`)。 +- **格式**:`.mpk` = **tar.gz**,含 `app.json` + `meow` 二进制 + 资源,**不含 `data`/`cache`** + (运行时按设备生成)。打包目录为 `MeowAPPs/<包名>/`(剔除 data/cache 后打包)。 +- **关键字段**(在 `app.json` 内,`package` 必填):`package`/`name`/`version`/`exec`/ + `routes`/`services`/`depends`/`description` 等;`size`/`sha256` 由索引生成。 +- **安装**:`nyai install <包或文件.mpk>`(读 `.mpk` 内 `app.json`,校验包名/哈希,解压到 + `MeowAPPs/<包名>/`,同名先备份 `.bak_`,触发数据 init 建 `MeowData/<包名>/{data,cache}`)。 +- **导出**:`nyai export [out.mpk]`(打包 `MeowAPPs//`,不含 data/cache)。 +- **索引**:`nyai index ` 为目录生成 `Packages`(每行 `Package/Version/Filename/Size/SHA256/ + Depends/Description`,空行分隔记录),供经源(`sources.list`)安装解析依赖。 + +## 示例(结构示意) + +以 `os.meow.hello` 为例,打包自 `MeowAPPs/os.meow.hello/`: + +```bash +# 打包导出 +nyai export os.meow.hello # → os.meow.hello.mpk + +# 或手动:剔除 data/cache 后 tar.gz(与 launcher 同 gzip -dc | tar -x 管道语义) +cd MeowAPPs/os.meow.hello && tar czf os.meow.hello.mpk app.json meow assets/ + +# 本地源目录 + 索引生成 +mkdir -p /usr/data/mnt/sd_0/MeowOS/opt/repo +cp os.meow.hello.mpk /usr/data/mnt/sd_0/MeowOS/opt/repo/ +nyai index /usr/data/mnt/sd_0/MeowOS/opt/repo # 生成 Packages + +# 在设备上安装(M2.12+ 可直呼 nyai;更早固件用绝对路径) +nyai install os.meow.hello # 或 nyai install os.meow.hello.mpk +``` + +> 注:`nyai` 部署于卡 `MeowOS/opt/bin/nyai`(M2.12+ 由 `meow_card_path.sh` 前插 PATH 可直呼)。 +> 卡上源配置 `MeowOS/opt/nyai/sources.list`(无此文件默认本地源 `MeowOS/opt/repo`)。 diff --git a/patch_v2/hello_app/hello b/patch_v2/hello_app/hello index 4ed53877e30e080cb2e6e412642b6ec0b25a6668..1ffb0895de640c121c48abeb668aaacdd82d0f85 100755 GIT binary patch delta 53897 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 z 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 HTi5>sy-CuD diff --git a/patch_v2/meow_launcherd/meow_font.h b/patch_v2/meow_launcherd/meow_font.h index eb6b8ff..7860d54 100644 --- a/patch_v2/meow_launcherd/meow_font.h +++ b/patch_v2/meow_launcherd/meow_font.h @@ -117,6 +117,54 @@ int meow_font_config_multifont(int on, int meow_font_import_zip(const char *zip_path); /* TODO:MeowPanel */ int meow_font_export_zip(const char *family, const char *out_zip); /* TODO:MeowPanel */ +/* ================================================================== */ +/* M2.58 字体索引 + 应用字库查询(规格 §5.7:索引文件 / 查列表 / 丢失降级默认) */ +/* ================================================================== */ +/* 系统字体列表的持久化快照 = TF 卡 /MeowOS/config/fonts/index(CSV,每套一条: + * "family","weight","path","label","tier",glyph_count + * path = 卡根相对 font.png(如 MeowOS/fonts/misans/regular/font.png) + * label = 显示名(含字重 + 尺寸标记,如 `MiSans Regular(common≈4k)`) + * tier = common|gbk|full(档位,信息用 + 驱动按需加载) + * launcher 扫描 MeowOS/fonts/// 后写该文件(覆盖,含默认行 index0); + * SDK 侧 meow_font_get_available_count()/enumerate() 只从这个文件读,不依赖 launcher 内存数组; + * 无卡/无 index → 仅 1 项板载默认(family=default)。 */ +#define MEOW_FONT_INDEX_REL "MeowOS/config/fonts/index" + +/* 权威列表数据模型(SDK 侧快照,枚举时填充;规格 §5.7.1)。 */ +#ifndef MEOW_FONT_INFO_DEFINED +#define MEOW_FONT_INFO_DEFINED +typedef struct meow_font_info { + char family[64]; /* family slug = MeowOS/fonts// 一级目录名 */ + char name[64]; /* 显示名(index 无单列 → 回退 family) */ + char weight[32]; /* weight slug(regular|bold|…,缺省 regular) */ + char tier[8]; /* 档位 common|gbk|full(info 用) */ + int glyph_count; /* font.json glyph_count(info 用) */ + char label[128]; /* index 显示名(含字重 + 尺寸标记) */ + int size_list[16]; /* 原生字号表(index 无 → 空) */ + int size_count; /* 有效字号数 */ + int bit_depth; /* 4|8(index 无 → 0) */ + char path_png[320]; /* 卡根相对 MeowOS/fonts///font.png */ +} meow_font_info; +#endif + +/* 卡根:env MEOW_CARD_ROOT 优先,否则默认 /usr/data/mnt/sd_0。 */ +const char *meow_font_card_root(void); +/* /MeowOS/config/fonts/index 绝对路径写入 out;0=成功。 */ +int meow_font_index_path(char *out, int olen); +/* 读 index → 填充 out 数组(最多 max 条),返回「总条数」(无 index/不可读/空 → 1=合成默认行)。 + * 注意 out[i].path_png 为「卡根相对」路径,需经卡根解析为绝对路径再使用。 */ +int meow_font_index_load(meow_font_info *out, int max); + +/* 应用可读 TF 卡字体列表(规格 §5.7.2): + * - get_available_count():可用字库数(含默认;无卡 → 1)。 + * - enumerate(idx, out):按序号取,越界返回 0;idx=0=默认行(family=default)。 + * - select_by_id(id):id=0 跟随系统默认(font.file,经 env MEOW_FONT_PNG/IDX); + * id>0 会话内固定用该套;该套字库缺失 → 降级默认(不丢请求)+ WARN 日志 + * (meow_log→app 日志)。成功 0,越界负值。 */ +int meow_font_get_available_count(void); +int meow_font_enumerate(int idx, meow_font_info *out); +int meow_font_select_by_id(int id); + #ifdef __cplusplus } #endif diff --git a/patch_v2/meow_launcherd/meow_launcherd b/patch_v2/meow_launcherd/meow_launcherd index 3bdb672f9f2df4555e4ebb48220700b4fc76e5c4..0917e7ccfeb5ea68e5c7dd3aea69f85f52f515a2 100755 GIT binary patch delta 122016 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

fhEoPD&j2;7&$M4-^L{5we9<}BCv7%Al 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 delta 117366 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

kO1F!Fx)e1i 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 =XSQ#XNS}D4S_&^hY0>-w%p^xES2`p!B(S9 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/MeowOS/config/fonts/index(覆盖)。 + * 每套一条 `"family","weight","path","label","tier",glyph_count`;path=卡根相对 font.png。 + * 目录不存在则 mkdir -p;无卡(mkdir/fopen 失败)→ 静默放弃(仅内存默认项)。 + * 该文件是 SDK meow_font_get_available_count()/enumerate() 的持久数据源(规格 §5.7)。 */ +static void meow_font_write_index(const char *card_root) +{ + if (!card_root || !card_root[0]) return; + char t1[360], t2[380], base[400], path[420]; + snprintf(t1, sizeof t1, "%s/MeowOS", card_root); + snprintf(t2, sizeof t2, "%s/MeowOS/config", card_root); + snprintf(base, sizeof base, "%s/MeowOS/config/fonts", card_root); + /* 无卡(card_root 父目录不存在 → ENOENT)→ 静默放弃:仅内存默认项,不刷系统日志。 */ + if (mkdir(t1, 0755) != 0 && errno != EEXIST) { + if (errno != ENOENT) logmsg("fonts: index mkdir fail %s", t1); + return; + } + if (mkdir(t2, 0755) != 0 && errno != EEXIST) { logmsg("fonts: index mkdir fail %s", t2); return; } + if (mkdir(base, 0755) != 0 && errno != EEXIST) { logmsg("fonts: index mkdir fail %s", base); return; } + snprintf(path, sizeof path, "%s/index", base); + FILE *f = fopen(path, "w"); + if (!f) { logmsg("fonts: index fopen fail %s", path); return; } + char line[1024]; + for (int i = 0; i < font_presets_n; i++) { + const char *fam = font_preset_fams[i] ? font_preset_fams[i] : "default"; + const char *wt = font_preset_wts[i] ? font_preset_wts[i] : "regular"; + const char *val = font_presets[i] ? font_presets[i] : "MeowOS/fonts/default/regular/font.png"; + const char *lbl = font_preset_labels[i] ? font_preset_labels[i] : fam; + const char *tier = font_preset_tiers[i] ? font_preset_tiers[i] : "common"; + int o = 0; + o = font_index_csvq(line, sizeof line, fam); + line[o++] = ','; line[o] = 0; + o += font_index_csvq(line + o, sizeof line - (size_t)o, wt); + line[o++] = ','; line[o] = 0; + o += font_index_csvq(line + o, sizeof line - (size_t)o, val); + line[o++] = ','; line[o] = 0; + o += font_index_csvq(line + o, sizeof line - (size_t)o, lbl); + line[o++] = ','; line[o] = 0; + o += font_index_csvq(line + o, sizeof line - (size_t)o, tier); + line[o++] = ','; line[o] = 0; + snprintf(line + o, sizeof line - (size_t)o, "%d\n", font_preset_glyphs[i]); + fputs(line, f); + } + fclose(f); + logmsg("fonts: index written (%d entries) -> %s", font_presets_n, path); +} + /* 扫描 /MeowOS/fonts/ 下两级 //,重建字体 preset 列表。 * 每个 (family,weight) 组合一套(如 misans/regular、misans/bold);family 级 'default' 由 * 索引 0(默认字体)单独处理,不进循环,避免重复。上限 FONT_PRESETS_MAX - * (1 默认 + ≤16 用户字体)。无卡/无目录时仅默认。 */ + * (1 默认 + ≤16 用户字体)。无卡/无目录时仅默认。 + * + * M2.58 释放语义(规格 §5.7 需求 4「扫→写 index→释放(或按需读 index)」结论): + * - 持久来源 = /MeowOS/config/fonts/index(扫描后由 meow_font_write_index 落盘)。 + * SDK 只读该文件,从不依赖本内存数组。 + * - font_presets* / *_buf 均为「静态、有界(FONT_PRESETS_MAX=17)、非堆」数组:无内存泄漏, + * 故无运行期 free;「释放」含义 = 两个扫描点(启动 / 进设置页)重建 + 每套固定上限防膨胀。 + * - 设置字体列表(font.file / font.class_* 下拉、family→字重子菜单)在本视图内显示时用 + * 该数组;离开字体列表视图(run_settings_page 退出)无需显式 free(静态数组),下次 + * 进设置/重扫自动重建。 + * - ⚠️ 未做「启动后即清空数组」:meow_font_effective_paths_tiered(launch_app 大字库档位 + * 选库)与 meow_font_reload_multifont 在运行期持续读 font_presets_n,清空会造成大字库 + * 档位退化(red line「保持档位/多字体行为」)。如需「零驻留」,须把这几个核心路径改为 + * 直接读 index(较大重构,超出本批边界,留待后续)。 */ static void meow_font_scan_presets_root(const char *card_root) { font_presets_n = 0; @@ -1933,43 +2011,48 @@ static void meow_font_scan_presets_root(const char *card_root) char root[340]; snprintf(root, sizeof root, "%s/%s", card_root, MEOW_FONTS_CFG); DIR *d = opendir(root); - if (!d) return; /* 无卡/无字库目录:仅默认 */ - struct dirent *de; - while ((de = readdir(d)) && font_presets_n < FONT_PRESETS_MAX) { - if (de->d_name[0] == '.') continue; - if (!strcmp(de->d_name, "default")) continue; /* 默认字体由索引 0 单独处理 */ - char fampath[400]; - snprintf(fampath, sizeof fampath, "%s/%s", root, de->d_name); - DIR *w = opendir(fampath); /* 一级:/ */ - if (!w) continue; - struct dirent *we; - while ((we = readdir(w)) && font_presets_n < FONT_PRESETS_MAX) { - if (we->d_name[0] == '.') continue; - char dirpath[400], label[96], cs[8] = ""; int gc = 0; char wt[32] = "", nm[64] = ""; - snprintf(dirpath, sizeof dirpath, "%s/%s", fampath, we->d_name); - if (meow_font_probe_weight(dirpath, de->d_name, we->d_name, label, sizeof label, - cs, sizeof cs, &gc, wt, sizeof wt, nm, sizeof nm) == 0) - continue; /* 缺组件/损坏 → 跳过该套 */ - int i = font_presets_n; - snprintf(font_preset_val_buf[i], sizeof font_preset_val_buf[i], - "%s/%s/%s/font.png", MEOW_FONTS_CFG, de->d_name, we->d_name); - snprintf(font_preset_label_buf[i], sizeof font_preset_label_buf[i], "%s", label); - snprintf(font_preset_tier_buf[i], sizeof font_preset_tier_buf[i], "%s", cs[0]?cs:"common"); - snprintf(font_preset_fam_buf[i], sizeof font_preset_fam_buf[i], "%s", de->d_name); - snprintf(font_preset_wt_buf[i], sizeof font_preset_wt_buf[i], "%s", wt); - snprintf(font_preset_name_buf[i], sizeof font_preset_name_buf[i], "%s", nm); - font_presets[i] = font_preset_val_buf[i]; - font_preset_labels[i] = font_preset_label_buf[i]; - font_preset_tiers[i] = font_preset_tier_buf[i]; - font_preset_fams[i] = font_preset_fam_buf[i]; - font_preset_wts[i] = font_preset_wt_buf[i]; - font_preset_names[i] = font_preset_name_buf[i]; - font_preset_glyphs[i] = gc; - font_presets_n++; + if (d) { /* 无卡/无字库目录 → 跳过扫描,仅默认 */ + struct dirent *de; + while ((de = readdir(d)) && font_presets_n < FONT_PRESETS_MAX) { + if (de->d_name[0] == '.') continue; + if (!strcmp(de->d_name, "default")) continue; /* 默认字体由索引 0 单独处理 */ + char fampath[400]; + snprintf(fampath, sizeof fampath, "%s/%s", root, de->d_name); + DIR *w = opendir(fampath); /* 一级:/ */ + if (!w) continue; + struct dirent *we; + while ((we = readdir(w)) && font_presets_n < FONT_PRESETS_MAX) { + if (we->d_name[0] == '.') continue; + char dirpath[400], label[96], cs[8] = ""; int gc = 0; char wt[32] = "", nm[64] = ""; + snprintf(dirpath, sizeof dirpath, "%s/%s", fampath, we->d_name); + if (meow_font_probe_weight(dirpath, de->d_name, we->d_name, label, sizeof label, + cs, sizeof cs, &gc, wt, sizeof wt, nm, sizeof nm) == 0) + continue; /* 缺组件/损坏 → 跳过该套 */ + int i = font_presets_n; + snprintf(font_preset_val_buf[i], sizeof font_preset_val_buf[i], + "%s/%s/%s/font.png", MEOW_FONTS_CFG, de->d_name, we->d_name); + snprintf(font_preset_label_buf[i], sizeof font_preset_label_buf[i], "%s", label); + snprintf(font_preset_tier_buf[i], sizeof font_preset_tier_buf[i], "%s", cs[0]?cs:"common"); + snprintf(font_preset_fam_buf[i], sizeof font_preset_fam_buf[i], "%s", de->d_name); + snprintf(font_preset_wt_buf[i], sizeof font_preset_wt_buf[i], "%s", wt); + snprintf(font_preset_name_buf[i], sizeof font_preset_name_buf[i], "%s", nm); + font_presets[i] = font_preset_val_buf[i]; + font_preset_labels[i] = font_preset_label_buf[i]; + font_preset_tiers[i] = font_preset_tier_buf[i]; + font_preset_fams[i] = font_preset_fam_buf[i]; + font_preset_wts[i] = font_preset_wt_buf[i]; + font_preset_names[i] = font_preset_name_buf[i]; + font_preset_glyphs[i] = gc; + font_presets_n++; + } + closedir(w); } - closedir(w); + closedir(d); } - closedir(d); + /* M2.58:扫描结果落盘为 /MeowOS/config/fonts/index(含默认行 index0), + * 作为 SDK meow_font_get_available_count()/enumerate() 的持久数据源;无卡时仅默认 1 行, + * 由 meow_font_write_index 内部 mkdir-fail 静默放弃(此路径不刷屏)。 */ + meow_font_write_index(card_root); } /* 设备默认卡根扫描(等价现状:无卡时 opendir 失败 → 仅默认字体)。 */ diff --git a/patch_v2/meow_svcd/meow_svcd.md b/patch_v2/meow_svcd/meow_svcd.md index 71428da..a5b0e07 100644 --- a/patch_v2/meow_svcd/meow_svcd.md +++ b/patch_v2/meow_svcd/meow_svcd.md @@ -158,6 +158,32 @@ meow_svcd pid 应答:`OK` / `ERR no-such-service` / 多行 `svc=... state=... pid=... restart=... exit=...`。 +### 6.1 `systemctl` 式 CLI 用法(SSH 终端示例) + +守护已由固件 `etc/init.d/S89meow_svcd` 开机自启,SSH 登录设备后**直接敲**命令即可,无需先知道 socket: + +```bash +meow_svcd status # 列出所有服务 + 全局状态 +# # meow_svcd status +# card_present=1 wifi_up=0 services=3 +# svc=mdnsd state=running pid=1234 restart=0 exit=0 trigger=boot +# svc=meow_netd state=stopped pid=0 restart=0 exit=0 trigger=card-mount +# svc=ntpc state=stopped pid=0 restart=0 exit=0 trigger=card-mount + +meow_svcd restart mdnsd # 重启单个服务(如板载 mDNS 应答器) +meow_svcd start meow_netd # 启动单个服务 +meow_svcd stop all # 停止全部服务 +meow_svcd reload # 重读板载 + TF 双源 services.d 配置 +meow_svcd pid # 打印守护进程 pid +``` + +- **socket**:控制走 AF_UNIX 单行文本,默认 `/tmp/meow_svcd.sock`(`--sock`/`MEOW_SVCD_SOCK` 可改)。 + 守护**未运行**时命令回退打印状态文件 `/tmp/meow_svcd.status`(或 `card_present=0 services=0`)并以退出码 1 返回。 +- **守护前台**:`-f`/`--foreground` —— 守护自身跑前台,供 supervisor `fork/exec`+`waitpid` 托管; + 默认(无子命令)则为后台常驻。 +- 应答:成功 `OK`(`pid`→pid 数字);服务不存在 `ERR no-such-service`;`svc=... state=...` 行 + 含 `pid/restart(重启计数)/exit(上次退出码)/trigger`。 + ## 7. 编译 ```bash diff --git a/patch_v2/sdk/meow_ui.h b/patch_v2/sdk/meow_ui.h index 3614006..e7372c3 100644 --- a/patch_v2/sdk/meow_ui.h +++ b/patch_v2/sdk/meow_ui.h @@ -333,6 +333,41 @@ int meow_notify_has_active(void); /* 1=尚有活动通知,0=无 * const char *meow_notify_urgency_str(meow_notify_urgency u); const char *meow_notify_category_str(meow_notify_category cat); +/* ============================================================ */ +/* §5.7 应用可读 TF 卡字体列表(M2.58:字体索引 / 查列表 / 丢失降级默认) */ +/* ============================================================ */ +/* 系统字体管理器的面向应用接口(规格 §5.7.1/§5.7.2): + * - 权威列表 = launcher 扫描 MeowOS/fonts/// 后落盘的持久文件 + * MeowOS/config/fonts/index(CSV:family,weight,path,label,tier,glyph_count)。 + * app 只经本接口读该列表(不直接拼路径、不依赖 launcher 内存数组)。 + * - 渲染仍走 env MEOW_FONT_PNG/MEOW_FONT_IDX(launcher 注入的「当前生效字体」, + * 选中字体那一套);本节的 get_available_count/enumerate 只负责「列有哪些库」, + * select_by_id 负责「app 会话内固定用哪套」。两路明确。 + * - 无卡 / 无 index → 仅 1 项板载默认(family=default)。 */ +#ifndef MEOW_FONT_INFO_DEFINED +#define MEOW_FONT_INFO_DEFINED +typedef struct meow_font_info { + char family[64]; /* family slug = MeowOS/fonts// 一级目录名 */ + char name[64]; /* 显示名(index 无单列 → 回退 family) */ + char weight[32]; /* weight slug(regular|bold|…,缺省 regular) */ + char tier[8]; /* 档位 common|gbk|full(info 用) */ + int glyph_count; /* font.json glyph_count(info 用) */ + char label[128]; /* index 显示名(含字重 + 尺寸标记) */ + int size_list[16]; /* 原生字号表(index 无 → 空) */ + int size_count; /* 有效字号数 */ + int bit_depth; /* 4|8(index 无 → 0) */ + char path_png[320]; /* 卡根相对 MeowOS/fonts///font.png */ +} meow_font_info; +#endif + +/* 可用字库数(含默认;无卡 → 1)。 */ +int meow_font_get_available_count(void); +/* 按序号取:idx=0=默认行(family=default);越界返回 0。 */ +int meow_font_enumerate(int idx, meow_font_info *out); +/* 选该套为 app 会话默认字体:id=0 跟随系统默认(font.file,经 env);id>0 固定用该套。 + * 该套字库缺失 → 降级默认(不丢请求)+ WARN(meow_log→app 日志)。成功 0,越界负值。 */ +int meow_font_select_by_id(int id); + /* ============================================================ */ /* §10 字体分层 / 大字库(M2.5x:基座声明 + font 域已实现按档装载) */ /* ============================================================ */ diff --git a/patch_v2/sdk/meow_ui_gfx.c b/patch_v2/sdk/meow_ui_gfx.c index 082d937..e26f796 100644 --- a/patch_v2/sdk/meow_ui_gfx.c +++ b/patch_v2/sdk/meow_ui_gfx.c @@ -361,19 +361,22 @@ void meow_ui_swipe_hint(int x) * 有状态栏(非全屏)→ y = 状态栏高度;收合(collapsed)→ y=提示线下缘 * (MUI_SBAR_COLLAPSE_H,与提示线不重叠);无状态栏(全屏/隐藏)→ y=0。 */ int hy = meow_ui_statusbar_height(); - /* x<0 视为清空(条长 0);条长上限=屏宽。 */ - if (x < 0) x = 0; - if (x > g_xres) x = g_xres; - /* 只按「新旧长度的差」增量绘制,避免整段重涂背景色: - * - 伸长:仅补画新增段(旧段已是 accent,不再用 bg 重涂——否则 app 底色≠theme bg - * 时会在旧段留下 bg 色块,就是残留残条); - * - 回缩/清空:仅把「超出新长度」的尾部填回背景色(实时回缩)。 */ - if (x > g_hint_last) { - meow_ui_fill_rect(g_hint_last, hy, x - g_hint_last, MUI_HINT_H, th->accent); - } else if (x < g_hint_last) { - meow_ui_fill_rect(x, hy, g_hint_last - x, MUI_HINT_H, th->bg); + /* 单一实现(与非全屏 Hello 完全一致,全屏仅 hy 不同):grow 画 0..x、shrunk 先清旧长 + * 再画 0..x、x<=0 清空。x<0 视为清空;条长上限=屏宽。 */ + if (x > 0) { + if (x > g_xres) x = g_xres; + /* 往回滑(新长度 < 上次)时,先清掉「上次画到旧长度、但本次超出的部分」, + * 否则条只增不减(右滑变长、左滑回缩实时可见)。 */ + if (g_hint_last > x) meow_ui_fill_rect(0, hy, g_hint_last, MUI_HINT_H, th->bg); + /* 条色取主题前景(fg):fg 定义为与背景对比,能同时覆盖「非全屏(底=主题bg)」与 + * 「全屏 Hello 类(底=主题accent)」两种情况——accent 在 Hello 全屏 accent 底上同色不可见。 */ + meow_ui_fill_rect(0, hy, x, MUI_HINT_H, th->fg); + g_hint_last = x; + } else if (g_hint_last > 0) { + /* 手指回原点/抬手未达标/抬手达标:清掉此前画的条(填回背景色) */ + meow_ui_fill_rect(0, hy, g_hint_last, MUI_HINT_H, th->bg); + g_hint_last = 0; } - g_hint_last = x; /* 不发 flush:由调用方 meow_ui_flush_region(0,0,宽,6) 只刷顶部条 */ } diff --git a/patch_v2/sdk/meow_ui_input.c b/patch_v2/sdk/meow_ui_input.c index c964f8c..1f27d2d 100644 --- a/patch_v2/sdk/meow_ui_input.c +++ b/patch_v2/sdk/meow_ui_input.c @@ -125,7 +125,6 @@ static int t_press_valid = 0; /* BTN_TOUCH=1 已见(本次按下的 gate static int t_dx = 0, t_dy = 0; /* 按下原点(BTN_TOUCH 后首个有效 ABS 锁定) */ static int t_cx = 0, t_cy = 0; /* 当前坐标(-1=本次尚未见到有效坐标) */ static int t_origin_valid = 0; /* 原点是否已锁定 */ -static int t_gmax_dx = 0; /* 本手势「最大右移位移」(t_cx-t_dx 的最大值,条长上限) */ /* 按下边沿:只标记按下,绝不用传入坐标立即锁原点(避免用上一手势残留坐标当原点)。 * t_cx/t_cy 归 -1 —— 本次手势以「无坐标」起步,只接受随后到来的有效 ABS。 */ @@ -137,7 +136,6 @@ static void touch_press(int x, int y) t_origin_valid = 0; t_cx = -1; t_cy = -1; t_dx = 0; t_dy = 0; - t_gmax_dx = 0; /* 新手势:最大右移位移清零(条长从 0 计) */ } /* 由 ABS_X/ABS_Y 驱动:若本次按下且原点未锁且坐标有效 → 锁原点;再更新当前坐标。 */ static void touch_update(int x, int y) @@ -147,17 +145,13 @@ static void touch_update(int x, int y) } if (x >= 0) t_cx = x; if (y >= 0) t_cy = y; - if (t_down && t_origin_valid) { - int dx = t_cx - t_dx; - if (dx > t_gmax_dx) t_gmax_dx = dx; /* 记录本手势已达的最大右移位移(条长上限) */ - } } static void touch_release(void) { if (!t_down) return; t_down = 0; t_press_valid = 0; /* 本次按下从未锁到有效坐标(幽灵触摸/坐标未就绪):丢弃,且清空全部轨迹。 */ - if (!t_origin_valid) { t_cx = t_cy = -1; t_dx = t_dy = 0; t_gmax_dx = 0; return; } + if (!t_origin_valid) { t_cx = t_cy = -1; t_dx = t_dy = 0; return; } t_origin_valid = 0; int mdx = t_cx - t_dx, mdy = t_cy - t_dy; int adx = mdx < 0 ? -mdx : mdx, ady = mdy < 0 ? -mdy : mdy; @@ -169,8 +163,7 @@ static void touch_release(void) * 被手势级清空,绝不继承上一手势坐标,确保: * ① 中部右滑不会误判成左缘返回(t_dx>=EDGE_W); * ② 先点中部再侧滑不返回(原点锁定在中部,>=EDGE_W),符合「必须从左缘起划」; - * ③ 返回判定要求右移严格正向(t_cx-t_dx>=0 且 ≥SWIPE_THRESH),杜绝「向左划也误返回」; - * 左划过程仅让进度条实时回缩,不额外生长(过程见上方 MEOW_EV_SWIPE_PROGRESS)。 + * ③ 右移严格正向(t_cx-t_dx>=0),杜绝「向左划也出条/误返回」。 * SDK 统一上报为 MEOW_SWIPE_LEFT(设计"左滑=返回"契约,hello 用 on_swipe(LEFT) 退出)。 * * 屏幕中部滑动不是返回手势:中部右滑→RIGHT(内容导航),中部左滑→非返回(落 TAP, @@ -199,7 +192,7 @@ static void touch_release(void) push_ev(MEOW_EV_TAP, t_cx, t_cy); } /* 手势级干净起点:清空全部轨迹,下一手势从零开始,杜绝污染无自愈。 */ - t_cx = t_cy = -1; t_dx = t_dy = 0; t_gmax_dx = 0; + t_cx = t_cy = -1; t_dx = t_dy = 0; } /* ---- 输入线程:poll 所有 event 设备 + 解析 ---- */ @@ -231,22 +224,14 @@ static void *input_thread(void *arg) if (code == ABS_X || code == ABS_MT_POSITION_X) { if (t_down) touch_update(val, t_cy); /* 锁原点+更新当前(t_down 时才驱动) */ else t_cx = val; - /* 左滑进度实时上报(视觉条)。抬手触发仍由 touch_release 判定;这里只报过程。 - * 修复要点(左缘返回滑条 bug): - * ① 双向上报(不再要求 t_cx>t_dx):向右→条伸长、向左→条实时回缩, - * 摒弃「只在返回瞬间闪末帧 / 反向才出条」; - * ② 仅左缘起手(t_dx= 0 && t_dx < EDGE_W) { - int dx = t_cx - t_dx; - if (dx > t_gmax_dx) t_gmax_dx = dx; - int len = dx < 0 ? 0 : dx; - if (len > t_gmax_dx) len = t_gmax_dx; - push_ev(MEOW_EV_SWIPE_PROGRESS, t_dx, len); - } + /* 左滑进度实时上报(视觉条):原点确实在左缘(t_dxt_dx)——grow/回缩全程由「非全屏已验证的同一条路径」驱动,全屏仅 + * 垂直位置 hy 不同(hy=meow_ui_statusbar_height()),别无全屏特判。 + * 抬手触发仍由 touch_release 判定;这里只报过程(事件载荷 b=当前X)。 + * t_dx 是本次按下后首个有效 ABS 锁定的真实按下点(非残留),且每次抬手已 + * 清空,杜绝「中部点一下出条 / 向左划也出条」。 */ + if (t_down && t_origin_valid && t_dx >= 0 && t_dx < EDGE_W && t_cx > t_dx) + push_ev(MEOW_EV_SWIPE_PROGRESS, t_dx, t_cx); } else if (code == ABS_Y || code == ABS_MT_POSITION_Y) { if (t_down) touch_update(t_cx, val); else t_cy = val; @@ -335,17 +320,17 @@ void meow_ui_run(const meow_ui_events *ev) meow_ui_sys_notif_pull(); } else if (e.type == MEOW_EV_SWIPE_PROGRESS) { if (in_startup) continue; /* 启动窗口进度条静音 */ - /* e.a=按下X(t_dx),e.b=条长 len(输入层已 clamp 到「本手势最大右移位移」且≥0)。 - * SDK 自动画顶部条:从 x=0 画到 len(右移位移),向右伸长、向左实时回缩。 - * M2.5x/A-13:全屏/收合下「左缘返回手势保留」,顶部动态提示条仍需绘制——不再以 - * meow_ui_sys_statusbar_active()(全屏/隐藏=0)开关,否则全屏时滑条完全不显示。 - * 条位 y=meow_ui_statusbar_height():非全屏=状态栏下沿、全屏=0、收合=提示线下缘 - * (MUI_SBAR_COLLAPSE_H),与提示线不重叠加。APP 若注册 on_swipe_progress 仍可自绘 - * (系统条照常画);递交给 app 的是 (len-x_start) 使 x_start+dx==len,与系统条同长。 */ - int len = e.b; - meow_ui_swipe_hint(len); + int x0 = e.a, xc = e.b, dx = xc - x0; /* dx=当前X-按下X */ + /* SDK 自动画顶部条:长度=手指当前 X(=距左缘距离,向内划长度随位移增长)。 + * 全屏/收合下「左缘返回手势保留」,顶部动态提示条(meow_ui_swipe_hint)照常绘制 + * (与 agent-108:不再以 meow_ui_sys_statusbar_active()(全屏/隐藏=0)开关,否则 + * 全屏时滑条完全不显示)。条位 y=meow_ui_statusbar_height():非全屏=状态栏下沿 + * (28)、全屏=顶部、收合=提示线下缘(MUI_SBAR_COLLAPSE_H),与提示线不重叠加—— + * 全屏与非全屏共用同一条绘制/进度路径,只 hy 不同,无全屏特有的坐标/方向/最大值逻辑。 + * APP 若注册 on_swipe_progress 仍可自绘(系统条照常画;x_start+dx==当前X,幂等)。 */ + meow_ui_swipe_hint(xc); if (g_events_set && g_events.on_swipe_progress) - g_events.on_swipe_progress(e.a, len - e.a); + g_events.on_swipe_progress(x0, dx); meow_ui_flush_region(0, meow_ui_statusbar_height(), meow_ui_width(), 6); } }