feat: M6.43 — reader分段流式读取(Phase1,只txt) + 面板前台管理/返回回桌面按钮

- reader分段(只txt): core/seg.{h,c} 512KB码位对齐切段(尾字完整)+manifest+按需读单段; book.c rd_book_open只布局每页所在段(治CPU100%/返回无效) load_seg只读当前段(非txt原路径); reader.c 进度实时保存(翻页/刮擦/字号/编码dirty+on_tick节流落盘+退出即时写,锚点存段号,崩溃不丢进度); rdtxt.c fread替代fgetc(去开书扫描卡顿); Phase2(双段拼接+4%释放)留待
- 面板: /api/ams/bg加fg/fg_count(后台保持向后兼容)+POST /api/ams/:pkg/killfg(前台救命:优先am kill,launcher拒则pid直信号SIGTERM->SIGKILL绕过门控)+前端/#/bg前台组'终止'绿徽标+确认弹窗(一键清仍只后台不误杀前台); POST /api/input/gesture(返回=左缘右滑/回桌面=底部上滑,注入滑动轨迹复用SDK手势)+前端屏幕控制页加返回/回桌面MD3按钮

0warning;宿主test_reader_core 72-0/seg_smoke 19-0/loaders_smoke/book_smoke/formats_smoke PASS;面板selftest/node check PASS
This commit is contained in:
AskaEth committed 2026-11-04 19:47:10 +08:00
1 parent a64ae06eb6
commit f40abbd494
17 files changed
+1069 -70

No files matched your search

+17 -2
View File
@@ -56,6 +56,8 @@ static uint32_t g_page_bg, g_page_fg; /* 正文页底/字色(24bit) */
static char g_chapter[128]; /* 顶栏章节名(TXT 无章节=文件名) */
static int g_show_header, g_show_footer; /* 页头条/底条显隐(rdconf.rd.header/footer) */
static volatile int g_volpage_pending; /* 系统翻页信号待消费(IPC 线程置位,UI tick 消费,E) */
static int g_prog_dirty; /* 阅读进度变更待写(翻页/刮擦/字号/编码;R3.2 定时落盘防崩溃丢进度) */
static uint64_t g_prog_last_save_ms; /* 上次进度落盘时刻(tick 节流) */
#define RD_READER_DEFAULT_FS 20
#define RD_READER_DEFAULT_LS 130
@@ -176,6 +178,7 @@ static void reader_reflow(void)
if (g_anim) { meow_anim_cancel(g_anim); g_anim = NULL; } /* 重排/雷字号时终止翻页动画 */
int seg = 0; int32_t ch = 0;
rd_book_anchor(g_book, &seg, &ch); /* 记录当前锚,重排后回锚 */
g_prog_dirty = 1;
rd_book_jump_to_anchor(g_book, seg, ch, g_fs, g_ls);
reader_refill_page();
reader_redraw();
@@ -192,6 +195,7 @@ static void reader_reflow_persist(void)
p.enc = (g_book && !rd_book_is_image(g_book)) ? (int)g_enc_cycle[g_enc_idx] : -1;
p.ts = (uint64_t)time(NULL);
rdprog_save(rd_book_path(g_book), &p);
g_prog_dirty = 0;
}
/* ---------- 渲染(W_CUSTOM render_cb) ---------- */
@@ -562,13 +566,15 @@ static void reader_turn_animated(int dir)
/* 无页位图(atlas 兜底):瞬切 */
if (!(g_has_font || rd_book_is_image(g_book)) || !g_page_buf[RD_PAGE_SLOT_CUR]) {
rd_book_turn(g_book, dir);
g_prog_dirty = 1;
reader_refill_page(); reader_redraw(); reader_reflow_persist();
return;
}
if (!g_anim_old) g_anim_old = (uint16_t *)malloc((size_t)g_pw * g_ph * 2);
if (!g_anim_old) { rd_book_turn(g_book, dir); reader_refill_page(); reader_redraw(); return; }
if (!g_anim_old) { rd_book_turn(g_book, dir); g_prog_dirty = 1; reader_refill_page(); reader_redraw(); return; }
memcpy(g_anim_old, g_page_buf[RD_PAGE_SLOT_CUR], (size_t)g_pw * g_ph * 2);
rd_book_turn(g_book, dir);
g_prog_dirty = 1;
reader_refill_page();
g_anim_dir = dir;
meow_anim_desc d = { 0.0f, 1.0f, 140, MEOW_EASE_OUT, reader_anim_update, reader_anim_done, NULL };
@@ -591,6 +597,7 @@ static void reader_scrub_jump(int page)
int np = rd_book_pages(g_book);
if (np <= 0) return;
rd_book_set_page(g_book, page);
g_prog_dirty = 1;
reader_refill_page();
reader_redraw(); /* 整页落定:正文 + 顶栏 + 刮擦条 */
reader_reflow_persist();
@@ -634,7 +641,8 @@ static void reader_scrub_begin(int x, int y)
/* ---------- 打开 ---------- */
/* R3.1:页索引缓存目录 = <TF>/MeowData/os.meow.reader/index。由 meow_config_dir
* (<TF>/MeowData/<pkg>/data) 剥尾 "/data" → <TF>/MeowData/<pkg>,接 "index",mkdir -p 后注入。 */
* (<TF>/MeowData/<pkg>/data) 剥尾 "/data" → <TF>/MeowData/<pkg>,接 "index",mkdir -p 后注入。
* 同基座派生 R3.2 分段流式缓存根 <TF>/MeowData/os.meow.reader(book.c 再接 /seg/<hash>)。 */
static void reader_setup_index_dir(void)
{
const char *data = meow_config_dir();
@@ -653,6 +661,7 @@ static void reader_setup_index_dir(void)
for (char *c = t + 1; *c; c++) if (*c == '/') { *c = 0; mkdir(t, 0755); *c = '/'; }
mkdir(t, 0755);
rd_book_set_index_dir(dir);
rd_book_set_seg_base(base); /* R3.2:分段缓存根(book.c 派生 /seg/<hash>) */
}
int reader_open(const char *path)
@@ -832,6 +841,7 @@ void reader_on_tap(int x, int y)
if (rd_book_set_enc(g_book, g_enc_cycle[ni]) == 0) {
g_enc_idx = ni;
chapter_name();
g_prog_dirty = 1;
reader_refill_page();
reader_redraw();
reader_reflow_persist();
@@ -925,5 +935,10 @@ void reader_on_tick(uint64_t now)
if (g_book && !g_menu_open && !g_dir_open && !g_ui_open)
reader_turn_animated(dir);
}
/* R3.2:进度实时落盘(翻页/刮擦/字号/编码变更后,节流 ~1s 定时写)——意外崩溃重开不丢进度 */
if (g_prog_dirty && now - g_prog_last_save_ms >= 1000) {
g_prog_last_save_ms = now;
reader_reflow_persist();
}
if (g_notice_ms > 0) { g_notice_ms--; if (g_notice_ms == 0) reader_redraw(); }
}