Browse Source

ModifierKeys are now stored inside events

Ceterum censeo StyleCopum esse delendum
Nikita Tsukanov 10 years ago
parent
commit
f0e154ac90

+ 0 - 9
src/Gtk/Perspex.Gtk/Input/GtkKeyboardDevice.cs

@@ -27,15 +27,6 @@ namespace Perspex.Gtk
             get { return instance; }
         }
 
-        public override ModifierKeys Modifiers
-        {
-            get
-            {
-                // TODO: Implement.
-                return ModifierKeys.None;
-            }
-        }
-
         public static Perspex.Input.Key ConvertKey(Gdk.Key key)
         {
             // TODO: Don't use reflection for this! My eyes!!!

+ 17 - 4
src/Gtk/Perspex.Gtk/WindowImpl.cs

@@ -126,6 +126,19 @@ namespace Perspex.Gtk
             this.Activate();
         }
 
+        private static ModifierKeys GetModifierKeys(ModifierType state)
+        {
+            var rv = ModifierKeys.None;
+            if (state.HasFlag(ModifierType.ControlMask))
+                rv |= ModifierKeys.Control;
+            if (state.HasFlag(ModifierType.ShiftMask))
+                rv |= ModifierKeys.Shift;
+            if (state.HasFlag(ModifierType.Mod1Mask))
+                rv |= ModifierKeys.Control;
+
+            return rv;
+        }
+
         protected override bool OnButtonPressEvent(Gdk.EventButton evnt)
         {
             var e = new RawMouseEventArgs(
@@ -133,7 +146,7 @@ namespace Perspex.Gtk
                 evnt.Time,
                 this.owner,
                 RawMouseEventType.LeftButtonDown,
-                new Point(evnt.X, evnt.Y));
+                new Point(evnt.X, evnt.Y), GetModifierKeys(evnt.State));
             this.Input(e);
             return true;
         }
@@ -145,7 +158,7 @@ namespace Perspex.Gtk
                 evnt.Time,
                 this.owner,
                 RawMouseEventType.LeftButtonUp,
-                new Point(evnt.X, evnt.Y));
+                new Point(evnt.X, evnt.Y), GetModifierKeys(evnt.State));
             this.Input(e);
             return true;
         }
@@ -176,7 +189,7 @@ namespace Perspex.Gtk
                 GtkKeyboardDevice.Instance,
                 evnt.Time,
                 evnt.Type == EventType.KeyPress ? RawKeyEventType.KeyDown : RawKeyEventType.KeyUp,
-                GtkKeyboardDevice.ConvertKey(evnt.Key));
+                GtkKeyboardDevice.ConvertKey(evnt.Key), GetModifierKeys(evnt.State));
             this.Input(e);
             return true;
         }
@@ -212,7 +225,7 @@ namespace Perspex.Gtk
                 evnt.Time,
                 this.owner,
                 RawMouseEventType.Move,
-                position);
+                position, GetModifierKeys(evnt.State));
             this.Input(e);
             return true;
         }

+ 1 - 1
src/Perspex.Controls/DropDown.cs

@@ -89,7 +89,7 @@ namespace Perspex.Controls
             if (!e.Handled)
             {
                 if (e.Key == Key.F4 ||
-                    (e.Key == Key.Down && ((e.Device.Modifiers & ModifierKeys.Alt) != 0)))
+                    (e.Key == Key.Down && ((e.Modifiers & ModifierKeys.Alt) != 0)))
                 {
                     this.IsDropDownOpen = !this.IsDropDownOpen;
                     e.Handled = true;

+ 1 - 1
src/Perspex.Controls/TextBox.cs

@@ -175,7 +175,7 @@ namespace Perspex.Controls
             int caretIndex = this.CaretIndex;
             bool movement = false;
             bool handled = true;
-            var modifiers = e.Device.Modifiers;
+            var modifiers = e.Modifiers;
 
             switch (e.Key)
             {

+ 1 - 1
src/Perspex.Input/AccessKeyHandler.cs

@@ -146,7 +146,7 @@ namespace Perspex.Input
                 this.CloseMenu();
                 e.Handled = true;
             }
-            else if ((KeyboardDevice.Instance.Modifiers & ModifierKeys.Alt) != 0 || menuIsOpen)
+            else if ((e.Modifiers & ModifierKeys.Alt) != 0 || menuIsOpen)
             {
                 // If any other key is pressed with the Alt key held down, or the main menu is open,
                 // find all controls who have registered that access key.

+ 1 - 3
src/Perspex.Input/IKeyboardDevice.cs

@@ -29,9 +29,7 @@ namespace Perspex.Input
     public interface IKeyboardDevice : IInputDevice
     {
         IInputElement FocusedElement { get; }
-
-        ModifierKeys Modifiers { get; }
-
+        
         void SetFocusedElement(IInputElement element, NavigationMethod method);
     }
 }

+ 2 - 0
src/Perspex.Input/KeyEventArgs.cs

@@ -14,5 +14,7 @@ namespace Perspex.Input
         public IKeyboardDevice Device { get; set; }
 
         public Key Key { get; set; }
+
+        public ModifierKeys Modifiers { get; set; }
     }
 }

