字重结构+family→字重子菜单(agent-111: fonts/<family>/<weight>/, gen_font.py --weight, 两级扫描, s_font_dropdown子菜单) + 全屏左滑滑条修复(agent-112)

This commit is contained in:
MeowOS Dev committed 2026-08-30 13:42:41 +08:00
1 parent a8cd9fe5dc
commit b8c8cd1b21
2 files changed
+56 -34

No files matched your search

+39 -18
View File
@@ -125,6 +125,7 @@ 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。 */
@@ -136,6 +137,7 @@ 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)
@@ -145,13 +147,17 @@ 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; return; }
if (!t_origin_valid) { t_cx = t_cy = -1; t_dx = t_dy = 0; t_gmax_dx = 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;
@@ -163,7 +169,8 @@ static void touch_release(void)
* 被手势级清空,绝不继承上一手势坐标,确保:
* ① 中部右滑不会误判成左缘返回(t_dx>=EDGE_W);
* ② 先点中部再侧滑不返回(原点锁定在中部,>=EDGE_W),符合「必须从左缘起划」;
* ③ 右移严格正向(t_cx-t_dx>=0),杜绝「向左划也出条/误返回」。
* ③ 返回判定要求右移严格正向(t_cx-t_dx>=0 且 ≥SWIPE_THRESH),杜绝「向左划也误返回」;
* 左划过程仅让进度条实时回缩,不额外生长(过程见上方 MEOW_EV_SWIPE_PROGRESS)。
* SDK 统一上报为 MEOW_SWIPE_LEFT(设计"左滑=返回"契约,hello 用 on_swipe(LEFT) 退出)。
*
* 屏幕中部滑动不是返回手势:中部右滑→RIGHT(内容导航),中部左滑→非返回(落 TAP,
@@ -192,7 +199,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_cx = t_cy = -1; t_dx = t_dy = 0; t_gmax_dx = 0;
}
/* ---- 输入线程:poll 所有 event 设备 + 解析 ---- */
@@ -224,12 +231,22 @@ 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;
/* 左滑进度实时上报(视觉条):原点确实在左缘(t_dx<EDGE_W) 且 向右移动
* (t_cx>t_dx)。抬手触发仍由 touch_release 判定;这里只报过程。
* 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);
/* 左滑进度实时上报(视觉条)。抬手触发仍由 touch_release 判定;这里只报过程。
* 修复要点(左缘返回滑条 bug):
* ① 双向上报(不再要求 t_cx>t_dx):向右→条伸长、向左→条实时回缩,
* 摒弃「只在返回瞬间闪末帧 / 反向才出条」;
* ② 仅左缘起手(t_dx<EDGE_W)才上报并被绘制——屏幕中部起手绝不触发条/返回;
* ③ 条长 = 本手势右移位移 clamped 到「本次手势最大右移位移」(t_gmax_dx),
* 条的最大 x 恒等于本次手势达过的最大右移距离,反复反向滑不会放大它。
* 负数(左滑越过原点)→ 条长 0(清空)。
* 事件载荷:a=按下X(t_dx),b=条长 len(clamp 后,≥0)。 */
if (t_down && t_origin_valid && 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);
}
}
else if (code == ABS_Y || code == ABS_MT_POSITION_Y) {
if (t_down) touch_update(t_cx, val); else t_cy = val;
@@ -282,9 +299,12 @@ void meow_ui_run(const meow_ui_events *ev)
meow_input_ev e;
int got = 0;
while (meow_input_pop(&e)) {
if (g_exit) break; /* 已请求退出:不再分发剩余事件,杜绝「退出后又触发」的偶发再进/退 */
got = 1;
int in_startup = (now_ms() < startup_cooldown_until); /* M2.22(C) */
if (e.type == MEOW_EV_TAP) {
if (in_startup) continue; /* 启动窗口也吞 TAP:旧手势残留点按(如上一次左滑抬起)
* 在进入瞬间命中 UI 按钮(如全屏按钮)会误触发——丢弃。 */
/* 抬手未达标:清视觉条 */
meow_ui_swipe_hint(-1);
meow_ui_flush_region(0, meow_ui_statusbar_height(), meow_ui_width(), 6);
@@ -315,16 +335,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; /* 启动窗口进度条静音 */
int x0 = e.a, xc = e.b, dx = xc - x0; /* dx=当前X-按下X */
/* SDK 自动画顶部条:长度=手指当前 X(=距左缘距离,向内划长度随位移增长)。
* M2.5x/A-13:全屏/收合下「左缘返回手势保留」,顶部动态提示条(meow_ui_swipe_hint)
* 仍需绘制——不再以 meow_ui_sys_statusbar_active()(全屏/隐藏=0)开关,否则全屏
* 时滑条完全不显示。条位 y=meow_ui_statusbar_height():非全屏=状态栏下沿、
* 全屏=0、收合=提示线下缘(MUI_SBAR_COLLAPSE_H),与提示线不重叠加。
* APP 若注册 on_swipe_progress 仍可自绘(系统条照常画)。 */
meow_ui_swipe_hint(xc);
/* 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);
if (g_events_set && g_events.on_swipe_progress)
g_events.on_swipe_progress(x0, dx);
g_events.on_swipe_progress(e.a, len - e.a);
meow_ui_flush_region(0, meow_ui_statusbar_height(), meow_ui_width(), 6);
}
}