mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-04-09 20:57:22 +02:00
Fancy zones preserve size of non-resizable windows (#1974)
* fancy zones preserve size of non-resizable windows * Changed the method of determining if window is resizable * minor merge fix
This commit is contained in:
committed by
GitHub
parent
fa515604dc
commit
17022d50d4
@@ -68,7 +68,7 @@ void Zone::SizeWindowToZone(HWND window, HWND zoneWindow) noexcept
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Take care of 1px border
|
// Take care of 1px border
|
||||||
RECT zoneRect = m_zoneRect;
|
RECT newWindowRect = m_zoneRect;
|
||||||
|
|
||||||
RECT windowRect{};
|
RECT windowRect{};
|
||||||
::GetWindowRect(window, &windowRect);
|
::GetWindowRect(window, &windowRect);
|
||||||
@@ -82,29 +82,35 @@ void Zone::SizeWindowToZone(HWND window, HWND zoneWindow) noexcept
|
|||||||
const auto left_margin = frameRect.left - windowRect.left;
|
const auto left_margin = frameRect.left - windowRect.left;
|
||||||
const auto right_margin = frameRect.right - windowRect.right;
|
const auto right_margin = frameRect.right - windowRect.right;
|
||||||
const auto bottom_margin = frameRect.bottom - windowRect.bottom;
|
const auto bottom_margin = frameRect.bottom - windowRect.bottom;
|
||||||
zoneRect.left -= left_margin;
|
newWindowRect.left -= left_margin;
|
||||||
zoneRect.right -= right_margin;
|
newWindowRect.right -= right_margin;
|
||||||
zoneRect.bottom -= bottom_margin;
|
newWindowRect.bottom -= bottom_margin;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Map to screen coords
|
// Map to screen coords
|
||||||
MapWindowRect(zoneWindow, nullptr, &zoneRect);
|
MapWindowRect(zoneWindow, nullptr, &newWindowRect);
|
||||||
|
|
||||||
MONITORINFO mi{sizeof(mi)};
|
MONITORINFO mi{ sizeof(mi) };
|
||||||
if (GetMonitorInfoW(MonitorFromWindow(zoneWindow, MONITOR_DEFAULTTONEAREST), &mi))
|
if (GetMonitorInfoW(MonitorFromWindow(zoneWindow, MONITOR_DEFAULTTONEAREST), &mi))
|
||||||
{
|
{
|
||||||
const auto taskbar_left_size = std::abs(mi.rcMonitor.left - mi.rcWork.left);
|
const auto taskbar_left_size = std::abs(mi.rcMonitor.left - mi.rcWork.left);
|
||||||
const auto taskbar_top_size = std::abs(mi.rcMonitor.top - mi.rcWork.top);
|
const auto taskbar_top_size = std::abs(mi.rcMonitor.top - mi.rcWork.top);
|
||||||
OffsetRect(&zoneRect, -taskbar_left_size, -taskbar_top_size);
|
OffsetRect(&newWindowRect, -taskbar_left_size, -taskbar_top_size);
|
||||||
if (accountForUnawareness)
|
if (accountForUnawareness)
|
||||||
{
|
{
|
||||||
zoneRect.left = max(mi.rcMonitor.left, zoneRect.left);
|
newWindowRect.left = max(mi.rcMonitor.left, newWindowRect.left);
|
||||||
zoneRect.right = min(mi.rcMonitor.right - taskbar_left_size, zoneRect.right);
|
newWindowRect.right = min(mi.rcMonitor.right - taskbar_left_size, newWindowRect.right);
|
||||||
zoneRect.top = max(mi.rcMonitor.top, zoneRect.top);
|
newWindowRect.top = max(mi.rcMonitor.top, newWindowRect.top);
|
||||||
zoneRect.bottom = min(mi.rcMonitor.bottom - taskbar_top_size, zoneRect.bottom);
|
newWindowRect.bottom = min(mi.rcMonitor.bottom - taskbar_top_size, newWindowRect.bottom);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((::GetWindowLong(window, GWL_STYLE) & WS_SIZEBOX) == 0)
|
||||||
|
{
|
||||||
|
newWindowRect.right = newWindowRect.left + (windowRect.right - windowRect.left);
|
||||||
|
newWindowRect.bottom = newWindowRect.top + (windowRect.bottom - windowRect.top);
|
||||||
|
}
|
||||||
|
|
||||||
WINDOWPLACEMENT placement{};
|
WINDOWPLACEMENT placement{};
|
||||||
::GetWindowPlacement(window, &placement);
|
::GetWindowPlacement(window, &placement);
|
||||||
|
|
||||||
@@ -121,7 +127,7 @@ void Zone::SizeWindowToZone(HWND window, HWND zoneWindow) noexcept
|
|||||||
placement.showCmd = SW_RESTORE | SW_SHOWNA;
|
placement.showCmd = SW_RESTORE | SW_SHOWNA;
|
||||||
}
|
}
|
||||||
|
|
||||||
placement.rcNormalPosition = zoneRect;
|
placement.rcNormalPosition = newWindowRect;
|
||||||
placement.flags |= WPF_ASYNCWINDOWPLACEMENT;
|
placement.flags |= WPF_ASYNCWINDOWPLACEMENT;
|
||||||
|
|
||||||
::SetWindowPlacement(window, &placement);
|
::SetWindowPlacement(window, &placement);
|
||||||
|
|||||||
Reference in New Issue
Block a user