summaryrefslogtreecommitdiffstats
path: root/users/edvorakjp/edvorakjp_tap_dance.c
blob: d5369f9266e6a4dca957ec2d7c0f5d40f56b7b2b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include "edvorakjp.h"
#include "process_keycode/process_tap_dance.h"

enum tap_state {
  NONE = 0,
  SINGLE_TAP = 1,
  DOUBLE_TAP = 2,
  HOLD
};

typedef struct {
  uint8_t lower;
  uint8_t raise;
} td_status_t;
static td_status_t td_status = {NONE, NONE};

int cur_dance(qk_tap_dance_state_t *state) {
  if (state->interrupted || !state->pressed) {
    return state->count == 1 ? SINGLE_TAP : DOUBLE_TAP;
  } else {
    return HOLD;
  }
}

void td_lower_finished(qk_tap_dance_state_t *state, void *user_data) {
  td_status.lower = cur_dance(state);
  switch(td_status.lower) {
    case SINGLE_TAP:
      set_japanese_mode(false);
      break;
    case DOUBLE_TAP:
      set_japanese_mode(false);
      register_code(KC_ESC);
      break;
    case HOLD:
      break;
  }
  layer_on(_LOWER);
}

void td_lower_reset(qk_tap_dance_state_t *state, void *user_data) {
  if (td_status.lower == DOUBLE_TAP) {
    unregister_code(KC_ESC);
  }
  layer_off(_LOWER);
  td_status.lower = NONE;
}

void td_raise_finished(qk_tap_dance_state_t *state, void *user_data) {
  td_status.raise = cur_dance(state);
  switch(td_status.raise) {
    case DOUBLE_TAP:
      // same as single
    case SINGLE_TAP:
      set_japanese_mode(true);
      break;
    case HOLD:
      break;
  }
  layer_on(_RAISE);
}

void td_raise_reset(qk_tap_dance_state_t *state, void *user_data) {
  layer_off(_RAISE);
  td_status.raise = NONE;
}

qk_tap_dance_action_t tap_dance_actions[] = {
  [TD_LOWER] =
    ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, td_lower_finished, td_lower_reset, 100),
  [TD_RAISE] =
    ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, td_raise_finished, td_raise_reset, 100)
};