summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--quantum/process_keycode/process_caps_word.c5
-rw-r--r--tests/caps_word/test_caps_word.cpp30
2 files changed, 34 insertions, 1 deletions
diff --git a/quantum/process_keycode/process_caps_word.c b/quantum/process_keycode/process_caps_word.c
index 15238f04a1..ffd509a914 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 bcc8c53326..f611d4c104 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;