diff --git a/autotests/integration/quick_tiling_test.cpp b/autotests/integration/quick_tiling_test.cpp
index 7fb844c086..7958612d64 100644
--- a/autotests/integration/quick_tiling_test.cpp
+++ b/autotests/integration/quick_tiling_test.cpp
@@ -470,7 +470,7 @@ void QuickTilingTest::testQuickTilingPointerMoveXdgShell()
QCOMPARE(c->quickTileMode(), QuickTileMode(QuickTileFlag::None));
QCOMPARE(c->maximizeMode(), MaximizeRestore);
QVERIFY(configureRequestedSpy.wait());
- QCOMPARE(configureRequestedSpy.count(), 2);
+ QTRY_COMPARE(configureRequestedSpy.count(), 2);
QSignalSpy quickTileChangedSpy(c, &AbstractClient::quickTileModeChanged);
QVERIFY(quickTileChangedSpy.isValid());
@@ -492,9 +492,7 @@ void QuickTilingTest::testQuickTilingPointerMoveXdgShell()
QCOMPARE(quickTileChangedSpy.count(), 1);
QTEST(c->quickTileMode(), "expectedMode");
QVERIFY(configureRequestedSpy.wait());
- QEXPECT_FAIL("", "BUG 388072", Continue);
QCOMPARE(configureRequestedSpy.count(), 4);
- QEXPECT_FAIL("", "BUG 388072", Continue);
QCOMPARE(false, configureRequestedSpy.last().first().toSize().isEmpty());
}
diff --git a/geometry.cpp b/geometry.cpp
index 7885b6b365..d732ee6da4 100644
--- a/geometry.cpp
+++ b/geometry.cpp
@@ -2745,6 +2745,7 @@ bool Client::doStartMoveResize()
void AbstractClient::finishMoveResize(bool cancel)
{
+ GeometryUpdatesBlocker blocker(this);
const bool wasResize = isResize(); // store across leaveMoveResize
leaveMoveResize();
diff --git a/plugins/scenes/opengl/scene_opengl.cpp b/plugins/scenes/opengl/scene_opengl.cpp
index 9a02c26ee0..d225b8e660 100644
--- a/plugins/scenes/opengl/scene_opengl.cpp
+++ b/plugins/scenes/opengl/scene_opengl.cpp
@@ -47,6 +47,7 @@ along with this program. If not, see .
#include "decorations/decoratedclient.h"
#include
+#include
#include
#include
@@ -1358,7 +1359,7 @@ QMatrix4x4 SceneOpenGL2Window::modelViewProjectionMatrix(int mask, const WindowP
return scene->projectionMatrix() * mvMatrix;
}
-static void renderSubSurface(GLShader *shader, const QMatrix4x4 &mvp, const QMatrix4x4 &windowMatrix, OpenGLWindowPixmap *pixmap, const QRegion ®ion, bool hardwareClipping)
+void SceneOpenGL2Window::renderSubSurface(GLShader *shader, const QMatrix4x4 &mvp, const QMatrix4x4 &windowMatrix, OpenGLWindowPixmap *pixmap, const QRegion ®ion, bool hardwareClipping)
{
QMatrix4x4 newWindowMatrix = windowMatrix;
newWindowMatrix.translate(pixmap->subSurface()->position().x(), pixmap->subSurface()->position().y());
@@ -1369,6 +1370,7 @@ static void renderSubSurface(GLShader *shader, const QMatrix4x4 &mvp, const QMat
}
if (!pixmap->texture()->isNull()) {
+ setBlendEnabled(pixmap->buffer() && pixmap->buffer()->hasAlphaChannel());
// render this texture
shader->setUniform(GLShader::ModelViewProjectionMatrix, mvp * newWindowMatrix);
auto texture = pixmap->texture();
@@ -1515,8 +1517,6 @@ void SceneOpenGL2Window::performPaint(int mask, QRegion region, WindowPaintData
vbo->unbindArrays();
- setBlendEnabled(false);
-
// render sub-surfaces
auto wp = windowPixmap();
const auto &children = wp ? wp->children() : QVector();
@@ -1528,6 +1528,8 @@ void SceneOpenGL2Window::performPaint(int mask, QRegion region, WindowPaintData
renderSubSurface(shader, modelViewProjection, windowMatrix, static_cast(pixmap), region, m_hardwareClipping);
}
+ setBlendEnabled(false);
+
if (!data.shader)
ShaderManager::instance()->popShader();
diff --git a/plugins/scenes/opengl/scene_opengl.h b/plugins/scenes/opengl/scene_opengl.h
index 6643dc3537..6453d3b57c 100644
--- a/plugins/scenes/opengl/scene_opengl.h
+++ b/plugins/scenes/opengl/scene_opengl.h
@@ -173,6 +173,8 @@ protected:
bool m_hardwareClipping;
};
+class OpenGLWindowPixmap;
+
class SceneOpenGL2Window : public SceneOpenGL::Window
{
public:
@@ -209,6 +211,7 @@ protected:
virtual void performPaint(int mask, QRegion region, WindowPaintData data);
private:
+ void renderSubSurface(GLShader *shader, const QMatrix4x4 &mvp, const QMatrix4x4 &windowMatrix, OpenGLWindowPixmap *pixmap, const QRegion ®ion, bool hardwareClipping);
/**
* Whether prepareStates enabled blending and restore states should disable again.
**/
diff --git a/shell_client.cpp b/shell_client.cpp
index 5266e082f4..646be6aff2 100644
--- a/shell_client.cpp
+++ b/shell_client.cpp
@@ -293,6 +293,9 @@ void ShellClient::init()
if (m_closing) {
return;
}
+ if (m_requestGeometryBlockCounter != 0 || areGeometryUpdatesBlocked()) {
+ return;
+ }
m_xdgShellSurface->configure(xdgSurfaceStates());
};
configure();
diff --git a/shell_client.h b/shell_client.h
index 3a22acbcf3..205e9caec3 100644
--- a/shell_client.h
+++ b/shell_client.h
@@ -245,6 +245,8 @@ private:
if (m_client->m_requestGeometryBlockCounter == 0) {
if (m_client->m_blockedRequestGeometry.isValid()) {
m_client->requestGeometry(m_client->m_blockedRequestGeometry);
+ } else if (m_client->m_xdgShellSurface) {
+ m_client->m_xdgShellSurface->configure(m_client->xdgSurfaceStates());
}
}
}