From 603379a1add36ea0183e18b72ada6d63affefaf6 Mon Sep 17 00:00:00 2001 From: Laszlo Nemeth <57342539+donlaci@users.noreply.github.com> Date: Thu, 16 Jan 2025 10:56:11 +0100 Subject: [PATCH] [Workspaces] fixing bug: editor starts outside of visible desktop area (#36769) * [Workspaces] fixing bug: editor starts outside of visible desktop area * Update src/modules/Workspaces/WorkspacesEditor/MainWindow.xaml.cs Co-authored-by: Seraphima Zykova --------- Co-authored-by: Seraphima Zykova --- .../WorkspacesEditor/MainWindow.xaml.cs | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/modules/Workspaces/WorkspacesEditor/MainWindow.xaml.cs b/src/modules/Workspaces/WorkspacesEditor/MainWindow.xaml.cs index 8f9944cc90..f5fc7bcac6 100644 --- a/src/modules/Workspaces/WorkspacesEditor/MainWindow.xaml.cs +++ b/src/modules/Workspaces/WorkspacesEditor/MainWindow.xaml.cs @@ -3,10 +3,11 @@ // See the LICENSE file in the project root for more information. using System; +using System.Drawing; +using System.Linq; using System.Threading; using System.Windows; using System.Windows.Interop; - using ManagedCommon; using Microsoft.PowerToys.Telemetry; using WorkspacesEditor.Utils; @@ -30,9 +31,9 @@ namespace WorkspacesEditor MainViewModel = mainViewModel; mainViewModel.SetMainWindow(this); - if (Properties.Settings.Default.Height == -1) + if (Properties.Settings.Default.Height == -1 || !IsEditorInsideVisibleArea()) { - // This is the very first time the window is created. Place it on the screen center + // This is the very first time the window is created or it would be placed outside the visible area (monitor rearrangement). Place it on the screen center WindowInteropHelper windowInteropHelper = new WindowInteropHelper(this); System.Windows.Forms.Screen screen = System.Windows.Forms.Screen.FromHandle(windowInteropHelper.Handle); double dpi = MonitorHelper.GetScreenDpiFromScreen(screen); @@ -88,6 +89,20 @@ namespace WorkspacesEditor cancellationToken.Token); } + private bool IsEditorInsideVisibleArea() + { + System.Windows.Forms.Screen[] allScreens = MonitorHelper.GetDpiUnawareScreens(); + Rectangle commonBounds = allScreens[0].Bounds; + for (int screenIndex = 1; screenIndex < allScreens.Length; screenIndex++) + { + Rectangle rectangle = allScreens[screenIndex].Bounds; + commonBounds = Rectangle.Union(rectangle, commonBounds); + } + + Rectangle editorBounds = new Rectangle((int)Properties.Settings.Default.Left, (int)Properties.Settings.Default.Top, (int)Properties.Settings.Default.Width, (int)Properties.Settings.Default.Height); + return editorBounds.IntersectsWith(commonBounds); + } + private void SavePosition() { if (WindowState == WindowState.Maximized)