[plasma/plasma-login-manager] src/frontend/wallpaper: frontend/wallpaper: Copy greeter code to fix wallpaper missing on display unplug/replug

Oliver Beard <[email protected]>
Newsgroups gmane.comp.kde.cvs
Message-ID <[email protected]>
Git commit c7ae34bb1e852ac8c9117f140a788a190146809c by Oliver Beard.
Committed on 23/07/2026 at 17:11.
Pushed by olib into branch 'master'.

frontend/wallpaper: Copy greeter code to fix wallpaper missing on display unplug/replug

Resolves an issue where display unplug/replug has the greeter appear correctly, but the wallpaper fails to do so and as such the background is black.

Unsure what specifically fixes it, but now that the code is structured much more similarly, it is ultimately cleaner and easier to work on both.

M  +46   -23   src/frontend/wallpaper/wallpaperapp.cpp
M  +1    -4    src/frontend/wallpaper/wallpaperapp.h
M  +1    -38   src/frontend/wallpaper/wallpaperwindow.cpp
M  +3    -3    src/frontend/wallpaper/wallpaperwindow.h

https://invent.kde.org/plasma/plasma-login-manager/-/commit/c7ae34bb1e852ac8c9117f140a788a190146809c

diff --git a/src/frontend/wallpaper/wallpaperapp.cpp b/src/frontend/wallpaper/wallpaperapp.cpp
index b41ede53..cdb2a10e 100644
--- a/src/frontend/wallpaper/wallpaperapp.cpp
+++ b/src/frontend/wallpaper/wallpaperapp.cpp
@@ -19,6 +19,7 @@
 #include <KLocalizedQmlContext>
 #include <KPackage/PackageLoader>
 #include <KWindowSystem>
+#include <LayerShellQt/Window>
 #include <PlasmaQuick/PlasmaQuick>
 
 #include "plasmaloginsettings.h"
@@ -36,12 +37,13 @@ WallpaperApp::WallpaperApp(int &argc, char **argv)
     m_wallpaperPackage = KPackage::PackageLoader::self()->loadPackage(QStringLiteral("Plasma/Wallpaper"));
     m_wallpaperPackage.setPath(PlasmaLoginSettings::getInstance().wallpaperPluginId());
 
-    for (const auto screenList{screens()}; QScreen *screen : screenList) {
-        adoptScreen(screen);
+    connect(qApp, &QGuiApplication::screenAdded, this, [this](QScreen *screen) {
+        createWindowForScreen(screen);
+    });
+    for (QScreen *screen : qApp->screens()) {
+        createWindowForScreen(screen);
     }
 
-    connect(this, &QGuiApplication::screenAdded, this, &WallpaperApp::adoptScreen);
-
     auto bus = QDBusConnection::sessionBus();
     bus.registerObject(QStringLiteral("/Wallpaper"), this, QDBusConnection::ExportScriptableSlots);
     if (!bus.registerService(QStringLiteral("org.kde.plasma.wallpaper"))) {
@@ -49,28 +51,44 @@ WallpaperApp::WallpaperApp(int &argc, char **argv)
     }
 }
 
-WallpaperApp::~WallpaperApp()
+void WallpaperApp::createWindowForScreen(QScreen *screen)
 {
-    qDeleteAll(m_windows);
-}
+    WallpaperWindow *window = new WallpaperWindow(m_engine.get());
+    window->QObject::setParent(this);
+    window->setScreen(screen);
+    window->setColor(Qt::black);
+
+    connect(qApp, &QGuiApplication::screenRemoved, window, [window](QScreen *screenRemoved) {
+        if (screenRemoved == window->screen()) {
+            delete window;
+        }
+    });
 
