fix(qa,windows): 划词追问浮窗读用户当前录音键 + Windows 加 toolbar 拖拽 (#205)#206
Conversation
Windows 端的滑词追问浮窗存在三处问题:(1) qa.* i18n 硬编码 "Option",
Windows 用户没这个键;(2) 拖拽只走 macOS NSWindow.movableByWindowBackground,
Windows 上无等价路径;(3) toolbar 注释明确写「不需要 data-tauri-drag-region」
导致 Tauri 标准拖拽通路也没接。
修复:
- QaPanel mount 时读 prefs.hotkey.trigger,转成 label(如「右 Control」/
「Right Alt」),通过 i18n {{recordHotkey}} 插值传给 EmptyHint /
RecordingHeader / TurnIndicator / ErrorRow / StatusBar 五个子组件,平台
与用户配置都能跟上。
- Toolbar 空白 spacer 加 data-tauri-drag-region:mousedown 走 Tauri 标准
startDragging() → Windows 上是 WM_NCLBUTTONDOWN(HTCAPTION),在 focus:false
浮窗上也能拖;macOS 同时保留原 NSWindow movableByWindowBackground,两条
路径并存不冲突。
|
Codex usage limits have been reached for code reviews. Please check with the admins of this repo to increase the limits by adding credits. |
PR Reviewer Guide 🔍(Review updated until commit 17bb078)Here are some key observations to aid the review process:
|
|
请看reviewer给出的建议并作出相应更改 |
PR #206 review 反馈:QaPanel 的 recordHotkeyLabel 只在 mount / 语言切换时 重读 prefs;用户在主窗口改了录音键,浮窗如果还开着就一直停留在旧值 ("按 右 Option 提问" 之类),误导用户按错键。 修法是补一条事件通路,不动现有的初始读取: - commands.rs::set_settings 持久化后 `app.emit("prefs:changed", &prefs)`, 广播给所有 webview。沿用 vocab:updated 同款跨窗口通知模式。 - QaPanel.tsx 在原有 qa:state / qa:dismiss / qa:level 订阅旁边加一条 prefs:changed listener,收到后用 getHotkeyTriggerLabel 重算 label。 cleanup 一并处理。 QaPanel 跑在独立 webview(label="qa"),没有 HotkeySettingsContext 注入, 所以必须走 IPC 事件而不是 React context;这也是为什么不能复用 Settings 页面的本地 state 更新。
|
Persistent review updated to latest commit 17bb078 |
PR #206 的 reviewer 还指出两条未修: 1. Esc 关闭在 Windows / Linux 上仍然不响应。原因:QA 窗口创建时 focus:false(避免抢前台 app 焦点保留选区抓取能力),webview 拿不到 keyboard focus,注册在 window 上的 keydown 永远不触发。mac 上 nonactivating panel 仍接受 webview 内键盘事件,所以表现不一致。 修法:用户在浮窗上 pointerdown 时主动 setFocus(),把窗口提为 key window,之后 Esc 在三平台一致工作。不在 mount 时 setFocus,避免 复制 focus:true 副作用破坏初始选区抓取。 2. selectionAsk.howto.windowDesc 写死「标题栏可拖动」对 Windows / Linux 不准(这俩端通过 toolbar 上的 data-tauri-drag-region 拖)。 en.ts 已经是中性「toolbar is draggable」,把 zh-CN.ts 对齐。 跨端检查:focus:false 是 tauri.conf.json 全平台配置;data-tauri-drag-region 在 Linux WebKitGTK 上走 begin_move_drag、Windows 上走 WM_NCLBUTTONDOWN(HTCAPTION),本 PR 之前提交的 toolbar 拖拽对 Linux 同样生效。
PR #206 的 reviewer 还指出两条未修: 1. Esc 关闭在 Windows / Linux 上仍然不响应。原因:QA 窗口创建时 focus:false(避免抢前台 app 焦点保留选区抓取能力),webview 拿不到 keyboard focus,注册在 window 上的 keydown 永远不触发。mac 上 nonactivating panel 仍接受 webview 内键盘事件,所以表现不一致。 修法:用户在浮窗上 pointerdown 时主动 setFocus(),把窗口提为 key window,之后 Esc 在三平台一致工作。不在 mount 时 setFocus,避免 复制 focus:true 副作用破坏初始选区抓取。 2. selectionAsk.howto.windowDesc 写死「标题栏可拖动」对 Windows / Linux 不准(这俩端通过 toolbar 上的 data-tauri-drag-region 拖)。 en.ts 已经是中性「toolbar is draggable」,把 zh-CN.ts 对齐。 跨端检查:focus:false 是 tauri.conf.json 全平台配置;data-tauri-drag-region 在 Linux WebKitGTK 上走 begin_move_drag、Windows 上走 WM_NCLBUTTONDOWN(HTCAPTION),本 PR 之前提交的 toolbar 拖拽对 Linux 同样生效。
|
@H-Chris233 已按 reviewer guide 的两条 non-compliant 修复,commit 7cdc27c。 1. Esc 关闭跨端一致 QA 窗口 `focus: false`(避免抢前台 app 焦点保留选区抓取能力)→ Windows / Linux 上 webview 不接 keyboard focus → `window.addEventListener('keydown', Esc)` 永远不触发。mac 上 nonactivating panel 仍接受 webview 内键盘事件,所以原来 Esc 能用,但跨端语义不一致。 修法:用户在浮窗上 `pointerdown` 时调 `getCurrentWindow().setFocus()` 主动接管 key window —— 此后 Esc 三平台一致工作。不在 mount 时 setFocus,避免复制 `focus: true` 副作用、破坏初始选区抓取。 2. `selectionAsk.howto.windowDesc` 中性化 en.ts 已经是中性 "toolbar is draggable";zh-CN.ts 的 "标题栏可拖动" 与实际不符(mac 是整窗口、win/linux 是 toolbar drag region),同步改为 "toolbar 可拖动"。 3. 跨端检查(Linux 端验证)
关于 #203:reviewer 把这条标 not-compliant 是因为它依赖 #205 闭环。本 PR + 5b8be16 把 #205 全部 4 条都修了(文案 / 拖动 / 关闭交互 / 整体可用),#203 应一并满足,可以同步关闭。 `tsc + vite build` 通过。 |
包含自 1.2.13 以来的修复与新功能: - feat(autostart): 跨端开机自启 (#194) - feat(asr): SiliconFlow / GLM-ASR / Groq / OpenAI Whisper preset (#212) - fix(qa): Windows / Linux 划词追问浮窗 Esc + 拖拽 + 文案 (#205 / #206) - fix(settings): preset 切换 race + per-provider 凭据隔离 (#219 / #220) - fix(overview): 概览整屏适配 + 嵌套 scroller 细滚动条 (#243 / #248) - 一系列 Windows IME (TSF) 模块 (#233 / #240 等)
User description
Closes #205, addresses #203 in part.
Summary
Windows 端滑词追问浮窗以前同时坏在三处:
Changes
Out of scope
Esc 关闭在 Windows 上仍受 `focus:false` 影响(`SW_SHOWNOACTIVATE` 不给 keyboard focus)。本次 PR 不动这条:用户可以走右上角 ✕ 或重按 `Ctrl+Shift+;` 全局热键关闭。后续可以考虑给 QA 浮窗注册 ESC 全局快捷键(开 visible 时绑定,hide 时解绑),单独 PR 处理。
Test plan
PR Type
Bug fix, Enhancement
Description
Replace hardcoded "Option" texts with dynamic {{recordHotkey}} interpolation in QA panel
Add Tauri drag region to toolbar spacer for Windows window dragging
Emit prefs:changed event from backend so QA panel reflects live hotkey label changes
Pass recordHotkey prop to all relevant sub-components (EmptyHint, RecordingHeader, etc.)
Diagram Walkthrough
flowchart LR A["i18n texts use {recordHotkey}"] --> B["QaPanel reads prefs.hotkey.trigger via getSettings()"] B --> C["Record hotkey label stored in state"] D["commands.rs set_settings emits prefs:changed"] --> E["QaPanel listens to prefs:changed event"] E --> C C --> F["Sub-components display correct hotkey"] G["Toolbar spacer gets data-tauri-drag-region"] --> H["Windows: Tauri startDragging for window move"] I["macOS: NSWindow movableByWindowBackground"] --> HFile Walkthrough
QaPanel.tsx
Dynamic hotkey label, Windows drag, and live prefs listeneropenless-all/app/src/pages/QaPanel.tsx
drag support
recordHotkey prop
commands.rs
Emit prefs:changed event on settings saveopenless-all/app/src-tauri/src/commands.rs
webviews
en.ts
Use recordHotkey placeholder in English i18nopenless-all/app/src/i18n/en.ts
placeholder in five qa keys
zh-CN.ts
Use recordHotkey placeholder in Chinese i18nopenless-all/app/src/i18n/zh-CN.ts
placeholder in five qa keys
Also closes #203 (Windows 滑词追问无法正常使用 — depends on the same 4 fixes shipped here).