diff --git a/src/Avalonia.Controls/Remote/RemoteWidget.cs b/src/Avalonia.Controls/Remote/RemoteWidget.cs index 2d4f2e6b52..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,6 +36,8 @@ namespace Avalonia.Controls.Remote }); } + public SizingMode Mode { get; set; } + private void OnMessage(object msg) { if (msg is FrameMessage frame) @@ -44,13 +54,17 @@ namespace Avalonia.Controls.Remote protected override void ArrangeCore(Rect finalRect) { - _connection.Send(new ClientViewportAllocatedMessage + if (Mode == SizingMode.Local) { - 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); } diff --git a/src/Avalonia.Controls/Remote/Server/RemoteServerTopLevelImpl.cs b/src/Avalonia.Controls/Remote/Server/RemoteServerTopLevelImpl.cs index c1ef9476db..1795f28f7f 100644 --- a/src/Avalonia.Controls/Remote/Server/RemoteServerTopLevelImpl.cs +++ b/src/Avalonia.Controls/Remote/Server/RemoteServerTopLevelImpl.cs @@ -45,6 +45,15 @@ namespace Avalonia.Controls.Remote.Server } Dispatcher.UIThread.Post(RenderIfNeeded); } + if(obj is ClientRenderInfoMessage renderInfo) + { + lock(_lock) + { + _dpi = new Vector(renderInfo.DpiX, renderInfo.DpiY); + _invalidated = true; + RenderIfNeeded(); + } + } if (obj is ClientSupportedPixelFormatsMessage supportedFormats) { lock (_lock) diff --git a/src/Avalonia.DesignerSupport/Remote/RemoteDesignerEntryPoint.cs b/src/Avalonia.DesignerSupport/Remote/RemoteDesignerEntryPoint.cs index 4536748836..cf36dd622a 100644 --- a/src/Avalonia.DesignerSupport/Remote/RemoteDesignerEntryPoint.cs +++ b/src/Avalonia.DesignerSupport/Remote/RemoteDesignerEntryPoint.cs @@ -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; 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 {