keymap.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. #include QMK_KEYBOARD_H
  2. enum layer_names {
  3. _BASE,
  4. _MACRO,
  5. _MOD
  6. };
  7. enum custom_keycodes {
  8. M801 = SAFE_RANGE,
  9. M802,
  10. M803,
  11. M804,
  12. M805,
  13. M806,
  14. MAIL_C
  15. };
  16. // tapdance keycodes
  17. enum td_keycodes {
  18. LAY // Our example key: `LALT` when held, `(` when tapped. Add additional keycodes for each tapdance.
  19. };
  20. // define a type containing as many tapdance states as you need
  21. typedef enum {
  22. SINGLE_TAP,
  23. SINGLE_HOLD,
  24. } td_state_t;
  25. // create a global instance of the tapdance state type
  26. static td_state_t td_state;
  27. // declare your tapdance functions:
  28. // function to determine the current tapdance state
  29. int cur_dance (qk_tap_dance_state_t *state);
  30. // `finished` and `reset` functions for each tapdance keycode
  31. void altlp_finished (qk_tap_dance_state_t *state, void *user_data);
  32. void altlp_reset (qk_tap_dance_state_t *state, void *user_data);
  33. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  34. switch (keycode) {
  35. case M801:
  36. if (record->event.pressed) {
  37. SEND_STRING("M801" SS_TAP(X_ENTER));
  38. }
  39. break;
  40. case M802:
  41. if (record->event.pressed) {
  42. SEND_STRING("M802" SS_TAP(X_ENTER));
  43. }
  44. break;
  45. case M803:
  46. if (record->event.pressed) {
  47. SEND_STRING("M803" SS_TAP(X_ENTER));
  48. }
  49. break;
  50. case M804:
  51. if (record->event.pressed) {
  52. SEND_STRING("M804" SS_TAP(X_ENTER));
  53. }
  54. break;
  55. case M805:
  56. if (record->event.pressed) {
  57. SEND_STRING("M805" SS_TAP(X_ENTER));
  58. }
  59. break;
  60. case M806:
  61. if (record->event.pressed) {
  62. SEND_STRING("M806" SS_TAP(X_ENTER));
  63. }
  64. break;
  65. case MAIL_C:
  66. if (record->event.pressed) {
  67. SEND_STRING(SS_TAP(X_ENTER) SS_TAP(X_DOWN) SS_TAP(X_DOWN) SS_TAP(X_ENTER));
  68. }
  69. break;
  70. }
  71. return true;
  72. };
  73. #define EX_ARR LCTL(LSFT(KC_ENTER))
  74. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  75. [_BASE] = LAYOUT(
  76. // ┌────────┬────────┬────────┐
  77. KC_MUTE, KC_UP, TD(LAY),
  78. // ├────────┼────────┼────────┤
  79. KC_LEFT, KC_DOWN, KC_RGHT,
  80. // ├────────┼────────┼────────┤
  81. KC_NO, KC_NO, KC_NO
  82. // └────────┴────────┴────────┘
  83. ),
  84. [_MACRO] = LAYOUT(
  85. // ┌────────┬────────┬────────┐
  86. _______, KC_SPC, TG(_MACRO),
  87. // ├────────┼────────┼────────┤
  88. M801, M802, M803,
  89. // ├────────┼────────┼────────┤
  90. MAIL_C, KC_NO, EX_ARR
  91. // └────────┴────────┴────────┘
  92. ),
  93. [_MOD] = LAYOUT(
  94. // ┌────────┬────────┬────────┐
  95. _______, BL_STEP,TG(_MOD),
  96. // ├────────┼────────┼────────┤
  97. KC_NO, RGB_MOD, KC_NO,
  98. // ├────────┼────────┼────────┤
  99. KC_NO, KC_NO, KC_NO
  100. // └────────┴────────┴────────┘
  101. )
  102. };
  103. void encoder_update_user(uint8_t index, bool clockwise) {
  104. if (index == 0) {
  105. if (clockwise) {
  106. tap_code(KC_VOLD);
  107. } else {
  108. tap_code(KC_VOLU);
  109. }
  110. }
  111. }
  112. // determine the tapdance state to return
  113. int cur_dance (qk_tap_dance_state_t *state) {
  114. if (state->count == 1) {
  115. if (state->interrupted || !state->pressed) { return SINGLE_TAP; }
  116. else { return SINGLE_HOLD; }
  117. } else { return 3; } // any number higher than the maximum state value you return above
  118. }
  119. // handle the possible states for each tapdance keycode you define:
  120. void altlp_finished (qk_tap_dance_state_t *state, void *user_data) {
  121. td_state = cur_dance(state);
  122. switch (td_state) {
  123. case SINGLE_TAP:
  124. layer_on(_MACRO);
  125. break;
  126. case SINGLE_HOLD:
  127. layer_on(_MOD);
  128. break;
  129. }
  130. }
  131. void altlp_reset (qk_tap_dance_state_t *state, void *user_data) {
  132. switch (td_state) {
  133. case SINGLE_TAP:
  134. break;
  135. case SINGLE_HOLD:
  136. layer_off(_MOD);
  137. break;
  138. }
  139. }
  140. // define `ACTION_TAP_DANCE_FN_ADVANCED()` for each tapdance keycode, passing in `finished` and `reset` functions
  141. qk_tap_dance_action_t tap_dance_actions[] = {
  142. [LAY] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, altlp_finished, altlp_reset)
  143. };