Skip to content

[windows] QA 浮窗生命周期语义未与 macOS 对齐,存在 linger / focus / screenshot 风险 #153

@Cooper-X-Oak

Description

@Cooper-X-Oak

治理归属

  • 族群:E 族群 / helper-window 与输入交互契约
  • 对应主 PR:docs(windows): 跟踪 QA helper-window 生命周期 #156
  • 主修范围:QA 浮窗可拖动语义、non-activating but draggable 这一产品目标在 Windows 上的原生承载
  • 不默认并入:主窗口外观、Capsule 几何、Capsule 残留隐藏态、startup visible/ready ownership
  • 参考:
    • docs/windows-window-governance-board.zh-CN.md
    • docs/2026-05-02-window-capability-family-audit.md
    • docs/github-tracking/windows-window-family-canonical-map.md

现象

QA 浮窗在三端还没有真正对齐成同一套窗口交互语义。

macOS 上当前成立的产品目标其实很明确:

  • 浮窗可见,但尽量不抢前台 app
  • 浮窗可以拖动
  • 浮窗关闭后不继续参与系统行为

Windows / Linux 这边目前主要还是依赖:

  • focus:false
  • window.show() / window.hide()

这导致在 Windows 上,虽然:

  • Ctrl+Shift+; 已经正常
  • 选中 + 连续追问已经正常
  • 关闭按钮也可以点

QA 浮窗仍然不能拖动

所以现在问题已经收得很具体:

Windows 上没有把 macOS 原本那套“可见但不抢上下文、同时还能拖动”的浮窗交互目标补齐。

证据

  • openless-all/app/src-tauri/tauri.conf.json:49-65
    • qa 窗口是 transparent + alwaysOnTop + focus:false + visible:false + skipTaskbar
  • openless-all/app/src-tauri/src/lib.rs
    • macOS 路径用 orderFrontRegardless
    • Windows 路径主要还是 non-activating show/hide 组合
  • openless-all/app/src/pages/QaPanel.tsx
    • 之前尝试过前端 toolbar 拖动路线,但 Windows 实机仍不可拖动
  • tauri-runtime-wry / tao 的 Windows 路径
    • start_dragging() 最终还是会落回传统 caption drag 语义
  • Windows 实机验证
    • Ctrl+Shift+; 正常
    • QA panel 不可拖动
    • 关闭按钮可点

根因收敛

现在可以把根因说得更清楚:

  • 这不是普通 React / CSS / toolbar 事件漏了
  • 也不是简单“某个 drag API 没调到”
  • 真正的问题是:
Windows 上的 QA 浮窗被当作 helper-window 显示出来了,
但没有在原生窗口创建 / 原生消息层获得与 macOS 对等的“可拖动”承载。

换句话说,macOS 当前天然成立的是:

  • 不抢 source app
  • 还能拖动

Windows 现在只补到了前半句,没有补到后半句。

5 Whys

  1. 为什么 QA panel 在 Windows 上拖不动?
    • 因为缺少真正的原生可拖动承载。
  2. 为什么前端 startDragging() 或后端 start_dragging() 还不够?
    • 因为它们最后还是在复用普通 caption-drag 语义,补不齐 helper-window 的特殊承载。
  3. 为什么这和普通主窗口不一样?
    • 因为 QA panel 是透明、顶层、跳过任务栏、尽量不激活的 helper-window,不是普通主窗口。
  4. 为什么这偏离了 macOS 的原始设计意图?
    • 因为 macOS 当前把“尽量不抢焦点”和“仍然可拖动”同时做到了,Windows 只做到了一半。
  5. 为什么现在不继续在小补丁里硬修?
    • 因为证据已经足够表明,后续修复应该直接转向 Windows 原生窗口创建 / 消息层,而不是继续堆前端 workaround。

平台差异说明

  • macOS:helper-window 的“可见但不抢上下文、还能拖动”更容易在原生层一起成立
  • Windows:如果继续用通用 show()/hide() + 通用 drag API,很容易只补到“显示/不抢焦点”,补不到“可拖动”
  • Linux:可能也有同类缺口,但目前 Windows 是最明确、最先复现出来的平台

影响

  • QA 这条功能线在 Windows 上还缺少一个核心交互能力:可拖动
  • 如果不把问题收敛清楚,后续会继续在前端拖动 API 上绕圈
  • 会拖累整条 selection ask / follow-up Q&A 功能线的完成度判断

建议接受标准

  • 明确 QA 浮窗在 Windows 上是否必须与 macOS 保持同样的可拖动产品目标
  • 如果必须保持,就把修复落到 Windows 原生窗口创建 / 消息层
  • 保留一条实机验证:Ctrl+Shift+; 正常 + QA panel 可拖动 + 关闭按钮可点
  • 不把这个问题混进主窗口圆角 / UI 外观线

TODO / 不确定项

  • 是否要通过原生 hit-test / caption region 方案实现拖动
  • Linux 后续是否也要做同类验证
  • 当前先继续沿 Windows 原生分层实现推进,不再尝试共享拖动补丁

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingwindowsWindows-specific issue

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions