diff --git a/CHANGELOG.md b/CHANGELOG.md index d6d20fd95..cbc624a3a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -37,6 +37,7 @@ - Bugfix: Fixed viewer list not closing after pressing escape key. (#3734) - Bugfix: Fixed links with no thumbnail having previous link's thumbnail. (#3720) - Bugfix: Add icon in the CMake macOS bundle. (#3832) +- Bugfix: Adopt popup windows in order to force floating behavior on some window managers. (#3836) - Dev: Rewrite LimitedQueue (#3798) - Dev: Overhaul highlight system by moving all checks into a Controller allowing for easier tests. (#3399, #3801) - Dev: Use Game Name returned by Get Streams instead of querying it from the Get Games API. (#3662) diff --git a/src/singletons/WindowManager.cpp b/src/singletons/WindowManager.cpp index 81d2af113..32b8e4856 100644 --- a/src/singletons/WindowManager.cpp +++ b/src/singletons/WindowManager.cpp @@ -244,11 +244,31 @@ Window &WindowManager::getSelectedWindow() return *this->selectedWindow_; } -Window &WindowManager::createWindow(WindowType type, bool show) +Window &WindowManager::createWindow(WindowType type, bool show, QWidget *parent) { assertInGuiThread(); - auto *window = new Window(type); + auto *const realParent = [this, type, parent]() -> QWidget * { + if (parent) + { + // If a parent is explicitly specified, we use that immediately. + return parent; + } + + if (type == WindowType::Popup) + { + // On some window managers, popup windows require a parent to behave correctly. See + // https://github.com/Chatterino/chatterino2/pull/1843 for additional context. + return &(this->getMainWindow()); + } + + // If no parent is set and something other than a popup window is being created, we fall + // back to the default behavior of no parent. + return nullptr; + }(); + + auto *window = new Window(type, realParent); + this->windows_.push_back(window); if (show) { diff --git a/src/singletons/WindowManager.hpp b/src/singletons/WindowManager.hpp index c3d7c75f5..ba401985b 100644 --- a/src/singletons/WindowManager.hpp +++ b/src/singletons/WindowManager.hpp @@ -57,7 +57,8 @@ public: Window &getMainWindow(); Window &getSelectedWindow(); - Window &createWindow(WindowType type, bool show = true); + Window &createWindow(WindowType type, bool show = true, + QWidget *parent = nullptr); void select(Split *split); void select(SplitContainer *container); diff --git a/src/widgets/Window.cpp b/src/widgets/Window.cpp index 5b6d38e18..8640276f4 100644 --- a/src/widgets/Window.cpp +++ b/src/widgets/Window.cpp @@ -43,8 +43,8 @@ namespace chatterino { -Window::Window(WindowType type) - : BaseWindow(BaseWindow::EnableCustomFrame) +Window::Window(WindowType type, QWidget *parent) + : BaseWindow(BaseWindow::EnableCustomFrame, parent) , type_(type) , notebook_(new SplitNotebook(this)) { diff --git a/src/widgets/Window.hpp b/src/widgets/Window.hpp index 245f0d887..d99747591 100644 --- a/src/widgets/Window.hpp +++ b/src/widgets/Window.hpp @@ -21,7 +21,7 @@ class Window : public BaseWindow Q_OBJECT public: - explicit Window(WindowType type); + explicit Window(WindowType type, QWidget *parent); WindowType getType(); SplitNotebook &getNotebook();