Skip to content

fix(macos): 补齐分支滚动隐藏层点击转发与关闭清理 (#1621) - #1629

Merged
xiaoyumuxi merged 1 commit into
previewfrom
codex/1621-scroll-handoff-cleanup
Oct 31, 2026
Merged

xiaoyumuxi merged 1 commit into
previewfrom
codex/1621-scroll-handoff-cleanup

Conversation

@xiaoyumuxi

Copy link
Copy Markdown
Collaborator

背景

Follow-up to #1625,关联 #1621。原 PR 已合入 preview;本 PR 从合入后的 d5e47e17a 新建分支,不回退原有触控板滚动修复。

原实现用透明展开面板继续接收触控板手势,但有两个边界:

  1. 隐藏面板上的左/右键只关闭自己,吞掉用户对当前可见内容的点击。
  2. 脱离旧行时移除了父窗口关闭监听,父弹窗关闭后仍依赖计时回收;回收闭包强持有面板,与面板内容形成引用环。

修改

  • 隐藏展开层不调用旧行回调,将鼠标坐标通过屏幕转换到父窗口,经 NSApp.sendEvent 交给当前命中控件;保留事件类型、时间戳、修饰键、点击次数、事件编号和压力。
  • 左/右键的按下、拖动、松开作为完整序列转交,松开后回收隐藏面板;避免在按下时关闭源窗口再次丢失后续鼠标事件。
  • 父窗口内容范围之外的按下只回收展开层,不猜测其他应用窗口,不进行全局事件注入。
  • 手势移交对象接管父窗口关闭监听,关闭时立即取消定时任务、清空手势状态并解除父子关系;旧行被懒列表移除不影响清理。
  • 回收闭包改成弱引用面板,析构时也取消任务并移除观察器;清空不再使用的旧行滚动回调。
  • 保留原有触控板手势、惯性滚动、手指停顿兜底及鼠标滚轮路径。
  • 更新既有共享下拉 Agent Note 和分支功能矩阵验收步骤;真实触控板验证状态仍为 pending。

自动化验证

使用 Swift 6.3.3;本机默认 macOS 27.2 SDK 与该编译器不兼容,仅为验证命令设置 SDKROOT=/Library/Developer/CommandLineTools/SDKs/MacOSX26.5.sdk,未修改仓库或全局工具链配置。

  • 新回归在未修复实现上先失败:隐藏面板点击未到当前内容、父窗口关闭后未解除父子关系/未取消任务。
  • 71 个相关测试、8 个 suite 全部通过:BranchSwitcherPopoverBehaviorTests、GitSavedChangesRowTests、LitheTreeListTests、ContextMenuCoverageTests、LitheActionMenuFocusTests、AgentSkillsAppearanceTests 及其匹配的列表回归。
  • 新增/更新测试覆盖:移除旧行后的当前内容左/右键完整序列、非零坐标转换、修饰键和双击信息保留、鼠标按下时保留源面板、父内容之外的点击拒绝、父弹窗关闭立即取消回收。
  • 新边界测试重复 5 轮全部通过;最后相关套件中新测试耗时分别为 10ms(两个鼠标方向参数)、20ms、21ms。
  • 与 ci-macos.yml 相同过滤范围的 Swift 单元测试:3562 个测试、424 个 suite 全部通过(111.404 秒),无新增跳过或放宽门禁。
  • 测试稳定性、i18n 校验与生成一致性、运行时 bundle 只读、Service/Windows 边界、Agent Notes、平台矩阵变更与完整校验、git diff --check 全部通过。
  • 已生成并检查 .artifacts/platform-feature-matrix/ 视图与本地测试 HTML/JUnit/JSON(pr1621-followup-*),不提交产物。

本机验证中的波动

前一轮曾出现原生菜单焦点断言失败,完整测试随后因 120 秒无输出被看门狗终止;采样显示 AppKit 的 NSAnimation worker 耗尽,不能从最后一行输出归因于某个测试。未改的 preview 定向对照 36 个测试通过;恢复修复后的最终定向 71 个及完整 3562 个测试也全部通过。保留这些失败日志,不将一次重跑通过等同于证明已有测试完全稳定。

未验证/交付边界

  • 尚未在完整 Lithe 产品内用真实触控板验收惯性滚动、立刻点击、按 Esc 关闭和反复重开,组件测试不替代实机验收。
  • 本次只启动 SwiftPM 测试,没有启动安装版 Lithe。测试进程已退出;检查时存在用户自行打开的 /Applications/Lithe.app,未关闭用户实例。
  • 本 PR 保持 Draft,待审阅及真实交互验收后再 ready,避免误合入和重复占用 macOS/Windows runner。

@ghfind-review ghfind-review Bot added the review: high ghfind author score; see https://ghfind.com label Oct 31, 2026
@xiaoyumuxi
xiaoyumuxi marked this pull request as ready for review October 31, 2026 15:58
@lithe-code-review

lithe-code-review Bot commented Oct 31, 2026 •

Copy link
Copy Markdown

Lithe Review

结论: ⚠️ 有建议
范围: preview ← codex/1621-scroll-handoff-cleanup · head: caddfbe

未发现需要阻塞合并的问题。

Scope Check

  • 关联需求:[Bug] git 的左上角那个拉分支的在标签上浮动的时候触控板双指滚动没用 #1621 的后续点击转发、父窗口关闭清理与引用环问题已有实现及组件回归覆盖;真实触控板行为仍待验收,尚不能确认 Issue 全部完成。
  • 已完成范围:完整左/右键序列转发、屏幕坐标转换、旧行回调解除、回收任务取消,以及 Agent Note 和功能矩阵同步。
  • 复用边界:复用 AppKit 原生窗口派发,改动保持在 macOS 呈现层,未新增共享领域语义。
  • 未发现符合证据要求的本次引入或加剧的问题。

Suggestions

  1. 补充本次改动前后的完整产品截图。上下文仅有关联 Issue 的旧截图链接,无法验证本次视觉效果。
  2. 补充真实触控板验收:惯性滚动后立即左/右键操作、旧行滚出视口、Esc 关闭后重开,以及 Stash/Shelf 共享调用方;取得证据前保持矩阵 pending。

Summary

事件转发与清理职责集中,弱引用和独立关闭监听符合展开层脱离旧行后的生命周期。新增测试使用注入调度器,覆盖主要边界;组件事件测试仍不能替代完整产品交互验收。

Verification

  • 静态检查完整清单中的 4 个文件,并追踪 BranchPopupRowControl → BranchPopupExpansionView → NSApp.sendEvent、LitheDropdown/LitheContextMenuPresenter 的关闭与事件监听,以及 LitheTreeListOverflowRow 共享调用方。
  • 作者报告:相关 71 项、完整 3562 项测试及相关静态检查通过;本次未独立核验运行日志。
  • 提供的 head checks:macOS CI gate 成功,Swift tests 为 skipped,不能视为该测试任务已通过。
  • 本次未运行任何测试、验证脚本或应用。非阻塞缺口为真实触控板验收及本次 PR 的前后对比截图。

@xiaoyumuxi

Copy link
Copy Markdown
Collaborator Author

#1625 修复这个PR的没有修复的地方

@xiaoyumuxi
xiaoyumuxi merged commit a0aa559 into preview Oct 31, 2026
29 of 31 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

review: high ghfind author score; see https://ghfind.com

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant