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.

146 lines
4.3 KiB

  1. //Tap Dance
  2. #include "talljoe.h"
  3. enum {
  4. SINGLE_TAP = 1,
  5. SINGLE_HOLD = 2,
  6. DOUBLE_TAP = 3,
  7. DOUBLE_HOLD = 4,
  8. DOUBLE_SINGLE_TAP = 5, //send two single taps
  9. TRIPLE_TAP = 6,
  10. TRIPLE_HOLD = 7,
  11. SPECIAL = 8
  12. };
  13. static struct {
  14. int quote;
  15. int semicolon;
  16. } tap_state = {0};
  17. int cur_dance (qk_tap_dance_state_t *state) {
  18. if (state->count == 1) {
  19. //If count = 1, and it has been interrupted - it doesn't matter if it is pressed or not: Send SINGLE_TAP
  20. if (state->interrupted) {
  21. // if (!state->pressed) return SINGLE_TAP;
  22. //need "permissive hold" here.
  23. // else return SINGLE_HOLD;
  24. //If the interrupting key is released before the tap-dance key, then it is a single HOLD
  25. //However, if the tap-dance key is released first, then it is a single TAP
  26. //But how to get access to the state of the interrupting key????
  27. return SINGLE_TAP;
  28. }
  29. else {
  30. if (!state->pressed) return SINGLE_TAP;
  31. else return SINGLE_HOLD;
  32. }
  33. }
  34. //If count = 2, and it has been interrupted - assume that user is trying to type the letter associated
  35. //with single tap.
  36. else if (state->count == 2) {
  37. if (state->interrupted) return DOUBLE_SINGLE_TAP;
  38. else if (state->pressed) return DOUBLE_HOLD;
  39. else return DOUBLE_TAP;
  40. }
  41. else if ((state->count == 3) && ((state->interrupted) || (!state->pressed))) return TRIPLE_TAP;
  42. else if (state->count == 3) return TRIPLE_HOLD;
  43. else return SPECIAL;
  44. }
  45. int hold_cur_dance (qk_tap_dance_state_t *state) {
  46. if (state->count == 1) {
  47. if (state->interrupted) {
  48. if (!state->pressed) return SINGLE_TAP;
  49. else return SINGLE_HOLD;
  50. }
  51. else {
  52. if (!state->pressed) return SINGLE_TAP;
  53. else return SINGLE_HOLD;
  54. }
  55. }
  56. //If count = 2, and it has been interrupted - assume that user is trying to type the letter associated
  57. //with single tap.
  58. else if (state->count == 2) {
  59. if (state->pressed) return DOUBLE_HOLD;
  60. else return DOUBLE_TAP;
  61. }
  62. else if (state->count == 3) {
  63. if (!state->pressed) return TRIPLE_TAP;
  64. else return TRIPLE_HOLD;
  65. }
  66. else return SPECIAL;
  67. }
  68. // Send semi-colon + enter on two taps
  69. void tap_dance_semicolon_finished(qk_tap_dance_state_t *state, void *user_data) {
  70. tap_state.semicolon = hold_cur_dance(state);
  71. switch (tap_state.semicolon) {
  72. case SINGLE_TAP: case DOUBLE_HOLD: register_code(KC_SCLN); break;
  73. case SINGLE_HOLD: layer_on(_NUM); break;
  74. }
  75. }
  76. void tap_dance_semicolon_reset(qk_tap_dance_state_t *state, void *user_data) {
  77. switch (tap_state.semicolon) {
  78. case SINGLE_TAP: case DOUBLE_HOLD: unregister_code(KC_SCLN); break;
  79. case DOUBLE_TAP: {
  80. if (get_mods()) {
  81. SEND_STRING(";;"); // send normal when mods are pressed
  82. }
  83. else {
  84. SEND_STRING(";\n");
  85. }
  86. break;
  87. }
  88. case TRIPLE_TAP: {
  89. SEND_STRING(";\n\n");
  90. }
  91. case SPECIAL: layer_invert(_NUM); break;
  92. case SINGLE_HOLD: layer_off(_NUM); break;
  93. }
  94. tap_state.semicolon = 0;
  95. }
  96. // Send `. ~. ```
  97. void tap_dance_grave_finished(qk_tap_dance_state_t *state, void *user_data) {
  98. switch(state->count) {
  99. case 1:
  100. SEND_STRING("`");
  101. break;
  102. case 2:
  103. SEND_STRING("~");
  104. break;
  105. }
  106. }
  107. void tap_dance_grave_each(qk_tap_dance_state_t *state, void *user_data) {
  108. if(state->count == 3) {
  109. SEND_STRING("```");
  110. } else if (state->count > 3) {
  111. SEND_STRING("`");
  112. }
  113. }
  114. void tap_dance_quote_finished(qk_tap_dance_state_t *state, void *user_data) {
  115. tap_state.quote = hold_cur_dance(state);
  116. switch (tap_state.quote) {
  117. case SINGLE_TAP: case DOUBLE_HOLD: register_code(KC_QUOT); break;
  118. case SINGLE_HOLD: layer_on(_NAV); break;
  119. }
  120. }
  121. void tap_dance_quote_reset(qk_tap_dance_state_t *state, void *user_data) {
  122. switch (tap_state.quote) {
  123. case SINGLE_TAP: case DOUBLE_HOLD: unregister_code(KC_QUOTE); break;
  124. case DOUBLE_TAP: SEND_STRING("\""); break;
  125. case TRIPLE_TAP: layer_invert(_NAV); break;
  126. case SINGLE_HOLD: layer_off(_NAV); break;
  127. }
  128. tap_state.quote = 0;
  129. }
  130. qk_tap_dance_action_t tap_dance_actions[] = {
  131. [TD_SEMICOLON] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, tap_dance_semicolon_finished, tap_dance_semicolon_reset),
  132. [TD_GRAVE] = ACTION_TAP_DANCE_FN_ADVANCED(tap_dance_grave_each, tap_dance_grave_finished, NULL),
  133. [TD_QUOTE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, tap_dance_quote_finished, tap_dance_quote_reset),
  134. };