tap_dances.c (4019B)
1 /* Copyright 2024 Vaarai 2 * 3 * This program is free software: you can redistribute it and/or modify 4 * it under the terms of the GNU General Public License as published by 5 * the Free Software Foundation, either version 2 of the License, or 6 * (at your option) any later version. 7 * 8 * This program is distributed in the hope that it will be useful, 9 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 * GNU General Public License for more details. 12 * 13 * You should have received a copy of the GNU General Public License 14 * along with this program. If not, see <http://www.gnu.org/licenses/>. 15 */ 16 17 #include QMK_KEYBOARD_H 18 19 #include "./tap_dances.h" 20 #include "./keymap.h" 21 22 /* define a type containing as many tapdance states as you need */ 23 typedef enum { 24 SINGLE_TAP, 25 SINGLE_HOLD, 26 DOUBLE_TAP, 27 DOUBLE_HOLD, 28 OTHER_TAP 29 } td_state_t; 30 31 /* Create a global instance of the tapdance state type */ 32 static td_state_t td_state; 33 accent_state_t accent_state = ACCENT_NONE; 34 35 tap_dance_action_t tap_dance_actions[TAP_DANCE_ACTIONS_COUNT] = { 36 [TD_SFT_CAPSW] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_shift_capsword_finished, dance_shift_capsword_reset), 37 [TD_NAV_ACCENT] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_nav_accent_finished, dance_nav_accent_reset), 38 [TD_NUM_ACCENT] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_num_accent_finished, dance_num_accent_reset) 39 }; 40 41 int cur_dance (tap_dance_state_t *state) { 42 if (state->count == 1) { 43 if (state->interrupted || !state->pressed) 44 { 45 return SINGLE_TAP; 46 } else { 47 return SINGLE_HOLD; 48 } 49 } 50 if (state->count == 2) 51 { 52 if (state->interrupted || !state->pressed) 53 { 54 return DOUBLE_TAP; 55 } else { 56 return DOUBLE_HOLD; 57 } 58 } else { 59 return OTHER_TAP; 60 } 61 } 62 63 void dance_shift_capsword_finished (tap_dance_state_t *state, void *user_data) 64 { 65 td_state = cur_dance(state); 66 switch (td_state) { 67 case SINGLE_TAP: 68 case SINGLE_HOLD: 69 register_code(KC_LSFT); 70 break; 71 case DOUBLE_TAP: 72 case DOUBLE_HOLD: 73 caps_word_on(); 74 break; 75 case OTHER_TAP: 76 break; 77 } 78 } 79 80 void dance_shift_capsword_reset (tap_dance_state_t *state, void *user_data) 81 { 82 switch (td_state) { 83 case SINGLE_TAP: 84 case SINGLE_HOLD: 85 unregister_code(KC_LSFT); 86 break; 87 case DOUBLE_TAP: 88 case DOUBLE_HOLD: 89 case OTHER_TAP: 90 break; 91 } 92 } 93 94 void dance_nav_accent_finished (tap_dance_state_t *state, void *user_data) 95 { 96 td_state = cur_dance(state); 97 switch (td_state) { 98 case SINGLE_TAP: 99 case SINGLE_HOLD: 100 layer_on(_NAV); 101 break; 102 case DOUBLE_TAP: 103 case DOUBLE_HOLD: 104 accent_state = ACCENT_LEFT; 105 break; 106 case OTHER_TAP: 107 break; 108 } 109 } 110 111 void dance_nav_accent_reset (tap_dance_state_t *state, void *user_data) 112 { 113 switch (td_state) { 114 case SINGLE_TAP: 115 case SINGLE_HOLD: 116 layer_off(_NAV); 117 break; 118 case DOUBLE_TAP: 119 case DOUBLE_HOLD: 120 case OTHER_TAP: 121 break; 122 } 123 } 124 125 void dance_num_accent_finished (tap_dance_state_t *state, void *user_data) 126 { 127 td_state = cur_dance(state); 128 switch (td_state) { 129 case SINGLE_TAP: 130 case SINGLE_HOLD: 131 layer_on(_NUM); 132 break; 133 case DOUBLE_TAP: 134 case DOUBLE_HOLD: 135 accent_state = ACCENT_RIGHT; 136 break; 137 case OTHER_TAP: 138 break; 139 } 140 } 141 142 void dance_num_accent_reset (tap_dance_state_t *state, void *user_data) 143 { 144 switch (td_state) { 145 case SINGLE_TAP: 146 case SINGLE_HOLD: 147 layer_off(_NUM); 148 break; 149 case DOUBLE_TAP: 150 case DOUBLE_HOLD: 151 case OTHER_TAP: 152 break; 153 } 154 }