Skip to content

fix(hotkey): 5 个快捷 setter 接入 Less Computer 键碰撞校验 (#684)#685

Open
appergb wants to merge 2 commits into
betafrom
fix/issue-684-hotkey-less-computer-collision
Open

fix(hotkey): 5 个快捷 setter 接入 Less Computer 键碰撞校验 (#684)#685
appergb wants to merge 2 commits into
betafrom
fix/issue-684-hotkey-less-computer-collision

Conversation

@appergb

@appergb appergb commented Jun 16, 2026

Copy link
Copy Markdown
Collaborator

User description

关联 issue

Closes #684

问题

集中式 reject_hotkey_collisionscommands/hotkeys.rs:216)已校验 coding_agent_voice_hotkey(Less Computer 键),但 5 个快捷 setter 各跑自己的部分 pairwise 校验、全部漏掉 less_computer

  • set_dictation_hotkey / set_translation_hotkey / set_switch_style_hotkey / set_open_app_hotkey(hotkeys.rs)
  • set_qa_hotkey(qa.rs)

→ 用户可经单键面板把任一动作键设成与 Less Computer 键相同而不被拒,随后完整保存设置时又被 reject_hotkey_collisions 拒绝。两条检测路径不一致。

改动(单一职责)

早已存在但未接线reject_*_less_computer_hotkey_overlap 接进这 5 个 setter(与现有 pairwise 校验同模式):

  • set_dictation_hotkeyreject_dictation_less_computer_hotkey_overlap
  • set_translation_hotkeyreject_translation_less_computer_hotkey_overlap
  • set_switch_style_hotkeyreject_less_computer_switch_style_hotkey_overlap
  • set_open_app_hotkeyreject_less_computer_open_app_hotkey_overlap
  • set_qa_hotkeyreject_qa_less_computer_hotkey_overlap(提升为 pub(crate) 供 qa.rs 调用)

未改动校验函数本体与集中式 reject_hotkey_collisions

测试

新增碰撞矩阵单测 each_action_hotkey_collides_with_less_computer:每个动作键 == Less Computer 键都被拒、全不同则通过。

cargo test --lib commands::   # 52 passed(含新增 + 既有 persist_settings 测试)

来源:2026-06-16 全仓多 Agent 审计(commands 专项)。


PR Type

Bug fix


Description

  • 修复 5 个快捷 setter 漏校验 Less Computer 键碰撞

  • ensure per‑setter collision check matches centralized reject_hotkey_collisions

  • 新增碰撞矩阵单测覆盖所有场景


Diagram Walkthrough

flowchart LR
  S1["set_dictation_hotkey"] --> C1["reject_dictation_less_computer_hotkey_overlap"]
  S2["set_translation_hotkey"] --> C2["reject_translation_less_computer_hotkey_overlap"]
  S3["set_switch_style_hotkey"] --> C3["reject_less_computer_switch_style_hotkey_overlap"]
  S4["set_open_app_hotkey"] --> C4["reject_less_computer_open_app_hotkey_overlap"]
  S5["set_qa_hotkey"] --> C5["reject_qa_less_computer_hotkey_overlap"]
  S6["set_combo_hotkey"] --> C6["reject_dictation_less_computer_hotkey_overlap"]
  C1 --> T["Reject collision"]
  C2 --> T
  C3 --> T
  C4 --> T
  C5 --> T
  C6 --> T
Loading

File Walkthrough

Relevant files
Bug fix
hotkeys.rs
hotkeys.rs: 接入 6 个 setter 的 Less Computer 校验                         

openless-all/app/src-tauri/src/commands/hotkeys.rs


  • set_dictation_hotkey、set_translation_hotkey、set_switch_style_hotkey、set_open_app_hotkey、set_combo_hotkey
    中添加 less_computer 碰撞校验
  • reject_qa_less_computer_hotkey_overlap 可见性提升为 pub(crate) 供 qa.rs 调用
  • 新增 each_action_hotkey_collides_with_less_computer 单元测试
+70/-1   
qa.rs
qa.rs: 补充 set_qa_hotkey 的 Less Computer 校验                             

openless-all/app/src-tauri/src/commands/qa.rs

  • 在 set_qa_hotkey 中添加 less_computer 碰撞校验,与集中式检测一致
+3/-0     

集中式 reject_hotkey_collisions 已校验 coding_agent_voice_hotkey,但
set_dictation/translation/switch_style/open_app_hotkey(hotkeys.rs)与
set_qa_hotkey(qa.rs)这 5 个单键 setter 全部漏掉 less_computer 校验——
用户可经单键面板把任一动作键设成与 Less Computer 键相同而不被拒,随后
完整保存又被 reject_hotkey_collisions 拒绝,两条路径不一致。

把早已存在但未接线的 reject_*_less_computer_hotkey_overlap 接进这 5 个
setter(与现有 pairwise 校验同模式);reject_qa_less_computer_hotkey_overlap
提升为 pub(crate) 供 qa.rs 调用。附 reject_hotkey_collisions 碰撞矩阵单测。
@appergb

appergb commented Jun 16, 2026

Copy link
Copy Markdown
Collaborator Author

@claude 请审核:把 5 个快捷 setter(dictation/translation/switch_style/open_app/qa_hotkey)接入已有但漏接的 Less Computer 键碰撞校验,与集中式 reject_hotkey_collisions 对齐。重点看 (1) 各 reject_*_less_computer 调用的参数顺序是否正确(dictation/translation 在前 vs less_computer 在前的两种签名);(2) 是否还有其他设置入口(如 set_combo_hotkey)也漏了 less_computer 校验。

@claude

claude Bot commented Jun 16, 2026

Copy link
Copy Markdown

Claude finished @appergb's task in 2m 1s —— View job


PR #685 代码审核

  • 读取变更文件(hotkeys.rs / qa.rs)
  • 检查各 reject_*_less_computer 调用的参数顺序
  • 排查是否存在漏接 less_computer 校验的其他入口(set_combo_hotkey 等)
  • 汇总并输出审核结论

审核结论

(1) 参数顺序 — 全部正确 ✅

各函数签名与调用位置对照如下:

函数签名 在 setter 中的调用 匹配
reject_dictation_less_computer_hotkey_overlap(dictation, less_computer) (&binding, less_computer) in set_dictation_hotkey
reject_translation_less_computer_hotkey_overlap(translation, less_computer) (&binding, less_computer) in set_translation_hotkey
reject_less_computer_switch_style_hotkey_overlap(less_computer, switch_style) (less_computer, binding) in set_switch_style_hotkey
reject_less_computer_open_app_hotkey_overlap(less_computer, open_app) (less_computer, binding) in set_open_app_hotkey
reject_qa_less_computer_hotkey_overlap(qa, less_computer) (binding, less_computer) in set_qa_hotkey

补充说明:底层 shortcut_bindings_overlap 是对称函数(left == rightright == left),即便参数顺序写反也不影响正确性。但上述 5 个调用均与函数签名完全匹配,无需担心。


(2) 漏接入口 — set_combo_hotkey 仍然缺失 ⚠️ 阻塞

hotkeys.rs:153–178set_combo_hotkey 执行以下操作:

// hotkeys.rs:153
pub fn set_combo_hotkey(coord: CoordinatorState<'_>, binding: ComboBinding) -> Result<(), String> {
    let mut prefs = coord.prefs().get();
    let shortcut = ShortcutBinding { ... };   // 从 ComboBinding 转换
    // pairwise 校验 qa / translation / switch_style / open_app ← 均有
    if let Some(qa_hotkey) = prefs.qa_hotkey.as_ref() {
        reject_dictation_qa_hotkey_overlap(&shortcut, qa_hotkey)?;
    }
    reject_dictation_translation_hotkey_overlap(&shortcut, &prefs.translation_hotkey)?;
    if let Some(switch_style) = prefs.switch_style_hotkey.as_ref() {
        reject_dictation_switch_style_hotkey_overlap(&shortcut, switch_style)?;
    }
    if let Some(open_app) = prefs.open_app_hotkey.as_ref() {
        reject_dictation_open_app_hotkey_overlap(&shortcut, open_app)?;
    }
    // ← ⚠️ 此处没有 coding_agent_voice_hotkey 校验
    prefs.custom_combo_hotkey = Some(binding);
    prefs.dictation_hotkey = shortcut;   // shortcut 最终写入 dictation_hotkey
    ...
}

set_combo_hotkey 实质上是通过另一条路径写入 prefs.dictation_hotkey,与 set_dictation_hotkey 执行的最终效果相同,但本次 PR 未覆盖它。用户若通过组合键面板设置的 combo 键与 Less Computer 键相同,可以绕过校验。

需要在 set_combo_hotkey 的现有校验块末尾(open_app 校验之后、prefs.custom_combo_hotkey = ... 之前)添加:

if let Some(less_computer) = prefs.coding_agent_voice_hotkey.as_ref() {
    reject_dictation_less_computer_hotkey_overlap(&shortcut, less_computer)?;
}

Fix this →


(3) 测试覆盖度 — 补充说明

新增测试 each_action_hotkey_collides_with_less_computer 调用的是 reject_hotkey_collisions,而该函数在 PR 之前已经含有 less_computer 校验。测试实际验证的是集中式校验路径,未直接覆盖本次新增的 setter 内的 pairwise 校验路径

这不是阻塞项(setter 的碰撞逻辑和集中式完全共享同一批 reject_* 函数,正确性一致),但若要精确覆盖新代码路径,可为每个 setter 构造一个独立单测,模拟 coding_agent_voice_hotkey 已存在时尝试设为相同值并断言返回 Err


总结

项目 结论
5 个 setter 参数顺序 ✅ 全部正确
set_combo_hotkey 漏接 less_computer ⚠️ 需补充,与本 PR 修复的问题完全同类
测试质量 可接受,但测试路径与新代码路径有偏差(非阻塞)

建议在合并前补上 set_combo_hotkey 的 less_computer 校验,其余变更逻辑正确、参数一致。

@github-actions

github-actions Bot commented Jun 16, 2026

Copy link
Copy Markdown
Contributor

PR Reviewer Guide 🔍

(Review updated until commit 2de1775)

Here are some key observations to aid the review process:

🎫 Ticket compliance analysis 🔶

684 - Partially compliant

Compliant requirements:

  • 已将 reject_dictation_less_computer_hotkey_overlap 接入 set_dictation_hotkey
  • 已将 reject_translation_less_computer_hotkey_overlap 接入 set_translation_hotkey
  • 已将 reject_less_computer_switch_style_hotkey_overlap 接入 set_switch_style_hotkey
  • 已将 reject_less_computer_open_app_hotkey_overlap 接入 set_open_app_hotkey
  • 已将 reject_qa_less_computer_hotkey_overlap 提升为 pub(crate) 并接入 set_qa_hotkey
  • 新增了 each_action_hotkey_collides_with_less_computer 测试,涵盖所有碰撞场景和基线通过场景
  • 测试全部通过(52 passed)

Non-compliant requirements:

(empty)

Requires further human verification:

(empty)

⏱️ Estimated effort to review: 2 🔵🔵⚪⚪⚪
🧪 PR contains tests
🔒 No security concerns identified
⚡ No major issues detected

组合听写键 setter 同样把组合键写进 dictation_hotkey 却漏校验 less_computer,
补上 reject_dictation_less_computer_hotkey_overlap,与其余 5 个 setter 一致。
@github-actions

Copy link
Copy Markdown
Contributor

Persistent review updated to latest commit 2de1775

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[bug][hotkey] 5 个快捷 setter 漏校验 Less Computer 键碰撞,与集中式检测不一致

1 participant