FancyZones: allow windows with invisible or zero-sized owner to be zonable (#1216)

This commit is contained in:
Bartosz Sosnowski 2020-02-05 12:27:51 +01:00 committed by GitHub
parent 5089729b18
commit ed35a143ec
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -593,13 +593,33 @@ LRESULT CALLBACK FancyZones::s_WndProc(HWND window, UINT message, WPARAM wparam,
DefWindowProc(window, message, wparam, lparam);
}
static bool HasVisibleOwner(HWND window) noexcept
{
auto owner = GetWindow(window, GW_OWNER);
if (owner == nullptr)
{
return false; // There is no owner at all
}
if (!IsWindowVisible(owner))
{
return false; // Owner is invisible
}
RECT rect;
if (!GetWindowRect(owner, &rect))
{
return true; // Could not get the rect, return true (and filter out the window) just in case
}
// Return false (and allow the window to be zonable) if the owner window size is zero
return rect.top != rect.bottom || rect.left != rect.right;
}
bool FancyZones::IsInterestingWindow(HWND window) noexcept
{
auto style = GetWindowLongPtr(window, GWL_STYLE);
auto exStyle = GetWindowLongPtr(window, GWL_EXSTYLE);
// Ignore:
if (GetAncestor(window, GA_ROOT) != window || // windows that are not top-level
GetWindow(window, GW_OWNER) != nullptr || // windows that have an owner - like Save As dialogs
HasVisibleOwner(window) || // windows that have an visible owner - like Save As dialogs
(style & WS_CHILD) != 0 || // windows that are child elements of other windows - like buttons
(style & WS_DISABLED) != 0 || // windows that are disabled
(exStyle & WS_EX_TOOLWINDOW) != 0 || // toolbar windows