问题
ISM.current.KeyStates(pkg/statemachine/ism.go:59)和 Machine.modifierStates(pkg/statemachine/machine.go:38)都以 KeyCode 为唯一键,没有设备维度。
KeySwift 明确支持多键盘(-keyboards "HHKB,Logitech"),但两把键盘同时操作同一个键时状态会互相覆盖:
- 键盘 A 按住 LeftCtrl →
KeyStates[LeftCtrl] = pressed
- 键盘 B 也按住 LeftCtrl → 同一个 map 条目被覆盖
- 键盘 A 松开 LeftCtrl →
KeyStates[LeftCtrl] 被标记为未按下,B 的实际按住状态丢失
- B 之后松开 LeftCtrl → 被当作 "duplicate release" 忽略
结果:modifier 状态泄漏,可能导致卡键或映射条件判断错误。
虽然 ISM.devices 里按设备各存了一份 DeviceState.KeyStates,但真正参与 SSM/匹配逻辑的全局 current 没有设备维度。
建议修复
全局按键状态需要带 (device, key) 维度,或在聚合时按"任一设备仍按住则视为按住"的语义合并。Machine.modifierStates 同理。
问题
ISM.current.KeyStates(pkg/statemachine/ism.go:59)和Machine.modifierStates(pkg/statemachine/machine.go:38)都以KeyCode为唯一键,没有设备维度。KeySwift 明确支持多键盘(
-keyboards "HHKB,Logitech"),但两把键盘同时操作同一个键时状态会互相覆盖:KeyStates[LeftCtrl] = pressedKeyStates[LeftCtrl]被标记为未按下,B 的实际按住状态丢失结果:modifier 状态泄漏,可能导致卡键或映射条件判断错误。
虽然
ISM.devices里按设备各存了一份DeviceState.KeyStates,但真正参与 SSM/匹配逻辑的全局current没有设备维度。建议修复
全局按键状态需要带 (device, key) 维度,或在聚合时按"任一设备仍按住则视为按住"的语义合并。
Machine.modifierStates同理。