X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/a67dab505adfc6a7a0c08f21d1dd1ead046e044c..c836cf010c12858a7f3a4943c06f9de2b9f31a14:/src/main.cpp diff --git a/src/main.cpp b/src/main.cpp index acba8daed..fba45f43c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,44 +1,64 @@ -/*************************************************************************** - * Copyright (C) 2006 by Peter Penz * - * Copyright (C) 2006 by Stefan Monov * - * Copyright (C) 2015 by Mathieu Tarral * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * - ***************************************************************************/ +/* + * SPDX-FileCopyrightText: 2006 Peter Penz + * SPDX-FileCopyrightText: 2006 Stefan Monov + * SPDX-FileCopyrightText: 2015 Mathieu Tarral + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ +#include "dbusinterface.h" +#include "dolphin_generalsettings.h" #include "dolphin_version.h" +#include "dolphindebug.h" #include "dolphinmainwindow.h" -#include "dolphin_generalsettings.h" -#include "dbusinterface.h" #include "global.h" -#include "dolphindebug.h" +#include "config-kuserfeedback.h" +#ifdef HAVE_KUSERFEEDBACK +#include "userfeedback/dolphinfeedbackprovider.h" +#endif -#include #include #include -#include -#include -#include +#include #include #include +#include -extern "C" Q_DECL_EXPORT int kdemain(int argc, char **argv) +#include +#include +#include +#include +#include +#include +#include + +#ifndef Q_OS_WIN +#include +#endif +#include + +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 << "Executing Dolphin with sudo is not possible due to unfixable security vulnerabilities." << std::endl; + return EXIT_FAILURE; + } else if (!qEnvironmentVariableIsEmpty("KDESU_USER")) { + std::cout << "Executing Dolphin with kdesu is not possible due to unfixable security vulnerabilities." << std::endl; + return EXIT_FAILURE; + } + } +#endif + + /** + * enable high dpi support + */ + QCoreApplication::setAttribute(Qt::AA_UseHighDpiPixmaps, true); + QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling, true); + QApplication app(argc, argv); - app.setAttribute(Qt::AA_UseHighDpiPixmaps, true); app.setWindowIcon(QIcon::fromTheme(QStringLiteral("system-file-manager"), app.windowIcon())); KCrash::initialize(); @@ -53,10 +73,13 @@ extern "C" Q_DECL_EXPORT int kdemain(int argc, char **argv) KAboutData aboutData(QStringLiteral("dolphin"), i18n("Dolphin"), QStringLiteral(DOLPHIN_VERSION_STRING), i18nc("@title", "File Manager"), KAboutLicense::GPL, - i18nc("@info:credit", "(C) 2006-2016 Peter Penz, Frank Reininghaus, and Emmanuel Pescosta")); - aboutData.setHomepage(QStringLiteral("http://dolphin.kde.org")); + i18nc("@info:credit", "(C) 2006-2018 Peter Penz, Frank Reininghaus, Emmanuel Pescosta and Elvis Angelaccio")); + aboutData.setHomepage(QStringLiteral("https://kde.org/applications/system/org.kde.dolphin")); + aboutData.addAuthor(i18nc("@info:credit", "Elvis Angelaccio"), + i18nc("@info:credit", "Maintainer (since 2018) and developer"), + QStringLiteral("elvis.angelaccio@kde.org")); aboutData.addAuthor(i18nc("@info:credit", "Emmanuel Pescosta"), - i18nc("@info:credit", "Maintainer (since 2014) and developer"), + i18nc("@info:credit", "Maintainer (2014-2018) and developer"), QStringLiteral("emmanuelpescosta099@gmail.com")); aboutData.addAuthor(i18nc("@info:credit", "Frank Reininghaus"), i18nc("@info:credit", "Maintainer (2012-2014) and developer"), @@ -91,46 +114,63 @@ extern "C" Q_DECL_EXPORT int kdemain(int argc, char **argv) KAboutData::setApplicationData(aboutData); - KDBusService dolphinDBusService; - DBusInterface interface; - QCommandLineParser parser; - parser.addVersionOption(); - parser.addHelpOption(); aboutData.setupCommandLine(&parser); // command line options parser.addOption(QCommandLineOption(QStringList() << QStringLiteral("select"), i18nc("@info:shell", "The files and folders passed as arguments " "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("daemon"), i18nc("@info:shell", "Start Dolphin Daemon (only required for DBus Interface)"))); parser.addPositionalArgument(QStringLiteral("+[Url]"), i18nc("@info:shell", "Document to open")); parser.process(app); aboutData.processCommandLine(&parser); + const bool splitView = parser.isSet(QStringLiteral("split")) || GeneralSettings::splitView(); + const bool openFiles = parser.isSet(QStringLiteral("select")); + const QStringList args = parser.positionalArguments(); + QList urls = Dolphin::validateUris(args); + // We later mutate urls, so we need to store if it was empty originally + const bool startedWithURLs = !urls.isEmpty(); + + if (parser.isSet(QStringLiteral("daemon"))) { + // Disable session management for the daemonized version + // See https://bugs.kde.org/show_bug.cgi?id=417219 + auto disableSessionManagement = [](QSessionManager &sm) { + sm.setRestartHint(QSessionManager::RestartNever); + }; + QObject::connect(&app, &QGuiApplication::commitDataRequest, disableSessionManagement); + QObject::connect(&app, &QGuiApplication::saveStateRequest, disableSessionManagement); + + KDBusService dolphinDBusService; + DBusInterface interface; + interface.setAsDaemon(); return app.exec(); } - const QStringList args = parser.positionalArguments(); - QList urls = Dolphin::validateUris(args); + if (!parser.isSet(QStringLiteral("new-window"))) { + if (Dolphin::attachToExistingInstance(urls, openFiles, splitView)) { + // Successfully attached to existing instance of Dolphin + return 0; + } + } - if (urls.isEmpty()) { + if (!startedWithURLs) { // We need at least one URL to open Dolphin urls.append(Dolphin::homeUrl()); } - const bool splitView = parser.isSet(QStringLiteral("split")) || GeneralSettings::splitView(); if (splitView && urls.size() < 2) { // Split view does only make sense if we have at least 2 URLs urls.append(urls.last()); } DolphinMainWindow* mainWindow = new DolphinMainWindow(); - mainWindow->setAttribute(Qt::WA_DeleteOnClose); - if (parser.isSet(QStringLiteral("select"))) { + if (openFiles) { mainWindow->openFiles(urls, splitView); } else { mainWindow->openDirectories(urls, splitView); @@ -138,14 +178,46 @@ extern "C" Q_DECL_EXPORT int kdemain(int argc, char **argv) mainWindow->show(); - if (app.isSessionRestored()) { - const QString className = KXmlGuiWindow::classNameOfToplevel(1); - if (className == QLatin1String("DolphinMainWindow")) { - mainWindow->restore(1); - } else { - qCWarning(DolphinDebug) << "Unknown class " << className << " in session saved data!"; + KDBusService dolphinDBusService; + DBusInterface interface; + + if (!app.isSessionRestored()) { + KConfigGui::setSessionConfig(QStringLiteral("dolphin"), QStringLiteral("dolphin")); + } + + // Only restore session if: + // 1. Not explicitly opening a new instance + // 2. The "remember state" setting is enabled or session restoration after + // reboot is in use + // 3. There is a session available to restore + if (!parser.isSet(QStringLiteral("new-window")) + && (app.isSessionRestored() || GeneralSettings::rememberOpenedTabs()) + ) { + // Get saved state data for the last-closed Dolphin instance + const QString serviceName = QStringLiteral("org.kde.dolphin-%1").arg(QCoreApplication::applicationPid()); + if (Dolphin::dolphinGuiInstances(serviceName).size() > 0) { + const QString className = KXmlGuiWindow::classNameOfToplevel(1); + if (className == QLatin1String("DolphinMainWindow")) { + mainWindow->restore(1); + // If the user passed any URLs to Dolphin, open those in the + // window after session-restoring it + if (startedWithURLs) { + mainWindow->openDirectories(urls, splitView); + } + + // Now handle invalid locations in the set of active views to + // avoid issues like https://bugs.kde.org/show_bug.cgi?id=427619 + mainWindow->setViewsWithInvalidPathsToHome(); + } else { + qCWarning(DolphinDebug) << "Unknown class " << className << " in session saved data!"; + } } } +#ifdef HAVE_KUSERFEEDBACK + auto feedbackProvider = DolphinFeedbackProvider::instance(); + Q_UNUSED(feedbackProvider) +#endif + return app.exec(); // krazy:exclude=crash; }