From ed2fc8301bece4ead0c2133c57124a1b2815f5c7 Mon Sep 17 00:00:00 2001 From: Marco Allegretti Date: Tue, 5 May 2026 09:06:46 +0200 Subject: [PATCH] Seed lockscreen wallpaper defaults at startup When kscreenlockerrc has no greeter wallpaper configured, or still points at the legacy Next wallpaper, the lockscreen falls back to KDE default imagery. Seed the greeter wallpaper settings from the installed SHIFT wallpaper package during Plasma Mobile startup so the lockscreen uses the fork default consistently. Link ConfigCore for the startup module so it can read and update kscreenlockerrc. --- kded/start/CMakeLists.txt | 1 + kded/start/start.cpp | 60 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) diff --git a/kded/start/CMakeLists.txt b/kded/start/CMakeLists.txt index 2f4d9b92..37d09c35 100644 --- a/kded/start/CMakeLists.txt +++ b/kded/start/CMakeLists.txt @@ -10,6 +10,7 @@ kcoreaddons_add_plugin(kded_plasma_mobile_start SOURCES ${kded_plasma_mobile_sta target_link_libraries(kded_plasma_mobile_start PRIVATE Qt::Core KF6::DBusAddons + KF6::ConfigCore KF6::KIOGui KF6::JobWidgets KF6::Package diff --git a/kded/start/start.cpp b/kded/start/start.cpp index ef9c68dd..ba6d3eb9 100644 --- a/kded/start/start.cpp +++ b/kded/start/start.cpp @@ -1,17 +1,77 @@ // SPDX-FileCopyrightText: 2023 Devin Lin // SPDX-License-Identifier: GPL-2.0-or-later +#include +#include +#include + +#include #include #include #include +#include #include "start.h" +namespace +{ +bool isLegacyNextWallpaperPath(const QString &path) +{ + return path == QStringLiteral("Next") || path.startsWith(QStringLiteral("/usr/share/wallpapers/Next/")) + || path.startsWith(QStringLiteral("file:///usr/share/wallpapers/Next/")); +} + +QString shiftWallpaperPackageUrl() +{ + const QString metadataPath = QStandardPaths::locate(QStandardPaths::GenericDataLocation, QStringLiteral("wallpapers/SHIFT/metadata.json")); + if (metadataPath.isEmpty()) { + return QString(); + } + + QString packageUrl = QUrl::fromLocalFile(QFileInfo(metadataPath).absolutePath()).toString(); + if (!packageUrl.endsWith(QLatin1Char('/'))) { + packageUrl += QLatin1Char('/'); + } + return packageUrl; +} + +void ensureLockscreenWallpaperDefaults() +{ + auto config = KSharedConfig::openConfig(QStringLiteral("kscreenlockerrc")); + auto greeterGroup = config->group(QStringLiteral("Greeter")); + + const QString wallpaperPlugin = greeterGroup.readEntry(QStringLiteral("WallpaperPlugin"), QString()); + const QString wallpaperPath = + greeterGroup.group(QStringLiteral("Wallpaper")).group(wallpaperPlugin).group(QStringLiteral("General")).readEntry(QStringLiteral("Image"), QString()); + + const bool wallpaperUnset = wallpaperPlugin.isEmpty() || wallpaperPath.isEmpty(); + const bool wallpaperLegacyNext = wallpaperPlugin == QStringLiteral("org.kde.image") && isLegacyNextWallpaperPath(wallpaperPath); + if (!wallpaperUnset && !wallpaperLegacyNext) { + return; + } + + const QString defaultWallpaperUrl = shiftWallpaperPackageUrl(); + if (defaultWallpaperUrl.isEmpty()) { + qWarning() << "Could not locate SHIFT wallpaper package for lockscreen defaults"; + return; + } + + greeterGroup.group(QStringLiteral("Wallpaper")) + .group(QStringLiteral("org.kde.image")) + .group(QStringLiteral("General")) + .writeEntry(QStringLiteral("Image"), defaultWallpaperUrl, KConfigGroup::Notify); + greeterGroup.writeEntry(QStringLiteral("WallpaperPlugin"), QStringLiteral("org.kde.image"), KConfigGroup::Notify); + config->sync(); +} +} + K_PLUGIN_FACTORY_WITH_JSON(StartFactory, "kded_plasma_mobile_start.json", registerPlugin();) Start::Start(QObject *parent, const QList &) : KDEDModule{parent} { + ensureLockscreenWallpaperDefaults(); + auto *envmanagerJob = new KIO::CommandLauncherJob(QStringLiteral("plasma-mobile-envmanager --apply-settings"), {}); envmanagerJob->setUiDelegate(new KNotificationJobUiDelegate(KJobUiDelegate::AutoErrorHandlingEnabled)); envmanagerJob->setDesktopName(QStringLiteral("org.kde.plasma-mobile-envmanager"));