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.

95 lines
3.1 KiB

  1. /*
  2. Copyright 2022 Hector Galindo <hi@hsuchil.com>
  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. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU General Public License for more details.
  11. You should have received a copy of the GNU General Public License
  12. along with this program. If not, see <http://www.gnu.org/licenses/>.
  13. */
  14. #include QMK_KEYBOARD_H
  15. #include "process_tap_dance.h"
  16. #include "hsuchil.h"
  17. #define TD_FN(FN_NAME) void FN_NAME(qk_tap_dance_state_t *state, void *user_data)
  18. #define TD_ON_EACH_TAP_FN_N(T) T##_on_each_tap
  19. #define TD_ON_EACH_TAP_FN(T) TD_FN(TD_ON_EACH_TAP_FN_N(T))
  20. #define TD_ON_DANCE_FINISHED_FN_N(T) T##_on_dance_finished
  21. #define TD_ON_DANCE_FINISHED_FN(T) TD_FN(TD_ON_DANCE_FINISHED_FN_N(T))
  22. #define TD_ON_DANCE_RESET_FN_N(T) T##_on_dance_reset
  23. #define TD_ON_DANCE_RESET_FN(T) TD_FN(TD_ON_DANCE_RESET_FN_N(T))
  24. #define ACTION_TD_DEF(T,E,F,R) [T] = ACTION_TAP_DANCE_FN_ADVANCED(E,F,R)
  25. #define ACTION_TD_DEF_FULL(T) ACTION_TD_DEF(T, TD_ON_EACH_TAP_FN_N(T), TD_ON_DANCE_FINISHED_FN_N(T), TD_ON_DANCE_RESET_FN_N(T))
  26. #define ACTION_TD_DEF_NO_EACH(T) ACTION_TD_DEF(T, NULL, TD_ON_DANCE_FINISHED_FN_N(T), TD_ON_DANCE_RESET_FN_N(T))
  27. #define ACTION_TD_DEF_NO_FINISHED(T) ACTION_TD_DEF(T, TD_ON_EACH_TAP_FN_N(T), NULL, TD_ON_DANCE_RESET_FN_N(T))
  28. #define ACTION_TD_DEF_NO_RESET(T) ACTION_TD_DEF(T, TD_ON_EACH_TAP_FN_N(T), TD_ON_DANCE_FINISHED_FN_N(T), NULL)
  29. #define ACTION_TD_DEF_ONLY_EACH(T) ACTION_TD_DEF(T, TD_ON_EACH_TAP_FN_N(T), NULL, NULL)
  30. #define ACTION_TD_DEF_ONLY_FINISHED(T) ACTION_TD_DEF(T, NULL, TD_ON_DANCE_FINISHED_FN_N(T), NULL)
  31. #define ACTION_TD_DEF_ONLY_RESET(T) ACTION_TD_DEF(T, NULL, NULL, TD_ON_DANCE_RESET_FN_N(T))
  32. #define SIMPLE_DANCE_STATE cur_dance_simple(state)
  33. #define DANCE_STATE cur_dance(state)
  34. typedef enum {
  35. TD_NONE,
  36. TD_UNKNOWN,
  37. TD_TAP,
  38. TD_HOLD,
  39. TD_SINGLE_TAP,
  40. TD_SINGLE_HOLD,
  41. TD_DOUBLE_TAP,
  42. TD_DOUBLE_HOLD
  43. } td_state_t;
  44. td_state_t cur_dance_simple(qk_tap_dance_state_t *state) {
  45. if (!state->pressed) return TD_TAP;
  46. return TD_HOLD;
  47. }
  48. td_state_t cur_dance(qk_tap_dance_state_t *state) {
  49. if (state->count == 1) {
  50. if (!state->pressed) return TD_SINGLE_TAP;
  51. return TD_SINGLE_HOLD;
  52. }
  53. if (state->count == 2) {
  54. if (!state->pressed) return TD_DOUBLE_TAP;
  55. return TD_DOUBLE_HOLD;
  56. }
  57. return TD_UNKNOWN;
  58. }
  59. static td_state_t rshift_up_state;
  60. TD_ON_DANCE_FINISHED_FN(_TD_RSHIFT_UP) {
  61. rshift_up_state = SIMPLE_DANCE_STATE;
  62. if (rshift_up_state == TD_HOLD) {
  63. register_mods(MOD_BIT(KC_RSFT));
  64. } else {
  65. register_code16(KC_UP);
  66. }
  67. }
  68. TD_ON_DANCE_RESET_FN(_TD_RSHIFT_UP) {
  69. if (rshift_up_state == TD_HOLD) {
  70. unregister_mods(MOD_BIT(KC_RSFT));
  71. } else {
  72. unregister_code16(KC_UP);
  73. }
  74. }
  75. qk_tap_dance_action_t tap_dance_actions[] = {
  76. ACTION_TD_DEF_NO_EACH(_TD_RSHIFT_UP),
  77. };