Files
MeowOS-For-R3P2/patch_v2/files_app/README.md
T
MeowOS e95552b949 feat(sdk): 通用长按事件 (agent-191, 用户定案) — MEOW_EV_LONG_PRESS 坐标式事件+meow_ui_set_long_press_cb/ms(opt-in,默认500ms,移动>12px取消,长按后抬手抑制TAP/SWIPE); 按钮按住视觉阈值同源; files 长按从App层迁入 SDK
meow_ui.a 4335c33a→6de89c27; hello→72fb20da; files→b1c4f58f
宿主 widgets(含6条长按断言)/p1p2p3/ime_fix/test_fsx 全 PASS; 未改 meow_ui_events 结构(防 -Wmissing-field-initializers 破坏既有App)
2026-08-31 05:04:26 +08:00

95 lines
5.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# os.meow.files — MeowOS 外置文件管理器
TF 卡应用(`framework=1` 走 `meow_ui` SDK)。浏览 TF 卡目录树,支持进/退目录、列表虚拟化、
行操作(删除/重命名/新建目录/属性)、文本预览(≤256KB 截断)、空态/错误页;写操作严格限制在
TF 卡内(`/usr/data/mnt/sd_0`),拒绝 `..` 越界与卡外路径。
## 目录结构(多文件,批次②拆分范本)
```
patch_v2/files_app/
├── app.c # main + 装配 + 事件分发(key/tap/swipe/tick/touch → 当前页)
├── files_internal.h # 跨 TU 共享头(Activity id / 布局 / chrome/browser/viewer 声明)
├── build_files.sh # 交叉编译脚本(zig-mipsel-cc 静态链 meow_ui.a libz.a -lpthread)
├── app.json # {"name":"Files","exec":".../os.meow.files/files",...,"framework":1,"immersive":1}
├── README.md
├── ui/
│ ├── browser.c # 目录浏览页(ACT_BROWSER 根页):虚拟化列表 + 空态 + 行操作
│ ├── viewer.c # 文本预览页(ACT_VIEWER 子页):只读、可滚动、≤256KB 截断
│ └── common/
│ └── chrome.c # 共享 chrome:topbar 建置 / 内容区几何 / 空态&页脚绘制
├── logic/
│ ├── fsx.h # 纯业务接口(不依赖 meow_ui)
│ └── fsx.c # 路径安全/格式化/枚举排序/虚拟化区间/写操作(可宿主测)
└── test/
└── test_fsx.c # 宿主单元自测(gcc 直接编,指向临时卡根)
```
## 构建
```bash
cd patch_v2/files_app && ./build_files.sh
# 产物:files(MIPS32r2 静态 ELF,~270KB)+ ./files + app.json
```
构建脚本仿 `hello_app/build_hello.sh`:`zig-mipsel-cc -Os -static -Wall -Wextra -I../sdk -I.`
链 `../sdk/meow_ui.a "$SYSROOT/lib/libz.a" -lpthread`。本应用是 **§5.5 结构化列表(`meow_listview`)的
首个消费方**(`patch_v2/sdk/meow_ui_widget.c` 新增 `W_LISTVIEW`:图标+标题+副标题+右侧操作+选中);
`-Wall -Wextra` 0 warning。行滚动/选中/命中由 SDK 收口,App 只驱动 scroll/sel 并分发(行体=进目录/
开预览;右侧 `⋯` 或长按→BottomSheet)。
## 部署
```
/usr/data/mnt/sd_0/MeowAPPs/os.meow.files/
├── app.json
└── files
```
数据目录 `MeowData/os.meow.files/{data,cache}` 由 launcher 经 `MEOW_DATA_DIR`/`MEOW_CACHE_DIR` 注入;
v1 无需持久化,暂未使用(启动恒进卡根 `/usr/data/mnt/sd_0/`)。
## 宿主自测(不跨编/不刷机)
```bash
cd patch_v2/files_app
gcc -O2 -Wall -Wextra -DFSX_SD_ROOT='"/tmp/meowfsx_fsx_test"' -Ilogic \
test/test_fsx.c logic/fsx.c -o /tmp/test_fsx && /tmp/test_fsx
```
覆盖:路径安全(`within_sd`/`join`/`sanitize`/`dirname`/`basename`)、展示格式化(`fmt_size`/`fmt_time`)、
目录枚举排序(`scan_dir`/`sort`)、虚拟化区间(`visible_range`/`max_scroll`)、写操作(`mkdir`/`rename`/
`delete`,含卡外/越界拒绝)、非文本写拒绝。宿主全 PASS。
## 交互
- 触摸:行 body=进目录/开文本预览;右侧 `⋯` 或长按→BottomSheet(删除[确认弹窗]/重命名[IME]/新建目录[IME]/属性[大小·mtime]);
TopAppBar `NEW`=当前目录新建。
- 左缘左滑/返回钮:预览页→回目录;浏览器→上级目录;卡根再左滑=退出 App。
- 物理键不映射(APPS.md §3.4.1):息屏/音量/媒体语义归系统/SDK。
## 已知限制 / SDK 能力说明
1. **结构化列表(`meow_listview`)已落地**:`ui/browser.c` 的自绘 custom 列表已迁移到 SDK `W_LISTVIEW`
(行数据源 `browser_src2` 填 `meow_list_item`)。图标(目录/文件内置符号)、名称、大小/时间副标题、
右侧 `⋯` 操作钮、虚拟化、空态/页脚、禁用行不响应均由 SDK 收口;`fsx_scan_dir` 仍以有界数组缓存
(`FSX_MAX_ENTRIES=1024`),列表虚拟化只画可见行——大目录不一次全读进内存。
- **long-press 已下沉 SDK(§6.3)**:SDK 通用长按判定「按下 ≥ 阈值(默认 500ms,可配)未抬手且
位移 ≤ 容忍」→ 经 `meow_ui_set_long_press_cb` 注册的回调带坐标交给本页;`browser_on_long_press`
用 `meow_listview_hit` 行命中打开 BottomSheet。App 层长按计时(`browser_tick`/`g_press_ms`)已删除,
其抬手 TAP 由 SDK 抑制(长按不再触发点击)。
2. **中文字形**:SDK 默认 `common` 字库(≈4k)不含 CJK 全量;exFAT 中文文件名/中文文本预览在 common 档会显示缺字豆腐。
预览页不声明 `fonts`(app.json 未加 `"fonts":"full"`/`"gbk"`),如需中文预览可在 app.json 声明大字号档。
3. **预览仅文本**:按扩展名白名单 + 首 512 字节 NUL 嗅探判文本;二进制/图片无预览(提示「not a text file」)。
超 256KB 只读前 256KB,页脚标注 `>256KB (truncated)`。
4. **符号链接不追链**:v1 视 symlink 为普通文件展示/操作(lstat),避免链出卡外。
5. **单目录条目上限**:>1024 项时只展示前 1024 并在页脚标注 `showing first 1024`(分页流式读目录为二期)。
## 验证状态
- 编译:`-Wall -Wextra` 0 warning/0 error,产物 `files`(MIPS32r2 静态 ELF)。
- 宿主:`test/test_fsx.c` 全 PASS。
- qemu-mipsel(无 /dev/fb0 → SDK 离屏 480×720):正常运行到事件循环,导出离屏帧,
确认 init/建页/topbar(返回+NEW)/空态(NO STORAGE CARD)渲染正确、SIGTERM 干净退出。
- 实机目录列表渲染(有真实 TF 卡目录)需刷机/设备挂载验证——宿主模拟无法造出 `/usr/data/mnt/sd_0`。