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)); } }