@@ -78,32 +78,53 @@ - (BOOL)handleEvent:(NSEvent*)event client:(id)sender
7878 handled = YES ;
7979 break ;
8080 }
81- int keyCode = event.keyCode ;
82- // NSLog(@"FLAGSCHANGED client: %@, modifiers: 0x%lx, keyCode: %d", sender, modifiers, keyCode);
83- int rime_keycode = osx_keycode_to_rime_keycode (keyCode, 0 , 0 , 0 );
81+ // NSLog(@"FLAGSCHANGED client: %@, modifiers: 0x%lx", sender, modifiers);
8482 int rime_modifiers = osx_modifiers_to_rime_modifiers (modifiers);
83+ int rime_keycode = 0 ;
84+ // For flags-changed event, keyCode is available since macOS 10.15 (#715)
85+ Bool keyCodeAvailable = NO ;
86+ if (@available (macOS 10.15 , *)) {
87+ keyCodeAvailable = YES ;
88+ rime_keycode = osx_keycode_to_rime_keycode (event.keyCode , 0 , 0 , 0 );
89+ // NSLog(@"keyCode: %d", event.keyCode);
90+ }
8591 int release_mask = 0 ;
8692 NSUInteger changes = _lastModifier ^ modifiers;
8793 if (changes & OSX_CAPITAL_MASK ) {
94+ if (!keyCodeAvailable) {
95+ rime_keycode = XK_Caps_Lock;
96+ }
8897 // NOTE: rime assumes XK_Caps_Lock to be sent before modifier changes,
8998 // while NSFlagsChanged event has the flag changed already.
9099 // so it is necessary to revert kLockMask.
91100 rime_modifiers ^= kLockMask ;
92101 [self processKey: rime_keycode modifiers: rime_modifiers];
93102 }
94103 if (changes & OSX_SHIFT_MASK ) {
104+ if (!keyCodeAvailable) {
105+ rime_keycode = XK_Shift_L;
106+ }
95107 release_mask = modifiers & OSX_SHIFT_MASK ? 0 : kReleaseMask ;
96108 [self processKey: rime_keycode modifiers: (rime_modifiers | release_mask)];
97109 }
98110 if (changes & OSX_CTRL_MASK ) {
111+ if (!keyCodeAvailable) {
112+ rime_keycode = XK_Control_L;
113+ }
99114 release_mask = modifiers & OSX_CTRL_MASK ? 0 : kReleaseMask ;
100115 [self processKey: rime_keycode modifiers: (rime_modifiers | release_mask)];
101116 }
102117 if (changes & OSX_ALT_MASK ) {
118+ if (!keyCodeAvailable) {
119+ rime_keycode = XK_Alt_L;
120+ }
103121 release_mask = modifiers & OSX_ALT_MASK ? 0 : kReleaseMask ;
104122 [self processKey: rime_keycode modifiers: (rime_modifiers | release_mask)];
105123 }
106124 if (changes & OSX_COMMAND_MASK ) {
125+ if (!keyCodeAvailable) {
126+ rime_keycode = XK_Super_L;
127+ }
107128 release_mask = modifiers & OSX_COMMAND_MASK ? 0 : kReleaseMask ;
108129 [self processKey: rime_keycode modifiers: (rime_modifiers | release_mask)];
109130 // do not update UI when using Command key
0 commit comments