Переглянути джерело

add dpi information to screens api.

Dan Walmsley 6 роки тому
батько
коміт
2282c99c16

+ 1 - 1
native/Avalonia.Native/inc/avalonia-native.h

@@ -52,7 +52,7 @@ struct AvnScreen
 {
     AvnRect Bounds;
     AvnRect WorkingArea;
-    float PixelDenisty;
+    float PixelDensity;
     bool Primary;
 };
 

+ 4 - 1
src/Avalonia.Controls/Platform/Screen.cs

@@ -2,14 +2,17 @@
 {
     public class Screen
     {
+        public double PixelDenisty { get; }
+
         public PixelRect Bounds { get; }
 
         public PixelRect WorkingArea { get; }
 
         public bool Primary { get; }
         
-        public Screen(PixelRect bounds, PixelRect workingArea, bool primary)
+        public Screen(double pixelDensity, PixelRect bounds, PixelRect workingArea, bool primary)
         {
+            this.PixelDenisty = pixelDensity;
             this.Bounds = bounds;
             this.WorkingArea = workingArea;
             this.Primary = primary;

+ 1 - 1
src/Avalonia.DesignerSupport/Remote/Stubs.cs

@@ -178,6 +178,6 @@ namespace Avalonia.DesignerSupport.Remote
         public int ScreenCount => 1;
 
         public IReadOnlyList<Screen> AllScreens { get; } =
-            new Screen[] { new Screen(new PixelRect(0, 0, 4000, 4000), new PixelRect(0, 0, 4000, 4000), true) };
+            new Screen[] { new Screen(1, new PixelRect(0, 0, 4000, 4000), new PixelRect(0, 0, 4000, 4000), true) };
     }
 }

+ 1 - 0
src/Avalonia.Native/ScreenImpl.cs

@@ -31,6 +31,7 @@ namespace Avalonia.Native
                     var screen = _native.GetScreen(i);
 
                     result[i] = new Screen(
+                        screen.PixelDensity,
                         screen.Bounds.ToAvaloniaPixelRect(),
                         screen.WorkingArea.ToAvaloniaPixelRect(),
                         screen.Primary);

+ 1 - 1
src/Avalonia.X11/X11Screens.cs

@@ -157,7 +157,7 @@ namespace Avalonia.X11
         public int ScreenCount => _impl.Screens.Length;
 
         public IReadOnlyList<Screen> AllScreens =>
-            _impl.Screens.Select(s => new Screen(s.Bounds, s.WorkingArea, s.Primary)).ToArray();
+            _impl.Screens.Select(s => new Screen(s.PixelDensity, s.Bounds, s.WorkingArea, s.Primary)).ToArray();
     }
 
     interface IX11Screens

+ 3 - 1
src/Windows/Avalonia.Win32/ScreenImpl.cs

@@ -30,6 +30,8 @@ namespace Avalonia.Win32
                             MONITORINFO monitorInfo = MONITORINFO.Create();
                             if (GetMonitorInfo(monitor,ref monitorInfo))
                             {
+                                GetDpiForMonitor(monitor, MONITOR_DPI_TYPE.MDT_EFFECTIVE_DPI, out var x, out _);
+
                                 RECT bounds = monitorInfo.rcMonitor;
                                 RECT workingArea = monitorInfo.rcWork;
                                 PixelRect avaloniaBounds = new PixelRect(bounds.left, bounds.top, bounds.right - bounds.left,
@@ -38,7 +40,7 @@ namespace Avalonia.Win32
                                     new PixelRect(workingArea.left, workingArea.top, workingArea.right - workingArea.left,
                                         workingArea.bottom - workingArea.top);
                                 screens[index] =
-                                    new WinScreen(avaloniaBounds, avaloniaWorkArea, monitorInfo.dwFlags == 1,
+                                    new WinScreen((double)x / 96.0d, avaloniaBounds, avaloniaWorkArea, monitorInfo.dwFlags == 1,
                                         monitor);
                                 index++;
                             }

+ 1 - 1
src/Windows/Avalonia.Win32/WinScreen.cs

@@ -7,7 +7,7 @@ namespace Avalonia.Win32
     {
         private readonly IntPtr _hMonitor;
 
-        public WinScreen(PixelRect bounds, PixelRect workingArea, bool primary, IntPtr hMonitor) : base(bounds, workingArea, primary)
+        public WinScreen(double pixelDensity, PixelRect bounds, PixelRect workingArea, bool primary, IntPtr hMonitor) : base(pixelDensity, bounds, workingArea, primary)
         {
             this._hMonitor = hMonitor;
         }

+ 1 - 1
tests/Avalonia.Controls.UnitTests/ContextMenuTests.cs

@@ -198,7 +198,7 @@ namespace Avalonia.Controls.UnitTests
             var screen = new PixelRect(new PixelPoint(), new PixelSize(100, 100));
             var screenImpl = new Mock<IScreenImpl>();
             screenImpl.Setup(x => x.ScreenCount).Returns(1);
-            screenImpl.Setup(X => X.AllScreens).Returns( new[] { new Screen(screen, screen, true) });
+            screenImpl.Setup(X => X.AllScreens).Returns( new[] { new Screen(1, screen, screen, true) });
 
             popupImpl = MockWindowingPlatform.CreatePopupMock();
             popupImpl.SetupGet(x => x.Scaling).Returns(1);