logo

qmk_firmware

custom branch of QMK firmware git clone https://anongit.hacktivis.me/git/qmk_firmware.git

keymap.c (5818B)


  1. /* Copyright 2021 Hydrogen BD <support@hgenbd.com>
  2. *
  3. * This program is free software: you can redistribute it and/or modify
  4. * it under the terms of the GNU General Public License as published by
  5. * the Free Software Foundation, either version 2 of the License, or
  6. * (at your option) any later version.
  7. *
  8. * This program is distributed in the hope that it will be useful,
  9. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. * GNU General Public License for more details.
  12. *
  13. * You should have received a copy of the GNU General Public License
  14. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  15. */
  16. #include QMK_KEYBOARD_H
  17. typedef enum {
  18. TD_NONE,
  19. TD_UNKNOWN,
  20. TD_SINGLE_TAP,
  21. TD_SINGLE_HOLD,
  22. TD_DOUBLE_TAP,
  23. TD_DOUBLE_HOLD,
  24. TD_DOUBLE_SINGLE_TAP, // Send two single taps
  25. } td_state_t;
  26. typedef struct {
  27. bool is_press_action;
  28. td_state_t state;
  29. } td_tap_t;
  30. enum custom_keycodes {
  31. TD_CUT_REDO,
  32. TD_PLAY_PAUSE_MUTE,
  33. TD_MNXT_RIGHT,
  34. TD_MPRV_LEFT,
  35. TD_SEARCH_REFRESH,
  36. QUAD_LAYER_SWITCH,
  37. QUAD_CVXA,
  38. YOUTUBE = SAFE_RANGE,
  39. FACEBOOK,
  40. DISCORD,
  41. VALORANT,
  42. VSCODE,
  43. };
  44. td_state_t cur_dance(tap_dance_state_t *state);
  45. /* Quad layer switching */
  46. void layer_finished(tap_dance_state_t *state, void *user_data);
  47. void layer_reset(tap_dance_state_t *state, void *user_data);
  48. /* Copy, paste, select all, cut */
  49. void cvxa_finished(tap_dance_state_t *state, void *user_data);
  50. void cvxa_reset(tap_dance_state_t *state, void *user_data);
  51. static td_tap_t layerTap_state = {
  52. .is_press_action = true,
  53. .state = TD_NONE
  54. };
  55. static td_tap_t cvxa_state = {
  56. .is_press_action = true,
  57. .state = TD_NONE
  58. };
  59. // Determine the current tap dance state
  60. td_state_t cur_dance(tap_dance_state_t *state) {
  61. if (state->count == 1) {
  62. if (state->interrupted || !state->pressed) return TD_SINGLE_TAP;
  63. // Key has not been interrupted, but the key is still held. Means you want to send a 'HOLD'.
  64. else return TD_SINGLE_HOLD;
  65. } else if (state->count == 2) {
  66. if (state->interrupted) return TD_DOUBLE_SINGLE_TAP;
  67. else if (state->pressed) return TD_DOUBLE_HOLD;
  68. else return TD_DOUBLE_TAP;
  69. } else return TD_UNKNOWN;
  70. }
  71. void layer_finished(tap_dance_state_t *state, void *user_data) {
  72. layerTap_state.state = cur_dance(state);
  73. layer_off(get_highest_layer(layer_state));
  74. switch (layerTap_state.state) {
  75. case TD_SINGLE_TAP: layer_on(0); break;
  76. case TD_SINGLE_HOLD: layer_on(1); break;
  77. case TD_DOUBLE_TAP: layer_on(2); break;
  78. case TD_DOUBLE_HOLD: layer_on(3); break;
  79. default: layer_on(0);
  80. }
  81. }
  82. void layer_reset(tap_dance_state_t *state, void *user_data) {
  83. layerTap_state.state = TD_NONE;
  84. }
  85. void cvxa_finished(tap_dance_state_t *state, void *user_data) {
  86. cvxa_state.state = cur_dance(state);
  87. register_mods(MOD_BIT(KC_LCTL));
  88. switch (cvxa_state.state) {
  89. case TD_SINGLE_TAP: tap_code(KC_V); break;
  90. case TD_SINGLE_HOLD: tap_code(KC_A); break;
  91. case TD_DOUBLE_TAP: tap_code(KC_C); break;
  92. case TD_DOUBLE_HOLD: tap_code(KC_X); break;
  93. default: tap_code(KC_V);
  94. }
  95. unregister_mods(MOD_BIT(KC_LCTL));
  96. }
  97. void cvxa_reset(tap_dance_state_t *state, void *user_data) {
  98. cvxa_state.state = TD_NONE;
  99. }
  100. // Tap Dance definitions
  101. tap_dance_action_t tap_dance_actions[] = {
  102. [TD_CUT_REDO] = ACTION_TAP_DANCE_DOUBLE(C(KC_Z), S(C(KC_Z))),
  103. [TD_PLAY_PAUSE_MUTE] = ACTION_TAP_DANCE_DOUBLE(KC_MPLY, KC_MUTE),
  104. [TD_MNXT_RIGHT] = ACTION_TAP_DANCE_DOUBLE(KC_MNXT, KC_RIGHT),
  105. [TD_MPRV_LEFT] = ACTION_TAP_DANCE_DOUBLE(KC_MPRV, KC_LEFT),
  106. [TD_SEARCH_REFRESH] = ACTION_TAP_DANCE_DOUBLE(KC_WREF, KC_WSCH),
  107. [QUAD_LAYER_SWITCH] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, layer_finished, layer_reset),
  108. [QUAD_CVXA] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, cvxa_finished, cvxa_reset)
  109. };
  110. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  111. switch(keycode) {
  112. case YOUTUBE:
  113. if (record->event.pressed) {
  114. tap_code16(C(KC_L));
  115. SEND_STRING("https://www.youtube.com/");
  116. } else {
  117. tap_code(KC_ENT);
  118. }
  119. break;
  120. case FACEBOOK:
  121. if (record->event.pressed) {
  122. tap_code16(C(KC_L));
  123. SEND_STRING("https://www.facebook.com/");
  124. } else {
  125. tap_code(KC_ENT);
  126. }
  127. break;
  128. case VALORANT:
  129. if (record->event.pressed) {
  130. tap_code16(G(KC_S));
  131. SEND_STRING("valorant");
  132. } else {
  133. tap_code(KC_ENT);
  134. }
  135. break;
  136. case DISCORD:
  137. if (record->event.pressed) {
  138. tap_code16(G(KC_S));
  139. SEND_STRING("discord");
  140. } else {
  141. tap_code(KC_ENT);
  142. }
  143. break;
  144. case VSCODE:
  145. if (record->event.pressed) {
  146. tap_code16(G(KC_S));
  147. SEND_STRING("vscode");
  148. } else {
  149. tap_code(KC_ENT);
  150. }
  151. break;
  152. }
  153. return true;
  154. };
  155. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  156. [0] = LAYOUT(
  157. TD(TD_CUT_REDO), TD(TD_MPRV_LEFT), TD(TD_PLAY_PAUSE_MUTE), TD(TD_MNXT_RIGHT), TD(QUAD_CVXA), TD(QUAD_LAYER_SWITCH)
  158. ),
  159. [1] = LAYOUT(
  160. YOUTUBE, KC_WBAK, TD(TD_SEARCH_REFRESH), KC_WFWD, FACEBOOK, TD(QUAD_LAYER_SWITCH)
  161. ),
  162. [2] = LAYOUT(
  163. A(KC_F4), SGUI(KC_S), KC_MYCM, LCA(KC_DEL), KC_CALC, TD(QUAD_LAYER_SWITCH)
  164. ),
  165. [3] = LAYOUT(
  166. C(KC_SLSH), VALORANT, VSCODE, DISCORD, LSA(KC_A), TD(QUAD_LAYER_SWITCH)
  167. ),
  168. };