]> git.donarmstrong.com Git - qmk_firmware.git/blob - users/edvorakjp/edvorakjp_tap_dance.c
62c0c100a22b766af08430bb5de4b7762a95b40a
[qmk_firmware.git] / users / edvorakjp / edvorakjp_tap_dance.c
1 #include "edvorakjp.h"
2 #include "process_keycode/process_tap_dance.h"
3
4 enum tap_state {
5   NONE = 0,
6   SINGLE_TAP = 1,
7   DOUBLE_TAP = 2,
8   HOLD
9 };
10
11 static int td_status_lower = NONE;
12 static int td_status_raise = NONE;
13
14 int cur_dance(qk_tap_dance_state_t *state) {
15   if (state->interrupted || !state->pressed) {
16     return state->count == 1 ? SINGLE_TAP : DOUBLE_TAP;
17   } else {
18     return HOLD;
19   }
20 }
21
22 void td_lower_finished(qk_tap_dance_state_t *state, void *user_data) {
23   td_status_lower = cur_dance(state);
24   switch(td_status_lower) {
25     case SINGLE_TAP:
26       set_japanese_mode(false);
27       register_code(KC_ESC);
28       break;
29     case DOUBLE_TAP:
30       set_japanese_mode(false);
31       break;
32     case HOLD:
33       break;
34   }
35   layer_on(_LOWER);
36 }
37
38 void td_lower_reset(qk_tap_dance_state_t *state, void *user_data) {
39   if (td_status_lower == SINGLE_TAP) {
40     unregister_code(KC_ESC);
41   }
42   layer_off(_LOWER);
43   td_status_lower = NONE;
44 }
45
46 void td_raise_finished(qk_tap_dance_state_t *state, void *user_data) {
47   td_status_raise = cur_dance(state);
48   switch(td_status_raise) {
49     case SINGLE_TAP:
50     case DOUBLE_TAP:
51       set_japanese_mode(true);
52       break;
53     case HOLD:
54       break;
55   }
56   layer_on(_RAISE);
57 }
58
59 void td_raise_reset(qk_tap_dance_state_t *state, void *user_data) {
60   layer_off(_RAISE);
61   td_status_raise = NONE;
62 }
63
64 qk_tap_dance_action_t tap_dance_actions[] = {
65   [TD_LOWER] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(
66       NULL, td_lower_finished, td_lower_reset, TAPPING_TERM * 1.5
67       ),
68   [TD_RAISE] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(
69       NULL, td_raise_finished, td_raise_reset, TAPPING_TERM * 1.5
70       )
71 };