Commit bd52b679 authored by Vlad Zahorodnii's avatar Vlad Zahorodnii
Browse files

Schedule a decoration repaint when client is resized

If a client has been resized, it doesn't necessarily mean that the
decoration theme will schedule full repaint of the window frame. In
OpenGL and Xrender scene, we have a little hack that forces a full
repaint of window borders. However, we don't have one in QPainter
scene which causes all sorts of weird looking artifacts when resizing
a server-side decorated client.

We could add yet another hack in the QPainter scene, but a better
approach to tackle this problem would be to make DecoratedClient
schedule a full repaint of the decoration. It makes code in scene
plugins more straightforward and prevents us from repeating the same
mistake again.

Test Plan:
No longer able to see invisible decoration borders when
using QPainter render backend.

Reviewers: #kwin, davidedmundson

Reviewed By: #kwin, davidedmundson

Subscribers: davidedmundson, kwin

Tags: #kwin

Differential Revision:
parent 82757857
......@@ -40,12 +40,12 @@ Renderer::Renderer(DecoratedClientImpl *client)
, m_imageSizesDirty(true)
auto markImageSizesDirty = [this]{
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;
......@@ -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()) {
if (dirty) {
if (areImageSizesDirty()) {
......@@ -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);
......@@ -1229,7 +1229,6 @@ void SceneXRenderDecorationRenderer::render()
if (areImageSizesDirty()) {
scheduled = client()->client()->decorationRect();
const QRect top(QPoint(0, 0), m_sizes[int(DecorationPart::Top)]);
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment