Skip to content

Windows:剪贴板粘贴模式下也应提供「在键盘列表中显示 OpenLess」选项 #1015

Description

@HKLHaoBin

背景

Windows 插入方式目前有三种:

  1. TSF 输入法(默认) — 听写时临时切到 OpenLess TSF 再 commit
  2. SendInput 逐字模拟SendInput(KEYEVENTF_UNICODE),不依赖 IME 切换
  3. 剪贴板粘贴 — 写剪贴板 + 模拟 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 后:

  1. 前端 RecordingInputSection.tsx 仍只在 windowsInsertionMode === 'sendInput' 时渲染该 Toggle
  2. 后端 desired_openless_language_profile_enabled:只要不是 SendInput-only 就 return true(强制显示)

Paste 时 windows_sendinput_insertion_onlyfalse,故选粘贴会重新启用 OpenLess,且看不到隐藏开关。

相关位置:

  • openless-all/app/src/pages/settings/RecordingInputSection.tsx(开关显示条件)
  • openless-all/app/src-tauri/src/windows_ime_profile.rsdesired_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 模式需要列表中的配置文件可用

验收

  • 插入方式 = 剪贴板粘贴时,设置中出现「在键盘列表中显示 OpenLess」
  • 关闭后 Win+Space 不再出现 OpenLess;听写仍能通过粘贴正常落字
  • 插入方式 = SendInput 时行为与现在一致
  • 切回 TSF 后 OpenLess 重新出现在键盘列表,且 TSF 上屏可用

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions