logo

qmk_firmware

custom branch of QMK firmware git clone https://anongit.hacktivis.me/git/qmk_firmware.git

tap_dances.c (4019B)


  1. /* Copyright 2024 Vaarai
  2. *
  3. * This program is free software: you can redistribute it and/or modify
  4. * it under the terms of the GNU General Public License as published by
  5. * the Free Software Foundation, either version 2 of the License, or
  6. * (at your option) any later version.
  7. *
  8. * This program is distributed in the hope that it will be useful,
  9. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. * GNU General Public License for more details.
  12. *
  13. * You should have received a copy of the GNU General Public License
  14. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  15. */
  16. #include QMK_KEYBOARD_H
  17. #include "./tap_dances.h"
  18. #include "./keymap.h"
  19. /* define a type containing as many tapdance states as you need */
  20. typedef enum {
  21. SINGLE_TAP,
  22. SINGLE_HOLD,
  23. DOUBLE_TAP,
  24. DOUBLE_HOLD,
  25. OTHER_TAP
  26. } td_state_t;
  27. /* Create a global instance of the tapdance state type */
  28. static td_state_t td_state;
  29. accent_state_t accent_state = ACCENT_NONE;
  30. tap_dance_action_t tap_dance_actions[TAP_DANCE_ACTIONS_COUNT] = {
  31. [TD_SFT_CAPSW] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_shift_capsword_finished, dance_shift_capsword_reset),
  32. [TD_NAV_ACCENT] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_nav_accent_finished, dance_nav_accent_reset),
  33. [TD_NUM_ACCENT] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_num_accent_finished, dance_num_accent_reset)
  34. };
  35. int cur_dance (tap_dance_state_t *state) {
  36. if (state->count == 1) {
  37. if (state->interrupted || !state->pressed)
  38. {
  39. return SINGLE_TAP;
  40. } else {
  41. return SINGLE_HOLD;
  42. }
  43. }
  44. if (state->count == 2)
  45. {
  46. if (state->interrupted || !state->pressed)
  47. {
  48. return DOUBLE_TAP;
  49. } else {
  50. return DOUBLE_HOLD;
  51. }
  52. } else {
  53. return OTHER_TAP;
  54. }
  55. }
  56. void dance_shift_capsword_finished (tap_dance_state_t *state, void *user_data)
  57. {
  58. td_state = cur_dance(state);
  59. switch (td_state) {
  60. case SINGLE_TAP:
  61. case SINGLE_HOLD:
  62. register_code(KC_LSFT);
  63. break;
  64. case DOUBLE_TAP:
  65. case DOUBLE_HOLD:
  66. caps_word_on();
  67. break;
  68. case OTHER_TAP:
  69. break;
  70. }
  71. }
  72. void dance_shift_capsword_reset (tap_dance_state_t *state, void *user_data)
  73. {
  74. switch (td_state) {
  75. case SINGLE_TAP:
  76. case SINGLE_HOLD:
  77. unregister_code(KC_LSFT);
  78. break;
  79. case DOUBLE_TAP:
  80. case DOUBLE_HOLD:
  81. case OTHER_TAP:
  82. break;
  83. }
  84. }
  85. void dance_nav_accent_finished (tap_dance_state_t *state, void *user_data)
  86. {
  87. td_state = cur_dance(state);
  88. switch (td_state) {
  89. case SINGLE_TAP:
  90. case SINGLE_HOLD:
  91. layer_on(_NAV);
  92. break;
  93. case DOUBLE_TAP:
  94. case DOUBLE_HOLD:
  95. accent_state = ACCENT_LEFT;
  96. break;
  97. case OTHER_TAP:
  98. break;
  99. }
  100. }
  101. void dance_nav_accent_reset (tap_dance_state_t *state, void *user_data)
  102. {
  103. switch (td_state) {
  104. case SINGLE_TAP:
  105. case SINGLE_HOLD:
  106. layer_off(_NAV);
  107. break;
  108. case DOUBLE_TAP:
  109. case DOUBLE_HOLD:
  110. case OTHER_TAP:
  111. break;
  112. }
  113. }
  114. void dance_num_accent_finished (tap_dance_state_t *state, void *user_data)
  115. {
  116. td_state = cur_dance(state);
  117. switch (td_state) {
  118. case SINGLE_TAP:
  119. case SINGLE_HOLD:
  120. layer_on(_NUM);
  121. break;
  122. case DOUBLE_TAP:
  123. case DOUBLE_HOLD:
  124. accent_state = ACCENT_RIGHT;
  125. break;
  126. case OTHER_TAP:
  127. break;
  128. }
  129. }
  130. void dance_num_accent_reset (tap_dance_state_t *state, void *user_data)
  131. {
  132. switch (td_state) {
  133. case SINGLE_TAP:
  134. case SINGLE_HOLD:
  135. layer_off(_NUM);
  136. break;
  137. case DOUBLE_TAP:
  138. case DOUBLE_HOLD:
  139. case OTHER_TAP:
  140. break;
  141. }
  142. }