diff --git a/decorations/decoratedclient.cpp b/decorations/decoratedclient.cpp index 92fe7b5f17..6e150d8043 100644 --- a/decorations/decoratedclient.cpp +++ b/decorations/decoratedclient.cpp @@ -67,6 +67,7 @@ DecoratedClientImpl::DecoratedClientImpl(AbstractClient *client, KDecoration2::D if (oldSize.height() != m_clientSize.height()) { emit decoratedClient->heightChanged(m_clientSize.height()); } + emit decoratedClient->sizeChanged(m_clientSize); } ); connect(client, &AbstractClient::desktopChanged, this, @@ -273,6 +274,11 @@ int DecoratedClientImpl::height() const return m_clientSize.height(); } +QSize DecoratedClientImpl::size() const +{ + return m_clientSize; +} + bool DecoratedClientImpl::isMaximizedVertically() const { return m_client->requestedMaximizeMode() & MaximizeVertical; diff --git a/decorations/decoratedclient.h b/decorations/decoratedclient.h index 735748a6c4..576b62c3c4 100644 --- a/decorations/decoratedclient.h +++ b/decorations/decoratedclient.h @@ -66,6 +66,7 @@ public: QPalette palette() const override; QColor color(KDecoration2::ColorGroup group, KDecoration2::ColorRole role) const override; bool providesContextHelp() const override; + QSize size() const override; int width() const override; WId windowId() const override; diff --git a/decorations/decorationrenderer.cpp b/decorations/decorationrenderer.cpp index ef753f27c4..5e28e40b71 100644 --- a/decorations/decorationrenderer.cpp +++ b/decorations/decorationrenderer.cpp @@ -40,12 +40,12 @@ Renderer::Renderer(DecoratedClientImpl *client) , m_imageSizesDirty(true) { auto markImageSizesDirty = [this]{ + schedule(m_client->client()->rect()); m_imageSizesDirty = true; }; connect(client->client(), &AbstractClient::screenScaleChanged, this, markImageSizesDirty); connect(client->decoration(), &KDecoration2::Decoration::bordersChanged, this, markImageSizesDirty); - connect(client->decoratedClient(), &KDecoration2::DecoratedClient::widthChanged, this, markImageSizesDirty); - connect(client->decoratedClient(), &KDecoration2::DecoratedClient::heightChanged, this, markImageSizesDirty); + connect(client->decoratedClient(), &KDecoration2::DecoratedClient::sizeChanged, this, markImageSizesDirty); } Renderer::~Renderer() = default; diff --git a/kcmkwin/kwindecoration/declarative-plugin/previewclient.cpp b/kcmkwin/kwindecoration/declarative-plugin/previewclient.cpp index 852d326d09..8319ccb9ae 100644 --- a/kcmkwin/kwindecoration/declarative-plugin/previewclient.cpp +++ b/kcmkwin/kwindecoration/declarative-plugin/previewclient.cpp @@ -111,6 +111,11 @@ PreviewClient::PreviewClient(DecoratedClient *c, Decoration *decoration) connect(this, &PreviewClient::bordersLeftEdgeChanged, this, emitEdgesChanged); connect(this, &PreviewClient::bordersRightEdgeChanged, this, emitEdgesChanged); connect(this, &PreviewClient::bordersBottomEdgeChanged, this, emitEdgesChanged); + auto emitSizeChanged = [this, c]() { + emit c->sizeChanged(c->size()); + }; + connect(this, &PreviewClient::widthChanged, this, emitSizeChanged); + connect(this, &PreviewClient::heightChanged, this, emitSizeChanged); qApp->installEventFilter(this); } @@ -133,6 +138,11 @@ int PreviewClient::height() const return m_height; } +QSize PreviewClient::size() const +{ + return QSize(m_width, m_height); +} + QString PreviewClient::caption() const { return m_caption; diff --git a/kcmkwin/kwindecoration/declarative-plugin/previewclient.h b/kcmkwin/kwindecoration/declarative-plugin/previewclient.h index ced66cadef..c37db74854 100644 --- a/kcmkwin/kwindecoration/declarative-plugin/previewclient.h +++ b/kcmkwin/kwindecoration/declarative-plugin/previewclient.h @@ -90,6 +90,7 @@ public: int width() const override; int height() const override; + QSize size() const override; QPalette palette() const override; QColor color(ColorGroup group, ColorRole role) const override; Qt::Edges adjacentScreenEdges() const override; diff --git a/plugins/scenes/opengl/scene_opengl.cpp b/plugins/scenes/opengl/scene_opengl.cpp index 3b5d2432d0..d15e503174 100644 --- a/plugins/scenes/opengl/scene_opengl.cpp +++ b/plugins/scenes/opengl/scene_opengl.cpp @@ -2562,11 +2562,10 @@ static void clamp(QImage &image, const QRect &viewport) void SceneOpenGLDecorationRenderer::render() { const QRegion scheduled = getScheduled(); - const bool dirty = areImageSizesDirty(); - if (scheduled.isEmpty() && !dirty) { + if (scheduled.isEmpty()) { return; } - if (dirty) { + if (areImageSizesDirty()) { resizeTexture(); resetImageSizesDirty(); } @@ -2579,8 +2578,6 @@ void SceneOpenGLDecorationRenderer::render() QRect left, top, right, bottom; client()->client()->layoutDecorationRects(left, top, right, bottom); - const QRect geometry = dirty ? QRect(QPoint(0, 0), client()->client()->size()) : scheduled.boundingRect(); - // We pad each part in the decoration atlas in order to avoid texture bleeding. const int padding = 1; @@ -2634,6 +2631,8 @@ void SceneOpenGLDecorationRenderer::render() m_texture->update(image, (position + dirtyOffset - viewport.topLeft()) * image.devicePixelRatio()); }; + const QRect geometry = scheduled.boundingRect(); + const QPoint topPosition(padding, padding); const QPoint bottomPosition(padding, topPosition.y() + top.height() + 2 * padding); const QPoint leftPosition(padding, bottomPosition.y() + bottom.height() + 2 * padding); diff --git a/plugins/scenes/xrender/scene_xrender.cpp b/plugins/scenes/xrender/scene_xrender.cpp index 1afeeedcb2..acab174a56 100644 --- a/plugins/scenes/xrender/scene_xrender.cpp +++ b/plugins/scenes/xrender/scene_xrender.cpp @@ -1229,7 +1229,6 @@ void SceneXRenderDecorationRenderer::render() if (areImageSizesDirty()) { resizePixmaps(); resetImageSizesDirty(); - scheduled = client()->client()->decorationRect(); } const QRect top(QPoint(0, 0), m_sizes[int(DecorationPart::Top)]);