+ 2 - 3
src/Perspex.Input/KeyboardDevice.cs

@@ -57,9 +57,7 @@ namespace Perspex.Input
                 this.RaisePropertyChanged();
             }
         }
-
-        public abstract ModifierKeys Modifiers { get; }
-
+        
         public void SetFocusedElement(IInputElement element, NavigationMethod method)
         {
             if (element != this.FocusedElement)
@@ -115,6 +113,7 @@ namespace Perspex.Input
                                 RoutedEvent = routedEvent,
                                 Device = this,
                                 Key = keyInput.Key,
+                                Modifiers = keyInput.Modifiers,
                                 Source = element,
                             };
 

+ 1 - 1
src/Perspex.Input/KeyboardNavigationHandler.cs

@@ -101,7 +101,7 @@ namespace Perspex.Input
                 switch (e.Key)
                 {
                     case Key.Tab:
-                        direction = (KeyboardDevice.Instance.Modifiers & ModifierKeys.Shift) == 0 ?
+                        direction = (e.Modifiers & ModifierKeys.Shift) == 0 ?
                             FocusNavigationDirection.Next : FocusNavigationDirection.Previous;
                         break;
                     case Key.Up:

+ 4 - 1
src/Perspex.Input/Raw/RawKeyEventArgs.cs

@@ -18,14 +18,17 @@ namespace Perspex.Input.Raw
             IKeyboardDevice device,
             uint timestamp,
             RawKeyEventType type,
-            Key key)
+            Key key, ModifierKeys modifiers)
             : base(device, timestamp)
         {
             this.Key = key;
             this.Type = type;
+            this.Modifiers = modifiers;
         }
 
         public Key Key { get; set; }
+
+        public ModifierKeys Modifiers { get; set; }
         
         public RawKeyEventType Type { get; set; }
     }

+ 4 - 1
src/Perspex.Input/Raw/RawMouseEventArgs.cs

@@ -24,7 +24,7 @@ namespace Perspex.Input.Raw
             uint timestamp,
             IInputRoot root,
             RawMouseEventType type,
-            Point position)
+            Point position, ModifierKeys modifierKeys)
             : base(device, timestamp)
         {
             Contract.Requires<ArgumentNullException>(device != null);
@@ -33,6 +33,7 @@ namespace Perspex.Input.Raw
             this.Root = root;
             this.Position = position;
             this.Type = type;
+            this.ModifierKeys = modifierKeys;
         }
 
         public IInputRoot Root { get; private set; }
@@ -40,5 +41,7 @@ namespace Perspex.Input.Raw
         public Point Position { get; private set; }
 
         public RawMouseEventType Type { get; private set; }
+
+        public ModifierKeys ModifierKeys { get; private set; }
     }
 }

+ 2 - 2
src/Perspex.Input/Raw/RawMouseWheelEventArgs.cs

@@ -16,8 +16,8 @@ namespace Perspex.Input.Raw
             uint timestamp,
             IInputRoot root,
             Point position,
-            Vector delta)
-            : base(device, timestamp, root, RawMouseEventType.Wheel, position)
+            Vector delta, ModifierKeys modifierKeys)
+            : base(device, timestamp, root, RawMouseEventType.Wheel, position, modifierKeys)
         {
             this.Delta = delta;
         }

+ 3 - 2
src/Windows/Perspex.Win32/Input/WindowsKeyboardDevice.cs

@@ -22,10 +22,11 @@ namespace Perspex.Win32.Input
             get { return instance; }
         }
 
