diff --git a/decorations/decorationrenderer.cpp b/decorations/decorationrenderer.cpp --- a/decorations/decorationrenderer.cpp +++ b/decorations/decorationrenderer.cpp @@ -20,6 +20,7 @@ #include "decorationrenderer.h" #include "decoratedclient.h" #include "deleted.h" +#include "abstract_client.h" #include #include @@ -38,6 +39,9 @@ , m_imageSizesDirty(true) { auto markImageSizesDirty = [this]{ m_imageSizesDirty = true; }; + if (kwinApp()->operationMode() != Application::OperationModeX11) { + connect(client->client(), &AbstractClient::screenChanged, 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); diff --git a/plugins/scenes/qpainter/scene_qpainter.cpp b/plugins/scenes/qpainter/scene_qpainter.cpp --- a/plugins/scenes/qpainter/scene_qpainter.cpp +++ b/plugins/scenes/qpainter/scene_qpainter.cpp @@ -594,19 +594,23 @@ resetImageSizesDirty(); } - const QRect top(QPoint(0, 0), m_images[int(DecorationPart::Top)].size()); - const QRect left(QPoint(0, top.height()), m_images[int(DecorationPart::Left)].size()); - const QRect right(QPoint(top.width() - m_images[int(DecorationPart::Right)].size().width(), top.height()), m_images[int(DecorationPart::Right)].size()); - const QRect bottom(QPoint(0, left.y() + left.height()), m_images[int(DecorationPart::Bottom)].size()); + auto imageSize = [this](DecorationPart part) { + return m_images[int(part)].size() / m_images[int(part)].devicePixelRatio(); + }; + + const QRect top(QPoint(0, 0), imageSize(DecorationPart::Top)); + const QRect left(QPoint(0, top.height()), imageSize(DecorationPart::Left)); + const QRect right(QPoint(top.width() - imageSize(DecorationPart::Right).width(), top.height()), imageSize(DecorationPart::Right)); + const QRect bottom(QPoint(0, left.y() + left.height()), imageSize(DecorationPart::Bottom)); const QRect geometry = scheduled.boundingRect(); auto renderPart = [this](const QRect &rect, const QRect &partRect, int index) { if (rect.isEmpty()) { return; } QPainter painter(&m_images[index]); painter.setRenderHint(QPainter::Antialiasing); - painter.setWindow(partRect); + painter.setWindow(QRect(partRect.topLeft(), partRect.size() * m_images[index].devicePixelRatio())); painter.setClipRect(rect); painter.save(); // clear existing part @@ -628,8 +632,12 @@ client()->client()->layoutDecorationRects(left, top, right, bottom); auto checkAndCreate = [this](int index, const QSize &size) { - if (m_images[index].size() != size) { - m_images[index] = QImage(size, QImage::Format_ARGB32_Premultiplied); + auto dpr = screens()->scale(client()->client()->screen()); + if (m_images[index].size() != size * dpr || + m_images[index].devicePixelRatio() != dpr) + { + m_images[index] = QImage(size * dpr, QImage::Format_ARGB32_Premultiplied); + m_images[index].setDevicePixelRatio(dpr); m_images[index].fill(Qt::transparent); } };