From 1b23a93e972ae6da03cfeafedcb0a1f2fb0bab09 Mon Sep 17 00:00:00 2001 From: Pascal Getreuer <50221757+getreuer@users.noreply.github.com> Date: Thu, 19 May 2022 17:39:00 -0700 Subject: [PATCH] Continue Caps Word when AltGr (right Alt) is held. (#17156) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is a minor bug fix for Caps Word. Currently, Caps Word turns off whenever a non-shift mod becomes active. This is done to avoid interfering with hotkeys. This commit makes an exception to continue Caps Word when AltGr (right Alt) is held. Outside the US, the AltGr key is used to type additional symbols (https://en.wikipedia.org/wiki/AltGr_key). Depending on the language, these may include symbols used within words like accented letters where it would be desirable to continue Caps Word. Signed-off-by: DuĊĦan --- quantum/process_keycode/process_caps_word.c | 5 +++- tests/caps_word/test_caps_word.cpp | 30 +++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/quantum/process_keycode/process_caps_word.c b/quantum/process_keycode/process_caps_word.c index 15238f04a1b1..ffd509a9142e 100644 --- a/quantum/process_keycode/process_caps_word.c +++ b/quantum/process_keycode/process_caps_word.c @@ -87,7 +87,7 @@ bool process_caps_word(uint16_t keycode, keyrecord_t* record) { return true; } - if (!(mods & ~MOD_MASK_SHIFT)) { + if (!(mods & ~(MOD_MASK_SHIFT | MOD_BIT(KC_RALT)))) { switch (keycode) { // Ignore MO, TO, TG, TT, and OSL layer switch keys. case QK_MOMENTARY ... QK_MOMENTARY_MAX: @@ -95,6 +95,9 @@ bool process_caps_word(uint16_t keycode, keyrecord_t* record) { case QK_TOGGLE_LAYER ... QK_TOGGLE_LAYER_MAX: case QK_LAYER_TAP_TOGGLE ... QK_LAYER_TAP_TOGGLE_MAX: case QK_ONE_SHOT_LAYER ... QK_ONE_SHOT_LAYER_MAX: + // Ignore AltGr. + case KC_RALT: + case OSM(MOD_RALT): return true; #ifndef NO_ACTION_TAPPING diff --git a/tests/caps_word/test_caps_word.cpp b/tests/caps_word/test_caps_word.cpp index bcc8c5332623..f611d4c104b4 100644 --- a/tests/caps_word/test_caps_word.cpp +++ b/tests/caps_word/test_caps_word.cpp @@ -212,6 +212,36 @@ TEST_F(CapsWord, SpaceTurnsOffCapsWord) { testing::Mock::VerifyAndClearExpectations(&driver); } +// Tests that typing "AltGr + A" produces "Shift + AltGr + A". +TEST_F(CapsWord, ShiftsAltGrSymbols) { + TestDriver driver; + KeymapKey key_a(0, 0, 0, KC_A); + KeymapKey key_altgr(0, 1, 0, KC_RALT); + set_keymap({key_a, key_altgr}); + + // Allow any number of reports with no keys or only modifiers. + // clang-format off + EXPECT_CALL(driver, send_keyboard_mock(AnyOf( + KeyboardReport(), + KeyboardReport(KC_RALT), + KeyboardReport(KC_LSFT, KC_RALT)))) + .Times(AnyNumber()); + // Expect "Shift + AltGr + A, Space". + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT, KC_RALT, KC_A))); + // clang-format on + + // Turn on Caps Word and type "AltGr + A". + caps_word_on(); + + key_altgr.press(); + run_one_scan_loop(); + TapKeys(key_a); + run_one_scan_loop(); + key_altgr.release(); + + testing::Mock::VerifyAndClearExpectations(&driver); +} + struct CapsWordBothShiftsParams { std::string name; uint16_t left_shift_keycode;