Browse Source

Support CharacterEvent. Other misc cleanups.:

repro-window-close
Nelson Carrillo 8 years ago
parent
commit
bf96d2a838
  1. 4
      src/Avalonia.Windowing/Bindings/EventNotifier.cs
  2. 6
      src/Avalonia.Windowing/Bindings/Events.cs
  3. 4
      src/Avalonia.Windowing/Bindings/EventsLoop.cs
  4. 60
      src/Avalonia.Windowing/KeyTransform.cs
  5. 10
      src/Avalonia.Windowing/WIndowingPlatform.cs
  6. 16
      src/Avalonia.Windowing/WindowImpl.cs

4
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 MouseEventCallback(IntPtr windowId, MouseEvent mouseEvent);
public delegate void ResizeEventCallback(IntPtr windowId, ResizeEvent resizeEvent); public delegate void ResizeEventCallback(IntPtr windowId, ResizeEvent resizeEvent);
public delegate void KeyboardEventCallback(IntPtr windowId, KeyboardEvent keyboardEvent); public delegate void KeyboardEventCallback(IntPtr windowId, KeyboardEvent keyboardEvent);
public delegate void CharacterEventCallback(IntPtr windowId, CharacterEvent characterEvent);
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void AwakenedEventCallback(); public delegate void AwakenedEventCallback();
[StructLayout(LayoutKind.Sequential)] [StructLayout(LayoutKind.Sequential)]
@ -18,5 +17,6 @@ namespace Avalonia.Windowing.Bindings
public AwakenedEventCallback OnAwakened; public AwakenedEventCallback OnAwakened;
public ResizeEventCallback OnResized; public ResizeEventCallback OnResized;
public KeyboardEventCallback OnKeyboardEvent; public KeyboardEventCallback OnKeyboardEvent;
public CharacterEventCallback OnCharacterEvent;
} }
} }

6
src/Avalonia.Windowing/Bindings/Events.cs

@ -40,4 +40,10 @@ namespace Avalonia.Windowing.Bindings
{ {
public LogicalSize Size { get; set; } public LogicalSize Size { get; set; }
} }
[StructLayout(LayoutKind.Sequential)]
public struct CharacterEvent
{
public char Character { get; set; }
}
} }

4
src/Avalonia.Windowing/Bindings/EventsLoop.cs

@ -31,11 +31,10 @@ namespace Avalonia.Windowing.Bindings
private readonly EventsLoopProxy _eventsLoopProxy; private readonly EventsLoopProxy _eventsLoopProxy;
private readonly EventNotifier _notifier; private readonly EventNotifier _notifier;
public event CharacterEventCallback OnCharacterEvent;
public event KeyboardEventCallback OnKeyboardEvent; public event KeyboardEventCallback OnKeyboardEvent;
public event MouseEventCallback OnMouseEvent; public event MouseEventCallback OnMouseEvent;
public event AwakenedEventCallback OnAwakened; public event AwakenedEventCallback OnAwakened;
public event ResizeEventCallback OnResized; public event ResizeEventCallback OnResized;
public EventsLoop() public EventsLoop()
@ -46,6 +45,7 @@ namespace Avalonia.Windowing.Bindings
{ {
OnMouseEvent = (IntPtr windowId, MouseEvent mouseEvent) => OnMouseEvent?.Invoke(windowId, mouseEvent), OnMouseEvent = (IntPtr windowId, MouseEvent mouseEvent) => OnMouseEvent?.Invoke(windowId, mouseEvent),
OnKeyboardEvent = (IntPtr windowId, KeyboardEvent keyboardEvent) => OnKeyboardEvent?.Invoke(windowId, keyboardEvent), 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), OnResized = (IntPtr windowId, ResizeEvent resizeEvent) => OnResized?.Invoke(windowId, resizeEvent),
OnAwakened = () => OnAwakened?.Invoke() OnAwakened = () => OnAwakened?.Invoke()
}; };

60
src/Avalonia.Windowing/KeyTransform.cs

@ -197,8 +197,66 @@ namespace Avalonia.Windowing
{ {
[VirtualKeyCode.Key0] = Key.D0, [VirtualKeyCode.Key0] = Key.D0,
[VirtualKeyCode.Key1] = Key.D1, [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) public static Key? TransformKeyCode(VirtualKeyCode code)

10
src/Avalonia.Windowing/WIndowingPlatform.cs

@ -39,6 +39,7 @@ namespace Avalonia.Windowing
_eventsLoop = new EventsLoop(); _eventsLoop = new EventsLoop();
_eventsLoop.OnMouseEvent += _eventsLoop_MouseEvent; _eventsLoop.OnMouseEvent += _eventsLoop_MouseEvent;
_eventsLoop.OnKeyboardEvent += _eventsLoop_OnKeyboardEvent; _eventsLoop.OnKeyboardEvent += _eventsLoop_OnKeyboardEvent;
_eventsLoop.OnCharacterEvent += _eventsLoop_OnCharacterEvent;
_eventsLoop.OnAwakened += _eventsLoop_Awakened; _eventsLoop.OnAwakened += _eventsLoop_Awakened;
_eventsLoop.OnResized += _eventsLoop_Resized; _eventsLoop.OnResized += _eventsLoop_Resized;
_windows = new Dictionary<IntPtr, WindowImpl>(); _windows = new Dictionary<IntPtr, WindowImpl>();
@ -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) void _eventsLoop_OnKeyboardEvent(IntPtr windowId, KeyboardEvent keyboardEvent)
{ {
if(_windows.ContainsKey(windowId)) if(_windows.ContainsKey(windowId))

16
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) public void OnKeyboardEvent (KeyboardEvent evt)
{ {
Dispatcher.UIThread.RunJobs(DispatcherPriority.Input + 1); Dispatcher.UIThread.RunJobs(DispatcherPriority.Input + 1);

Loading…
Cancel
Save