Browse Source

add dpi information to screens api.

pull/3009/head
Dan Walmsley 6 years ago
parent
commit
2282c99c16
  1. 2
      native/Avalonia.Native/inc/avalonia-native.h
  2. 5
      src/Avalonia.Controls/Platform/Screen.cs
  3. 2
      src/Avalonia.DesignerSupport/Remote/Stubs.cs
  4. 1
      src/Avalonia.Native/ScreenImpl.cs
  5. 2
      src/Avalonia.X11/X11Screens.cs
  6. 4
      src/Windows/Avalonia.Win32/ScreenImpl.cs
  7. 2
      src/Windows/Avalonia.Win32/WinScreen.cs
  8. 2
      tests/Avalonia.Controls.UnitTests/ContextMenuTests.cs

2
native/Avalonia.Native/inc/avalonia-native.h

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

5
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;

2
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
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);

2
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

4
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++;
}

2
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;
}

2
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);

Loading…
Cancel
Save