process_tap_dance.h 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #ifndef PROCESS_TAP_DANCE_H
  2. #define PROCESS_TAP_DANCE_H
  3. #ifdef TAP_DANCE_ENABLE
  4. #include <stdbool.h>
  5. #include <inttypes.h>
  6. typedef struct
  7. {
  8. uint8_t count;
  9. uint16_t keycode;
  10. uint16_t timer;
  11. } qk_tap_dance_state_t;
  12. #define TD(n) (QK_TAP_DANCE + n)
  13. typedef enum
  14. {
  15. QK_TAP_DANCE_TYPE_PAIR,
  16. QK_TAP_DANCE_TYPE_FN,
  17. } qk_tap_dance_type_t;
  18. typedef void (*qk_tap_dance_user_fn_t) (qk_tap_dance_state_t *state);
  19. typedef void (*qk_tap_dance_user_fn_reset_t) (void);
  20. typedef struct
  21. {
  22. qk_tap_dance_type_t type;
  23. union {
  24. struct {
  25. uint16_t kc1;
  26. uint16_t kc2;
  27. } pair;
  28. struct {
  29. qk_tap_dance_user_fn_t regular;
  30. qk_tap_dance_user_fn_t anyway;
  31. qk_tap_dance_user_fn_reset_t reset;
  32. } fn;
  33. };
  34. } qk_tap_dance_action_t;
  35. #define ACTION_TAP_DANCE_DOUBLE(kc1, kc2) { \
  36. .type = QK_TAP_DANCE_TYPE_PAIR, \
  37. .pair = { kc1, kc2 } \
  38. }
  39. #define ACTION_TAP_DANCE_FN(user_fn) { \
  40. .type = QK_TAP_DANCE_TYPE_FN, \
  41. .fn = { user_fn, NULL, NULL } \
  42. }
  43. #define ACTION_TAP_DANCE_FN_ANYWAY(user_fn, user_fn_anyway) { \
  44. .type = QK_TAP_DANCE_TYPE_FN, \
  45. .fn = { user_fn, user_fn_anyway, NULL } \
  46. }
  47. #define ACTION_TAP_DANCE_FN_RESET(user_fn, user_fn_reset) { \
  48. .type = QK_TAP_DANCE_TYPE_FN, \
  49. .fn = { user_fn, NULL, user_fn_reset } \
  50. }
  51. #define ACTION_TAP_DANCE_FN_ANYWAY_RESET(user_fn, user_fn_anyway, user_fn_reset) { \
  52. .type = QK_TAP_DANCE_TYPE_FN, \
  53. .fn = { user_fn, user_fn_anyway, user_fn_reset } \
  54. }
  55. extern const qk_tap_dance_action_t tap_dance_actions[];
  56. /* To be used internally */
  57. bool process_tap_dance(uint16_t keycode, keyrecord_t *record);
  58. void matrix_scan_tap_dance (void);
  59. void reset_tap_dance (qk_tap_dance_state_t *state);
  60. #else
  61. #define TD(n) KC_NO
  62. #endif
  63. #endif