diff --git a/README.md b/README.md index d6d1b06b..cf15b75b 100644 --- a/README.md +++ b/README.md @@ -247,6 +247,7 @@ skills. - Simon Voordouw - Torsten Walluhn - Patrick Walton + - Xo Wang - Jay Weisskopf - Frank Wille - yuriks diff --git a/src/cocoa_platform.h b/src/cocoa_platform.h index a2025e1d..212a8ad8 100644 --- a/src/cocoa_platform.h +++ b/src/cocoa_platform.h @@ -66,7 +66,6 @@ typedef struct _GLFWwindowNS id object; id delegate; id view; - unsigned int modifierFlags; // The total sum of the distances the cursor has been warped // since the last cursor motion event was processed diff --git a/src/cocoa_window.m b/src/cocoa_window.m index 47af1e9a..1a7662b1 100644 --- a/src/cocoa_window.m +++ b/src/cocoa_window.m @@ -123,6 +123,29 @@ static int translateKey(unsigned int key) return _glfw.ns.publicKeys[key]; } +// Translate a GLFW keycode to a Cocoa modifier flag +// +static NSUInteger translateKeyToModifierFlag(int key) +{ + switch (key) + { + case GLFW_KEY_LEFT_SHIFT: + case GLFW_KEY_RIGHT_SHIFT: + return NSShiftKeyMask; + case GLFW_KEY_LEFT_CONTROL: + case GLFW_KEY_RIGHT_CONTROL: + return NSControlKeyMask; + case GLFW_KEY_LEFT_ALT: + case GLFW_KEY_RIGHT_ALT: + return NSAlternateKeyMask; + case GLFW_KEY_LEFT_SUPER: + case GLFW_KEY_RIGHT_SUPER: + return NSCommandKeyMask; + } + + return 0; +} + //------------------------------------------------------------------------ // Delegate for window related notifications @@ -206,9 +229,6 @@ static int translateKey(unsigned int key) - (void)windowDidBecomeKey:(NSNotification *)notification { - window->ns.modifierFlags = - [NSEvent modifierFlags] & NSDeviceIndependentModifierFlagsMask; - if (_glfw.cursorWindow == window && window->cursorMode == GLFW_CURSOR_DISABLED) { @@ -502,21 +522,18 @@ static int translateKey(unsigned int key) [event modifierFlags] & NSDeviceIndependentModifierFlagsMask; const int key = translateKey([event keyCode]); const int mods = translateFlags(modifierFlags); + const NSUInteger keyFlag = translateKeyToModifierFlag(key); - if (modifierFlags == window->ns.modifierFlags) + if (keyFlag & modifierFlags) { if (window->keys[key] == GLFW_PRESS) action = GLFW_RELEASE; else action = GLFW_PRESS; } - else if (modifierFlags > window->ns.modifierFlags) - action = GLFW_PRESS; else action = GLFW_RELEASE; - window->ns.modifierFlags = modifierFlags; - _glfwInputKey(window, key, [event keyCode], action, mods); }