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.

105 lines
3.2 KiB

  1. /* Copyright 2020 Guillaume Gérard
  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 "tap_dances.h"
  17. uint8_t cur_dance(qk_tap_dance_state_t *state) {
  18. if (state->count == 1) {
  19. if (state->interrupted || !state->pressed) return SINGLE_TAP;
  20. else return SINGLE_HOLD;
  21. } else if (state->count == 2) {
  22. if (state->interrupted) return DOUBLE_SINGLE_TAP;
  23. else if (state->pressed) return DOUBLE_HOLD;
  24. else return DOUBLE_TAP;
  25. }
  26. if (state->count == 3) {
  27. if (state->interrupted || !state->pressed) return TRIPLE_TAP;
  28. else return TRIPLE_HOLD;
  29. } else return 8;
  30. }
  31. static tap tap_state = {
  32. .is_press_action = true,
  33. .state = 0
  34. };
  35. #ifdef TAP_DANCE_LALT_GIT
  36. void lalt_finished(qk_tap_dance_state_t *state, void *user_data) {
  37. tap_state.state = cur_dance(state);
  38. switch (tap_state.state) {
  39. case SINGLE_HOLD:
  40. register_mods(MOD_BIT(KC_LALT));
  41. break;
  42. case DOUBLE_SINGLE_TAP:
  43. case DOUBLE_TAP:
  44. set_oneshot_layer(_GIT, ONESHOT_START);
  45. break;
  46. }
  47. }
  48. void lalt_reset(qk_tap_dance_state_t *state, void *user_data) {
  49. switch (tap_state.state) {
  50. case SINGLE_HOLD:
  51. unregister_mods(MOD_BIT(KC_LALT));
  52. break;
  53. case DOUBLE_SINGLE_TAP:
  54. case DOUBLE_TAP:
  55. clear_oneshot_layer_state(ONESHOT_PRESSED);
  56. break;
  57. }
  58. tap_state.state = 0;
  59. }
  60. #endif
  61. #ifdef TAP_DANCE_LSFT_CAPS
  62. # ifdef LAYERS_PROGRAMMER
  63. void pg_lsft_finished(qk_tap_dance_state_t *state, void *user_data) {
  64. tap_state.state = cur_dance(state);
  65. switch (tap_state.state) {
  66. case SINGLE_HOLD:
  67. register_mods(MOD_BIT(KC_LSFT));
  68. layer_on(_PROGRAMMER_SHIFTED);
  69. break;
  70. case DOUBLE_SINGLE_TAP:
  71. case DOUBLE_TAP:
  72. tap_code(KC_CAPS);
  73. layer_on(_PROGRAMMER_SHIFTED);
  74. break;
  75. }
  76. }
  77. void pg_lsft_reset(qk_tap_dance_state_t *state, void *user_data) {
  78. switch (tap_state.state) {
  79. case SINGLE_HOLD:
  80. unregister_mods(MOD_BIT(KC_LSFT));
  81. layer_off(_PROGRAMMER_SHIFTED);
  82. break;
  83. }
  84. tap_state.state = 0;
  85. }
  86. # endif
  87. #endif
  88. qk_tap_dance_action_t tap_dance_actions[] = {
  89. #ifdef TAP_DANCE_LALT_GIT
  90. [TD_LALT_GIT] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, lalt_finished, lalt_reset),
  91. #endif
  92. #ifdef TAP_DANCE_LSFT_CAPS
  93. [TD_LSFT_CAPS] = ACTION_TAP_DANCE_DOUBLE(KC_LSFT, KC_CAPS),
  94. # ifdef LAYERS_PROGRAMMER
  95. [TD_PG_LSFT_CAPS] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, pg_lsft_finished, pg_lsft_reset),
  96. # endif
  97. #endif
  98. };