Created
September 4, 2025 15:13
-
-
Save whaaaley/c39019f934a159ca5a0ba4fc44804da7 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #include QMK_KEYBOARD_H | |
| #if __has_include("keymap.h") | |
| # include "keymap.h" | |
| #endif | |
| #define ___ KC_TRNS | |
| enum { | |
| TD_CTRL_ALT, | |
| TD_MO3_MO4, | |
| TD_BOOT, TD_P, TD_O, TD_I, TD_U, TD_Y, TD_T, TD_R, TD_E, TD_W, TD_Q, | |
| TD_QUOT, TD_SCLN, TD_L, TD_K, TD_J, TD_H, TD_G, TD_F, TD_D, TD_S, TD_A, TD_TAB, | |
| TD_SLSH, TD_DOT, TD_COMM, TD_M, TD_N, TD_B, TD_V, TD_C, TD_X, TD_Z, | |
| }; | |
| // Tap dance for Ctrl/Alt key | |
| // Single tap: Ctrl tap, Hold: Ctrl + layer 1, Double tap: Alt + layer 2 | |
| void dance_ctrl_alt_finished(tap_dance_state_t *state, void *user_data) { | |
| if (state->count == 1) { | |
| if (state->pressed) { | |
| // Hold: Ctrl + layer 1 | |
| register_code(KC_LCTL); | |
| layer_on(1); | |
| } else { | |
| // Single tap: just Ctrl (no layer activation) | |
| tap_code(KC_LCTL); | |
| } | |
| } else if (state->count >= 2) { | |
| // Double tap: Alt + layer 2 | |
| register_code(KC_LALT); | |
| layer_on(2); | |
| } | |
| } | |
| void dance_ctrl_alt_reset(tap_dance_state_t *state, void *user_data) { | |
| // Always clean up any active modifiers and layers | |
| unregister_code(KC_LCTL); | |
| unregister_code(KC_LALT); | |
| layer_off(1); | |
| layer_off(2); | |
| } | |
| // Tap dance for layer switching | |
| // Single tap: layer 3 (symbols), Double tap: layer 5 (numbers) | |
| void dance_mo3_mo4_finished(tap_dance_state_t *state, void *user_data) { | |
| if (state->count == 1) { | |
| // Single tap: Activate symbols layer (layer 3) | |
| layer_on(3); | |
| } else if (state->count >= 2) { | |
| // Double tap: Activate numbers layer (layer 5) | |
| layer_on(5); | |
| } | |
| } | |
| void dance_mo3_mo4_reset(tap_dance_state_t *state, void *user_data) { | |
| if (state->count == 1) { | |
| // Release single tap: Deactivate symbols layer | |
| layer_off(3); | |
| } else if (state->count >= 2) { | |
| // Release double tap: Deactivate numbers layer | |
| layer_off(5); | |
| } | |
| } | |
| const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |
| // Base layer | |
| [0] = LAYOUT_split_3x6_3( | |
| QK_BOOT, KC_P, KC_O, KC_I, KC_U, KC_Y, KC_T, KC_R, KC_E, KC_W, KC_Q, ___, | |
| KC_QUOT, KC_SCLN, KC_L, KC_K, KC_J, KC_H, KC_G, KC_F, KC_D, KC_S, KC_A, KC_TAB, | |
| ___, KC_SLSH, KC_DOT, KC_COMM, KC_M, KC_N, KC_B, KC_V, KC_C, KC_X, KC_Z, ___, | |
| TD(TD_MO3_MO4), KC_SPC, KC_ENT, KC_LSFT, TD(TD_CTRL_ALT), KC_BSPC | |
| ), | |
| // Ctrl layer | |
| [1] = LAYOUT_split_3x6_3( | |
| ___, TD(TD_P), TD(TD_O), TD(TD_I), TD(TD_U), TD(TD_Y), TD(TD_T), TD(TD_R), TD(TD_E), TD(TD_W), TD(TD_Q), ___, | |
| TD(TD_QUOT), TD(TD_SCLN), TD(TD_L), TD(TD_K), TD(TD_J), TD(TD_H), TD(TD_G), TD(TD_F), TD(TD_D), TD(TD_S), TD(TD_A), TD(TD_TAB), | |
| ___, TD(TD_SLSH), TD(TD_DOT), TD(TD_COMM), TD(TD_M), TD(TD_N), TD(TD_B), TD(TD_V), TD(TD_C), TD(TD_X), TD(TD_Z), ___, | |
| MO(4), ___, ___, ___, ___, ___ | |
| ), | |
| // Alt layer | |
| [2] = LAYOUT_split_3x6_3( | |
| ___, ___, LSFT(KC_TAB), ___, ___, ___, ___, ___, ___, ___, ___, ___, | |
| ___, KC_TAB, ___, ___, ___, ___, ___, ___, ___, ___, ___, KC_LSFT, | |
| ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, | |
| ___, ___, ___, ___, ___, ___ | |
| ), | |
| // Symbols layer | |
| [3] = LAYOUT_split_3x6_3( | |
| ___, KC_PLUS, KC_EQL, KC_MINS, KC_ASTR, KC_AMPR, KC_PIPE, KC_RCBR, KC_LCBR, KC_AT, KC_EXLM, ___, | |
| ___, KC_GT, KC_RGHT, KC_UP, KC_DOWN, KC_LEFT, KC_GRV, KC_RPRN, KC_LPRN, KC_DLR, MT(MOD_LSFT, KC_HASH), ___, | |
| ___, KC_DQUO, KC_QUOT, KC_BSLS, KC_LT, KC_UNDS, KC_TILD, KC_RBRC, KC_LBRC, KC_CIRC, KC_PERC, ___, | |
| ___, ___, ___, KC_ESC, MO(4), KC_DEL | |
| ), | |
| // Navigation layer | |
| [4] = LAYOUT_split_3x6_3( | |
| ___, KC_PGDN, KC_HOME, ___, ___, KC_PGUP, ___, ___, ___, ___, ___, ___, | |
| ___, KC_END, LCTL(KC_RGHT), LCTL(KC_UP), LCTL(KC_DOWN), LCTL(KC_LEFT), ___, ___, ___, ___, KC_LSFT, ___, | |
| ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, | |
| ___, ___, ___, ___, ___, ___ | |
| ), | |
| // Numbers layer | |
| [5] = LAYOUT_split_3x6_3( | |
| ___, KC_0, KC_9, KC_8, KC_7, KC_6, KC_5, KC_4, KC_3, KC_2, KC_1, ___, | |
| ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, | |
| ___, KC_LALT, LGUI(KC_DOT), ___, ___, ___, ___, ___, LSG(KC_C), LSG(KC_S), ___, ___, | |
| ___, ___, ___, ___, ___, ___ | |
| ) | |
| }; | |
| tap_dance_action_t tap_dance_actions[] = { | |
| [TD_CTRL_ALT] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_ctrl_alt_finished, dance_ctrl_alt_reset), | |
| [TD_MO3_MO4] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_mo3_mo4_finished, dance_mo3_mo4_reset), | |
| [TD_P] = ACTION_TAP_DANCE_DOUBLE(KC_P, LSFT(KC_P)), | |
| [TD_O] = ACTION_TAP_DANCE_DOUBLE(KC_O, LSFT(KC_O)), | |
| [TD_I] = ACTION_TAP_DANCE_DOUBLE(KC_I, LSFT(KC_I)), | |
| [TD_U] = ACTION_TAP_DANCE_DOUBLE(KC_U, LSFT(KC_U)), | |
| [TD_Y] = ACTION_TAP_DANCE_DOUBLE(KC_Y, LSFT(KC_Y)), | |
| [TD_T] = ACTION_TAP_DANCE_DOUBLE(KC_T, LSFT(KC_T)), | |
| [TD_R] = ACTION_TAP_DANCE_DOUBLE(KC_R, LSFT(KC_R)), | |
| [TD_E] = ACTION_TAP_DANCE_DOUBLE(KC_E, LSFT(KC_E)), | |
| [TD_W] = ACTION_TAP_DANCE_DOUBLE(KC_W, LSFT(KC_W)), | |
| [TD_Q] = ACTION_TAP_DANCE_DOUBLE(KC_Q, LSFT(KC_Q)), | |
| [TD_QUOT] = ACTION_TAP_DANCE_DOUBLE(KC_QUOT, LSFT(KC_QUOT)), | |
| [TD_SCLN] = ACTION_TAP_DANCE_DOUBLE(KC_SCLN, LSFT(KC_SCLN)), | |
| [TD_L] = ACTION_TAP_DANCE_DOUBLE(KC_L, LSFT(KC_L)), | |
| [TD_K] = ACTION_TAP_DANCE_DOUBLE(KC_K, LSFT(KC_K)), | |
| [TD_J] = ACTION_TAP_DANCE_DOUBLE(KC_J, LSFT(KC_J)), | |
| [TD_H] = ACTION_TAP_DANCE_DOUBLE(KC_H, LSFT(KC_H)), | |
| [TD_G] = ACTION_TAP_DANCE_DOUBLE(KC_G, LSFT(KC_G)), | |
| [TD_F] = ACTION_TAP_DANCE_DOUBLE(KC_F, LSFT(KC_F)), | |
| [TD_D] = ACTION_TAP_DANCE_DOUBLE(KC_D, LSFT(KC_D)), | |
| [TD_S] = ACTION_TAP_DANCE_DOUBLE(KC_S, LSFT(KC_S)), | |
| [TD_A] = ACTION_TAP_DANCE_DOUBLE(KC_A, LSFT(KC_A)), | |
| [TD_TAB] = ACTION_TAP_DANCE_DOUBLE(KC_TAB, LSFT(KC_TAB)), | |
| [TD_SLSH] = ACTION_TAP_DANCE_DOUBLE(KC_SLSH, LSFT(KC_SLSH)), | |
| [TD_DOT] = ACTION_TAP_DANCE_DOUBLE(KC_DOT, LSFT(KC_DOT)), | |
| [TD_COMM] = ACTION_TAP_DANCE_DOUBLE(KC_COMM, LSFT(KC_COMM)), | |
| [TD_M] = ACTION_TAP_DANCE_DOUBLE(KC_M, LSFT(KC_M)), | |
| [TD_N] = ACTION_TAP_DANCE_DOUBLE(KC_N, LSFT(KC_N)), | |
| [TD_B] = ACTION_TAP_DANCE_DOUBLE(KC_B, LSFT(KC_B)), | |
| [TD_V] = ACTION_TAP_DANCE_DOUBLE(KC_V, LSFT(KC_V)), | |
| [TD_C] = ACTION_TAP_DANCE_DOUBLE(KC_C, LSFT(KC_C)), | |
| [TD_X] = ACTION_TAP_DANCE_DOUBLE(KC_X, LSFT(KC_X)), | |
| [TD_Z] = ACTION_TAP_DANCE_DOUBLE(KC_Z, LSFT(KC_Z)), | |
| }; | |
| #ifdef OTHER_KEYMAP_C | |
| # include OTHER_KEYMAP_C | |
| #endif // OTHER_KEYMAP_C |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment