mirror of
https://github.com/feschber/lan-mouse.git
synced 2026-06-26 10:14:48 +03:00
macos: stop corrupting modifier state in repeat-task cleanup
spawn_repeat_task() takes a Mac CGKeyCode, but the cleanup block was passing that value to update_modifiers(), which expects a Linux evdev scancode (it calls scancode::Linux::try_from(key)). The two codespaces collide on several values, so cancelling the repeat task could silently clear a still-held modifier: Mac LeftShift = 56 == Linux KeyLeftAlt = 56 -> clears Mod1Mask Mac Down arrow = 125 == Linux KeyLeftMeta = 125 -> clears Mod4Mask Mac Up arrow = 126 == Linux KeyRightMeta = 126 -> clears Mod4Mask Mac Backslash = 42 == Linux KeyLeftShift = 42 -> clears ShiftMask Mac "9" = 29 == Linux KeyLeftCtrl = 29 -> clears ControlMask In practice this broke chords such as Shift+Option+X and Cmd+Down: pressing Shift while holding Option cancels Option's repeat task and runs the buggy cleanup, which then interprets Mac LeftShift's code (56) as Linux KeyLeftAlt and removes Option from the modifier state. The next key arrives with Shift only, so window-manager bindings on the original Option chord never fire. Remove the buggy update_modifiers() call. Modifier state is owned by the main consume() loop, which already calls update_modifiers() with the correct Linux scancode on the real release event. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
committed by
Ferdinand Schober
parent
82d677f9c8
commit
c32d695cd9
@@ -106,8 +106,14 @@ impl MacOSEmulation {
|
||||
}
|
||||
}
|
||||
}
|
||||
// release key when cancelled
|
||||
update_modifiers(&modifiers, key as u32, 0);
|
||||
// release key when cancelled.
|
||||
// Do NOT call update_modifiers here: `key` is a Mac CGKeyCode but
|
||||
// update_modifiers expects a Linux evdev scancode, and the two
|
||||
// codespaces collide (e.g. Mac LeftShift=56 == Linux KeyLeftAlt=56,
|
||||
// Mac Down=125 == Linux KeyLeftMeta=125), corrupting modifier
|
||||
// state for chords like Shift+Option+X or Cmd+Down. Modifier state
|
||||
// is owned by the main consume() loop, which calls update_modifiers
|
||||
// with the correct Linux scancode on the real release event.
|
||||
key_event(event_source.clone(), key, 0, modifiers.get());
|
||||
});
|
||||
self.repeat_task = Some(repeat_task);
|
||||
|
||||
Reference in New Issue
Block a user