[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;
};