Browse Source

ModifierKeys are now stored inside events

Ceterum censeo StyleCopum esse delendum
pull/131/head
Nikita Tsukanov 11 years ago
parent
commit
f0e154ac90
  1. 9
      src/Gtk/Perspex.Gtk/Input/GtkKeyboardDevice.cs
  2. 21
      src/Gtk/Perspex.Gtk/WindowImpl.cs
  3. 2
      src/Perspex.Controls/DropDown.cs
  4. 2
      src/Perspex.Controls/TextBox.cs
  5. 2
      src/Perspex.Input/AccessKeyHandler.cs
  6. 4
      src/Perspex.Input/IKeyboardDevice.cs
  7. 2
      src/Perspex.Input/KeyEventArgs.cs
  8. 5
      src/Perspex.Input/KeyboardDevice.cs
  9. 2
      src/Perspex.Input/KeyboardNavigationHandler.cs
  10. 5
      src/Perspex.Input/Raw/RawKeyEventArgs.cs
  11. 5
      src/Perspex.Input/Raw/RawMouseEventArgs.cs
  12. 4
      src/Perspex.Input/Raw/RawMouseWheelEventArgs.cs
  13. 5
      src/Windows/Perspex.Win32/Input/WindowsKeyboardDevice.cs
  14. 16
      src/Windows/Perspex.Win32/WindowImpl.cs
  15. 2
      tests/Perspex.Controls.UnitTests/TopLevelTests.cs

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!!!

21
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;
}

2
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;

2
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)
{

2
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.

4
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
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; }
}
}

5
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,
};

2
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:

5
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; }
}

5
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; }
}
}

4
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;
}

5
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);
}

16
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:

2
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);

Loading…
Cancel
Save