[Mac] Report KeyDown/Up events for modifier flags
authorthefiddler <stapostol@gmail.com>
Mon, 5 May 2014 07:14:14 +0000 (09:14 +0200)
committerthefiddler <stapostol@gmail.com>
Mon, 5 May 2014 07:14:14 +0000 (09:14 +0200)
Source/OpenTK/Platform/MacOS/CocoaNativeWindow.cs
Source/OpenTK/Platform/NativeWindowBase.cs

index 5372e7b..9e746ea 100644 (file)
@@ -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);
index 4701381..7a268ef 100644 (file)
@@ -150,6 +150,73 @@ namespace OpenTK.Platform
             KeyUp(this, e);
         }
 
+        /// \internal
+        /// <summary>
+        /// 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.
+        /// </summary>
+        /// <param name="mods">Mods.</param>
+        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);