From e33efb7f107c7b415f52633af68a020aa39ee58e Mon Sep 17 00:00:00 2001 From: Laszlo Nemeth <57342539+donlaci@users.noreply.github.com> Date: Tue, 18 Feb 2025 17:03:34 +0100 Subject: [PATCH] [Workspaces] Fix case: monitor not present at launch (#37005) * [Workspaces] Fix case: monitor not present at launch * Fix DPI multiplicator calculation when monitor not present --- .../WorkspacesWindowArranger/WindowArranger.cpp | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/modules/Workspaces/WorkspacesWindowArranger/WindowArranger.cpp b/src/modules/Workspaces/WorkspacesWindowArranger/WindowArranger.cpp index 2726022889..37b24b231f 100644 --- a/src/modules/Workspaces/WorkspacesWindowArranger/WindowArranger.cpp +++ b/src/modules/Workspaces/WorkspacesWindowArranger/WindowArranger.cpp @@ -62,11 +62,10 @@ namespace PlacementHelper else { placement.showCmd = SW_RESTORE; - - ScreenToWorkAreaCoords(window, monitor, rect); - placement.rcNormalPosition = rect; } + ScreenToWorkAreaCoords(window, monitor, rect); + placement.rcNormalPosition = rect; placement.flags |= WPF_ASYNCWINDOWPLACEMENT; auto result = ::SetWindowPlacement(window, &placement); @@ -430,9 +429,11 @@ bool WindowArranger::moveWindow(HWND window, const WorkspacesData::WorkspacesPro Logger::error(L"No monitor saved for launching the app"); return false; } + UINT snapDPI = snapMonitorIter->dpi; bool launchMinimized = app.isMinimized; bool launchMaximized = app.isMaximized; + RECT rect = app.position.toRect(); HMONITOR currentMonitor{}; UINT currentDpi = DPIAware::DEFAULT_DPI; @@ -446,12 +447,18 @@ bool WindowArranger::moveWindow(HWND window, const WorkspacesData::WorkspacesPro { currentMonitor = MonitorFromPoint(POINT{ 0, 0 }, MONITOR_DEFAULTTOPRIMARY); DPIAware::GetScreenDPIForMonitor(currentMonitor, currentDpi); + snapDPI = DPIAware::DEFAULT_DPI; launchMinimized = true; launchMaximized = false; + MONITORINFOEX monitorInfo; + monitorInfo.cbSize = sizeof(monitorInfo); + if (GetMonitorInfo(currentMonitor, &monitorInfo)) + { + rect = monitorInfo.rcWork; + } } - RECT rect = app.position.toRect(); - float mult = static_cast(snapMonitorIter->dpi) / currentDpi; + float mult = static_cast(snapDPI) / currentDpi; rect.left = static_cast(std::round(rect.left * mult)); rect.right = static_cast(std::round(rect.right * mult)); rect.top = static_cast(std::round(rect.top * mult));