From 0e9d31068e388d27b4097ff6e7e846a6e1003015 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Mon, 23 Jul 2018 21:57:49 +0100 Subject: [PATCH 1/4] add platform settings. --- src/Avalonia.Windowing/PlatformSettings.cs | 11 +++++++++++ src/Avalonia.Windowing/WIndowingPlatform.cs | 1 + 2 files changed, 12 insertions(+) create mode 100644 src/Avalonia.Windowing/PlatformSettings.cs diff --git a/src/Avalonia.Windowing/PlatformSettings.cs b/src/Avalonia.Windowing/PlatformSettings.cs new file mode 100644 index 0000000000..1628fb95a7 --- /dev/null +++ b/src/Avalonia.Windowing/PlatformSettings.cs @@ -0,0 +1,11 @@ +using System; +using Avalonia.Platform; + +namespace Avalonia.Windowing +{ + public class PlatformSettings : IPlatformSettings + { + public Size DoubleClickSize => new Size(4, 4); + public TimeSpan DoubleClickTime => TimeSpan.FromMilliseconds(200); + } +} diff --git a/src/Avalonia.Windowing/WIndowingPlatform.cs b/src/Avalonia.Windowing/WIndowingPlatform.cs index fce6b148ea..93d0753ff7 100644 --- a/src/Avalonia.Windowing/WIndowingPlatform.cs +++ b/src/Avalonia.Windowing/WIndowingPlatform.cs @@ -89,6 +89,7 @@ namespace Avalonia.Windowing .Bind().ToConstant(new MouseDevice()) .Bind().ToConstant(new IconLoader()) .Bind().ToConstant(new CursorFactory()) + .Bind().ToConstant(new PlatformSettings()) .Bind().ToConstant(this); } From f1f347e29a947eb8c000f59733151df099b4675d Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Mon, 23 Jul 2018 22:25:43 +0100 Subject: [PATCH 2/4] fix PointToClient and PointToScreen. --- src/Avalonia.Windowing/WindowImpl.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Avalonia.Windowing/WindowImpl.cs b/src/Avalonia.Windowing/WindowImpl.cs index eb6a695fca..dcb068a0cd 100644 --- a/src/Avalonia.Windowing/WindowImpl.cs +++ b/src/Avalonia.Windowing/WindowImpl.cs @@ -103,14 +103,12 @@ namespace Avalonia.Windowing public Point PointToClient(Point point) { - point = point.WithY(ClientSize.Height - point.Y); var position = Position; return new Point(point.X + position.X, point.Y + position.Y); } public Point PointToScreen(Point point) { - point = point.WithY(ClientSize.Height - point.Y); var position = Position; return new Point(point.X - position.X, point.Y - position.Y);; } From 42367440a57fe8589594e3972d71db7f795ac10c Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Tue, 24 Jul 2018 21:07:08 +0100 Subject: [PATCH 3/4] implement GetScaleFactor for GLWindow. --- src/Avalonia.Windowing/Bindings/GlWindow.cs | 8 ++++++++ src/Avalonia.Windowing/Bindings/IWindowWrapper.cs | 1 + src/Avalonia.Windowing/WIndowingPlatform.cs | 6 ------ src/Avalonia.Windowing/WindowImpl.cs | 2 +- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/Avalonia.Windowing/Bindings/GlWindow.cs b/src/Avalonia.Windowing/Bindings/GlWindow.cs index 864cf76dcf..334453e74a 100644 --- a/src/Avalonia.Windowing/Bindings/GlWindow.cs +++ b/src/Avalonia.Windowing/Bindings/GlWindow.cs @@ -25,6 +25,9 @@ namespace Avalonia.Windowing.Bindings [DllImport("winit_wrapper")] private static extern LogicalSize winit_gl_window_get_size(IntPtr handle); + [DllImport("winit_wrapper")] + private static extern double winit_gl_window_get_dpi_scale_factor(IntPtr handle); + [DllImport("winit_wrapper")] private static extern LogicalPosition winit_gl_window_get_position(IntPtr handle); @@ -89,6 +92,11 @@ namespace Avalonia.Windowing.Bindings return (size.Width, size.Height); } + public double GetScaleFactor () + { + return winit_gl_window_get_dpi_scale_factor(_handle); + } + public (double, double) GetFramebufferSize() { return GetSize(); diff --git a/src/Avalonia.Windowing/Bindings/IWindowWrapper.cs b/src/Avalonia.Windowing/Bindings/IWindowWrapper.cs index 76227cdf86..09319c9bb0 100644 --- a/src/Avalonia.Windowing/Bindings/IWindowWrapper.cs +++ b/src/Avalonia.Windowing/Bindings/IWindowWrapper.cs @@ -12,6 +12,7 @@ namespace Avalonia.Windowing.Bindings void SetTitle(string title); void SetSize(double width, double height); + double GetScaleFactor(); (double, double) GetSize(); (double, double) GetPosition(); diff --git a/src/Avalonia.Windowing/WIndowingPlatform.cs b/src/Avalonia.Windowing/WIndowingPlatform.cs index b2baea9374..a695b7d8db 100644 --- a/src/Avalonia.Windowing/WIndowingPlatform.cs +++ b/src/Avalonia.Windowing/WIndowingPlatform.cs @@ -10,12 +10,6 @@ using Avalonia.Windowing.Bindings; namespace Avalonia.Windowing { - public class PlatformSettings : IPlatformSettings - { - public Size DoubleClickSize => new Size(4, 4); - public TimeSpan DoubleClickTime => TimeSpan.FromMilliseconds(200); - } - public class DummyPlatformHandle : IPlatformHandle { public IntPtr Handle => IntPtr.Zero; diff --git a/src/Avalonia.Windowing/WindowImpl.cs b/src/Avalonia.Windowing/WindowImpl.cs index d48ebdaae4..6d0658b477 100644 --- a/src/Avalonia.Windowing/WindowImpl.cs +++ b/src/Avalonia.Windowing/WindowImpl.cs @@ -55,7 +55,7 @@ namespace Avalonia.Windowing } } - public double Scaling => 192 / 96; + public double Scaling => _windowWrapper.GetScaleFactor(); public IEnumerable Surfaces => new List() { _windowWrapper }; From ae207aa1946157493f4dfae52e7a3a8e8e35eb2f Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Tue, 24 Jul 2018 21:58:28 +0100 Subject: [PATCH 4/4] implement mouse wheel events. --- src/Avalonia.Windowing/WindowImpl.cs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/Avalonia.Windowing/WindowImpl.cs b/src/Avalonia.Windowing/WindowImpl.cs index 6d0658b477..516c21598f 100644 --- a/src/Avalonia.Windowing/WindowImpl.cs +++ b/src/Avalonia.Windowing/WindowImpl.cs @@ -172,9 +172,15 @@ namespace Avalonia.Windowing { Dispatcher.UIThread.RunJobs(DispatcherPriority.Input); - if (evt.EventType == MouseEventType.Move) + switch(evt.EventType) { - _lastPosition = evt.Position; + case MouseEventType.Move: + _lastPosition = evt.Position; + 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), InputModifiers.None)); + return; } Input(new RawMouseEventArgs(MouseDevice, (uint)Environment.TickCount, _inputRoot, (RawMouseEventType)evt.EventType, new Point(_lastPosition.X, _lastPosition.Y), InputModifiers.None));