Ensure the complete decoration texture gets repainted on recreation

Summary:
When the decoration size changes the textures get recreated and need to
be properly filled. So far KWin used the scheduled repaint geometry in
this situation. If the decoration didn't schedule the complete geometry
for repain there will be an empty area in the decoration texture.

This change ensures that the complete texture gets repainted when they
are recreated. Thus the decoration rendering is more fault tolerant
towards potential bugs in the decoration. With no-compositing and XRender
compositing this problem was not reproducable and already fault tolerant,
so OpenGL just catches up with the other modes.

BUG: 371735
FIXED-IN: 5.8.3

Reviewers: #kwin, #plasma

Subscribers: plasma-devel, kwin

Tags: #kwin

Differential Revision: https://phabricator.kde.org/D3186
This commit is contained in:
Martin Gräßlin 2016-10-28 11:44:57 +02:00
parent 2e3c6c92e9
commit 37067f538e

View file

@ -2524,7 +2524,8 @@ void SceneOpenGLDecorationRenderer::render()
if (scheduled.isEmpty()) {
return;
}
if (areImageSizesDirty()) {
const bool dirty = areImageSizesDirty();
if (dirty) {
resizeTexture();
resetImageSizesDirty();
}
@ -2537,7 +2538,7 @@ void SceneOpenGLDecorationRenderer::render()
QRect left, top, right, bottom;
client()->client()->layoutDecorationRects(left, top, right, bottom);
const QRect geometry = scheduled.boundingRect();
const QRect geometry = dirty ? QRect(QPoint(0, 0), client()->client()->geometry().size()) : scheduled.boundingRect();
auto renderPart = [this](const QRect &geo, const QRect &partRect, const QPoint &offset, bool rotated = false) {
if (geo.isNull()) {