diff options
Diffstat (limited to 'quantum/process_keycode')
| -rw-r--r-- | quantum/process_keycode/process_caps_word.c | 32 | 
1 files changed, 26 insertions, 6 deletions
| diff --git a/quantum/process_keycode/process_caps_word.c b/quantum/process_keycode/process_caps_word.c index bc4369846c..1b9583196d 100644 --- a/quantum/process_keycode/process_caps_word.c +++ b/quantum/process_keycode/process_caps_word.c @@ -101,14 +101,34 @@ bool process_caps_word(uint16_t keycode, keyrecord_t* record) {                  return true;  #ifndef NO_ACTION_TAPPING +            // Corresponding to mod keys above, a held mod-tap is handled as: +            // * For shift mods, pass KC_LSFT or KC_RSFT to +            //   caps_word_press_user() to determine whether to continue. +            // * For Shift + AltGr (MOD_RSFT | MOD_RALT), pass RSFT(KC_RALT). +            // * AltGr (MOD_RALT) is ignored. +            // * Otherwise stop Caps Word.              case QK_MOD_TAP ... QK_MOD_TAP_MAX: -                if (record->tap.count == 0) { -                    // Deactivate if a mod becomes active through holding -                    // a mod-tap key. -                    caps_word_off(); -                    return true; +                if (record->tap.count == 0) { // Mod-tap key is held. +                    const uint8_t mods = (keycode >> 8) & 0x1f; +                    switch (mods) { +                        case MOD_LSFT: +                            keycode = KC_LSFT; +                            break; +                        case MOD_RSFT: +                            keycode = KC_RSFT; +                            break; +                        case MOD_RSFT | MOD_RALT: +                            keycode = RSFT(KC_RALT); +                            break; +                        case MOD_RALT: +                            return true; +                        default: +                            caps_word_off(); +                            return true; +                    } +                } else { +                    keycode &= 0xff;                  } -                keycode &= 0xff;                  break;  #    ifndef NO_ACTION_LAYER | 
