Browse Source

cocoa: Set keyboard mod state correctly when turning off capslock.

Fixes Bugzilla #4716.
Ryan C. Gordon 6 years ago
parent
commit
27ad8e5d72
1 changed files with 11 additions and 1 deletions
  1. 11 1
      src/video/cocoa/SDL_cocoawindow.m

+ 11 - 1
src/video/cocoa/SDL_cocoawindow.m

@@ -866,7 +866,17 @@ SetWindowStyle(SDL_Window * window, NSUInteger style)
        10.15 beta, capslock comes through here as keycode 255, but it's safe
        10.15 beta, capslock comes through here as keycode 255, but it's safe
        to send duplicate key events; SDL filters them out quickly in
        to send duplicate key events; SDL filters them out quickly in
        SDL_SendKeyboardKey(). */
        SDL_SendKeyboardKey(). */
-    SDL_SendKeyboardKey(([theEvent modifierFlags] & NSEventModifierFlagCapsLock) ? SDL_PRESSED : SDL_RELEASED, SDL_SCANCODE_CAPSLOCK);
+
+    /* Also note that SDL_SendKeyboardKey expects all capslock events to be
+       keypresses; it won't toggle the mod state if you send a keyrelease.  */
+    const SDL_bool osenabled = ([theEvent modifierFlags] & NSEventModifierFlagCapsLock) ? SDL_TRUE : SDL_FALSE;
+    const SDL_bool sdlenabled = (SDL_GetModState() & KMOD_CAPS) ? SDL_TRUE : SDL_FALSE;
+    if (!osenabled && sdlenabled) {
+        SDL_ToggleModState(KMOD_CAPS, SDL_FALSE);
+        SDL_SendKeyboardKey(SDL_RELEASED, SDL_SCANCODE_CAPSLOCK);
+    } else if (osenabled && !sdlenabled) {
+        SDL_SendKeyboardKey(SDL_PRESSED, SDL_SCANCODE_CAPSLOCK);
+    }
 }
 }
 - (void)keyDown:(NSEvent *)theEvent
 - (void)keyDown:(NSEvent *)theEvent
 {
 {