qmk_firmware

QMK firmware for my keyboards (Corne, Sweep Ferris) and trackball (Ploopy Adept)
Log | Files | Refs | Submodules | LICENSE

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 }