diff --git a/src/controllers/DockWidget.h b/src/controllers/DockWidget.h index c7997235..26c3ab9f 100644 --- a/src/controllers/DockWidget.h +++ b/src/controllers/DockWidget.h @@ -117,7 +117,7 @@ public: * call setWidget(A) followed by setWidget(B) then A will have to be deleted by you, while B is * owned by the dock widget. */ - virtual void setGuestView(std::shared_ptr guest); + void setGuestView(std::shared_ptr guest); /// @brief Like widget() but returns a view std::shared_ptr guestView() const; diff --git a/src/controllers/FloatingWindow.cpp b/src/controllers/FloatingWindow.cpp index f0a715e0..e22fd46d 100644 --- a/src/controllers/FloatingWindow.cpp +++ b/src/controllers/FloatingWindow.cpp @@ -441,9 +441,9 @@ Qt::WindowState FloatingWindow::windowStateOverride() const { Qt::WindowState state = Qt::WindowNoState; - if (isMaximizedOverride()) + if (view()->isMaximized()) state = Qt::WindowMaximized; - else if (isMinimizedOverride()) + else if (view()->isMinimized()) state = Qt::WindowMinimized; return state; @@ -521,11 +521,11 @@ bool FloatingWindow::deserialize(const LayoutSaver::FloatingWindow &fw) updateTitleBarVisibility(); if (fw.windowState & Qt::WindowMaximized) { - showMaximized(); + view()->showMaximized(); } else if (fw.windowState & Qt::WindowMinimized) { - showMinimized(); + view()->showMinimized(); } else { - showNormal(); + view()->showNormal(); } return true; @@ -539,7 +539,7 @@ LayoutSaver::FloatingWindow FloatingWindow::serialize() const LayoutSaver::FloatingWindow fw; fw.geometry = geometry(); - fw.normalGeometry = normalGeometry(); + fw.normalGeometry = view()->normalGeometry(); fw.isVisible = isVisible(); fw.multiSplitterLayout = dropArea()->serialize(); fw.screenIndex = Platform::instance()->screenNumberFor(view()); @@ -627,36 +627,6 @@ QMargins FloatingWindow::contentMargins() const return { 4, 4, 4, 4 }; } -bool FloatingWindow::isMaximizedOverride() const -{ - return view()->isMaximized(); -} - -bool FloatingWindow::isMinimizedOverride() const -{ - return view()->isMinimized(); -} - -void FloatingWindow::showMaximized() -{ - view()->showMaximized(); -} - -void FloatingWindow::showNormal() -{ - view()->showNormal(); -} - -void FloatingWindow::showMinimized() -{ - view()->showMinimized(); -} - -QRect FloatingWindow::normalGeometry() const -{ - return view()->normalGeometry(); -} - Qt::WindowState FloatingWindow::lastWindowManagerState() const { return m_lastWindowManagerState; diff --git a/src/controllers/FloatingWindow.h b/src/controllers/FloatingWindow.h index 5fa1760b..f99030fd 100644 --- a/src/controllers/FloatingWindow.h +++ b/src/controllers/FloatingWindow.h @@ -170,40 +170,6 @@ public: ///@brief Returns the contents margins QMargins contentMargins() const; - ///@brief Allows the user to override QWindow::isMaximized() - /// Needed to workaround window managers that don't support maximizing/minimizing Qt::Tool windows. - /// By default this just calls QWindow::isMaximized() - /// @sa QTBUG-95478 - virtual bool isMaximizedOverride() const; - - ///@brief Allows the user to override QWindow::isMinimized() - /// Needed to workaround window managers that don't support maximizing/minimizing Qt::Tool windows. - /// By default this just calls QWindow::isMinimized() - /// @sa QTBUG-95478 - virtual bool isMinimizedOverride() const; - - ///@brief By default equivalent to QWindow::showMaximized() - /// But allows the user to override it and workaround exotic window manager bugs - /// @sa QTBUG-95478 - virtual void showMaximized(); - - ///@brief By default equivalent to QWindow::showNormal() - /// But allows the user to override it and workaround exotic window manager bugs - /// @sa QTBUG-95478 - virtual void showNormal(); - - ///@brief By default equivalent to QWindow::showMinimized() - /// But allows the user to override it and workaround exotic window manager bugs - /// @sa QTBUG-95478 - virtual void showMinimized(); - - ///@brief By default equivalent to QWidget::normalGeometry() - /// Derived classes can implement something different here, to workaround window manager issues with Qt::Tool - /// Also useful for QtQuick to eventually preserve normal geometry upon save/restore of a maximized window. As - /// QWindow has no notion of normal geometry, so we need to implement it here. - /// @sa QTBUG-95478 - virtual QRect normalGeometry() const; - // The state reported by QWidget is not always the same as what the // window manager thinks, due to the async nature. This method // returns the last state reported by the window manager itself. diff --git a/src/controllers/TitleBar.cpp b/src/controllers/TitleBar.cpp index 4b4f05d2..e6e22779 100644 --- a/src/controllers/TitleBar.cpp +++ b/src/controllers/TitleBar.cpp @@ -264,7 +264,7 @@ void TitleBar::updateMaximizeButton() TitleBarButtonType type = TitleBarButtonType::Maximize; if (auto fw = floatingWindow()) { - type = fw->isMaximizedOverride() ? TitleBarButtonType::Normal + type = fw->view()->isMaximized() ? TitleBarButtonType::Normal : TitleBarButtonType::Maximize; visible = supportsMaximizeButton(); @@ -288,10 +288,10 @@ void TitleBar::toggleMaximized() if (!m_floatingWindow) return; - if (m_floatingWindow->isMaximizedOverride()) - m_floatingWindow->showNormal(); + if (m_floatingWindow->view()->isMaximized()) + m_floatingWindow->view()->showNormal(); else - m_floatingWindow->showMaximized(); + m_floatingWindow->view()->showMaximized(); } bool TitleBar::isOverlayed() const @@ -447,7 +447,7 @@ void TitleBar::onMinimizeClicked() return; } - m_floatingWindow->showMinimized(); + m_floatingWindow->view()->showMinimized(); } void TitleBar::onAutoHideClicked() diff --git a/src/private/DragController.cpp b/src/private/DragController.cpp index 8721f913..9d694e7c 100644 --- a/src/private/DragController.cpp +++ b/src/private/DragController.cpp @@ -318,11 +318,11 @@ void StateDragging::onEntry() auto fw = q->m_windowBeingDragged->floatingWindow(); #ifdef Q_OS_LINUX - if (fw->isMaximizedOverride()) { + if (fw->view()->isMaximized()) { // When dragging a maximized window on linux we need to restore its normal size // On Windows this works already. On macOS I don't see this feature at all - const QRect normalGeometry = fw->normalGeometry(); + const QRect normalGeometry = fw->view()->normalGeometry(); // distance to the left edge of the window: const int leftOffset = q->m_offset.x(); @@ -332,7 +332,7 @@ void StateDragging::onEntry() const bool leftEdgeIsNearest = leftOffset <= rightOffset; - fw->showNormal(); + fw->view()->showNormal(); if (!normalGeometry.contains(q->m_pressPos)) { if ((leftEdgeIsNearest && leftOffset > normalGeometry.width()) || (!leftEdgeIsNearest && rightOffset > normalGeometry.width())) { diff --git a/src/qtwidgets/views/TitleBar_qtwidgets.cpp b/src/qtwidgets/views/TitleBar_qtwidgets.cpp index 679ac6d9..0ef8979a 100644 --- a/src/qtwidgets/views/TitleBar_qtwidgets.cpp +++ b/src/qtwidgets/views/TitleBar_qtwidgets.cpp @@ -160,6 +160,7 @@ void TitleBar_qtwidgets::init() connect(m_titleBar, &Controllers::TitleBar::floatButtonVisibleChanged, m_floatButton, &QWidget::setVisible); connect(m_titleBar, &Controllers::TitleBar::autoHideButtonChanged, this, &TitleBar_qtwidgets::updateAutoHideButton); connect(m_titleBar, &Controllers::TitleBar::minimizeButtonChanged, this, &TitleBar_qtwidgets::updateMinimizeButton); + connect(m_titleBar, &Controllers::TitleBar::maximizeButtonChanged, this, &TitleBar_qtwidgets::updateMaximizeButton); m_floatButton->setVisible(m_titleBar->floatButtonVisible()); m_floatButton->setToolTip(m_titleBar->floatButtonToolTip()); diff --git a/tests/qtwidgets/tst_qtwidgets.cpp b/tests/qtwidgets/tst_qtwidgets.cpp index c32a94ca..e3e330f4 100644 --- a/tests/qtwidgets/tst_qtwidgets.cpp +++ b/tests/qtwidgets/tst_qtwidgets.cpp @@ -1368,8 +1368,8 @@ void TestQtWidgets::tst_restoreFloatingMaximizedState() EnsureTopLevelsDeleted e; KDDockWidgets::Config::self().setFlags(KDDockWidgets::Config::Flag_TitleBarHasMaximizeButton); auto dock1 = createDockWidget("dock1", Platform::instance()->tests_createView({ true })); - const QRect originalNormalGeometry = dock1->floatingWindow()->normalGeometry(); - dock1->floatingWindow()->showMaximized(); + const QRect originalNormalGeometry = dock1->floatingWindow()->view()->normalGeometry(); + dock1->floatingWindow()->view()->showMaximized(); qDebug() << originalNormalGeometry; QCOMPARE(dock1->floatingWindow()->view()->window()->windowState(), Qt::WindowMaximized); @@ -1380,12 +1380,10 @@ void TestQtWidgets::tst_restoreFloatingMaximizedState() saver.restoreLayout(saved); QCOMPARE(dock1->floatingWindow()->view()->window()->windowState(), Qt::WindowMaximized); + QCOMPARE(dock1->floatingWindow()->view()->normalGeometry(), originalNormalGeometry); - - QCOMPARE(dock1->floatingWindow()->normalGeometry(), originalNormalGeometry); - - dock1->floatingWindow()->showNormal(); - QCOMPARE(dock1->floatingWindow()->normalGeometry(), originalNormalGeometry); + dock1->floatingWindow()->view()->showNormal(); + QCOMPARE(dock1->floatingWindow()->view()->normalGeometry(), originalNormalGeometry); } void TestQtWidgets::tst_complex() diff --git a/tests/tst_docks.cpp b/tests/tst_docks.cpp index 2bf99b1e..b770a434 100644 --- a/tests/tst_docks.cpp +++ b/tests/tst_docks.cpp @@ -629,7 +629,7 @@ void TestDocks::tst_restoreFloatingMinimizedState() { EnsureTopLevelsDeleted e; auto dock1 = createDockWidget("dock1", Platform::instance()->tests_createView({ true, {}, QSize(100, 100) })); - dock1->floatingWindow()->showMinimized(); + dock1->floatingWindow()->view()->showMinimized(); QCOMPARE(dock1->floatingWindow()->view()->window()->windowState(), Qt::WindowMinimized);