Browse Source

Fix keyboard handling.

Allows Alt+F4 to work.
pull/417/head
Steven Kirk 11 years ago
parent
commit
9191234f54
  1. 11
      src/Perspex.Input/KeyboardDevice.cs
  2. 50
      src/Perspex.Input/MouseDevice.cs
  3. 2
      src/Perspex.Input/Raw/RawInputEventArgs.cs
  4. 8
      src/Windows/Perspex.Win32/WindowImpl.cs

11
src/Perspex.Input/KeyboardDevice.cs

@ -83,6 +83,7 @@ namespace Perspex.Input
if (element != null) if (element != null)
{ {
var keyInput = e as RawKeyEventArgs; var keyInput = e as RawKeyEventArgs;
if (keyInput != null) if (keyInput != null)
{ {
switch (keyInput.Type) switch (keyInput.Type)
@ -117,19 +118,25 @@ namespace Perspex.Input
} }
element.RaiseEvent(ev); element.RaiseEvent(ev);
e.Handled = ev.Handled;
break; break;
} }
} }
var text = e as RawTextInputEventArgs; var text = e as RawTextInputEventArgs;
if (text != null) if (text != null)
{ {
element.RaiseEvent(new TextInputEventArgs() var ev = new TextInputEventArgs()
{ {
Device = this, Device = this,
Text = text.Text, Text = text.Text,
Source = element, Source = element,
RoutedEvent = InputElement.TextInputEvent RoutedEvent = InputElement.TextInputEvent
}); };
element.RaiseEvent(ev);
e.Handled = ev.Handled;
} }
} }
} }

50
src/Perspex.Input/MouseDevice.cs

@ -115,7 +115,7 @@ namespace Perspex.Input
case RawMouseEventType.LeftButtonDown: case RawMouseEventType.LeftButtonDown:
case RawMouseEventType.RightButtonDown: case RawMouseEventType.RightButtonDown:
case RawMouseEventType.MiddleButtonDown: 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 e.Type == RawMouseEventType.LeftButtonDown
? MouseButton.Left ? MouseButton.Left
: e.Type == RawMouseEventType.RightButtonDown ? MouseButton.Right : MouseButton.Middle, : e.Type == RawMouseEventType.RightButtonDown ? MouseButton.Right : MouseButton.Middle,
@ -124,17 +124,17 @@ namespace Perspex.Input
case RawMouseEventType.LeftButtonUp: case RawMouseEventType.LeftButtonUp:
case RawMouseEventType.RightButtonUp: case RawMouseEventType.RightButtonUp:
case RawMouseEventType.MiddleButtonUp: case RawMouseEventType.MiddleButtonUp:
MouseUp(mouse, e.Root, e.Position, e.Handled = MouseUp(mouse, e.Root, e.Position,
e.Type == RawMouseEventType.LeftButtonUp e.Type == RawMouseEventType.LeftButtonUp
? MouseButton.Left ? MouseButton.Left
: e.Type == RawMouseEventType.RightButtonUp ? MouseButton.Right : MouseButton.Middle, : e.Type == RawMouseEventType.RightButtonUp ? MouseButton.Right : MouseButton.Middle,
e.InputModifiers); e.InputModifiers);
break; break;
case RawMouseEventType.Move: case RawMouseEventType.Move:
MouseMove(mouse, e.Root, e.Position, e.InputModifiers); e.Handled = MouseMove(mouse, e.Root, e.Position, e.InputModifiers);
break; break;
case RawMouseEventType.Wheel: 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; break;
} }
} }
@ -144,7 +144,7 @@ namespace Perspex.Input
ClearPointerOver(this, root); 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); var hit = HitTest(root, p);
@ -178,11 +178,14 @@ namespace Perspex.Input
}; };
source.RaiseEvent(e); 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; IInputElement source;
@ -197,51 +200,62 @@ namespace Perspex.Input
source = Captured; source = Captured;
} }
source.RaiseEvent(new PointerEventArgs var e = new PointerEventArgs
{ {
Device = this, Device = this,
RoutedEvent = InputElement.PointerMovedEvent, RoutedEvent = InputElement.PointerMovedEvent,
Source = source, Source = source,
InputModifiers = inputModifiers 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); var hit = HitTest(root, p);
if (hit != null) if (hit != null)
{ {
IInteractive source = GetSource(hit); var source = GetSource(hit);
var e = new PointerReleasedEventArgs
source?.RaiseEvent(new PointerReleasedEventArgs
{ {
Device = this, Device = this,
RoutedEvent = InputElement.PointerReleasedEvent, RoutedEvent = InputElement.PointerReleasedEvent,
Source = source, Source = source,
MouseButton = button, MouseButton = button,
InputModifiers = inputModifiers 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); var hit = HitTest(root, p);
if (hit != null) if (hit != null)
{ {
IInteractive source = GetSource(hit); var source = GetSource(hit);
var e = new PointerWheelEventArgs
source?.RaiseEvent(new PointerWheelEventArgs
{ {
Device = this, Device = this,
RoutedEvent = InputElement.PointerWheelChangedEvent, RoutedEvent = InputElement.PointerWheelChangedEvent,
Source = source, Source = source,
Delta = delta, Delta = delta,
InputModifiers = inputModifiers InputModifiers = inputModifiers
}); };
source?.RaiseEvent(e);
return e.Handled;
} }
return false;
} }
private IInteractive GetSource(IVisual hit) private IInteractive GetSource(IVisual hit)

2
src/Perspex.Input/Raw/RawInputEventArgs.cs

@ -16,7 +16,7 @@ namespace Perspex.Input.Raw
} }
public IInputDevice Device { get; private set; } public IInputDevice Device { get; private set; }
public bool Handled { get; set; }
public uint Timestamp { get; private set; } public uint Timestamp { get; private set; }
} }
} }

8
src/Windows/Perspex.Win32/WindowImpl.cs

@ -553,10 +553,10 @@ namespace Perspex.Win32
{ {
Input(e); Input(e);
if (msg >= 161 && msg <= 173) if (e.Handled)
return UnmanagedMethods.DefWindowProc(hWnd, msg, wParam, lParam); {
return IntPtr.Zero;
return IntPtr.Zero; }
} }
return UnmanagedMethods.DefWindowProc(hWnd, msg, wParam, lParam); return UnmanagedMethods.DefWindowProc(hWnd, msg, wParam, lParam);

Loading…
Cancel
Save