diff --git a/autotests/client/test_wayland_surface.cpp b/autotests/client/test_wayland_surface.cpp --- a/autotests/client/test_wayland_surface.cpp +++ b/autotests/client/test_wayland_surface.cpp @@ -53,6 +53,7 @@ void testInput(); void testScale(); void testDestroy(); + void testUnmapOfNotMappedSurface(); private: KWayland::Server::Display *m_display; @@ -706,5 +707,30 @@ s->destroy(); } +void TestWaylandSurface::testUnmapOfNotMappedSurface() +{ + // this test verifies that a surface which doesn't have a buffer attached doesn't trigger the unmapped signal + using namespace KWayland::Client; + using namespace KWayland::Server; + // create surface + QSignalSpy serverSurfaceCreated(m_compositorInterface, &CompositorInterface::surfaceCreated); + QVERIFY(serverSurfaceCreated.isValid()); + QScopedPointer s(m_compositor->createSurface()); + QVERIFY(serverSurfaceCreated.wait()); + SurfaceInterface *serverSurface = serverSurfaceCreated.first().first().value(); + + QSignalSpy unmappedSpy(serverSurface, &SurfaceInterface::unmapped); + QVERIFY(unmappedSpy.isValid()); + QSignalSpy scaleChanged(serverSurface, &SurfaceInterface::scaleChanged); + + // let's map a null buffer and change scale to trigger a signal we can wait for + s->attachBuffer(Buffer::Ptr()); + s->setScale(2); + s->commit(Surface::CommitFlag::None); + + QVERIFY(scaleChanged.wait()); + QVERIFY(unmappedSpy.isEmpty()); +} + QTEST_GUILESS_MAIN(TestWaylandSurface) #include "test_wayland_surface.moc" diff --git a/src/server/surface_interface.cpp b/src/server/surface_interface.cpp --- a/src/server/surface_interface.cpp +++ b/src/server/surface_interface.cpp @@ -238,7 +238,7 @@ void SurfaceInterface::Private::swapStates(State *source, State *target, bool emitChanged) { Q_Q(SurfaceInterface); - const bool bufferChanged = source->bufferIsSet; + bool bufferChanged = source->bufferIsSet; const bool opaqueRegionChanged = source->opaqueIsSet; const bool inputRegionChanged = source->inputIsSet; const bool scaleFactorChanged = source->scaleIsSet && (target->scale != source->scale); @@ -271,6 +271,10 @@ const QSize newSize = source->buffer->size(); sizeChanged = newSize.isValid() && newSize != oldSize; } + if (!target->buffer && !source->buffer && emitChanged) { + // null buffer set on a not mapped surface, don't emit unmapped + bufferChanged = false; + } buffer = source->buffer; } // copy values