diff --git a/modifier_only_shortcuts.h b/modifier_only_shortcuts.h --- a/modifier_only_shortcuts.h +++ b/modifier_only_shortcuts.h @@ -24,6 +24,7 @@ #include #include +#include namespace KWin { @@ -44,10 +45,10 @@ } private: - uint m_pressCount = 0; Qt::KeyboardModifier m_modifier = Qt::NoModifier; Qt::KeyboardModifiers m_cachedMods; uint m_buttonPressCount = 0; + QSet m_pressedKeys; }; } diff --git a/modifier_only_shortcuts.cpp b/modifier_only_shortcuts.cpp --- a/modifier_only_shortcuts.cpp +++ b/modifier_only_shortcuts.cpp @@ -45,18 +45,19 @@ return; } if (event->type() == QEvent::KeyPress) { - m_pressCount++; - if (m_pressCount == 1 && + const bool wasEmpty = m_pressedKeys.isEmpty(); + m_pressedKeys.insert(event->nativeScanCode()); + if (wasEmpty && m_pressedKeys.size() == 1 && !ScreenLockerWatcher::self()->isLocked() && m_buttonPressCount == 0 && m_cachedMods == Qt::NoModifier) { m_modifier = Qt::KeyboardModifier(int(event->modifiersRelevantForGlobalShortcuts())); } else { m_modifier = Qt::NoModifier; } - } else { - m_pressCount--; - if (m_pressCount == 0 && + } else if (!m_pressedKeys.isEmpty()) { + m_pressedKeys.remove(event->nativeScanCode()); + if (m_pressedKeys.isEmpty() && event->modifiersRelevantForGlobalShortcuts() == Qt::NoModifier && !workspace()->globalShortcutsDisabled()) { if (m_modifier != Qt::NoModifier) { @@ -73,6 +74,8 @@ } } m_modifier = Qt::NoModifier; + } else { + m_modifier = Qt::NoModifier; } m_cachedMods = event->modifiersRelevantForGlobalShortcuts(); }