From 19bf66c42a965e243af0c26a1795d649b56f21dc Mon Sep 17 00:00:00 2001 From: Nicolas Fella Date: Tue, 16 Jul 2024 15:48:16 +0200 Subject: [PATCH] plugins/stickykeys: Unlatch modifiers when locking The state should be either latched or locked, not both --- autotests/integration/sticky_keys_test.cpp | 3 ++- src/plugins/stickykeys/stickykeys.cpp | 1 + src/xkb.cpp | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/autotests/integration/sticky_keys_test.cpp b/autotests/integration/sticky_keys_test.cpp index 7301877dbf..271fe8b40c 100644 --- a/autotests/integration/sticky_keys_test.cpp +++ b/autotests/integration/sticky_keys_test.cpp @@ -191,7 +191,7 @@ void StickyKeysTest::testLock() Test::keyboardKeyPressed(modifierKey, ++timestamp); QVERIFY(modifierSpy.wait()); QCOMPARE(modifierSpy.first()[0], expectedMods); // verify that mod is depressed - // TODO should it be latched? + QCOMPARE(modifierSpy.first()[1], 0); // verify that mod is unlatched QCOMPARE(modifierSpy.first()[2], expectedMods); // verify that mod is locked // release mod, modifier should still be locked @@ -212,6 +212,7 @@ void StickyKeysTest::testLock() Test::keyboardKeyPressed(modifierKey, ++timestamp); QVERIFY(modifierSpy.wait()); QCOMPARE(modifierSpy.first()[0], expectedMods); // verify that mod is depressed + QCOMPARE(modifierSpy.first()[1], 0); // verify that mod is unlatched QCOMPARE(modifierSpy.first()[2], 0); // verify that mod is not locked Test::keyboardKeyReleased(modifierKey, ++timestamp); diff --git a/src/plugins/stickykeys/stickykeys.cpp b/src/plugins/stickykeys/stickykeys.cpp index 0c546b8a7d..18cd6478bd 100644 --- a/src/plugins/stickykeys/stickykeys.cpp +++ b/src/plugins/stickykeys/stickykeys.cpp @@ -108,6 +108,7 @@ bool StickyKeysFilter::keyEvent(KWin::KeyEvent *event) // A latched modifier was pressed, lock it else if (keyState.value() == Latched && m_lockKeys) { keyState.value() = Locked; + KWin::input()->keyboard()->xkb()->setModifierLatched(keyToModifier(static_cast(event->key())), false); KWin::input()->keyboard()->xkb()->setModifierLocked(keyToModifier(static_cast(event->key())), true); if (m_showNotificationForLockedKeys) { diff --git a/src/xkb.cpp b/src/xkb.cpp index 9825889af8..2be28e5bae 100644 --- a/src/xkb.cpp +++ b/src/xkb.cpp @@ -1086,7 +1086,7 @@ void Xkb::setModifierLocked(KWin::Xkb::Modifier mod, bool locked) if (mask.size() > modifier) { mask[modifier] = locked; m_modifierState.locked = mask.to_ulong(); - xkb_state_update_mask(m_state, m_modifierState.depressed, m_modifierState.locked, m_modifierState.locked, 0, 0, m_currentLayout); + xkb_state_update_mask(m_state, m_modifierState.depressed, m_modifierState.latched, m_modifierState.locked, 0, 0, m_currentLayout); m_modifierState.locked = xkb_state_serialize_mods(m_state, xkb_state_component(XKB_STATE_MODS_LOCKED)); } }