From f6a1a44efeba79339bdb114ef9a36a9ba865e64b Mon Sep 17 00:00:00 2001 From: John Preston Date: Sat, 20 Mar 2021 15:16:50 +0400 Subject: [PATCH] Fix maximize/restore button state in TitleWidget. --- ui/platform/ui_platform_window_title.cpp | 43 ++++++++++++++---------- ui/platform/ui_platform_window_title.h | 1 + 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/ui/platform/ui_platform_window_title.cpp b/ui/platform/ui_platform_window_title.cpp index 8a2d5f5..1a5b406 100644 --- a/ui/platform/ui_platform_window_title.cpp +++ b/ui/platform/ui_platform_window_title.cpp @@ -122,29 +122,36 @@ void TitleControls::init(Fn maximize) { updateControlsPosition(); }, _close->lifetime()); - const auto winIdEventFilter = std::make_shared(nullptr); - *winIdEventFilter = base::install_event_filter( - window(), - [=](not_null e) { - if (!*winIdEventFilter || e->type() != QEvent::WinIdChange) { - return base::EventFilterResult::Continue; - } - - QObject::connect( - window()->windowHandle(), - &QWindow::windowStateChanged, - [=](Qt::WindowState state) { - handleWindowStateChanged(state); - }); - - base::take(*winIdEventFilter)->deleteLater(); - return base::EventFilterResult::Continue; - }); + subscribeToStateChanges(); _activeState = parent()->isActiveWindow(); updateButtonsState(); } +void TitleControls::subscribeToStateChanges() { + const auto subscribe = [=] { + QObject::connect( + window()->windowHandle(), + &QWindow::windowStateChanged, + [=](Qt::WindowState state) { handleWindowStateChanged(state); }); + }; + if (window()->windowHandle()) { + subscribe(); + } else { + const auto winIdEventFilter = std::make_shared(nullptr); + *winIdEventFilter = base::install_event_filter( + window(), + [=](not_null e) { + if (!*winIdEventFilter || e->type() != QEvent::WinIdChange) { + return base::EventFilterResult::Continue; + } + subscribe(); + base::take(*winIdEventFilter)->deleteLater(); + return base::EventFilterResult::Continue; + }); + } +} + void TitleControls::setResizeEnabled(bool enabled) { _resizeEnabled = enabled; updateControlsPosition(); diff --git a/ui/platform/ui_platform_window_title.h b/ui/platform/ui_platform_window_title.h index af66155..f8373ad 100644 --- a/ui/platform/ui_platform_window_title.h +++ b/ui/platform/ui_platform_window_title.h @@ -54,6 +54,7 @@ private: [[nodiscard]] Ui::IconButton *controlWidget(Control control) const; void init(Fn maximize); + void subscribeToStateChanges(); void updateButtonsState(); void updateControlsPosition(); void updateControlsPositionBySide(