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 @@ -1076,6 +1076,12 @@ QVERIFY(enteredSpy.wait()); QCOMPARE(enteredSpy.count(), 2); QCOMPARE(leftSpy.count(), 1); + + //test the client handles a misbehaving server that removes a display before updating clients + m_display->removeOutput(serverOutput); + QCOMPARE(leftSpy.count(), 1); + QVERIFY(s->outputs().isEmpty()); + } QTEST_GUILESS_MAIN(TestWaylandSurface) diff --git a/src/client/surface.cpp b/src/client/surface.cpp --- a/src/client/surface.cpp +++ b/src/client/surface.cpp @@ -184,6 +184,13 @@ return; } s->outputs << o; + QObject::connect(o, &Output::removed, s->q, [s, o]() { + if (!s->outputs.contains(o)) { + return; + } + s->outputs.removeOne(o); + s->q->outputLeft(o); + }); emit s->q->outputEntered(o); }