diff --git a/src/plugins/platforms/wayland/qwaylanddisplay.cpp b/src/plugins/platforms/wayland/qwaylanddisplay.cpp index 03ec75a6036..1c399765ec9 100644 --- a/src/plugins/platforms/wayland/qwaylanddisplay.cpp +++ b/src/plugins/platforms/wayland/qwaylanddisplay.cpp @@ -421,9 +421,9 @@ void QWaylandDisplay::reconnect() qDeleteAll(mWaitingScreens); mWaitingScreens.clear(); - const auto screens = std::exchange(mScreens, {}); - ensureScreen(); - for (QWaylandScreen *screen : screens) { + while (!mScreens.isEmpty()) { + auto screen = mScreens.takeLast(); + ensureScreen(); QWindowSystemInterface::handleScreenRemoved(screen); } diff --git a/tests/auto/wayland/reconnect/tst_reconnect.cpp b/tests/auto/wayland/reconnect/tst_reconnect.cpp index 2b6c7558fd6..f0090d1f40a 100644 --- a/tests/auto/wayland/reconnect/tst_reconnect.cpp +++ b/tests/auto/wayland/reconnect/tst_reconnect.cpp @@ -101,7 +101,7 @@ private Q_SLOTS: //core void cleanup() { QTRY_VERIFY2(m_comp->isClean(), qPrintable(m_comp->dirtyMessage())); } void basicWindow(); - void screens(); + void multipleScreens(); //input void keyFocus(); @@ -142,12 +142,25 @@ void tst_WaylandReconnect::basicWindow() QCOMPOSITOR_TRY_VERIFY(m_comp->xdgToplevel()); } -void tst_WaylandReconnect::screens() +void tst_WaylandReconnect::multipleScreens() { - QRasterWindow window; - window.resize(64, 48); - window.show(); - QCOMPOSITOR_TRY_VERIFY(m_comp->xdgToplevel()); + + exec([this] { m_comp->add(); }); + QRasterWindow window1; + window1.resize(64, 48); + window1.show(); + QRasterWindow window2; + window2.resize(64, 48); + window2.show(); + QCOMPOSITOR_TRY_VERIFY(m_comp->xdgToplevel(0)); + QCOMPOSITOR_TRY_VERIFY(m_comp->xdgToplevel(1)); + + // ensure they are on different outputs + exec([this] { + m_comp->surface(0)->sendEnter(m_comp->output(0)); + m_comp->surface(1)->sendEnter(m_comp->output(1)); + }); + QTRY_VERIFY(window1.screen() != window2.screen()); auto originalScreens = QGuiApplication::screens(); @@ -162,8 +175,13 @@ void tst_WaylandReconnect::screens() originalScreens.removeOne(screen[0].value()); } QVERIFY(originalScreens.isEmpty()); - QVERIFY(window.screen()); - QVERIFY(QGuiApplication::screens().contains(window.screen())); + + QCOMPOSITOR_TRY_VERIFY(m_comp->xdgToplevel(0)); + QCOMPOSITOR_TRY_VERIFY(m_comp->xdgToplevel(1)); + QVERIFY(window1.screen()); + QVERIFY(window2.screen()); + QVERIFY(QGuiApplication::screens().contains(window1.screen())); + QVERIFY(QGuiApplication::screens().contains(window2.screen())); } void tst_WaylandReconnect::keyFocus()