feat: M6.10–M6.19 批量收编 + M6.19 推卡验收
- M7 launcher 重写 5 期(虚拟化宫格/meow_theme 单一权威/横幅动画/自定义 PIN 键盘) - OOM 通用化(cachegov 上收 SDK)、自动切歌根治、meowpanel jv_free 泄漏修复、Hello 滚动卡顿修复 - ncm 歌词 UI / 媒体通知封面 / 封面分辨率 640 - 5 bug 修复:ncm 后台化 UI 叠层+点击穿透、再进 ncm 桌面叠层、播放页新旧 UI 叠层抢刷脏区(meow_ui_gfx 恢复边沿整帧重画)、PIN 亮屏亮度跳(keys.c meow_panel_on 按 settings_brightness_clamped 恢复)、通知中心封面显歌单封面(cover.c save_cover_raw 加 is_song + 命中块守卫) - 四 App 统一重链新 meow_ui.a 51caee4a;M6.19=0.8.19 固件 2d2331f2 推卡自刷验收全绿
This commit is contained in:
1 parent
c2ee7626a4
commit
3d70a3dd2c
176 files changed
+15507
-597
No files matched your search
@@ -43,6 +43,7 @@ static int g_drag_slider = 0; /* 手指按在 slider */
|
||||
int g_drag_page = 0; /* 手指按在页内容(非 slider/list):拖拽滚页面 */
|
||||
static int g_drag_page_last_y = 0; /* 页面拖拽上一帧 y */
|
||||
static int g_drag_page_delta = 0; /* 页面拖拽累计位移(节流重建,≥8px 才重建一次) */
|
||||
static uint64_t g_drag_page_tlast = 0; /* 页面拖拽上次重建时刻(359:每 poll 合并一次 rebuild) */
|
||||
|
||||
/* SDK 控件不透明:App 自记几何,用于局部 flush / 命中 / scroll 重建。 */
|
||||
|
||||
@@ -157,6 +158,7 @@ static void demo_free_content(void)
|
||||
if (g_slider_cid > 0) { meow_draw_unregister(g_slider_cid); g_slider_cid = 0; }
|
||||
g_dtitle_n = 0;
|
||||
list_view_release(); /* 列表控件已在上方 g_dslot 释放;摘容器引用/几何 */
|
||||
sdk2_release(); /* SDK 批次2 子视图:释放 grid/btn/list 控件引用 + 清几何 */
|
||||
}
|
||||
|
||||
/* 按 scroll 重建全部内容控件(owner=ACT_DEMO:调用方须已 push ACT_DEMO)。
|
||||
@@ -246,6 +248,15 @@ static void demo_build_at(int scroll)
|
||||
d_title(DCL_X, SY(yb), "MEDIA SESSION (meta)"); yb += 26;
|
||||
r_media = RX(DCL_X, SY(yb), DCW, DBH); g_dbtn_media = meow_btn_create_variant(r_media.x, r_media.y, r_media.w, r_media.h, "SEND META", MEOW_BTN_FILLED); SLOT(g_dbtn_media, r_media.x, r_media.y, r_media.w, r_media.h); yb += DCH;
|
||||
|
||||
/* ---- SDK 批次2 新控件(meow_select / meow_lazygrid / swipe-delete)----
|
||||
* 三节由 sdk2 CONTAINER 子视图(ui/demo/sdk2/sdk2.c)承接:章节标题/宫格/select 值文本走
|
||||
* 子视图 on_draw 直绘(同列表区标题);select 按钮 + swipe 列表 widget 由 sdk2 自持、此处创建。
|
||||
* 控件创建后几何已内存;跨重建视图态(grid scroll/sel、swipe 行集/scroll、select 值)由
|
||||
* sdk2_build_at 从子视图持有态恢复。
|
||||
* 注:sdk2 置于 LazyColumn 之前(列表保持 demo 页内容**末尾**区块),确保「滚动到底列表上屏」
|
||||
* 的既有宿主 P3 断言坐标假设仍然成立(sdk2 增高在列表上方,列表仍是内容底)。 */
|
||||
yb = sdk2_build_at(yb, ct, scroll);
|
||||
|
||||
/* ---- LazyColumn(100 项列表滚动) ----
|
||||
* 本区块标题改由列表区 CONTAINER 子视图(ui/demo/list/list.c)的 on_draw 绘制(注册表→
|
||||
* invalidate 链路);列表滚动/选中由 list_view_bind 从子视图持有态恢复(不再经 g_ds)。 */
|
||||
@@ -268,7 +279,21 @@ void demo_paint(void)
|
||||
meow_ui_paint_full(); /* 整帧按 z 序重画 */
|
||||
}
|
||||
|
||||
/* 重建内容到指定 scroll(clamp 到 [0, max_scroll]);进入/滚动共用 */
|
||||
/* 内容视口坐标(每次 build 同步):屏 y ∈ [g_demo_ct, g_demo_cb),x 跨 0..width。 */
|
||||
static void demo_repaint_viewport(void)
|
||||
{
|
||||
int h = g_demo_cb - g_demo_ct;
|
||||
if (h <= 0) return;
|
||||
/* 滚动重绘:只清底+按 z 重画内容视口矩形 [0, ct, w, h],不整帧。
|
||||
* 359 教训(滚动只刷视口 + 局部脏区不整屏重绘铁律):meow_ui_invalidate 内部已把绘制 clip
|
||||
* 收敛到矩形(meow_gfx_clip_push)+ meow_ui_flush_region 只上屏该区;chrome(TopAppBar/
|
||||
* NavBar/FAB,z=999,位于视口外)不触及,上一帧像素保留,滚动不再重画 chrome 字形。 */
|
||||
meow_ui_invalidate(0, g_demo_ct, meow_ui_width(), h);
|
||||
}
|
||||
|
||||
/* 重建内容到指定 scroll(clamp 到 [0, max_scroll]);进入/滚动共用。
|
||||
* 滚动路径用视口局部刷(demo_repaint_viewport)替代整帧 demo_paint——每刻度重建仍发生,
|
||||
* 但不再整帧重绘(359 教训:SDK 控件内建局部刷,卡顿源于调用方整页重绘)。 */
|
||||
void demo_rebuild_to(int scroll)
|
||||
{
|
||||
int vp_h = g_demo_cb - g_demo_ct;
|
||||
@@ -279,7 +304,7 @@ void demo_rebuild_to(int scroll)
|
||||
demo_free_content();
|
||||
demo_build_at(scroll);
|
||||
g_demo_scroll = scroll;
|
||||
demo_paint();
|
||||
demo_repaint_viewport();
|
||||
}
|
||||
|
||||
/* ---- demo 交互 ---- */
|
||||
@@ -299,6 +324,8 @@ static int demo_content_tap(int x, int y)
|
||||
|
||||
/* 嵌套命中(子>父,§A.7 设计):列表区 CONTAINER 子视图先发,命中即消费。 */
|
||||
if (list_view_hit(x, y)) return 1;
|
||||
/* SDK 批次2 子视图(select 按钮/宫格/列表行左滑松手):命中即消费。 */
|
||||
if (sdk2_hit(x, y)) return 1;
|
||||
|
||||
for (int i = 0; i < 5; i++)
|
||||
if (meow_widget_hit(g_dbtn_b[i], x, y)) { d_toggle_sel(g_dbtn_b[i], r_btn[i]); g_ds.btn[i] = meow_widget_selected(g_dbtn_b[i]); return 1; }
|
||||
@@ -344,8 +371,18 @@ static void demo_media_send(void)
|
||||
}
|
||||
|
||||
/* demo 页 on_tap 分发(chrome → 内容) */
|
||||
/* 页面拖拽抬手把节流窗内遗留的 delta 一次性重建(视口局部刷)——slow drag 结束为 TAP 时也精确落点。 */
|
||||
static void demo_flush_page_delta(void)
|
||||
{
|
||||
if (g_drag_page && (g_drag_page_delta >= 1 || g_drag_page_delta <= -1)) {
|
||||
demo_rebuild_to(g_demo_scroll + g_drag_page_delta);
|
||||
g_drag_page_delta = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void demo_on_tap(int x, int y)
|
||||
{
|
||||
demo_flush_page_delta(); /* 手势结束:TAP 抬手边沿(<SWIPE_THRESH),把遗留页面 delta 落到位 */
|
||||
if (g_tb) {
|
||||
int ah = meow_topappbar_hit(g_tb, x, y);
|
||||
if (ah == MEOW_TOPBAR_BACK) { meow_view_page_pop(); return; }
|
||||
@@ -389,44 +426,59 @@ static void demo_slider_drag(int x)
|
||||
meow_ui_invalidate(r_slider_txt.x, r_slider_txt.y, r_slider_txt.w, r_slider_txt.h); /* 重画值文本 */
|
||||
}
|
||||
|
||||
/* demo 页 on_touch_down:锁一种拖拽(slider > list > 页内容)。
|
||||
* 列表区走 list_view_down(子>父:命中列表区由列表 CONTAINER 子视图收口)。 */
|
||||
/* demo 页 on_touch_down:锁一种拖拽(slider > list > sdk2 > 页内容)。
|
||||
* 列表区走 list_view_down(子>父:命中列表区由列表 CONTAINER 子视图收口);
|
||||
* SDK 批次2 子视图走 sdk2_down(宫格拖拽/列表行左滑 begin,子>父收口)。 */
|
||||
void demo_touch_down(int x, int y)
|
||||
{
|
||||
g_drag_slider = 0; g_drag_list = 0; g_drag_page = 0; g_drag_page_delta = 0;
|
||||
if (!g_demo) return;
|
||||
if (meow_widget_hit(g_dslider, x, y)) { g_drag_slider = 1; demo_slider_drag(x); return; }
|
||||
if (list_view_down(x, y)) return; /* 列表区:置 focus+drag_list(list.c) */
|
||||
if (sdk2_down(x, y)) return; /* SDK 批次2:宫格/列表行左滑 begin(sdk2.c) */
|
||||
g_demo_focus = 0;
|
||||
if (y >= g_demo_ct && y < g_demo_cb && x >= 0 && x < meow_ui_width()) {
|
||||
g_drag_page = 1; g_drag_page_last_y = y;
|
||||
}
|
||||
}
|
||||
|
||||
/* demo 页 on_touch_move:拖动过程实时更新(slider 值 / 列表滚动 / 页面滚动节流重建)。 */
|
||||
/* demo 页 on_touch_move:拖动过程实时更新(slider 值 / 列表滚动 / sdk2 滚动 / 页面滚动节流重建)。 */
|
||||
void demo_touch_move(int x, int y)
|
||||
{
|
||||
if (!g_demo) return;
|
||||
if (g_drag_slider) { demo_slider_drag(x); return; }
|
||||
if (list_view_move(y)) return; /* 列表拖动(list.c) */
|
||||
if (sdk2_move(x, y)) return; /* SDK 批次2:宫格滚动/列表左滑 move/列表竖向滚动(sdk2.c) */
|
||||
if (g_drag_page) {
|
||||
int dy = y - g_drag_page_last_y; g_drag_page_last_y = y;
|
||||
g_drag_page_delta += -dy; /* 手指上移(y 减) → scroll 增(显示更低内容),与 on_swipe 一致 */
|
||||
if (g_drag_page_delta >= 8 || g_drag_page_delta <= -8) {
|
||||
/* 359 教训:滚动期间每个 poll 合并一次 rebuild(勿每触摸事件各自重建/上屏)。
|
||||
* 累计位移超阈值(≥8) 且(距上次 ≥16ms 或 已是大步 ≥32)才重建一次;未到窗则继续
|
||||
* 累积 delta(不丢),下个窗口一次性重建到精确位置。 */
|
||||
uint64_t now = meow_ui_time_ms();
|
||||
int big = (g_drag_page_delta >= 8 || g_drag_page_delta <= -8);
|
||||
int merge = (now - g_drag_page_tlast >= 16) ||
|
||||
(g_drag_page_delta >= 32) || (g_drag_page_delta <= -32);
|
||||
if (big && merge) {
|
||||
demo_rebuild_to(g_demo_scroll + g_drag_page_delta);
|
||||
g_drag_page_tlast = now;
|
||||
g_drag_page_delta = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* demo 页 on_swipe:LEFT=回 home;UP/DOWN=列表聚焦滚列表,否则页滚动。 */
|
||||
/* demo 页 on_swipe:LEFT=回 home;UP/DOWN=列表/宫格/sdk2 聚焦滚自身,否则页滚动。 */
|
||||
void demo_swipe(int dir, int dist)
|
||||
{
|
||||
if (dir == MEOW_SWIPE_LEFT) { meow_view_page_pop(); return; }
|
||||
if (dir != MEOW_SWIPE_UP && dir != MEOW_SWIPE_DOWN) return;
|
||||
if (g_drag_page || g_drag_list) return; /* 本次手势已实时跟手滚动过 */
|
||||
if (g_drag_page || g_drag_list || sdk2_dragging()) { /* 本次手势已实时跟手滚动过 */
|
||||
demo_flush_page_delta(); /* 抬手:flush 节流窗内遗留页面 delta(视口局部刷)精确落点 */
|
||||
return;
|
||||
}
|
||||
int del = (dir == MEOW_SWIPE_UP) ? dist : -dist; /* 手指上移 → 偏移增大 */
|
||||
if (list_view_swipe(del)) return; /* 列表聚焦:滚列表(list.c,子>父消费) */
|
||||
if (sdk2_swipe(del)) return; /* SDK 批次2:宫格/列表聚焦滚自身(sdk2.c,子>父消费) */
|
||||
demo_rebuild_to(g_demo_scroll + del);
|
||||
}
|
||||
|
||||
@@ -441,7 +493,8 @@ static void demo_page_enter(meow_view *v, void *ctx)
|
||||
hello_nav_report(); /* ① 上报 demo 栈深/顶层 */
|
||||
/* 列表区 CONTAINER 子视图随本页进入由 SDK view_enter 递归驱动(其 on_draw 在 demo_rebuild_to
|
||||
* →demo_paint 中经注册表绘制;meow_draw_view_entered 含祖先已进入判定,首批可见)。 */
|
||||
demo_rebuild_to(0);
|
||||
demo_rebuild_to(0); /* 内容建到 scroll=0(视口局部刷) */
|
||||
demo_paint(); /* 进入页整帧首绘(含 chrome 置顶 z=999);仅进入一次,非滚动路径 */
|
||||
meow_log(MEOW_LOG_INFO, "demo enter scroll=0");
|
||||
}
|
||||
|
||||
@@ -475,14 +528,16 @@ int demo_is_active(void)
|
||||
}
|
||||
|
||||
/* demo view:on_create 建 chrome+内容(一次,owner=ACT_DEMO);进入时 rebuild 到顶。
|
||||
* 视图深度化:先挂列表区 CONTAINER 子视图到本 ACTIVITY view 的 children,再建内容。
|
||||
* 列表子视图 id 用非页面值,不占 g_view_by_id(见 list.c)。 */
|
||||
* 视图深度化:先挂列表区 + SDK 批次2 两个 CONTAINER 子视图到本 ACTIVITY view 的 children,再建内容。
|
||||
* 子视图 id 用非页面值,不占 g_view_by_id(见 list.c/sdk2.c)。 */
|
||||
static void demo_page_create(meow_view *v, void *ctx)
|
||||
{
|
||||
(void)v;
|
||||
((demo_ctrl *)ctx)->view = v;
|
||||
meow_view *lv = list_view_create();
|
||||
if (lv) meow_view_add_child(v, lv);
|
||||
meow_view *s2 = sdk2_view_create();
|
||||
if (s2) meow_view_add_child(v, s2);
|
||||
demo_init();
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user