mirror of
https://github.com/feschber/lan-mouse.git
synced 2026-06-23 00:34:48 +03:00
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>