-void WallpaperApp::adoptScreen(QScreen *screen)
-{
-    if (screen->geometry().isNull()) {
-        return;
+    window->setGeometry(screen->geometry());
+
+    if (KWindowSystem::isPlatformWayland()) {
+        if (auto layerShellWindow = LayerShellQt::Window::get(window)) {
+            layerShellWindow->setScope(QStringLiteral("plasma-login-wallpaper"));
+            layerShellWindow->setLayer(LayerShellQt::Window::LayerBackground);
+            layerShellWindow->setExclusiveZone(-1);
+            layerShellWindow->setKeyboardInteractivity(LayerShellQt::Window::KeyboardInteractivityNone);
+            layerShellWindow->setScreen(screen);
+        }
     }
 
-    WallpaperWindow *window = new WallpaperWindow(m_engine.get(), screen);
-    window->setGeometry(screen->geometry());
-    window->setVisible(true);
-    m_windows << window;
+    window->setResizeMode(QQuickView::SizeRootObjectToView);
 
-    connect(screen, &QObject::destroyed, window, [this, window]() {
-        m_windows.removeAll(window);
-        window->deleteLater();
-    });
+    if (KWindowSystem::isPlatformX11()) {
+        // X11 specific hint only on X11
+        window->setFlags(Qt::BypassWindowManagerHint);
+    } else if (!KWindowSystem::isPlatformWayland()) {
+        // on other platforms go fullscreen
+        // on Wayland we cannot go fullscreen due to QTBUG 54883
+        window->setWindowState(Qt::WindowFullScreen);
+    }
 
     setupWallpaperPlugin(window);
+    window->show();
 }
 
 void WallpaperApp::setupWallpaperPlugin(WallpaperWindow *window)
@@ -134,11 +152,16 @@ void WallpaperApp::setupWallpaperPlugin(WallpaperWindow *window)
 
 void WallpaperApp::blurScreen(const QString &screenName)
 {
-    for (WallpaperWindow *window : std::as_const(m_windows)) {
-        if (window->screen()->name() == screenName) {
-            window->setBlur(true);
+    for (QWindow *window : topLevelWindows()) {
+        WallpaperWindow *wallpaperWindow = qobject_cast<WallpaperWindow *>(window);
+        if (!wallpaperWindow) {
+            continue;
+        }
+
+        if (wallpaperWindow->screen()->name() == screenName) {
+            wallpaperWindow->setBlur(true);
         } else {
-            window->setBlur(false);
+            wallpaperWindow->setBlur(false);
         }
     }
 }
diff --git a/src/frontend/wallpaper/wallpaperapp.h b/src/frontend/wallpaper/wallpaperapp.h
index 72da2b4b..d9706b1d 100644
--- a/src/frontend/wallpaper/wallpaperapp.h
+++ b/src/frontend/wallpaper/wallpaperapp.h
@@ -24,19 +24,16 @@ class WallpaperApp : public QGuiApplication
 
 public:
     explicit WallpaperApp(int &argc, char **argv);
-    ~WallpaperApp() override;
 
     // DBus interface
 public Q_SLOTS:
     Q_SCRIPTABLE void blurScreen(const QString &screenName);
 
 private:
+    void createWindowForScreen(QScreen *screen);
     void setupWallpaperPlugin(WallpaperWindow *window);
 
     KPackage::Package m_wallpaperPackage;
     QList<WallpaperWindow *> m_windows;
     std::shared_ptr<QQmlEngine> m_engine;
-
-private Q_SLOTS:
-    void adoptScreen(QScreen *);
 };
diff --git a/src/frontend/wallpaper/wallpaperwindow.cpp b/src/frontend/wallpaper/wallpaperwindow.cpp
index f3327dd3..5b8fff21 100644
--- a/src/frontend/wallpaper/wallpaperwindow.cpp
+++ b/src/frontend/wallpaper/wallpaperwindow.cpp
@@ -4,48 +4,11 @@
     SPDX-License-Identifier: GPL-2.0-or-later
 */
 
-#include <QTimer>
-
-#include <KPackage/Package>
-#include <KPackage/PackageLoader>
-#include <KWindowSystem>
-
-#include <LayerShellQt/Window>
-
 #include "wallpaperwindow.h"
 
-WallpaperWindow::WallpaperWindow(QQmlEngine *engine, QScreen *screen)
+WallpaperWindow::WallpaperWindow(QQmlEngine *engine)
     : QQuickView(engine, nullptr)
-    , m_screen(screen)
 {
-    if (KWindowSystem::isPlatformWayland()) {
-        if (auto layerShellWindow = LayerShellQt::Window::get(this)) {
-            layerShellWindow->setScope(QStringLiteral("plasma-login-wallpaper"));
-            layerShellWindow->setLayer(LayerShellQt::Window::LayerBackground);
-            layerShellWindow->setExclusiveZone(-1);
-            layerShellWindow->setKeyboardInteractivity(LayerShellQt::Window::KeyboardInteractivityNone);
-            layerShellWindow->setScreen(screen);
-        }
-    }
-
-    setColor(Qt::black);
-    setScreen(m_screen);
-
-    setGeometry(m_screen->geometry());
-    connect(m_screen, &QScreen::geometryChanged, this, [this]() {
-        setGeometry(m_screen->geometry());
-    });
-
-    setResizeMode(QQuickView::SizeRootObjectToView);
-
-    if (KWindowSystem::isPlatformX11()) {
-        // X11 specific hint only on X11
-        setFlags(Qt::BypassWindowManagerHint);
-    } else if (!KWindowSystem::isPlatformWayland()) {
-        // on other platforms go fullscreen
-        // on Wayland we cannot go fullscreen due to QTBUG 54883
-        setWindowState(Qt::WindowFullScreen);
-    }
 }
 
 bool WallpaperWindow::blur() const
diff --git a/src/frontend/wallpaper/wallpaperwindow.h b/src/frontend/wallpaper/wallpaperwindow.h
index a06115af..18361bd9 100644
--- a/src/frontend/wallpaper/wallpaperwindow.h
+++ b/src/frontend/wallpaper/wallpaperwindow.h
@@ -9,20 +9,20 @@
 #pragma once
 
 #include <QQuickView>
-#include <QScreen>
 
 class WallpaperWindow : public QQuickView
 {
     Q_OBJECT
     Q_PROPERTY(bool blur READ blur NOTIFY blurChanged)
+
 public:
-    WallpaperWindow(QQmlEngine *engine, QScreen *screen);
+    WallpaperWindow(QQmlEngine *engine);
     bool blur() const;
     void setBlur(bool enable);
+
 Q_SIGNALS:
     void blurChanged();
 
 private:
-    QScreen *m_screen;
     bool m_blur = false;
 };
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.