From 335a429302d6521cd0e07b26c4cb239e50a89d94 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Tue, 24 Jul 2018 22:58:24 +0100 Subject: [PATCH] implement keyboard input. --- src/Avalonia.Windowing/Bindings/EventNotifier.cs | 2 ++ src/Avalonia.Windowing/Bindings/Events.cs | 11 +++++++++++ src/Avalonia.Windowing/Bindings/EventsLoop.cs | 2 ++ src/Avalonia.Windowing/WIndowingPlatform.cs | 9 +++++++++ src/Avalonia.Windowing/WindowImpl.cs | 5 +++++ 5 files changed, 29 insertions(+) diff --git a/src/Avalonia.Windowing/Bindings/EventNotifier.cs b/src/Avalonia.Windowing/Bindings/EventNotifier.cs index aabaa843e5..5e58f6cdfc 100644 --- a/src/Avalonia.Windowing/Bindings/EventNotifier.cs +++ b/src/Avalonia.Windowing/Bindings/EventNotifier.cs @@ -5,6 +5,7 @@ namespace Avalonia.Windowing.Bindings { public delegate void MouseEventCallback(IntPtr windowId, MouseEvent mouseEvent); public delegate void ResizeEventCallback(IntPtr windowId, ResizeEvent resizeEvent); + public delegate void KeyboardEventCallback(IntPtr windowId, KeyboardEvent keyboardEvent); public delegate void AwakenedEventCallback(); [StructLayout(LayoutKind.Sequential)] @@ -13,5 +14,6 @@ namespace Avalonia.Windowing.Bindings public MouseEventCallback OnMouseEvent; public AwakenedEventCallback OnAwakened; public ResizeEventCallback OnResized; + public KeyboardEventCallback OnKeyboardEvent; } } diff --git a/src/Avalonia.Windowing/Bindings/Events.cs b/src/Avalonia.Windowing/Bindings/Events.cs index 29ba28c7ae..486e9f4e71 100644 --- a/src/Avalonia.Windowing/Bindings/Events.cs +++ b/src/Avalonia.Windowing/Bindings/Events.cs @@ -24,6 +24,17 @@ namespace Avalonia.Windowing.Bindings public LogicalPosition Position { get; set; } } + [StructLayout(LayoutKind.Sequential)] + public struct KeyboardEvent + { + public bool Pressed { get; set; } + public bool Shift { get; set; } + public bool Control { get; set; } + public bool Alt { get; set; } + public bool Logo { get; set; } + UInt32 VirtualKeyCode { get; set; } + } + [StructLayout(LayoutKind.Sequential)] public struct ResizeEvent { diff --git a/src/Avalonia.Windowing/Bindings/EventsLoop.cs b/src/Avalonia.Windowing/Bindings/EventsLoop.cs index cc33a752f0..925f4771a7 100644 --- a/src/Avalonia.Windowing/Bindings/EventsLoop.cs +++ b/src/Avalonia.Windowing/Bindings/EventsLoop.cs @@ -31,6 +31,7 @@ namespace Avalonia.Windowing.Bindings private readonly EventsLoopProxy _eventsLoopProxy; private readonly EventNotifier _notifier; + public event KeyboardEventCallback OnKeyboardEvent; public event MouseEventCallback OnMouseEvent; public event AwakenedEventCallback OnAwakened; public event ResizeEventCallback OnResized; @@ -42,6 +43,7 @@ namespace Avalonia.Windowing.Bindings _notifier = new EventNotifier() { OnMouseEvent = (IntPtr windowId, MouseEvent mouseEvent) => OnMouseEvent?.Invoke(windowId, mouseEvent), + OnKeyboardEvent = (IntPtr windowId, KeyboardEvent keyboardEvent) => OnKeyboardEvent?.Invoke(windowId, keyboardEvent), OnResized = (IntPtr windowId, ResizeEvent resizeEvent) => OnResized?.Invoke(windowId, resizeEvent), OnAwakened = () => OnAwakened?.Invoke() }; diff --git a/src/Avalonia.Windowing/WIndowingPlatform.cs b/src/Avalonia.Windowing/WIndowingPlatform.cs index 578cbc9c54..bdede4008e 100644 --- a/src/Avalonia.Windowing/WIndowingPlatform.cs +++ b/src/Avalonia.Windowing/WIndowingPlatform.cs @@ -37,6 +37,7 @@ namespace Avalonia.Windowing { _eventsLoop = new EventsLoop(); _eventsLoop.OnMouseEvent += _eventsLoop_MouseEvent; + _eventsLoop.OnKeyboardEvent += _eventsLoop_OnKeyboardEvent; _eventsLoop.OnAwakened += _eventsLoop_Awakened; _eventsLoop.OnResized += _eventsLoop_Resized; _windows = new Dictionary(); @@ -60,6 +61,14 @@ namespace Avalonia.Windowing } } + void _eventsLoop_OnKeyboardEvent(IntPtr windowId, KeyboardEvent keyboardEvent) + { + if(_windows.ContainsKey(windowId)) + { + _windows[windowId].OnKeyboardEvent(keyboardEvent); + } + } + private void _eventsLoop_Awakened() { Signaled?.Invoke(DispatcherPriority.Input); diff --git a/src/Avalonia.Windowing/WindowImpl.cs b/src/Avalonia.Windowing/WindowImpl.cs index da1e5ad0c5..d216c552d4 100644 --- a/src/Avalonia.Windowing/WindowImpl.cs +++ b/src/Avalonia.Windowing/WindowImpl.cs @@ -168,6 +168,11 @@ namespace Avalonia.Windowing { } + public void OnKeyboardEvent (KeyboardEvent evt) + { + + } + public void OnMouseEvent(MouseEvent evt) { Dispatcher.UIThread.RunJobs(DispatcherPriority.Input);