背景
Windows 插入方式目前有三种:
- TSF 输入法(默认) — 听写时临时切到 OpenLess TSF 再 commit
- SendInput 逐字模拟 —
SendInput(KEYEVENTF_UNICODE),不依赖 IME 切换
- 剪贴板粘贴 — 写剪贴板 + 模拟 Ctrl+V 等,同样不依赖 IME 切换
「在键盘列表中显示 OpenLess」开关(windowsShowOpenlessInKeyboardList)目前仅在 SendInput 逐字模拟时出现。选「剪贴板粘贴」时 UI 不显示该选项;后端也会因 windows_sendinput_insertion_only == false 而强制保持 OpenLess 出现在 Win+Space 键盘列表中。
期望行为
在 剪贴板粘贴 插入方式下:
- 设置里也应显示「在键盘列表中显示 OpenLess」开关
- 允许用户关闭,使 OpenLess 不出现在系统键盘列表(Win+Space)中
- 行为与 SendInput 模式一致:隐藏不影响剪贴板粘贴落字
切回 TSF 时仍应强制重新启用语言配置文件(否则默认上屏会失败)。
为什么可行(非硬依赖)
剪贴板粘贴路径本身不依赖 OpenLess TSF:
- 会话开始时只有
windows_insertion_mode == Tsf 才会 prepare_session() / 激活 OpenLess profile
- Paste 分支走
inserter.insert(...)(写剪贴板 + 模拟粘贴键)
因此「用户级 EnableLanguageProfile(false) 隐藏键盘列表条目」对 Paste 与 SendInput 一样安全。
现状根因(产品/历史门控,非粘贴路径限制)
当初只有「TSF」与「仅 SendInput」两种语义,开关绑在旧字段 windowsSendInputInsertionOnly 上。后来增加第三种 paste 后:
- 前端
RecordingInputSection.tsx 仍只在 windowsInsertionMode === 'sendInput' 时渲染该 Toggle
- 后端
desired_openless_language_profile_enabled:只要不是 SendInput-only 就 return true(强制显示)
Paste 时 windows_sendinput_insertion_only 为 false,故选粘贴会重新启用 OpenLess,且看不到隐藏开关。
相关位置:
openless-all/app/src/pages/settings/RecordingInputSection.tsx(开关显示条件)
openless-all/app/src-tauri/src/windows_ime_profile.rs → desired_openless_language_profile_enabled
openless-all/app/src-tauri/src/coordinator/dictation.rs(仅 TSF 才 prepare IME)
建议改动
- 将「允许隐藏」的判定从「仅 SendInput」扩成「凡是不走 TSF 的插入方式」(SendInput 与 Paste)
- 设置页:
windowsInsertionMode === 'sendInput' || windowsInsertionMode === 'paste' 时显示开关
- 保存/应用偏好时与现有 SendInput 路径共用
apply_windows_openless_keyboard_list_pref
- 切回 TSF 时继续强制启用 profile(现有安全约束保留)
- 文案可改为说明:SendInput / 剪贴板粘贴均不受影响;TSF 模式需要列表中的配置文件可用
验收
背景
Windows 插入方式目前有三种:
SendInput(KEYEVENTF_UNICODE),不依赖 IME 切换「在键盘列表中显示 OpenLess」开关(
windowsShowOpenlessInKeyboardList)目前仅在 SendInput 逐字模拟时出现。选「剪贴板粘贴」时 UI 不显示该选项;后端也会因windows_sendinput_insertion_only == false而强制保持 OpenLess 出现在 Win+Space 键盘列表中。期望行为
在 剪贴板粘贴 插入方式下:
切回 TSF 时仍应强制重新启用语言配置文件(否则默认上屏会失败)。
为什么可行(非硬依赖)
剪贴板粘贴路径本身不依赖 OpenLess TSF:
windows_insertion_mode == Tsf才会prepare_session()/ 激活 OpenLess profileinserter.insert(...)(写剪贴板 + 模拟粘贴键)因此「用户级
EnableLanguageProfile(false)隐藏键盘列表条目」对 Paste 与 SendInput 一样安全。现状根因(产品/历史门控,非粘贴路径限制)
当初只有「TSF」与「仅 SendInput」两种语义,开关绑在旧字段
windowsSendInputInsertionOnly上。后来增加第三种paste后:RecordingInputSection.tsx仍只在windowsInsertionMode === 'sendInput'时渲染该 Toggledesired_openless_language_profile_enabled:只要不是 SendInput-only 就return true(强制显示)Paste 时
windows_sendinput_insertion_only为false,故选粘贴会重新启用 OpenLess,且看不到隐藏开关。相关位置:
openless-all/app/src/pages/settings/RecordingInputSection.tsx(开关显示条件)openless-all/app/src-tauri/src/windows_ime_profile.rs→desired_openless_language_profile_enabledopenless-all/app/src-tauri/src/coordinator/dictation.rs(仅 TSF 才 prepare IME)建议改动
windowsInsertionMode === 'sendInput' || windowsInsertionMode === 'paste'时显示开关apply_windows_openless_keyboard_list_pref验收