File indexing completed on 2024-05-12 05:35:54

0001 /*
0002     SPDX-FileCopyrightText: 2009 Aaron Seigo <aseigo@kde.org>
0003     SPDX-FileCopyrightText: 2016 Martin Gräßlin <mgraesslin@kde.org>
0004 
0005     SPDX-License-Identifier: LGPL-2.0-only
0006 */
0007 
0008 #include "kwin-runner.h"
0009 
0010 #include <QDBusConnection>
0011 #include <QDBusConnectionInterface>
0012 #include <QDBusServiceWatcher>
0013 
0014 #include <KLocalizedString>
0015 
0016 K_PLUGIN_CLASS_WITH_JSON(KWinRunner, "plasma-runner-kwin.json")
0017 
0018 static const QString s_kwinService = QStringLiteral("org.kde.KWin");
0019 static const QString s_keyword = QStringLiteral("kwin debug console");
0020 static const QStringList s_keywords = {QStringLiteral("kwin"), QStringLiteral("debug"), QStringLiteral("console")};
0021 
0022 KWinRunner::KWinRunner(QObject *parent, const KPluginMetaData &metaData)
0023     : AbstractRunner(parent, metaData)
0024 {
0025     QDBusServiceWatcher *watcher = new QDBusServiceWatcher(s_kwinService, QDBusConnection::sessionBus(), QDBusServiceWatcher::WatchForOwnerChange, this);
0026     connect(watcher, &QDBusServiceWatcher::serviceOwnerChanged, this, &KWinRunner::checkAvailability);
0027     checkAvailability(QString(), QString(), QString());
0028 }
0029 
0030 void KWinRunner::match(RunnerContext &context)
0031 {
0032     const bool containsAnyKeyword = std::any_of(s_keywords.begin(), s_keywords.end(), [&context](const QString &keyword) {
0033         return context.query().contains(keyword, Qt::CaseInsensitive);
0034     });
0035     if (m_enabled && containsAnyKeyword) {
0036         QueryMatch match(this);
0037         match.setId(QStringLiteral("kwin"));
0038         if (context.query().compare(s_keyword, Qt::CaseInsensitive) == 0) {
0039             match.setCategoryRelevance(QueryMatch::CategoryRelevance::Highest);
0040         }
0041         match.setIconName(QStringLiteral("kwin"));
0042         match.setText(i18n("Open KWin debug console"));
0043         match.setRelevance(1.0);
0044         context.addMatch(match);
0045     }
0046 }
0047 
0048 void KWinRunner::run(const RunnerContext & /*context*/, const QueryMatch & /*match*/)
0049 {
0050     if (m_enabled) {
0051         QDBusMessage message = QDBusMessage::createMethodCall(s_kwinService, QStringLiteral("/KWin"), s_kwinService, QStringLiteral("showDebugConsole"));
0052         QDBusConnection::sessionBus().asyncCall(message);
0053     }
0054 }
0055 
0056 void KWinRunner::checkAvailability(const QString &name, const QString & /*oldOwner*/, const QString &newOwner)
0057 {
0058     bool enabled = false;
0059     if (name.isEmpty()) {
0060         enabled = QDBusConnection::sessionBus().interface()->isServiceRegistered(s_kwinService).value();
0061     } else {
0062         enabled = !newOwner.isEmpty();
0063     }
0064 
0065     if (m_enabled != enabled) {
0066         m_enabled = enabled;
0067 
0068         if (m_enabled) {
0069             RunnerSyntax(s_keywords, i18n("Opens the KWin (Plasma Window Manager) debug console."));
0070         } else {
0071             setSyntaxes(QList<RunnerSyntax>());
0072         }
0073     }
0074 }
0075 
0076 #include "kwin-runner.moc"