From 24a571769a47db9fc20765ce44bcef1128d44e68 Mon Sep 17 00:00:00 2001 From: Luis Caceres Date: Fri, 6 Dec 2019 04:25:28 +0000 Subject: [PATCH 1/7] Initial KGlobalAccel support --- src/CMakeLists.txt | 11 + src/core/globalshortcuts.cpp | 7 +- src/core/globalshortcuts.h | 2 + .../kglobalaccelglobalshortcutbackend.cpp | 284 ++++++++++++++++++ src/core/kglobalaccelglobalshortcutbackend.h | 71 +++++ src/dbus/org.kde.KGlobalAccel.xml | 72 +++++ src/dbus/org.kde.kglobalaccel.Component.xml | 32 ++ 7 files changed, 478 insertions(+), 1 deletion(-) create mode 100644 src/core/kglobalaccelglobalshortcutbackend.cpp create mode 100644 src/core/kglobalaccelglobalshortcutbackend.h create mode 100644 src/dbus/org.kde.KGlobalAccel.xml create mode 100644 src/dbus/org.kde.kglobalaccel.Component.xml diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 526e8cbb0..0ecea33b5 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -82,6 +82,7 @@ set(SOURCES core/globalshortcutbackend.cpp core/globalshortcuts.cpp core/gnomeglobalshortcutbackend.cpp + core/kglobalaccelglobalshortcutbackend.cpp core/mergedproxymodel.cpp core/metatypes.cpp core/multisortfilterproxy.cpp @@ -413,6 +414,7 @@ set(HEADERS core/globalshortcuts.h core/globalshortcutbackend.h core/gnomeglobalshortcutbackend.h + core/kglobalaccelglobalshortcutbackend.h core/mergedproxymodel.h core/mimedata.h core/network.h @@ -937,6 +939,15 @@ if(UNIX AND HAVE_DBUS) dbus/org.gnome.SettingsDaemon.MediaKeys.xml dbus/gnomesettingsdaemon) + # org.kde.KGlobalAccel interfaces + # these are taken from the KGlobalAccel sources (LGPL 2.1) + qt5_add_dbus_interface(SOURCES + dbus/org.kde.KGlobalAccel.xml + dbus/kglobalaccel) + qt5_add_dbus_interface(SOURCES + dbus/org.kde.kglobalaccel.Component.xml + dbus/kglobalaccelcomponent) + # org.freedesktop.Avahi.Server interface add_custom_command( OUTPUT diff --git a/src/core/globalshortcuts.cpp b/src/core/globalshortcuts.cpp index 025327884..70ba0dab4 100644 --- a/src/core/globalshortcuts.cpp +++ b/src/core/globalshortcuts.cpp @@ -22,6 +22,7 @@ #include "config.h" #include "globalshortcuts.h" #include "gnomeglobalshortcutbackend.h" +#include "kglobalaccelglobalshortcutbackend.h" #include "macglobalshortcutbackend.h" #include "qxtglobalshortcutbackend.h" @@ -41,7 +42,8 @@ GlobalShortcuts::GlobalShortcuts(QWidget* parent) : QWidget(parent), gnome_backend_(nullptr), system_backend_(nullptr), - use_gnome_(false) { + use_gnome_(false), + have_kglobalaccel_(KGlobalAccelShortcutBackend::isKGlobalAccelAvailable()) { settings_.beginGroup(kSettingsGroup); // Create actions @@ -91,6 +93,7 @@ GlobalShortcuts::GlobalShortcuts(QWidget* parent) // Create backends - these do the actual shortcut registration gnome_backend_ = new GnomeGlobalShortcutBackend(this); + kglobalaccel_backend_ = new KGlobalAccelShortcutBackend(this); #ifndef Q_OS_DARWIN system_backend_ = new QxtGlobalShortcutBackend(this); @@ -158,10 +161,12 @@ void GlobalShortcuts::ReloadSettings() { void GlobalShortcuts::Unregister() { if (gnome_backend_->is_active()) gnome_backend_->Unregister(); + if (kglobalaccel_backend_->is_active()) kglobalaccel_backend_->Unregister(); if (system_backend_->is_active()) system_backend_->Unregister(); } void GlobalShortcuts::Register() { + if(have_kglobalaccel_ && kglobalaccel_backend_->Register()) return; if (use_gnome_ && gnome_backend_->Register()) return; system_backend_->Register(); } diff --git a/src/core/globalshortcuts.h b/src/core/globalshortcuts.h index ad97aadbd..c811f71e6 100644 --- a/src/core/globalshortcuts.h +++ b/src/core/globalshortcuts.h @@ -93,12 +93,14 @@ signals: private: GlobalShortcutBackend* gnome_backend_; + GlobalShortcutBackend* kglobalaccel_backend_; GlobalShortcutBackend* system_backend_; QMap shortcuts_; QSettings settings_; bool use_gnome_; + bool have_kglobalaccel_; }; #endif // CORE_GLOBALSHORTCUTS_H_ diff --git a/src/core/kglobalaccelglobalshortcutbackend.cpp b/src/core/kglobalaccelglobalshortcutbackend.cpp new file mode 100644 index 000000000..7e3e455e5 --- /dev/null +++ b/src/core/kglobalaccelglobalshortcutbackend.cpp @@ -0,0 +1,284 @@ +#include "config.h" +#include "core/closure.h" +#include "core/logging.h" +#include "globalshortcuts.h" +#include "kglobalaccelglobalshortcutbackend.h" + +#include +#include + +#ifdef HAVE_DBUS + +#include +#include + +#endif + +// Most of this file is based on the KGlobalAccel sources +// (https://phabricator.kde.org/source/kglobalaccel) + + +namespace { + QString compDisplayName() { + if (!QGuiApplication::applicationDisplayName().isEmpty()) { + return QGuiApplication::applicationDisplayName(); + } + return QCoreApplication::applicationName(); + } + + QString compUniqueName() { + return QCoreApplication::applicationName(); + } + + const QString &id_ActionUnique(const QStringList &id) { + return id.at(1); + } + + bool isCorrectMediaKeyShortcut(const GlobalShortcuts::Shortcut& shortcut) { + if(shortcut.id == QStringLiteral("play_pause")) { + return shortcut.action->shortcut() == QKeySequence(Qt::Key_MediaPlay); + } else if(shortcut.id == QStringLiteral("stop")) { + return shortcut.action->shortcut() == QKeySequence(Qt::Key_MediaStop); + } else if(shortcut.id == QStringLiteral("next_track")) { + return shortcut.action->shortcut() == QKeySequence(Qt::Key_MediaNext); + } else if(shortcut.id == QStringLiteral("prev_track")) { + return shortcut.action->shortcut() == QKeySequence(Qt::Key_MediaPrevious); + } else { + return false; + } + } +} + +#ifdef HAVE_DBUS + +KGlobalAccelShortcutBackend::KGlobalAccelShortcutBackend( + GlobalShortcuts *parent) + : GlobalShortcutBackend(parent), + iface_(nullptr), + component_(nullptr), + nameToAction_() {} + +#else // HAVE_DBUS +KGlobalAccelShortcutBackend::KGlobalAccelShortcutBackend(GlobalShortcuts *parent) + : GlobalShortcutBackend(parent) {} +#endif // HAVE_DBUS + +bool KGlobalAccelShortcutBackend::isKGlobalAccelAvailable() { +#ifdef HAVE_DBUS + return QDBusConnection::sessionBus().interface()->isServiceRegistered( + Service); +#else // HAVE_DBUS + return false; +#endif // HAVE_DBUS +} + +bool KGlobalAccelShortcutBackend::DoRegister() { +#ifdef HAVE_DBUS + qLog(Debug) << "Registering shortcuts"; + + if (!acquireInterface()) + return false; + + bool complete = true; + for (const GlobalShortcuts::Shortcut &shortcut : manager_->shortcuts().values()) { + if(shortcut.action->shortcut().isEmpty()) + continue; + + if (!registerShortcut(shortcut)) + complete = false; + } + + if (!acquireComponent()) + return false; + + QObject::connect(component_, + &OrgKdeKglobalaccelComponentInterface::globalShortcutPressed, + this, + &KGlobalAccelShortcutBackend::onShortcutPressed); + + return complete; +#else // HAVE_DBUS + qLog(Warning) << "dbus not available"; + return false; +#endif // HAVE_DBUS +} + +void KGlobalAccelShortcutBackend::DoUnregister() { + if (!acquireInterface()) + return; + + if (!acquireComponent()) + return; + + for (const GlobalShortcuts::Shortcut &shortcut : manager_->shortcuts()) + unregisterAction(shortcut.id, shortcut.action); +} + +#ifdef HAVE_DBUS + +const char *KGlobalAccelShortcutBackend::Service = "org.kde.kglobalaccel"; +const char *KGlobalAccelShortcutBackend::Path = "/kglobalaccel"; + +bool KGlobalAccelShortcutBackend::acquireComponent() { + Q_ASSERT(iface_ && iface_->isValid()); + + QString componentName = compUniqueName(); + QDBusReply reply = iface_->getComponent(compUniqueName()); + if (!reply.isValid()) { + if (reply.error().name() == + QLatin1String("org.kde.kglobalaccel.NoSuchComponent")) + return false; + + qLog(Warning) << "Failed to get DBus path for KGlobalAccel component"; + return false; + } + + component_ = new org::kde::kglobalaccel::Component(Service, + reply.value().path(), + QDBusConnection::sessionBus(), + iface_); + + if (!component_->isValid()) { + qLog(Warning) << "Failed to get KGlobalAccel component:" + << QDBusConnection::sessionBus().lastError(); + delete component_; + component_ = nullptr; + return false; + } + + return true; +} + +bool KGlobalAccelShortcutBackend::acquireInterface() { + if (iface_ && iface_->isValid()) + return true; + + if (isKGlobalAccelAvailable()) { + iface_ = new OrgKdeKGlobalAccelInterface(Service, Path, + QDBusConnection::sessionBus(), + this); + } + + if (iface_ && iface_->isValid()) + return true; + + if (!iface_) + qLog(Warning) << "KGlobalAccel daemon not registered"; + else if (!iface_->isValid()) + qLog(Warning) << "KGlobalAccel daemon is not valid"; + return false; +} + +QStringList KGlobalAccelShortcutBackend::id(const QString &name, + const QAction *action) { + Q_ASSERT(action); + + QStringList ret; + ret << compUniqueName(); + ret << name; + ret << compDisplayName(); + ret << action->text().replace(QLatin1Char('&'), QStringLiteral("")); + if (ret.back().isEmpty()) + ret.back() = name; + return ret; +} + +QList KGlobalAccelShortcutBackend::intList( + const QList &seq) { + QList ret; + for (const QKeySequence &sequence : seq) { + ret.append(sequence[0]); + } + while (!ret.isEmpty() && ret.last() == 0) { + ret.removeLast(); + } + return ret; +} + +bool KGlobalAccelShortcutBackend::registerAction(const QString &name, + QAction *action, + QStringList &actionId) { + Q_ASSERT(action); + + if (name.isEmpty() && (action->objectName().isEmpty() || + action->objectName().startsWith( + QLatin1String("unnamed-")))) { + qLog(Warning) << "Cannot register shortcut for unnamed action"; + return false; + } + + actionId = id(name, action); + nameToAction_.insertMulti(id_ActionUnique(actionId), action); + iface_->doRegister(actionId); + + return true; +} + +bool KGlobalAccelShortcutBackend::registerShortcut(const GlobalShortcuts::Shortcut &shortcut) { + QStringList actionId; + if (!registerAction(shortcut.id, shortcut.action, actionId)) + return false; + + QList activeShortcut; + activeShortcut << shortcut.action->shortcut(); + + const QList result = iface_->setShortcut(actionId, + intList(activeShortcut), + SetShortcutFlag::SetPresent); + + const QList resultSequence = shortcutList(result); + if (resultSequence != activeShortcut) { + qLog(Warning) << "Tried setting global shortcut" << activeShortcut + << "but KGlobalAccel returned" << resultSequence; + + if (!resultSequence.isEmpty()) { + if(!isCorrectMediaKeyShortcut(shortcut)) { + // there is some conflict with our preferred shortcut so we use + // the new shortcut that kglobalaccel suggests + shortcut.action->setShortcut(resultSequence[0]); + } else { + // media keys are properly handled by plasma through the + // media player plasmoid so we don't do anything in those cases + qLog(Debug) << "Leaving media key shortcuts unchanged"; + } + } + } + + return true; +} + +QList KGlobalAccelShortcutBackend::shortcutList( + const QList &seq) { + QList ret; + for (int i : seq) { + ret.append(i); + } + return ret; +} + +void KGlobalAccelShortcutBackend::unregisterAction(const QString &name, + QAction *action) { + Q_ASSERT(action); + + QStringList actionId = id(name, action); + nameToAction_.remove(id_ActionUnique(actionId), action); + iface_->unRegister(actionId); +} + +void KGlobalAccelShortcutBackend::onShortcutPressed( + const QString &componentUnique, + const QString &actionUnique, + qlonglong timestamp) const { + QAction *action = nullptr; + const QList candidates = nameToAction_.values(actionUnique); + for (QAction *a : candidates) { + if (compUniqueName() == componentUnique) { + action = a; + } + } + + if (action && action->isEnabled()) + action->trigger(); +} + +#endif // HAVE_DBUS diff --git a/src/core/kglobalaccelglobalshortcutbackend.h b/src/core/kglobalaccelglobalshortcutbackend.h new file mode 100644 index 000000000..01c47ee86 --- /dev/null +++ b/src/core/kglobalaccelglobalshortcutbackend.h @@ -0,0 +1,71 @@ +#ifndef CORE_KGLOBALACCELGLOBALSHORTCUTBACKEND_H_ +#define CORE_KGLOBALACCELGLOBALSHORTCUTBACKEND_H_ + +#include "globalshortcutbackend.h" + +#include +#include + +class QAction; + +class OrgKdeKGlobalAccelInterface; + +class OrgKdeKglobalaccelComponentInterface; + + +class KGlobalAccelShortcutBackend : public GlobalShortcutBackend { + Q_OBJECT + + public: + explicit KGlobalAccelShortcutBackend(GlobalShortcuts *parent); + + + static bool isKGlobalAccelAvailable(); + + protected: + bool DoRegister() override; + + void DoUnregister() override; + + private: +#ifdef HAVE_DBUS + enum SetShortcutFlag { + SetPresent = 2, + NoAutoloading = 4, + IsDefault = 8 + }; + + bool acquireComponent(); + + bool acquireInterface(); + + static QStringList id(const QString &name, const QAction *action); + + static QList intList(const QList &seq); + + bool registerAction(const QString &name, QAction *action, + QStringList &actionId); + + bool registerShortcut(const GlobalShortcuts::Shortcut &shortcut); + + static QList shortcutList(const QList &seq); + + void unregisterAction(const QString &name, QAction *action); + + private slots: + + void onShortcutPressed(const QString &componentUnique, + const QString &actionUnique, + qlonglong timestamp) const; + + private: + static const char *Service; + static const char *Path; + + OrgKdeKGlobalAccelInterface *iface_; + OrgKdeKglobalaccelComponentInterface *component_; + QMultiHash nameToAction_; +#endif // HAVE_DBUS +}; + +#endif //CORE_KGLOBALACCELGLOBALSHORTCUTBACKEND_H_ diff --git a/src/dbus/org.kde.KGlobalAccel.xml b/src/dbus/org.kde.KGlobalAccel.xml new file mode 100644 index 000000000..84cb0fbba --- /dev/null +++ b/src/dbus/org.kde.KGlobalAccel.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/dbus/org.kde.kglobalaccel.Component.xml b/src/dbus/org.kde.kglobalaccel.Component.xml new file mode 100644 index 000000000..aca7ef6ea --- /dev/null +++ b/src/dbus/org.kde.kglobalaccel.Component.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 8cab8fe18017e8b51975f87bbaa008a3993d6c2f Mon Sep 17 00:00:00 2001 From: Luis Caceres Date: Fri, 6 Dec 2019 23:53:40 +0000 Subject: [PATCH 2/7] Fix formatting --- .../kglobalaccelglobalshortcutbackend.cpp | 109 ++++++++---------- src/core/kglobalaccelglobalshortcutbackend.h | 64 +++++----- 2 files changed, 78 insertions(+), 95 deletions(-) diff --git a/src/core/kglobalaccelglobalshortcutbackend.cpp b/src/core/kglobalaccelglobalshortcutbackend.cpp index 7e3e455e5..3a3d04d26 100644 --- a/src/core/kglobalaccelglobalshortcutbackend.cpp +++ b/src/core/kglobalaccelglobalshortcutbackend.cpp @@ -1,8 +1,5 @@ -#include "config.h" -#include "core/closure.h" -#include "core/logging.h" -#include "globalshortcuts.h" #include "kglobalaccelglobalshortcutbackend.h" +#include "core/logging.h" #include #include @@ -17,57 +14,51 @@ // Most of this file is based on the KGlobalAccel sources // (https://phabricator.kde.org/source/kglobalaccel) - namespace { - QString compDisplayName() { - if (!QGuiApplication::applicationDisplayName().isEmpty()) { - return QGuiApplication::applicationDisplayName(); - } - return QCoreApplication::applicationName(); +QString compDisplayName() { + if (!QGuiApplication::applicationDisplayName().isEmpty()) { + return QGuiApplication::applicationDisplayName(); } + return QCoreApplication::applicationName(); +} - QString compUniqueName() { - return QCoreApplication::applicationName(); - } +QString compUniqueName() { return QCoreApplication::applicationName(); } - const QString &id_ActionUnique(const QStringList &id) { - return id.at(1); - } +const QString &id_ActionUnique(const QStringList &id) { return id.at(1); } - bool isCorrectMediaKeyShortcut(const GlobalShortcuts::Shortcut& shortcut) { - if(shortcut.id == QStringLiteral("play_pause")) { - return shortcut.action->shortcut() == QKeySequence(Qt::Key_MediaPlay); - } else if(shortcut.id == QStringLiteral("stop")) { - return shortcut.action->shortcut() == QKeySequence(Qt::Key_MediaStop); - } else if(shortcut.id == QStringLiteral("next_track")) { - return shortcut.action->shortcut() == QKeySequence(Qt::Key_MediaNext); - } else if(shortcut.id == QStringLiteral("prev_track")) { - return shortcut.action->shortcut() == QKeySequence(Qt::Key_MediaPrevious); - } else { - return false; - } +bool isCorrectMediaKeyShortcut(const GlobalShortcuts::Shortcut &shortcut) { + if (shortcut.id == QStringLiteral("play_pause")) { + return shortcut.action->shortcut() == QKeySequence(Qt::Key_MediaPlay); + } else if (shortcut.id == QStringLiteral("stop")) { + return shortcut.action->shortcut() == QKeySequence(Qt::Key_MediaStop); + } else if (shortcut.id == QStringLiteral("next_track")) { + return shortcut.action->shortcut() == QKeySequence(Qt::Key_MediaNext); + } else if (shortcut.id == QStringLiteral("prev_track")) { + return shortcut.action->shortcut() == QKeySequence(Qt::Key_MediaPrevious); + } else { + return false; } } +} // namespace #ifdef HAVE_DBUS KGlobalAccelShortcutBackend::KGlobalAccelShortcutBackend( GlobalShortcuts *parent) - : GlobalShortcutBackend(parent), - iface_(nullptr), - component_(nullptr), + : GlobalShortcutBackend(parent), iface_(nullptr), component_(nullptr), nameToAction_() {} -#else // HAVE_DBUS -KGlobalAccelShortcutBackend::KGlobalAccelShortcutBackend(GlobalShortcuts *parent) - : GlobalShortcutBackend(parent) {} +#else // HAVE_DBUS +KGlobalAccelShortcutBackend::KGlobalAccelShortcutBackend( + GlobalShortcuts *parent) + : GlobalShortcutBackend(parent) {} #endif // HAVE_DBUS bool KGlobalAccelShortcutBackend::isKGlobalAccelAvailable() { #ifdef HAVE_DBUS return QDBusConnection::sessionBus().interface()->isServiceRegistered( Service); -#else // HAVE_DBUS +#else // HAVE_DBUS return false; #endif // HAVE_DBUS } @@ -80,8 +71,9 @@ bool KGlobalAccelShortcutBackend::DoRegister() { return false; bool complete = true; - for (const GlobalShortcuts::Shortcut &shortcut : manager_->shortcuts().values()) { - if(shortcut.action->shortcut().isEmpty()) + for (const GlobalShortcuts::Shortcut &shortcut : + manager_->shortcuts().values()) { + if (shortcut.action->shortcut().isEmpty()) continue; if (!registerShortcut(shortcut)) @@ -93,11 +85,10 @@ bool KGlobalAccelShortcutBackend::DoRegister() { QObject::connect(component_, &OrgKdeKglobalaccelComponentInterface::globalShortcutPressed, - this, - &KGlobalAccelShortcutBackend::onShortcutPressed); + this, &KGlobalAccelShortcutBackend::onShortcutPressed); return complete; -#else // HAVE_DBUS +#else // HAVE_DBUS qLog(Warning) << "dbus not available"; return false; #endif // HAVE_DBUS @@ -133,10 +124,8 @@ bool KGlobalAccelShortcutBackend::acquireComponent() { return false; } - component_ = new org::kde::kglobalaccel::Component(Service, - reply.value().path(), - QDBusConnection::sessionBus(), - iface_); + component_ = new org::kde::kglobalaccel::Component( + Service, reply.value().path(), QDBusConnection::sessionBus(), iface_); if (!component_->isValid()) { qLog(Warning) << "Failed to get KGlobalAccel component:" @@ -154,9 +143,8 @@ bool KGlobalAccelShortcutBackend::acquireInterface() { return true; if (isKGlobalAccelAvailable()) { - iface_ = new OrgKdeKGlobalAccelInterface(Service, Path, - QDBusConnection::sessionBus(), - this); + iface_ = new OrgKdeKGlobalAccelInterface( + Service, Path, QDBusConnection::sessionBus(), this); } if (iface_ && iface_->isValid()) @@ -183,8 +171,8 @@ QStringList KGlobalAccelShortcutBackend::id(const QString &name, return ret; } -QList KGlobalAccelShortcutBackend::intList( - const QList &seq) { +QList +KGlobalAccelShortcutBackend::intList(const QList &seq) { QList ret; for (const QKeySequence &sequence : seq) { ret.append(sequence[0]); @@ -200,9 +188,9 @@ bool KGlobalAccelShortcutBackend::registerAction(const QString &name, QStringList &actionId) { Q_ASSERT(action); - if (name.isEmpty() && (action->objectName().isEmpty() || - action->objectName().startsWith( - QLatin1String("unnamed-")))) { + if (name.isEmpty() && + (action->objectName().isEmpty() || + action->objectName().startsWith(QLatin1String("unnamed-")))) { qLog(Warning) << "Cannot register shortcut for unnamed action"; return false; } @@ -214,7 +202,8 @@ bool KGlobalAccelShortcutBackend::registerAction(const QString &name, return true; } -bool KGlobalAccelShortcutBackend::registerShortcut(const GlobalShortcuts::Shortcut &shortcut) { +bool KGlobalAccelShortcutBackend::registerShortcut( + const GlobalShortcuts::Shortcut &shortcut) { QStringList actionId; if (!registerAction(shortcut.id, shortcut.action, actionId)) return false; @@ -222,9 +211,8 @@ bool KGlobalAccelShortcutBackend::registerShortcut(const GlobalShortcuts::Shortc QList activeShortcut; activeShortcut << shortcut.action->shortcut(); - const QList result = iface_->setShortcut(actionId, - intList(activeShortcut), - SetShortcutFlag::SetPresent); + const QList result = iface_->setShortcut( + actionId, intList(activeShortcut), SetShortcutFlag::SetPresent); const QList resultSequence = shortcutList(result); if (resultSequence != activeShortcut) { @@ -232,7 +220,7 @@ bool KGlobalAccelShortcutBackend::registerShortcut(const GlobalShortcuts::Shortc << "but KGlobalAccel returned" << resultSequence; if (!resultSequence.isEmpty()) { - if(!isCorrectMediaKeyShortcut(shortcut)) { + if (!isCorrectMediaKeyShortcut(shortcut)) { // there is some conflict with our preferred shortcut so we use // the new shortcut that kglobalaccel suggests shortcut.action->setShortcut(resultSequence[0]); @@ -247,8 +235,8 @@ bool KGlobalAccelShortcutBackend::registerShortcut(const GlobalShortcuts::Shortc return true; } -QList KGlobalAccelShortcutBackend::shortcutList( - const QList &seq) { +QList +KGlobalAccelShortcutBackend::shortcutList(const QList &seq) { QList ret; for (int i : seq) { ret.append(i); @@ -266,8 +254,7 @@ void KGlobalAccelShortcutBackend::unregisterAction(const QString &name, } void KGlobalAccelShortcutBackend::onShortcutPressed( - const QString &componentUnique, - const QString &actionUnique, + const QString &componentUnique, const QString &actionUnique, qlonglong timestamp) const { QAction *action = nullptr; const QList candidates = nameToAction_.values(actionUnique); diff --git a/src/core/kglobalaccelglobalshortcutbackend.h b/src/core/kglobalaccelglobalshortcutbackend.h index 01c47ee86..a72f39c9d 100644 --- a/src/core/kglobalaccelglobalshortcutbackend.h +++ b/src/core/kglobalaccelglobalshortcutbackend.h @@ -1,7 +1,9 @@ #ifndef CORE_KGLOBALACCELGLOBALSHORTCUTBACKEND_H_ #define CORE_KGLOBALACCELGLOBALSHORTCUTBACKEND_H_ +#include "config.h" #include "globalshortcutbackend.h" +#include "globalshortcuts.h" #include #include @@ -12,60 +14,54 @@ class OrgKdeKGlobalAccelInterface; class OrgKdeKglobalaccelComponentInterface; - class KGlobalAccelShortcutBackend : public GlobalShortcutBackend { Q_OBJECT - public: - explicit KGlobalAccelShortcutBackend(GlobalShortcuts *parent); +public: + explicit KGlobalAccelShortcutBackend(GlobalShortcuts *parent); + static bool isKGlobalAccelAvailable(); - static bool isKGlobalAccelAvailable(); +protected: + bool DoRegister() override; - protected: - bool DoRegister() override; + void DoUnregister() override; - void DoUnregister() override; - - private: +private: #ifdef HAVE_DBUS - enum SetShortcutFlag { - SetPresent = 2, - NoAutoloading = 4, - IsDefault = 8 - }; + enum SetShortcutFlag { SetPresent = 2, NoAutoloading = 4, IsDefault = 8 }; - bool acquireComponent(); + bool acquireComponent(); - bool acquireInterface(); + bool acquireInterface(); - static QStringList id(const QString &name, const QAction *action); + static QStringList id(const QString &name, const QAction *action); - static QList intList(const QList &seq); + static QList intList(const QList &seq); - bool registerAction(const QString &name, QAction *action, - QStringList &actionId); + bool registerAction(const QString &name, QAction *action, + QStringList &actionId); - bool registerShortcut(const GlobalShortcuts::Shortcut &shortcut); + bool registerShortcut(const GlobalShortcuts::Shortcut &shortcut); - static QList shortcutList(const QList &seq); + static QList shortcutList(const QList &seq); - void unregisterAction(const QString &name, QAction *action); + void unregisterAction(const QString &name, QAction *action); - private slots: +private slots: - void onShortcutPressed(const QString &componentUnique, - const QString &actionUnique, - qlonglong timestamp) const; + void onShortcutPressed(const QString &componentUnique, + const QString &actionUnique, + qlonglong timestamp) const; - private: - static const char *Service; - static const char *Path; +private: + static const char *Service; + static const char *Path; - OrgKdeKGlobalAccelInterface *iface_; - OrgKdeKglobalaccelComponentInterface *component_; - QMultiHash nameToAction_; + OrgKdeKGlobalAccelInterface *iface_; + OrgKdeKglobalaccelComponentInterface *component_; + QMultiHash nameToAction_; #endif // HAVE_DBUS }; -#endif //CORE_KGLOBALACCELGLOBALSHORTCUTBACKEND_H_ +#endif // CORE_KGLOBALACCELGLOBALSHORTCUTBACKEND_H_ From 0b6519bad4f97860424cc070d6c14120efbb4401 Mon Sep 17 00:00:00 2001 From: Luis Caceres Date: Fri, 6 Dec 2019 23:56:15 +0000 Subject: [PATCH 3/7] Fix build with DBus disabled --- src/core/kglobalaccelglobalshortcutbackend.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/core/kglobalaccelglobalshortcutbackend.cpp b/src/core/kglobalaccelglobalshortcutbackend.cpp index 3a3d04d26..a5e66efae 100644 --- a/src/core/kglobalaccelglobalshortcutbackend.cpp +++ b/src/core/kglobalaccelglobalshortcutbackend.cpp @@ -15,6 +15,7 @@ // (https://phabricator.kde.org/source/kglobalaccel) namespace { +#ifdef HAVE_DBUS QString compDisplayName() { if (!QGuiApplication::applicationDisplayName().isEmpty()) { return QGuiApplication::applicationDisplayName(); @@ -39,6 +40,7 @@ bool isCorrectMediaKeyShortcut(const GlobalShortcuts::Shortcut &shortcut) { return false; } } +#endif // HAVE_DBUS } // namespace #ifdef HAVE_DBUS @@ -95,6 +97,7 @@ bool KGlobalAccelShortcutBackend::DoRegister() { } void KGlobalAccelShortcutBackend::DoUnregister() { +#ifdef HAVE_DBUS if (!acquireInterface()) return; @@ -103,6 +106,7 @@ void KGlobalAccelShortcutBackend::DoUnregister() { for (const GlobalShortcuts::Shortcut &shortcut : manager_->shortcuts()) unregisterAction(shortcut.id, shortcut.action); +#endif // HAVE_DBUS } #ifdef HAVE_DBUS From a3531d749a74df4f3f64e3cf5b34ce9b86fed74e Mon Sep 17 00:00:00 2001 From: Luis Caceres Date: Sat, 7 Dec 2019 19:30:10 +0000 Subject: [PATCH 4/7] Actually fix formatting --- src/core/globalshortcuts.cpp | 5 +- .../kglobalaccelglobalshortcutbackend.cpp | 109 ++++++++---------- src/core/kglobalaccelglobalshortcutbackend.h | 44 +++---- 3 files changed, 75 insertions(+), 83 deletions(-) diff --git a/src/core/globalshortcuts.cpp b/src/core/globalshortcuts.cpp index 70ba0dab4..cbc2483c8 100644 --- a/src/core/globalshortcuts.cpp +++ b/src/core/globalshortcuts.cpp @@ -43,7 +43,8 @@ GlobalShortcuts::GlobalShortcuts(QWidget* parent) gnome_backend_(nullptr), system_backend_(nullptr), use_gnome_(false), - have_kglobalaccel_(KGlobalAccelShortcutBackend::isKGlobalAccelAvailable()) { + have_kglobalaccel_( + KGlobalAccelShortcutBackend::isKGlobalAccelAvailable()) { settings_.beginGroup(kSettingsGroup); // Create actions @@ -166,7 +167,7 @@ void GlobalShortcuts::Unregister() { } void GlobalShortcuts::Register() { - if(have_kglobalaccel_ && kglobalaccel_backend_->Register()) return; + if (have_kglobalaccel_ && kglobalaccel_backend_->Register()) return; if (use_gnome_ && gnome_backend_->Register()) return; system_backend_->Register(); } diff --git a/src/core/kglobalaccelglobalshortcutbackend.cpp b/src/core/kglobalaccelglobalshortcutbackend.cpp index a5e66efae..bef3c2f44 100644 --- a/src/core/kglobalaccelglobalshortcutbackend.cpp +++ b/src/core/kglobalaccelglobalshortcutbackend.cpp @@ -1,5 +1,5 @@ -#include "kglobalaccelglobalshortcutbackend.h" #include "core/logging.h" +#include "kglobalaccelglobalshortcutbackend.h" #include #include @@ -25,9 +25,9 @@ QString compDisplayName() { QString compUniqueName() { return QCoreApplication::applicationName(); } -const QString &id_ActionUnique(const QStringList &id) { return id.at(1); } +const QString& id_ActionUnique(const QStringList& id) { return id.at(1); } -bool isCorrectMediaKeyShortcut(const GlobalShortcuts::Shortcut &shortcut) { +bool isCorrectMediaKeyShortcut(const GlobalShortcuts::Shortcut& shortcut) { if (shortcut.id == QStringLiteral("play_pause")) { return shortcut.action->shortcut() == QKeySequence(Qt::Key_MediaPlay); } else if (shortcut.id == QStringLiteral("stop")) { @@ -40,79 +40,75 @@ bool isCorrectMediaKeyShortcut(const GlobalShortcuts::Shortcut &shortcut) { return false; } } -#endif // HAVE_DBUS -} // namespace +#endif // HAVE_DBUS +} // namespace #ifdef HAVE_DBUS KGlobalAccelShortcutBackend::KGlobalAccelShortcutBackend( - GlobalShortcuts *parent) - : GlobalShortcutBackend(parent), iface_(nullptr), component_(nullptr), + GlobalShortcuts* parent) + : GlobalShortcutBackend(parent), + iface_(nullptr), + component_(nullptr), nameToAction_() {} -#else // HAVE_DBUS +#else // HAVE_DBUS KGlobalAccelShortcutBackend::KGlobalAccelShortcutBackend( - GlobalShortcuts *parent) + GlobalShortcuts* parent) : GlobalShortcutBackend(parent) {} -#endif // HAVE_DBUS +#endif // HAVE_DBUS bool KGlobalAccelShortcutBackend::isKGlobalAccelAvailable() { #ifdef HAVE_DBUS return QDBusConnection::sessionBus().interface()->isServiceRegistered( Service); -#else // HAVE_DBUS +#else // HAVE_DBUS return false; -#endif // HAVE_DBUS +#endif // HAVE_DBUS } bool KGlobalAccelShortcutBackend::DoRegister() { #ifdef HAVE_DBUS qLog(Debug) << "Registering shortcuts"; - if (!acquireInterface()) - return false; + if (!acquireInterface()) return false; bool complete = true; - for (const GlobalShortcuts::Shortcut &shortcut : + for (const GlobalShortcuts::Shortcut& shortcut : manager_->shortcuts().values()) { - if (shortcut.action->shortcut().isEmpty()) - continue; + if (shortcut.action->shortcut().isEmpty()) continue; - if (!registerShortcut(shortcut)) - complete = false; + if (!registerShortcut(shortcut)) complete = false; } - if (!acquireComponent()) - return false; + if (!acquireComponent()) return false; QObject::connect(component_, &OrgKdeKglobalaccelComponentInterface::globalShortcutPressed, this, &KGlobalAccelShortcutBackend::onShortcutPressed); return complete; -#else // HAVE_DBUS +#else // HAVE_DBUS qLog(Warning) << "dbus not available"; return false; -#endif // HAVE_DBUS +#endif // HAVE_DBUS } void KGlobalAccelShortcutBackend::DoUnregister() { #ifdef HAVE_DBUS - if (!acquireInterface()) - return; + if (!acquireInterface()) return; - if (!acquireComponent()) - return; + if (!acquireComponent()) return; - for (const GlobalShortcuts::Shortcut &shortcut : manager_->shortcuts()) + for (const GlobalShortcuts::Shortcut& shortcut : manager_->shortcuts()) unregisterAction(shortcut.id, shortcut.action); -#endif // HAVE_DBUS +#endif // HAVE_DBUS } #ifdef HAVE_DBUS -const char *KGlobalAccelShortcutBackend::Service = "org.kde.kglobalaccel"; -const char *KGlobalAccelShortcutBackend::Path = "/kglobalaccel"; +const char* KGlobalAccelShortcutBackend::Service = "org.kde.kglobalaccel"; +const char* KGlobalAccelShortcutBackend::Path = "/kglobalaccel"; bool KGlobalAccelShortcutBackend::acquireComponent() { Q_ASSERT(iface_ && iface_->isValid()); @@ -143,16 +139,14 @@ bool KGlobalAccelShortcutBackend::acquireComponent() { } bool KGlobalAccelShortcutBackend::acquireInterface() { - if (iface_ && iface_->isValid()) - return true; + if (iface_ && iface_->isValid()) return true; if (isKGlobalAccelAvailable()) { iface_ = new OrgKdeKGlobalAccelInterface( Service, Path, QDBusConnection::sessionBus(), this); } - if (iface_ && iface_->isValid()) - return true; + if (iface_ && iface_->isValid()) return true; if (!iface_) qLog(Warning) << "KGlobalAccel daemon not registered"; @@ -161,8 +155,8 @@ bool KGlobalAccelShortcutBackend::acquireInterface() { return false; } -QStringList KGlobalAccelShortcutBackend::id(const QString &name, - const QAction *action) { +QStringList KGlobalAccelShortcutBackend::id(const QString& name, + const QAction* action) { Q_ASSERT(action); QStringList ret; @@ -170,15 +164,14 @@ QStringList KGlobalAccelShortcutBackend::id(const QString &name, ret << name; ret << compDisplayName(); ret << action->text().replace(QLatin1Char('&'), QStringLiteral("")); - if (ret.back().isEmpty()) - ret.back() = name; + if (ret.back().isEmpty()) ret.back() = name; return ret; } -QList -KGlobalAccelShortcutBackend::intList(const QList &seq) { +QList KGlobalAccelShortcutBackend::intList( + const QList& seq) { QList ret; - for (const QKeySequence &sequence : seq) { + for (const QKeySequence& sequence : seq) { ret.append(sequence[0]); } while (!ret.isEmpty() && ret.last() == 0) { @@ -187,9 +180,9 @@ KGlobalAccelShortcutBackend::intList(const QList &seq) { return ret; } -bool KGlobalAccelShortcutBackend::registerAction(const QString &name, - QAction *action, - QStringList &actionId) { +bool KGlobalAccelShortcutBackend::registerAction(const QString& name, + QAction* action, + QStringList& actionId) { Q_ASSERT(action); if (name.isEmpty() && @@ -207,10 +200,9 @@ bool KGlobalAccelShortcutBackend::registerAction(const QString &name, } bool KGlobalAccelShortcutBackend::registerShortcut( - const GlobalShortcuts::Shortcut &shortcut) { + const GlobalShortcuts::Shortcut& shortcut) { QStringList actionId; - if (!registerAction(shortcut.id, shortcut.action, actionId)) - return false; + if (!registerAction(shortcut.id, shortcut.action, actionId)) return false; QList activeShortcut; activeShortcut << shortcut.action->shortcut(); @@ -239,8 +231,8 @@ bool KGlobalAccelShortcutBackend::registerShortcut( return true; } -QList -KGlobalAccelShortcutBackend::shortcutList(const QList &seq) { +QList KGlobalAccelShortcutBackend::shortcutList( + const QList& seq) { QList ret; for (int i : seq) { ret.append(i); @@ -248,8 +240,8 @@ KGlobalAccelShortcutBackend::shortcutList(const QList &seq) { return ret; } -void KGlobalAccelShortcutBackend::unregisterAction(const QString &name, - QAction *action) { +void KGlobalAccelShortcutBackend::unregisterAction(const QString& name, + QAction* action) { Q_ASSERT(action); QStringList actionId = id(name, action); @@ -258,18 +250,17 @@ void KGlobalAccelShortcutBackend::unregisterAction(const QString &name, } void KGlobalAccelShortcutBackend::onShortcutPressed( - const QString &componentUnique, const QString &actionUnique, + const QString& componentUnique, const QString& actionUnique, qlonglong timestamp) const { - QAction *action = nullptr; - const QList candidates = nameToAction_.values(actionUnique); - for (QAction *a : candidates) { + QAction* action = nullptr; + const QList candidates = nameToAction_.values(actionUnique); + for (QAction* a : candidates) { if (compUniqueName() == componentUnique) { action = a; } } - if (action && action->isEnabled()) - action->trigger(); + if (action && action->isEnabled()) action->trigger(); } -#endif // HAVE_DBUS +#endif // HAVE_DBUS diff --git a/src/core/kglobalaccelglobalshortcutbackend.h b/src/core/kglobalaccelglobalshortcutbackend.h index a72f39c9d..9cbe8944d 100644 --- a/src/core/kglobalaccelglobalshortcutbackend.h +++ b/src/core/kglobalaccelglobalshortcutbackend.h @@ -17,17 +17,17 @@ class OrgKdeKglobalaccelComponentInterface; class KGlobalAccelShortcutBackend : public GlobalShortcutBackend { Q_OBJECT -public: - explicit KGlobalAccelShortcutBackend(GlobalShortcuts *parent); + public: + explicit KGlobalAccelShortcutBackend(GlobalShortcuts* parent); static bool isKGlobalAccelAvailable(); -protected: + protected: bool DoRegister() override; void DoUnregister() override; -private: + private: #ifdef HAVE_DBUS enum SetShortcutFlag { SetPresent = 2, NoAutoloading = 4, IsDefault = 8 }; @@ -35,33 +35,33 @@ private: bool acquireInterface(); - static QStringList id(const QString &name, const QAction *action); + static QStringList id(const QString& name, const QAction* action); - static QList intList(const QList &seq); + static QList intList(const QList& seq); - bool registerAction(const QString &name, QAction *action, - QStringList &actionId); + bool registerAction(const QString& name, QAction* action, + QStringList& actionId); - bool registerShortcut(const GlobalShortcuts::Shortcut &shortcut); + bool registerShortcut(const GlobalShortcuts::Shortcut& shortcut); - static QList shortcutList(const QList &seq); + static QList shortcutList(const QList& seq); - void unregisterAction(const QString &name, QAction *action); + void unregisterAction(const QString& name, QAction* action); -private slots: + private slots: - void onShortcutPressed(const QString &componentUnique, - const QString &actionUnique, + void onShortcutPressed(const QString& componentUnique, + const QString& actionUnique, qlonglong timestamp) const; -private: - static const char *Service; - static const char *Path; + private: + static const char* Service; + static const char* Path; - OrgKdeKGlobalAccelInterface *iface_; - OrgKdeKglobalaccelComponentInterface *component_; - QMultiHash nameToAction_; -#endif // HAVE_DBUS + OrgKdeKGlobalAccelInterface* iface_; + OrgKdeKglobalaccelComponentInterface* component_; + QMultiHash nameToAction_; +#endif // HAVE_DBUS }; -#endif // CORE_KGLOBALACCELGLOBALSHORTCUTBACKEND_H_ +#endif // CORE_KGLOBALACCELGLOBALSHORTCUTBACKEND_H_ From 2307c1522778cc0037f54578c5ad0042f882f3ea Mon Sep 17 00:00:00 2001 From: Luis Caceres Date: Mon, 9 Dec 2019 16:25:29 +0000 Subject: [PATCH 5/7] Fix style --- src/core/globalshortcuts.cpp | 2 +- .../kglobalaccelglobalshortcutbackend.cpp | 120 +++++++++--------- src/core/kglobalaccelglobalshortcutbackend.h | 29 ++--- 3 files changed, 73 insertions(+), 78 deletions(-) diff --git a/src/core/globalshortcuts.cpp b/src/core/globalshortcuts.cpp index cbc2483c8..b1c87c5f8 100644 --- a/src/core/globalshortcuts.cpp +++ b/src/core/globalshortcuts.cpp @@ -44,7 +44,7 @@ GlobalShortcuts::GlobalShortcuts(QWidget* parent) system_backend_(nullptr), use_gnome_(false), have_kglobalaccel_( - KGlobalAccelShortcutBackend::isKGlobalAccelAvailable()) { + KGlobalAccelShortcutBackend::IsKGlobalAccelAvailable()) { settings_.beginGroup(kSettingsGroup); // Create actions diff --git a/src/core/kglobalaccelglobalshortcutbackend.cpp b/src/core/kglobalaccelglobalshortcutbackend.cpp index bef3c2f44..dac6019a9 100644 --- a/src/core/kglobalaccelglobalshortcutbackend.cpp +++ b/src/core/kglobalaccelglobalshortcutbackend.cpp @@ -16,18 +16,17 @@ namespace { #ifdef HAVE_DBUS -QString compDisplayName() { - if (!QGuiApplication::applicationDisplayName().isEmpty()) { - return QGuiApplication::applicationDisplayName(); - } - return QCoreApplication::applicationName(); +QString ComponentDisplayName() { + return QGuiApplication::applicationDisplayName().isEmpty() + ? QCoreApplication::applicationName() + : QGuiApplication::applicationDisplayName(); } -QString compUniqueName() { return QCoreApplication::applicationName(); } +QString ComponentUniqueName() { return QCoreApplication::applicationName(); } -const QString& id_ActionUnique(const QStringList& id) { return id.at(1); } +const QString& IdActionUniqueName(const QStringList& id) { return id.at(1); } -bool isCorrectMediaKeyShortcut(const GlobalShortcuts::Shortcut& shortcut) { +bool IsCorrectMediaKeyShortcut(const GlobalShortcuts::Shortcut& shortcut) { if (shortcut.id == QStringLiteral("play_pause")) { return shortcut.action->shortcut() == QKeySequence(Qt::Key_MediaPlay); } else if (shortcut.id == QStringLiteral("stop")) { @@ -49,8 +48,7 @@ KGlobalAccelShortcutBackend::KGlobalAccelShortcutBackend( GlobalShortcuts* parent) : GlobalShortcutBackend(parent), iface_(nullptr), - component_(nullptr), - nameToAction_() {} + component_(nullptr) {} #else // HAVE_DBUS KGlobalAccelShortcutBackend::KGlobalAccelShortcutBackend( @@ -58,10 +56,10 @@ KGlobalAccelShortcutBackend::KGlobalAccelShortcutBackend( : GlobalShortcutBackend(parent) {} #endif // HAVE_DBUS -bool KGlobalAccelShortcutBackend::isKGlobalAccelAvailable() { +bool KGlobalAccelShortcutBackend::IsKGlobalAccelAvailable() { #ifdef HAVE_DBUS return QDBusConnection::sessionBus().interface()->isServiceRegistered( - Service); + kService); #else // HAVE_DBUS return false; #endif // HAVE_DBUS @@ -71,21 +69,21 @@ bool KGlobalAccelShortcutBackend::DoRegister() { #ifdef HAVE_DBUS qLog(Debug) << "Registering shortcuts"; - if (!acquireInterface()) return false; + if (!AcquireInterface()) return false; bool complete = true; for (const GlobalShortcuts::Shortcut& shortcut : manager_->shortcuts().values()) { if (shortcut.action->shortcut().isEmpty()) continue; - if (!registerShortcut(shortcut)) complete = false; + if (!RegisterShortcut(shortcut)) complete = false; } - if (!acquireComponent()) return false; + if (!AcquireComponent()) return false; QObject::connect(component_, &OrgKdeKglobalaccelComponentInterface::globalShortcutPressed, - this, &KGlobalAccelShortcutBackend::onShortcutPressed); + this, &KGlobalAccelShortcutBackend::OnShortcutPressed); return complete; #else // HAVE_DBUS @@ -96,25 +94,24 @@ bool KGlobalAccelShortcutBackend::DoRegister() { void KGlobalAccelShortcutBackend::DoUnregister() { #ifdef HAVE_DBUS - if (!acquireInterface()) return; + if (!AcquireInterface()) return; - if (!acquireComponent()) return; + if (!AcquireComponent()) return; for (const GlobalShortcuts::Shortcut& shortcut : manager_->shortcuts()) - unregisterAction(shortcut.id, shortcut.action); + UnregisterAction(shortcut.id, shortcut.action); #endif // HAVE_DBUS } #ifdef HAVE_DBUS -const char* KGlobalAccelShortcutBackend::Service = "org.kde.kglobalaccel"; -const char* KGlobalAccelShortcutBackend::Path = "/kglobalaccel"; +const char* KGlobalAccelShortcutBackend::kService = "org.kde.kglobalaccel"; +const char* KGlobalAccelShortcutBackend::kPath = "/kglobalaccel"; -bool KGlobalAccelShortcutBackend::acquireComponent() { +bool KGlobalAccelShortcutBackend::AcquireComponent() { Q_ASSERT(iface_ && iface_->isValid()); - QString componentName = compUniqueName(); - QDBusReply reply = iface_->getComponent(compUniqueName()); + QDBusReply reply = iface_->getComponent(ComponentUniqueName()); if (!reply.isValid()) { if (reply.error().name() == QLatin1String("org.kde.kglobalaccel.NoSuchComponent")) @@ -125,12 +122,12 @@ bool KGlobalAccelShortcutBackend::acquireComponent() { } component_ = new org::kde::kglobalaccel::Component( - Service, reply.value().path(), QDBusConnection::sessionBus(), iface_); + kService, reply.value().path(), QDBusConnection::sessionBus(), iface_); if (!component_->isValid()) { qLog(Warning) << "Failed to get KGlobalAccel component:" << QDBusConnection::sessionBus().lastError(); - delete component_; + component_->deleteLater(); component_ = nullptr; return false; } @@ -138,12 +135,12 @@ bool KGlobalAccelShortcutBackend::acquireComponent() { return true; } -bool KGlobalAccelShortcutBackend::acquireInterface() { +bool KGlobalAccelShortcutBackend::AcquireInterface() { if (iface_ && iface_->isValid()) return true; - if (isKGlobalAccelAvailable()) { + if (IsKGlobalAccelAvailable()) { iface_ = new OrgKdeKGlobalAccelInterface( - Service, Path, QDBusConnection::sessionBus(), this); + kService, kPath, QDBusConnection::sessionBus(), this); } if (iface_ && iface_->isValid()) return true; @@ -155,20 +152,20 @@ bool KGlobalAccelShortcutBackend::acquireInterface() { return false; } -QStringList KGlobalAccelShortcutBackend::id(const QString& name, - const QAction* action) { +QStringList KGlobalAccelShortcutBackend::GetId(const QString& name, + const QAction* action) { Q_ASSERT(action); QStringList ret; - ret << compUniqueName(); + ret << ComponentUniqueName(); ret << name; - ret << compDisplayName(); + ret << ComponentDisplayName(); ret << action->text().replace(QLatin1Char('&'), QStringLiteral("")); if (ret.back().isEmpty()) ret.back() = name; return ret; } -QList KGlobalAccelShortcutBackend::intList( +QList KGlobalAccelShortcutBackend::ToIntList( const QList& seq) { QList ret; for (const QKeySequence& sequence : seq) { @@ -180,9 +177,8 @@ QList KGlobalAccelShortcutBackend::intList( return ret; } -bool KGlobalAccelShortcutBackend::registerAction(const QString& name, - QAction* action, - QStringList& actionId) { +bool KGlobalAccelShortcutBackend::RegisterAction(const QString& name, + QAction* action) { Q_ASSERT(action); if (name.isEmpty() && @@ -192,34 +188,34 @@ bool KGlobalAccelShortcutBackend::registerAction(const QString& name, return false; } - actionId = id(name, action); - nameToAction_.insertMulti(id_ActionUnique(actionId), action); - iface_->doRegister(actionId); + QStringList action_id = GetId(name, action); + name_to_action_.insertMulti(IdActionUniqueName(action_id), action); + iface_->doRegister(action_id); return true; } -bool KGlobalAccelShortcutBackend::registerShortcut( +bool KGlobalAccelShortcutBackend::RegisterShortcut( const GlobalShortcuts::Shortcut& shortcut) { - QStringList actionId; - if (!registerAction(shortcut.id, shortcut.action, actionId)) return false; + if (!RegisterAction(shortcut.id, shortcut.action)) return false; - QList activeShortcut; - activeShortcut << shortcut.action->shortcut(); + QList active_shortcut; + active_shortcut << shortcut.action->shortcut(); + QStringList action_id = GetId(shortcut.id, shortcut.action); const QList result = iface_->setShortcut( - actionId, intList(activeShortcut), SetShortcutFlag::SetPresent); + action_id, ToIntList(active_shortcut), SetShortcutFlag::SetPresent); - const QList resultSequence = shortcutList(result); - if (resultSequence != activeShortcut) { - qLog(Warning) << "Tried setting global shortcut" << activeShortcut - << "but KGlobalAccel returned" << resultSequence; + const QList result_sequence = ToKeySequenceList(result); + if (result_sequence != active_shortcut) { + qLog(Warning) << "Tried setting global shortcut" << active_shortcut + << "but KGlobalAccel returned" << result_sequence; - if (!resultSequence.isEmpty()) { - if (!isCorrectMediaKeyShortcut(shortcut)) { + if (!result_sequence.isEmpty()) { + if (!IsCorrectMediaKeyShortcut(shortcut)) { // there is some conflict with our preferred shortcut so we use // the new shortcut that kglobalaccel suggests - shortcut.action->setShortcut(resultSequence[0]); + shortcut.action->setShortcut(result_sequence[0]); } else { // media keys are properly handled by plasma through the // media player plasmoid so we don't do anything in those cases @@ -231,7 +227,7 @@ bool KGlobalAccelShortcutBackend::registerShortcut( return true; } -QList KGlobalAccelShortcutBackend::shortcutList( +QList KGlobalAccelShortcutBackend::ToKeySequenceList( const QList& seq) { QList ret; for (int i : seq) { @@ -240,22 +236,22 @@ QList KGlobalAccelShortcutBackend::shortcutList( return ret; } -void KGlobalAccelShortcutBackend::unregisterAction(const QString& name, +void KGlobalAccelShortcutBackend::UnregisterAction(const QString& name, QAction* action) { Q_ASSERT(action); - QStringList actionId = id(name, action); - nameToAction_.remove(id_ActionUnique(actionId), action); - iface_->unRegister(actionId); + QStringList action_id = GetId(name, action); + name_to_action_.remove(IdActionUniqueName(action_id), action); + iface_->unRegister(action_id); } -void KGlobalAccelShortcutBackend::onShortcutPressed( - const QString& componentUnique, const QString& actionUnique, +void KGlobalAccelShortcutBackend::OnShortcutPressed( + const QString& component_unique, const QString& action_unique, qlonglong timestamp) const { QAction* action = nullptr; - const QList candidates = nameToAction_.values(actionUnique); + const QList candidates = name_to_action_.values(action_unique); for (QAction* a : candidates) { - if (compUniqueName() == componentUnique) { + if (ComponentUniqueName() == component_unique) { action = a; } } diff --git a/src/core/kglobalaccelglobalshortcutbackend.h b/src/core/kglobalaccelglobalshortcutbackend.h index 9cbe8944d..8f687df84 100644 --- a/src/core/kglobalaccelglobalshortcutbackend.h +++ b/src/core/kglobalaccelglobalshortcutbackend.h @@ -20,7 +20,7 @@ class KGlobalAccelShortcutBackend : public GlobalShortcutBackend { public: explicit KGlobalAccelShortcutBackend(GlobalShortcuts* parent); - static bool isKGlobalAccelAvailable(); + static bool IsKGlobalAccelAvailable(); protected: bool DoRegister() override; @@ -31,36 +31,35 @@ class KGlobalAccelShortcutBackend : public GlobalShortcutBackend { #ifdef HAVE_DBUS enum SetShortcutFlag { SetPresent = 2, NoAutoloading = 4, IsDefault = 8 }; - bool acquireComponent(); + bool AcquireComponent(); - bool acquireInterface(); + bool AcquireInterface(); - static QStringList id(const QString& name, const QAction* action); + static QStringList GetId(const QString& name, const QAction* action); - static QList intList(const QList& seq); + static QList ToIntList(const QList& seq); - bool registerAction(const QString& name, QAction* action, - QStringList& actionId); + bool RegisterAction(const QString& name, QAction* action); - bool registerShortcut(const GlobalShortcuts::Shortcut& shortcut); + bool RegisterShortcut(const GlobalShortcuts::Shortcut& shortcut); - static QList shortcutList(const QList& seq); + static QList ToKeySequenceList(const QList& seq); - void unregisterAction(const QString& name, QAction* action); + void UnregisterAction(const QString& name, QAction* action); private slots: - void onShortcutPressed(const QString& componentUnique, - const QString& actionUnique, + void OnShortcutPressed(const QString& component_unique, + const QString& action_unique, qlonglong timestamp) const; private: - static const char* Service; - static const char* Path; + static const char* kService; + static const char* kPath; OrgKdeKGlobalAccelInterface* iface_; OrgKdeKglobalaccelComponentInterface* component_; - QMultiHash nameToAction_; + QMultiHash name_to_action_; #endif // HAVE_DBUS }; From 344989785bdc9a372e152cb705bf33527ce04d7f Mon Sep 17 00:00:00 2001 From: Luis Caceres Date: Mon, 9 Dec 2019 16:57:39 +0000 Subject: [PATCH 6/7] Fix multiple triggers of shortcut actions Also properly connect/disconnect from DBus signal upons register/unregister. --- src/core/kglobalaccelglobalshortcutbackend.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/core/kglobalaccelglobalshortcutbackend.cpp b/src/core/kglobalaccelglobalshortcutbackend.cpp index dac6019a9..000f870ac 100644 --- a/src/core/kglobalaccelglobalshortcutbackend.cpp +++ b/src/core/kglobalaccelglobalshortcutbackend.cpp @@ -83,7 +83,8 @@ bool KGlobalAccelShortcutBackend::DoRegister() { QObject::connect(component_, &OrgKdeKglobalaccelComponentInterface::globalShortcutPressed, - this, &KGlobalAccelShortcutBackend::OnShortcutPressed); + this, &KGlobalAccelShortcutBackend::OnShortcutPressed, + Qt::UniqueConnection); return complete; #else // HAVE_DBUS @@ -100,6 +101,10 @@ void KGlobalAccelShortcutBackend::DoUnregister() { for (const GlobalShortcuts::Shortcut& shortcut : manager_->shortcuts()) UnregisterAction(shortcut.id, shortcut.action); + + QObject::disconnect(component_, + &OrgKdeKglobalaccelComponentInterface::globalShortcutPressed, + this, &KGlobalAccelShortcutBackend::OnShortcutPressed); #endif // HAVE_DBUS } @@ -111,6 +116,8 @@ const char* KGlobalAccelShortcutBackend::kPath = "/kglobalaccel"; bool KGlobalAccelShortcutBackend::AcquireComponent() { Q_ASSERT(iface_ && iface_->isValid()); + if (component_) return true; + QDBusReply reply = iface_->getComponent(ComponentUniqueName()); if (!reply.isValid()) { if (reply.error().name() == From 7ef917008af169b628244dda147eeb163776f15c Mon Sep 17 00:00:00 2001 From: Luis Caceres Date: Mon, 9 Dec 2019 17:02:42 +0000 Subject: [PATCH 7/7] Fix formatting again --- src/core/kglobalaccelglobalshortcutbackend.cpp | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/core/kglobalaccelglobalshortcutbackend.cpp b/src/core/kglobalaccelglobalshortcutbackend.cpp index 000f870ac..fcb40d665 100644 --- a/src/core/kglobalaccelglobalshortcutbackend.cpp +++ b/src/core/kglobalaccelglobalshortcutbackend.cpp @@ -18,8 +18,8 @@ namespace { #ifdef HAVE_DBUS QString ComponentDisplayName() { return QGuiApplication::applicationDisplayName().isEmpty() - ? QCoreApplication::applicationName() - : QGuiApplication::applicationDisplayName(); + ? QCoreApplication::applicationName() + : QGuiApplication::applicationDisplayName(); } QString ComponentUniqueName() { return QCoreApplication::applicationName(); } @@ -46,9 +46,7 @@ bool IsCorrectMediaKeyShortcut(const GlobalShortcuts::Shortcut& shortcut) { KGlobalAccelShortcutBackend::KGlobalAccelShortcutBackend( GlobalShortcuts* parent) - : GlobalShortcutBackend(parent), - iface_(nullptr), - component_(nullptr) {} + : GlobalShortcutBackend(parent), iface_(nullptr), component_(nullptr) {} #else // HAVE_DBUS KGlobalAccelShortcutBackend::KGlobalAccelShortcutBackend( @@ -102,9 +100,9 @@ void KGlobalAccelShortcutBackend::DoUnregister() { for (const GlobalShortcuts::Shortcut& shortcut : manager_->shortcuts()) UnregisterAction(shortcut.id, shortcut.action); - QObject::disconnect(component_, - &OrgKdeKglobalaccelComponentInterface::globalShortcutPressed, - this, &KGlobalAccelShortcutBackend::OnShortcutPressed); + QObject::disconnect( + component_, &OrgKdeKglobalaccelComponentInterface::globalShortcutPressed, + this, &KGlobalAccelShortcutBackend::OnShortcutPressed); #endif // HAVE_DBUS } @@ -118,7 +116,8 @@ bool KGlobalAccelShortcutBackend::AcquireComponent() { if (component_) return true; - QDBusReply reply = iface_->getComponent(ComponentUniqueName()); + QDBusReply reply = + iface_->getComponent(ComponentUniqueName()); if (!reply.isValid()) { if (reply.error().name() == QLatin1String("org.kde.kglobalaccel.NoSuchComponent"))