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()); } } }