diff --git a/autotests/integration/generic_scene_opengl_test.cpp b/autotests/integration/generic_scene_opengl_test.cpp index 006effa476..f89a6560a2 100644 --- a/autotests/integration/generic_scene_opengl_test.cpp +++ b/autotests/integration/generic_scene_opengl_test.cpp @@ -64,7 +64,6 @@ void GenericSceneOpenGLTest::initTestCase() QVERIFY(Compositor::self()); QCOMPARE(Compositor::self()->backend()->compositingType(), KWin::OpenGLCompositing); - QCOMPARE(kwinApp()->platform()->selectedCompositor(), KWin::OpenGLCompositing); } void GenericSceneOpenGLTest::testRestart() @@ -77,7 +76,6 @@ void GenericSceneOpenGLTest::testRestart() } QCOMPARE(sceneCreatedSpy.count(), 1); QCOMPARE(Compositor::self()->backend()->compositingType(), KWin::OpenGLCompositing); - QCOMPARE(kwinApp()->platform()->selectedCompositor(), KWin::OpenGLCompositing); // trigger a repaint KWin::Compositor::self()->scene()->addRepaintFull(); diff --git a/autotests/integration/scene_qpainter_test.cpp b/autotests/integration/scene_qpainter_test.cpp index 1e1c8d4e85..0800c266eb 100644 --- a/autotests/integration/scene_qpainter_test.cpp +++ b/autotests/integration/scene_qpainter_test.cpp @@ -105,7 +105,6 @@ void SceneQPainterTest::testStartFrame() Compositor::self()->scene()->addRepaintFull(); auto scene = Compositor::self()->scene(); QVERIFY(scene); - QCOMPARE(kwinApp()->platform()->selectedCompositor(), QPainterCompositing); QSignalSpy frameRenderedSpy(scene, &Scene::frameRendered); QVERIFY(frameRenderedSpy.wait()); // now let's render a reference image for comparison diff --git a/src/backends/drm/drm_backend.cpp b/src/backends/drm/drm_backend.cpp index 59834eb347..aafb9c40ea 100644 --- a/src/backends/drm/drm_backend.cpp +++ b/src/backends/drm/drm_backend.cpp @@ -372,9 +372,6 @@ void DrmBackend::sceneInitialized() QVector DrmBackend::supportedCompositors() const { - if (selectedCompositor() != NoCompositing) { - return {selectedCompositor()}; - } return QVector{OpenGLCompositing, QPainterCompositing}; } diff --git a/src/backends/virtual/virtual_backend.h b/src/backends/virtual/virtual_backend.h index 9ee762ac2e..66e83e6a8f 100644 --- a/src/backends/virtual/virtual_backend.h +++ b/src/backends/virtual/virtual_backend.h @@ -47,9 +47,6 @@ public: QVector supportedCompositors() const override { - if (selectedCompositor() != NoCompositing) { - return {selectedCompositor()}; - } return QVector{OpenGLCompositing, QPainterCompositing}; } diff --git a/src/backends/wayland/wayland_backend.cpp b/src/backends/wayland/wayland_backend.cpp index ed4bc60f89..3b54ab2f65 100644 --- a/src/backends/wayland/wayland_backend.cpp +++ b/src/backends/wayland/wayland_backend.cpp @@ -909,9 +909,6 @@ bool WaylandBackend::pointerIsLocked() QVector WaylandBackend::supportedCompositors() const { - if (selectedCompositor() != NoCompositing) { - return {selectedCompositor()}; - } #if HAVE_WAYLAND_EGL return QVector{OpenGLCompositing, QPainterCompositing}; #else diff --git a/src/backends/x11/windowed/x11_windowed_backend.h b/src/backends/x11/windowed/x11_windowed_backend.h index 4e2ebf5cd5..634fc4c49e 100644 --- a/src/backends/x11/windowed/x11_windowed_backend.h +++ b/src/backends/x11/windowed/x11_windowed_backend.h @@ -121,9 +121,6 @@ public: QVector supportedCompositors() const override { - if (selectedCompositor() != NoCompositing) { - return {selectedCompositor()}; - } return QVector{OpenGLCompositing, QPainterCompositing}; } diff --git a/src/composite.cpp b/src/composite.cpp index 3fe325d300..73fa7511c6 100644 --- a/src/composite.cpp +++ b/src/composite.cpp @@ -254,19 +254,25 @@ bool Compositor::setupStart() Q_EMIT aboutToToggleCompositing(); - auto supportedCompositors = kwinApp()->platform()->supportedCompositors(); - const auto userConfigIt = std::find(supportedCompositors.begin(), supportedCompositors.end(), - options->compositingMode()); + const QVector availableCompositors = kwinApp()->platform()->supportedCompositors(); + QVector candidateCompositors; - if (userConfigIt != supportedCompositors.end()) { - supportedCompositors.erase(userConfigIt); - supportedCompositors.prepend(options->compositingMode()); + // If compositing has been restarted, try to use the last used compositing type. + if (m_selectedCompositor != NoCompositing) { + candidateCompositors.append(m_selectedCompositor); } else { - qCWarning(KWIN_CORE) - << "Configured compositor not supported by Platform. Falling back to defaults"; + candidateCompositors = availableCompositors; + + const auto userConfigIt = std::find(candidateCompositors.begin(), candidateCompositors.end(), options->compositingMode()); + if (userConfigIt != candidateCompositors.end()) { + candidateCompositors.erase(userConfigIt); + candidateCompositors.prepend(options->compositingMode()); + } else { + qCWarning(KWIN_CORE) << "Configured compositor not supported by Platform. Falling back to defaults"; + } } - for (auto type : qAsConst(supportedCompositors)) { + for (auto type : qAsConst(candidateCompositors)) { bool stop = false; switch (type) { case OpenGLCompositing: @@ -299,7 +305,7 @@ bool Compositor::setupStart() m_selectionOwner->setOwning(false); m_selectionOwner->release(); } - if (!supportedCompositors.contains(NoCompositing)) { + if (!availableCompositors.contains(NoCompositing)) { qCCritical(KWIN_CORE) << "The used windowing system requires compositing"; qCCritical(KWIN_CORE) << "We are going to quit KWin now as it is broken"; qApp->quit(); @@ -307,7 +313,7 @@ bool Compositor::setupStart() return false; } - kwinApp()->platform()->setSelectedCompositor(m_backend->compositingType()); + m_selectedCompositor = m_backend->compositingType(); if (!Workspace::self() && m_backend && m_backend->compositingType() == QPainterCompositing) { // Force Software QtQuick on first startup with QPainter. diff --git a/src/composite.h b/src/composite.h index 7842027b97..747e4aaa25 100644 --- a/src/composite.h +++ b/src/composite.h @@ -156,6 +156,7 @@ private: std::unique_ptr m_scene; std::unique_ptr m_backend; QHash m_superlayers; + CompositingType m_selectedCompositor = NoCompositing; }; class KWIN_EXPORT WaylandCompositor final : public Compositor diff --git a/src/core/platform.h b/src/core/platform.h index 8a2bc33bf5..8899557440 100644 --- a/src/core/platform.h +++ b/src/core/platform.h @@ -293,25 +293,6 @@ public: */ virtual QString supportInformation() const; - /** - * The compositor plugin which got selected from @ref supportedCompositors. - * Prior to selecting a compositor this returns @c NoCompositing. - * - * This method allows the platforms to limit the offerings in @ref supportedCompositors - * in case they do not support runtime compositor switching - */ - CompositingType selectedCompositor() const - { - return m_selectedCompositor; - } - /** - * Used by Compositor to set the used compositor. - */ - void setSelectedCompositor(CompositingType type) - { - m_selectedCompositor = type; - } - virtual Output *createVirtualOutput(const QString &name, const QSize &size, qreal scale); virtual void removeVirtualOutput(Output *output); @@ -366,7 +347,6 @@ private: EGLDisplay m_eglDisplay; EGLContext m_globalShareContext = EGL_NO_CONTEXT; bool m_supportsGammaControl = false; - CompositingType m_selectedCompositor = NoCompositing; }; } // namespace KWin