aboutsummaryrefslogtreecommitdiff
path: root/keyboards
diff options
context:
space:
mode:
authorRuben Beltran del Rio <jj@r.bdr.sh>2026-01-12 11:08:01 +0100
committerRuben Beltran del Rio <jj@r.bdr.sh>2026-01-12 12:53:59 +0100
commit1acbb0fd4bf288738194137f83df37508128d708 (patch)
tree72fd79377a29314af22eb424a9a43d446599e876 /keyboards
parent383fa49a534d57fc0a4455ac918af90cd287d5d1 (diff)
Add colemak layer to q3
Diffstat (limited to 'keyboards')
-rw-r--r--keyboards/keychron/q3/ansi_encoder/keymaps/rbdr/keymap.c147
-rw-r--r--keyboards/keychron/q3/ansi_encoder/keymaps/rbdr/rules.mk2
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