Browse Source

implement keyboard input.

repro-window-close
Dan Walmsley 8 years ago
parent
commit
335a429302
  1. 2
      src/Avalonia.Windowing/Bindings/EventNotifier.cs
  2. 11
      src/Avalonia.Windowing/Bindings/Events.cs
  3. 2
      src/Avalonia.Windowing/Bindings/EventsLoop.cs
  4. 9
      src/Avalonia.Windowing/WIndowingPlatform.cs
  5. 5
      src/Avalonia.Windowing/WindowImpl.cs

2
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;
}
}

11
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
{

2
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()
};

9
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<IntPtr, WindowImpl>();
@ -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);

5
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);

Loading…
Cancel
Save