summaryrefslogtreecommitdiffstats
path: root/users/edvorakjp/edvorakjp_tap_dance.c
diff options
context:
space:
mode:
Diffstat (limited to 'users/edvorakjp/edvorakjp_tap_dance.c')
-rw-r--r--users/edvorakjp/edvorakjp_tap_dance.c71
1 files changed, 71 insertions, 0 deletions
diff --git a/users/edvorakjp/edvorakjp_tap_dance.c b/users/edvorakjp/edvorakjp_tap_dance.c
new file mode 100644
index 000000000..62c0c100a
--- /dev/null
+++ b/users/edvorakjp/edvorakjp_tap_dance.c
@@ -0,0 +1,71 @@
+#include "edvorakjp.h"
+#include "process_keycode/process_tap_dance.h"
+
+enum tap_state {
+ NONE = 0,
+ SINGLE_TAP = 1,
+ DOUBLE_TAP = 2,
+ HOLD
+};
+
+static int td_status_lower = NONE;
+static int td_status_raise = 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);
+ register_code(KC_ESC);
+ break;
+ case DOUBLE_TAP:
+ set_japanese_mode(false);
+ break;
+ case HOLD:
+ break;
+ }
+ layer_on(_LOWER);
+}
+
+void td_lower_reset(qk_tap_dance_state_t *state, void *user_data) {
+ if (td_status_lower == SINGLE_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 SINGLE_TAP:
+ case DOUBLE_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, TAPPING_TERM * 1.5
+ ),
+ [TD_RAISE] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(
+ NULL, td_raise_finished, td_raise_reset, TAPPING_TERM * 1.5
+ )
+};