From 4790916fb12ef4a975307a31acda28ea023058fb Mon Sep 17 00:00:00 2001 From: Vlad Zahorodnii Date: Mon, 18 Jul 2022 11:23:54 +0300 Subject: [PATCH] x11: Fix shading with non-zero border There was a geometry change that fixed mixing the next and current geometries. While it did fix issues on wayland, it broke window shading on x11 because of an obscure resize() call. That obscure resize() had a side-effect that ensures m_clientGeometry has the right value so the next time the window is unshaded, implicitSize() will return a good value. In order to make window size computation more robust, this change makes X11Window compute the natural frame size based on cached size in m_client, which shouldn't change when the window is shaded. However, given how buggy window shading is and how difficult it is to make it work right, I think that it's better to deprecate window shading and remove it in some future release. BUG: 450582 --- src/window.cpp | 9 --------- src/window.h | 1 - src/x11window.cpp | 13 +++++++++++-- src/x11window.h | 1 + 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/window.cpp b/src/window.cpp index d81ffc9b7c..7c4310ec33 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -4225,15 +4225,6 @@ void Window::checkOffscreenPosition(QRectF *geom, const QRectF &screenArea) } } -/** - * Returns the natural size of the window, if the window is not shaded it's the same - * as size(). - */ -QSizeF Window::implicitSize() const -{ - return clientSizeToFrameSize(clientSize()); -} - /** * Constrains the client size @p size according to a set of the window's size hints. * diff --git a/src/window.h b/src/window.h index 16b3cadb20..d8386d416a 100644 --- a/src/window.h +++ b/src/window.h @@ -1147,7 +1147,6 @@ public: virtual QSizeF constrainClientSize(const QSizeF &size, SizeMode mode = SizeModeAny) const; QSizeF constrainFrameSize(const QSizeF &size, SizeMode mode = SizeModeAny) const; - QSizeF implicitSize() const; /** * Calculates the matching client position for the given frame position @p point. diff --git a/src/x11window.cpp b/src/x11window.cpp index b159ceedef..6eb0f6daf8 100644 --- a/src/x11window.cpp +++ b/src/x11window.cpp @@ -1156,7 +1156,7 @@ void X11Window::createDecoration(const QRectF &oldgeom) } setDecoration(decoration); - moveResize(QRectF(calculateGravitation(false), implicitSize())); + moveResize(QRectF(calculateGravitation(false), clientSizeToFrameSize(clientSize()))); maybeCreateX11DecorationRenderer(); Q_EMIT geometryShapeChanged(this, oldgeom); } @@ -1168,7 +1168,7 @@ void X11Window::destroyDecoration() QPointF grav = calculateGravitation(true); setDecoration(nullptr); maybeDestroyX11DecorationRenderer(); - moveResize(QRectF(grav, implicitSize())); + moveResize(QRectF(grav, clientSizeToFrameSize(clientSize()))); if (!isZombie()) { Q_EMIT geometryShapeChanged(this, oldgeom); } @@ -2697,6 +2697,15 @@ QRectF X11Window::frameRectToBufferRect(const QRectF &rect) const return frameRectToClientRect(rect); } +/** + * Returns the natural size of the window, if the window is not shaded it's the same + * as size(). + */ +QSizeF X11Window::implicitSize() const +{ + return clientSizeToFrameSize(m_client.geometry().size()); +} + QMatrix4x4 X11Window::inputTransformation() const { QMatrix4x4 matrix; diff --git a/src/x11window.h b/src/x11window.h index b9bca1615e..b0a9a648b0 100644 --- a/src/x11window.h +++ b/src/x11window.h @@ -110,6 +110,7 @@ public: QSizeF frameSizeToClientSize(const QSizeF &size) const override; QSizeF clientSizeToFrameSize(const QSizeF &size) const override; QRectF frameRectToBufferRect(const QRectF &rect) const; + QSizeF implicitSize() const; QMatrix4x4 inputTransformation() const override;