aboutsummaryrefslogtreecommitdiffstats
path: root/keyboards/converter/usb_usb/keymaps/chriskopher/tap_dance.c
diff options
context:
space:
mode:
Diffstat (limited to 'keyboards/converter/usb_usb/keymaps/chriskopher/tap_dance.c')
-rw-r--r--keyboards/converter/usb_usb/keymaps/chriskopher/tap_dance.c164
1 files changed, 164 insertions, 0 deletions
diff --git a/keyboards/converter/usb_usb/keymaps/chriskopher/tap_dance.c b/keyboards/converter/usb_usb/keymaps/chriskopher/tap_dance.c
new file mode 100644
index 000000000..8600d8399
--- /dev/null
+++ b/keyboards/converter/usb_usb/keymaps/chriskopher/tap_dance.c
@@ -0,0 +1,164 @@
+/* Copyright 2020 Christopher Ko <chriskopher@gmail.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "shared_enum.h"
+
+#include "quantum.h"
+
+enum tap_dance_state {
+ SINGLE_HOLD = 1,
+ SINGLE_TAP,
+ DOUBLE_TAP,
+ TRIPLE_TAP,
+};
+
+// Record current state of a tap dance
+static int espc_l_tap_state = 0;
+static int espc_r_tap_state = 0;
+static int scln_cln_tap_state = 0;
+
+// Watch the state of the tap dance
+int cur_dance(qk_tap_dance_state_t *state) {
+ if (state->pressed) {
+ return SINGLE_HOLD;
+ }
+ if (state->count == 1) {
+ return SINGLE_TAP;
+ }
+ if (state->count == 2) {
+ return DOUBLE_TAP;
+ }
+ if (state->count == 3) {
+ return TRIPLE_TAP;
+ }
+
+ return -1;
+}
+
+// Extended Space Cadet Shift - Left ==================================
+void espc_l_finished(qk_tap_dance_state_t *state, void *user_data) {
+ espc_l_tap_state = cur_dance(state);
+ switch (espc_l_tap_state) {
+ case SINGLE_TAP: // (
+ register_code16(LSFT(KC_9));
+ break;
+ case DOUBLE_TAP: // {
+ unregister_code16(LSFT(KC_9));
+ register_code16(LSFT(KC_LBRC));
+ break;
+ case TRIPLE_TAP: // [
+ unregister_code16(LSFT(KC_LBRC));
+ register_code16(KC_LBRC);
+ break;
+ case SINGLE_HOLD: // LShift
+ register_code16(KC_LSFT);
+ break;
+ }
+}
+
+void espc_l_reset(qk_tap_dance_state_t *state, void *user_data) {
+ switch (espc_l_tap_state) {
+ case SINGLE_TAP: // (
+ unregister_code16(LSFT(KC_9));
+ break;
+ case DOUBLE_TAP: // {
+ unregister_code16(LSFT(KC_LBRC));
+ break;
+ case TRIPLE_TAP: // [
+ unregister_code16(KC_LBRC);
+ break;
+ case SINGLE_HOLD: // LShift
+ unregister_code16(KC_LSFT);
+ break;
+ }
+ espc_l_tap_state = 0;
+}
+// ====================================================================//
+
+// Extended Space Cadet Shift - Right ==================================
+void espc_r_finished(qk_tap_dance_state_t *state, void *user_data) {
+ espc_r_tap_state = cur_dance(state);
+ switch (espc_r_tap_state) {
+ case SINGLE_TAP: // )
+ register_code16(LSFT(KC_0));
+ break;
+ case DOUBLE_TAP: // }
+ unregister_code16(LSFT(KC_0));
+ register_code16(LSFT(KC_RBRC));
+ break;
+ case TRIPLE_TAP: // ]
+ unregister_code16(LSFT(KC_RBRC));
+ register_code16(KC_RBRC);
+ break;
+ case SINGLE_HOLD: // RShift
+ register_code16(KC_RSFT);
+ break;
+ }
+}
+
+void espc_r_reset(qk_tap_dance_state_t *state, void *user_data) {
+ switch (espc_r_tap_state) {
+ case SINGLE_TAP: // )
+ unregister_code16(LSFT(KC_0));
+ break;
+ case DOUBLE_TAP: // }
+ unregister_code16(LSFT(KC_RBRC));
+ break;
+ case TRIPLE_TAP: // ]
+ unregister_code16(KC_RBRC);
+ break;
+ case SINGLE_HOLD: // RShift
+ unregister_code16(KC_RSFT);
+ break;
+ }
+ espc_r_tap_state = 0;
+}
+// ====================================================================//
+
+// Semicolon - Colon ==================================================
+void scln_cln_finished(qk_tap_dance_state_t *state, void *user_data) {
+ scln_cln_tap_state = cur_dance(state);
+ switch (scln_cln_tap_state) {
+ case SINGLE_TAP: // ;
+ register_code16(KC_SCLN);
+ break;
+ default: // :
+ register_code16(LSFT(KC_SCLN));
+ break;
+ }
+}
+
+void scln_cln_reset(qk_tap_dance_state_t *state, void *user_data) {
+ switch (scln_cln_tap_state) {
+ case SINGLE_TAP: // ;
+ unregister_code16(KC_SCLN);
+ break;
+ default: // :
+ unregister_code16(LSFT(KC_SCLN));
+ break;
+ }
+}
+// ====================================================================//
+
+// Associate tap dance with defined functionality
+qk_tap_dance_action_t tap_dance_actions[] = {
+ // Extended space cadet shift left: Hold - Shift, One - (, Two - {, Three - [
+ [ESPC_L] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, espc_l_finished, espc_l_reset),
+ // Extended space cadet shift right: Hold - Shift, One - ), Two - }, Three - ]
+ [ESPC_R] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, espc_r_finished, espc_r_reset),
+ // Semicolon - Colon: One - ;, Two - :
+ [SCLN_CLN] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, scln_cln_finished, scln_cln_reset),
+};