File indexing completed on 2024-04-28 16:54:27

0001 /*
0002     SPDX-FileCopyrightText: 2012 Marco Martin <mart@kde.org>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include <KLocalizedString>
0008 #include <QApplication>
0009 
0010 #include <QAction>
0011 #include <QCommandLineParser>
0012 #include <QDBusConnection>
0013 #include <QDBusMessage>
0014 #include <QDebug>
0015 #include <QQuickWindow>
0016 #include <QSessionManager>
0017 #include <QSurfaceFormat>
0018 #include <QUrl>
0019 
0020 #include <KAboutData>
0021 #include <KAuthorized>
0022 #include <KDBusService>
0023 
0024 #include <kdeclarative/qmlobject.h>
0025 
0026 #include <kworkspace.h>
0027 
0028 #include "view.h"
0029 
0030 int main(int argc, char **argv)
0031 {
0032     auto format = QSurfaceFormat::defaultFormat();
0033     format.setOption(QSurfaceFormat::ResetNotification);
0034     QSurfaceFormat::setDefaultFormat(format);
0035 
0036     QCommandLineParser parser;
0037     if (!qEnvironmentVariableIsSet("PLASMA_USE_QT_SCALING")) {
0038         qunsetenv("QT_DEVICE_PIXEL_RATIO");
0039         QCoreApplication::setAttribute(Qt::AA_DisableHighDpiScaling);
0040     }
0041 
0042     qputenv("QT_WAYLAND_DISABLE_FIXED_POSITIONS", {});
0043     const bool qpaVariable = qEnvironmentVariableIsSet("QT_QPA_PLATFORM");
0044     KWorkSpace::detectPlatform(argc, argv);
0045     QQuickWindow::setDefaultAlphaBuffer(true);
0046     QApplication app(argc, argv);
0047     if (!qpaVariable) {
0048         // don't leak the env variable to processes we start
0049         qunsetenv("QT_QPA_PLATFORM");
0050     }
0051     qunsetenv("QT_WAYLAND_DISABLE_FIXED_POSITIONS");
0052     KLocalizedString::setApplicationDomain("krunner");
0053 
0054     //     TODO: Make it a QGuiApplication once we don't depend on KDELibs4Support
0055     //     QGuiApplication app(argc, argv);
0056 
0057     KAboutData aboutData(QStringLiteral("krunner"), i18n("KRunner"), QStringLiteral(PROJECT_VERSION), i18n("Run Command interface"), KAboutLicense::GPL);
0058 
0059     KAboutData::setApplicationData(aboutData);
0060     app.setQuitOnLastWindowClosed(false);
0061 
0062     QCommandLineOption clipboardOption({QStringLiteral("c"), QStringLiteral("clipboard")}, i18n("Use the clipboard contents as query for KRunner"));
0063     QCommandLineOption daemonOption({QStringLiteral("d"), QStringLiteral("daemon")}, i18n("Start KRunner in the background, don't show it."));
0064     QCommandLineOption replaceOption({QStringLiteral("replace")}, i18n("Replace an existing instance"));
0065 
0066     parser.addOption(clipboardOption);
0067     parser.addOption(daemonOption);
0068     parser.addOption(replaceOption);
0069     parser.addPositionalArgument(QStringLiteral("query"), i18n("The query to run, only used if -c is not provided"));
0070 
0071     aboutData.setupCommandLine(&parser);
0072 
0073     parser.process(app);
0074     aboutData.processCommandLine(&parser);
0075 
0076     if (!KAuthorized::authorize(QStringLiteral("run_command"))) {
0077         return -1;
0078     }
0079 
0080     KDBusService service(KDBusService::Unique | KDBusService::StartupOption(parser.isSet(replaceOption) ? KDBusService::Replace : 0));
0081 
0082 #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
0083     QGuiApplication::setFallbackSessionManagementEnabled(false);
0084 #endif
0085 
0086     auto disableSessionManagement = [](QSessionManager &sm) {
0087         sm.setRestartHint(QSessionManager::RestartNever);
0088     };
0089     QObject::connect(&app, &QGuiApplication::commitDataRequest, disableSessionManagement);
0090     QObject::connect(&app, &QGuiApplication::saveStateRequest, disableSessionManagement);
0091 
0092     View view;
0093 
0094     auto updateVisibility = [&]() {
0095         const QString query = parser.positionalArguments().value(0);
0096 
0097         if (parser.isSet(daemonOption)) {
0098             view.setVisible(false);
0099         } else if (parser.isSet(clipboardOption)) {
0100             view.displayWithClipboardContents();
0101         } else if (!query.isEmpty()) {
0102             view.query(query);
0103         } else {
0104             view.toggleDisplay();
0105         }
0106     };
0107 
0108     updateVisibility();
0109 
0110     QObject::connect(&service, &KDBusService::activateRequested, &view, [&](const QStringList &arguments, const QString &workingDirectory) {
0111         Q_UNUSED(workingDirectory)
0112         parser.parse(arguments);
0113         updateVisibility();
0114     });
0115     QObject::connect(&service, &KDBusService::activateActionRequested, &view, [&view](const QString &action) {
0116         if (action == QLatin1String("RunClipboard")) {
0117             view.displayWithClipboardContents();
0118         }
0119     });
0120 
0121     return app.exec();
0122 }