summaryrefslogtreecommitdiff
path: root/users/edvorakjp/edvorakjp_tap_dance.c
diff options
context:
space:
mode:
authorepaew <epaew@users.noreply.github.com>2018-11-27 02:50:45 +0900
committerDrashna Jaelre <drashna@live.com>2018-11-26 09:50:45 -0800
commitf3ffd6ad50f0a4bf24f0a0453cc5502b4b88f390 (patch)
treeba63b9851104dfc7916740af4bcee8f2476e50b3 /users/edvorakjp/edvorakjp_tap_dance.c
parent0031e461913d23e37a9aebd1da5daf1c93a149ee (diff)
Keymap: Refactor edvorakjp user library (#4480)
* Refactor edvorakjp user library * add tap dance support * update keymaps * edvorakjp: add SWAP_SCLN option * fix behavior of SWAP_SCLN
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 0000000000..62c0c100a2
--- /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
+ )
+};