tap_dance_defs.c 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. // Copyright 2022 Sergey Vlasov (@sigprof)
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #include "quantum.h"
  4. #include "tap_dance_defs.h"
  5. // Implement custom keycodes which are used to check that the layer switching
  6. // behaves properly.
  7. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  8. switch (keycode) {
  9. case FAST_AB:
  10. case SLOW_AB:
  11. if (record->event.pressed) {
  12. tap_code(KC_A);
  13. } else {
  14. tap_code(KC_B);
  15. }
  16. return keycode == SLOW_AB;
  17. case FAST_CD:
  18. case SLOW_CD:
  19. if (record->event.pressed) {
  20. tap_code(KC_C);
  21. } else {
  22. tap_code(KC_D);
  23. }
  24. return keycode == SLOW_CD;
  25. }
  26. return true;
  27. }
  28. // Implement a custom tap dance with the following behavior:
  29. // - single tap: KC_APP
  30. // - single hold: MO(1)
  31. // - double tap/hold: KC_RCTL
  32. // (The single tap and hold actions are mostly equivalent to LT(1, KC_APP).)
  33. enum lt_app_state {
  34. LTA_NONE,
  35. LTA_SINGLE_TAP,
  36. LTA_SINGLE_HOLD,
  37. LTA_DOUBLE_HOLD,
  38. };
  39. static enum lt_app_state saved_lt_app_state;
  40. static enum lt_app_state get_lt_app_state(qk_tap_dance_state_t *state) {
  41. if (state->count == 1) {
  42. if (!state->pressed) {
  43. return LTA_SINGLE_TAP;
  44. } else {
  45. return LTA_SINGLE_HOLD;
  46. }
  47. } else if (state->count == 2) {
  48. return LTA_DOUBLE_HOLD;
  49. } else {
  50. return LTA_NONE;
  51. }
  52. }
  53. static void lt_app_finished(qk_tap_dance_state_t *state, void *user_data) {
  54. saved_lt_app_state = get_lt_app_state(state);
  55. switch (saved_lt_app_state) {
  56. case LTA_NONE:
  57. break;
  58. case LTA_SINGLE_TAP:
  59. register_code(KC_APP);
  60. break;
  61. case LTA_SINGLE_HOLD:
  62. layer_on(1);
  63. break;
  64. case LTA_DOUBLE_HOLD:
  65. register_code(KC_RCTL);
  66. break;
  67. }
  68. }
  69. static void lt_app_reset(qk_tap_dance_state_t *state, void *user_data) {
  70. switch (saved_lt_app_state) {
  71. case LTA_NONE:
  72. break;
  73. case LTA_SINGLE_TAP:
  74. unregister_code(KC_APP);
  75. break;
  76. case LTA_SINGLE_HOLD:
  77. layer_off(1);
  78. break;
  79. case LTA_DOUBLE_HOLD:
  80. unregister_code(KC_RCTL);
  81. break;
  82. }
  83. }
  84. qk_tap_dance_action_t tap_dance_actions[] = {
  85. [TD_L_MOVE] = ACTION_TAP_DANCE_LAYER_MOVE(KC_APP, 1),
  86. [TD_L_TOGG] = ACTION_TAP_DANCE_LAYER_TOGGLE(KC_APP, 1),
  87. [TD_LT_APP] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, lt_app_finished, lt_app_reset),
  88. };