소스 검색

Continue Caps Word when AltGr (right Alt) is held. (#17156)

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.
Pascal Getreuer 3 년 전
부모
커밋
b5608cbb6d
2개의 변경된 파일34개의 추가작업 그리고 1개의 파일을 삭제
  1. 4 1
      quantum/process_keycode/process_caps_word.c
  2. 30 0
      tests/caps_word/test_caps_word.cpp

+ 4 - 1
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

+ 30 - 0
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;