Skip to content

fix(taskbar-lyric): 自动隐藏滑动期逐帧跟随并让出底缘唤醒带 - #458

Open
OMSociety wants to merge 1 commit into
SPlayer-Dev:devfrom
OMSociety:fix/taskbar-autohide-sync
Open

OMSociety wants to merge 1 commit into
SPlayer-Dev:devfrom
OMSociety:fix/taskbar-autohide-sync

Conversation

@OMSociety

Copy link
Copy Markdown

改动类型

  • 新功能(feat)
  • 缺陷修复(fix)
  • 重构 / 优化(不改变对外行为)
  • 文档(docs)
  • 其他(请在「改动说明」中注明)

是否包含破坏性变更

  • 是(请在「改动说明」中详细描述)
  • 否

改动说明

修复 Windows 任务栏「自动隐藏」开启时,任务栏歌词不随任务栏滑动动画逐帧跟随、且收起后残留窗口挡住底缘唤醒带的问题。

根因:TrayWatcher 的 LOCATIONCHANGE 每帧都会触发布局更新,但 Win11Strategy.update_layout 每次都跑整树 UIA 扫描(单次上百毫秒),service.rs 的 worker 又把队列里的 Update 合并成最后一帧——动画期间歌词被钉在原地,等动画结束才跳变。收起完成后歌词窗口停在底缘 2px 的鼠标唤醒触发带上,导致无法唤起任务栏。

主要变更:

  1. strategy/win11.rs:新增 ScanCache 缓存任务栏内容横向边界(相对任务栏左缘的偏移,是平移不变量)。滑动动画期间(矩形逐帧变化)或任务栏未完整可见时跳过 UIA 扫描、直接复用缓存按当前矩形组装布局,逐帧跟随;稳态下矩形不变时以 2s 周期重扫兜底内部布局变化。收起到底缘(可见高度 ≤4px)时返回宽高为 0 的空布局,让 JS 端停靠窗口、让出唤醒带。启动时任务栏常已收起,用 seed_cache 预建缓存避免首次展开走慢路径。

  2. service.rs:队列里的 Update 不再合并成最后一帧,而是逐帧跑 update_layout——每个 Update 对应一帧位置,合并会让动画期间钉在原地。

  3. lib.rs:新增 move_window NAPI 函数。Electron 的 setBounds 对嵌入任务栏的 owner 窗口 move 部分不生效,动画跟随需要直接调 SetWindowPos。

  4. taskbarLyric.ts:

    • 新增 parkWindow:收起时不再 hide(),只把窗口有效区域 setShape 裁到远端 1×1。hide/show 会让 Chromium 重新合成首帧、展开瞬间歌词先出现在偏移位置(实测约 100ms 内从右向左滑 ~60 DIP);保持窗口可见则展开只恢复形状即可直接呈现正确内容。
    • 首次显示前先用 1×1 形状 showInactive 完成首帧合成,再应用真实形状,避免首次展开横移。
    • applyLayout 优先调用原生 moveWindow(物理像素),失败回退 setBounds(DIP)。

已知行为:收起动画最后 1-2 帧因队列/合成延迟可能残留约 3-4px 的位置差,下一个布局周期即对齐,肉眼不可感知。

关联 Issue

Closes #457

测试情况

  • Windows 11 22631 / Windows 10 22H2 风格的任务栏布局均验证过(Win11Strategy 路径)
  • 主屏 2560x1440 @125% 缩放(物理 2560x1440 / DIP 2048x1152)
  • 开启「自动隐藏任务栏」,反复展开/收起 8 轮采样:歌词窗口 y 坐标与任务栏矩形逐帧同步(采样间隔 8-10ms,误差 ≤1 个采样周期)
  • 收起后鼠标移至底缘 2px 唤醒带可正常唤起任务栏
  • 本地歌词库功能(PR feat: 本地歌词库支持多目录与多格式匹配 #362 相关)正常
  • pnpm format / pnpm lint(0 errors)/ pnpm typecheck / cargo clippy -p taskbar-lyric -- -D warnings / pnpm build:native 全部通过

截图 / 录屏

录屏逐帧分析(ffmpeg gdigrab 捕获任务栏条带,逐像素定位内容首列):

场景 修复前 修复后
展开动画 歌词停在原地,动画结束后跳变 逐帧跟随,首帧即在正确位置(首列 16px)
收起动画 歌词停在原地,动画结束后消失 逐帧跟随
首次展开 内容先出现在偏移位置,约 100ms 内从右向左滑 ~60 DIP 首帧即在正确位置,无横移

自查清单

  • 本 PR 只包含一个主要功能 / 修复,没有夹带无关改动
  • 已在本地完整测试通过;AI 生成的代码同样自行测试并审阅过,未做未经验证的提交
  • 已运行 pnpm format,并确认 pnpm typecheck、pnpm lint 通过
  • 改动涉及原生模块时已 pnpm build:native 验证;未手写 native/*/index.d.ts
  • 已向 dev 分支提交

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

任务栏歌词未跟随自动隐藏任务栏的展开/收起动画

1 participant