diff --git a/Avalonia.sln b/Avalonia.sln index d1c5026e58..266d1eb690 100644 --- a/Avalonia.sln +++ b/Avalonia.sln @@ -187,6 +187,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.Designer.HostApp.N EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Skia.UnitTests", "tests\Avalonia.Skia.UnitTests\Avalonia.Skia.UnitTests.csproj", "{E1240B49-7B4B-4371-A00E-068778C5CF0B}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Windowing", "src\Avalonia.Windowing\Avalonia.Windowing.csproj", "{1A74298A-C9DF-4442-945E-B5151DFB121E}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Gpu", "src\Avalonia.Gpu\Avalonia.Gpu.csproj", "{FB8A415F-9C72-44C9-96D1-D76DEFF5ECBB}" +EndProject Global GlobalSection(SharedMSBuildProjectFiles) = preSolution src\Shared\RenderHelpers\RenderHelpers.projitems*{3c4c0cb4-0c0f-4450-a37b-148c84ff905f}*SharedItemsImports = 13 @@ -2514,6 +2518,86 @@ Global {E1240B49-7B4B-4371-A00E-068778C5CF0B}.Release|NetCoreOnly.Build.0 = Release|Any CPU {E1240B49-7B4B-4371-A00E-068778C5CF0B}.Release|x86.ActiveCfg = Release|Any CPU {E1240B49-7B4B-4371-A00E-068778C5CF0B}.Release|x86.Build.0 = Release|Any CPU + {1A74298A-C9DF-4442-945E-B5151DFB121E}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU + {1A74298A-C9DF-4442-945E-B5151DFB121E}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU + {1A74298A-C9DF-4442-945E-B5151DFB121E}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU + {1A74298A-C9DF-4442-945E-B5151DFB121E}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU + {1A74298A-C9DF-4442-945E-B5151DFB121E}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {1A74298A-C9DF-4442-945E-B5151DFB121E}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU + {1A74298A-C9DF-4442-945E-B5151DFB121E}.Ad-Hoc|NetCoreOnly.ActiveCfg = Debug|Any CPU + {1A74298A-C9DF-4442-945E-B5151DFB121E}.Ad-Hoc|NetCoreOnly.Build.0 = Debug|Any CPU + {1A74298A-C9DF-4442-945E-B5151DFB121E}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU + {1A74298A-C9DF-4442-945E-B5151DFB121E}.Ad-Hoc|x86.Build.0 = Debug|Any CPU + {1A74298A-C9DF-4442-945E-B5151DFB121E}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU + {1A74298A-C9DF-4442-945E-B5151DFB121E}.AppStore|Any CPU.Build.0 = Debug|Any CPU + {1A74298A-C9DF-4442-945E-B5151DFB121E}.AppStore|iPhone.ActiveCfg = Debug|Any CPU + {1A74298A-C9DF-4442-945E-B5151DFB121E}.AppStore|iPhone.Build.0 = Debug|Any CPU + {1A74298A-C9DF-4442-945E-B5151DFB121E}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {1A74298A-C9DF-4442-945E-B5151DFB121E}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU + {1A74298A-C9DF-4442-945E-B5151DFB121E}.AppStore|NetCoreOnly.ActiveCfg = Debug|Any CPU + {1A74298A-C9DF-4442-945E-B5151DFB121E}.AppStore|NetCoreOnly.Build.0 = Debug|Any CPU + {1A74298A-C9DF-4442-945E-B5151DFB121E}.AppStore|x86.ActiveCfg = Debug|Any CPU + {1A74298A-C9DF-4442-945E-B5151DFB121E}.AppStore|x86.Build.0 = Debug|Any CPU + {1A74298A-C9DF-4442-945E-B5151DFB121E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1A74298A-C9DF-4442-945E-B5151DFB121E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1A74298A-C9DF-4442-945E-B5151DFB121E}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {1A74298A-C9DF-4442-945E-B5151DFB121E}.Debug|iPhone.Build.0 = Debug|Any CPU + {1A74298A-C9DF-4442-945E-B5151DFB121E}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {1A74298A-C9DF-4442-945E-B5151DFB121E}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {1A74298A-C9DF-4442-945E-B5151DFB121E}.Debug|NetCoreOnly.ActiveCfg = Debug|Any CPU + {1A74298A-C9DF-4442-945E-B5151DFB121E}.Debug|NetCoreOnly.Build.0 = Debug|Any CPU + {1A74298A-C9DF-4442-945E-B5151DFB121E}.Debug|x86.ActiveCfg = Debug|Any CPU + {1A74298A-C9DF-4442-945E-B5151DFB121E}.Debug|x86.Build.0 = Debug|Any CPU + {1A74298A-C9DF-4442-945E-B5151DFB121E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1A74298A-C9DF-4442-945E-B5151DFB121E}.Release|Any CPU.Build.0 = Release|Any CPU + {1A74298A-C9DF-4442-945E-B5151DFB121E}.Release|iPhone.ActiveCfg = Release|Any CPU + {1A74298A-C9DF-4442-945E-B5151DFB121E}.Release|iPhone.Build.0 = Release|Any CPU + {1A74298A-C9DF-4442-945E-B5151DFB121E}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {1A74298A-C9DF-4442-945E-B5151DFB121E}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {1A74298A-C9DF-4442-945E-B5151DFB121E}.Release|NetCoreOnly.ActiveCfg = Release|Any CPU + {1A74298A-C9DF-4442-945E-B5151DFB121E}.Release|NetCoreOnly.Build.0 = Release|Any CPU + {1A74298A-C9DF-4442-945E-B5151DFB121E}.Release|x86.ActiveCfg = Release|Any CPU + {1A74298A-C9DF-4442-945E-B5151DFB121E}.Release|x86.Build.0 = Release|Any CPU + {FB8A415F-9C72-44C9-96D1-D76DEFF5ECBB}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU + {FB8A415F-9C72-44C9-96D1-D76DEFF5ECBB}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU + {FB8A415F-9C72-44C9-96D1-D76DEFF5ECBB}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU + {FB8A415F-9C72-44C9-96D1-D76DEFF5ECBB}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU + {FB8A415F-9C72-44C9-96D1-D76DEFF5ECBB}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {FB8A415F-9C72-44C9-96D1-D76DEFF5ECBB}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU + {FB8A415F-9C72-44C9-96D1-D76DEFF5ECBB}.Ad-Hoc|NetCoreOnly.ActiveCfg = Debug|Any CPU + {FB8A415F-9C72-44C9-96D1-D76DEFF5ECBB}.Ad-Hoc|NetCoreOnly.Build.0 = Debug|Any CPU + {FB8A415F-9C72-44C9-96D1-D76DEFF5ECBB}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU + {FB8A415F-9C72-44C9-96D1-D76DEFF5ECBB}.Ad-Hoc|x86.Build.0 = Debug|Any CPU + {FB8A415F-9C72-44C9-96D1-D76DEFF5ECBB}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU + {FB8A415F-9C72-44C9-96D1-D76DEFF5ECBB}.AppStore|Any CPU.Build.0 = Debug|Any CPU + {FB8A415F-9C72-44C9-96D1-D76DEFF5ECBB}.AppStore|iPhone.ActiveCfg = Debug|Any CPU + {FB8A415F-9C72-44C9-96D1-D76DEFF5ECBB}.AppStore|iPhone.Build.0 = Debug|Any CPU + {FB8A415F-9C72-44C9-96D1-D76DEFF5ECBB}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {FB8A415F-9C72-44C9-96D1-D76DEFF5ECBB}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU + {FB8A415F-9C72-44C9-96D1-D76DEFF5ECBB}.AppStore|NetCoreOnly.ActiveCfg = Debug|Any CPU + {FB8A415F-9C72-44C9-96D1-D76DEFF5ECBB}.AppStore|NetCoreOnly.Build.0 = Debug|Any CPU + {FB8A415F-9C72-44C9-96D1-D76DEFF5ECBB}.AppStore|x86.ActiveCfg = Debug|Any CPU + {FB8A415F-9C72-44C9-96D1-D76DEFF5ECBB}.AppStore|x86.Build.0 = Debug|Any CPU + {FB8A415F-9C72-44C9-96D1-D76DEFF5ECBB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FB8A415F-9C72-44C9-96D1-D76DEFF5ECBB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FB8A415F-9C72-44C9-96D1-D76DEFF5ECBB}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {FB8A415F-9C72-44C9-96D1-D76DEFF5ECBB}.Debug|iPhone.Build.0 = Debug|Any CPU + {FB8A415F-9C72-44C9-96D1-D76DEFF5ECBB}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {FB8A415F-9C72-44C9-96D1-D76DEFF5ECBB}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {FB8A415F-9C72-44C9-96D1-D76DEFF5ECBB}.Debug|NetCoreOnly.ActiveCfg = Debug|Any CPU + {FB8A415F-9C72-44C9-96D1-D76DEFF5ECBB}.Debug|NetCoreOnly.Build.0 = Debug|Any CPU + {FB8A415F-9C72-44C9-96D1-D76DEFF5ECBB}.Debug|x86.ActiveCfg = Debug|Any CPU + {FB8A415F-9C72-44C9-96D1-D76DEFF5ECBB}.Debug|x86.Build.0 = Debug|Any CPU + {FB8A415F-9C72-44C9-96D1-D76DEFF5ECBB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FB8A415F-9C72-44C9-96D1-D76DEFF5ECBB}.Release|Any CPU.Build.0 = Release|Any CPU + {FB8A415F-9C72-44C9-96D1-D76DEFF5ECBB}.Release|iPhone.ActiveCfg = Release|Any CPU + {FB8A415F-9C72-44C9-96D1-D76DEFF5ECBB}.Release|iPhone.Build.0 = Release|Any CPU + {FB8A415F-9C72-44C9-96D1-D76DEFF5ECBB}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {FB8A415F-9C72-44C9-96D1-D76DEFF5ECBB}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {FB8A415F-9C72-44C9-96D1-D76DEFF5ECBB}.Release|NetCoreOnly.ActiveCfg = Release|Any CPU + {FB8A415F-9C72-44C9-96D1-D76DEFF5ECBB}.Release|NetCoreOnly.Build.0 = Release|Any CPU + {FB8A415F-9C72-44C9-96D1-D76DEFF5ECBB}.Release|x86.ActiveCfg = Release|Any CPU + {FB8A415F-9C72-44C9-96D1-D76DEFF5ECBB}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE 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 881d0f6b45..b0f29ac06e 100644 --- a/src/Avalonia.Windowing/WindowImpl.cs +++ b/src/Avalonia.Windowing/WindowImpl.cs @@ -169,6 +169,11 @@ namespace Avalonia.Windowing { } + public void OnKeyboardEvent (KeyboardEvent evt) + { + + } + public void OnMouseEvent(MouseEvent evt) { Dispatcher.UIThread.RunJobs(DispatcherPriority.Input); @@ -180,7 +185,7 @@ namespace Avalonia.Windowing break; case MouseEventType.Wheel: - Input(new RawMouseWheelEventArgs(MouseDevice, (uint)Environment.TickCount, _inputRoot, new Point(_lastPosition.X, _lastPosition.Y), new Point(evt.Position.X, evt.Position.Y / 2), InputModifiers.None)); + Input(new RawMouseWheelEventArgs(MouseDevice, (uint)Environment.TickCount, _inputRoot, new Point(_lastPosition.X, _lastPosition.Y), new Point(evt.Position.X / 50, evt.Position.Y / 50), InputModifiers.None)); return; }