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 }