Skip to content

fix(menubar): 修复 hover 时滚动不停止 - #23

Merged
TNT-Likely merged 1 commit into
mainfrom
fix/ticker-hover-pause
Jun 4, 2026
Merged

fix(menubar): 修复 hover 时滚动不停止#23
TNT-Likely merged 1 commit into
mainfrom
fix/ticker-hover-pause

Conversation

@TNT-Likely

Copy link
Copy Markdown
Owner

问题

鼠标悬停在菜单栏滚动 / 轮播 ticker 上时,滚动不会暂停(pauseOnHover 失效)。

根因(回归)

cbd3831(切到 NSImage 离屏渲染、修「app 不激活时颜色变浅」)把 ticker 从 button.addSubview(tickerView) 改成离屏渲染贴 button.image。view 不再在窗口层级里,于是 hover 检测改成在 statusItem.button 上挂 NSTrackingArea + HoverProxy

但状态栏按钮上的 NSTrackingArea 实测从不派发 mouseEntered/Exited(临时加日志验证:ENTER/EXIT 计数均为 0)→ tickerView.hovered 永远 falsestep() 里的 if pauseOnHover && hovered { return } 从不触发 → 滚动不停。

修复

改用 全局 + 本地 mouseMoved 监听,按 NSEvent.mouseLocation 是否落在状态栏按钮的屏幕矩形内来设 tickerView.hovered,与离屏渲染架构解耦、可靠得多:

  • 删除从不触发的 button NSTrackingAreaHoverProxy.swift
  • 鼠标移动的全局监听不需要辅助功能权限(仅键盘事件才需要)。
  • deinit 里移除监听。

验证

  • 本地构建通过,0 error / 0 warning。
  • 本地运行手动确认:hover 滚动 ticker → 立即暂停;移开 → 恢复(滚动与轮播均生效)。

cbd3831(切 NSImage 渲染)把菜单栏 ticker 从 button 子视图改成离屏渲染后,
hover 检测改成在 button 上挂 NSTrackingArea —— 但状态栏按钮上的 tracking
area 实测从不派发 mouseEntered/Exited(日志验证 ENTER/EXIT 计数为 0),
导致 tickerView.hovered 永远为 false,滚动 / 轮播在 hover 时不暂停。

改用全局 + 本地 mouseMoved 监听,按 NSEvent.mouseLocation 是否落在状态栏
按钮的屏幕矩形内来设 hovered。鼠标移动的全局监听不需要辅助功能权限。
顺带删除不再使用的 HoverProxy.swift。
@pullfrog

pullfrog Bot commented Jun 4, 2026

Copy link
Copy Markdown

This run was cancelled 🛑

The workflow was cancelled before completion. Please check the link below for details.

Pullfrog  | View workflow run | via Pullfrog𝕏

@TNT-Likely
TNT-Likely merged commit 4cc9dd5 into main Jun 4, 2026
1 check passed
@TNT-Likely
TNT-Likely deleted the fix/ticker-hover-pause branch June 4, 2026 02:32
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