diff options
| author | Ruben Beltran del Rio <jj@r.bdr.sh> | 2026-01-12 11:08:01 +0100 |
|---|---|---|
| committer | Ruben Beltran del Rio <jj@r.bdr.sh> | 2026-01-12 12:53:59 +0100 |
| commit | 1acbb0fd4bf288738194137f83df37508128d708 (patch) | |
| tree | 72fd79377a29314af22eb424a9a43d446599e876 /keyboards | |
| parent | 383fa49a534d57fc0a4455ac918af90cd287d5d1 (diff) | |
Add colemak layer to q3
Diffstat (limited to 'keyboards')
| -rw-r--r-- | keyboards/keychron/q3/ansi_encoder/keymaps/rbdr/keymap.c | 147 | ||||
| -rw-r--r-- | keyboards/keychron/q3/ansi_encoder/keymaps/rbdr/rules.mk | 2 |
2 files changed, 125 insertions, 24 deletions
diff --git a/keyboards/keychron/q3/ansi_encoder/keymaps/rbdr/keymap.c b/keyboards/keychron/q3/ansi_encoder/keymaps/rbdr/keymap.c index 24e27cb..266b26e 100644 --- a/keyboards/keychron/q3/ansi_encoder/keymaps/rbdr/keymap.c +++ b/keyboards/keychron/q3/ansi_encoder/keymaps/rbdr/keymap.c @@ -17,22 +17,88 @@ #include QMK_KEYBOARD_H enum layers{ - MAC_BASE, - MAC_FN, - WIN_BASE, - WIN_FN + BASE, + FN, + COLEMAK, + NAVIGATION +}; + +enum tap_dance_keys { + TD_CAPS_NAV = 0 +}; + +enum tap_dance_state { + TD_NONE, + TD_UNKNOWN, + TD_SINGLE_TAP, + TD_SINGLE_HOLD, + TD_DOUBLE_TAP, + TD_TAP_HOLD +}; + +typedef struct { + bool is_press_action; + enum tap_dance_state state; +} td_tap_t; + +enum tap_dance_state cur_dance(tap_dance_state_t *state) { + if (state->count == 1) { + if (state->interrupted || !state->pressed) return TD_SINGLE_TAP; + else return TD_SINGLE_HOLD; + } else if (state->count == 2) { + if (state->interrupted) return TD_DOUBLE_TAP; + else if (state->pressed) return TD_TAP_HOLD; + else return TD_DOUBLE_TAP; + } + return TD_UNKNOWN; +} + +static td_tap_t caps_tap_state = {.is_press_action = true, .state = TD_NONE}; + +void caps_finished(tap_dance_state_t *state, void *user_data) { + caps_tap_state.state = cur_dance(state); + switch (caps_tap_state.state) { + case TD_SINGLE_TAP: + case TD_SINGLE_HOLD: + register_code(KC_LCTL); + break; + case TD_TAP_HOLD: + layer_on(NAVIGATION); + break; + default: + break; + } +} + +void caps_reset(tap_dance_state_t *state, void *user_data) { + switch (caps_tap_state.state) { + case TD_SINGLE_TAP: + case TD_SINGLE_HOLD: + unregister_code(KC_LCTL); + break; + case TD_TAP_HOLD: + layer_off(NAVIGATION); + break; + default: + break; + } + caps_tap_state.state = TD_NONE; +} + +tap_dance_action_t tap_dance_actions[] = { + [TD_CAPS_NAV] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, caps_finished, caps_reset) }; const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [MAC_BASE] = LAYOUT_tkl_f13_ansi( + [BASE] = LAYOUT_tkl_f13_ansi( KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_MUTE, KC_F13, KC_F14, RM_NEXT, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, - KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, + TD(TD_CAPS_NAV), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, - KC_LCTL, KC_LOPT, KC_LCMD, KC_SPC, KC_RCMD, KC_ROPT, MO(MAC_FN), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), + KC_LCTL, KC_LOPT, KC_LCMD, KC_SPC, KC_RCMD, KC_ROPT, MO(FN), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), - [MAC_FN] = LAYOUT_tkl_f13_ansi( + [FN] = LAYOUT_tkl_f13_ansi( _______, KC_BRID, KC_BRIU, KC_MISSION_CONTROL, KC_LAUNCHPAD, RM_VALD, RM_VALU, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, RM_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_TOGG, RM_NEXT, RM_VALU, RM_HUEU, RM_SATU, RM_SPDU, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, @@ -40,28 +106,61 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), - [WIN_BASE] = LAYOUT_tkl_f13_ansi( - KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_MUTE, KC_PSCR, KC_NO, RM_NEXT, - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, - KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, - KC_LCTL, KC_LWIN, KC_LALT, KC_SPC, KC_RALT, KC_RWIN, MO(WIN_FN), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), + [COLEMAK] = LAYOUT_tkl_f13_ansi( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_MUTE, KC_F13, KC_F14, RM_NEXT, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, + KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_B, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, + TD(TD_CAPS_NAV), KC_A, KC_R, KC_S, KC_T, KC_G, KC_M, KC_N, KC_E, KC_I, KC_O, KC_QUOT, KC_ENT, + MT(MOD_LSFT, KC_Z), KC_X, KC_C, KC_D, KC_V, KC_NUHS, KC_K, KC_H, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, + KC_LCTL, KC_LOPT, KC_LCMD, KC_SPC, KC_RCMD, KC_ROPT, MO(FN), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), - [WIN_FN] = LAYOUT_tkl_f13_ansi( - _______, KC_BRID, KC_BRIU, _______, _______, RM_VALD, RM_VALU, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, RM_TOGG, _______, _______, RM_TOGG, + [NAVIGATION] = LAYOUT_tkl_f13_ansi( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - RM_TOGG, RM_NEXT, RM_VALU, RM_HUEU, RM_SATU, RM_SPDU, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, RM_PREV, RM_VALD, RM_HUED, RM_SATD, RM_SPDD, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), }; #if defined(ENCODER_MAP_ENABLE) const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { - [MAC_BASE] = {ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, - [MAC_FN] = {ENCODER_CCW_CW(RM_VALD, RM_VALU) }, - [WIN_BASE] = {ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, - [WIN_FN] = {ENCODER_CCW_CW(RM_VALD, RM_VALU) } + [BASE] = {ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, + [FN] = {ENCODER_CCW_CW(RM_VALD, RM_VALU) }, + [COLEMAK] = {ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, + [NAVIGATION] = {ENCODER_CCW_CW(KC_VOLD, KC_VOLU) } }; #endif // ENCODER_MAP_ENABLE + +#ifdef RGB_MATRIX_ENABLE +bool rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) { + // Check if COLEMAK is the default layer (set by DIP switch) + // The DIP switch uses default_layer_set(), not layer_on() + if (get_highest_layer(default_layer_state) == COLEMAK) { + // Create a breathing effect for the pause key + uint16_t time = timer_read(); + uint8_t val = ((time >> 3) & 0xFF); + + // Convert to triangle wave for breathing + if (val > 127) { + val = 255 - val; + } + val = val << 1; // Double brightness + + // Set pause key to pulse red + RGB_MATRIX_INDICATOR_SET_COLOR(15, val, 0, 0); + } + + // Check if NAVIGATION layer is active + if (IS_LAYER_ON(NAVIGATION)) { + // Light up the HJKL keys (navigation arrow positions) in solid green + // H = LED 56, J = LED 57, K = LED 58, L = LED 59 + RGB_MATRIX_INDICATOR_SET_COLOR(56, 0, 255, 0); // H (Left) + RGB_MATRIX_INDICATOR_SET_COLOR(57, 0, 255, 0); // J (Down) + RGB_MATRIX_INDICATOR_SET_COLOR(58, 0, 255, 0); // K (Up) + RGB_MATRIX_INDICATOR_SET_COLOR(59, 0, 255, 0); // L (Right) + } + + return true; +} +#endif diff --git a/keyboards/keychron/q3/ansi_encoder/keymaps/rbdr/rules.mk b/keyboards/keychron/q3/ansi_encoder/keymaps/rbdr/rules.mk index 835d39e..3684c6d 100644 --- a/keyboards/keychron/q3/ansi_encoder/keymaps/rbdr/rules.mk +++ b/keyboards/keychron/q3/ansi_encoder/keymaps/rbdr/rules.mk @@ -1,3 +1,5 @@ ENCODER_MAP_ENABLE = yes MOUSEKEY_ENABLE = no POINTING_DEVICE_ENABLE = no +TAP_DANCE_ENABLE = yes +RGB_MATRIX_ENABLE = yes |