diff --git a/src/Gtk/Perspex.Gtk/WindowImpl.cs b/src/Gtk/Perspex.Gtk/WindowImpl.cs
index debfb57397..17c1b20e84 100644
--- a/src/Gtk/Perspex.Gtk/WindowImpl.cs
+++ b/src/Gtk/Perspex.Gtk/WindowImpl.cs
@@ -134,26 +134,33 @@ namespace Perspex.Gtk
Activate();
}
- private static ModifierKeys GetModifierKeys(ModifierType state)
+ private static InputModifiers GetModifierKeys(ModifierType state)
{
- var rv = ModifierKeys.None;
+ var rv = InputModifiers.None;
if (state.HasFlag(ModifierType.ControlMask))
- rv |= ModifierKeys.Control;
+ rv |= InputModifiers.Control;
if (state.HasFlag(ModifierType.ShiftMask))
- rv |= ModifierKeys.Shift;
+ rv |= InputModifiers.Shift;
if (state.HasFlag(ModifierType.Mod1Mask))
- rv |= ModifierKeys.Control;
+ rv |= InputModifiers.Control;
+ if(state.HasFlag(ModifierType.Button1Mask))
+ rv |= InputModifiers.LeftMouseButton;
+ if (state.HasFlag(ModifierType.Button2Mask))
+ rv |= InputModifiers.RightMouseButton;
return rv;
}
protected override bool OnButtonPressEvent(EventButton evnt)
{
+
var e = new RawMouseEventArgs(
GtkMouseDevice.Instance,
evnt.Time,
_owner,
- RawMouseEventType.LeftButtonDown,
+ evnt.Button == 0
+ ? RawMouseEventType.LeftButtonDown
+ : RawMouseEventType.RightButtonDown,
new Point(evnt.X, evnt.Y), GetModifierKeys(evnt.State));
Input(e);
return true;
@@ -165,7 +172,9 @@ namespace Perspex.Gtk
GtkMouseDevice.Instance,
evnt.Time,
_owner,
- RawMouseEventType.LeftButtonUp,
+ evnt.Button == 0
+ ? RawMouseEventType.LeftButtonUp
+ : RawMouseEventType.RightButtonUp,
new Point(evnt.X, evnt.Y), GetModifierKeys(evnt.State));
Input(e);
return true;
diff --git a/src/Perspex.Controls/DropDown.cs b/src/Perspex.Controls/DropDown.cs
index dbfd03ea83..a465ce68a9 100644
--- a/src/Perspex.Controls/DropDown.cs
+++ b/src/Perspex.Controls/DropDown.cs
@@ -86,7 +86,7 @@ namespace Perspex.Controls
if (!e.Handled)
{
if (e.Key == Key.F4 ||
- (e.Key == Key.Down && ((e.Modifiers & ModifierKeys.Alt) != 0)))
+ (e.Key == Key.Down && ((e.Modifiers & InputModifiers.Alt) != 0)))
{
IsDropDownOpen = !IsDropDownOpen;
e.Handled = true;
diff --git a/src/Perspex.Controls/TextBox.cs b/src/Perspex.Controls/TextBox.cs
index e8eaf70a73..ad48cc49af 100644
--- a/src/Perspex.Controls/TextBox.cs
+++ b/src/Perspex.Controls/TextBox.cs
@@ -175,21 +175,21 @@ namespace Perspex.Controls
switch (e.Key)
{
case Key.A:
- if (modifiers == ModifierKeys.Control)
+ if (modifiers == InputModifiers.Control)
{
SelectAll();
}
break;
case Key.C:
- if (modifiers == ModifierKeys.Control)
+ if (modifiers == InputModifiers.Control)
{
Copy();
}
break;
case Key.V:
- if (modifiers == ModifierKeys.Control)
+ if (modifiers == InputModifiers.Control)
{
Paste();
}
@@ -264,7 +264,7 @@ namespace Perspex.Controls
break;
}
- if (movement && ((modifiers & ModifierKeys.Shift) != 0))
+ if (movement && ((modifiers & InputModifiers.Shift) != 0))
{
SelectionEnd = CaretIndex;
}
@@ -335,12 +335,12 @@ namespace Perspex.Controls
return Math.Max(0, Math.Min(length, value));
}
- private void MoveHorizontal(int count, ModifierKeys modifiers)
+ private void MoveHorizontal(int count, InputModifiers modifiers)
{
var text = Text ?? string.Empty;
var caretIndex = CaretIndex;
- if ((modifiers & ModifierKeys.Control) != 0)
+ if ((modifiers & InputModifiers.Control) != 0)
{
if (count > 0)
{
@@ -355,7 +355,7 @@ namespace Perspex.Controls
CaretIndex = caretIndex += count;
}
- private void MoveVertical(int count, ModifierKeys modifiers)
+ private void MoveVertical(int count, InputModifiers modifiers)
{
var formattedText = _presenter.FormattedText;
var lines = formattedText.GetLines().ToList();
@@ -373,12 +373,12 @@ namespace Perspex.Controls
}
}
- private void MoveHome(ModifierKeys modifiers)
+ private void MoveHome(InputModifiers modifiers)
{
var text = Text ?? string.Empty;
var caretIndex = CaretIndex;
- if ((modifiers & ModifierKeys.Control) != 0)
+ if ((modifiers & InputModifiers.Control) != 0)
{
caretIndex = 0;
}
@@ -403,12 +403,12 @@ namespace Perspex.Controls
CaretIndex = caretIndex;
}
- private void MoveEnd(ModifierKeys modifiers)
+ private void MoveEnd(InputModifiers modifiers)
{
var text = Text ?? string.Empty;
var caretIndex = CaretIndex;
- if ((modifiers & ModifierKeys.Control) != 0)
+ if ((modifiers & InputModifiers.Control) != 0)
{
caretIndex = text.Length;
}
diff --git a/src/Perspex.HtmlRenderer/HtmlContainer.cs b/src/Perspex.HtmlRenderer/HtmlContainer.cs
index ead879b116..9ada42d5ed 100644
--- a/src/Perspex.HtmlRenderer/HtmlContainer.cs
+++ b/src/Perspex.HtmlRenderer/HtmlContainer.cs
@@ -462,7 +462,7 @@ namespace TheArtOfDev.HtmlRenderer.Perspex
///
private static RKeyEvent CreateKeyEevent(KeyEventArgs e)
{
- var control = (e.Modifiers & ModifierKeys.Control) == ModifierKeys.Control;
+ var control = (e.Modifiers & InputModifiers.Control) == InputModifiers.Control;
return new RKeyEvent(control, e.Key == Key.A, e.Key == Key.C);
}
diff --git a/src/Perspex.Input/AccessKeyHandler.cs b/src/Perspex.Input/AccessKeyHandler.cs
index 4cd1a80170..1edef7b92c 100644
--- a/src/Perspex.Input/AccessKeyHandler.cs
+++ b/src/Perspex.Input/AccessKeyHandler.cs
@@ -143,7 +143,7 @@ namespace Perspex.Input
CloseMenu();
e.Handled = true;
}
- else if ((e.Modifiers & ModifierKeys.Alt) != 0 || menuIsOpen)
+ else if ((e.Modifiers & InputModifiers.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.
diff --git a/src/Perspex.Input/IInputElement.cs b/src/Perspex.Input/IInputElement.cs
index c2ae73e3c5..fa75629f64 100644
--- a/src/Perspex.Input/IInputElement.cs
+++ b/src/Perspex.Input/IInputElement.cs
@@ -60,7 +60,7 @@ namespace Perspex.Input
///
/// Occurs when the pointer is released over the control.
///
- event EventHandler PointerReleased;
+ event EventHandler PointerReleased;
///
/// Occurs when the mouse wheen is scrolled over the control.
diff --git a/src/Perspex.Input/IKeyboardDevice.cs b/src/Perspex.Input/IKeyboardDevice.cs
index 40c790e270..86d45915e9 100644
--- a/src/Perspex.Input/IKeyboardDevice.cs
+++ b/src/Perspex.Input/IKeyboardDevice.cs
@@ -6,13 +6,15 @@ using System;
namespace Perspex.Input
{
[Flags]
- public enum ModifierKeys
+ public enum InputModifiers
{
None = 0,
Alt = 1,
Control = 2,
Shift = 4,
Windows = 8,
+ LeftMouseButton = 16,
+ RightMouseButton = 32
}
[Flags]
diff --git a/src/Perspex.Input/InputElement.cs b/src/Perspex.Input/InputElement.cs
index 639cf94003..2075bc09f2 100644
--- a/src/Perspex.Input/InputElement.cs
+++ b/src/Perspex.Input/InputElement.cs
@@ -123,8 +123,8 @@ namespace Perspex.Input
///
/// Defines the event.
///
- public static readonly RoutedEvent PointerReleasedEvent =
- RoutedEvent.Register(
+ public static readonly RoutedEvent PointerReleasedEvent =
+ RoutedEvent.Register(
"PointerReleased",
RoutingStrategies.Tunnel | RoutingStrategies.Bubble);
@@ -240,7 +240,7 @@ namespace Perspex.Input
///
/// Occurs when the pointer is released over the control.
///
- public event EventHandler PointerReleased
+ public event EventHandler PointerReleased
{
add { AddHandler(PointerReleasedEvent, value); }
remove { RemoveHandler(PointerReleasedEvent, value); }
diff --git a/src/Perspex.Input/KeyEventArgs.cs b/src/Perspex.Input/KeyEventArgs.cs
index 54f420a71c..6e3f678c44 100644
--- a/src/Perspex.Input/KeyEventArgs.cs
+++ b/src/Perspex.Input/KeyEventArgs.cs
@@ -12,6 +12,6 @@ namespace Perspex.Input
public Key Key { get; set; }
- public ModifierKeys Modifiers { get; set; }
+ public InputModifiers Modifiers { get; set; }
}
}
diff --git a/src/Perspex.Input/KeyboardNavigationHandler.cs b/src/Perspex.Input/KeyboardNavigationHandler.cs
index 4c791d83c1..9c4ac508fd 100644
--- a/src/Perspex.Input/KeyboardNavigationHandler.cs
+++ b/src/Perspex.Input/KeyboardNavigationHandler.cs
@@ -98,7 +98,7 @@ namespace Perspex.Input
switch (e.Key)
{
case Key.Tab:
- direction = (e.Modifiers & ModifierKeys.Shift) == 0 ?
+ direction = (e.Modifiers & InputModifiers.Shift) == 0 ?
FocusNavigationDirection.Next : FocusNavigationDirection.Previous;
break;
case Key.Up:
diff --git a/src/Perspex.Input/MouseDevice.cs b/src/Perspex.Input/MouseDevice.cs
index 6cde0d8faf..1d54461ea4 100644
--- a/src/Perspex.Input/MouseDevice.cs
+++ b/src/Perspex.Input/MouseDevice.cs
@@ -77,16 +77,21 @@ namespace Perspex.Input
LeaveWindow(mouse, e.Root);
break;
case RawMouseEventType.LeftButtonDown:
- MouseDown(mouse, e.Timestamp, e.Root, e.Position);
+ case RawMouseEventType.RightButtonDown:
+ MouseDown(mouse, e.Timestamp, e.Root, e.Position,
+ e.Type == RawMouseEventType.LeftButtonDown ? MouseButton.Left : MouseButton.Right,
+ e.InputModifiers);
break;
case RawMouseEventType.LeftButtonUp:
- MouseUp(mouse, e.Root, e.Position);
+ case RawMouseEventType.RightButtonUp:
+ MouseUp(mouse, e.Root, e.Position,
+ e.Type == RawMouseEventType.LeftButtonUp ? MouseButton.Left : MouseButton.Right, e.InputModifiers);
break;
case RawMouseEventType.Move:
- MouseMove(mouse, e.Root, e.Position);
+ MouseMove(mouse, e.Root, e.Position, e.InputModifiers);
break;
case RawMouseEventType.Wheel:
- MouseWheel(mouse, e.Root, e.Position, ((RawMouseWheelEventArgs)e).Delta);
+ MouseWheel(mouse, e.Root, e.Position, ((RawMouseWheelEventArgs)e).Delta, e.InputModifiers);
break;
}
}
@@ -96,7 +101,7 @@ namespace Perspex.Input
ClearPointerOver(this, root);
}
- private void MouseDown(IMouseDevice device, uint timestamp, IInputElement root, Point p)
+ private void MouseDown(IMouseDevice device, uint timestamp, IInputElement root, Point p, MouseButton button, InputModifiers inputModifiers)
{
var hit = HitTest(root, p);
@@ -125,6 +130,8 @@ namespace Perspex.Input
RoutedEvent = InputElement.PointerPressedEvent,
Source = source,
ClickCount = _clickCount,
+ MouseButton = button,
+ InputModifiers = inputModifiers
};
source.RaiseEvent(e);
@@ -132,7 +139,7 @@ namespace Perspex.Input
}
}
- private void MouseMove(IMouseDevice device, IInputRoot root, Point p)
+ private void MouseMove(IMouseDevice device, IInputRoot root, Point p, InputModifiers inputModifiers)
{
IInputElement source;
@@ -152,10 +159,11 @@ namespace Perspex.Input
Device = this,
RoutedEvent = InputElement.PointerMovedEvent,
Source = source,
+ InputModifiers = inputModifiers
});
}
- private void MouseUp(IMouseDevice device, IInputRoot root, Point p)
+ private void MouseUp(IMouseDevice device, IInputRoot root, Point p, MouseButton button, InputModifiers inputModifiers)
{
var hit = HitTest(root, p);
@@ -165,17 +173,19 @@ namespace Perspex.Input
if (source != null)
{
- source.RaiseEvent(new PointerEventArgs
+ source.RaiseEvent(new PointerReleasedEventArgs
{
Device = this,
RoutedEvent = InputElement.PointerReleasedEvent,
Source = source,
+ MouseButton = button,
+ InputModifiers = inputModifiers
});
}
}
}
- private void MouseWheel(IMouseDevice device, IInputRoot root, Point p, Vector delta)
+ private void MouseWheel(IMouseDevice device, IInputRoot root, Point p, Vector delta, InputModifiers inputModifiers)
{
var hit = HitTest(root, p);
@@ -191,6 +201,7 @@ namespace Perspex.Input
RoutedEvent = InputElement.PointerWheelChangedEvent,
Source = source,
Delta = delta,
+ InputModifiers = inputModifiers
});
}
}
diff --git a/src/Perspex.Input/Perspex.Input.csproj b/src/Perspex.Input/Perspex.Input.csproj
index 366d7c4711..2bcf6f1e24 100644
--- a/src/Perspex.Input/Perspex.Input.csproj
+++ b/src/Perspex.Input/Perspex.Input.csproj
@@ -98,7 +98,6 @@
-
diff --git a/src/Perspex.Input/PointerEventArgs.cs b/src/Perspex.Input/PointerEventArgs.cs
index f745a25cd2..dc857a511e 100644
--- a/src/Perspex.Input/PointerEventArgs.cs
+++ b/src/Perspex.Input/PointerEventArgs.cs
@@ -10,9 +10,29 @@ namespace Perspex.Input
{
public IPointerDevice Device { get; set; }
+ public InputModifiers InputModifiers { get; set; }
+
public Point GetPosition(IVisual relativeTo)
{
return Device.GetPosition(relativeTo);
}
}
+
+ public enum MouseButton
+ {
+ None,
+ Left,
+ Right
+ }
+
+ public class PointerPressEventArgs : PointerEventArgs
+ {
+ public int ClickCount { get; set; }
+ public MouseButton MouseButton { get; set; }
+ }
+
+ public class PointerReleasedEventArgs : PointerEventArgs
+ {
+ public MouseButton MouseButton { get; set; }
+ }
}
diff --git a/src/Perspex.Input/PointerPressEventArgs.cs b/src/Perspex.Input/PointerPressEventArgs.cs
deleted file mode 100644
index bd77886484..0000000000
--- a/src/Perspex.Input/PointerPressEventArgs.cs
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright (c) The Perspex Project. All rights reserved.
-// Licensed under the MIT license. See licence.md file in the project root for full license information.
-
-namespace Perspex.Input
-{
- public class PointerPressEventArgs : PointerEventArgs
- {
- public int ClickCount { get; set; }
- }
-}
diff --git a/src/Perspex.Input/Raw/RawKeyEventArgs.cs b/src/Perspex.Input/Raw/RawKeyEventArgs.cs
index be04c8e540..8f54a10a68 100644
--- a/src/Perspex.Input/Raw/RawKeyEventArgs.cs
+++ b/src/Perspex.Input/Raw/RawKeyEventArgs.cs
@@ -15,7 +15,7 @@ namespace Perspex.Input.Raw
IKeyboardDevice device,
uint timestamp,
RawKeyEventType type,
- Key key, ModifierKeys modifiers)
+ Key key, InputModifiers modifiers)
: base(device, timestamp)
{
Key = key;
@@ -25,7 +25,7 @@ namespace Perspex.Input.Raw
public Key Key { get; set; }
- public ModifierKeys Modifiers { get; set; }
+ public InputModifiers Modifiers { get; set; }
public RawKeyEventType Type { get; set; }
}
diff --git a/src/Perspex.Input/Raw/RawMouseEventArgs.cs b/src/Perspex.Input/Raw/RawMouseEventArgs.cs
index 98a082e0a0..d89724a984 100644
--- a/src/Perspex.Input/Raw/RawMouseEventArgs.cs
+++ b/src/Perspex.Input/Raw/RawMouseEventArgs.cs
@@ -10,6 +10,8 @@ namespace Perspex.Input.Raw
LeaveWindow,
LeftButtonDown,
LeftButtonUp,
+ RightButtonDown,
+ RightButtonUp,
Move,
Wheel,
}
@@ -21,7 +23,7 @@ namespace Perspex.Input.Raw
uint timestamp,
IInputRoot root,
RawMouseEventType type,
- Point position, ModifierKeys modifierKeys)
+ Point position, InputModifiers inputModifiers)
: base(device, timestamp)
{
Contract.Requires(device != null);
@@ -30,7 +32,7 @@ namespace Perspex.Input.Raw
Root = root;
Position = position;
Type = type;
- ModifierKeys = modifierKeys;
+ InputModifiers = inputModifiers;
}
public IInputRoot Root { get; private set; }
@@ -39,6 +41,6 @@ namespace Perspex.Input.Raw
public RawMouseEventType Type { get; private set; }
- public ModifierKeys ModifierKeys { get; private set; }
+ public InputModifiers InputModifiers { get; private set; }
}
}
diff --git a/src/Perspex.Input/Raw/RawMouseWheelEventArgs.cs b/src/Perspex.Input/Raw/RawMouseWheelEventArgs.cs
index d1582073ac..1684766d14 100644
--- a/src/Perspex.Input/Raw/RawMouseWheelEventArgs.cs
+++ b/src/Perspex.Input/Raw/RawMouseWheelEventArgs.cs
@@ -13,8 +13,8 @@ namespace Perspex.Input.Raw
uint timestamp,
IInputRoot root,
Point position,
- Vector delta, ModifierKeys modifierKeys)
- : base(device, timestamp, root, RawMouseEventType.Wheel, position, modifierKeys)
+ Vector delta, InputModifiers inputModifiers)
+ : base(device, timestamp, root, RawMouseEventType.Wheel, position, inputModifiers)
{
Delta = delta;
}
diff --git a/src/Windows/Perspex.Win32/Input/WindowsKeyboardDevice.cs b/src/Windows/Perspex.Win32/Input/WindowsKeyboardDevice.cs
index 0f40007f5b..c26bfbd517 100644
--- a/src/Windows/Perspex.Win32/Input/WindowsKeyboardDevice.cs
+++ b/src/Windows/Perspex.Win32/Input/WindowsKeyboardDevice.cs
@@ -16,31 +16,31 @@ namespace Perspex.Win32.Input
public static new WindowsKeyboardDevice Instance => s_instance;
- public ModifierKeys Modifiers
+ public InputModifiers Modifiers
{
get
{
UpdateKeyStates();
- ModifierKeys result = 0;
+ InputModifiers result = 0;
if (IsDown(Key.LeftAlt) || IsDown(Key.RightAlt))
{
- result |= ModifierKeys.Alt;
+ result |= InputModifiers.Alt;
}
if (IsDown(Key.LeftCtrl) || IsDown(Key.RightCtrl))
{
- result |= ModifierKeys.Control;
+ result |= InputModifiers.Control;
}
if (IsDown(Key.LeftShift) || IsDown(Key.RightShift))
{
- result |= ModifierKeys.Shift;
+ result |= InputModifiers.Shift;
}
if (IsDown(Key.LWin) || IsDown(Key.RWin))
{
- result |= ModifierKeys.Windows;
+ result |= InputModifiers.Windows;
}
return result;
diff --git a/src/Windows/Perspex.Win32/Interop/UnmanagedMethods.cs b/src/Windows/Perspex.Win32/Interop/UnmanagedMethods.cs
index 8b5f0223ba..aa7681a27a 100644
--- a/src/Windows/Perspex.Win32/Interop/UnmanagedMethods.cs
+++ b/src/Windows/Perspex.Win32/Interop/UnmanagedMethods.cs
@@ -5,6 +5,8 @@ using System;
using System.Diagnostics.CodeAnalysis;
using System.Runtime.InteropServices;
using System.Text;
+using Perspex.Input;
+
// ReSharper disable InconsistentNaming
#pragma warning disable 169
@@ -191,6 +193,24 @@ namespace Perspex.Win32.Interop
SM_SYSTEMDOCKED = 0x2004,
}
+ [Flags]
+ public enum ModifierKeys
+ {
+ MK_CONTROL = 0x0008,
+
+ MK_LBUTTON = 0x0001,
+
+ MK_MBUTTON = 0x0010,
+
+ MK_RBUTTON = 0x0002,
+
+ MK_SHIFT = 0x0004,
+
+ MK_XBUTTON1 = 0x0020,
+
+ MK_XBUTTON2 = 0x0040
+ }
+
public enum WindowActivate
{
WA_INACTIVE,
diff --git a/src/Windows/Perspex.Win32/WindowImpl.cs b/src/Windows/Perspex.Win32/WindowImpl.cs
index 9330b90517..88fdb1e18e 100644
--- a/src/Windows/Perspex.Win32/WindowImpl.cs
+++ b/src/Windows/Perspex.Win32/WindowImpl.cs
@@ -307,21 +307,27 @@ namespace Perspex.Win32
break;
case UnmanagedMethods.WindowsMessage.WM_LBUTTONDOWN:
+ case UnmanagedMethods.WindowsMessage.WM_RBUTTONDOWN:
e = new RawMouseEventArgs(
WindowsMouseDevice.Instance,
timestamp,
_owner,
- RawMouseEventType.LeftButtonDown,
- new Point((uint)lParam & 0xffff, (uint)lParam >> 16), WindowsKeyboardDevice.Instance.Modifiers);
+ msg == (int) UnmanagedMethods.WindowsMessage.WM_LBUTTONDOWN
+ ? RawMouseEventType.LeftButtonDown
+ : RawMouseEventType.RightButtonDown,
+ new Point((uint) lParam & 0xffff, (uint) lParam >> 16), GetMouseModifiers(wParam));
break;
case UnmanagedMethods.WindowsMessage.WM_LBUTTONUP:
+ case UnmanagedMethods.WindowsMessage.WM_RBUTTONUP:
e = new RawMouseEventArgs(
WindowsMouseDevice.Instance,
timestamp,
_owner,
- RawMouseEventType.LeftButtonUp,
- new Point((uint)lParam & 0xffff, (uint)lParam >> 16), WindowsKeyboardDevice.Instance.Modifiers);
+ msg == (int) UnmanagedMethods.WindowsMessage.WM_LBUTTONUP
+ ? RawMouseEventType.LeftButtonUp
+ : RawMouseEventType.RightButtonUp,
+ new Point((uint) lParam & 0xffff, (uint) lParam >> 16), GetMouseModifiers(wParam));
break;
case UnmanagedMethods.WindowsMessage.WM_MOUSEMOVE:
@@ -343,7 +349,7 @@ namespace Perspex.Win32
timestamp,
_owner,
RawMouseEventType.Move,
- new Point((uint)lParam & 0xffff, (uint)lParam >> 16), WindowsKeyboardDevice.Instance.Modifiers);
+ new Point((uint)lParam & 0xffff, (uint)lParam >> 16), GetMouseModifiers(wParam));
break;
case UnmanagedMethods.WindowsMessage.WM_MOUSEWHEEL:
@@ -352,7 +358,7 @@ namespace Perspex.Win32
timestamp,
_owner,
ScreenToClient((uint)lParam & 0xffff, (uint)lParam >> 16),
- new Vector(0, ((int)wParam >> 16) / wheelDelta), WindowsKeyboardDevice.Instance.Modifiers);
+ new Vector(0, ((int)wParam >> 16) / wheelDelta), GetMouseModifiers(wParam));
break;
case UnmanagedMethods.WindowsMessage.WM_MOUSELEAVE:
@@ -400,6 +406,17 @@ namespace Perspex.Win32
return UnmanagedMethods.DefWindowProc(hWnd, msg, wParam, lParam);
}
+ static InputModifiers GetMouseModifiers(IntPtr wParam)
+ {
+ var keys = (UnmanagedMethods.ModifierKeys)wParam.ToInt32();
+ var modifiers = WindowsKeyboardDevice.Instance.Modifiers;
+ if (keys.HasFlag(UnmanagedMethods.ModifierKeys.MK_LBUTTON))
+ modifiers |= InputModifiers.LeftMouseButton;
+ if(keys.HasFlag(UnmanagedMethods.ModifierKeys.MK_RBUTTON))
+ modifiers |= InputModifiers.RightMouseButton;
+ return modifiers;
+ }
+
private void CreateWindow()
{
// Ensure that the delegate doesn't get garbage collected by storing it as a field.
diff --git a/tests/Perspex.Controls.UnitTests/TopLevelTests.cs b/tests/Perspex.Controls.UnitTests/TopLevelTests.cs
index 899d5da151..7c8f6a52b4 100644
--- a/tests/Perspex.Controls.UnitTests/TopLevelTests.cs
+++ b/tests/Perspex.Controls.UnitTests/TopLevelTests.cs
@@ -296,7 +296,7 @@ namespace Perspex.Controls.UnitTests
new Mock().Object,
0,
RawKeyEventType.KeyDown,
- Key.A, ModifierKeys.None);
+ Key.A, InputModifiers.None);
impl.Object.Input(input);
var inputManagerMock = Mock.Get(InputManager.Instance);