通知中心增强(agent-126/127/128/130) + App内通知中心方案(agent-129)

- 开关平移动画(时间轴180ms可打断/快照memcpy/顶28不盖状态栏) agent-126
- 音量/亮度滑条复用设置页方案(跳步+上限clamp+写DAC去抖/状态栏带仅redraw_sb清绘) agent-127
- 通知列表滚动(方向随input.swipe_invert, 滚动≠关闭, 回弹才关) agent-128
- 去音量chip(静音↔恢复last_nz, NCP_CHIP_N 5→4: WiFi/蓝牙/主题/亮度) agent-130
- meow_ui.a 零改动(d249c6e6); launcher md5 c7893faf; 宿主 90+/0warn
- ④App前台划出通知中心方案: FRAMEWORK_DESIGN §10.5 + NOTIFICATION_SYSTEM §9 + MEOW_APP_SDK §6.1(M3跨进程: SDK全局状态栏下滑唤出+半程可回+点通知拉app)
This commit is contained in:
MeowOS committed 2026-08-30 17:01:47 +08:00
1 parent 2b17f69f24
commit a8ec8377ed
7 files changed
+542 -59

No files matched your search

+81 -1
View File
@@ -59,6 +59,18 @@ static inline int mnp_slider_val_from_x(int px, int sx, int sw, int min, int max
return v;
}
/* 滑条值的「跳步」吸附:把 v 取到最近的 step 整数倍。
* step<=1 原样返回(默认 audio.volume_step=1 ⇒ 连续,与设置页滑条逐值行为一致);
* step>1(可配 1-5)时吸附到最近整数倍,减少拖动逐值写 DAC/刷状态栏(音量滑条卡顿修复)。
* 不处理负数(音量/亮度值域均 ≥0);结果应再经 mnp_brightness_clamp / vol_clamp。 */
static inline int mnp_step_round(int v, int step)
{
if (step <= 1) return v;
int r = ((v + step / 2) / step) * step;
if (r < 0) r = 0;
return r;
}
/* ---- 亮度 clamp ---- */
/* 亮度 clamp:下限 vmin(=display.brightness_min,≥1 防黑屏)、上限 100(防闪屏)。
@@ -103,7 +115,7 @@ static inline int mnp_row_at(int y, int list_top, int list_bot, int row_h)
return r;
}
/* 列表滚动 clainmp:把 scroll 钳到 [0, total-view]。content 高度=total(总行数*row_h)。 */
/* 列表滚动 clamp:把 scroll 钳到 [0, total-view]。content 高度=total(总行数*row_h)。 */
static inline int mnp_scroll_clamp(int scroll, int total, int view)
{
if (total <= view) return 0;
@@ -113,4 +125,72 @@ static inline int mnp_scroll_clamp(int scroll, int total, int view)
return scroll;
}
/* ---- 列表拖动滚动(方向遵循 input.swipe_invert,与 launcher 设置页列表同式)---- */
/* 最大滚动位移:total=内容总高、view=可视区高。内容不足视口时恒 0(不滚动)。 */
static inline int mnp_scroll_max(int total, int view)
{
return (total > view) ? (total - view) : 0;
}
/* 进入滚动时锁定的 scroll 基准(保证触发那一刻不跳变,连续跟手)。
* scroll=进入时 scroll;d=进入时位移(当前 y-原点 y,屏幕 y 向下为正);
* invert=0(标准:手指上滑→scroll 增大=内容向上滚看后面项)映射 -d;invert=1(反向)映射 +d。
* 与设置页 run_settings_page 的 `scroll_base = scroll_off + (invert ? -ddy : ddy)` 同式。 */
static inline int mnp_scroll_base(int scroll, int d, int invert)
{
return scroll + (invert ? -d : d);
}
/* 由基准 + 当前位移推目标 scroll(含方向映射);结果交 mnp_scroll_clamp 钳到 [0,max]。
* 与设置页 `scroll_off = clamp(scroll_base + (invert ? dydt : -dydt))` 同式。 */
static inline int mnp_scroll_target(int base, int d, int invert)
{
return base + (invert ? d : -d);
}
/* 是否已越过滚动边界成「回弹」(拖到顶/底仍继续拖)——用于列表滚满后继续拖 → 关闭。
* target=未钳位目标 scroll;max=mnp_scroll_max(...);tol=回弹容差(px,超过才认,
* 避免在边界小幅抖动即误关)。返回 1=已越过边界(回弹,可触发关闭语义)。 */
static inline int mnp_scroll_rebound(int target, int max, int tol)
{
return (target < -tol || target > max + tol);
}
/* ---- 开关平移动画(状态时间轴,纯逻辑,可单测)----
* 通知中心面板「打开/关闭滑入/收回」= 面板内容整体做 y-offset 平移(参照 SDK §5.2 快照 blit 平移)。
* 状态:progress p ∈ [0, fix],0=全隐藏(面板内容在面板区上缘之外),fix=到位(offset_y=0)。
* 本组函数只做标量时间轴/裁切计算,不碰 fb/几何——供 launcher(meow_launcherd.c 内嵌面板)与
* 宿主单测(test_notif_panel.c)共用同一份实现,避免两端漂移。 */
/* 进度 p([0,fix])→ 面板内容 y-offset(px,∈[-ph,0])。
* p=0 → -ph(内容上移出面板区,全隐藏);p=fix → 0(到位)。线性。 */
static inline int mnp_anim_off(int p, int fix, int ph)
{
return (int)((long long)(p - fix) * ph / fix);
}
/* 沿时间轴单向推进:dt_ms(距上次 tick 的单调毫秒差)→ 新 p(向 target 逼近并 clamp)。
* fix=进度分母(如 1024);dur_ms=单程时长(ms)。dt_ms<=0 或已达 target 时返回原 p。
* 为保证单调前进(防快循环 dt 为 0 卡住),dt_ms>0 且未到位时 step 至少为 1。
* 反转(p>target)即回退,同样逐帧平滑。 */
static inline int mnp_anim_step(int p, int target, int fix, unsigned long long dt_ms, int dur_ms)
{
if (dt_ms == 0) return p;
if (p == target) return p;
long long step = (long long)dt_ms * fix / (dur_ms > 0 ? dur_ms : 1);
if (step < 1) step = 1;
if (target > p) { p += (int)step; if (p > target) p = target; }
else { p -= (int)step; if (p < target) p = target; }
return p;
}
/* 面板覆盖区底缘(screen y,exclusive):off 时面板可见区 = [top, top+ph+off)。
* off∈[-ph,0] ⇒ 结果∈[top, top+ph]。top 通常=状态栏高(NCP_TOP=28,不盖状态栏)。
* 调用方用「顶=top、高=covered_bot-top」作为脏区上缘/裁切范围。 */
static inline int mnp_anim_covered_bot(int top, int ph, int off)
{
return top + ph + off;
}
#endif /* MEOW_NOTIF_PANEL_H */