Skip to content

fix: 浮窗评审跟进——禁区点击激活、交互态基线回点关闭、激活失败完整退回被动态 - #67

Merged
Aswellle merged 1 commit into
mainfrom
fix/popup-review-followups
Oct 20, 2026
Merged

Aswellle merged 1 commit into
mainfrom
fix/popup-review-followups

Conversation

@Aswellle

Copy link
Copy Markdown
Owner

对 #66(d9b8f14)双通道代码评审发现的回归与缺陷的跟进修复,全部为局部改动,不动架构。

修复内容

1. 禁区单击不再激活浮窗(行为回归,评审 H1)

src/windows/popup/PopupWindow.tsx

  • d9b8f14 把 isDragBlockingTarget 提前到 pressOrigin 赋值之前,点击「复制」按钮/红绿灯/可选文本后不再转交互态——最高频路径之后 Esc/空格全死、快捷键提示永不出现
  • 现改为:禁区按压只跳过拖拽与 preventDefault(保选区),按压起点照记,mouseup ≤4px 照常激活
  • 划选译文(位移 >4px)不上报位置:浮窗没动,上报会把「没动过」固化成拖拽位置、冲掉光标锚点

2. 交互态回到基线应用永不关闭(行为回归,评审 M1)

src-tauri/src/system/popup_watch.rs

  • 交互态判定在 foreground == baseline 时恒不关,激活后点回编辑器浮窗永远悬停(旧 onFocusChanged 路径会关)
  • 新增 ever_held_foreground 闩位:交互态下轮询一旦证实浮窗持有过前台(Windows:fg==popup 句柄;macOS:本进程折叠语义下 fg==0)即置闩,闩位后回到基线应用也关闭
  • 闩位前豁免保留——激活链路瞬时焦点抖动(~96ms bug 形态)的防抖语义不变,两个语义同时成立

3. activate_popup 失败路径未恢复 focusable(false)(评审 M2,先在问题)

src-tauri/src/commands/system.rs

  • set_focus 失败分支注释说「退回被动态」但 WS_EX_NOACTIVATE 没恢复,留下半激活窗口 + 被动看守在用户点击中途误关的竞态窗口
  • 补 set_focusable(false),退回完整

4. macOS 前台身份改用 pid 比对(评审架构 WATCH②)

5. 其余评审项

  • stop() 顺带清 interactive 与闩位(关闭路径状态全归零)
  • activated 在新一轮 Loading 时复位,被动态弹出不再渲染收不到键盘的「空格关闭」提示
  • 主题同步加 last-value 守卫,class 变化但明暗未变时跳过 IPC
  • macOS stub _dark 参数的宏命名契约写入文档注释

测试

  • cargo test --lib 231 通过(225 + 6 新增:闩位前/后基线回点、闩位后浮窗仍前台不关、baseline=0、stop 清状态、两平台闩位观测条件)
  • cargo clippy -D warnings 零警告;cargo fmt --check 通过
  • tsc --noEmit 零错误;vitest 25 通过

评审报告结论

code-reviewer 通道 REQUEST CHANGES(3 项全修)+ architect 通道 WATCH(4 项非阻塞跟进中 3 项已落地,第 4 项「交互态基线回点作为产品决策记录」即本 PR 的第 2 项改动本身)。未动的两项先在问题已记录:hidePopup 90ms 延迟命中新一轮翻译的竞态、Linux 关闭权威结构性失效。

代码评审(双通道)对 d9b8f14 的三项主要发现,全部为局部修复:

- 禁区单击不再激活浮窗(行为回归):mousedown 对拖拽禁区
  (按钮/.selectable)只跳过拖拽,按压起点照记——单击「复制」
  后空格/Esc 恢复可用;划选译文(位移 >4px)不上报位置,避免
  把「没动过」固化成拖拽位置冲掉光标锚点
- 交互态回到基线应用永不关闭:看守观测到浮窗持有过前台后置闩
  (ever_held_foreground),闩位后回到基线 = 用户回原处干活,
  浮窗让路;闩位前豁免保留,激活链路瞬时抖动的防抖语义不变
- activate_popup 失败路径补 set_focusable(false):注释说退回
  被动态但 WS_EX_NOACTIVATE 没恢复,留下半激活窗口 + 被动看守
  在点击中途误关的竞态
- macOS 前台身份改用进程 pid 比对:bundle-id 子串匹配在应用
  更名后静默失效,恰好复活激活自关 bug;pid 对比与包名无关
- stop() 顺带清 interactive 与闩位:关闭路径状态全归零
- activated 跨翻译不复位:新一轮 Loading 时复位,被动态弹出
  不再渲染收不到键盘的「空格关闭」提示
- 主题同步加 last-value 守卫:class 变化但明暗未变时跳过 IPC
- macOS stub _dark 参数的宏命名契约写入文档注释

测试:popup_watch 新增 6 例(闩位前/后基线回点、闩位后浮窗仍
前台不关、baseline=0、stop 清状态、两平台闩位观测条件);
cargo test --lib 231 通过,clippy -D warnings 零警告;
tsc 零错误,vitest 25 通过
@Aswellle
Aswellle merged commit 7f9b3ca into main Oct 20, 2026
12 checks passed
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