Skip to content

[Bug] 多键盘下同键状态互相覆盖,modifier 状态可能泄漏 #8

Description

@jialeicui

问题

ISM.current.KeyStatespkg/statemachine/ism.go:59)和 Machine.modifierStatespkg/statemachine/machine.go:38)都以 KeyCode 为唯一键,没有设备维度。

KeySwift 明确支持多键盘(-keyboards "HHKB,Logitech"),但两把键盘同时操作同一个键时状态会互相覆盖:

  1. 键盘 A 按住 LeftCtrl → KeyStates[LeftCtrl] = pressed
  2. 键盘 B 也按住 LeftCtrl → 同一个 map 条目被覆盖
  3. 键盘 A 松开 LeftCtrl → KeyStates[LeftCtrl] 被标记为未按下,B 的实际按住状态丢失
  4. B 之后松开 LeftCtrl → 被当作 "duplicate release" 忽略

结果:modifier 状态泄漏,可能导致卡键或映射条件判断错误。

虽然 ISM.devices 里按设备各存了一份 DeviceState.KeyStates,但真正参与 SSM/匹配逻辑的全局 current 没有设备维度。

建议修复

全局按键状态需要带 (device, key) 维度,或在聚合时按"任一设备仍按住则视为按住"的语义合并。Machine.modifierStates 同理。

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions