From d45853eb2ce713be6622be8e5bbe072183c3ac8f Mon Sep 17 00:00:00 2001 From: rootiest Date: Tue, 7 Apr 2026 23:38:18 -0400 Subject: [PATCH] feat(q5_max): implement CAPS_MOD tap/hold logic (ESC/Ctrl/CapsLock/CapsWord/Autocorrect) --- .../q5_max/ansi_encoder/keymaps/via/keymap.c | 34 ++++++++++++++++--- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/keyboards/keychron/q5_max/ansi_encoder/keymaps/via/keymap.c b/keyboards/keychron/q5_max/ansi_encoder/keymaps/via/keymap.c index 1127c1dbdc..c86564f912 100644 --- a/keyboards/keychron/q5_max/ansi_encoder/keymaps/via/keymap.c +++ b/keyboards/keychron/q5_max/ansi_encoder/keymaps/via/keymap.c @@ -149,11 +149,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { return false; } - // CAPS_MOD handler added in Task 3; suppress unused-variable errors until then. - (void)caps_mod_held; - (void)caps_mod_ctrl_registered; - (void)caps_mod_timer; - // Chord key: activate/deactivate chord unicode mode. if (keycode == CHORD_KEY) { if (record->event.pressed) { @@ -170,6 +165,30 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } switch (keycode) { + case CAPS_MOD: + if (record->event.pressed) { + caps_mod_held = true; + caps_mod_timer = timer_read(); + } else { + if (caps_mod_ctrl_registered) { + unregister_code(KC_LCTL); + caps_mod_ctrl_registered = false; + } else { + uint8_t mods = get_mods(); + if (mods & MOD_MASK_GUI) { + autocorrect_toggle(); + } else if (mods & MOD_MASK_ALT) { + caps_word_toggle(); + } else if (mods & MOD_MASK_SHIFT) { + tap_code(KC_CAPS); + } else { + tap_code(KC_ESC); + } + } + caps_mod_held = false; + } + return false; + case LCK_FN1: case LCK_FN2: case LCK_FN3: @@ -228,6 +247,11 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } void matrix_scan_user(void) { + if (caps_mod_held && !caps_mod_ctrl_registered + && timer_elapsed(caps_mod_timer) > TAPPING_TERM) { + caps_mod_ctrl_registered = true; + register_code(KC_LCTL); + } if (alt_tab_active && timer_elapsed(alt_tab_timer) > ALT_TAB_TIMEOUT) { unregister_code(KC_LALT); alt_tab_active = false;