tap_dance.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. #include "tap_dance.h"
  2. #include "lights.h"
  3. qk_tap_dance_action_t tap_dance_actions[] = {
  4. [DA_LCTL] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_lctl_finished,
  5. dance_lctl_reset),
  6. [DA_LSPR] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_lspr_finished,
  7. dance_lspr_reset),
  8. [DA_RCTL] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_rctl_finished,
  9. dance_rctl_reset),
  10. [DA_RALT] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_ralt_finished,
  11. dance_ralt_reset),
  12. [DA_UPLY] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_uply_finished,
  13. dance_uply_reset),
  14. [DA_DWLY] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_dwly_finished,
  15. dance_dwly_reset),
  16. };
  17. volatile uint8_t active_layer = _BL;
  18. static tap upltap_state = {.state = 0};
  19. static tap dwltap_state = {.state = 0};
  20. static tap lsprtap_state = {.state = 0};
  21. static tap ralttap_state = {.state = 0};
  22. void layer_switcher_tap(uint8_t new_layer) {
  23. layer_off(active_layer);
  24. layer_on(new_layer);
  25. active_layer = new_layer;
  26. }
  27. int cur_dance(qk_tap_dance_state_t *state) {
  28. switch (state->count) {
  29. case 1:
  30. return state->pressed == 0 ? SINGLE_TAP : SINGLE_HOLD;
  31. case 2:
  32. return state->pressed == 0 ? DOUBLE_TAP : DOUBLE_HOLD;
  33. case 3:
  34. return state->pressed == 0 ? TRIPLE_TAP : TRIPLE_HOLD;
  35. default:
  36. return state->pressed == 0 ? DEFAULT_TAP : DEFAULT_HOLD;
  37. }
  38. }
  39. void dance_lctl_finished(qk_tap_dance_state_t *state, void *user_data) {
  40. rbw_led_keys[RBW_LCTL].status = ENABLED;
  41. register_code(KC_LCTRL);
  42. };
  43. void dance_lctl_reset(qk_tap_dance_state_t *state, void *user_data) {
  44. unregister_code(KC_LCTRL);
  45. rbw_led_keys[RBW_LCTL].status = DISABLED;
  46. };
  47. void dance_lspr_finished(qk_tap_dance_state_t *state, void *user_data) {
  48. lsprtap_state.state = cur_dance(state);
  49. switch (lsprtap_state.state) {
  50. case DOUBLE_HOLD:
  51. rbw_led_keys[RBW_LSPR].status = ENABLED;
  52. register_code(KC_LALT);
  53. break;
  54. default:
  55. register_code(KC_LGUI);
  56. break;
  57. }
  58. };
  59. void dance_lspr_reset(qk_tap_dance_state_t *state, void *user_data) {
  60. switch (lsprtap_state.state) {
  61. case DOUBLE_HOLD:
  62. unregister_code(KC_LALT);
  63. rbw_led_keys[RBW_LSPR].status = DISABLED;
  64. break;
  65. default:
  66. unregister_code(KC_LGUI);
  67. break;
  68. }
  69. };
  70. void dance_rctl_finished(qk_tap_dance_state_t *state, void *user_data) {
  71. rbw_led_keys[RBW_RCTL].status = ENABLED;
  72. register_code(KC_RCTRL);
  73. };
  74. void dance_rctl_reset(qk_tap_dance_state_t *state, void *user_data) {
  75. unregister_code(KC_RCTRL);
  76. rbw_led_keys[RBW_RCTL].status = DISABLED;
  77. };
  78. void dance_ralt_finished(qk_tap_dance_state_t *state, void *user_data) {
  79. ralttap_state.state = cur_dance(state);
  80. switch (ralttap_state.state) {
  81. case DOUBLE_HOLD:
  82. rbw_led_keys[RBW_RALT].status = ENABLED;
  83. unregister_code(KC_LGUI);
  84. break;
  85. default:
  86. register_code(KC_RALT);
  87. break;
  88. }
  89. };
  90. void dance_ralt_reset(qk_tap_dance_state_t *state, void *user_data) {
  91. switch (ralttap_state.state) {
  92. case DOUBLE_HOLD:
  93. unregister_code(KC_RGUI);
  94. rbw_led_keys[RBW_RALT].status = DISABLED;
  95. break;
  96. default:
  97. unregister_code(KC_RALT);
  98. break;
  99. }
  100. };
  101. void dance_uply_finished(qk_tap_dance_state_t *state, void *user_data) {
  102. upltap_state.state = cur_dance(state);
  103. switch (upltap_state.state) {
  104. case SINGLE_TAP:
  105. if (active_layer == _UL) {
  106. layer_switcher_tap(_BL);
  107. } else {
  108. layer_switcher_tap(_UL);
  109. }
  110. break;
  111. case SINGLE_HOLD:
  112. layer_switcher_tap(_UL);
  113. break;
  114. default:
  115. layer_switcher_tap(_BL);
  116. break;
  117. }
  118. }
  119. void dance_uply_reset(qk_tap_dance_state_t *state, void *user_data) {
  120. switch (upltap_state.state) {
  121. case SINGLE_TAP:
  122. break;
  123. case SINGLE_HOLD:
  124. default:
  125. layer_switcher_tap(_BL);
  126. break;
  127. }
  128. upltap_state.state = 0;
  129. }
  130. void dance_dwly_finished(qk_tap_dance_state_t *state, void *user_data) {
  131. dwltap_state.state = cur_dance(state);
  132. switch (dwltap_state.state) {
  133. case SINGLE_TAP:
  134. if (active_layer == _DL) {
  135. layer_switcher_tap(_BL);
  136. } else {
  137. layer_switcher_tap(_DL);
  138. }
  139. break;
  140. case SINGLE_HOLD:
  141. layer_switcher_tap(_DL);
  142. break;
  143. case DOUBLE_HOLD:
  144. layer_switcher_tap(_AL);
  145. break;
  146. default:
  147. layer_switcher_tap(_BL);
  148. break;
  149. }
  150. }
  151. void dance_dwly_reset(qk_tap_dance_state_t *state, void *user_data) {
  152. switch (dwltap_state.state) {
  153. case SINGLE_TAP:
  154. break;
  155. case SINGLE_HOLD:
  156. case DOUBLE_HOLD:
  157. default:
  158. layer_switcher_tap(_BL);
  159. break;
  160. }
  161. dwltap_state.state = 0;
  162. }