You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

139 lines
4.6 KiB

  1. #include "tap_dance.h"
  2. //**************** Definitions needed for quad function to work *********************//
  3. #ifdef QUAD_DANCE
  4. int cur_dance(qk_tap_dance_state_t *state)
  5. {
  6. if (state->count == 1)
  7. {
  8. //If count = 1, and it has been interrupted - it doesn't matter if it is pressed or not: Send SINGLE_TAP
  9. if (state->interrupted || state->pressed == 0)
  10. return SINGLE_TAP;
  11. else
  12. return SINGLE_HOLD;
  13. }
  14. //If count = 2, and it has been interrupted - assume that user is trying to type the letter associated
  15. //with single tap. In example below, that means to send `xx` instead of `Escape`.
  16. else if (state->count == 2)
  17. {
  18. if (state->interrupted)
  19. return DOUBLE_SINGLE_TAP;
  20. else if (state->pressed)
  21. return DOUBLE_HOLD;
  22. else
  23. return DOUBLE_TAP;
  24. }
  25. else
  26. return 6; //magic number. At some point this method will expand to work for more presses
  27. };
  28. //**************** Definitions needed for quad function to work *********************//
  29. # endif
  30. // Slightly better tap dance double: interruption sends double single and any number over double sends the single that number of times
  31. void qk_tap_dance_pair_finished_safe(qk_tap_dance_state_t *state, void *user_data) {
  32. qk_tap_dance_pair_t *pair = (qk_tap_dance_pair_t *)user_data;
  33. int count = state->count;
  34. if (state->count == 2) {
  35. if (state->interrupted){
  36. tap_code16(pair->kc1);register_code16 (pair->kc1);
  37. state->count = 1; // Reset the counter as we are using the first key
  38. } else register_code16 (pair->kc2);
  39. return;
  40. }
  41. register_code16 (pair->kc1);
  42. while(--count){
  43. unregister_code16(pair->kc1);
  44. register_code16 (pair->kc1);
  45. }
  46. }
  47. void qk_tap_dance_pair_reset_safe(qk_tap_dance_state_t *state, void *user_data) {
  48. qk_tap_dance_pair_t *pair = (qk_tap_dance_pair_t *)user_data;
  49. if (state->count == 2) {
  50. unregister_code16 (pair->kc2);
  51. return;
  52. }
  53. unregister_code16(pair->kc1);
  54. }
  55. //**************** Tap dance functions *********************//
  56. qk_tap_dance_action_t tap_dance_actions[] = {
  57. [COPY_CUT] = ACTION_TAP_DANCE_FN(td_copy_cut),
  58. [PASTE_DANCE] = ACTION_TAP_DANCE_FN(td_paste),
  59. [_TD_F1] = ACTION_TAP_DANCE_DOUBLE(KC_1, KC_F1),
  60. [_TD_F2] = ACTION_TAP_DANCE_DOUBLE(KC_2, KC_F2),
  61. [_TD_F3] = ACTION_TAP_DANCE_DOUBLE(KC_3, KC_F3),
  62. [_TD_F4] = ACTION_TAP_DANCE_DOUBLE(KC_4, KC_F4),
  63. [_TD_F5] = ACTION_TAP_DANCE_DOUBLE(KC_5, KC_F5),
  64. [_TD_F6] = ACTION_TAP_DANCE_DOUBLE(KC_6, KC_F6),
  65. [_TD_F7] = ACTION_TAP_DANCE_DOUBLE(KC_7, KC_F7),
  66. [_TD_F8] = ACTION_TAP_DANCE_DOUBLE(KC_8, KC_F8),
  67. [_TD_F9] = ACTION_TAP_DANCE_DOUBLE(KC_9, KC_F9),
  68. [_TD_F10] = ACTION_TAP_DANCE_DOUBLE(KC_0, KC_F10),
  69. [_TD_F11] = ACTION_TAP_DANCE_DOUBLE(KC_MINS, KC_F11),
  70. [_TD_F12] = ACTION_TAP_DANCE_DOUBLE(KC_EQL, KC_F12),
  71. [_TD_H_ENTER] = ACTION_TAP_DANCE_DOUBLE(KC_H, KC_ENT),
  72. [_TD_CLN] = ACTION_TAP_DANCE_DOUBLE(KC_SCLN, KC_COLON),
  73. [_TD_SLASH] = ACTION_TAP_DANCE_DOUBLE(KC_SLASH, KC_BSLASH),
  74. // OLD ONES
  75. [LEFT_HOME] = ACTION_TAP_DANCE_DOUBLE(KC_LEFT, KC_HOME),
  76. [RGT_HOME] = ACTION_TAP_DANCE_DOUBLE_SAFE(KC_RGHT, KC_END),
  77. [J_ENT] = ACTION_TAP_DANCE_DOUBLE_SAFE(KC_J,KC_ENT),
  78. [H_MINS] = ACTION_TAP_DANCE_DOUBLE_SAFE(KC_H,KC_SLASH),
  79. [_TD_COPY] = ACTION_TAP_DANCE_FN(dance_copy),
  80. [_TD_CUT] = ACTION_TAP_DANCE_FN(dance_cut),
  81. [_TD_PASTE] = ACTION_TAP_DANCE_FN(dance_paste)
  82. };
  83. void td_copy_cut(qk_tap_dance_state_t *state, void *user_data)
  84. {
  85. if (state->count == 2)
  86. {
  87. onMac ? SEND_STRING(SS_LGUI("x")) : SEND_STRING(SS_LCTRL("x"));
  88. }
  89. else
  90. {
  91. onMac ? SEND_STRING(SS_LGUI("c")) : SEND_STRING(SS_LCTRL("c"));
  92. }
  93. reset_tap_dance(state);
  94. };
  95. void td_paste(qk_tap_dance_state_t *state, void *user_data)
  96. {
  97. if (state->count == 2)
  98. {
  99. onMac ? SEND_STRING(SS_DOWN(X_RSHIFT) SS_LGUI("v") SS_UP(X_RSHIFT)) : SEND_STRING(SS_DOWN(X_RSHIFT) SS_LCTRL("v") SS_UP(X_RSHIFT));
  100. }
  101. else
  102. {
  103. onMac ? SEND_STRING(SS_LGUI("v")) : SEND_STRING(SS_LCTRL("v"));
  104. }
  105. reset_tap_dance(state);
  106. };
  107. //===== The awesome tap dance for CUT, COPY and PASTE letters
  108. void dance_copy (qk_tap_dance_state_t *state, void *user_data) {
  109. if (state->count == 1) { tap_code16(KC_C); }
  110. else
  111. if (state->interrupted) { tap_code16(KC_C);tap_code16(KC_C);}
  112. else CMD(KC_C);
  113. reset_tap_dance (state);
  114. }
  115. void dance_cut (qk_tap_dance_state_t *state, void *user_data) {
  116. if (state->count == 1) { tap_code16(KC_X); }
  117. else { CMD(KC_X); }
  118. reset_tap_dance (state);
  119. }
  120. void dance_paste (qk_tap_dance_state_t *state, void *user_data) {
  121. if (state->count == 1) {
  122. tap_code16(KC_V);
  123. }
  124. else {
  125. CMD(KC_V);
  126. }
  127. reset_tap_dance (state);
  128. }