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.

73 lines
1.6 KiB

  1. #include "edvorakjp.h"
  2. #include "process_keycode/process_tap_dance.h"
  3. enum tap_state {
  4. NONE = 0,
  5. SINGLE_TAP = 1,
  6. DOUBLE_TAP = 2,
  7. HOLD
  8. };
  9. typedef struct {
  10. uint8_t lower;
  11. uint8_t raise;
  12. } td_status_t;
  13. static td_status_t td_status = {NONE, NONE};
  14. int cur_dance(qk_tap_dance_state_t *state) {
  15. if (state->interrupted || !state->pressed) {
  16. return state->count == 1 ? SINGLE_TAP : DOUBLE_TAP;
  17. } else {
  18. return HOLD;
  19. }
  20. }
  21. void td_lower_finished(qk_tap_dance_state_t *state, void *user_data) {
  22. td_status.lower = cur_dance(state);
  23. switch(td_status.lower) {
  24. case SINGLE_TAP:
  25. set_japanese_mode(false);
  26. break;
  27. case DOUBLE_TAP:
  28. set_japanese_mode(false);
  29. register_code(KC_ESC);
  30. break;
  31. case HOLD:
  32. break;
  33. }
  34. layer_on(_LOWER);
  35. }
  36. void td_lower_reset(qk_tap_dance_state_t *state, void *user_data) {
  37. if (td_status.lower == DOUBLE_TAP) {
  38. unregister_code(KC_ESC);
  39. }
  40. layer_off(_LOWER);
  41. td_status.lower = NONE;
  42. }
  43. void td_raise_finished(qk_tap_dance_state_t *state, void *user_data) {
  44. td_status.raise = cur_dance(state);
  45. switch(td_status.raise) {
  46. case DOUBLE_TAP:
  47. // same as single
  48. case SINGLE_TAP:
  49. set_japanese_mode(true);
  50. break;
  51. case HOLD:
  52. break;
  53. }
  54. layer_on(_RAISE);
  55. }
  56. void td_raise_reset(qk_tap_dance_state_t *state, void *user_data) {
  57. layer_off(_RAISE);
  58. td_status.raise = NONE;
  59. }
  60. qk_tap_dance_action_t tap_dance_actions[] = {
  61. [TD_LOWER] =
  62. ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, td_lower_finished, td_lower_reset, 100),
  63. [TD_RAISE] =
  64. ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, td_raise_finished, td_raise_reset, 100)
  65. };