From b8c8cd1b210455964fa9e601501f63feff7aef23 Mon Sep 17 00:00:00 2001 From: MeowOS Dev Date: Sun, 30 Aug 2026 13:42:41 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AD=97=E9=87=8D=E7=BB=93=E6=9E=84+family?= =?UTF-8?q?=E2=86=92=E5=AD=97=E9=87=8D=E5=AD=90=E8=8F=9C=E5=8D=95(agent-11?= =?UTF-8?q?1:=20fonts///,=20gen=5Ffont.py=20--weight,=20?= =?UTF-8?q?=E4=B8=A4=E7=BA=A7=E6=89=AB=E6=8F=8F,=20s=5Ffont=5Fdropdown?= =?UTF-8?q?=E5=AD=90=E8=8F=9C=E5=8D=95)=20+=20=E5=85=A8=E5=B1=8F=E5=B7=A6?= =?UTF-8?q?=E6=BB=91=E6=BB=91=E6=9D=A1=E4=BF=AE=E5=A4=8D(agent-112)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- meow_ui_gfx.c | 33 ++++++++++++++-------------- meow_ui_input.c | 57 +++++++++++++++++++++++++++++++++---------------- 2 files changed, 56 insertions(+), 34 deletions(-) diff --git a/meow_ui_gfx.c b/meow_ui_gfx.c index e7841af..082d937 100644 --- a/meow_ui_gfx.c +++ b/meow_ui_gfx.c @@ -29,12 +29,12 @@ #define FBIO_WAITFORVSYNC 0x4620 #define FB_DEV "/dev/fb0" -#define MEOW_FONT_PNG_CARD "/usr/data/mnt/sd_0/MeowOS/fonts/default/font.png" -#define MEOW_FONT_IDX_CARD "/usr/data/mnt/sd_0/MeowOS/fonts/default/font.idx" +#define MEOW_FONT_PNG_CARD "/usr/data/mnt/sd_0/MeowOS/fonts/default/regular/font.png" +#define MEOW_FONT_IDX_CARD "/usr/data/mnt/sd_0/MeowOS/fonts/default/regular/font.idx" #define MEOW_FONT_PNG_SYS "/usr/share/meowos/font/font.png" #define MEOW_FONT_IDX_SYS "/usr/share/meowos/font/font.idx" -/* 默认字库(卡 MeowOS/fonts/default)与固件内置之外,launcher 会把「当前生效字体」 - * 经环境变量下发给 app(见 meow_launcherd.c launch_app / meow_font_effective_paths): +/* 默认字库(卡 MeowOS/fonts/default/regular,M2.6 字重结构)与固件内置之外,launcher 会把 + * 「当前生效字体」经环境变量下发给 app(见 meow_launcherd.c launch_app / meow_font_effective_paths): * MEOW_FONT_PNG / MEOW_FONT_IDX = 绝对路径;MEOW_FONT_APP = 或 "default"。 * SDK load_font 优先读 env(匹配系统 font.file),无则回退卡默认 → 固件。 */ @@ -361,18 +361,19 @@ void meow_ui_swipe_hint(int x) * 有状态栏(非全屏)→ y = 状态栏高度;收合(collapsed)→ y=提示线下缘 * (MUI_SBAR_COLLAPSE_H,与提示线不重叠);无状态栏(全屏/隐藏)→ y=0。 */ int hy = meow_ui_statusbar_height(); - if (x > 0) { - if (x > g_xres) x = g_xres; - /* 往回滑(新长度 < 上次)时,先清掉「上次画到旧长度、但本次超出的部分」, - * 否则条只增不减(用户要求:右滑变长、左滑回缩实时可见)。 */ - if (g_hint_last > x) meow_ui_fill_rect(0, hy, g_hint_last, MUI_HINT_H, th->bg); - meow_ui_fill_rect(0, hy, x, MUI_HINT_H, th->accent); - g_hint_last = x; - } else if (g_hint_last > 0) { - /* 手指回原点/抬手未达标/抬手达标:清掉此前画的条(填回背景色) */ - meow_ui_fill_rect(0, hy, g_hint_last, MUI_HINT_H, th->bg); - g_hint_last = 0; + /* x<0 视为清空(条长 0);条长上限=屏宽。 */ + if (x < 0) x = 0; + if (x > g_xres) x = g_xres; + /* 只按「新旧长度的差」增量绘制,避免整段重涂背景色: + * - 伸长:仅补画新增段(旧段已是 accent,不再用 bg 重涂——否则 app 底色≠theme bg + * 时会在旧段留下 bg 色块,就是残留残条); + * - 回缩/清空:仅把「超出新长度」的尾部填回背景色(实时回缩)。 */ + if (x > g_hint_last) { + meow_ui_fill_rect(g_hint_last, hy, x - g_hint_last, MUI_HINT_H, th->accent); + } else if (x < g_hint_last) { + meow_ui_fill_rect(x, hy, g_hint_last - x, MUI_HINT_H, th->bg); } + g_hint_last = x; /* 不发 flush:由调用方 meow_ui_flush_region(0,0,宽,6) 只刷顶部条 */ } @@ -704,7 +705,7 @@ int meow_font_set_tier(int tier) /* 字库加载优先级(M2.x): * 1) 环境变量 MEOW_FONT_PNG/MEOW_FONT_IDX(launcher 注入的「当前生效字体」= 系统 font.file) * —— app 未自带字库(§5.7 load_handle 未实现)时跟随系统 font.file; - * 2) 卡默认 MeowOS/fonts/default/font.png(不再硬编码 MeowAPPs/fonts); + * 2) 卡默认 MeowOS/fonts/default/regular/font.png(M2.6 字重结构;不再硬编码 MeowAPPs/fonts); * 3) 固件 /usr/share/meowos/font/font.png。 * 全失败 → g_mfont_ready=0,text_draw 回退 5x7 点阵(系统不死)。 */ static int load_font(void) diff --git a/meow_ui_input.c b/meow_ui_input.c index 8c7d0b9..c964f8c 100644 --- a/meow_ui_input.c +++ b/meow_ui_input.c @@ -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_dxt_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= 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); } }