@ -7,5 +7,7 @@ namespace Avalonia.Platform
int ScreenCount { get; }
IReadOnlyList<Screen> AllScreens { get; }
Screen? ScreenFromWindow(IWindowImpl windowImpl);
}
@ -52,5 +52,22 @@ namespace Avalonia.Controls
var br = visual.PointToScreen(visual.Bounds.BottomRight);
return ScreenFromBounds(new PixelRect(tl, br));
public Screen? ScreenFromWindow(Window window)
{
Screen? screen = null;
if (window.PlatformImpl != null)
screen = _iScreenImpl?.ScreenFromWindow(window.PlatformImpl) ?? null;
if (screen is { })
return screen;
return ScreenFromPoint(window.Position);
@ -879,8 +879,17 @@ namespace Avalonia.Controls
if (startupLocation == WindowStartupLocation.CenterScreen)
var screen = Screens.ScreenFromPoint(owner?.Position ?? Position);
if (Owner is Window ownerWin)
screen = Screens.ScreenFromWindow(ownerWin);
else
screen = Screens.ScreenFromPoint(Position);
if (screen != null)
Position = screen.WorkingArea.CenterRect(rect).Position;
@ -237,5 +237,10 @@ namespace Avalonia.DesignerSupport.Remote
public IReadOnlyList<Screen> AllScreens { get; } =
new Screen[] { new Screen(1, new PixelRect(0, 0, 4000, 4000), new PixelRect(0, 0, 4000, 4000), true) };
public Screen? ScreenFromWindow(IWindowImpl windowImpl)
return null;
@ -200,5 +200,10 @@ namespace Avalonia.Headless
new Screen(1, new PixelRect(0, 0, 1920, 1280),
new PixelRect(0, 0, 1920, 1280), true),
};
public Screen ScreenFromWindow(IWindowImpl windowImpl)
@ -42,6 +42,11 @@ namespace Avalonia.Native
return Array.Empty<Screen>();
public void Dispose ()
@ -17,6 +17,11 @@ namespace Avalonia.X11
_impl = impl;
static unsafe X11Screen[] UpdateWorkArea(X11Info info, X11Screen[] screens)
@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Avalonia.Platform;
using Avalonia.Win32.Interop;
using static Avalonia.Win32.Interop.UnmanagedMethods;
@ -70,5 +71,13 @@ namespace Avalonia.Win32
_allScreens = null;
var hmonitor = MonitorFromWindow(windowImpl.Handle.Handle, MONITOR.MONITOR_DEFAULTTONEAREST);
return AllScreens.Select(x => x as WinScreen).Where(x => x is { })
.FirstOrDefault(x => x.Handle == hmonitor);
@ -21,5 +21,7 @@ namespace Avalonia.Win32
return (obj is WinScreen screen) ? this._hMonitor == screen._hMonitor : base.Equals(obj);
internal IntPtr Handle => _hMonitor;