diff --git a/CHANGELOG.md b/CHANGELOG.md index cf42311a82c..c3e847494fc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ - Dev: Fix clang-tidy `cppcoreguidelines-pro-type-member-init` warnings. (#4426) - Dev: Immediate layout for invisible `ChannelView`s is skipped. (#4811) - Dev: Refactor `Image` & Image's `Frames`. (#4773) +- Dev: Add `WindowManager::getLastSelectedWindow()` to replace `getMainWindow()`. (#4816) - Dev: Clarify signal connection lifetimes where applicable. (#4818) ## 2.4.5 diff --git a/src/singletons/WindowManager.cpp b/src/singletons/WindowManager.cpp index 1fc7bf29245..0565184fe13 100644 --- a/src/singletons/WindowManager.cpp +++ b/src/singletons/WindowManager.cpp @@ -243,11 +243,15 @@ Window &WindowManager::getMainWindow() return *this->mainWindow_; } -Window &WindowManager::getSelectedWindow() +Window *WindowManager::getLastSelectedWindow() const { assertInGuiThread(); + if (this->selectedWindow_ == nullptr) + { + return this->mainWindow_; + } - return *this->selectedWindow_; + return this->selectedWindow_; } Window &WindowManager::createWindow(WindowType type, bool show, QWidget *parent) diff --git a/src/singletons/WindowManager.hpp b/src/singletons/WindowManager.hpp index ba7cc5a4c93..b9cc00f3af9 100644 --- a/src/singletons/WindowManager.hpp +++ b/src/singletons/WindowManager.hpp @@ -65,7 +65,14 @@ class WindowManager final : public Singleton void repaintGifEmotes(); Window &getMainWindow(); - Window &getSelectedWindow(); + + // Returns a pointer to the last selected window. + // Edge cases: + // - If the application was not focused since the start, this will return a pointer to the main window. + // - If the window was closed this points to the main window. + // - If the window was unfocused since being selected, this function will still return it. + Window *getLastSelectedWindow() const; + Window &createWindow(WindowType type, bool show = true, QWidget *parent = nullptr); @@ -153,6 +160,8 @@ class WindowManager final : public Singleton QTimer *saveTimer; QTimer miscUpdateTimer_; + + friend class Window; // this is for selectedWindow_ }; } // namespace chatterino diff --git a/src/widgets/Window.cpp b/src/widgets/Window.cpp index 504ee746ee2..9e11f0c9efa 100644 --- a/src/widgets/Window.cpp +++ b/src/widgets/Window.cpp @@ -103,8 +103,10 @@ bool Window::event(QEvent *event) { switch (event->type()) { - case QEvent::WindowActivate: + case QEvent::WindowActivate: { + getApp()->windows->selectedWindow_ = this; break; + } case QEvent::WindowDeactivate: { auto page = this->notebook_->getOrAddSelectedPage(); @@ -142,6 +144,11 @@ void Window::closeEvent(QCloseEvent *) app->windows->closeAll(); } + // Ensure selectedWindow_ is never an invalid pointer. + // WindowManager will return the main window if no window is pointed to by + // `selectedWindow_`. + getApp()->windows->selectedWindow_ = nullptr; + this->closed.invoke(); if (this->type_ == WindowType::Main)