[AlwaysOnTop] Release/recreate borders instead of hiding/showing (#15733)

This commit is contained in:
Seraphima Zykova
2022-01-26 09:54:54 +03:00
committed by GitHub
parent 941ff0a5a6
commit a1bb281386
5 changed files with 83 additions and 66 deletions

View File

@@ -1220,6 +1220,8 @@ mindaro
Minimatch
Minimizeallwindows
MINIMIZEBOX
MINIMIZEEND
MINIMIZESTART
miniz
minlevel
Miracast

View File

@@ -103,7 +103,7 @@ void AlwaysOnTop::SettingsUpdate(SettingId id)
{
if (!iter.second)
{
AssignBorderTracker(iter.first);
AssignBorder(iter.first);
}
}
}
@@ -119,7 +119,7 @@ void AlwaysOnTop::SettingsUpdate(SettingId id)
case SettingId::ExcludeApps:
{
std::vector<HWND> toErase{};
for (const auto& [window, tracker] : m_topmostWindows)
for (const auto& [window, border] : m_topmostWindows)
{
if (isExcluded(window))
{
@@ -187,14 +187,7 @@ void AlwaysOnTop::ProcessCommand(HWND window)
if (PinTopmostWindow(window))
{
soundType = Sound::Type::On;
if (AlwaysOnTopSettings::settings().enableFrame)
{
AssignBorderTracker(window);
}
else
{
m_topmostWindows[window] = nullptr;
}
AssignBorder(window);
}
}
@@ -236,34 +229,26 @@ void AlwaysOnTop::StartTrackingTopmostWindows()
{
if (IsTopmost(window))
{
if (AlwaysOnTopSettings::settings().enableFrame)
{
AssignBorderTracker(window);
}
else
{
m_topmostWindows[window] = nullptr;
}
AssignBorder(window);
}
}
}
bool AlwaysOnTop::AssignBorderTracker(HWND window)
bool AlwaysOnTop::AssignBorder(HWND window)
{
auto tracker = std::make_unique<WindowBorder>(window);
if (!tracker->Init(m_hinstance))
if (m_virtualDesktopUtils.IsWindowOnCurrentDesktop(window) && AlwaysOnTopSettings::settings().enableFrame)
{
// Failed to init tracker, reset topmost
UnpinTopmostWindow(window);
return false;
auto border = WindowBorder::Create(window, m_hinstance);
if (border)
{
m_topmostWindows[window] = std::move(border);
}
}
if (m_virtualDesktopUtils.IsWindowOnCurrentDesktop(window))
else
{
tracker->Show();
m_topmostWindows[window] = nullptr;
}
m_topmostWindows[window] = std::move(tracker);
return true;
}
@@ -276,10 +261,11 @@ void AlwaysOnTop::RegisterHotkey() const
void AlwaysOnTop::SubscribeToEvents()
{
// subscribe to windows events
std::array<DWORD, 5> events_to_subscribe = {
std::array<DWORD, 6> events_to_subscribe = {
EVENT_OBJECT_LOCATIONCHANGE,
EVENT_SYSTEM_MINIMIZESTART,
EVENT_SYSTEM_MINIMIZEEND,
EVENT_SYSTEM_MOVESIZEEND,
EVENT_SYSTEM_SWITCHEND,
EVENT_OBJECT_DESTROY,
EVENT_OBJECT_NAMECHANGE
};
@@ -300,7 +286,7 @@ void AlwaysOnTop::SubscribeToEvents()
void AlwaysOnTop::UnpinAll()
{
for (const auto& [topWindow, tracker] : m_topmostWindows)
for (const auto& [topWindow, border] : m_topmostWindows)
{
if (!UnpinTopmostWindow(topWindow))
{
@@ -355,13 +341,46 @@ void AlwaysOnTop::HandleWinHookEvent(WinHookEvent* data) noexcept
switch (data->event)
{
case EVENT_OBJECT_LOCATIONCHANGE:
{
auto iter = m_topmostWindows.find(data->hwnd);
if (iter != m_topmostWindows.end())
{
const auto& border = iter->second;
if (border)
{
border->UpdateBorderPosition();
}
}
}
break;
case EVENT_SYSTEM_MINIMIZESTART:
{
auto iter = m_topmostWindows.find(data->hwnd);
if (iter != m_topmostWindows.end())
{
m_topmostWindows[data->hwnd] = nullptr;
}
}
break;
case EVENT_SYSTEM_MINIMIZEEND:
{
auto iter = m_topmostWindows.find(data->hwnd);
if (iter != m_topmostWindows.end())
{
AssignBorder(data->hwnd);
}
}
break;
case EVENT_SYSTEM_MOVESIZEEND:
{
auto iter = m_topmostWindows.find(data->hwnd);
if (iter != m_topmostWindows.end())
{
const auto& tracker = iter->second;
tracker->UpdateBorderPosition();
const auto& border = iter->second;
if (border)
{
border->UpdateBorderPosition();
}
}
}
break;
@@ -374,16 +393,6 @@ void AlwaysOnTop::HandleWinHookEvent(WinHookEvent* data) noexcept
}
}
break;
case EVENT_SYSTEM_SWITCHEND:
{
auto iter = m_topmostWindows.find(data->hwnd);
if (iter != m_topmostWindows.end())
{
const auto& tracker = iter->second;
tracker->Hide();
}
}
break;
case EVENT_OBJECT_NAMECHANGE:
{
// The accessibility name of the desktop window changes whenever the user
@@ -401,15 +410,15 @@ void AlwaysOnTop::HandleWinHookEvent(WinHookEvent* data) noexcept
void AlwaysOnTop::VirtualDesktopSwitchedHandle()
{
for (const auto& [window, tracker] : m_topmostWindows)
for (const auto& [window, border] : m_topmostWindows)
{
if (m_virtualDesktopUtils.IsWindowOnCurrentDesktop(window))
{
tracker->Show();
AssignBorder(window);
}
else
{
tracker->Hide();
m_topmostWindows[window] = nullptr;
}
}
}

View File

@@ -67,7 +67,7 @@ private:
bool PinTopmostWindow(HWND window) const noexcept;
bool UnpinTopmostWindow(HWND window) const noexcept;
bool AssignBorderTracker(HWND window);
bool AssignBorder(HWND window);
virtual void SettingsUpdate(SettingId type) override;

View File

@@ -61,6 +61,17 @@ WindowBorder::~WindowBorder()
}
}
std::unique_ptr<WindowBorder> WindowBorder::Create(HWND window, HINSTANCE hinstance)
{
auto self = std::unique_ptr<WindowBorder>(new WindowBorder(window));
if (self->Init(hinstance))
{
return self;
}
return nullptr;
}
bool WindowBorder::Init(HINSTANCE hinstance)
{
if (!m_trackingWindow)
@@ -118,7 +129,14 @@ bool WindowBorder::Init(HINSTANCE hinstance)
, SWP_NOMOVE | SWP_NOSIZE);
m_frameDrawer = FrameDrawer::Create(m_window);
return m_frameDrawer != nullptr;
if (!m_frameDrawer)
{
return false;
}
UpdateBorderProperties();
m_frameDrawer->Show();
return true;
}
void WindowBorder::UpdateBorderPosition() const
@@ -131,6 +149,7 @@ void WindowBorder::UpdateBorderPosition() const
auto rectOpt = GetFrameRect(m_trackingWindow);
if (!rectOpt.has_value())
{
m_frameDrawer->Hide();
return;
}
@@ -169,17 +188,6 @@ void WindowBorder::UpdateBorderProperties() const
m_frameDrawer->SetBorderRect(frameRect, color, AlwaysOnTopSettings::settings().frameThickness);
}
void WindowBorder::Show() const
{
UpdateBorderProperties();
m_frameDrawer->Show();
}
void WindowBorder::Hide() const
{
m_frameDrawer->Hide();
}
LRESULT WindowBorder::WndProc(UINT message, WPARAM wparam, LPARAM lparam) noexcept
{
switch (message)

View File

@@ -6,16 +6,13 @@ class FrameDrawer;
class WindowBorder : public SettingsObserver
{
public:
WindowBorder(HWND window);
WindowBorder(WindowBorder&& other);
public:
static std::unique_ptr<WindowBorder> Create(HWND window, HINSTANCE hinstance);
~WindowBorder();
bool Init(HINSTANCE hinstance);
void Show() const;
void Hide() const;
void UpdateBorderPosition() const;
void UpdateBorderProperties() const;
@@ -41,5 +38,6 @@ private:
LRESULT WndProc(UINT message, WPARAM wparam, LPARAM lparam) noexcept;
bool Init(HINSTANCE hinstance);
virtual void SettingsUpdate(SettingId id) override;
};