治理归属
族群: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 当前天然成立的是:
Windows 现在只补到了前半句,没有补到后半句。
5 Whys
为什么 QA panel 在 Windows 上拖不动?
为什么前端 startDragging() 或后端 start_dragging() 还不够?
因为它们最后还是在复用普通 caption-drag 语义,补不齐 helper-window 的特殊承载。
为什么这和普通主窗口不一样?
因为 QA panel 是透明、顶层、跳过任务栏、尽量不激活的 helper-window,不是普通主窗口。
为什么这偏离了 macOS 的原始设计意图?
因为 macOS 当前把“尽量不抢焦点”和“仍然可拖动”同时做到了,Windows 只做到了一半。
为什么现在不继续在小补丁里硬修?
因为证据已经足够表明,后续修复应该直接转向 Windows 原生窗口创建 / 消息层,而不是继续堆前端 workaround。
平台差异说明
macOS:helper-window 的“可见但不抢上下文、还能拖动”更容易在原生层一起成立
Windows:如果继续用通用 show()/hide() + 通用 drag API,很容易只补到“显示/不抢焦点”,补不到“可拖动”
Linux:可能也有同类缺口,但目前 Windows 是最明确、最先复现出来的平台
影响
QA 这条功能线在 Windows 上还缺少一个核心交互能力:可拖动
如果不把问题收敛清楚,后续会继续在前端拖动 API 上绕圈
会拖累整条 selection ask / follow-up Q&A 功能线的完成度判断
建议接受标准
TODO / 不确定项
是否要通过原生 hit-test / caption region 方案实现拖动
Linux 后续是否也要做同类验证
当前先继续沿 Windows 原生分层实现推进,不再尝试共享拖动补丁
治理归属
non-activating but draggable这一产品目标在 Windows 上的原生承载docs/windows-window-governance-board.zh-CN.mddocs/2026-05-02-window-capability-family-audit.mddocs/github-tracking/windows-window-family-canonical-map.md现象
QA 浮窗在三端还没有真正对齐成同一套窗口交互语义。
macOS 上当前成立的产品目标其实很明确:
Windows / Linux 这边目前主要还是依赖:
focus:falsewindow.show()/window.hide()这导致在 Windows 上,虽然:
Ctrl+Shift+;已经正常但 QA 浮窗仍然不能拖动。
所以现在问题已经收得很具体:
证据
openless-all/app/src-tauri/tauri.conf.json:49-65qa窗口是transparent + alwaysOnTop + focus:false + visible:false + skipTaskbaropenless-all/app/src-tauri/src/lib.rsorderFrontRegardlessopenless-all/app/src/pages/QaPanel.tsxtauri-runtime-wry / tao的 Windows 路径start_dragging()最终还是会落回传统 caption drag 语义Ctrl+Shift+;正常根因收敛
现在可以把根因说得更清楚:
换句话说,macOS 当前天然成立的是:
Windows 现在只补到了前半句,没有补到后半句。
5 Whys
startDragging()或后端start_dragging()还不够?平台差异说明
show()/hide()+ 通用 drag API,很容易只补到“显示/不抢焦点”,补不到“可拖动”影响
selection ask / follow-up Q&A功能线的完成度判断建议接受标准
Ctrl+Shift+;正常 + QA panel 可拖动 + 关闭按钮可点TODO / 不确定项