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.

264 lines
8.3 KiB

  1. //Tap Dance Settings
  2. #include "wanleg.h"
  3. //audio settings for one of the tap dances below
  4. #ifdef AUDIO_ENABLE
  5. float lyrup_song[][2] = SONG(MUSIC_ON_SOUND);
  6. float lyrdown_song[][2] = SONG(MUSIC_OFF_SOUND);
  7. #endif
  8. ///// QUAD FUNCTION TAP DANCE GENERAL SETUP SECTION START /////
  9. ///// (no need to edit this section) /////
  10. //Enums used to clearly convey the state of the tap dance
  11. enum {
  12. SINGLE_TAP = 1,
  13. SINGLE_HOLD = 2,
  14. DOUBLE_TAP = 3,
  15. DOUBLE_HOLD = 4,
  16. DOUBLE_SINGLE_TAP = 5, //send SINGLE_TAP twice - NOT DOUBLE_TAP
  17. TRIPLE_TAP = 6,
  18. TRIPLE_HOLD = 7,
  19. TRIPLE_SINGLE_TAP = 8
  20. // Add more enums here if you want for triple, quadruple, etc.
  21. };
  22. typedef struct {
  23. bool is_press_action;
  24. int state;
  25. } tap;
  26. int cur_dance (qk_tap_dance_state_t *state) {
  27. if (state->count == 1) {
  28. //If count = 1, and it has been interrupted - it doesn't matter if it is pressed or not: Send SINGLE_TAP
  29. if (state->interrupted || !state->pressed) return SINGLE_TAP;
  30. if (state->interrupted) return SINGLE_TAP;
  31. else return SINGLE_HOLD;
  32. }
  33. //If count = 2, and it has been interrupted - assume that user is trying to type the letter associated
  34. //with single tap.
  35. else if (state->count == 2) {
  36. if (state->interrupted) return DOUBLE_SINGLE_TAP;
  37. else if (state->pressed) return DOUBLE_HOLD;
  38. else return DOUBLE_TAP;
  39. }
  40. //If count = 3, and it has been interrupted - assume that user is trying to type the letter associated
  41. //with double tap.
  42. else if (state->count == 3) {
  43. if (state->interrupted) return TRIPLE_SINGLE_TAP;
  44. else if (state->pressed) return TRIPLE_HOLD;
  45. else return TRIPLE_TAP;
  46. }
  47. else return 9; //magic number. At some point this method will expand to work for more presses
  48. }
  49. ///// QUAD FUNCTION TAP DANCE GENERAL SETUP SECTION END /////
  50. ///// QUAD FUNCTION TAP DANCE PERSONALIZATION SECTION START /////
  51. //instantiate 'tap' for the 'CAD' tap dance.
  52. static tap CADtap_state = {
  53. .is_press_action = true,
  54. .state = 0
  55. };
  56. void CAD_finished (qk_tap_dance_state_t *state, void *user_data) {
  57. CADtap_state.state = cur_dance(state);
  58. switch (CADtap_state.state) {
  59. case SINGLE_TAP:
  60. //register_code(KC_SPC);
  61. SEND_STRING(SS_LGUI("l"));
  62. #ifdef BACKLIGHT_ENABLE
  63. backlight_level(3);
  64. #endif
  65. break;
  66. case SINGLE_HOLD:
  67. //register_code(KC_NO);
  68. //take a screenshot of a single window, open Paint and paste
  69. SEND_STRING(SS_LALT(SS_TAP(X_PSCREEN)) SS_LGUI("r"));
  70. wait_ms(500);
  71. SEND_STRING("mspaint" SS_TAP(X_ENTER));
  72. wait_ms(700);
  73. SEND_STRING(SS_LCTRL("v"));
  74. break; //register this keycode when button is held
  75. case DOUBLE_TAP:
  76. //register_code(KC_ENT);
  77. SEND_STRING(SS_LCTRL(SS_LALT(SS_TAP(X_DELETE))));
  78. #ifdef BACKLIGHT_ENABLE
  79. backlight_level(0);
  80. #endif
  81. break;
  82. //case DOUBLE_HOLD: register_code(KC_NO); break; //register this keycode when button is tapped and then held
  83. case DOUBLE_HOLD:
  84. reset_keyboard();
  85. break; //register this keycode when button is tapped and then held
  86. case TRIPLE_TAP:
  87. SEND_STRING("wanleg@github.com");
  88. break;
  89. case TRIPLE_HOLD:
  90. set_single_persistent_default_layer(1);
  91. #ifdef AUDIO_ENABLE
  92. stop_all_notes();
  93. PLAY_SONG(lyrup_song);
  94. #endif
  95. break;
  96. }
  97. }
  98. void CAD_reset (qk_tap_dance_state_t *state, void *user_data) {
  99. switch (CADtap_state.state) {
  100. //nothing to do
  101. }
  102. CADtap_state.state = 0;
  103. }
  104. //instantiate 'tap' for the 'RST' tap dance.
  105. static tap RSTtap_state = {
  106. .is_press_action = true,
  107. .state = 0
  108. };
  109. void RST_finished (qk_tap_dance_state_t *state, void *user_data) {
  110. RSTtap_state.state = cur_dance(state);
  111. switch (RSTtap_state.state) {
  112. case SINGLE_TAP: register_code(KC_LCTL); break;
  113. case SINGLE_HOLD: register_code(KC_LCTL); break;
  114. case DOUBLE_TAP: reset_keyboard(); break;
  115. case DOUBLE_SINGLE_TAP: register_code(KC_LCTL); unregister_code(KC_LCTL); register_code(KC_LCTL); break;
  116. }
  117. }
  118. void RST_reset (qk_tap_dance_state_t *state, void *user_data) {
  119. switch (RSTtap_state.state) {
  120. case SINGLE_TAP: unregister_code(KC_LCTL); break;
  121. case SINGLE_HOLD: unregister_code(KC_LCTL); break;
  122. case DOUBLE_SINGLE_TAP: unregister_code(KC_LCTL); break;
  123. }
  124. RSTtap_state.state = 0;
  125. }
  126. //instantiate 'tap' for the 'LYR' tap dance.
  127. static tap LYRtap_state = {
  128. .is_press_action = true,
  129. .state = 0
  130. };
  131. void LYR_finished (qk_tap_dance_state_t *state, void *user_data) {
  132. LYRtap_state.state = cur_dance(state);
  133. switch (LYRtap_state.state) {
  134. case SINGLE_TAP: register_code(KC_PSLS); break;
  135. case DOUBLE_TAP: set_single_persistent_default_layer(_GK); break;
  136. case DOUBLE_SINGLE_TAP: register_code(KC_PSLS); unregister_code(KC_PSLS); register_code(KC_PSLS);
  137. }
  138. }
  139. void LYR_reset (qk_tap_dance_state_t *state, void *user_data) {
  140. switch (LYRtap_state.state) {
  141. case SINGLE_TAP: unregister_code(KC_PSLS); break;
  142. case DOUBLE_TAP: set_single_persistent_default_layer(_GK); break;
  143. case DOUBLE_SINGLE_TAP: unregister_code(KC_PSLS);
  144. }
  145. LYRtap_state.state = 0;
  146. }
  147. //instantiate 'tap' for the 'LYR75' tap dance.
  148. static tap LYR75tap_state = {
  149. .is_press_action = true,
  150. .state = 0
  151. };
  152. void LYR75_finished (qk_tap_dance_state_t *state, void *user_data) {
  153. LYR75tap_state.state = cur_dance(state);
  154. switch (LYR75tap_state.state) {
  155. case SINGLE_TAP: register_code(KC_PSLS); break;
  156. case DOUBLE_TAP: set_single_persistent_default_layer(_GK); break;
  157. case DOUBLE_SINGLE_TAP: register_code(KC_PSLS); unregister_code(KC_PSLS); register_code(KC_PSLS);
  158. }
  159. }
  160. void LYR75_reset (qk_tap_dance_state_t *state, void *user_data) {
  161. switch (LYR75tap_state.state) {
  162. case SINGLE_TAP: unregister_code(KC_PSLS); break;
  163. case DOUBLE_TAP: set_single_persistent_default_layer(_GK); break;
  164. case DOUBLE_SINGLE_TAP: unregister_code(KC_PSLS);
  165. }
  166. LYR75tap_state.state = 0;
  167. }
  168. //instantiate 'tap' for the 'LYR50' tap dance.
  169. static tap LYR50tap_state = {
  170. .is_press_action = true,
  171. .state = 0
  172. };
  173. void LYR50_finished (qk_tap_dance_state_t *state, void *user_data) {
  174. LYR50tap_state.state = cur_dance(state);
  175. switch (LYR75tap_state.state) {
  176. case SINGLE_TAP: register_code(KC_PSLS); break;
  177. case DOUBLE_TAP: set_single_persistent_default_layer(GK50); break;
  178. case DOUBLE_SINGLE_TAP: register_code(KC_PSLS); unregister_code(KC_PSLS); register_code(KC_PSLS);
  179. }
  180. }
  181. void LYR50_reset (qk_tap_dance_state_t *state, void *user_data) {
  182. switch (LYR50tap_state.state) {
  183. case SINGLE_TAP: unregister_code(KC_PSLS); break;
  184. case DOUBLE_TAP: set_single_persistent_default_layer(GK50); break;
  185. case DOUBLE_SINGLE_TAP: unregister_code(KC_PSLS);
  186. }
  187. LYR50tap_state.state = 0;
  188. }
  189. //instantiate 'tap' for the 'BSW' tap dance.
  190. static tap BSWtap_state = {
  191. .is_press_action = true,
  192. .state = 0
  193. };
  194. void BSW_finished (qk_tap_dance_state_t *state, void *user_data) {
  195. BSWtap_state.state = cur_dance(state);
  196. switch (BSWtap_state.state) {
  197. case SINGLE_TAP: register_code(KC_ENTER); break;
  198. case SINGLE_HOLD:
  199. set_single_persistent_default_layer(0);
  200. #ifdef AUDIO_ENABLE
  201. stop_all_notes();
  202. PLAY_SONG(lyrdown_song);
  203. #endif
  204. break;
  205. case DOUBLE_TAP:
  206. register_code(KC_LCTRL);
  207. register_code(KC_C);
  208. break;
  209. case DOUBLE_HOLD:
  210. reset_keyboard();
  211. break; //register this keycode when button is tapped and then held
  212. }
  213. }
  214. void BSW_reset (qk_tap_dance_state_t *state, void *user_data) {
  215. switch (BSWtap_state.state) {
  216. case SINGLE_TAP: unregister_code(KC_ENTER); break;
  217. case DOUBLE_TAP:
  218. unregister_code(KC_LCTRL);
  219. unregister_code(KC_C);
  220. break;
  221. }
  222. BSWtap_state.state = 0;
  223. }
  224. ///// QUAD FUNCTION TAP DANCE PERSONALIZATION SECTION END /////
  225. //Tap Dance Definitions
  226. //THIS SECTION HAS TO BE AT THE END OF THE TAP DANCE SECTION
  227. qk_tap_dance_action_t tap_dance_actions[] = {
  228. [TD_SFT_CAPS] = ACTION_TAP_DANCE_DOUBLE(KC_LSFT, KC_CAPS)
  229. // Other declarations would go here, separated by commas, if you have them
  230. ,[TD_Q_ESC] = ACTION_TAP_DANCE_DOUBLE(KC_Q, KC_ESC)
  231. ,[RST_TAP_DANCE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, RST_finished, RST_reset)
  232. ,[CAD_TD] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, CAD_finished, CAD_reset)
  233. ,[LYR_TAP_DANCE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, LYR_finished, LYR_reset)
  234. ,[LYR75_TAP_DANCE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, LYR75_finished, LYR75_reset)
  235. ,[LYR50_TAP_DANCE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, LYR50_finished, LYR50_reset)
  236. ,[BSW_TAP_DANCE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, BSW_finished, BSW_reset)
  237. };
  238. //In Layer declaration, add tap dance item in place of a key code
  239. //TD(TD_SFT_CAPS)