process_tap_dance.c 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #include "quantum.h"
  2. static qk_tap_dance_state_t qk_tap_dance_state;
  3. static void _process_tap_dance_action_pair (qk_tap_dance_state_t *state,
  4. uint16_t kc1, uint16_t kc2) {
  5. uint16_t kc;
  6. if (state->count == 0)
  7. return;
  8. kc = (state->count == 1) ? kc1 : kc2;
  9. register_code (kc);
  10. unregister_code (kc);
  11. if (state->count >= 2) {
  12. reset_tap_dance (state);
  13. }
  14. }
  15. static void _process_tap_dance_action_fn (qk_tap_dance_state_t *state,
  16. qk_tap_dance_user_fn_t fn)
  17. {
  18. fn(state);
  19. }
  20. void process_tap_dance_action (uint16_t keycode)
  21. {
  22. uint16_t idx = keycode - QK_TAP_DANCE;
  23. qk_tap_dance_action_t action;
  24. action = tap_dance_actions[idx];
  25. switch (action.type) {
  26. case QK_TAP_DANCE_TYPE_PAIR:
  27. _process_tap_dance_action_pair (&qk_tap_dance_state,
  28. action.pair.kc1, action.pair.kc2);
  29. break;
  30. case QK_TAP_DANCE_TYPE_FN:
  31. _process_tap_dance_action_fn (&qk_tap_dance_state, action.fn);
  32. break;
  33. default:
  34. break;
  35. }
  36. }
  37. bool process_tap_dance(uint16_t keycode, keyrecord_t *record) {
  38. bool r = true;
  39. switch(keycode) {
  40. case QK_TAP_DANCE ... QK_TAP_DANCE_MAX:
  41. if (qk_tap_dance_state.keycode && qk_tap_dance_state.keycode != keycode) {
  42. process_tap_dance_action (qk_tap_dance_state.keycode);
  43. } else {
  44. r = false;
  45. }
  46. if (record->event.pressed) {
  47. qk_tap_dance_state.keycode = keycode;
  48. qk_tap_dance_state.timer = timer_read ();
  49. qk_tap_dance_state.count++;
  50. }
  51. break;
  52. default:
  53. if (qk_tap_dance_state.keycode) {
  54. process_tap_dance_action (qk_tap_dance_state.keycode);
  55. reset_tap_dance (&qk_tap_dance_state);
  56. }
  57. break;
  58. }
  59. return r;
  60. }
  61. void matrix_scan_tap_dance () {
  62. if (qk_tap_dance_state.keycode && timer_elapsed (qk_tap_dance_state.timer) > TAPPING_TERM) {
  63. process_tap_dance_action (qk_tap_dance_state.keycode);
  64. reset_tap_dance (&qk_tap_dance_state);
  65. }
  66. }
  67. void reset_tap_dance (qk_tap_dance_state_t *state) {
  68. state->keycode = 0;
  69. state->count = 0;
  70. }