summary refs log tree commit diff
path: root/quantum/process_keycode
diff options
context:
space:
mode:
authorPascal Getreuer <50221757+getreuer@users.noreply.github.com>2022-08-13 06:48:51 -0700
committerGitHub <noreply@github.com>2022-08-13 23:48:51 +1000
commit6a0d90f81a9b9938591b32f9321530e68e5cea0b (patch)
tree138714ab3bc8e6f7c373a73f67424e6c3d7711a0 /quantum/process_keycode
parent4eeafbebabfac04eada98f75dedbecdbbd16298c (diff)
Fix Caps Word capitalization when used with Combos + Auto Shift. (#17549)
Diffstat (limited to 'quantum/process_keycode')
-rw-r--r--quantum/process_keycode/process_auto_shift.c7
-rw-r--r--quantum/process_keycode/process_caps_word.c4
-rw-r--r--quantum/process_keycode/process_combo.c9
3 files changed, 19 insertions, 1 deletions
diff --git a/quantum/process_keycode/process_auto_shift.c b/quantum/process_keycode/process_auto_shift.c
index 8cb45bc0ae..3ff188ba7e 100644
--- a/quantum/process_keycode/process_auto_shift.c
+++ b/quantum/process_keycode/process_auto_shift.c
@@ -123,7 +123,12 @@ bool get_autoshift_shift_state(uint16_t keycode) {
 /** \brief Restores the shift key if it was cancelled by Auto Shift */
 static void autoshift_flush_shift(void) {
     autoshift_flags.holding_shift = false;
-    del_weak_mods(MOD_BIT(KC_LSFT));
+#    ifdef CAPS_WORD_ENABLE
+    if (!is_caps_word_on())
+#    endif // CAPS_WORD_ENABLE
+    {
+        del_weak_mods(MOD_BIT(KC_LSFT));
+    }
     if (autoshift_flags.cancelling_lshift) {
         autoshift_flags.cancelling_lshift = false;
         add_mods(MOD_BIT(KC_LSFT));
diff --git a/quantum/process_keycode/process_caps_word.c b/quantum/process_keycode/process_caps_word.c
index ffd509a914..bc4369846c 100644
--- a/quantum/process_keycode/process_caps_word.c
+++ b/quantum/process_keycode/process_caps_word.c
@@ -131,7 +131,11 @@ bool process_caps_word(uint16_t keycode, keyrecord_t* record) {
 #endif // SWAP_HANDS_ENABLE
         }
 
+#ifdef AUTO_SHIFT_ENABLE
+        del_weak_mods(get_autoshift_state() ? ~MOD_BIT(KC_LSFT) : 0xff);
+#else
         clear_weak_mods();
+#endif // AUTO_SHIFT_ENABLE
         if (caps_word_press_user(keycode)) {
             send_keyboard_report();
             return true;
diff --git a/quantum/process_keycode/process_combo.c b/quantum/process_keycode/process_combo.c
index d5a649adb3..e5135e5a64 100644
--- a/quantum/process_keycode/process_combo.c
+++ b/quantum/process_keycode/process_combo.c
@@ -227,7 +227,16 @@ static inline void dump_key_buffer(void) {
 #endif
         }
         record->event.time = 0;
+
+#if defined(CAPS_WORD_ENABLE) && defined(AUTO_SHIFT_ENABLE)
+        // Edge case: preserve the weak Left Shift mod if both Caps Word and
+        // Auto Shift are on. Caps Word capitalizes by setting the weak Left
+        // Shift mod during the press event, but Auto Shift doesn't send the
+        // key until it receives the release event.
+        del_weak_mods((is_caps_word_on() && get_autoshift_state()) ? ~MOD_BIT(KC_LSFT) : 0xff);
+#else
         clear_weak_mods();
+#endif // defined(CAPS_WORD_ENABLE) && defined(AUTO_SHIFT_ENABLE)
 
 #if TAP_CODE_DELAY > 0
         // only delay once and for a non-tapping key