From e5e6c6f626c1aa52415506b87f41d822d70bd5fd Mon Sep 17 00:00:00 2001 From: groverlynn Date: Sat, 29 Oct 2022 22:21:33 +0200 Subject: [PATCH 1/9] Update .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 295185f58..c51c76f44 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ package/test-* *~ .*.swp .DS_Store +rime-with-plugins-1.7.3-osx.zip From 0978d6c93e64253466a8ed8b58da4be7315985b2 Mon Sep 17 00:00:00 2001 From: groverlynn Date: Fri, 21 Apr 2023 17:04:48 +0200 Subject: [PATCH 2/9] Merge branch 'master' of https://github.com/rime/squirrel --- librime | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/librime b/librime index 8911db66b..3743c0a59 160000 --- a/librime +++ b/librime @@ -1 +1 @@ -Subproject commit 8911db66b0e5d43c2c3e47ffec06bfd10201daae +Subproject commit 3743c0a592308ca7cff15b2b565e274809f671c7 From aec5c306934ea35e19dfa2e01d1c9117f03683a1 Mon Sep 17 00:00:00 2001 From: groverlynn Date: Tue, 2 May 2023 18:21:48 +0200 Subject: [PATCH 3/9] detect coalesced modifier --- SquirrelInputController.m | 44 +++++++++++---------------------------- 1 file changed, 12 insertions(+), 32 deletions(-) diff --git a/SquirrelInputController.m b/SquirrelInputController.m index 02f0ef8a4..cc7402768 100644 --- a/SquirrelInputController.m +++ b/SquirrelInputController.m @@ -25,6 +25,7 @@ @implementation SquirrelInputController { NSArray *_candidates; NSUInteger _lastModifier; NSEventType _lastEventType; + uint32_t _lastEventCount; RimeSessionId _session; NSString *_schemaId; BOOL _inlinePreedit; @@ -52,7 +53,7 @@ - (BOOL)handleEvent:(NSEvent*)event client:(id)sender _currentClient = sender; - NSUInteger modifiers = event.modifierFlags; + CGEventFlags modifiers = CGEventGetFlags(event.CGEvent); BOOL handled = NO; @@ -78,58 +79,37 @@ - (BOOL)handleEvent:(NSEvent*)event client:(id)sender break; } //NSLog(@"FLAGSCHANGED client: %@, modifiers: 0x%lx", sender, modifiers); - int rime_modifiers = osx_modifiers_to_rime_modifiers(modifiers); - int rime_keycode = 0; - // For flags-changed event, keyCode is available since macOS 10.15 (#715) - Bool keyCodeAvailable = NO; - if (@available(macOS 10.15, *)) { - keyCodeAvailable = YES; - rime_keycode = osx_keycode_to_rime_keycode(event.keyCode, 0, 0, 0); - //NSLog(@"keyCode: %d", event.keyCode); - } int release_mask = 0; NSUInteger changes = _lastModifier ^ modifiers; + int rime_modifiers = osx_modifiers_to_rime_modifiers(modifiers); + int64_t keyCode = CGEventGetIntegerValueField(event.CGEvent, kCGKeyboardEventKeycode); + int rime_keycode = osx_keycode_to_rime_keycode((int)keyCode, 0, 0, 0); + _lastModifier = modifiers; + uint32_t eventCount = CGEventSourceCounterForEventType(kCGEventSourceStateCombinedSessionState, kCGAnyInputEventType); if (changes & OSX_CAPITAL_MASK) { - if (!keyCodeAvailable) { - rime_keycode = XK_Caps_Lock; - } - // NOTE: rime assumes XK_Caps_Lock to be sent before modifier changes, - // while NSFlagsChanged event has the flag changed already. - // so it is necessary to revert kLockMask. rime_modifiers ^= kLockMask; [self processKey:rime_keycode modifiers:rime_modifiers]; } if (changes & OSX_SHIFT_MASK) { - if (!keyCodeAvailable) { - rime_keycode = XK_Shift_L; - } - release_mask = modifiers & OSX_SHIFT_MASK ? 0 : kReleaseMask; + release_mask = modifiers & OSX_SHIFT_MASK ? 0 : kReleaseMask | (eventCount - _lastEventCount == 1 ? 0 : kIgnoredMask); [self processKey:rime_keycode modifiers:(rime_modifiers | release_mask)]; } if (changes & OSX_CTRL_MASK) { - if (!keyCodeAvailable) { - rime_keycode = XK_Control_L; - } - release_mask = modifiers & OSX_CTRL_MASK ? 0 : kReleaseMask; + release_mask = modifiers & OSX_CTRL_MASK ? 0 : kReleaseMask | (eventCount - _lastEventCount == 1 ? 0 : kIgnoredMask); [self processKey:rime_keycode modifiers:(rime_modifiers | release_mask)]; } if (changes & OSX_ALT_MASK) { - if (!keyCodeAvailable) { - rime_keycode = XK_Alt_L; - } - release_mask = modifiers & OSX_ALT_MASK ? 0 : kReleaseMask; + release_mask = modifiers & OSX_ALT_MASK ? 0 : kReleaseMask | (eventCount - _lastEventCount == 1 ? 0 : kIgnoredMask); [self processKey:rime_keycode modifiers:(rime_modifiers | release_mask)]; } if (changes & OSX_COMMAND_MASK) { - if (!keyCodeAvailable) { - rime_keycode = XK_Super_L; - } - release_mask = modifiers & OSX_COMMAND_MASK ? 0 : kReleaseMask; + release_mask = modifiers & OSX_COMMAND_MASK ? 0 : kReleaseMask | (eventCount - _lastEventCount == 1 ? 0 : kIgnoredMask); [self processKey:rime_keycode modifiers:(rime_modifiers | release_mask)]; // do not update UI when using Command key break; } [self rimeUpdate]; + _lastEventCount = eventCount; } break; case NSEventTypeKeyDown: { // ignore Command+X hotkeys. From 3703e9f738c1098ffb9c7540f39acbfb5f472eff Mon Sep 17 00:00:00 2001 From: groverlynn Date: Tue, 2 May 2023 18:51:11 +0200 Subject: [PATCH 4/9] Update librime --- librime | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/librime b/librime index 3743c0a59..124087ab0 160000 --- a/librime +++ b/librime @@ -1 +1 @@ -Subproject commit 3743c0a592308ca7cff15b2b565e274809f671c7 +Subproject commit 124087ab0ca90bddce5d951fd52a358c1e98e278 From 918692e756c0ee1b5a667b1df42407a7028bfc02 Mon Sep 17 00:00:00 2001 From: groverlynn Date: Thu, 4 May 2023 17:38:54 +0200 Subject: [PATCH 5/9] Update .gitignore --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index 21e14d129..77dc6e322 100644 --- a/.gitignore +++ b/.gitignore @@ -16,4 +16,3 @@ package/test-* *~ .*.swp .DS_Store -rime-with-plugins-1.7.3-osx.zip From 524b96e6cec7bf2e34a9da30969069094a60ba56 Mon Sep 17 00:00:00 2001 From: groverlynn Date: Fri, 12 May 2023 12:58:19 +0200 Subject: [PATCH 6/9] Update librime --- librime | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/librime b/librime index 124087ab0..b87eb81ce 160000 --- a/librime +++ b/librime @@ -1 +1 @@ -Subproject commit 124087ab0ca90bddce5d951fd52a358c1e98e278 +Subproject commit b87eb81cec851094e7f16a73ca9c453f3664d6e2 From 4e212279b96e1718637bcc0dae5538a5c0a575eb Mon Sep 17 00:00:00 2001 From: groverlynn Date: Mon, 15 May 2023 12:12:23 +0200 Subject: [PATCH 7/9] Update SquirrelInputController.m --- SquirrelInputController.m | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/SquirrelInputController.m b/SquirrelInputController.m index cc7402768..f0b553cef 100644 --- a/SquirrelInputController.m +++ b/SquirrelInputController.m @@ -91,20 +91,21 @@ - (BOOL)handleEvent:(NSEvent*)event client:(id)sender [self processKey:rime_keycode modifiers:rime_modifiers]; } if (changes & OSX_SHIFT_MASK) { - release_mask = modifiers & OSX_SHIFT_MASK ? 0 : kReleaseMask | (eventCount - _lastEventCount == 1 ? 0 : kIgnoredMask); + release_mask = modifiers & OSX_SHIFT_MASK ? 0 : kReleaseMask | (eventCount - _lastEventCount <= 1 ? 0 : kIgnoredMask); [self processKey:rime_keycode modifiers:(rime_modifiers | release_mask)]; } if (changes & OSX_CTRL_MASK) { - release_mask = modifiers & OSX_CTRL_MASK ? 0 : kReleaseMask | (eventCount - _lastEventCount == 1 ? 0 : kIgnoredMask); + release_mask = modifiers & OSX_CTRL_MASK ? 0 : kReleaseMask | (eventCount - _lastEventCount <= 1 ? 0 : kIgnoredMask); [self processKey:rime_keycode modifiers:(rime_modifiers | release_mask)]; } if (changes & OSX_ALT_MASK) { - release_mask = modifiers & OSX_ALT_MASK ? 0 : kReleaseMask | (eventCount - _lastEventCount == 1 ? 0 : kIgnoredMask); + release_mask = modifiers & OSX_ALT_MASK ? 0 : kReleaseMask | (eventCount - _lastEventCount <= 1 ? 0 : kIgnoredMask); [self processKey:rime_keycode modifiers:(rime_modifiers | release_mask)]; } if (changes & OSX_COMMAND_MASK) { - release_mask = modifiers & OSX_COMMAND_MASK ? 0 : kReleaseMask | (eventCount - _lastEventCount == 1 ? 0 : kIgnoredMask); + release_mask = modifiers & OSX_COMMAND_MASK ? 0 : kReleaseMask | (eventCount - _lastEventCount <= 1 ? 0 : kIgnoredMask); [self processKey:rime_keycode modifiers:(rime_modifiers | release_mask)]; + _lastEventCount = eventCount; // do not update UI when using Command key break; } From bc475557f2dfeb0904eca404b6a4435a7d8f7a1c Mon Sep 17 00:00:00 2001 From: groverlynn Date: Tue, 16 May 2023 09:36:32 +0200 Subject: [PATCH 8/9] Avoid autorelease --- SquirrelInputController.m | 31 +++++++++++++------------------ 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/SquirrelInputController.m b/SquirrelInputController.m index f0b553cef..17312cab1 100644 --- a/SquirrelInputController.m +++ b/SquirrelInputController.m @@ -24,7 +24,6 @@ @implementation SquirrelInputController { NSUInteger _caretPos; NSArray *_candidates; NSUInteger _lastModifier; - NSEventType _lastEventType; uint32_t _lastEventCount; RimeSessionId _session; NSString *_schemaId; @@ -52,9 +51,8 @@ - (BOOL)handleEvent:(NSEvent*)event client:(id)sender // Returning NO means the original key down will be passed on to the client. _currentClient = sender; - - CGEventFlags modifiers = CGEventGetFlags(event.CGEvent); - + NSEventModifierFlags modifiers = event.modifierFlags & NSEventModifierFlagDeviceIndependentFlagsMask; + uint32_t eventCount = CGEventSourceCounterForEventType(kCGEventSourceStateCombinedSessionState, kCGAnyInputEventType); BOOL handled = NO; @autoreleasepool { @@ -82,35 +80,32 @@ - (BOOL)handleEvent:(NSEvent*)event client:(id)sender int release_mask = 0; NSUInteger changes = _lastModifier ^ modifiers; int rime_modifiers = osx_modifiers_to_rime_modifiers(modifiers); - int64_t keyCode = CGEventGetIntegerValueField(event.CGEvent, kCGKeyboardEventKeycode); - int rime_keycode = osx_keycode_to_rime_keycode((int)keyCode, 0, 0, 0); + CGKeyCode keyCode = CGEventGetIntegerValueField(event.CGEvent, kCGKeyboardEventKeycode); + int rime_keycode = osx_keycode_to_rime_keycode(keyCode, 0, 0, 0); _lastModifier = modifiers; - uint32_t eventCount = CGEventSourceCounterForEventType(kCGEventSourceStateCombinedSessionState, kCGAnyInputEventType); if (changes & OSX_CAPITAL_MASK) { rime_modifiers ^= kLockMask; [self processKey:rime_keycode modifiers:rime_modifiers]; } if (changes & OSX_SHIFT_MASK) { - release_mask = modifiers & OSX_SHIFT_MASK ? 0 : kReleaseMask | (eventCount - _lastEventCount <= 1 ? 0 : kIgnoredMask); + release_mask = modifiers & OSX_SHIFT_MASK ? 0 : kReleaseMask | (eventCount - _lastEventCount == 1 ? 0 : kIgnoredMask); [self processKey:rime_keycode modifiers:(rime_modifiers | release_mask)]; } if (changes & OSX_CTRL_MASK) { - release_mask = modifiers & OSX_CTRL_MASK ? 0 : kReleaseMask | (eventCount - _lastEventCount <= 1 ? 0 : kIgnoredMask); + release_mask = modifiers & OSX_CTRL_MASK ? 0 : kReleaseMask | (eventCount - _lastEventCount == 1 ? 0 : kIgnoredMask); [self processKey:rime_keycode modifiers:(rime_modifiers | release_mask)]; } if (changes & OSX_ALT_MASK) { - release_mask = modifiers & OSX_ALT_MASK ? 0 : kReleaseMask | (eventCount - _lastEventCount <= 1 ? 0 : kIgnoredMask); + release_mask = modifiers & OSX_ALT_MASK ? 0 : kReleaseMask | (eventCount - _lastEventCount == 1 ? 0 : kIgnoredMask); [self processKey:rime_keycode modifiers:(rime_modifiers | release_mask)]; } if (changes & OSX_COMMAND_MASK) { - release_mask = modifiers & OSX_COMMAND_MASK ? 0 : kReleaseMask | (eventCount - _lastEventCount <= 1 ? 0 : kIgnoredMask); + release_mask = modifiers & OSX_COMMAND_MASK ? 0 : kReleaseMask | (eventCount - _lastEventCount == 1 ? 0 : kIgnoredMask); [self processKey:rime_keycode modifiers:(rime_modifiers | release_mask)]; - _lastEventCount = eventCount; // do not update UI when using Command key - break; + goto saveStatus; } [self rimeUpdate]; - _lastEventCount = eventCount; } break; case NSEventTypeKeyDown: { // ignore Command+X hotkeys. @@ -139,10 +134,10 @@ - (BOOL)handleEvent:(NSEvent*)event client:(id)sender break; } } - - _lastModifier = modifiers; - _lastEventType = event.type; - + saveStatus: if (event.type == NSEventTypeFlagsChanged) { + _lastModifier = modifiers; + _lastEventCount = eventCount; + } return handled; } From b049754faa54b7af1c4e2949ec870c59faf02414 Mon Sep 17 00:00:00 2001 From: groverlynn Date: Fri, 19 May 2023 03:06:59 +0200 Subject: [PATCH 9/9] allow mouse move between modifier down and up --- SquirrelInputController.m | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/SquirrelInputController.m b/SquirrelInputController.m index 17312cab1..6746a24df 100644 --- a/SquirrelInputController.m +++ b/SquirrelInputController.m @@ -24,7 +24,7 @@ @implementation SquirrelInputController { NSUInteger _caretPos; NSArray *_candidates; NSUInteger _lastModifier; - uint32_t _lastEventCount; + int _lastEventCount; RimeSessionId _session; NSString *_schemaId; BOOL _inlinePreedit; @@ -52,7 +52,11 @@ - (BOOL)handleEvent:(NSEvent*)event client:(id)sender _currentClient = sender; NSEventModifierFlags modifiers = event.modifierFlags & NSEventModifierFlagDeviceIndependentFlagsMask; - uint32_t eventCount = CGEventSourceCounterForEventType(kCGEventSourceStateCombinedSessionState, kCGAnyInputEventType); + int eventCount = CGEventSourceCounterForEventType(kCGEventSourceStateCombinedSessionState, kCGEventFlagsChanged) + + CGEventSourceCounterForEventType(kCGEventSourceStateCombinedSessionState, kCGEventKeyDown) + + CGEventSourceCounterForEventType(kCGEventSourceStateCombinedSessionState, kCGEventLeftMouseDown) + + CGEventSourceCounterForEventType(kCGEventSourceStateCombinedSessionState, kCGEventRightMouseDown) + + CGEventSourceCounterForEventType(kCGEventSourceStateCombinedSessionState, kCGEventOtherMouseDown); BOOL handled = NO; @autoreleasepool { @@ -82,7 +86,7 @@ - (BOOL)handleEvent:(NSEvent*)event client:(id)sender int rime_modifiers = osx_modifiers_to_rime_modifiers(modifiers); CGKeyCode keyCode = CGEventGetIntegerValueField(event.CGEvent, kCGKeyboardEventKeycode); int rime_keycode = osx_keycode_to_rime_keycode(keyCode, 0, 0, 0); - _lastModifier = modifiers; + if (changes & OSX_CAPITAL_MASK) { rime_modifiers ^= kLockMask; [self processKey:rime_keycode modifiers:rime_modifiers];