From 41276361fb06bd4d0cf0e4d2472df6e434a1c540 Mon Sep 17 00:00:00 2001 From: thefiddler Date: Mon, 5 May 2014 09:14:14 +0200 Subject: [PATCH] [Mac] Report KeyDown/Up events for modifier flags --- Source/OpenTK/Platform/MacOS/CocoaNativeWindow.cs | 11 ++-- Source/OpenTK/Platform/NativeWindowBase.cs | 67 +++++++++++++++++++++++ 2 files changed, 74 insertions(+), 4 deletions(-) diff --git a/Source/OpenTK/Platform/MacOS/CocoaNativeWindow.cs b/Source/OpenTK/Platform/MacOS/CocoaNativeWindow.cs index 5372e7b..9e746ea 100644 --- a/Source/OpenTK/Platform/MacOS/CocoaNativeWindow.cs +++ b/Source/OpenTK/Platform/MacOS/CocoaNativeWindow.cs @@ -411,9 +411,7 @@ namespace OpenTK.Platform.MacOS case NSEventType.KeyDown: { MacOSKeyCode keyCode = (MacOSKeyCode)Cocoa.SendUshort(e, selKeyCode); - //var modifierFlags = (NSEventModifierMask)Cocoa.SendUint(e, selModifierFlags); var isARepeat = Cocoa.SendBool(e, selIsARepeat); - //GetKey(keyCode, modifierFlags, keyArgs); Key key = MacOSKeyMap.GetKey(keyCode); OnKeyDown(key, isARepeat); @@ -435,13 +433,18 @@ namespace OpenTK.Platform.MacOS case NSEventType.KeyUp: { MacOSKeyCode keyCode = (MacOSKeyCode)Cocoa.SendUshort(e, selKeyCode); - //var modifierFlags = (NSEventModifierMask)Cocoa.SendUint(e, selModifierFlags); - //GetKey(keyCode, modifierFlags, keyArgs); Key key = MacOSKeyMap.GetKey(keyCode); OnKeyUp(key); } break; + case NSEventType.FlagsChanged: + { + var modifierFlags = (NSEventModifierMask)Cocoa.SendUint(e, selModifierFlags); + UpdateModifierFlags(GetModifiers(modifierFlags)); + } + break; + case NSEventType.MouseEntered: { var eventTrackingArea = Cocoa.SendIntPtr(e, selTrackingArea); diff --git a/Source/OpenTK/Platform/NativeWindowBase.cs b/Source/OpenTK/Platform/NativeWindowBase.cs index 4701381..7a268ef 100644 --- a/Source/OpenTK/Platform/NativeWindowBase.cs +++ b/Source/OpenTK/Platform/NativeWindowBase.cs @@ -150,6 +150,73 @@ namespace OpenTK.Platform KeyUp(this, e); } + /// \internal + /// + /// Call this method to simulate KeyDown/KeyUp events + /// on platforms that do not generate key events for + /// modifier flags (e.g. Mac/Cocoa). + /// Note: this method does not distinguish between the + /// left and right variants of modifier keys. + /// + /// Mods. + protected void UpdateModifierFlags(KeyModifiers mods) + { + bool alt = (mods & KeyModifiers.Alt) != 0; + bool control = (mods & KeyModifiers.Control) != 0; + bool shift = (mods & KeyModifiers.Shift) != 0; + + if (alt) + { + OnKeyDown(Key.AltLeft, KeyboardState[Key.AltLeft]); + OnKeyDown(Key.AltRight, KeyboardState[Key.AltLeft]); + } + else + { + if (KeyboardState[Key.AltLeft]) + { + OnKeyUp(Key.AltLeft); + } + if (KeyboardState[Key.AltRight]) + { + OnKeyUp(Key.AltRight); + } + } + + if (control) + { + OnKeyDown(Key.ControlLeft, KeyboardState[Key.AltLeft]); + OnKeyDown(Key.ControlRight, KeyboardState[Key.AltLeft]); + } + else + { + if (KeyboardState[Key.ControlLeft]) + { + OnKeyUp(Key.ControlLeft); + } + if (KeyboardState[Key.ControlRight]) + { + OnKeyUp(Key.ControlRight); + } + } + + if (shift) + { + OnKeyDown(Key.ShiftLeft, KeyboardState[Key.AltLeft]); + OnKeyDown(Key.ShiftRight, KeyboardState[Key.AltLeft]); + } + else + { + if (KeyboardState[Key.ShiftLeft]) + { + OnKeyUp(Key.ShiftLeft); + } + if (KeyboardState[Key.ShiftRight]) + { + OnKeyUp(Key.ShiftRight); + } + } + } + protected void OnMouseLeave(EventArgs e) { MouseLeave(this, e); -- 2.7.4