keymap.c 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. #include QMK_KEYBOARD_H
  2. #define MY_LESC LT(1, KC_ESC)
  3. #define MY_RENT LT(1, KC_ENT)
  4. #define MY_LCA TD(TD_LCA)
  5. #define MY_RCA TD(TD_RCA)
  6. #define MY_LGA TD(TD_LGA)
  7. #define MY_RGA TD(TD_RGA)
  8. #define MY_APP TD(TD_APP_HYPR)
  9. enum {
  10. TD_LCA,
  11. TD_RCA,
  12. TD_LGA,
  13. TD_RGA,
  14. TD_APP_HYPR
  15. };
  16. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  17. LAYOUT_60_ansi(
  18. KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC,
  19. KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
  20. MY_LESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, MY_RENT,
  21. KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
  22. MY_LGA, KC_LALT, MY_LCA, KC_SPC, MY_RCA, KC_RALT, MY_APP, MY_RGA),
  23. LAYOUT_60_ansi(
  24. KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL,
  25. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  26. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS,
  27. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  28. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
  29. };
  30. enum {
  31. SINGLE_TAP = 1,
  32. SINGLE_HOLD = 2,
  33. DOUBLE_TAP = 3,
  34. DOUBLE_HOLD = 4,
  35. DOUBLE_SINGLE_TAP = 5,
  36. UNKNOWN_TAP = 6
  37. };
  38. typedef struct {
  39. bool is_press_action;
  40. int state;
  41. } tap;
  42. int cur_dance(qk_tap_dance_state_t *state) {
  43. switch (state->count) {
  44. case 1:
  45. if (state->interrupted || state->pressed == 0) {
  46. return SINGLE_TAP;
  47. }
  48. return SINGLE_HOLD;
  49. case 2:
  50. if (state->interrupted) {
  51. return DOUBLE_SINGLE_TAP;
  52. }
  53. if (state->pressed) {
  54. return DOUBLE_HOLD;
  55. }
  56. return DOUBLE_TAP;
  57. }
  58. return UNKNOWN_TAP;
  59. }
  60. #define my_dance_combo(N, K1, K2) \
  61. static tap N ## _state = { \
  62. .is_press_action = true, \
  63. .state = 0 \
  64. }; \
  65. \
  66. void N ## _finished(qk_tap_dance_state_t *state, void *user_data) { \
  67. N ## _state.state = cur_dance(state); \
  68. switch (N ## _state.state) { \
  69. case SINGLE_TAP: \
  70. case SINGLE_HOLD: \
  71. register_code(K1); \
  72. break; \
  73. case DOUBLE_TAP: \
  74. case DOUBLE_SINGLE_TAP: \
  75. case DOUBLE_HOLD: \
  76. register_code(K1); \
  77. register_code(K2); \
  78. break; \
  79. } \
  80. } \
  81. \
  82. void N ## _reset(qk_tap_dance_state_t *state, void *user_data) { \
  83. switch (N ## _state.state) { \
  84. case SINGLE_TAP: \
  85. case SINGLE_HOLD: \
  86. unregister_code(K1); \
  87. break; \
  88. case DOUBLE_TAP: \
  89. case DOUBLE_SINGLE_TAP: \
  90. case DOUBLE_HOLD: \
  91. unregister_code(K2); \
  92. unregister_code(K1); \
  93. break; \
  94. } \
  95. N ## _state.state = 0; \
  96. }
  97. my_dance_combo(lca, KC_LCTL, KC_LALT)
  98. my_dance_combo(rca, KC_RCTL, KC_RALT)
  99. my_dance_combo(lga, KC_LGUI, KC_LALT)
  100. my_dance_combo(rga, KC_RGUI, KC_RALT)
  101. qk_tap_dance_action_t tap_dance_actions[] = {
  102. [TD_LCA] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, lca_finished, lca_reset),
  103. [TD_RCA] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, rca_finished, rca_reset),
  104. [TD_LGA] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, lga_finished, lga_reset),
  105. [TD_RGA] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, rga_finished, rga_reset),
  106. [TD_APP_HYPR] = ACTION_TAP_DANCE_DOUBLE(KC_APP, KC_HYPR)
  107. };