18 #include <QGuiApplication>
20 #include <QKeySequence>
22 #include "globalshortcutregistry.h"
24 static qulonglong s_windowId = 0;
26 GlobalShortcutRegistry::GlobalShortcutRegistry(QObject *parent)
38 return m_shortcuts.keys().contains(seq);
44 if (!m_shortcuts.keys().contains(seq)) {
45 m_shortcuts.insert(seq, {sc});
52 connect(sc, &GlobalShortcut::destroyed,
this, &GlobalShortcutRegistry::removeShortcut);
56 void GlobalShortcutRegistry::removeShortcut(QObject *obj)
58 QMutableMapIterator<QVariant, QVector<QPointer<GlobalShortcut>>> it(m_shortcuts);
59 while (it.hasNext()) {
62 if (scObj && it.value().contains(scObj)) {
63 it.value().removeAll(scObj);
64 if (it.value().isEmpty()) {
71 bool GlobalShortcutRegistry::eventFilter(QObject *obj, QEvent *event)
73 Q_ASSERT(m_filteredWindow);
74 Q_ASSERT(obj == static_cast<QObject*>(m_filteredWindow.data()));
76 if (event->type() == QEvent::KeyPress) {
77 QKeyEvent *keyEvent =
static_cast<QKeyEvent*
>(event);
78 QKeySequence seq = QKeySequence(keyEvent->key() + keyEvent->modifiers());
79 if (m_shortcuts.keys().contains(seq)) {
80 const auto shortcuts = m_shortcuts.value(seq);
81 Q_FOREACH(
const auto &shortcut,
shortcuts) {
83 qApp->sendEvent(shortcut, keyEvent);
89 return event->isAccepted();
92 return QObject::eventFilter(obj, event);
97 if (wid == s_windowId) {
101 if (m_filteredWindow) {
102 m_filteredWindow->removeEventFilter(
this);
103 m_filteredWindow.clear();
107 for(QWindow *window: qApp->allWindows()) {
108 if (window && window->winId() == wid) {
109 m_filteredWindow = window;
110 window->installEventFilter(
this);
void addShortcut(const QVariant &seq, GlobalShortcut *sc)
void setupFilterOnWindow(qulonglong wid)
The GlobalShortcut class.
GlobalShortcutList shortcuts() const
bool hasShortcut(const QVariant &seq) const