Skip to content

feat(linux): evdev input for side combos and mouse dictation (split from #724)#728

Open
HKLHaoBin wants to merge 21 commits into
Open-Less:betafrom
HKLHaoBin:feat/718-linux-evdev
Open

feat(linux): evdev input for side combos and mouse dictation (split from #724)#728
HKLHaoBin wants to merge 21 commits into
Open-Less:betafrom
HKLHaoBin:feat/718-linux-evdev

Conversation

@HKLHaoBin

@HKLHaoBin HKLHaoBin commented Jun 21, 2026

Copy link
Copy Markdown
Contributor

User description

摘要

Completes #718(Linux 路径)。

由已关闭的 #724 拆分而来(第 3/3 部分):linux_evdev_input + evdev 依赖;Linux 侧向组合与鼠标输入;prefs 变更时 refresh_linux_evdev_monitor;monitor 停止时清除 status_message

堆叠 PR:含 #726 + #727 全部变更,用于 Linux 端到端验收。建议 #726/#727 合并后 rebase,或作为完整验收 PR 审查。

关联:#718#724

修复 / 新增 / 改进

  • Linux evdev 输入层(侧向组合 + 鼠标)
  • 热更新 monitor + input 组权限提示

兼容

  • 依赖 PR1/PR2 的 side-aware 与 mouse 模块(本 PR 已 stack)

测试计划

Linux 实机验证(请维护者复测,回应 @jiangmuran):

  • 仅侧向组合:绑定 cmd-left+D / shift-left+D → evdev monitor 启动、听写触发
  • 仅鼠标:开启中/侧键、无侧向组合 → 鼠标事件经 evdev
  • Prefs 热更新:切换鼠标开关或改听写绑定 → monitor 重启,无需重启应用
  • 权限提示:无 /dev/input/event* 读权限时出现 input 组提示;monitor 停止后清除
  • 完整 [feature] 支持左/右修饰键快捷键与鼠标中键唤起语音识别 #718:侧向组合 + 鼠标 + Hold refcount 联合验收

本地已验证: npm run buildnpm run check:hotkey-side-modifiers


PR Type

Enhancement, Tests


Description

  • Support left/right modifier keys in dictation hotkeys

  • Add independent mouse middle/side button dictation triggers

  • Implement Linux evdev input for side combos and mouse events

  • Track multiple hold sources for Hold mode with refcount


Diagram Walkthrough

flowchart LR
  Input["Input Events (Keyboard/Mouse)"]
  Platform["Platform Hooks\nWindows/macOS low-level\nLinux evdev"]
  SideCombo["SideAwareComboMonitor\n(Left/Right Modifier Matching)"]
  MouseDict["MouseDictationMonitor\n(Middle/Side Button Press)"]
  HoldTracker["HoldSourceTracker\n(Refcount Multiple Sources)"]
  Dict["Dictation Coordinator\n(Start/Stop Dictation)"]

  Input --> Platform
  Platform --> SideCombo
  Platform --> MouseDict
  SideCombo --> HoldTracker
  MouseDict --> HoldTracker
  HoldTracker --> Dict
Loading

File Walkthrough

Relevant files
Tests
3 files
mod.rs
Add mouse_dictation_refreshes test counter                             
+5/-0     
mock-data.ts
Add mock data for new dictation prefs                                       
+2/-0     
stylePrefs.test.ts
Include new prefs fields in test data                                       
+2/-0     
Enhancement
12 files
settings.rs
Add refresh_mouse_dictation to settings persistence           
+16/-0   
coordinator.rs
Integrate mouse/evdev/hold components and update hotkey binding
+205/-3 
dictation.rs
Add TriggerSource parameter to edge handlers for hold mode
+44/-16 
hotkey_loops.rs
Add mouse dictation and linux evdev supervision loops       
+243/-6 
hold_source_tracker.rs
New HoldSourceTracker for refcounting multiple trigger sources
+125/-0 
hotkey.rs
Add macOS mouse button dispatch for side and mouse dictation
+12/-1   
lib.rs
Register new modules and start mouse dictation listener   
+12/-0   
linux_evdev_input.rs
New Linux evdev monitor for side combos and mouse events 
+481/-0 
mouse_dictation.rs
New mouse dictation monitor with platform hooks and update config
+356/-0 
types.rs
Add mouse_middle_button_dictation and mouse_side_button_dictation
prefs
+16/-0   
types.ts
Update ShortcutBinding comments and add mouse dictation fields
+6/-2     
RecordingInputSection.tsx
Add mouse dictation toggle UI components                                 
+23/-0   
Other
1 files
*.rs
Provide stub implementations for mobile platforms               
Documentation
1 files
en.ts, ja.ts, ko.ts, zh-CN.ts, zh-TW.ts
Add i18n strings for mouse dictation settings                       
Dependencies
1 files
Cargo.toml
Add futures and evdev dependencies                                             
+2/-0     
Additional files
7 files
linux_evdev_input.rs +32/-0   
mouse_dictation.rs +38/-0   
en.ts +4/-0     
ja.ts +4/-0     
ko.ts +4/-0     
zh-CN.ts +4/-0     
zh-TW.ts +4/-0     

@github-actions

github-actions Bot commented Jun 21, 2026

Copy link
Copy Markdown
Contributor

PR Reviewer Guide 🔍

(Review updated until commit c98c801)

Here are some key observations to aid the review process:

🎫 Ticket compliance analysis ✅

724 - Fully compliant

Compliant requirements:

  • Support left/right modifier keys in dictation hotkeys via existing side_aware_combo module.
  • Support mouse middle/side button dictation triggers with independent pref toggles.
  • Implement Linux evdev input for side combos and mouse events.
  • Hot-refresh Linux evdev monitor when prefs change.
  • HoldSourceTracker for multiple hold sources.
  • Mobile stubs for compilation.
  • Tests for side modifiers, mouse dictation, etc.

718 - Fully compliant

Compliant requirements:

  • Support left/right modifier keys via side_aware_combo (already integrated).
  • Support mouse middle button dictation with independent toggle.
  • Settings UI for mouse middle and side button dictation added.
  • Triggers coexist independently (side_combo and mouse are separate configs).
⏱️ Estimated effort to review: 3 🔵🔵🔵⚪⚪
🧪 PR contains tests
🔒 No security concerns identified
⚡ No major issues detected

@HKLHaoBin

Copy link
Copy Markdown
Contributor Author

稍等,我处理一下ci问题。

@Felix201209

Copy link
Copy Markdown
Collaborator

Linux evdev 这层本身写得不错(见下),但这个 PR 现在还不能合,需要先 rebase 瘦身 🙏

现状问题:diff 累计回到了整个 #724

本 PR 的分支叠在 feat/718-side-modifiers(#726) 和 feat/718-mouse-dictation(#727) 之上,所以对 beta 的 diff 累计成了 ~2788 行 / 38 文件——等于把已经拆开的 #724 又整体带了回来。这里面包含了 #727 那个会让听写卡死到重启的 HIGH bug(详见 #727 的 review),所以现在合等于把那个 bug 也合进去。

正确路径

  1. feat(hotkey): side-specific modifier combos for dictation (split from #724) #726 合并;
  2. feat(dictation): mouse middle/side buttons with Hold refcount (split from #724) #727 修好 HIGH bug + 去掉与 feat(hotkey): side-specific modifier combos for dictation (split from #724) #726 重复的 types.ts/语言文件改动后合并;
  3. 把本 PR rebase 到最新 beta —— diff 会瘦到只剩 linux_evdev_input.rs + mobile_stubs/linux_evdev_input.rs + Cargo.toml/lock(evdev 依赖) + 少量 Linux #[cfg] 接线,那时单独审查、单独合很干净。

对 Linux evdev 增量的审查(rebase 后即可落地)

  • 无阻断问题:权限不足时能给出 udev 提示、不 panic;监视器生命周期 OK;非 Linux 构建不受影响(mobile stub 与 API 对齐)。
  • evdev = "0.12" 依赖合理(社区事实标准、维护活跃,风险低)。
  • ⚠️ 建议跟进(不阻断):读取循环是 fetch_events() + sleep(10ms) 轮询,空闲时会持续吃满约一个 CPU 核,对笔记本是功耗回退。建议改成 epoll(nix 已是传递依赖) 或 evdev 的异步 EventStream,让线程在有事件时才唤醒。
  • 小点:is_available() 只判断 /dev/input 目录存在,并不代表有读权限;udev 提示串在两处略有出入,建议统一成一个常量。

先留开着,按上面顺序 rebase 后再推进。

@github-actions

Copy link
Copy Markdown
Contributor

Persistent review updated to latest commit 0bac973

@HKLHaoBin HKLHaoBin force-pushed the feat/718-linux-evdev branch from 0bac973 to 23a4f69 Compare June 21, 2026 10:39
@HKLHaoBin

Copy link
Copy Markdown
Contributor Author

@Felix201209 已按 review 处理 rebase 瘦身 🙏

分支结构

相对 feat/718-mouse-dictation 的 evdev 增量:~680 行 / 8 文件(commit 23a4f692

合并顺序(与 review 一致):#726#727 → 本 PR。待前两 PR 进 beta 后,对 beta 的 diff 会自然瘦到 evdev-only。

本次未做(review 标注不阻断):epoll/EventStream 空闲 CPU、udev 提示常量统一。

请 re-review。

@github-actions

Copy link
Copy Markdown
Contributor

Persistent review updated to latest commit 23a4f69

@github-actions

Copy link
Copy Markdown
Contributor

Persistent review updated to latest commit 6ea63bb

@github-actions

Copy link
Copy Markdown
Contributor

Persistent review updated to latest commit ebc9fe7

@github-actions

Copy link
Copy Markdown
Contributor

Persistent review updated to latest commit 5cf792d

@github-actions

Copy link
Copy Markdown
Contributor

Persistent review updated to latest commit a997cd1

@github-actions

Copy link
Copy Markdown
Contributor

Persistent review updated to latest commit a5871ee

@github-actions

Copy link
Copy Markdown
Contributor

Persistent review updated to latest commit d22ded2

@appergb appergb left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review note: full CI is green, but the PR is currently CONFLICTING and it overlaps/dependends on the mouse dictation / side-combo stack in #727. Please rebase on the current beta after #727 is resolved, then rerun full CI.

HKLHaoBin and others added 16 commits June 26, 2026 01:01
Split from Open-Less#724: Win/macOS global mouse hooks, prefs toggles, HoldSourceTracker for multi-source hold release. Linux evdev path deferred to PR3.

Fixes Open-Less#718 (partial: mouse triggers).

Co-authored-by: Cursor <cursoragent@cursor.com>
- Fix hold-mode tests to pass TriggerSource::KeyboardDictation

- Hide mouse toggles on Linux until PR3 evdev

- Remove PR1 side-modifier type/i18n/mock remnants

- Complete mouse pref wire/deserialize/default in types.rs

Co-authored-by: Cursor <cursoragent@cursor.com>
…ents

Co-authored-by: Cursor <cursoragent@cursor.com>
…d source

On update_config disable or Drop, swap held flags and send Released events so HoldSourceTracker does not retain stale mouse sources after prefs refresh.

Co-authored-by: Cursor <cursoragent@cursor.com>
…inux

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Rebase dropped leftCommand/leftShift/rightShift from beta while hotkey.ts still references them; sync Cargo.lock for futures dep.

Co-authored-by: Cursor <cursoragent@cursor.com>
@HKLHaoBin HKLHaoBin force-pushed the feat/718-linux-evdev branch from 578f6d1 to 9fb62f3 Compare June 25, 2026 17:12
@github-actions

Copy link
Copy Markdown
Contributor

Persistent review updated to latest commit 9fb62f3

Rebase dropped LeftCommand/LeftShift/RightShift from beta while shortcut_binding still references them.

Co-authored-by: Cursor <cursoragent@cursor.com>
@github-actions

Copy link
Copy Markdown
Contributor

Persistent review updated to latest commit 0331833

Co-authored-by: Cursor <cursoragent@cursor.com>
@github-actions

Copy link
Copy Markdown
Contributor

Persistent review updated to latest commit 4fa244f

Co-authored-by: Cursor <cursoragent@cursor.com>
@github-actions

Copy link
Copy Markdown
Contributor

Persistent review updated to latest commit 5ac029d

HKLHaoBin and others added 2 commits June 26, 2026 01:40
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
@github-actions

Copy link
Copy Markdown
Contributor

Persistent review updated to latest commit c98c801

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.

3 participants