File indexing completed on 2024-04-28 05:36:50

0001 /*
0002  * SPDX-FileCopyrightText: 2022 Aleix Pol Gonzalez <aleixpol@kde.org>
0003  *
0004  * SPDX-License-Identifier: LGPL-2.0-or-later
0005  */
0006 
0007 #include "globalshortcuts.h"
0008 #include "notificationinhibition.h"
0009 #include "quickdialog.h"
0010 #include "session.h"
0011 #include "utils.h"
0012 #include "waylandintegration.h"
0013 
0014 #include <KGlobalAccel>
0015 #include <QAction>
0016 #include <QDBusMetaType>
0017 #include <QDataStream>
0018 #include <QDesktopServices>
0019 #include <QLoggingCategory>
0020 #include <QUrl>
0021 
0022 Q_LOGGING_CATEGORY(XdgDesktopPortalKdeGlobalShortcuts, "xdp-kde-GlobalShortcuts")
0023 
0024 GlobalShortcutsPortal::GlobalShortcutsPortal(QObject *parent)
0025     : QDBusAbstractAdaptor(parent)
0026 {
0027     qDBusRegisterMetaType<Shortcut>();
0028     qDBusRegisterMetaType<Shortcuts>();
0029 
0030     Q_ASSERT(QLatin1String(QDBusMetaType::typeToSignature(QMetaType(qMetaTypeId<Shortcuts>()))) == QLatin1String("a(sa{sv})"));
0031 }
0032 
0033 GlobalShortcutsPortal::~GlobalShortcutsPortal() = default;
0034 
0035 uint GlobalShortcutsPortal::version() const
0036 {
0037     return 1;
0038 }
0039 
0040 uint GlobalShortcutsPortal::CreateSession(const QDBusObjectPath &handle,
0041                                           const QDBusObjectPath &session_handle,
0042                                           const QString &app_id,
0043                                           const QVariantMap &options,
0044                                           QVariantMap &results)
0045 {
0046     qCDebug(XdgDesktopPortalKdeGlobalShortcuts) << "CreateSession called with parameters:";
0047     qCDebug(XdgDesktopPortalKdeGlobalShortcuts) << "    handle: " << handle.path();
0048     qCDebug(XdgDesktopPortalKdeGlobalShortcuts) << "    session_handle: " << session_handle.path();
0049     qCDebug(XdgDesktopPortalKdeGlobalShortcuts) << "    app_id: " << app_id;
0050     qCDebug(XdgDesktopPortalKdeGlobalShortcuts) << "    options: " << options;
0051 
0052     auto session = qobject_cast<GlobalShortcutsSession *>(Session::createSession(this, Session::GlobalShortcuts, app_id, session_handle.path()));
0053     if (!session) {
0054         return 2;
0055     }
0056 
0057     session->restoreActions(options["shortcuts"]);
0058     connect(session, &GlobalShortcutsSession::shortcutsChanged, this, [this, session, session_handle] {
0059         Q_EMIT ShortcutsChanged(session_handle, session->shortcutDescriptions());
0060     });
0061 
0062     connect(session, &GlobalShortcutsSession::shortcutActivated, this, [this, session](const QString &shortcutName, qlonglong timestamp) {
0063         Q_EMIT Activated(QDBusObjectPath(session->handle()), shortcutName, timestamp);
0064     });
0065     connect(session, &GlobalShortcutsSession::shortcutDeactivated, this, [this, session](const QString &shortcutName, qlonglong timestamp) {
0066         Q_EMIT Deactivated(QDBusObjectPath(session->handle()), shortcutName, timestamp);
0067     });
0068 
0069     results = {
0070         {"shortcuts", session->shortcutDescriptionsVariant()},
0071     };
0072     return 0;
0073 }
0074 
0075 uint GlobalShortcutsPortal::ListShortcuts(const QDBusObjectPath &handle, const QDBusObjectPath &session_handle, QVariantMap &results)
0076 {
0077     qCDebug(XdgDesktopPortalKdeGlobalShortcuts) << "ListShortcuts called with parameters:";
0078     qCDebug(XdgDesktopPortalKdeGlobalShortcuts) << "    handle: " << handle.path();
0079     qCDebug(XdgDesktopPortalKdeGlobalShortcuts) << "    session_handle: " << session_handle.path();
0080 
0081     auto session = qobject_cast<GlobalShortcutsSession *>(Session::getSession(session_handle.path()));
0082     if (!session) {
0083         return 2;
0084     }
0085     results = {
0086         {"shortcuts", session->shortcutDescriptionsVariant()},
0087     };
0088     return 0;
0089 }
0090 
0091 uint GlobalShortcutsPortal::BindShortcuts(const QDBusObjectPath &handle,
0092                                           const QDBusObjectPath &session_handle,
0093                                           const Shortcuts &shortcuts,
0094                                           const QString &parent_window,
0095                                           const QVariantMap &options,
0096                                           QVariantMap &results)
0097 {
0098     qCDebug(XdgDesktopPortalKdeGlobalShortcuts) << "BindShortcuts called with parameters:";
0099     qCDebug(XdgDesktopPortalKdeGlobalShortcuts) << "    handle: " << handle.path();
0100     qCDebug(XdgDesktopPortalKdeGlobalShortcuts) << "    session_handle: " << session_handle.path();
0101     qCDebug(XdgDesktopPortalKdeGlobalShortcuts) << "    shortcuts: " << shortcuts;
0102     qCDebug(XdgDesktopPortalKdeGlobalShortcuts) << "    parent_window: " << parent_window;
0103     qCDebug(XdgDesktopPortalKdeGlobalShortcuts) << "    options: " << options;
0104 
0105     auto session = qobject_cast<GlobalShortcutsSession *>(Session::getSession(session_handle.path()));
0106     if (!session) {
0107         return 2;
0108     }
0109     QDesktopServices::openUrl(QUrl(QStringLiteral("systemsettings://kcm_keys/") + session->componentName()));
0110 
0111     results = {
0112         {"shortcuts", session->shortcutDescriptionsVariant()},
0113     };
0114     return 0;
0115 }