From bec8493459d5e15272a4fd07a84b35896b47ce69 Mon Sep 17 00:00:00 2001 From: Aleix Pol Date: Sat, 21 Apr 2018 18:35:22 +0200 Subject: [PATCH] Don't try to filter null key combinations Summary: When using composite key combinations, kwin would do random weird actions when the first key was pressed (e.g. ` key). This makes sure we are not trying to match. BUG: 390110 Reviewers: #kwin, graesslin Reviewed By: #kwin, graesslin Subscribers: graesslin, kwin, #kwin Tags: #kwin Differential Revision: https://phabricator.kde.org/D12416 --- .../integration/globalshortcuts_test.cpp | 20 +++++++++++++++++++ globalshortcuts.cpp | 3 +++ 2 files changed, 23 insertions(+) diff --git a/autotests/integration/globalshortcuts_test.cpp b/autotests/integration/globalshortcuts_test.cpp index 6a4024f00b..c17721bd12 100644 --- a/autotests/integration/globalshortcuts_test.cpp +++ b/autotests/integration/globalshortcuts_test.cpp @@ -55,6 +55,7 @@ private Q_SLOTS: void testRepeatedTrigger(); void testUserActionsMenu(); void testMetaShiftW(); + void testComponseKey(); void testX11ClientShortcut(); void testWaylandClientShortcut(); void testSetupWindowShortcut(); @@ -203,6 +204,25 @@ void GlobalShortcutsTest::testMetaShiftW() kwinApp()->platform()->keyboardKeyReleased(KEY_LEFTMETA, timestamp++); } +void GlobalShortcutsTest::testComponseKey() +{ + // BUG 390110 + QScopedPointer action(new QAction(nullptr)); + action->setProperty("componentName", QStringLiteral(KWIN_NAME)); + action->setObjectName(QStringLiteral("globalshortcuts-accent")); + QSignalSpy triggeredSpy(action.data(), &QAction::triggered); + QVERIFY(triggeredSpy.isValid()); + KGlobalAccel::self()->setShortcut(action.data(), QList{Qt::UNICODE_ACCEL}, KGlobalAccel::NoAutoloading); + input()->registerShortcut(Qt::UNICODE_ACCEL, action.data()); + + // press & release ` + quint32 timestamp = 0; + kwinApp()->platform()->keyboardKeyPressed(KEY_RESERVED, timestamp++); + kwinApp()->platform()->keyboardKeyReleased(KEY_RESERVED, timestamp++); + + QTRY_COMPARE(triggeredSpy.count(), 0); +} + struct XcbConnectionDeleter { static inline void cleanup(xcb_connection_t *pointer) diff --git a/globalshortcuts.cpp b/globalshortcuts.cpp index 89fc63235a..970c79fbf3 100644 --- a/globalshortcuts.cpp +++ b/globalshortcuts.cpp @@ -245,6 +245,9 @@ bool processShortcut(Qt::KeyboardModifiers mods, T key, U &shortcuts) bool GlobalShortcutsManager::processKey(Qt::KeyboardModifiers mods, int keyQt) { if (m_kglobalAccelInterface) { + if (!keyQt && !mods) { + return false; + } auto check = [this] (Qt::KeyboardModifiers mods, int keyQt) { bool retVal = false; QMetaObject::invokeMethod(m_kglobalAccelInterface,