Files
MeowOS-For-R3P2/patch_v2/reader_app/reader_internal.h
T
AskaEth 2de47154bf fix(reader): M41 书架补滚动输入通路 — 列表/宫格、format/folder 全都能滑
书架(shelf.c)从 M6.40 首版起就**没有**滚动输入通路,不是 M32/M33 的回归:
  1) app_on_touch_down/move 只路由给阅读页 → 书架没有跟手拖动;
  2) shelf_on_swipe 用 dy 去 scroll_by,而 SDK 固定按 on_swipe(dir, dist, 0)
     分发(总位移在第 2 参 dx,dy 恒 0)→ 恒 scroll_by(0),死代码。
两条都在 shelf.c 自己身上,list/grid × format/folder 共用同一段,所以四种组合
全都「滑不动」(files/ncm 能滑是因为它们各自实现了 touch_down/move → scroll_by)。

修复:
- app.c:touch down/move 也路由给书架(阅读页优先级不变)。
- shelf.c:
  * 新增 shelf_on_touch_down/move 跟手拖动:按下点在内容区才起手;纵向主导(≥4px)
    才锁滚动,横向主导直接取消(不抢左缘返回);逐帧 scroll_by(-dy) 只重画内容区。
  * shelf_on_swipe 改按 dist(=dx,兼容 dy 分支)+ 方向定符号;本次手势已跟手滚过
    就不再叠加(防一划滚两倍)。
  * 拖动后的抬手吞掉 TAP(<65px 的拖动 SDK 报 TAP)→ 滑动时不会误开书/误进目录。
  * 控件重建(进/退目录、布局/分组切换、刷新)清滚动手势态,避免旧标记吃掉下一次滑动。
  * 提示条抽成 shelf_draw_notice(),滚动局部重画时照常重贴。
- 新增宿主回归 test/shelf_scroll_smoke.c(真实 shelf.c + 真实 SDK 绘制 + back_buf
  像素断言,27 条):format/folder × list/grid 都能滑;3 本书的目录滑不动;
  拖动后不误进目录、干净点击仍能进目录;folder 进出目录仍正常。把 dist=dx 改回
  dist=dy 后同一测试 6 条 FAIL(红绿对照证明它抓的就是这个 bug)。
- build_reader.sh 接入该测试;READER_SD_ROOT 加 #ifndef 以便宿主把扫描根指到临时目录。
- app.json 版本 0.1.7/code8 → 0.1.8/code9(同一版本号不发两个构建)。

宿主验证:shelf_scroll_smoke 27/27、shelf_group_smoke 99/99、shelf_index_smoke
170/170、其余 core/seg/chapter/loaders 全绿;reader 1718468B md5 259cb6ed5a60…
(meow_ui.a 用本仓 SDK 源码重编:79 成员全 MIPS32r2 o32)。真机验证待刷机
0.8.49 完成后部署(设备验证需用户手滑,面板无任意滑动注入端点)。
2026-11-11 13:01:12 +08:00

64 lines
3.1 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* reader_internal.h — os.meow.reader 应用内部共享声明(视图 + 装配)。
*
* 层级(仿 hello_app):app.c 只做 init/建页/事件分发;shelf(书架)、reader(阅读页)各一个
* meow_view(ACTIVITY)。阅读页用 W_CUSTOM 画布 + App 自绘 back_buf(翻页 blit 局部脏区)。
*/
#ifndef READER_INTERNAL_H
#define READER_INTERNAL_H
#include "meow_ui.h"
#include "meow_ui_view.h"
#define ACT_SHELF 0
#define ACT_READER 1
#define ACT_SETTINGS 2
/* ---- 书架(app/shelf.c)---- */
meow_view *shelf_view_create(void);
int shelf_is_active(void);
int shelf_on_tap(int x, int y);
void shelf_on_swipe(int dir, int dx, int dy);
void shelf_on_touch_down(int x, int y); /* M41 跟手拖动滚动(列表/宫格同一通路) */
void shelf_on_touch_move(int x, int y);
void shelf_redraw(void);
int shelf_back(void); /* M33:folder 模式返回上一级;1=已回退 0=已在根 */
void shelf_set_view(int grid); /* 1=grid 0=list;读 reader.conf ui.shelf_layout(A) */
void shelf_set_group(int folder); /* 1=folder 0=format;写 ui.shelf_group(M27) */
void shelf_on_tick(uint64_t now); /* 提示条 6s 到期消失(书架前台时由 app.c 调) */
/* ---- 阅读页(app/reader.c)---- */
meow_view *reader_view_create(void);
int reader_is_active(void);
void reader_on_tap(int x, int y);
void reader_on_swipe(int dir, int dx, int dy);
void reader_on_tick(uint64_t now);
void reader_on_touch_down(int x, int y); /* R3 段刮擦:右缘拖动快速定位 */
void reader_on_touch_move(int x, int y);
/* 打开一本书(书架调;成功后由书架 push ACT_READER 进入阅读页)。path=TXT 完整路径。
* 返回 0=成功(书已打开、页位图已备、可 push);非 0=失败(未能打开,调用方不 push)。 */
int reader_open(const char *path);
/* R3.4 章节重解析(app/settings.c 调用):是否打开了支持章节解析的书(TXT+seg 模式)。
* reader_reparse_chapters 返回 n=章节数 / 0=无章节(成功)/ -1=不可用 / -2=扫描失败(未落盘)。 */
int reader_has_chapter_book(void);
int reader_reparse_chapters(void);
/* ---- 全局设置页(app/settings.c,C)---- */
meow_view *settings_view_create(void);
int settings_is_active(void);
int settings_on_tap(int x, int y);
void settings_reload(void); /* 改配置后让设置页/其它页重读 reader.conf */
/* 系统翻页信号(app/reader_ipc.c 后台线程收到 MSG_KEY_PAGEUP/PAGEDOWN 后调;
* 仅置 pending 计数,UI 线程 reader_on_tick 消费转 reader_turn_animated,E)。 */
void reader_page_key(int dir); /* dir=+1 下一页;-1 上一页 */
/* 返回可执行文件所在包根(用于定位 /usr/data/mnt/sd_0)——由 app.c 注入与否;
* R1 用固定 TF 根 /usr/data/mnt/sd_0。宿主单测用 -DREADER_SD_ROOT="..." 指到临时目录。 */
#ifndef READER_SD_ROOT
#define READER_SD_ROOT "/usr/data/mnt/sd_0"
#endif
#endif /* READER_INTERNAL_H */