diff --git a/autotests/integration/kwin_wayland_test.h b/autotests/integration/kwin_wayland_test.h --- a/autotests/integration/kwin_wayland_test.h +++ b/autotests/integration/kwin_wayland_test.h @@ -76,7 +76,7 @@ void createBackend(); void continueStartupWithScreens(); void continueStartupWithScene(); - void continueStartupWithXwayland(); + void finalizeStartup(); Xwl::Xwayland *m_xwayland = nullptr; }; diff --git a/autotests/integration/kwin_wayland_test.cpp b/autotests/integration/kwin_wayland_test.cpp --- a/autotests/integration/kwin_wayland_test.cpp +++ b/autotests/integration/kwin_wayland_test.cpp @@ -126,33 +126,35 @@ { disconnect(kwinApp()->platform(), &Platform::screensQueried, this, &WaylandTestApplication::continueStartupWithScreens); createScreens(); - - if (operationMode() == OperationModeWaylandOnly) { - createCompositor(); - connect(Compositor::self(), &Compositor::sceneCreated, this, &WaylandTestApplication::continueStartupWithScene); - return; - } createCompositor(); - connect(Compositor::self(), &Compositor::sceneCreated, this, &WaylandTestApplication::continueStartupWithXwayland); + connect(Compositor::self(), &Compositor::sceneCreated, this, &WaylandTestApplication::continueStartupWithScene); } -void WaylandTestApplication::continueStartupWithScene() +void WaylandTestApplication::finalizeStartup() { - disconnect(Compositor::self(), &Compositor::sceneCreated, this, &WaylandTestApplication::continueStartupWithScene); + if (m_xwayland) { + disconnect(m_xwayland, &Xwl::Xwayland::initialized, this, &WaylandTestApplication::finalizeStartup); + } createWorkspace(); } -void WaylandTestApplication::continueStartupWithXwayland() +void WaylandTestApplication::continueStartupWithScene() { - disconnect(Compositor::self(), &Compositor::sceneCreated, this, &WaylandTestApplication::continueStartupWithXwayland); + disconnect(Compositor::self(), &Compositor::sceneCreated, this, &WaylandTestApplication::continueStartupWithScene); + + if (operationMode() == OperationModeWaylandOnly) { + finalizeStartup(); + return; + } m_xwayland = new Xwl::Xwayland(this); connect(m_xwayland, &Xwl::Xwayland::criticalError, this, [](int code) { // we currently exit on Xwayland errors always directly // TODO: restart Xwayland std::cerr << "Xwayland had a critical error. Going to exit now." << std::endl; exit(code); }); + connect(m_xwayland, &Xwl::Xwayland::initialized, this, &WaylandTestApplication::finalizeStartup); m_xwayland->init(); } diff --git a/main_wayland.h b/main_wayland.h --- a/main_wayland.h +++ b/main_wayland.h @@ -63,7 +63,7 @@ void createBackend(); void continueStartupWithScreens(); void continueStartupWithScene(); - void continueStartupWithXwayland(); + void finalizeStartup(); void startSession() override; bool m_startXWayland = false; diff --git a/main_wayland.cpp b/main_wayland.cpp --- a/main_wayland.cpp +++ b/main_wayland.cpp @@ -180,35 +180,37 @@ { disconnect(kwinApp()->platform(), &Platform::screensQueried, this, &ApplicationWayland::continueStartupWithScreens); createScreens(); - - if (operationMode() == OperationModeWaylandOnly) { - createCompositor(); - connect(Compositor::self(), &Compositor::sceneCreated, this, &ApplicationWayland::continueStartupWithScene); - return; - } createCompositor(); - connect(Compositor::self(), &Compositor::sceneCreated, this, &ApplicationWayland::continueStartupWithXwayland); + connect(Compositor::self(), &Compositor::sceneCreated, this, &ApplicationWayland::continueStartupWithScene); } -void ApplicationWayland::continueStartupWithScene() +void ApplicationWayland::finalizeStartup() { - disconnect(Compositor::self(), &Compositor::sceneCreated, this, &ApplicationWayland::continueStartupWithScene); + if (m_xwayland) { + disconnect(m_xwayland, &Xwl::Xwayland::initialized, this, &ApplicationWayland::finalizeStartup); + } startSession(); createWorkspace(); notifyKSplash(); } -void ApplicationWayland::continueStartupWithXwayland() +void ApplicationWayland::continueStartupWithScene() { - disconnect(Compositor::self(), &Compositor::sceneCreated, this, &ApplicationWayland::continueStartupWithXwayland); + disconnect(Compositor::self(), &Compositor::sceneCreated, this, &ApplicationWayland::continueStartupWithScene); + + if (operationMode() == OperationModeWaylandOnly) { + finalizeStartup(); + return; + } m_xwayland = new Xwl::Xwayland(this); connect(m_xwayland, &Xwl::Xwayland::criticalError, this, [](int code) { // we currently exit on Xwayland errors always directly // TODO: restart Xwayland std::cerr << "Xwayland had a critical error. Going to exit now." << std::endl; exit(code); }); + connect(m_xwayland, &Xwl::Xwayland::initialized, this, &ApplicationWayland::finalizeStartup); m_xwayland->init(); } diff --git a/xwl/xwayland.h b/xwl/xwayland.h --- a/xwl/xwayland.h +++ b/xwl/xwayland.h @@ -56,6 +56,7 @@ } Q_SIGNALS: + void initialized(); void criticalError(int code); private: diff --git a/xwl/xwayland.cpp b/xwl/xwayland.cpp --- a/xwl/xwayland.cpp +++ b/xwl/xwayland.cpp @@ -262,12 +262,9 @@ env.insert(QStringLiteral("DISPLAY"), QString::fromUtf8(qgetenv("DISPLAY"))); m_app->setProcessStartupEnvironment(env); - m_app->startSession(); - m_app->createWorkspace(); + emit initialized(); Xcb::sync(); // Trigger possible errors, there's still a chance to abort - - m_app->notifyKSplash(); } DragEventReply Xwayland::dragMoveFilter(Toplevel *target, QPoint pos)