1
0

keymap.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. /*
  2. Copyright 2020 Joel Elkins <joel@elkins.com>
  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. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU General Public License for more details.
  11. You should have received a copy of the GNU General Public License
  12. along with this program. If not, see <http://www.gnu.org/licenses/>.
  13. */
  14. #include "jdelkins.h"
  15. #undef LAYOUT
  16. #define LAYOUT LAYOUT_directional_nosplitspace
  17. #define IDLE_TIMEOUT 360
  18. uint16_t rgb_idle_seconds = 0;
  19. uint16_t rgb_timer;
  20. bool rgb_was_enabled;
  21. // Tap Dance
  22. int ctl_state = 0;
  23. void ctl_finished(qk_tap_dance_state_t *state, void *user_data) {
  24. ctl_state = cur_dance(state);
  25. switch(ctl_state) {
  26. case SINGLE_TAP: qk_leader_start(); break;
  27. case SINGLE_HOLD: register_code(KC_LCTL); break;
  28. case DOUBLE_TAP: tap_code(KC_RCTL); break;
  29. case DOUBLE_HOLD: register_code(KC_RCTL); break;
  30. case TRIPLE_TAP: tap_code(KC_RCTL); tap_code(KC_RCTL); break;
  31. case TRIPLE_HOLD: tap_code(KC_RCTL); register_code(KC_RCTL); break;
  32. }
  33. }
  34. void ctl_reset(qk_tap_dance_state_t *state, void *user_data) {
  35. switch(ctl_state) {
  36. case SINGLE_HOLD: unregister_code(KC_LCTL); break;
  37. case DOUBLE_HOLD:
  38. case TRIPLE_HOLD: unregister_code(KC_RCTL); break;
  39. }
  40. ctl_state = 0;
  41. }
  42. void g_finished(qk_tap_dance_state_t *state, void *user_data) {
  43. switch (cur_dance(state)) {
  44. case SINGLE_TAP:
  45. tap_code16(C(KC_END));
  46. break;
  47. case DOUBLE_TAP:
  48. tap_code16(C(KC_HOME));
  49. break;
  50. }
  51. }
  52. enum {
  53. TD_LDCTL,
  54. TD_G,
  55. };
  56. qk_tap_dance_action_t tap_dance_actions[] = {
  57. [TD_LDCTL] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, ctl_finished, ctl_reset),
  58. [TD_G] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, g_finished, NULL),
  59. };
  60. // Layers
  61. const uint16_t PROGMEM keymaps[_LAYER_MAX][MATRIX_ROWS][MATRIX_COLS] = {
  62. [_QWERTY] = LAYOUT(
  63. KC_GESC, 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,
  64. 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,
  65. MY_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
  66. KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_BSPC, MO(_ADJUST),
  67. TD(TD_LDCTL), MY_GUI, MY_ALT, MY_SPC, KC_RALT, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
  68. ),
  69. [_GAME] = LAYOUT(
  70. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  71. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  72. KC_LCTL, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  73. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  74. _______, _______, KC_LALT, KC_SPC, _______, _______, _______, _______, _______
  75. ),
  76. [_FUNC] = LAYOUT(
  77. KC_GRV, 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,
  78. _______, _______, FW_WRD, KB_EOL, _______, _______, KB_COPY, KC_PGUP, _______, _______, KB_PASTE, KC_SLCK, _______, MY_CALC,
  79. _______, KB_BOL, _______, KC_PGDN, _______, TD(TD_G), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, _______, _______,
  80. _______, _______, KC_DEL, _______, _______, BK_WRD, _______, _______, _______, _______, _______, _______, KC_INS, _______,
  81. _______, MY_RGUI, MY_RALT, _______, _______, KC_HOME, KC_PGDN, KC_PGUP, KC_END
  82. ),
  83. [_KP] = LAYOUT(
  84. _______, _______, _______, _______, _______, _______, _______, _______, KC_KP_ASTERISK, _______, _______, _______, _______, _______,
  85. KC_NUMLOCK, _______, KC_BTN1, KC_MS_U, KC_BTN2, KC_WH_U, _______, KC_KP_7, KC_KP_8, KC_KP_9, KC_KP_MINUS, _______, _______, _______,
  86. _______, _______, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_D, _______, KC_KP_4, KC_KP_5, KC_KP_6, KC_KP_PLUS, _______, _______,
  87. _______, _______, _______, _______, _______, _______, _______, KC_KP_1, KC_KP_2, KC_KP_3, KC_KP_SLASH, _______, _______, TG(_KP),
  88. _______, _______, _______, KC_KP_0, KC_KP_DOT, _______, _______, _______, _______
  89. ),
  90. [_ADJUST] = LAYOUT(
  91. KC_GRV, 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,
  92. _______, RGB_SPD, RGB_VAI, RGB_SPI, RGB_HUI, RGB_SAI, _______, _______, _______, _______, KC_PSCR, KC_SLCK, _______, KC_MUTE,
  93. _______, RGB_RMOD, RGB_VAD, RGB_MOD, RGB_HUD, RGB_SAD, _______, _______, TG(_KP), _______, _______, _______, KC_MPLY,
  94. _______, RGB_TOG, KB_MAKE, KB_FLSH, KB_VRSN, KB_BOOT, _______, TG_SYS, _______, _______, _______, _______, KC_DEL, _______,
  95. _______, MY_RGUI, MY_RALT, _______, _______, KC_MPRV, KC_VOLD, KC_VOLU, KC_MNXT
  96. ),
  97. };
  98. const rgblight_segment_t PROGMEM game_layer[] = RGBLIGHT_LAYER_SEGMENTS(
  99. {0, 1, HSV_RED},
  100. {7, 2, HSV_RED},
  101. {15, 1, HSV_RED}
  102. );
  103. const rgblight_segment_t PROGMEM func_layer[] = RGBLIGHT_LAYER_SEGMENTS(
  104. {0, 8, HSV_GREEN}
  105. );
  106. const rgblight_segment_t PROGMEM kp_layer[] = RGBLIGHT_LAYER_SEGMENTS(
  107. {0, 16, HSV_ORANGE}
  108. );
  109. const rgblight_segment_t PROGMEM adjust_layer[] = RGBLIGHT_LAYER_SEGMENTS(
  110. {0, 16, HSV_BLUE}
  111. );
  112. const rgblight_segment_t PROGMEM capslock_layer[] = RGBLIGHT_LAYER_SEGMENTS(
  113. {10, 4, HSV_WHITE}
  114. );
  115. const rgblight_segment_t PROGMEM numlock_layer[] = RGBLIGHT_LAYER_SEGMENTS(
  116. {0, 2, HSV_PURPLE},
  117. {14, 2, HSV_PURPLE}
  118. );
  119. enum rgb_layer_index {
  120. L_GAME,
  121. L_FUNC,
  122. L_KP,
  123. L_ADJUST,
  124. L_CAPSLOCK,
  125. L_NUMLOCK,
  126. };
  127. const rgblight_segment_t * const PROGMEM my_rgb_layers[] = RGBLIGHT_LAYERS_LIST(
  128. [L_GAME] = game_layer,
  129. [L_FUNC] = func_layer,
  130. [L_KP] = kp_layer,
  131. [L_ADJUST] = adjust_layer,
  132. [L_CAPSLOCK] = capslock_layer,
  133. [L_NUMLOCK] = numlock_layer
  134. );
  135. layer_state_t layer_state_set_keymap(layer_state_t state) {
  136. rgblight_set_layer_state(L_GAME, layer_state_cmp(state, _GAME));
  137. rgblight_set_layer_state(L_FUNC, layer_state_cmp(state, _FUNC));
  138. rgblight_set_layer_state(L_KP, layer_state_cmp(state, _KP));
  139. rgblight_set_layer_state(L_ADJUST, layer_state_cmp(state, _ADJUST));
  140. rgblight_set_layer_state(L_CAPSLOCK, CAPSLOCK_ON);
  141. rgblight_set_layer_state(L_NUMLOCK, NUMLOCK_ON && layer_state_cmp(state, _KP));
  142. if (layer_state_cmp(state, _GAME))
  143. autoshift_disable();
  144. else
  145. autoshift_enable();
  146. return state;
  147. }
  148. bool led_update_user(led_t led_state) {
  149. rgblight_set_layer_state(L_CAPSLOCK, led_state.caps_lock);
  150. rgblight_set_layer_state(L_NUMLOCK, led_state.num_lock && layer_state_is(_KP));
  151. return true;
  152. }
  153. void keyboard_post_init_keymap(void) {
  154. rgblight_layers = my_rgb_layers;
  155. rgb_was_enabled = rgblight_is_enabled();
  156. }
  157. LEADER_EXTERNS();
  158. void matrix_scan_keymap(void) {
  159. if (rgblight_is_enabled() && timer_elapsed(rgb_timer) > 1000) {
  160. rgb_idle_seconds++;
  161. rgb_timer = timer_read();
  162. }
  163. if (rgb_idle_seconds > IDLE_TIMEOUT) {
  164. rgb_was_enabled = rgblight_is_enabled();
  165. rgblight_disable_noeeprom();
  166. rgb_idle_seconds = 0;
  167. }
  168. LEADER_DICTIONARY() {
  169. leading = false;
  170. leader_end();
  171. SEQ_ONE_KEY(KC_K) {
  172. layer_invert(_KP);
  173. }
  174. SEQ_ONE_KEY(KC_G) {
  175. layer_invert(_GAME);
  176. }
  177. SEQ_ONE_KEY(KC_KP_5) {
  178. layer_invert(_KP);
  179. }
  180. SEQ_TWO_KEYS(KC_SCLN, KC_1) {
  181. send_secret_string(0);
  182. }
  183. SEQ_TWO_KEYS(KC_SCLN, KC_2) {
  184. send_secret_string(1);
  185. }
  186. SEQ_TWO_KEYS(KC_SCLN, KC_3) {
  187. send_secret_string(2);
  188. }
  189. SEQ_TWO_KEYS(KC_SCLN, KC_4) {
  190. send_secret_string(3);
  191. }
  192. SEQ_TWO_KEYS(KC_SCLN, KC_5) {
  193. send_secret_string(4);
  194. }
  195. SEQ_TWO_KEYS(KC_SCLN, KC_6) {
  196. send_secret_string(5);
  197. }
  198. SEQ_TWO_KEYS(KC_SCLN, KC_M) {
  199. send_secret_string(0);
  200. }
  201. SEQ_TWO_KEYS(KC_SCLN, KC_COMM) {
  202. send_secret_string(1);
  203. }
  204. SEQ_TWO_KEYS(KC_SCLN, KC_DOT) {
  205. send_secret_string(2);
  206. }
  207. SEQ_TWO_KEYS(KC_SCLN, KC_J) {
  208. send_secret_string(3);
  209. }
  210. SEQ_TWO_KEYS(KC_SCLN, KC_K) {
  211. send_secret_string(4);
  212. }
  213. SEQ_TWO_KEYS(KC_SCLN, KC_L) {
  214. send_secret_string(5);
  215. }
  216. SEQ_ONE_KEY(KC_C) {
  217. tap_code16(C(KC_C));
  218. }
  219. }
  220. }
  221. bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
  222. static uint16_t gesc_timer;
  223. rgb_idle_seconds = 0;
  224. if (!rgblight_is_enabled() && rgb_was_enabled)
  225. rgblight_enable_noeeprom();
  226. switch (keycode) {
  227. // custom handle KC_GESC to emulate auto shift on it
  228. case KC_GESC:
  229. if (get_autoshift_state()) {
  230. if (record->event.pressed)
  231. gesc_timer = timer_read();
  232. else {
  233. if (timer_elapsed(gesc_timer) > AUTO_SHIFT_TIMEOUT || MODS_SHIFT) {
  234. tap_code16(S(KC_GRV));
  235. } else if (MODS_GUI)
  236. tap_code(KC_GRV);
  237. else
  238. tap_code(KC_ESC);
  239. }
  240. return false;
  241. }
  242. return false;
  243. }
  244. return true;
  245. }