* SPDX-License-Identifier: GPL-2.0-or-later
*/
+#include "admin/workerintegration.h"
#include "config-dolphin.h"
#include "dbusinterface.h"
#include "dolphin_generalsettings.h"
#include <KCrash>
#include <KDBusService>
#include <KIO/PreviewJob>
+#include <KIconTheme>
#include <KLocalizedString>
#include <KWindowSystem>
-#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
-#include <Kdelibs4ConfigMigrator>
+#define HAVE_STYLE_MANAGER __has_include(<KStyleManager>)
+#if HAVE_STYLE_MANAGER
+#include <KStyleManager>
#endif
#include <QApplication>
#include <QSessionManager>
#if HAVE_X11
-#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
#include <private/qtx11extras_p.h>
-#else
-#include <QX11Info>
-#endif
#endif
#ifndef Q_OS_WIN
#endif
#include <iostream>
+constexpr auto dolphinTranslationDomain{"dolphin"};
+
int main(int argc, char **argv)
{
#ifndef Q_OS_WIN
// Prohibit using sudo or kdesu (but allow using the root user directly)
- if (getuid() == 0) {
- if (!qEnvironmentVariableIsEmpty("SUDO_USER")) {
- std::cout << "Running Dolphin with sudo is not supported as it can cause bugs and expose you to security vulnerabilities. Instead, install the "
- "`kio-admin` package from your distro and use it to manage root-owned locations by right-clicking on them and selecting \"Open as "
- "Administrator\"."
- << std::endl;
- return EXIT_FAILURE;
- } else if (!qEnvironmentVariableIsEmpty("KDESU_USER")) {
- std::cout << "Running Dolphin with kdesu is not supported as it can cause bugs and expose you to security vulnerabilities. Instead, install the "
- "`kio-admin` package from your distro and use it to manage root-owned locations by right-clicking on them and selecting \"Open as "
- "Administrator\"."
- << std::endl;
- return EXIT_FAILURE;
- }
+ if (getuid() == 0 && (!qEnvironmentVariableIsEmpty("SUDO_USER") || !qEnvironmentVariableIsEmpty("KDESU_USER"))) {
+ QCoreApplication app(argc, argv); // Needed for the xi18ndc() call below.
+ std::cout << qPrintable(
+ xi18ndc(dolphinTranslationDomain,
+ "@info:shell %1 is a terminal command",
+ "Running <application>Dolphin</application> with <command>sudo</command> is discouraged. Please run <icode>%1</icode> instead.",
+ QStringLiteral("dolphin --sudo")))
+ << std::endl;
+ // We could perform a privilege de-escalation here and continue as normal. It is a bit safer though to simply let the user restart without sudo.
+ return EXIT_FAILURE;
}
#endif
/**
- * enable high dpi support
+ * trigger initialisation of proper icon theme
*/
-#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
- QCoreApplication::setAttribute(Qt::AA_UseHighDpiPixmaps, true);
- QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling, true);
-#endif
- QApplication app(argc, argv);
- app.setWindowIcon(QIcon::fromTheme(QStringLiteral("system-file-manager"), app.windowIcon()));
+ KIconTheme::initTheme();
- KIO::PreviewJob::setDefaultDevicePixelRatio(app.devicePixelRatio());
-
- KCrash::initialize();
+ QApplication app(argc, argv);
+ app.setWindowIcon(QIcon::fromTheme(QStringLiteral("org.kde.dolphin"), app.windowIcon()));
-#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
- Kdelibs4ConfigMigrator migrate(QStringLiteral("dolphin"));
- migrate.setConfigFiles(QStringList() << QStringLiteral("dolphinrc"));
- migrate.setUiFiles(QStringList() << QStringLiteral("dolphinpart.rc") << QStringLiteral("dolphinui.rc"));
- migrate.migrate();
+#if HAVE_STYLE_MANAGER
+ /**
+ * trigger initialisation of proper application style
+ */
+ KStyleManager::initStyle();
+#else
+ /**
+ * For Windows and macOS: use Breeze if available
+ * Of all tested styles that works the best for us
+ */
+#if defined(Q_OS_MACOS) || defined(Q_OS_WIN)
+ QApplication::setStyle(QStringLiteral("breeze"));
+#endif
#endif
- KLocalizedString::setApplicationDomain("dolphin");
+ KLocalizedString::setApplicationDomain(dolphinTranslationDomain);
KAboutData aboutData(QStringLiteral("dolphin"),
i18n("Dolphin"),
QStringLiteral(DOLPHIN_VERSION_STRING),
i18nc("@title", "File Manager"),
KAboutLicense::GPL,
- i18nc("@info:credit", "(C) 2006-2022 The Dolphin Developers"));
- aboutData.setHomepage(QStringLiteral("https://kde.org/applications/system/org.kde.dolphin"));
+ i18nc("@info:credit", "(C) 2006-2025 The Dolphin Developers"));
+ aboutData.setHomepage(QStringLiteral("https://apps.kde.org/dolphin"));
aboutData.addAuthor(i18nc("@info:credit", "Felix Ernst"),
i18nc("@info:credit", "Maintainer (since 2021) and developer"),
QStringLiteral("felixernst@kde.org"));
aboutData.addAuthor(i18nc("@info:credit", "Michael Austin"), i18nc("@info:credit", "Documentation"), QStringLiteral("tuxedup@users.sourceforge.net"));
KAboutData::setApplicationData(aboutData);
+ KCrash::initialize();
QCommandLineParser parser;
aboutData.setupCommandLine(&parser);
"will be selected.")));
parser.addOption(QCommandLineOption(QStringList() << QStringLiteral("split"), i18nc("@info:shell", "Dolphin will get started with a split view.")));
parser.addOption(QCommandLineOption(QStringList() << QStringLiteral("new-window"), i18nc("@info:shell", "Dolphin will explicitly open in a new window.")));
+ parser.addOption(QCommandLineOption(QStringList() << QStringLiteral("sudo") << QStringLiteral("admin"),
+ i18nc("@info:shell", "Set up Dolphin for administrative tasks.")));
parser.addOption(
QCommandLineOption(QStringList() << QStringLiteral("daemon"), i18nc("@info:shell", "Start Dolphin Daemon (only required for DBus Interface).")));
parser.addPositionalArgument(QStringLiteral("+[Url]"), i18nc("@info:shell", "Document to open"));
const bool splitView = parser.isSet(QStringLiteral("split")) || GeneralSettings::splitView();
const bool openFiles = parser.isSet(QStringLiteral("select"));
+ const bool adminWorkerInfoWanted = parser.isSet(QStringLiteral("sudo")) || parser.isSet(QStringLiteral("admin"));
const QStringList args = parser.positionalArguments();
QList<QUrl> urls = Dolphin::validateUris(args);
// We later mutate urls, so we need to store if it was empty originally
const bool startedWithURLs = !urls.isEmpty();
+ if (adminWorkerInfoWanted || std::any_of(urls.cbegin(), urls.cend(), [](const QUrl &url) {
+ return url.scheme() == QStringLiteral("admin");
+ })) {
+ Admin::guideUserTowardsInstallingAdminWorker();
+ }
+
if (parser.isSet(QStringLiteral("daemon"))) {
+ // Prevent KApplicationLauncherJob from cause the application to quit on job finish.
+ QCoreApplication::setQuitLockEnabled(false);
+
// Disable session management for the daemonized version
// See https://bugs.kde.org/show_bug.cgi?id=417219
auto disableSessionManagement = [](QSessionManager &sm) {
}
}
+ mainWindow->setSessionAutoSaveEnabled(GeneralSettings::rememberOpenedTabs());
+
+ if (adminWorkerInfoWanted) {
+ Admin::guideUserTowardsUsingAdminWorker();
+ }
+
#if HAVE_KUSERFEEDBACK
auto feedbackProvider = DolphinFeedbackProvider::instance();
Q_UNUSED(feedbackProvider)