diff --git a/abstract_client.h b/abstract_client.h --- a/abstract_client.h +++ b/abstract_client.h @@ -668,8 +668,7 @@ void keepInArea(QRect area, bool partial = false); virtual QSize minSize() const; virtual QSize maxSize() const; - virtual void setGeometry(int x, int y, int w, int h, ForceGeometry_t force = NormalGeometrySet) = 0; - void setGeometry(const QRect& r, ForceGeometry_t force = NormalGeometrySet); + virtual void setGeometry(const QRect &rect, ForceGeometry_t force = NormalGeometrySet) = 0; /// How to resize the window in order to obey constains (mainly aspect ratios) enum Sizemode { SizemodeAny, @@ -1336,11 +1335,6 @@ resizeWithChecks(s.width(), s.height(), force); } -inline void AbstractClient::setGeometry(const QRect& r, ForceGeometry_t force) -{ - setGeometry(r.x(), r.y(), r.width(), r.height(), force); -} - inline const QList& AbstractClient::transients() const { return m_transients; diff --git a/autotests/integration/dont_crash_empty_deco.cpp b/autotests/integration/dont_crash_empty_deco.cpp --- a/autotests/integration/dont_crash_empty_deco.cpp +++ b/autotests/integration/dont_crash_empty_deco.cpp @@ -104,7 +104,7 @@ QVERIFY(client->isDecorated()); // let's set a stupid geometry - client->setGeometry(0, 0, 0, 0); + client->setGeometry(QRect(0, 0, 0, 0)); QCOMPARE(client->geometry(), QRect(0, 0, 0, 0)); // and destroy the window again diff --git a/client.h b/client.h --- a/client.h +++ b/client.h @@ -176,8 +176,7 @@ void updateShape(); - using AbstractClient::setGeometry; - void setGeometry(int x, int y, int w, int h, ForceGeometry_t force = NormalGeometrySet) override; + void setGeometry(const QRect &rect, ForceGeometry_t force = NormalGeometrySet) override; /// plainResize() simply resizes void plainResize(int w, int h, ForceGeometry_t force = NormalGeometrySet); void plainResize(const QSize& s, ForceGeometry_t force = NormalGeometrySet); diff --git a/geometry.cpp b/geometry.cpp --- a/geometry.cpp +++ b/geometry.cpp @@ -1839,7 +1839,7 @@ newy = newy + height() - h; break; } - setGeometry(newx, newy, w, h, force); + setGeometry(QRect(newx, newy, w, h), force); } // _NET_MOVERESIZE_WINDOW @@ -1918,7 +1918,7 @@ /** * Reimplemented to inform the client about the new window position. */ -void Client::setGeometry(int x, int y, int w, int h, ForceGeometry_t force) +void Client::setGeometry(const QRect &rect, ForceGeometry_t force) { // this code is also duplicated in Client::plainResize() // Ok, the shading geometry stuff. Generally, code doesn't care about shaded geometry, @@ -1932,25 +1932,28 @@ // Such code is wrong and should be changed to handle the case when the window is shaded, // for example using Client::clientSize() + const QMargins frameMargins(borderLeft(), borderTop(), borderRight(), borderBottom()); + + QRect geometry = rect; + if (shade_geometry_change) ; // nothing else if (isShade()) { - if (h == borderTop() + borderBottom()) { + if (geometry.height() == borderTop() + borderBottom()) { qCDebug(KWIN_CORE) << "Shaded geometry passed for size:"; } else { - client_size = QSize(w - borderLeft() - borderRight(), h - borderTop() - borderBottom()); - h = borderTop() + borderBottom(); + client_size = rect.marginsRemoved(frameMargins).size(); + geometry.setHeight(borderTop() + borderBottom()); } } else { - client_size = QSize(w - borderLeft() - borderRight(), h - borderTop() - borderBottom()); + client_size = rect.marginsRemoved(frameMargins).size(); } - QRect g(x, y, w, h); - if (!areGeometryUpdatesBlocked() && g != rules()->checkGeometry(g)) { - qCDebug(KWIN_CORE) << "forced geometry fail:" << g << ":" << rules()->checkGeometry(g); + if (!areGeometryUpdatesBlocked() && geometry != rules()->checkGeometry(geometry)) { + qCDebug(KWIN_CORE) << "forced geometry fail:" << geometry << ":" << rules()->checkGeometry(geometry); } - if (force == NormalGeometrySet && geom == g && pendingGeometryUpdate() == PendingGeometryNone) + if (force == NormalGeometrySet && geom == geometry && pendingGeometryUpdate() == PendingGeometryNone) return; - geom = g; + geom = geometry; if (areGeometryUpdatesBlocked()) { if (pendingGeometryUpdate() == PendingGeometryForced) {} // maximum, nothing needed @@ -1964,7 +1967,7 @@ bool resized = (geometryBeforeUpdateBlocking().size() != geom.size() || pendingGeometryUpdate() == PendingGeometryForced); if (resized) { resizeDecoration(); - m_frame.setGeometry(x, y, w, h); + m_frame.setGeometry(geometry); if (!isShade()) { QSize cs = clientSize(); m_wrapper.setGeometry(QRect(clientPos(), cs)); @@ -1980,14 +1983,14 @@ if (compositing()) // Defer the X update until we leave this mode needsXWindowMove = true; else - m_frame.move(x, y); // sendSyntheticConfigureNotify() on finish shall be sufficient + m_frame.move(geometry.topLeft()); // sendSyntheticConfigureNotify() on finish shall be sufficient } else { - m_frame.move(x, y); + m_frame.move(geometry.topLeft()); sendSyntheticConfigureNotify(); } // Unconditionally move the input window: it won't affect rendering - m_decoInputExtent.move(QPoint(x, y) + inputPos()); + m_decoInputExtent.move(geometry.topLeft() + inputPos()); } updateWindowRules(Rules::Position|Rules::Size); @@ -2001,7 +2004,7 @@ // - maximize mode is changed to MaximizeRestore, when size unchanged // which can happen when untabbing maximized windows if (resized) { - if (oldClientSize != QSize(w,h)) + if (oldClientSize != geometry.size()) discardWindowPixmap(); } emit geometryShapeChanged(this, geometryBeforeUpdateBlocking()); diff --git a/shell_client.h b/shell_client.h --- a/shell_client.h +++ b/shell_client.h @@ -107,8 +107,7 @@ bool dockWantsInput() const override; using AbstractClient::resizeWithChecks; void resizeWithChecks(int w, int h, ForceGeometry_t force = NormalGeometrySet) override; - using AbstractClient::setGeometry; - void setGeometry(int x, int y, int w, int h, ForceGeometry_t force = NormalGeometrySet) override; + void setGeometry(const QRect &rect, ForceGeometry_t force = NormalGeometrySet) override; bool hasStrut() const override; quint32 windowId() const override { diff --git a/shell_client.cpp b/shell_client.cpp --- a/shell_client.cpp +++ b/shell_client.cpp @@ -652,9 +652,9 @@ blockGeometryUpdates(false); } -void ShellClient::setGeometry(int x, int y, int w, int h, ForceGeometry_t force) +void ShellClient::setGeometry(const QRect &rect, ForceGeometry_t force) { - const QRect newGeometry = rules()->checkGeometry(QRect(x, y, w, h)); + const QRect newGeometry = rules()->checkGeometry(rect); if (areGeometryUpdatesBlocked()) { // when the GeometryUpdateBlocker exits the current geom is passed to setGeometry