diff --git a/src/window.cpp b/src/window.cpp index 8b12aa1900..58bcbefd39 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -1581,23 +1581,28 @@ void Window::blockGeometryUpdates(bool block) } void Window::maximize(MaximizeMode m) -{ - setMaximize(m & MaximizeVertical, m & MaximizeHorizontal); -} - -void Window::setMaximize(bool vertically, bool horizontally) { const MaximizeMode oldMode = requestedMaximizeMode(); - changeMaximize( - oldMode & MaximizeHorizontal ? !horizontally : horizontally, - oldMode & MaximizeVertical ? !vertically : vertically); + changeMaximize(m); const MaximizeMode newMode = maximizeMode(); if (oldMode != newMode) { Q_EMIT clientMaximizedStateChanged(this, newMode); - Q_EMIT clientMaximizedStateChanged(this, horizontally, vertically); + Q_EMIT clientMaximizedStateChanged(this, newMode & MaximizeHorizontal, newMode & MaximizeVertical); } } +void Window::setMaximize(bool vertically, bool horizontally) +{ + MaximizeMode mode = MaximizeRestore; + if (vertically) { + mode = MaximizeMode(mode | MaximizeVertical); + } + if (horizontally) { + mode = MaximizeMode(mode | MaximizeHorizontal); + } + maximize(mode); +} + bool Window::startInteractiveMoveResize() { Q_ASSERT(!isInteractiveMoveResize()); @@ -4333,15 +4338,9 @@ void Window::setGeometryRestore(const QRectF &rect) m_maximizeGeometryRestore = rect; } -/** - * Toggles the maximized state along specified dimensions @p horizontal and @p vertical. - * - * Default implementation does nothing. - */ -void Window::changeMaximize(bool horizontal, bool vertical) +void Window::changeMaximize(MaximizeMode mode) { - Q_UNUSED(horizontal) - Q_UNUSED(vertical) + Q_UNUSED(mode) qCWarning(KWIN_CORE, "%s doesn't support setting maximized state", metaObject()->className()); } diff --git a/src/window.h b/src/window.h index a1b65a0268..dd0c76753a 100644 --- a/src/window.h +++ b/src/window.h @@ -1721,7 +1721,7 @@ protected: int borderRight() const; int borderTop() const; int borderBottom() const; - virtual void changeMaximize(bool horizontal, bool vertical); + virtual void changeMaximize(MaximizeMode mode); void setGeometryRestore(const QRectF &rect); void blockGeometryUpdates(bool block); diff --git a/src/x11window.cpp b/src/x11window.cpp index 4888794314..8e66afcadc 100644 --- a/src/x11window.cpp +++ b/src/x11window.cpp @@ -4265,7 +4265,7 @@ void X11Window::updateServerGeometry() } static bool changeMaximizeRecursion = false; -void X11Window::changeMaximize(bool horizontal, bool vertical) +void X11Window::changeMaximize(MaximizeMode mode) { if (changeMaximizeRecursion) { return; @@ -4286,13 +4286,6 @@ void X11Window::changeMaximize(bool horizontal, bool vertical) } MaximizeMode old_mode = max_mode; - MaximizeMode mode = max_mode; - if (vertical) { - mode = MaximizeMode(mode ^ MaximizeVertical); - } - if (horizontal) { - mode = MaximizeMode(mode ^ MaximizeHorizontal); - } // if the client insist on a fix aspect ratio, we check whether the maximizing will get us // out of screen bounds and take that as a "full maximization with aspect check" then @@ -4323,16 +4316,16 @@ void X11Window::changeMaximize(bool horizontal, bool vertical) GeometryUpdatesBlocker blocker(this); - Q_EMIT clientMaximizedStateAboutToChange(this, mode); - max_mode = mode; - // maximing one way and unmaximizing the other way shouldn't happen, // so restore first and then maximize the other way - if ((old_mode == MaximizeVertical && max_mode == MaximizeHorizontal) - || (old_mode == MaximizeHorizontal && max_mode == MaximizeVertical)) { - changeMaximize(false, false); // restore + if ((old_mode == MaximizeVertical && mode == MaximizeHorizontal) + || (old_mode == MaximizeHorizontal && mode == MaximizeVertical)) { + changeMaximize(MaximizeRestore); // restore } + Q_EMIT clientMaximizedStateAboutToChange(this, mode); + max_mode = mode; + // save sizes for restoring, if maximalizing QSizeF sz; if (isShade()) { diff --git a/src/x11window.h b/src/x11window.h index 00889c9ff1..8dc82cd92b 100644 --- a/src/x11window.h +++ b/src/x11window.h @@ -392,7 +392,7 @@ private: bool isManaged() const; ///< Returns false if this client is not yet managed void updateAllowedActions(bool force = false); QRect fullscreenMonitorsArea(NETFullscreenMonitors topology) const; - void changeMaximize(bool horizontal, bool vertical) override; + void changeMaximize(MaximizeMode mode) override; void getWmNormalHints(); void getMotifHints(); void getIcons(); diff --git a/src/xdgshellwindow.cpp b/src/xdgshellwindow.cpp index 0939ed1636..75b15a28d1 100644 --- a/src/xdgshellwindow.cpp +++ b/src/xdgshellwindow.cpp @@ -1642,7 +1642,7 @@ void XdgToplevelWindow::setFullScreen(bool set, bool user) * \todo Move to Window. */ static bool changeMaximizeRecursion = false; -void XdgToplevelWindow::changeMaximize(bool horizontal, bool vertical) +void XdgToplevelWindow::changeMaximize(MaximizeMode mode) { if (changeMaximizeRecursion) { return; @@ -1657,14 +1657,6 @@ void XdgToplevelWindow::changeMaximize(bool horizontal, bool vertical) const MaximizeMode oldMode = m_requestedMaximizeMode; const QRectF oldGeometry = moveResizeGeometry(); - MaximizeMode mode = m_requestedMaximizeMode; - if (vertical) { - mode = MaximizeMode(mode ^ MaximizeVertical); - } - if (horizontal) { - mode = MaximizeMode(mode ^ MaximizeHorizontal); - } - mode = rules()->checkMaximize(mode); if (m_requestedMaximizeMode == mode) { return; diff --git a/src/xdgshellwindow.h b/src/xdgshellwindow.h index ecb8ba8148..a4bfdef027 100644 --- a/src/xdgshellwindow.h +++ b/src/xdgshellwindow.h @@ -180,7 +180,7 @@ protected: bool doStartInteractiveMoveResize() override; void doFinishInteractiveMoveResize() override; bool acceptsFocus() const override; - void changeMaximize(bool horizontal, bool vertical) override; + void changeMaximize(MaximizeMode mode) override; Layer layerForDock() const override; void doSetQuickTileMode() override;