From bf96d2a83872b23e2e80a7aa0150375c8221d417 Mon Sep 17 00:00:00 2001 From: Nelson Carrillo Date: Wed, 25 Jul 2018 19:16:14 -0400 Subject: [PATCH] Support CharacterEvent. Other misc cleanups.: --- .../Bindings/EventNotifier.cs | 4 +- src/Avalonia.Windowing/Bindings/Events.cs | 6 ++ src/Avalonia.Windowing/Bindings/EventsLoop.cs | 4 +- src/Avalonia.Windowing/KeyTransform.cs | 60 ++++++++++++++++++- src/Avalonia.Windowing/WIndowingPlatform.cs | 10 ++++ src/Avalonia.Windowing/WindowImpl.cs | 16 +++++ 6 files changed, 95 insertions(+), 5 deletions(-) diff --git a/src/Avalonia.Windowing/Bindings/EventNotifier.cs b/src/Avalonia.Windowing/Bindings/EventNotifier.cs index 719f120420..66b0a458db 100644 --- a/src/Avalonia.Windowing/Bindings/EventNotifier.cs +++ b/src/Avalonia.Windowing/Bindings/EventNotifier.cs @@ -7,8 +7,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); - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + public delegate void CharacterEventCallback(IntPtr windowId, CharacterEvent characterEvent); public delegate void AwakenedEventCallback(); [StructLayout(LayoutKind.Sequential)] @@ -18,5 +17,6 @@ namespace Avalonia.Windowing.Bindings public AwakenedEventCallback OnAwakened; public ResizeEventCallback OnResized; public KeyboardEventCallback OnKeyboardEvent; + public CharacterEventCallback OnCharacterEvent; } } diff --git a/src/Avalonia.Windowing/Bindings/Events.cs b/src/Avalonia.Windowing/Bindings/Events.cs index 0201ff3aab..a87d026e6d 100644 --- a/src/Avalonia.Windowing/Bindings/Events.cs +++ b/src/Avalonia.Windowing/Bindings/Events.cs @@ -40,4 +40,10 @@ namespace Avalonia.Windowing.Bindings { public LogicalSize Size { get; set; } } + + [StructLayout(LayoutKind.Sequential)] + public struct CharacterEvent + { + public char Character { get; set; } + } } diff --git a/src/Avalonia.Windowing/Bindings/EventsLoop.cs b/src/Avalonia.Windowing/Bindings/EventsLoop.cs index c217aa937f..9d4cc107a3 100644 --- a/src/Avalonia.Windowing/Bindings/EventsLoop.cs +++ b/src/Avalonia.Windowing/Bindings/EventsLoop.cs @@ -31,11 +31,10 @@ namespace Avalonia.Windowing.Bindings private readonly EventsLoopProxy _eventsLoopProxy; private readonly EventNotifier _notifier; + public event CharacterEventCallback OnCharacterEvent; public event KeyboardEventCallback OnKeyboardEvent; public event MouseEventCallback OnMouseEvent; - public event AwakenedEventCallback OnAwakened; - public event ResizeEventCallback OnResized; public EventsLoop() @@ -46,6 +45,7 @@ namespace Avalonia.Windowing.Bindings { OnMouseEvent = (IntPtr windowId, MouseEvent mouseEvent) => OnMouseEvent?.Invoke(windowId, mouseEvent), OnKeyboardEvent = (IntPtr windowId, KeyboardEvent keyboardEvent) => OnKeyboardEvent?.Invoke(windowId, keyboardEvent), + OnCharacterEvent = (windowId, characterEvent) => OnCharacterEvent?.Invoke(windowId, characterEvent), OnResized = (IntPtr windowId, ResizeEvent resizeEvent) => OnResized?.Invoke(windowId, resizeEvent), OnAwakened = () => OnAwakened?.Invoke() }; diff --git a/src/Avalonia.Windowing/KeyTransform.cs b/src/Avalonia.Windowing/KeyTransform.cs index 81fb4cdedf..75552fd1d4 100644 --- a/src/Avalonia.Windowing/KeyTransform.cs +++ b/src/Avalonia.Windowing/KeyTransform.cs @@ -197,8 +197,66 @@ namespace Avalonia.Windowing { [VirtualKeyCode.Key0] = Key.D0, [VirtualKeyCode.Key1] = Key.D1, + [VirtualKeyCode.Key2] = Key.D2, + [VirtualKeyCode.Key3] = Key.D3, + [VirtualKeyCode.Key4] = Key.D4, + [VirtualKeyCode.Key5] = Key.D5, + [VirtualKeyCode.Key6] = Key.D6, + [VirtualKeyCode.Key7] = Key.D7, + [VirtualKeyCode.Key8] = Key.D8, + [VirtualKeyCode.Key9] = Key.D9, - [VirtualKeyCode.A] = Key.A + [VirtualKeyCode.Back] = Key.Back, + [VirtualKeyCode.Escape] = Key.Escape, + [VirtualKeyCode.Return] = Key.Return, + + [VirtualKeyCode.Down] = Key.Down, + [VirtualKeyCode.Up] = Key.Up, + [VirtualKeyCode.Right] = Key.Right, + [VirtualKeyCode.Left] = Key.Left, + + [VirtualKeyCode.Capital] = Key.CapsLock, + [VirtualKeyCode.LAlt]= Key.LeftAlt, + [VirtualKeyCode.RAlt] = Key.RightAlt, + [VirtualKeyCode.LControl] = Key.LeftCtrl, + [VirtualKeyCode.RControl] = Key.RightCtrl, + [VirtualKeyCode.LShift] = Key.LeftShift, + [VirtualKeyCode.RShift] = Key.RightShift, + [VirtualKeyCode.LWin] = Key.LWin, + [VirtualKeyCode.RWin] = Key.RWin, + [VirtualKeyCode.Numlock] = Key.NumLock, + + [VirtualKeyCode.Add] = Key.OemPlus, + [VirtualKeyCode.Subtract] = Key.Subtract, + [VirtualKeyCode.Backslash] = Key.OemBackslash, + [VirtualKeyCode.Tab] = Key.Tab, + + [VirtualKeyCode.A] = Key.A, + [VirtualKeyCode.B] = Key.B, + [VirtualKeyCode.C] = Key.C, + [VirtualKeyCode.D] = Key.D, + [VirtualKeyCode.E] = Key.E, + [VirtualKeyCode.F] = Key.F, + [VirtualKeyCode.G] = Key.G, + [VirtualKeyCode.H] = Key.H, + [VirtualKeyCode.I] = Key.I, + [VirtualKeyCode.J] = Key.J, + [VirtualKeyCode.K] = Key.K, + [VirtualKeyCode.L] = Key.L, + [VirtualKeyCode.M] = Key.M, + [VirtualKeyCode.N] = Key.N, + [VirtualKeyCode.O] = Key.O, + [VirtualKeyCode.P] = Key.P, + [VirtualKeyCode.Q] = Key.Q, + [VirtualKeyCode.R] = Key.R, + [VirtualKeyCode.S] = Key.S, + [VirtualKeyCode.T] = Key.T, + [VirtualKeyCode.U] = Key.U, + [VirtualKeyCode.V] = Key.V, + [VirtualKeyCode.W] = Key.W, + [VirtualKeyCode.X] = Key.X, + [VirtualKeyCode.X] = Key.Y, + [VirtualKeyCode.X] = Key.Z, }; public static Key? TransformKeyCode(VirtualKeyCode code) diff --git a/src/Avalonia.Windowing/WIndowingPlatform.cs b/src/Avalonia.Windowing/WIndowingPlatform.cs index 85b1726708..559008fc39 100644 --- a/src/Avalonia.Windowing/WIndowingPlatform.cs +++ b/src/Avalonia.Windowing/WIndowingPlatform.cs @@ -39,6 +39,7 @@ namespace Avalonia.Windowing _eventsLoop = new EventsLoop(); _eventsLoop.OnMouseEvent += _eventsLoop_MouseEvent; _eventsLoop.OnKeyboardEvent += _eventsLoop_OnKeyboardEvent; + _eventsLoop.OnCharacterEvent += _eventsLoop_OnCharacterEvent; _eventsLoop.OnAwakened += _eventsLoop_Awakened; _eventsLoop.OnResized += _eventsLoop_Resized; _windows = new Dictionary(); @@ -62,6 +63,15 @@ namespace Avalonia.Windowing } } + void _eventsLoop_OnCharacterEvent(IntPtr windowId, CharacterEvent characterEvent) + { + if (_windows.ContainsKey(windowId)) + { + _windows[windowId].OnCharacterEvent(characterEvent); + } + } + + void _eventsLoop_OnKeyboardEvent(IntPtr windowId, KeyboardEvent keyboardEvent) { if(_windows.ContainsKey(windowId)) diff --git a/src/Avalonia.Windowing/WindowImpl.cs b/src/Avalonia.Windowing/WindowImpl.cs index 966276873c..7aba966e06 100644 --- a/src/Avalonia.Windowing/WindowImpl.cs +++ b/src/Avalonia.Windowing/WindowImpl.cs @@ -195,6 +195,22 @@ namespace Avalonia.Windowing { } + public void OnCharacterEvent(CharacterEvent evt) + { + Dispatcher.UIThread.RunJobs(DispatcherPriority.Input + 1); + var timeStamp = (uint)Environment.TickCount; + + Input + ( + new RawTextInputEventArgs + ( + KeyboardDevice, + timeStamp, + evt.Character.ToString() + ) + ); + } + public void OnKeyboardEvent (KeyboardEvent evt) { Dispatcher.UIThread.RunJobs(DispatcherPriority.Input + 1);