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 }