mirror of
https://github.com/qmk/qmk_firmware.git
synced 2025-07-16 04:41:28 +00:00
Ignore the Layer Lock key in Repeat Key and Caps Word. (#25171)
This commit is contained in:
parent
88453acc6a
commit
ea85ace4a9
@ -160,8 +160,13 @@ bool process_caps_word(uint16_t keycode, keyrecord_t* record) {
|
|||||||
case QK_TOGGLE_LAYER ... QK_TOGGLE_LAYER_MAX:
|
case QK_TOGGLE_LAYER ... QK_TOGGLE_LAYER_MAX:
|
||||||
case QK_LAYER_TAP_TOGGLE ... QK_LAYER_TAP_TOGGLE_MAX:
|
case QK_LAYER_TAP_TOGGLE ... QK_LAYER_TAP_TOGGLE_MAX:
|
||||||
case QK_ONE_SHOT_LAYER ... QK_ONE_SHOT_LAYER_MAX:
|
case QK_ONE_SHOT_LAYER ... QK_ONE_SHOT_LAYER_MAX:
|
||||||
|
#ifdef TRI_LAYER_ENABLE // Ignore Tri Layer keys.
|
||||||
case QK_TRI_LAYER_LOWER ... QK_TRI_LAYER_UPPER:
|
case QK_TRI_LAYER_LOWER ... QK_TRI_LAYER_UPPER:
|
||||||
// Ignore AltGr.
|
#endif // TRI_LAYER_ENABLE
|
||||||
|
#ifdef LAYER_LOCK_ENABLE // Ignore Layer Lock key.
|
||||||
|
case QK_LAYER_LOCK:
|
||||||
|
#endif // LAYER_LOCK_ENABLE
|
||||||
|
// Ignore AltGr.
|
||||||
case KC_RALT:
|
case KC_RALT:
|
||||||
case OSM(MOD_RALT):
|
case OSM(MOD_RALT):
|
||||||
return true;
|
return true;
|
||||||
|
@ -41,7 +41,10 @@ static bool remember_last_key(uint16_t keycode, keyrecord_t* record, uint8_t* re
|
|||||||
#ifdef TRI_LAYER_ENABLE // Ignore Tri Layer keys.
|
#ifdef TRI_LAYER_ENABLE // Ignore Tri Layer keys.
|
||||||
case QK_TRI_LAYER_LOWER:
|
case QK_TRI_LAYER_LOWER:
|
||||||
case QK_TRI_LAYER_UPPER:
|
case QK_TRI_LAYER_UPPER:
|
||||||
#endif // TRI_LAYER_ENABLE
|
#endif // TRI_LAYER_ENABLE
|
||||||
|
#ifdef LAYER_LOCK_ENABLE // Ignore Layer Lock key.
|
||||||
|
case QK_LAYER_LOCK:
|
||||||
|
#endif // LAYER_LOCK_ENABLE
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Ignore hold events on tap-hold keys.
|
// Ignore hold events on tap-hold keys.
|
||||||
|
@ -15,5 +15,7 @@
|
|||||||
|
|
||||||
CAPS_WORD_ENABLE = yes
|
CAPS_WORD_ENABLE = yes
|
||||||
COMMAND_ENABLE = no
|
COMMAND_ENABLE = no
|
||||||
|
LAYER_LOCK_ENABLE = yes
|
||||||
SPACE_CADET_ENABLE = yes
|
SPACE_CADET_ENABLE = yes
|
||||||
|
TRI_LAYER_ENABLE = yes
|
||||||
|
|
||||||
|
@ -156,21 +156,22 @@ TEST_F(CapsWord, IdleTimeout) {
|
|||||||
// Turn on Caps Word and tap "A".
|
// Turn on Caps Word and tap "A".
|
||||||
caps_word_on();
|
caps_word_on();
|
||||||
tap_key(key_a);
|
tap_key(key_a);
|
||||||
|
|
||||||
VERIFY_AND_CLEAR(driver);
|
VERIFY_AND_CLEAR(driver);
|
||||||
|
|
||||||
|
EXPECT_EMPTY_REPORT(driver);
|
||||||
idle_for(CAPS_WORD_IDLE_TIMEOUT);
|
idle_for(CAPS_WORD_IDLE_TIMEOUT);
|
||||||
run_one_scan_loop();
|
run_one_scan_loop();
|
||||||
|
VERIFY_AND_CLEAR(driver);
|
||||||
|
|
||||||
// Caps Word should be off and mods should be clear.
|
// Caps Word should be off and mods should be clear.
|
||||||
EXPECT_EQ(is_caps_word_on(), false);
|
EXPECT_EQ(is_caps_word_on(), false);
|
||||||
EXPECT_EQ(get_mods() | get_weak_mods(), 0);
|
EXPECT_EQ(get_mods() | get_weak_mods(), 0);
|
||||||
|
|
||||||
EXPECT_EMPTY_REPORT(driver).Times(AnyNumber());
|
|
||||||
// Expect unshifted "A".
|
// Expect unshifted "A".
|
||||||
EXPECT_REPORT(driver, (KC_A));
|
EXPECT_REPORT(driver, (KC_A));
|
||||||
|
EXPECT_EMPTY_REPORT(driver);
|
||||||
tap_key(key_a);
|
tap_key(key_a);
|
||||||
|
run_one_scan_loop();
|
||||||
VERIFY_AND_CLEAR(driver);
|
VERIFY_AND_CLEAR(driver);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -244,6 +245,7 @@ TEST_F(CapsWord, ShiftsAltGrSymbols) {
|
|||||||
// clang-format off
|
// clang-format off
|
||||||
EXPECT_CALL(driver, send_keyboard_mock(AnyOf(
|
EXPECT_CALL(driver, send_keyboard_mock(AnyOf(
|
||||||
KeyboardReport(),
|
KeyboardReport(),
|
||||||
|
KeyboardReport(KC_LSFT),
|
||||||
KeyboardReport(KC_RALT),
|
KeyboardReport(KC_RALT),
|
||||||
KeyboardReport(KC_LSFT, KC_RALT))))
|
KeyboardReport(KC_LSFT, KC_RALT))))
|
||||||
.Times(AnyNumber());
|
.Times(AnyNumber());
|
||||||
@ -259,6 +261,9 @@ TEST_F(CapsWord, ShiftsAltGrSymbols) {
|
|||||||
tap_key(key_a);
|
tap_key(key_a);
|
||||||
run_one_scan_loop();
|
run_one_scan_loop();
|
||||||
key_altgr.release();
|
key_altgr.release();
|
||||||
|
run_one_scan_loop();
|
||||||
|
|
||||||
|
idle_for(CAPS_WORD_IDLE_TIMEOUT);
|
||||||
|
|
||||||
VERIFY_AND_CLEAR(driver);
|
VERIFY_AND_CLEAR(driver);
|
||||||
}
|
}
|
||||||
@ -274,6 +279,7 @@ TEST_F(CapsWord, ShiftsModTapAltGrSymbols) {
|
|||||||
// clang-format off
|
// clang-format off
|
||||||
EXPECT_CALL(driver, send_keyboard_mock(AnyOf(
|
EXPECT_CALL(driver, send_keyboard_mock(AnyOf(
|
||||||
KeyboardReport(),
|
KeyboardReport(),
|
||||||
|
KeyboardReport(KC_LSFT),
|
||||||
KeyboardReport(KC_RALT),
|
KeyboardReport(KC_RALT),
|
||||||
KeyboardReport(KC_LSFT, KC_RALT))))
|
KeyboardReport(KC_LSFT, KC_RALT))))
|
||||||
.Times(AnyNumber());
|
.Times(AnyNumber());
|
||||||
@ -289,8 +295,11 @@ TEST_F(CapsWord, ShiftsModTapAltGrSymbols) {
|
|||||||
tap_key(key_a);
|
tap_key(key_a);
|
||||||
run_one_scan_loop();
|
run_one_scan_loop();
|
||||||
key_altgr_t.release();
|
key_altgr_t.release();
|
||||||
|
run_one_scan_loop();
|
||||||
EXPECT_TRUE(is_caps_word_on());
|
EXPECT_TRUE(is_caps_word_on());
|
||||||
|
|
||||||
|
idle_for(CAPS_WORD_IDLE_TIMEOUT);
|
||||||
|
|
||||||
VERIFY_AND_CLEAR(driver);
|
VERIFY_AND_CLEAR(driver);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -535,7 +544,11 @@ TEST_P(CapsWordDoubleTapShift, Activation) {
|
|||||||
// machine at this point. This due to imperfect test isolation which can't
|
// machine at this point. This due to imperfect test isolation which can't
|
||||||
// reset the caps word double shift timer on test case setup.
|
// reset the caps word double shift timer on test case setup.
|
||||||
idle_for(CAPS_WORD_IDLE_TIMEOUT);
|
idle_for(CAPS_WORD_IDLE_TIMEOUT);
|
||||||
|
|
||||||
|
EXPECT_REPORT(driver, (KC_ESC));
|
||||||
|
EXPECT_EMPTY_REPORT(driver);
|
||||||
tap_key(esc);
|
tap_key(esc);
|
||||||
|
VERIFY_AND_CLEAR(driver);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Double tap doesn't count if another key is pressed between the taps.
|
// Double tap doesn't count if another key is pressed between the taps.
|
||||||
@ -589,6 +602,7 @@ TEST_P(CapsWordDoubleTapShift, SlowTaps) {
|
|||||||
|
|
||||||
EXPECT_EQ(is_caps_word_on(), false); // Caps Word is still off.
|
EXPECT_EQ(is_caps_word_on(), false); // Caps Word is still off.
|
||||||
clear_oneshot_mods();
|
clear_oneshot_mods();
|
||||||
|
send_keyboard_report();
|
||||||
|
|
||||||
VERIFY_AND_CLEAR(driver);
|
VERIFY_AND_CLEAR(driver);
|
||||||
}
|
}
|
||||||
@ -626,7 +640,7 @@ TEST_F(CapsWord, IgnoresOSLHold) {
|
|||||||
run_one_scan_loop();
|
run_one_scan_loop();
|
||||||
tap_key(key_b);
|
tap_key(key_b);
|
||||||
key_osl.release();
|
key_osl.release();
|
||||||
run_one_scan_loop();
|
idle_for(CAPS_WORD_IDLE_TIMEOUT + 1);
|
||||||
|
|
||||||
VERIFY_AND_CLEAR(driver);
|
VERIFY_AND_CLEAR(driver);
|
||||||
}
|
}
|
||||||
@ -645,15 +659,39 @@ TEST_F(CapsWord, IgnoresOSLTap) {
|
|||||||
KeyboardReport(),
|
KeyboardReport(),
|
||||||
KeyboardReport(KC_LSFT))))
|
KeyboardReport(KC_LSFT))))
|
||||||
.Times(AnyNumber());
|
.Times(AnyNumber());
|
||||||
|
// clang-format on
|
||||||
|
|
||||||
EXPECT_REPORT(driver, (KC_LSFT, KC_B));
|
EXPECT_REPORT(driver, (KC_LSFT, KC_B));
|
||||||
caps_word_on();
|
caps_word_on();
|
||||||
|
|
||||||
tap_key(key_osl);
|
tap_key(key_osl);
|
||||||
tap_key(key_b);
|
tap_key(key_b);
|
||||||
run_one_scan_loop();
|
idle_for(CAPS_WORD_IDLE_TIMEOUT);
|
||||||
|
|
||||||
|
VERIFY_AND_CLEAR(driver);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(CapsWord, IgnoresLayerLockKey) {
|
||||||
|
TestDriver driver;
|
||||||
|
KeymapKey key_llock(0, 1, 0, QK_LAYER_LOCK);
|
||||||
|
KeymapKey key_b(0, 0, 0, KC_B);
|
||||||
|
set_keymap({key_llock, key_b});
|
||||||
|
|
||||||
|
// Allow any number of reports with no keys or only modifiers.
|
||||||
|
// clang-format off
|
||||||
|
EXPECT_CALL(driver, send_keyboard_mock(AnyOf(
|
||||||
|
KeyboardReport(),
|
||||||
|
KeyboardReport(KC_LSFT))))
|
||||||
|
.Times(AnyNumber());
|
||||||
|
// clang-format on
|
||||||
|
|
||||||
|
EXPECT_REPORT(driver, (KC_LSFT, KC_B));
|
||||||
|
caps_word_on();
|
||||||
|
|
||||||
|
tap_key(key_llock);
|
||||||
|
tap_key(key_b);
|
||||||
|
idle_for(CAPS_WORD_IDLE_TIMEOUT);
|
||||||
|
|
||||||
VERIFY_AND_CLEAR(driver);
|
VERIFY_AND_CLEAR(driver);
|
||||||
}
|
}
|
||||||
// clang-format on
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
@ -16,3 +16,4 @@
|
|||||||
REPEAT_KEY_ENABLE = yes
|
REPEAT_KEY_ENABLE = yes
|
||||||
|
|
||||||
AUTO_SHIFT_ENABLE = yes
|
AUTO_SHIFT_ENABLE = yes
|
||||||
|
LAYER_LOCK_ENABLE = yes
|
||||||
|
@ -751,4 +751,37 @@ TEST_F(RepeatKey, RepeatKeyInvoke) {
|
|||||||
testing::Mock::VerifyAndClearExpectations(&driver);
|
testing::Mock::VerifyAndClearExpectations(&driver);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check that mods and Layer Lock are not remembered.
|
||||||
|
TEST_F(RepeatKey, IgnoredKeys) {
|
||||||
|
TestDriver driver;
|
||||||
|
KeymapKey regular_key(0, 0, 0, KC_A);
|
||||||
|
KeymapKey key_repeat(0, 1, 0, QK_REP);
|
||||||
|
KeymapKey key_lsft(0, 2, 0, KC_LSFT);
|
||||||
|
KeymapKey key_lctl(0, 3, 0, KC_LCTL);
|
||||||
|
KeymapKey key_llck(0, 4, 0, QK_LAYER_LOCK);
|
||||||
|
set_keymap({regular_key, key_repeat, key_lsft, key_lctl, key_llck});
|
||||||
|
|
||||||
|
// Allow any number of empty reports.
|
||||||
|
EXPECT_EMPTY_REPORT(driver).Times(AnyNumber());
|
||||||
|
{
|
||||||
|
InSequence seq;
|
||||||
|
EXPECT_REPORT(driver, (KC_A));
|
||||||
|
EXPECT_REPORT(driver, (KC_LSFT));
|
||||||
|
EXPECT_REPORT(driver, (KC_LCTL));
|
||||||
|
EXPECT_REPORT(driver, (KC_A));
|
||||||
|
EXPECT_REPORT(driver, (KC_A));
|
||||||
|
}
|
||||||
|
|
||||||
|
tap_key(regular_key); // Taps the KC_A key.
|
||||||
|
|
||||||
|
// Tap Shift, Ctrl, and Layer Lock keys, which should not be remembered.
|
||||||
|
tap_keys(key_lsft, key_lctl, key_llck);
|
||||||
|
EXPECT_KEYCODE_EQ(get_last_keycode(), KC_A);
|
||||||
|
|
||||||
|
// Tapping the Repeat Key should still reproduce KC_A.
|
||||||
|
tap_keys(key_repeat, key_repeat);
|
||||||
|
|
||||||
|
testing::Mock::VerifyAndClearExpectations(&driver);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
Loading…
Reference in New Issue
Block a user