Skip to content

Commit

Permalink
Continue Caps Word when AltGr (right Alt) is held. (#17156)
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
getreuer committed May 20, 2022
1 parent 36c8462 commit b5608cb
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 1 deletion.
5 changes: 4 additions & 1 deletion quantum/process_keycode/process_caps_word.c
Original file line number Diff line number Diff line change
Expand Up @@ -87,14 +87,17 @@ 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:
case QK_TO ... QK_TO_MAX:
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
Expand Down
30 changes: 30 additions & 0 deletions tests/caps_word/test_caps_word.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit b5608cb

Please sign in to comment.