From 50a3b95f87a2f02d633e27d884813ad913bc70a0 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 17 Oct 2018 12:27:14 +0100 Subject: [PATCH 1/8] fix support for zooming in on previewer and hidpi preview. --- .../Remote/Server/RemoteServerTopLevelImpl.cs | 2 +- src/Avalonia.DesignerSupport/DesignWindowLoader.cs | 6 +++++- .../Remote/RemoteDesignerEntryPoint.cs | 5 +++-- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/Avalonia.Controls/Remote/Server/RemoteServerTopLevelImpl.cs b/src/Avalonia.Controls/Remote/Server/RemoteServerTopLevelImpl.cs index c1ef9476db..08af820fe1 100644 --- a/src/Avalonia.Controls/Remote/Server/RemoteServerTopLevelImpl.cs +++ b/src/Avalonia.Controls/Remote/Server/RemoteServerTopLevelImpl.cs @@ -85,7 +85,7 @@ namespace Avalonia.Controls.Remote.Server } } - protected void SetDpi(Vector dpi) + public void SetDpi(Vector dpi) { _dpi = dpi; RenderIfNeeded(); diff --git a/src/Avalonia.DesignerSupport/DesignWindowLoader.cs b/src/Avalonia.DesignerSupport/DesignWindowLoader.cs index 6dca479d38..853d8c3dbb 100644 --- a/src/Avalonia.DesignerSupport/DesignWindowLoader.cs +++ b/src/Avalonia.DesignerSupport/DesignWindowLoader.cs @@ -5,6 +5,7 @@ using System.Reflection; using System.Text; using Avalonia.Controls; using Avalonia.Controls.Platform; +using Avalonia.Controls.Remote.Server; using Avalonia.Markup.Xaml; using Avalonia.Styling; @@ -12,7 +13,7 @@ namespace Avalonia.DesignerSupport { public class DesignWindowLoader { - public static Window LoadDesignerWindow(string xaml, string assemblyPath) + public static Window LoadDesignerWindow(string xaml, string assemblyPath, Vector dpi) { Window window; Control control; @@ -69,6 +70,9 @@ namespace Avalonia.DesignerSupport if (!window.IsSet(Window.SizeToContentProperty)) window.SizeToContent = SizeToContent.WidthAndHeight; } + + (window.PlatformImpl as RemoteServerTopLevelImpl).SetDpi(dpi); + window.Show(); Design.ApplyDesignModeProperties(window, control); return window; diff --git a/src/Avalonia.DesignerSupport/Remote/RemoteDesignerEntryPoint.cs b/src/Avalonia.DesignerSupport/Remote/RemoteDesignerEntryPoint.cs index 4536748836..4cd14d56d1 100644 --- a/src/Avalonia.DesignerSupport/Remote/RemoteDesignerEntryPoint.cs +++ b/src/Avalonia.DesignerSupport/Remote/RemoteDesignerEntryPoint.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Net; using System.Reflection; @@ -191,7 +191,8 @@ namespace Avalonia.DesignerSupport.Remote s_currentWindow = null; try { - s_currentWindow = DesignWindowLoader.LoadDesignerWindow(xaml.Xaml, xaml.AssemblyPath); + var dpi = s_viewportAllocatedMessage != null ? new Vector(s_viewportAllocatedMessage.DpiX, s_viewportAllocatedMessage.DpiY) : new Vector(96, 96); + s_currentWindow = DesignWindowLoader.LoadDesignerWindow(xaml.Xaml, xaml.AssemblyPath, dpi); s_transport.Send(new UpdateXamlResultMessage(){Handle = s_currentWindow.PlatformImpl?.Handle?.Handle.ToString()}); } catch (Exception e) From e12a3f91c5b325d2beda98c7d9d09b77c378da70 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 17 Oct 2018 16:33:30 +0100 Subject: [PATCH 2/8] add a render info message so dpi can be set. --- .../Remote/Server/RemoteServerTopLevelImpl.cs | 8 +++++++- .../DesignWindowLoader.cs | 4 +--- .../Remote/RemoteDesignerEntryPoint.cs | 15 +++++++++++---- src/Avalonia.Remote.Protocol/ViewportMessages.cs | 7 +++++++ 4 files changed, 26 insertions(+), 8 deletions(-) diff --git a/src/Avalonia.Controls/Remote/Server/RemoteServerTopLevelImpl.cs b/src/Avalonia.Controls/Remote/Server/RemoteServerTopLevelImpl.cs index 08af820fe1..ec61dbc037 100644 --- a/src/Avalonia.Controls/Remote/Server/RemoteServerTopLevelImpl.cs +++ b/src/Avalonia.Controls/Remote/Server/RemoteServerTopLevelImpl.cs @@ -45,6 +45,13 @@ namespace Avalonia.Controls.Remote.Server } Dispatcher.UIThread.Post(RenderIfNeeded); } + if(obj is ClientRenderInfoMessage renderInfo) + { + lock(_lock) + { + _dpi = new Vector(renderInfo.DpiX, renderInfo.DpiY); + } + } if (obj is ClientSupportedPixelFormatsMessage supportedFormats) { lock (_lock) @@ -74,7 +81,6 @@ namespace Avalonia.Controls.Remote.Server allocation = _pendingAllocation; _pendingAllocation = null; } - _dpi = new Vector(allocation.DpiX, allocation.DpiY); ClientSize = new Size(allocation.Width, allocation.Height); RenderIfNeeded(); }); diff --git a/src/Avalonia.DesignerSupport/DesignWindowLoader.cs b/src/Avalonia.DesignerSupport/DesignWindowLoader.cs index e724649a7e..a34a893e0b 100644 --- a/src/Avalonia.DesignerSupport/DesignWindowLoader.cs +++ b/src/Avalonia.DesignerSupport/DesignWindowLoader.cs @@ -13,7 +13,7 @@ namespace Avalonia.DesignerSupport { public class DesignWindowLoader { - public static Window LoadDesignerWindow(string xaml, string assemblyPath, Vector dpi) + public static Window LoadDesignerWindow(string xaml, string assemblyPath) { Window window; Control control; @@ -70,8 +70,6 @@ namespace Avalonia.DesignerSupport if (!window.IsSet(Window.SizeToContentProperty)) window.SizeToContent = SizeToContent.WidthAndHeight; } - - (window.PlatformImpl as RemoteServerTopLevelImpl).SetDpi(dpi); window.Show(); Design.ApplyDesignModeProperties(window, control); diff --git a/src/Avalonia.DesignerSupport/Remote/RemoteDesignerEntryPoint.cs b/src/Avalonia.DesignerSupport/Remote/RemoteDesignerEntryPoint.cs index 4cd14d56d1..cf36dd622a 100644 --- a/src/Avalonia.DesignerSupport/Remote/RemoteDesignerEntryPoint.cs +++ b/src/Avalonia.DesignerSupport/Remote/RemoteDesignerEntryPoint.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Net; using System.Reflection; @@ -15,6 +15,8 @@ namespace Avalonia.DesignerSupport.Remote { private static ClientSupportedPixelFormatsMessage s_supportedPixelFormats; private static ClientViewportAllocatedMessage s_viewportAllocatedMessage; + private static ClientRenderInfoMessage s_renderInfoMessage; + private static IAvaloniaRemoteTransportConnection s_transport; class CommandLineArgs { @@ -161,7 +163,8 @@ namespace Avalonia.DesignerSupport.Remote PreviewerWindowingPlatform.PreFlightMessages = new List { s_supportedPixelFormats, - s_viewportAllocatedMessage + s_viewportAllocatedMessage, + s_renderInfoMessage }; } @@ -173,6 +176,11 @@ namespace Avalonia.DesignerSupport.Remote s_supportedPixelFormats = formats; RebuildPreFlight(); } + if (obj is ClientRenderInfoMessage renderInfo) + { + s_renderInfoMessage = renderInfo; + RebuildPreFlight(); + } if (obj is ClientViewportAllocatedMessage viewport) { s_viewportAllocatedMessage = viewport; @@ -191,8 +199,7 @@ namespace Avalonia.DesignerSupport.Remote s_currentWindow = null; try { - var dpi = s_viewportAllocatedMessage != null ? new Vector(s_viewportAllocatedMessage.DpiX, s_viewportAllocatedMessage.DpiY) : new Vector(96, 96); - s_currentWindow = DesignWindowLoader.LoadDesignerWindow(xaml.Xaml, xaml.AssemblyPath, dpi); + s_currentWindow = DesignWindowLoader.LoadDesignerWindow(xaml.Xaml, xaml.AssemblyPath); s_transport.Send(new UpdateXamlResultMessage(){Handle = s_currentWindow.PlatformImpl?.Handle?.Handle.ToString()}); } catch (Exception e) diff --git a/src/Avalonia.Remote.Protocol/ViewportMessages.cs b/src/Avalonia.Remote.Protocol/ViewportMessages.cs index 0627e9d629..dc4550b846 100644 --- a/src/Avalonia.Remote.Protocol/ViewportMessages.cs +++ b/src/Avalonia.Remote.Protocol/ViewportMessages.cs @@ -37,6 +37,13 @@ public PixelFormat[] Formats { get; set; } } + [AvaloniaRemoteMessageGuid("7A3c25d3-3652-438D-8EF1-86E942CC96C0")] + public class ClientRenderInfoMessage + { + public double DpiX { get; set; } + public double DpiY { get; set; } + } + [AvaloniaRemoteMessageGuid("68014F8A-289D-4851-8D34-5367EDA7F827")] public class FrameReceivedMessage { From 75771d6d49db8ee15da791dfff91e05cfc4afee6 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 17 Oct 2018 16:37:45 +0100 Subject: [PATCH 3/8] remove whitespace changes --- src/Avalonia.DesignerSupport/DesignWindowLoader.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Avalonia.DesignerSupport/DesignWindowLoader.cs b/src/Avalonia.DesignerSupport/DesignWindowLoader.cs index a34a893e0b..f4d9808d38 100644 --- a/src/Avalonia.DesignerSupport/DesignWindowLoader.cs +++ b/src/Avalonia.DesignerSupport/DesignWindowLoader.cs @@ -5,7 +5,6 @@ using System.Reflection; using System.Text; using Avalonia.Controls; using Avalonia.Controls.Platform; -using Avalonia.Controls.Remote.Server; using Avalonia.Markup.Xaml; using Avalonia.Styling; @@ -70,7 +69,6 @@ namespace Avalonia.DesignerSupport if (!window.IsSet(Window.SizeToContentProperty)) window.SizeToContent = SizeToContent.WidthAndHeight; } - window.Show(); Design.ApplyDesignModeProperties(window, control); return window; From 1078bff534ab15c3d792f083af234ccb9acc5e3b Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 17 Oct 2018 16:48:15 +0100 Subject: [PATCH 4/8] allocate viewport allows dpi to be overriden. --- src/Avalonia.Controls/Remote/Server/RemoteServerTopLevelImpl.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Avalonia.Controls/Remote/Server/RemoteServerTopLevelImpl.cs b/src/Avalonia.Controls/Remote/Server/RemoteServerTopLevelImpl.cs index ec61dbc037..7080dd6714 100644 --- a/src/Avalonia.Controls/Remote/Server/RemoteServerTopLevelImpl.cs +++ b/src/Avalonia.Controls/Remote/Server/RemoteServerTopLevelImpl.cs @@ -81,6 +81,7 @@ namespace Avalonia.Controls.Remote.Server allocation = _pendingAllocation; _pendingAllocation = null; } + _dpi = new Vector(allocation.DpiX, allocation.DpiY); ClientSize = new Size(allocation.Width, allocation.Height); RenderIfNeeded(); }); From 7c6f1ca6ed4f09461f0c17b6f16b3926037fdbd7 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 17 Oct 2018 16:49:50 +0100 Subject: [PATCH 5/8] dont make setdpi public --- src/Avalonia.Controls/Remote/Server/RemoteServerTopLevelImpl.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Avalonia.Controls/Remote/Server/RemoteServerTopLevelImpl.cs b/src/Avalonia.Controls/Remote/Server/RemoteServerTopLevelImpl.cs index 7080dd6714..63f2ec2ced 100644 --- a/src/Avalonia.Controls/Remote/Server/RemoteServerTopLevelImpl.cs +++ b/src/Avalonia.Controls/Remote/Server/RemoteServerTopLevelImpl.cs @@ -92,7 +92,7 @@ namespace Avalonia.Controls.Remote.Server } } - public void SetDpi(Vector dpi) + protected void SetDpi(Vector dpi) { _dpi = dpi; RenderIfNeeded(); From 9fa5f957fec687d5e47938be7ca62999fe03a0df Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 17 Oct 2018 18:09:38 +0100 Subject: [PATCH 6/8] invalidate remote window if previewer dpi is changed. --- src/Avalonia.Controls/Remote/Server/RemoteServerTopLevelImpl.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Avalonia.Controls/Remote/Server/RemoteServerTopLevelImpl.cs b/src/Avalonia.Controls/Remote/Server/RemoteServerTopLevelImpl.cs index 63f2ec2ced..1795f28f7f 100644 --- a/src/Avalonia.Controls/Remote/Server/RemoteServerTopLevelImpl.cs +++ b/src/Avalonia.Controls/Remote/Server/RemoteServerTopLevelImpl.cs @@ -50,6 +50,8 @@ namespace Avalonia.Controls.Remote.Server lock(_lock) { _dpi = new Vector(renderInfo.DpiX, renderInfo.DpiY); + _invalidated = true; + RenderIfNeeded(); } } if (obj is ClientSupportedPixelFormatsMessage supportedFormats) From 4cfd5a9a030170515468429fc9094b9453da7cd2 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 17 Oct 2018 18:12:15 +0100 Subject: [PATCH 7/8] add previewer mode property to remote widget --- src/Avalonia.Controls/Remote/RemoteWidget.cs | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/Avalonia.Controls/Remote/RemoteWidget.cs b/src/Avalonia.Controls/Remote/RemoteWidget.cs index 2d4f2e6b52..0f0f6a7b87 100644 --- a/src/Avalonia.Controls/Remote/RemoteWidget.cs +++ b/src/Avalonia.Controls/Remote/RemoteWidget.cs @@ -28,6 +28,8 @@ namespace Avalonia.Controls.Remote }); } + public bool PreviewerMode { get; set; } + private void OnMessage(object msg) { if (msg is FrameMessage frame) @@ -44,13 +46,17 @@ namespace Avalonia.Controls.Remote protected override void ArrangeCore(Rect finalRect) { - _connection.Send(new ClientViewportAllocatedMessage + if (!PreviewerMode) { - Width = finalRect.Width, - Height = finalRect.Height, - DpiX = 96, - DpiY = 96 //TODO: Somehow detect the actual DPI - }); + _connection.Send(new ClientViewportAllocatedMessage + { + Width = finalRect.Width, + Height = finalRect.Height, + DpiX = 10 * 96, + DpiY = 10 * 96 //TODO: Somehow detect the actual DPI + }); + } + base.ArrangeCore(finalRect); } From fc3458fac068c16c60d27152b74e15c7e69230dd Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 17 Oct 2018 18:44:24 +0100 Subject: [PATCH 8/8] remote widget sizing mode. --- src/Avalonia.Controls/Remote/RemoteWidget.cs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/Avalonia.Controls/Remote/RemoteWidget.cs b/src/Avalonia.Controls/Remote/RemoteWidget.cs index 0f0f6a7b87..106c6fff63 100644 --- a/src/Avalonia.Controls/Remote/RemoteWidget.cs +++ b/src/Avalonia.Controls/Remote/RemoteWidget.cs @@ -11,11 +11,19 @@ namespace Avalonia.Controls.Remote { public class RemoteWidget : Control { + public enum SizingMode + { + Local, + Remote + } + private readonly IAvaloniaRemoteTransportConnection _connection; private FrameMessage _lastFrame; private WriteableBitmap _bitmap; public RemoteWidget(IAvaloniaRemoteTransportConnection connection) { + Mode = SizingMode.Local; + _connection = connection; _connection.OnMessage += (t, msg) => Dispatcher.UIThread.Post(() => OnMessage(msg)); _connection.Send(new ClientSupportedPixelFormatsMessage @@ -28,7 +36,7 @@ namespace Avalonia.Controls.Remote }); } - public bool PreviewerMode { get; set; } + public SizingMode Mode { get; set; } private void OnMessage(object msg) { @@ -46,7 +54,7 @@ namespace Avalonia.Controls.Remote protected override void ArrangeCore(Rect finalRect) { - if (!PreviewerMode) + if (Mode == SizingMode.Local) { _connection.Send(new ClientViewportAllocatedMessage {