From 03b7cb46902a6d1dfcf013bb4ebde0b42273d0f8 Mon Sep 17 00:00:00 2001 From: Seraphima Zykova Date: Wed, 16 Feb 2022 17:00:05 +0300 Subject: [PATCH] [AlwaysOnTop] fix remaining border after window closing (#16268) --- .../alwaysontop/AlwaysOnTop/AlwaysOnTop.cpp | 32 ++++++++++++------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/src/modules/alwaysontop/AlwaysOnTop/AlwaysOnTop.cpp b/src/modules/alwaysontop/AlwaysOnTop/AlwaysOnTop.cpp index c6f711358f..ded13bb920 100644 --- a/src/modules/alwaysontop/AlwaysOnTop/AlwaysOnTop.cpp +++ b/src/modules/alwaysontop/AlwaysOnTop/AlwaysOnTop.cpp @@ -247,12 +247,11 @@ void AlwaysOnTop::RegisterHotkey() const void AlwaysOnTop::SubscribeToEvents() { // subscribe to windows events - std::array events_to_subscribe = { + std::array events_to_subscribe = { EVENT_OBJECT_LOCATIONCHANGE, EVENT_SYSTEM_MINIMIZESTART, EVENT_SYSTEM_MINIMIZEEND, EVENT_SYSTEM_MOVESIZEEND, - EVENT_OBJECT_DESTROY, EVENT_OBJECT_NAMECHANGE }; @@ -330,11 +329,29 @@ bool AlwaysOnTop::IsTracked(HWND window) const noexcept void AlwaysOnTop::HandleWinHookEvent(WinHookEvent* data) noexcept { - if (!AlwaysOnTopSettings::settings().enableFrame) + if (!AlwaysOnTopSettings::settings().enableFrame || !data->hwnd) { return; } + // fix for the https://github.com/microsoft/PowerToys/issues/15300 + // check if the window was closed, since for some EVENT_OBJECT_DESTROY doesn't work + std::vector toErase{}; + for (const auto& [window, border] : m_topmostWindows) + { + bool visible = IsWindowVisible(window); + if (!visible) + { + UnpinTopmostWindow(window); + toErase.push_back(window); + } + } + + for (const auto window : toErase) + { + m_topmostWindows.erase(window); + } + switch (data->event) { case EVENT_OBJECT_LOCATIONCHANGE: @@ -381,15 +398,6 @@ void AlwaysOnTop::HandleWinHookEvent(WinHookEvent* data) noexcept } } break; - case EVENT_OBJECT_DESTROY: - { - auto iter = m_topmostWindows.find(data->hwnd); - if (iter != m_topmostWindows.end()) - { - m_topmostWindows.erase(iter); - } - } - break; case EVENT_OBJECT_NAMECHANGE: { // The accessibility name of the desktop window changes whenever the user