Skip to content

Commit 4b6874d

Browse files
committed
Process modifier release before new modifier
Resolve #901
1 parent a074cbb commit 4b6874d

File tree

1 file changed

+13
-3
lines changed

1 file changed

+13
-3
lines changed

sources/SquirrelInputController.swift

+13-3
Original file line numberDiff line numberDiff line change
@@ -70,14 +70,24 @@ final class SquirrelInputController: IMKInputController {
7070
rimeModifiers ^= kLockMask.rawValue
7171
_ = processKey(rimeKeycode, modifiers: rimeModifiers)
7272
}
73+
74+
// Need to process release before modifier down. Because
75+
// sometimes release event is delayed to next modifier keydown.
76+
var buffer = [(keycode: UInt32, modifier: UInt32)]()
7377
for flag in [NSEvent.ModifierFlags.shift, .control, .option, .command] {
7478
if changes.contains(flag) {
75-
let releaseMask = modifiers.contains(flag) ? 0 : kReleaseMask.rawValue
76-
_ = processKey(rimeKeycode, modifiers: rimeModifiers | releaseMask)
79+
if modifiers.contains(flag) { // New modifier
80+
buffer.append((keycode: rimeKeycode, modifier: rimeModifiers))
81+
} else { // Release
82+
buffer.insert((keycode: rimeKeycode, modifier: rimeModifiers | kReleaseMask.rawValue), at: 0)
83+
}
7784
}
7885
}
79-
lastModifiers = modifiers
86+
for (keycode, modifier) in buffer {
87+
_ = processKey(keycode, modifiers: modifier)
88+
}
8089

90+
lastModifiers = modifiers
8191
rimeUpdate()
8292

8393
case .keyDown:

0 commit comments

Comments
 (0)