diff --git a/keymap.c b/keymap.c index d8c80c3..aac4952 100644 --- a/keymap.c +++ b/keymap.c @@ -1,115 +1,84 @@ +/* Copyright 2022 @ Keychron (https://www.keychron.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #include QMK_KEYBOARD_H -#include "keyboard_init.c" +#include "keychron_common.h" #include "tap_dance_config.c" // clang-format off -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [_QWERTY] = LAYOUT_preonic_grid( \ - KC_1, KC_2, KC_3, KC_4, KC_5, KC_GESC, TD(TD_BACKSPACE), KC_6, KC_7, KC_8, KC_9, KC_0, \ - KC_Q, KC_W, KC_E, KC_R, KC_T, TD(TD_L_BRA), TD(TD_R_BRA), KC_Y, KC_U, KC_I, KC_O, KC_P, \ - KC_A, KC_S, KC_D, KC_F, KC_G, KC_TAB, KC_QUOTE, KC_H, KC_J, KC_K, KC_L, TD(TD_COL_PIPE), \ - KC_Z, KC_X, KC_C, KC_V, KC_B, LSFT_T(KC_ENTER), TO(_MOUSE), KC_N, KC_M, TD(TD_COMMA), KC_UP , KC_SLASH , \ - OSL(_MAC_ACTIONS), OSL(_WIN_ACTIONS), KC_LCTRL, KC_LALT, LT(_LOWER, KC_SPACE), KC_SPACE, LT(_RAISE, KC_SPACE), LGUI_T(KC_SPACE), KC_MINS, KC_EQUAL, KC_DOWN, KC_ENTER \ - ), - [_MOUSE] = LAYOUT_preonic_grid( \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ - LGUI(KC_M), KC_UP, _______, LALT(LGUI(KC_LEFT)), LALT(LGUI(KC_RIGHT)), _______, LGUI(LSFT(KC_T)), _______, KC_WH_D, KC_MS_U, KC_WH_U, KC_MS_BTN3, \ - KC_LEFT, KC_DOWN, KC_RIGHT, _______, _______, LGUI(KC_R), LGUI(KC_W), _______, KC_MS_L, KC_MS_D, KC_MS_R, KC_MS_BTN2, \ - _______, _______, _______, LGUI(KC_LEFT), LGUI(KC_RIGHT), _______, TO(_QWERTY), _______, _______, _______, _______, _______, \ - _______, _______, _______, _______, _______ , _______, _______, _______, KC_MS_BTN1, _______, LGUI(KC_MINUS), LGUI(KC_EQUAL) \ - ), +enum layers{ + MAC_BASE, + MAC_FN, + WIN_BASE, + WIN_FN +}; - [_MAC_ACTIONS] = LAYOUT_preonic_grid( \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ - _______, _______, LGUI(KC_E), LGUI(LSFT(KC_4)), LGUI(LSFT(KC_3)), _______, _______, _______, _______, _______, _______, _______, \ - LGUI(KC_A), LGUI(KC_S), LGUI(KC_D), LGUI(KC_F), _______, _______, _______, _______, _______, _______, LGUI(KC_Q), _______, \ - LGUI(KC_Z), KC_MAC_CUT, KC_MAC_COPY, KC_MAC_PASTE, _______, _______, _______, _______, _______, _______, _______, LGUI(KC_SLASH), \ - TO(_QWERTY), _______, _______, _______, _______, _______, _______, _______, LGUI(KC_LEFT), LGUI(KC_RIGHT), LGUI(KC_MINUS), LGUI(KC_EQUAL) \ - ), +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [MAC_BASE] = LAYOUT_ansi_89( + KC_MUTE, KC_ESC, 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_DEL, KC_VOLU, + LGUI(KC_S), KC_GRV, LGUI(LSFT(KC_4)), KC_MUTE, RAG(KC_L) , LCTL(KC_R), LCMD(KC_F12),KC_ESC , KC_BSPC, KC_HOME, KC_END, KC_CALC, KC_LEFT, KC_RGHT, KC_BSPC, KC_VOLD, + KC_MAC_UNDO, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, TD(TD_L_BRA), TD(TD_R_BRA), KC_BSLS, KC_PGUP, + LGUI(KC_F), OSL(MAC_FN), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_QUOT, KC_SCLN, KC_ENT, KC_PGDN, + KC_MAC_PASTE, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_B, KC_N, KC_M, KC_KP_DOT, TD(TD_COMMA), KC_SLSH, OSL(MAC_FN), KC_UP, + KC_MAC_COPY, KC_LCTL, KC_LOPTN, KC_LCMMD, KC_SPC, LT(MAC_FN, KC_SPACE) , KC_SPC, LGUI_T(KC_SPACE), KC_MINS, KC_DOWN, KC_ENT), - [_WIN_ACTIONS] = LAYOUT_preonic_grid( \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ - _______, _______, _______, LCTL(LSFT(KC_R)), LALT(LCTL(KC_T)), _______, _______, LCTL(LSFT(KC_Z)), _______, _______, _______, _______, \ - LCTL(KC_A), LCTL(KC_S), _______, LCTL(KC_F), _______, LALT(LSFT(KC_ENTER)), _______, _______, _______, _______, LGUI(KC_L), _______, \ - LCTL(KC_Z), KC_PC_CUT, KC_PC_COPY, KC_PC_PASTE, _______, LALT(KC_ENTER), _______, _______, _______, _______, _______, LCTL(KC_SLASH), \ - TO(_QWERTY), TO(_QWERTY), LCTL(LSFT(KC_C)), LCTL(LSFT(KC_V)), _______, _______, _______, _______, LALT(KC_LEFT), LALT(KC_RIGHT), LCTL(KC_MINUS), LCTL(KC_EQUAL) \ - ), + [MAC_FN] = LAYOUT_ansi_89( + RGB_TOG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_VAD, RGB_VAI, _______, RGB_SPI, + LSFT(KC_F6), _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_HUD, RGB_HUI, _______, RGB_SPD, + SCMD(KC_Z), _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_SAI, + SCMD(KC_F), _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_SAD, + SCMD(KC_V), _______, _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, LGUI(KC_SLASH), _______, RGB_MOD, + KC_MAC_CUT, _______, _______, _______, _______, _______, _______, _______, _______, RGB_RMOD, _______), - [_LOWER] = LAYOUT_preonic_grid( \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ - LALT(KC_LEFT), KC_UP, LALT(KC_RIGHT), _______, _______, _______, KC_BSPACE, _______, LALT(LSFT(KC_LEFT)), LSFT(KC_UP), LALT(LSFT(KC_RIGHT)), _______, \ - KC_LEFT, KC_DOWN, KC_RIGHT, _______, _______, _______, _______, _______, LSFT(KC_LEFT), LSFT(KC_DOWN), LSFT(KC_RIGHT), _______, \ - _______, _______, _______, LCTL(LSFT(KC_BSPACE)), _______, _______, _______, _______, _______, _______, _______, _______, \ - _______, KC_LGUI, KC_LCTRL, KC_LALT, _______, _______, _______, _______, LSFT(KC_HOME), LSFT(KC_END), KC_HOME, KC_END \ - ), + [WIN_BASE] = LAYOUT_ansi_89( + KC_MUTE, KC_ESC, 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_DEL, KC_VOLU, + LCTL(KC_S), KC_GRV, KC_PSCR, KC_MUTE, _______, KC_MPLY, KC_MSTP, _______, KC_BSPC, KC_HOME, KC_END, KC_CALC, KC_LEFT, KC_RGHT, KC_BSPC, KC_VOLD, + LCTL(KC_Z), KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, TD(TD_L_BRA), TD(TD_R_BRA), KC_BSLS, KC_PGUP, + LCTL(KC_F), OSL(WIN_FN), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_QUOT, KC_SCLN, KC_ENT, KC_PGDN, + KC_PC_PASTE,KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_B, KC_N, KC_M, KC_KP_DOT, TD(TD_COMMA), KC_SLSH, OSL(WIN_FN), KC_UP, + KC_PC_COPY, KC_LCTL, KC_LALT, KC_LWIN, KC_SPC, LT(WIN_FN, KC_SPACE),KC_SPC, KC_MENU, KC_MINS, KC_DOWN, KC_ENT), - [_RAISE] = LAYOUT_preonic_grid( \ - 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_EXLM, KC_AMPR, KC_ASTR, KC_PERC, KC_DLR, KC_EXLM,\ - KC_AT, KC_BSLASH, KC_PIPE, _______, _______, _______, _______, KC_DOT, KC_LPRN, KC_RPRN, KC_CIRC, KC_HASH \ - ), + [WIN_FN] = LAYOUT_ansi_89( + RGB_TOG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_VAD, RGB_VAI, _______, RGB_SPI, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_HUD, RGB_HUI, _______, RGB_SPD, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_SAI, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_SAD, + _______, _______, _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, RGB_MOD, + _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_RMOD, _______), +}; - [_ADJUST] = LAYOUT_preonic_grid( \ - TO(_QWERTY), AU_TOG, CK_TOGG, _______, _______, TO(_MOUSE), _______, _______, _______, _______, _______, _______, \ - _______, RESET, DEBUG, _______, _______, _______, _______, TERM_ON, TERM_OFF, _______, _______, KC_DEL, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ - _______, MUV_DE, MUV_IN, _______, _______, MI_ON, MI_OFF, _______, _______, BL_INC, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, MU_TOG , _______, BL_DEC, _______, _______ \ - ), +#if defined(ENCODER_ENABLE) && defined(ENCODER_MAP_ENABLE) +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = { + [MAC_BASE] = { ENCODER_CCW_CW(KC_LEFT, KC_RGHT) }, + [MAC_FN] = { ENCODER_CCW_CW(RGB_VAD, RGB_VAI) }, + [WIN_BASE] = { ENCODER_CCW_CW(KC_LEFT, KC_RGHT) }, + [WIN_FN] = { ENCODER_CCW_CW(RGB_VAD, RGB_VAI) } }; -// clang-format on +#endif // ENCODER_MAP_ENABLE -bool process_record_user(uint16_t keycode, keyrecord_t *record) { - switch (keycode) { - case QWERTY: - if (record->event.pressed) { - set_single_persistent_default_layer(_QWERTY); - } - return false; - break; - case MAC_ACTIONS: - if (record->event.pressed) { - layer_move(_MAC_ACTIONS); - } - return false; - break; - case WIN_ACTIONS: - if (record->event.pressed) { - layer_move(_WIN_ACTIONS); - } - return false; - break; +// clang-format on - case MOUSE: - if (record->event.pressed) { - layer_move(_MOUSE); - } - return false; - break; +void housekeeping_task_user(void) { + housekeeping_task_keychron(); +} - case LOWER: - if (record->event.pressed) { - layer_on(_LOWER); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } else { - layer_off(_LOWER); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } - return false; - break; - case RAISE: - if (record->event.pressed) { - layer_on(_RAISE); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } else { - layer_off(_RAISE); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } - return false; - break; +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + if (!process_record_keychron(keycode, record)) { + return false; } return true; -}; +} diff --git a/rules.mk b/rules.mk index 1d64240..b2eeb58 100644 --- a/rules.mk +++ b/rules.mk @@ -1,7 +1,7 @@ -SRC += muse.c +VIA_ENABLE = yes +ENCODER_MAP_ENABLE = yes -RGBLIGHT_ENABLE = yes -AUDIO_ENABLE = yes +VPATH += keyboards/keychron/common +SRC += keychron_common.c AUTO_SHIFT_ENABLE = yes -TAP_DANCE_ENABLE = yes # Enable support for Tap Dance -ENCODER_ENABLE = yes +TAP_DANCE_ENABLE = yes diff --git a/tap_dance_config.c b/tap_dance_config.c index 0f826b9..7e4e15a 100644 --- a/tap_dance_config.c +++ b/tap_dance_config.c @@ -1,215 +1,131 @@ - -typedef struct { - bool is_press_action; - int state; -} tap; - -enum { SINGLE_TAP = 1, SINGLE_HOLD, DOUBLE_TAP, DOUBLE_HOLD, DOUBLE_SINGLE_TAP, TRIPLE_TAP, TRIPLE_HOLD }; - -enum { - TD_ESC_CAPS, - TD_COL_PIPE, - TD_L_BRA, - TD_R_BRA, - TD_BACKSPACE, - TD_COMMA, -}; - -int cur_dance(qk_tap_dance_state_t *state); -void x_finished(qk_tap_dance_state_t *state, void *user_data); -void x_reset(qk_tap_dance_state_t *state, void *user_data); - -int cur_dance(qk_tap_dance_state_t *state) { - if (state->count == 1) { - if (state->interrupted || !state->pressed) return SINGLE_TAP; - // Key has not been interrupted, but the key is still held. Means you want to send a 'HOLD'. - else - return SINGLE_HOLD; - } else if (state->count == 2) { - if (state->interrupted) - return DOUBLE_SINGLE_TAP; - else if (state->pressed) - return DOUBLE_HOLD; - else - return DOUBLE_TAP; - } - - if (state->count == 3) { - if (state->interrupted || !state->pressed) - return TRIPLE_TAP; - else - return TRIPLE_HOLD; - } else - return 8; -} - -// Create an instance of 'tap' for the 'x' tap dance. -static tap xtap_state = {.is_press_action = true, .state = 0}; - -void col_finished(qk_tap_dance_state_t *state, void *user_data) { - xtap_state.state = cur_dance(state); - switch (xtap_state.state) { - case SINGLE_TAP: - register_code16(KC_SCOLON); - break; - case SINGLE_HOLD: - register_code16(KC_COLON); - break; - case DOUBLE_TAP: - register_code16(KC_PIPE); - break; - case DOUBLE_HOLD: - register_code16(KC_NO); - break; - case DOUBLE_SINGLE_TAP: - tap_code16(KC_SCOLON); - register_code16(KC_SCOLON); - } -} - -void col_reset(qk_tap_dance_state_t *state, void *user_data) { - switch (xtap_state.state) { - case SINGLE_TAP: - unregister_code16(KC_SCOLON); - break; - case SINGLE_HOLD: - unregister_code16(KC_COLON); - break; - case DOUBLE_TAP: - unregister_code16(KC_PIPE); - break; - case DOUBLE_HOLD: - unregister_code16(KC_NO); - case DOUBLE_SINGLE_TAP: - unregister_code16(KC_SCOLON); - } - xtap_state.state = 0; -} - -void l_bra_finished(qk_tap_dance_state_t *state, void *user_data) { - xtap_state.state = cur_dance(state); - switch (xtap_state.state) { - case SINGLE_TAP: - register_code16(KC_LEFT_CURLY_BRACE); - break; - case SINGLE_HOLD: - register_code16(KC_LBRC); - break; - case DOUBLE_TAP: - register_code16(KC_LEFT_PAREN); - break; - case DOUBLE_HOLD: - register_code16(KC_LEFT_ANGLE_BRACKET); - break; - case DOUBLE_SINGLE_TAP: - tap_code16(KC_LEFT_CURLY_BRACE); - register_code16(KC_LEFT_CURLY_BRACE); - } -} - -void l_bra_reset(qk_tap_dance_state_t *state, void *user_data) { - switch (xtap_state.state) { - case SINGLE_TAP: - unregister_code16(KC_LEFT_CURLY_BRACE); - break; - case SINGLE_HOLD: - unregister_code16(KC_LBRC); - break; - case DOUBLE_TAP: - unregister_code16(KC_LEFT_PAREN); - break; - case DOUBLE_HOLD: - unregister_code16(KC_LEFT_ANGLE_BRACKET); - case DOUBLE_SINGLE_TAP: - unregister_code16(KC_LEFT_CURLY_BRACE); - } - xtap_state.state = 0; -} - -void r_bra_finished(qk_tap_dance_state_t *state, void *user_data) { - xtap_state.state = cur_dance(state); - switch (xtap_state.state) { - case SINGLE_TAP: - register_code16(KC_RIGHT_CURLY_BRACE); - break; - case SINGLE_HOLD: - register_code16(KC_RBRC); - break; - case DOUBLE_TAP: - register_code16(KC_RIGHT_PAREN); - break; - case DOUBLE_HOLD: - register_code16(KC_RIGHT_ANGLE_BRACKET); - break; - case DOUBLE_SINGLE_TAP: - tap_code16(KC_RIGHT_CURLY_BRACE); - register_code16(KC_RIGHT_CURLY_BRACE); - } -} - -void r_bra_reset(qk_tap_dance_state_t *state, void *user_data) { - switch (xtap_state.state) { - case SINGLE_TAP: - unregister_code16(KC_RIGHT_CURLY_BRACE); - break; - case SINGLE_HOLD: - unregister_code16(KC_RBRC); - break; - case DOUBLE_TAP: - unregister_code16(KC_RIGHT_PAREN); - break; - case DOUBLE_HOLD: - unregister_code16(KC_RIGHT_ANGLE_BRACKET); - case DOUBLE_SINGLE_TAP: - unregister_code16(KC_RIGHT_CURLY_BRACE); - } - xtap_state.state = 0; -} - -void back_finished(qk_tap_dance_state_t *state, void *user_data) { - xtap_state.state = cur_dance(state); - switch (xtap_state.state) { - case SINGLE_TAP: - register_code16(KC_BSPACE); - break; - case SINGLE_HOLD: - register_code16(KC_BSPACE); - break; - case DOUBLE_TAP: - tap_code16(KC_BSPACE); - register_code16(KC_BSPACE); - break; - case DOUBLE_HOLD: - register_code16(LCTL(KC_BSPACE)); - break; - case DOUBLE_SINGLE_TAP: - tap_code16(KC_BSPACE); - register_code16(KC_BSPACE); - } -} - -void back_reset(qk_tap_dance_state_t *state, void *user_data) { - switch (xtap_state.state) { - case SINGLE_TAP: - unregister_code16(KC_BSPACE); - break; - case SINGLE_HOLD: - unregister_code16(KC_BSPACE); - break; - case DOUBLE_TAP: - unregister_code16(KC_BSPACE); - break; - case DOUBLE_HOLD: - unregister_code16(LCTL(KC_BSPACE)); - break; - case DOUBLE_SINGLE_TAP: - unregister_code16(KC_BSPACE); - } - xtap_state.state = 0; -} - -// Tap Dance definitions -qk_tap_dance_action_t tap_dance_actions[] = { - // Tap once for Escape, twice for Caps Lock - [TD_ESC_CAPS] = ACTION_TAP_DANCE_DOUBLE(KC_ESC, KC_CAPS), [TD_COMMA] = ACTION_TAP_DANCE_DOUBLE(KC_COMMA, KC_DOT), [TD_COL_PIPE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, col_finished, col_reset), [TD_L_BRA] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, l_bra_finished, l_bra_reset), [TD_R_BRA] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, r_bra_finished, r_bra_reset), [TD_BACKSPACE] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, back_finished, back_reset, 150), -}; + +typedef struct { + bool is_press_action; + int state; +} tap; + +enum { SINGLE_TAP = 1, SINGLE_HOLD, DOUBLE_TAP, DOUBLE_HOLD, DOUBLE_SINGLE_TAP, TRIPLE_TAP, TRIPLE_HOLD }; + +enum { + TD_COMMA, + TD_L_BRA, + TD_R_BRA, +}; + +int cur_dance(tap_dance_state_t *state); +void x_finished(tap_dance_state_t *state, void *user_data); +void x_reset(tap_dance_state_t *state, void *user_data); + +int cur_dance(tap_dance_state_t *state) { + if (state->count == 1) { + if (state->interrupted || !state->pressed) return SINGLE_TAP; + // Key has not been interrupted, but the key is still held. Means you want to send a 'HOLD'. + else + return SINGLE_HOLD; + } else if (state->count == 2) { + if (state->interrupted) + return DOUBLE_SINGLE_TAP; + else if (state->pressed) + return DOUBLE_HOLD; + else + return DOUBLE_TAP; + } + + if (state->count == 3) { + if (state->interrupted || !state->pressed) + return TRIPLE_TAP; + else + return TRIPLE_HOLD; + } else + return 8; +} + +// Create an instance of 'tap' for the 'x' tap dance. +static tap xtap_state = {.is_press_action = true, .state = 0}; + +void l_bra_finished(tap_dance_state_t *state, void *user_data) { + xtap_state.state = cur_dance(state); + switch (xtap_state.state) { + case SINGLE_TAP: + register_code16(KC_LEFT_CURLY_BRACE); + break; + case SINGLE_HOLD: + register_code16(KC_LBRC); + break; + case DOUBLE_TAP: + register_code16(KC_LEFT_PAREN); + break; + case DOUBLE_HOLD: + register_code16(KC_LEFT_ANGLE_BRACKET); + break; + case DOUBLE_SINGLE_TAP: + tap_code16(KC_LEFT_CURLY_BRACE); + register_code16(KC_LEFT_CURLY_BRACE); + } +} + +void l_bra_reset(tap_dance_state_t *state, void *user_data) { + switch (xtap_state.state) { + case SINGLE_TAP: + unregister_code16(KC_LEFT_CURLY_BRACE); + break; + case SINGLE_HOLD: + unregister_code16(KC_LBRC); + break; + case DOUBLE_TAP: + unregister_code16(KC_LEFT_PAREN); + break; + case DOUBLE_HOLD: + unregister_code16(KC_LEFT_ANGLE_BRACKET); + case DOUBLE_SINGLE_TAP: + unregister_code16(KC_LEFT_CURLY_BRACE); + } + xtap_state.state = 0; +} + +void r_bra_finished(tap_dance_state_t *state, void *user_data) { + xtap_state.state = cur_dance(state); + switch (xtap_state.state) { + case SINGLE_TAP: + register_code16(KC_RIGHT_CURLY_BRACE); + break; + case SINGLE_HOLD: + register_code16(KC_RBRC); + break; + case DOUBLE_TAP: + register_code16(KC_RIGHT_PAREN); + break; + case DOUBLE_HOLD: + register_code16(KC_RIGHT_ANGLE_BRACKET); + break; + case DOUBLE_SINGLE_TAP: + tap_code16(KC_RIGHT_CURLY_BRACE); + register_code16(KC_RIGHT_CURLY_BRACE); + } +} + +void r_bra_reset(tap_dance_state_t *state, void *user_data) { + switch (xtap_state.state) { + case SINGLE_TAP: + unregister_code16(KC_RIGHT_CURLY_BRACE); + break; + case SINGLE_HOLD: + unregister_code16(KC_RBRC); + break; + case DOUBLE_TAP: + unregister_code16(KC_RIGHT_PAREN); + break; + case DOUBLE_HOLD: + unregister_code16(KC_RIGHT_ANGLE_BRACKET); + case DOUBLE_SINGLE_TAP: + unregister_code16(KC_RIGHT_CURLY_BRACE); + } + xtap_state.state = 0; +} + +// Tap Dance definitions +tap_dance_action_t tap_dance_actions[] = { + [TD_COMMA] = ACTION_TAP_DANCE_DOUBLE(KC_COMMA, KC_DOT), + [TD_L_BRA] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, l_bra_finished, l_bra_reset), + [TD_R_BRA] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, r_bra_finished, r_bra_reset), +};