tap_dance.c 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  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. volatile uint8_t gm_layer_act = false;
  19. static tap upltap_state = {.state = 0};
  20. static tap dwltap_state = {.state = 0};
  21. static tap lsprtap_state = {.state = 0};
  22. static tap ralttap_state = {.state = 0};
  23. void layer_switcher_tap(uint8_t new_layer) {
  24. if (gm_layer_act == true) {
  25. layer_off(active_layer);
  26. if (new_layer == _BL) {
  27. layer_on(_GM);
  28. active_layer = _GM;
  29. } else {
  30. layer_on(new_layer);
  31. active_layer = new_layer;
  32. }
  33. } else {
  34. layer_off(active_layer);
  35. layer_on(new_layer);
  36. active_layer = new_layer;
  37. }
  38. }
  39. int cur_dance(qk_tap_dance_state_t *state) {
  40. switch (state->count) {
  41. case 1:
  42. return state->pressed == 0 ? SINGLE_TAP : SINGLE_HOLD;
  43. case 2:
  44. return state->pressed == 0 ? DOUBLE_TAP : DOUBLE_HOLD;
  45. case 3:
  46. return state->pressed == 0 ? TRIPLE_TAP : TRIPLE_HOLD;
  47. default:
  48. return state->pressed == 0 ? DEFAULT_TAP : DEFAULT_HOLD;
  49. }
  50. }
  51. void dance_lctl_finished(qk_tap_dance_state_t *state, void *user_data) {
  52. rbw_led_keys[RBW_LCTL].status = ENABLED;
  53. register_code(KC_LCTL);
  54. };
  55. void dance_lctl_reset(qk_tap_dance_state_t *state, void *user_data) {
  56. unregister_code(KC_LCTL);
  57. rbw_led_keys[RBW_LCTL].status = DISABLED;
  58. };
  59. void dance_lspr_finished(qk_tap_dance_state_t *state, void *user_data) {
  60. lsprtap_state.state = cur_dance(state);
  61. switch (lsprtap_state.state) {
  62. case DOUBLE_HOLD:
  63. rbw_led_keys[RBW_LSPR].status = ENABLED;
  64. register_code(KC_LALT);
  65. break;
  66. default:
  67. register_code(KC_LGUI);
  68. break;
  69. }
  70. };
  71. void dance_lspr_reset(qk_tap_dance_state_t *state, void *user_data) {
  72. switch (lsprtap_state.state) {
  73. case DOUBLE_HOLD:
  74. unregister_code(KC_LALT);
  75. rbw_led_keys[RBW_LSPR].status = DISABLED;
  76. break;
  77. default:
  78. unregister_code(KC_LGUI);
  79. break;
  80. }
  81. };
  82. void dance_rctl_finished(qk_tap_dance_state_t *state, void *user_data) {
  83. rbw_led_keys[RBW_RCTL].status = ENABLED;
  84. register_code(KC_RCTL);
  85. };
  86. void dance_rctl_reset(qk_tap_dance_state_t *state, void *user_data) {
  87. unregister_code(KC_RCTL);
  88. rbw_led_keys[RBW_RCTL].status = DISABLED;
  89. };
  90. void dance_ralt_finished(qk_tap_dance_state_t *state, void *user_data) {
  91. ralttap_state.state = cur_dance(state);
  92. switch (ralttap_state.state) {
  93. case DOUBLE_HOLD:
  94. rbw_led_keys[RBW_RALT].status = ENABLED;
  95. unregister_code(KC_LGUI);
  96. break;
  97. default:
  98. register_code(KC_RALT);
  99. break;
  100. }
  101. };
  102. void dance_ralt_reset(qk_tap_dance_state_t *state, void *user_data) {
  103. switch (ralttap_state.state) {
  104. case DOUBLE_HOLD:
  105. unregister_code(KC_RGUI);
  106. rbw_led_keys[RBW_RALT].status = DISABLED;
  107. break;
  108. default:
  109. unregister_code(KC_RALT);
  110. break;
  111. }
  112. };
  113. void dance_uply_finished(qk_tap_dance_state_t *state, void *user_data) {
  114. upltap_state.state = cur_dance(state);
  115. switch (upltap_state.state) {
  116. case SINGLE_TAP:
  117. if (active_layer == _UL) {
  118. layer_switcher_tap(_BL);
  119. } else {
  120. layer_switcher_tap(_UL);
  121. }
  122. break;
  123. case SINGLE_HOLD:
  124. layer_switcher_tap(_UL);
  125. break;
  126. default:
  127. layer_switcher_tap(_BL);
  128. break;
  129. }
  130. }
  131. void dance_uply_reset(qk_tap_dance_state_t *state, void *user_data) {
  132. switch (upltap_state.state) {
  133. case SINGLE_TAP:
  134. break;
  135. case SINGLE_HOLD:
  136. default:
  137. layer_switcher_tap(_BL);
  138. break;
  139. }
  140. upltap_state.state = 0;
  141. }
  142. void dance_dwly_finished(qk_tap_dance_state_t *state, void *user_data) {
  143. dwltap_state.state = cur_dance(state);
  144. switch (dwltap_state.state) {
  145. case SINGLE_TAP:
  146. if (active_layer == _DL) {
  147. layer_switcher_tap(_BL);
  148. } else {
  149. layer_switcher_tap(_DL);
  150. }
  151. break;
  152. case SINGLE_HOLD:
  153. layer_switcher_tap(_DL);
  154. break;
  155. case DOUBLE_HOLD:
  156. layer_switcher_tap(_AL);
  157. break;
  158. case TRIPLE_TAP:
  159. if (gm_layer_act == true) {
  160. gm_layer_act = false;
  161. layer_switcher_tap(_BL);
  162. } else {
  163. gm_layer_act = true;
  164. layer_switcher_tap(_GM);
  165. }
  166. default:
  167. layer_switcher_tap(_BL);
  168. break;
  169. }
  170. }
  171. void dance_dwly_reset(qk_tap_dance_state_t *state, void *user_data) {
  172. switch (dwltap_state.state) {
  173. case SINGLE_TAP:
  174. break;
  175. case SINGLE_HOLD:
  176. case DOUBLE_HOLD:
  177. case TRIPLE_TAP:
  178. default:
  179. layer_switcher_tap(_BL);
  180. break;
  181. }
  182. dwltap_state.state = 0;
  183. }