[plasma/plasma-login-manager/Plasma/6.7] 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 0b4ea53ad4e31a49587199683ba0a6aca21caeea by Oliver Beard.
Committed on 24/07/2026 at 19:21.
Pushed by olib into branch 'Plasma/6.7'.

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    -4    src/frontend/wallpaper/wallpaperwindow.h

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

diff --git a/src/frontend/wallpaper/wallpaperapp.cpp b/src/frontend/wallpaper/wallpaperapp.cpp
index 6ea79853..bee029a7 100644
--- a/src/frontend/wallpaper/wallpaperapp.cpp
+++ b/src/frontend/wallpaper/wallpaperapp.cpp
@@ -18,6 +18,7 @@
 #include <KConfigPropertyMap>
 #include <KPackage/PackageLoader>
 #include <KWindowSystem>
+#include <LayerShellQt/Window>
 
 #include "plasmaloginsettings.h"
 
@@ -31,12 +32,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"))) {
@@ -44,28 +46,44 @@ WallpaperApp::WallpaperApp(int &argc, char **argv)
     }
 }
 
-WallpaperApp::~WallpaperApp()
+void WallpaperApp::createWindowForScreen(QScreen *screen)
 {
-    qDeleteAll(m_windows);
-}
+    WallpaperWindow *window = new WallpaperWindow();
+    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(screen);
-    window->setGeometry(screen->geometry());
-    window->setVisible(true);
-    m_windows << window;
+    window->setResizeMode(PlasmaQuick::QuickViewSharedEngine::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)
@@ -129,11 +147,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 a9a2c2da..2b0ee089 100644
--- a/src/frontend/wallpaper/wallpaperapp.h
+++ b/src/frontend/wallpaper/wallpaperapp.h
@@ -28,18 +28,15 @@ 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;
-
-private Q_SLOTS:
-    void adoptScreen(QScreen *);
 };
diff --git a/src/frontend/wallpaper/wallpaperwindow.cpp b/src/frontend/wallpaper/wallpaperwindow.cpp
index a60de865..0db75cca 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(QScreen *screen)
+WallpaperWindow::WallpaperWindow()
     : PlasmaQuick::QuickViewSharedEngine()
-    , 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(PlasmaQuick::QuickViewSharedEngine::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 ba2c250c..1e861c34 100644
--- a/src/frontend/wallpaper/wallpaperwindow.h
+++ b/src/frontend/wallpaper/wallpaperwindow.h
@@ -8,22 +8,21 @@
 
 #pragma once
 
-#include <QScreen>
-
 #include <PlasmaQuick/QuickViewSharedEngine>
 
 class WallpaperWindow : public PlasmaQuick::QuickViewSharedEngine
 {
     Q_OBJECT
     Q_PROPERTY(bool blur READ blur NOTIFY blurChanged)
+
 public:
-    WallpaperWindow(QScreen *screen);
+    WallpaperWindow();
     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.