From 9191234f54c99f842166582c4e72adaa3846b5fc Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Tue, 9 Feb 2016 01:29:11 +0100 Subject: [PATCH] Fix keyboard handling. Allows Alt+F4 to work. --- src/Perspex.Input/KeyboardDevice.cs | 11 ++++- src/Perspex.Input/MouseDevice.cs | 50 ++++++++++++++-------- src/Perspex.Input/Raw/RawInputEventArgs.cs | 2 +- src/Windows/Perspex.Win32/WindowImpl.cs | 8 ++-- 4 files changed, 46 insertions(+), 25 deletions(-) diff --git a/src/Perspex.Input/KeyboardDevice.cs b/src/Perspex.Input/KeyboardDevice.cs index 421a09eaba..87d7b9c02c 100644 --- a/src/Perspex.Input/KeyboardDevice.cs +++ b/src/Perspex.Input/KeyboardDevice.cs @@ -83,6 +83,7 @@ namespace Perspex.Input if (element != null) { var keyInput = e as RawKeyEventArgs; + if (keyInput != null) { switch (keyInput.Type) @@ -117,19 +118,25 @@ namespace Perspex.Input } element.RaiseEvent(ev); + e.Handled = ev.Handled; break; } } + var text = e as RawTextInputEventArgs; + if (text != null) { - element.RaiseEvent(new TextInputEventArgs() + var ev = new TextInputEventArgs() { Device = this, Text = text.Text, Source = element, RoutedEvent = InputElement.TextInputEvent - }); + }; + + element.RaiseEvent(ev); + e.Handled = ev.Handled; } } } diff --git a/src/Perspex.Input/MouseDevice.cs b/src/Perspex.Input/MouseDevice.cs index df30b06644..47a3f105f2 100644 --- a/src/Perspex.Input/MouseDevice.cs +++ b/src/Perspex.Input/MouseDevice.cs @@ -115,7 +115,7 @@ namespace Perspex.Input case RawMouseEventType.LeftButtonDown: case RawMouseEventType.RightButtonDown: case RawMouseEventType.MiddleButtonDown: - MouseDown(mouse, e.Timestamp, e.Root, e.Position, + e.Handled = MouseDown(mouse, e.Timestamp, e.Root, e.Position, e.Type == RawMouseEventType.LeftButtonDown ? MouseButton.Left : e.Type == RawMouseEventType.RightButtonDown ? MouseButton.Right : MouseButton.Middle, @@ -124,17 +124,17 @@ namespace Perspex.Input case RawMouseEventType.LeftButtonUp: case RawMouseEventType.RightButtonUp: case RawMouseEventType.MiddleButtonUp: - MouseUp(mouse, e.Root, e.Position, + e.Handled = MouseUp(mouse, e.Root, e.Position, e.Type == RawMouseEventType.LeftButtonUp ? MouseButton.Left : e.Type == RawMouseEventType.RightButtonUp ? MouseButton.Right : MouseButton.Middle, e.InputModifiers); break; case RawMouseEventType.Move: - MouseMove(mouse, e.Root, e.Position, e.InputModifiers); + e.Handled = MouseMove(mouse, e.Root, e.Position, e.InputModifiers); break; case RawMouseEventType.Wheel: - MouseWheel(mouse, e.Root, e.Position, ((RawMouseWheelEventArgs)e).Delta, e.InputModifiers); + e.Handled = MouseWheel(mouse, e.Root, e.Position, ((RawMouseWheelEventArgs)e).Delta, e.InputModifiers); break; } } @@ -144,7 +144,7 @@ namespace Perspex.Input ClearPointerOver(this, root); } - private void MouseDown(IMouseDevice device, uint timestamp, IInputElement root, Point p, MouseButton button, InputModifiers inputModifiers) + private bool MouseDown(IMouseDevice device, uint timestamp, IInputElement root, Point p, MouseButton button, InputModifiers inputModifiers) { var hit = HitTest(root, p); @@ -178,11 +178,14 @@ namespace Perspex.Input }; source.RaiseEvent(e); + return e.Handled; } } + + return false; } - private void MouseMove(IMouseDevice device, IInputRoot root, Point p, InputModifiers inputModifiers) + private bool MouseMove(IMouseDevice device, IInputRoot root, Point p, InputModifiers inputModifiers) { IInputElement source; @@ -197,51 +200,62 @@ namespace Perspex.Input source = Captured; } - source.RaiseEvent(new PointerEventArgs + var e = new PointerEventArgs { Device = this, RoutedEvent = InputElement.PointerMovedEvent, Source = source, InputModifiers = inputModifiers - }); + }; + + source.RaiseEvent(e); + return e.Handled; } - private void MouseUp(IMouseDevice device, IInputRoot root, Point p, MouseButton button, InputModifiers inputModifiers) + private bool MouseUp(IMouseDevice device, IInputRoot root, Point p, MouseButton button, InputModifiers inputModifiers) { var hit = HitTest(root, p); if (hit != null) { - IInteractive source = GetSource(hit); - - source?.RaiseEvent(new PointerReleasedEventArgs + var source = GetSource(hit); + var e = new PointerReleasedEventArgs { Device = this, RoutedEvent = InputElement.PointerReleasedEvent, Source = source, MouseButton = button, InputModifiers = inputModifiers - }); + }; + + source?.RaiseEvent(e); + return e.Handled; } + + return false; } - private void MouseWheel(IMouseDevice device, IInputRoot root, Point p, Vector delta, InputModifiers inputModifiers) + private bool MouseWheel(IMouseDevice device, IInputRoot root, Point p, Vector delta, InputModifiers inputModifiers) { var hit = HitTest(root, p); if (hit != null) { - IInteractive source = GetSource(hit); - - source?.RaiseEvent(new PointerWheelEventArgs + var source = GetSource(hit); + var e = new PointerWheelEventArgs { Device = this, RoutedEvent = InputElement.PointerWheelChangedEvent, Source = source, Delta = delta, InputModifiers = inputModifiers - }); + }; + + source?.RaiseEvent(e); + return e.Handled; } + + return false; } private IInteractive GetSource(IVisual hit) diff --git a/src/Perspex.Input/Raw/RawInputEventArgs.cs b/src/Perspex.Input/Raw/RawInputEventArgs.cs index 7708165a14..4918710c46 100644 --- a/src/Perspex.Input/Raw/RawInputEventArgs.cs +++ b/src/Perspex.Input/Raw/RawInputEventArgs.cs @@ -16,7 +16,7 @@ namespace Perspex.Input.Raw } public IInputDevice Device { get; private set; } - + public bool Handled { get; set; } public uint Timestamp { get; private set; } } } diff --git a/src/Windows/Perspex.Win32/WindowImpl.cs b/src/Windows/Perspex.Win32/WindowImpl.cs index 617f07c30e..35be38c06d 100644 --- a/src/Windows/Perspex.Win32/WindowImpl.cs +++ b/src/Windows/Perspex.Win32/WindowImpl.cs @@ -553,10 +553,10 @@ namespace Perspex.Win32 { Input(e); - if (msg >= 161 && msg <= 173) - return UnmanagedMethods.DefWindowProc(hWnd, msg, wParam, lParam); - - return IntPtr.Zero; + if (e.Handled) + { + return IntPtr.Zero; + } } return UnmanagedMethods.DefWindowProc(hWnd, msg, wParam, lParam);