aboutsummaryrefslogtreecommitdiff
path: root/waffle/tapping.c
diff options
context:
space:
mode:
Diffstat (limited to 'waffle/tapping.c')
-rw-r--r--waffle/tapping.c172
1 files changed, 172 insertions, 0 deletions
diff --git a/waffle/tapping.c b/waffle/tapping.c
new file mode 100644
index 0000000..7ef50df
--- /dev/null
+++ b/waffle/tapping.c
@@ -0,0 +1,172 @@
+// Copyright 2022 jack (@waffle87)
+// SPDX-License-Identifier: GPL-2.0-or-later
+#include "waffle.h"
+#include "secrets.h"
+#ifdef RANDWORD
+#include "users/ridingqwerty/dict.h"
+uint16_t word;
+#endif
+
+#define INTERCEPT_MOD_TAP(mod, keycode) \
+case mod(keycode): \
+ if (record->tap.count && record->event.pressed) { \
+ tap_code16(keycode); \
+ return false; \
+ } \
+ break; \
+
+uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ case LWRSPC:
+ case ESCLWR:
+ return TAPPING_TERM - 20;
+ case LINKS:
+ case PNP:
+ case TD(QUOT_DQUO):
+ case TD(EM_DASH):
+ case TD(CBRKT):
+ case TD(BRKT):
+ case TD(BSLS_PIPE):
+ return TAPPING_TERM + 60;
+ default:
+ return TAPPING_TERM;
+ }
+}
+
+void td_reset(qk_tap_dance_state_t *state, void *user_data) {
+ clear_keyboard();
+ layer_clear();
+}
+
+void qmk_dance(qk_tap_dance_state_t *state, void *user_data) {
+ if (state->count == 1) {
+ tap_code16(C(KC_T));
+ send_string(qmkstr);
+ tap_code(KC_ENT);
+ } else {
+ tap_code16(C(KC_T));
+ send_string(confstr);
+ tap_code(KC_ENT);
+ }
+}
+
+void dash_dance(qk_tap_dance_state_t *state, void *user_data) {
+ if (state->count == 1)
+ tap_code(KC_MINS);
+#ifdef UNICODE_COMMON_ENABLE
+ else
+ register_unicode(0x2014); //—
+#endif
+}
+
+void curly_bracket_dance(qk_tap_dance_state_t *state, void *user_data) {
+ if (state->count == 1)
+ tap_code16(KC_LCBR);
+ else
+ tap_code16(KC_RCBR);
+}
+
+void bracket_dance(qk_tap_dance_state_t *state, void *user_data) {
+ if (state->count == 1)
+ tap_code(KC_LBRC);
+ else
+ tap_code(KC_RBRC);
+}
+
+void bsls_pipe_dance(qk_tap_dance_state_t *state, void *user_data) {
+ if (state->count == 1)
+ tap_code(KC_BSLS);
+ else
+ tap_code16(KC_PIPE);
+}
+
+void quot_dquo_dance(qk_tap_dance_state_t *state, void *user_data) {
+ if (state->count == 1)
+ tap_code(KC_QUOT);
+ else
+ tap_code16(KC_DQUO);
+}
+
+void zero_dance(qk_tap_dance_state_t *state, void *user_data) {
+ if (state->count == 1)
+ tap_code(KC_0);
+#ifdef UNICODE_COMMON_ENABLE
+ else
+ register_unicode(0x00B0); //°
+#endif
+}
+
+void media_dance(qk_tap_dance_state_t *state, void *user_data) {
+ switch (state->count) {
+ case 1:
+ tap_code(KC_MPLY);
+ break;
+ case 2:
+ tap_code(KC_MNXT);
+ break;
+ case 3:
+ tap_code(KC_MPRV);
+ break;
+ }
+}
+
+void clipst_search_dance(qk_tap_dance_state_t *state, void *user_data) {
+ if (state->pressed && !state->interrupted)
+ layer_on(_RAISE);
+ else if (state->count == 1)
+ tap_code16(C(S(KC_V)));
+ else if (state->count == 2)
+ tap_code16(C(S(KC_F)));
+}
+
+qk_tap_dance_action_t tap_dance_actions[] = {
+ [QMK_LINKS] = ACTION_TAP_DANCE_FN(qmk_dance),
+ [EM_DASH] = ACTION_TAP_DANCE_FN(dash_dance),
+ [CBRKT] = ACTION_TAP_DANCE_FN(curly_bracket_dance),
+ [BRKT] = ACTION_TAP_DANCE_FN(bracket_dance),
+ [BSLS_PIPE] = ACTION_TAP_DANCE_FN(bsls_pipe_dance),
+ [QUOT_DQUO] = ACTION_TAP_DANCE_FN(quot_dquo_dance),
+ [DEG_0] = ACTION_TAP_DANCE_FN(zero_dance),
+ [PLY_NXT_PRV] = ACTION_TAP_DANCE_FN(media_dance),
+ [CLIPST_RAISE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, clipst_search_dance, td_reset)
+};
+
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ if (!(process_record_keymap(keycode, record)
+#ifdef UNICODE_COMMON_ENABLE
+ && process_record_unicode(keycode, record)
+#endif
+ && true))
+ return false;
+#ifdef OLED_ENABLE
+ if (record->event.pressed) {
+ oled_timer_reset();
+ add_keylog(keycode);
+ }
+#endif
+ switch (keycode) {
+ case UPDIR:
+ if (record->event.pressed)
+ SEND_STRING("../");
+ break;
+ INTERCEPT_MOD_TAP(LALT_T, KC_EXLM)
+ INTERCEPT_MOD_TAP(LGUI_T, KC_AT)
+ INTERCEPT_MOD_TAP(LCTL_T, KC_HASH)
+ INTERCEPT_MOD_TAP(LSFT_T, KC_DLR)
+ INTERCEPT_MOD_TAP(RSFT_T, KC_AMPR)
+ INTERCEPT_MOD_TAP(RCTL_T, KC_ASTR)
+ INTERCEPT_MOD_TAP(RGUI_T, KC_LPRN)
+ INTERCEPT_MOD_TAP(RALT_T, KC_RPRN)
+ case RWORD:
+#ifdef RANDWORD
+ word = rand() % NUMBER_OF_WORDS;
+ if (record->event.pressed) {
+ send_string(dict[word]);
+ tap_code(KC_SPC);
+ }
+#endif
+ break;
+ }
+ return process_record_keymap(keycode, record);
+}