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.

91 lines
3.0 KiB

  1. /* Copyright 2020 Brandon Schlack
  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. #include "process_keycode/process_tap_dance.h"
  18. int cur_dance (qk_tap_dance_state_t *state) {
  19. if (state->count == 1) {
  20. if (state->interrupted || !state->pressed) return SINGLE_TAP;
  21. else return SINGLE_HOLD;
  22. } else if (state->count == 2) {
  23. if (state->interrupted) return DOUBLE_SINGLE_TAP;
  24. else if (state->pressed) return DOUBLE_HOLD;
  25. else return DOUBLE_TAP;
  26. }
  27. if (state->count == 3) {
  28. if (state->interrupted || !state->pressed) return TRIPLE_TAP;
  29. else return TRIPLE_HOLD;
  30. }
  31. else return 8;
  32. }
  33. __attribute__ ((weak))
  34. void process_tap_dance_keycode (bool reset, uint8_t toggle_layer) { };
  35. void td_trigger_layer_finished (qk_tap_dance_state_t *state, void *user_data) {
  36. qk_tap_dance_trigger_layer_t *data = (qk_tap_dance_trigger_layer_t *)user_data;
  37. data->state = cur_dance(state);
  38. if (data->state == data->trigger) {
  39. layer_on(data->layer);
  40. } else {
  41. process_tap_dance_keycode(false, data->layer);
  42. }
  43. }
  44. void td_trigger_layer_reset (qk_tap_dance_state_t *state, void *user_data) {
  45. qk_tap_dance_trigger_layer_t *data = (qk_tap_dance_trigger_layer_t *)user_data;
  46. if (data->state == data->trigger) {
  47. switch (data->trigger) {
  48. case SINGLE_HOLD:
  49. case DOUBLE_HOLD:
  50. case TRIPLE_HOLD:
  51. layer_off(data->layer);
  52. break;
  53. }
  54. } else {
  55. process_tap_dance_keycode(true, data->layer);
  56. }
  57. data->state = 0;
  58. }
  59. /* Tap Dance: Layer Mod. Toggles Layer when tapped, Mod when held. */
  60. void td_layer_mod_each(qk_tap_dance_state_t *state, void *user_data) {
  61. qk_tap_dance_dual_role_t *data = (qk_tap_dance_dual_role_t *)user_data;
  62. // Single tap → toggle layer, Single hold → mod
  63. if (state->pressed) {
  64. register_code(data->kc);
  65. } else if (state->count == 1) {
  66. state->finished = true;
  67. }
  68. }
  69. void td_layer_mod_finished(qk_tap_dance_state_t *state, void *user_data) {
  70. qk_tap_dance_dual_role_t *data = (qk_tap_dance_dual_role_t *)user_data;
  71. if (state->count == 1 && !state->pressed) {
  72. layer_invert(data->layer);
  73. }
  74. }
  75. void td_layer_mod_reset(qk_tap_dance_state_t *state, void *user_data) {
  76. qk_tap_dance_dual_role_t *data = (qk_tap_dance_dual_role_t *)user_data;
  77. if (state->count == 1) {
  78. unregister_code(data->kc);
  79. }
  80. }