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"));