X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/169cca55b9621689712321da8c0425f8002d0008..7f085a5beedd8b50e9e4e43757f0c6b881aedfae:/src/main.cpp diff --git a/src/main.cpp b/src/main.cpp index 4291d2fa3..802e64d25 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -19,142 +19,189 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ -#include "dolphinmainwindow.h" +#include "dbusinterface.h" #include "dolphin_generalsettings.h" +#include "dolphin_version.h" +#include "dolphindebug.h" +#include "dolphinmainwindow.h" +#include "global.h" -#include #include -#include -#include -#include +#include +#include #include -#include "dolphindebug.h" -#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#ifndef Q_OS_WIN +#include +#endif +#include extern "C" Q_DECL_EXPORT int kdemain(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.setWindowIcon(QIcon::fromTheme(QStringLiteral("system-file-manager"), app.windowIcon())); + + KCrash::initialize(); + Kdelibs4ConfigMigrator migrate(QStringLiteral("dolphin")); migrate.setConfigFiles(QStringList() << QStringLiteral("dolphinrc")); migrate.setUiFiles(QStringList() << QStringLiteral("dolphinpart.rc") << QStringLiteral("dolphinui.rc")); migrate.migrate(); - app.setWindowIcon(QIcon::fromTheme("system-file-manager")); + KLocalizedString::setApplicationDomain("dolphin"); - KAboutData aboutData("dolphin", i18n("Dolphin"), "4.60", + KAboutData aboutData(QStringLiteral("dolphin"), i18n("Dolphin"), QStringLiteral(DOLPHIN_VERSION_STRING), i18nc("@title", "File Manager"), KAboutLicense::GPL, - i18nc("@info:credit", "(C) 2006-2014 Peter Penz, Frank Reininghaus, and Emmanuel Pescosta")); - aboutData.setHomepage("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"), - "emmanuelpescosta099@gmail.com"); + 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"), - "frank78ac@googlemail.com"); + QStringLiteral("frank78ac@googlemail.com")); aboutData.addAuthor(i18nc("@info:credit", "Peter Penz"), i18nc("@info:credit", "Maintainer and developer (2006-2012)"), - "peter.penz19@gmail.com"); + QStringLiteral("peter.penz19@gmail.com")); aboutData.addAuthor(i18nc("@info:credit", "Sebastian Trüg"), i18nc("@info:credit", "Developer"), - "trueg@kde.org"); + QStringLiteral("trueg@kde.org")); aboutData.addAuthor(i18nc("@info:credit", "David Faure"), i18nc("@info:credit", "Developer"), - "faure@kde.org"); + QStringLiteral("faure@kde.org")); aboutData.addAuthor(i18nc("@info:credit", "Aaron J. Seigo"), i18nc("@info:credit", "Developer"), - "aseigo@kde.org"); + QStringLiteral("aseigo@kde.org")); aboutData.addAuthor(i18nc("@info:credit", "Rafael Fernández López"), i18nc("@info:credit", "Developer"), - "ereslibre@kde.org"); + QStringLiteral("ereslibre@kde.org")); aboutData.addAuthor(i18nc("@info:credit", "Kevin Ottens"), i18nc("@info:credit", "Developer"), - "ervin@kde.org"); + QStringLiteral("ervin@kde.org")); aboutData.addAuthor(i18nc("@info:credit", "Holger Freyther"), i18nc("@info:credit", "Developer"), - "freyther@gmx.net"); + QStringLiteral("freyther@gmx.net")); aboutData.addAuthor(i18nc("@info:credit", "Max Blazejak"), i18nc("@info:credit", "Developer"), - "m43ksrocks@gmail.com"); + QStringLiteral("m43ksrocks@gmail.com")); aboutData.addAuthor(i18nc("@info:credit", "Michael Austin"), i18nc("@info:credit", "Documentation"), - "tuxedup@users.sourceforge.net"); + QStringLiteral("tuxedup@users.sourceforge.net")); KAboutData::setApplicationData(aboutData); - KDBusService dolphinDBusService; - QCommandLineParser parser; - parser.addVersionOption(); - parser.addHelpOption(); aboutData.setupCommandLine(&parser); // command line options - parser.addOption(QCommandLineOption(QStringList() << QLatin1String("select"), i18nc("@info:shell", "The files and directories passed as arguments " + parser.addOption(QCommandLineOption(QStringList() << QStringLiteral("select"), i18nc("@info:shell", "The files and folders passed as arguments " "will be selected."))); - parser.addOption(QCommandLineOption(QStringList() << QLatin1String("split"), i18nc("@info:shell", "Dolphin will get started with a split view."))); - parser.addPositionalArgument(QLatin1String("+[Url]"), i18nc("@info:shell", "Document to open")); + 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(); - DolphinMainWindow* m_mainWindow = new DolphinMainWindow(); - m_mainWindow->setAttribute(Qt::WA_DeleteOnClose); - QList urls; - const QStringList args = parser.positionalArguments(); - foreach (const QString& str, args) { - const QUrl url = QUrl::fromUserInput(str, QString(), QUrl::AssumeLocalFile); - if (url.isValid()) { - urls.append(url); - } else { - qCWarning(DolphinDebug) << "Invalid URL: " << str; - } + if (parser.isSet(QStringLiteral("daemon"))) { + KDBusService dolphinDBusService; + DBusInterface interface; + interface.setAsDaemon(); + return app.exec(); } - bool resetSplitSettings = false; - if (parser.isSet("split") && !GeneralSettings::splitView()) { - // Dolphin should be opened with a split view although this is not - // set in the GeneralSettings. Temporary adjust the setting until - // all passed URLs have been opened. - GeneralSettings::setSplitView(true); - resetSplitSettings = true; - - // We need 2 URLs to open Dolphin in split view mode - if (urls.isEmpty()) { // No URL given - Open home URL in all two views - urls.append(GeneralSettings::homeUrl()); - urls.append(GeneralSettings::homeUrl()); - } else if (urls.length() == 1) { // Only 1 URL given - Open given URL in all two views - urls.append(urls.at(0)); + 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 (parser.isSet("select")) { - m_mainWindow->openFiles(urls); - } else { - m_mainWindow->openDirectories(urls); - } - } else { - const QUrl homeUrl(QUrl::fromLocalFile(GeneralSettings::homeUrl())); - m_mainWindow->openNewActivatedTab(homeUrl); + if (!startedWithURLs) { + // We need at least one URL to open Dolphin + urls.append(Dolphin::homeUrl()); } - if (resetSplitSettings) { - GeneralSettings::setSplitView(false); + if (splitView && urls.size() < 2) { + // Split view does only make sense if we have at least 2 URLs + urls.append(urls.last()); } - m_mainWindow->show(); + DolphinMainWindow* mainWindow = new DolphinMainWindow(); - if (app.isSessionRestored()) { - const QString className = KXmlGuiWindow::classNameOfToplevel(1); - if (className == QLatin1String("DolphinMainWindow")) { - m_mainWindow->restore(1); - } else { - qCWarning(DolphinDebug) << "Unknown class " << className << " in session saved data!"; + if (openFiles) { + mainWindow->openFiles(urls, splitView); + } else { + mainWindow->openDirectories(urls, splitView); + } + + mainWindow->show(); + + if (!app.isSessionRestored()) { + KConfigGui::setSessionConfig(QStringLiteral("dolphin"), QStringLiteral("dolphin")); + } + + // Only restore session if: + // 1. Dolphin was not started with command line args + // 2. The "remember state" setting is enabled or session restoration after + // reboot is in use + // 3. There is a session available to restore + if (!startedWithURLs && (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); + } else { + qCWarning(DolphinDebug) << "Unknown class " << className << " in session saved data!"; + } } } + KDBusService dolphinDBusService; + DBusInterface interface; + return app.exec(); // krazy:exclude=crash; }