-        public override ModifierKeys Modifiers
+        public ModifierKeys Modifiers
         {
             get
             {
+                UpdateKeyStates();
                 ModifierKeys result = 0;
 
                 if (this.IsDown(Key.LeftAlt) || this.IsDown(Key.RightAlt))
@@ -70,7 +71,7 @@ namespace Perspex.Win32.Input
             return result.ToString();
         }
 
-        internal void UpdateKeyStates()
+        private void UpdateKeyStates()
         {
             UnmanagedMethods.GetKeyboardState(this.keyStates);
         }

+ 7 - 9
src/Windows/Perspex.Win32/WindowImpl.cs

@@ -261,22 +261,20 @@ namespace Perspex.Win32
 
                 case UnmanagedMethods.WindowsMessage.WM_KEYDOWN:
                 case UnmanagedMethods.WindowsMessage.WM_SYSKEYDOWN:
-                    WindowsKeyboardDevice.Instance.UpdateKeyStates();
                     e = new RawKeyEventArgs(
                             WindowsKeyboardDevice.Instance,
                             timestamp,
                             RawKeyEventType.KeyDown,
-                            KeyInterop.KeyFromVirtualKey((int)wParam));
+                            KeyInterop.KeyFromVirtualKey((int)wParam), WindowsKeyboardDevice.Instance.Modifiers);
                     break;
 
                 case UnmanagedMethods.WindowsMessage.WM_KEYUP:
                 case UnmanagedMethods.WindowsMessage.WM_SYSKEYUP:
-                    WindowsKeyboardDevice.Instance.UpdateKeyStates();
                     e = new RawKeyEventArgs(
                             WindowsKeyboardDevice.Instance,
                             timestamp,
                             RawKeyEventType.KeyUp,
-                            KeyInterop.KeyFromVirtualKey((int)wParam));
+                            KeyInterop.KeyFromVirtualKey((int)wParam), WindowsKeyboardDevice.Instance.Modifiers);
                     break;
                 case UnmanagedMethods.WindowsMessage.WM_CHAR:
                     // Ignore control chars
@@ -293,7 +291,7 @@ namespace Perspex.Win32
                         timestamp,
                         this.owner,
                         RawMouseEventType.LeftButtonDown,
-                        new Point((uint)lParam & 0xffff, (uint)lParam >> 16));
+                        new Point((uint)lParam & 0xffff, (uint)lParam >> 16), WindowsKeyboardDevice.Instance.Modifiers);
                     break;
 
                 case UnmanagedMethods.WindowsMessage.WM_LBUTTONUP:
@@ -302,7 +300,7 @@ namespace Perspex.Win32
                         timestamp,
                         this.owner,
                         RawMouseEventType.LeftButtonUp,
-                        new Point((uint)lParam & 0xffff, (uint)lParam >> 16));
+                        new Point((uint)lParam & 0xffff, (uint)lParam >> 16), WindowsKeyboardDevice.Instance.Modifiers);
                     break;
 
                 case UnmanagedMethods.WindowsMessage.WM_MOUSEMOVE:
@@ -324,7 +322,7 @@ namespace Perspex.Win32
                         timestamp,
                         this.owner,
                         RawMouseEventType.Move,
-                        new Point((uint)lParam & 0xffff, (uint)lParam >> 16));
+                        new Point((uint)lParam & 0xffff, (uint)lParam >> 16), WindowsKeyboardDevice.Instance.Modifiers);
                     break;
 
                 case UnmanagedMethods.WindowsMessage.WM_MOUSEWHEEL:
@@ -333,7 +331,7 @@ namespace Perspex.Win32
                         timestamp,
                         this.owner,
                         this.ScreenToClient((uint)lParam & 0xffff, (uint)lParam >> 16),
-                        new Vector(0, ((int)wParam >> 16) / WheelDelta));
+                        new Vector(0, ((int)wParam >> 16) / WheelDelta), WindowsKeyboardDevice.Instance.Modifiers);
                     break;
 
                 case UnmanagedMethods.WindowsMessage.WM_MOUSELEAVE:
@@ -343,7 +341,7 @@ namespace Perspex.Win32
                         timestamp,
                         this.owner,
                         RawMouseEventType.LeaveWindow,
-                        new Point());
+                        new Point(), WindowsKeyboardDevice.Instance.Modifiers);
                     break;
 
                 case UnmanagedMethods.WindowsMessage.WM_PAINT:

+ 1 - 1
tests/Perspex.Controls.UnitTests/TopLevelTests.cs

@@ -300,7 +300,7 @@ namespace Perspex.Controls.UnitTests
                     new Mock<IKeyboardDevice>().Object,
                     0,
                     RawKeyEventType.KeyDown,
-                    Key.A);
+                    Key.A, ModifierKeys.None);
                 impl.Object.Input(input);
 
                 var inputManagerMock = Mock.Get(InputManager.Instance);