keymap.c 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517
  1. /* Copyright 2022 Daniel Weeks (@xanimos)
  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. #include <string.h>
  18. #define MILLISECONDS_IN_SECOND 1000
  19. // These are just to make it neater to use builtin HSV values in the keymap
  20. #define RED {HSV_RED}
  21. #define CORAL {HSV_CORAL}
  22. #define ORANGE {HSV_ORANGE}
  23. #define GOLDEN {HSV_GOLDENROD}
  24. #define GOLD {HSV_GOLD}
  25. #define YELLOW {HSV_YELLOW}
  26. #define CHART {HSV_CHARTREUSE}
  27. #define GREEN {HSV_GREEN}
  28. #define SPRING {HSV_SPRINGGREEN}
  29. #define TURQ {HSV_TURQUOISE}
  30. #define TEAL {HSV_TEAL}
  31. #define CYAN {HSV_CYAN}
  32. #define AZURE {HSV_AZURE}
  33. #define BLUE {HSV_BLUE}
  34. #define PURPLE {HSV_PURPLE}
  35. #define MAGENT {HSV_MAGENTA}
  36. #define PINK {HSV_PINK}
  37. //========================================================== CONFIGURABLE DEFAULTS ==========================================================
  38. #define RGB_DEFAULT_TIME_OUT 30
  39. #define RGB_FAST_MODE_TIME_OUT 3
  40. #define RGB_TIME_OUT_MAX 600
  41. #define RGB_TIME_OUT_MIN 10
  42. #define RGB_TIME_OUT_STEP 10
  43. extern rgb_config_t rgb_matrix_config;
  44. bool disable_layer_color;
  45. bool rgb_enabled_flag; // Current LED state flag. If false then LED is off.
  46. bool rgb_time_out_enable; // Idle LED toggle enable. If false then LED will not turn off after idle timeout.
  47. bool rgb_time_out_fast_mode_enabled; // Enable flag for RGB timeout fast mode
  48. bool rgb_time_out_user_value; // This holds the toggle value set by user with ROUT_TG. It's necessary as RGB_TOG changes timeout enable.
  49. uint16_t rgb_time_out_seconds; // Idle LED timeout value, in seconds not milliseconds
  50. uint16_t rgb_time_out_saved_seconds; // The saved user config for RGB timeout period
  51. led_flags_t rgb_time_out_saved_flag; // Store LED flag before timeout so it can be restored when LED is turned on again.
  52. enum layout_names {
  53. _KL=0, // Keys Layout: The main keyboard layout that has all the characters
  54. _FL, // Function Layout: The function key activated layout with default functions and some added ones
  55. _GL, // GIT Layout: GIT shortcuts and macros
  56. _NUMPAD, // Numpad Layout: Adds a numpad to the keys
  57. };
  58. // Tap Dance keycodes
  59. enum td_keycodes {
  60. TD_FN_SWITCH = 0
  61. };
  62. // Define a type containing as many tapdance states as you need
  63. typedef enum {
  64. TD_NONE,
  65. TD_UNKNOWN,
  66. TD_SINGLE_HOLD,
  67. TD_DOUBLE_HOLD
  68. } td_state_t;
  69. typedef struct {
  70. bool is_press_action;
  71. td_state_t state;
  72. } td_tap_t;
  73. // Declare your tapdance functions:
  74. // Function to determine the current tapdance state
  75. td_state_t cur_dance(tap_dance_state_t *state);
  76. // `finished` and `reset` functions for each tapdance keycode
  77. void fn_tap_finished(tap_dance_state_t *state, void *user_data);
  78. void fn_tap_reset(tap_dance_state_t *state, void *user_data);
  79. enum ctrl_keycodes {
  80. MD_BOOT = SAFE_RANGE, // Restart into bootloader after hold timeout
  81. ROUT_TG, // Timeout Toggle. Toggle idle LED time out on or off
  82. ROUT_VI, // Timeout Value Increase. Increase idle time out before LED disabled
  83. ROUT_VD, // Timeout Value Decrease. Decrease idle time out before LED disabled
  84. ROUT_FM, // RGB timeout fast mode toggle
  85. TOG_NPD, // Toggle Numpad On/Off
  86. COPY_ALL, // Copy all text using ctrl(a+c)
  87. };
  88. enum string_macro_keycodes {
  89. // The start of this enum should always be equal to end of ctrl_keycodes + 1
  90. G_INIT = COPY_ALL + 1, // git init
  91. G_CLONE, // git clone
  92. G_ADD, // git add
  93. G_DIFF, // git diff
  94. G_RESET, // git reset --soft
  95. G_BRANH, // git branch list
  96. G_CHECK, // git checkout
  97. G_REMTE, // git remote add
  98. G_FETCH, // git fetch
  99. G_PULL, // git pull
  100. G_PUPST, // git pull upstream
  101. G_PUSH, // git push
  102. G_PSORG, // git push -u origin
  103. G_PSFWL, // git push --force-with-lease
  104. G_COMM, // git commit
  105. G_COMSG, // git commit -m ": [TFS-]"
  106. G_STAT, // git status
  107. G_LOG, // git log
  108. };
  109. static uint16_t idle_timer; // Idle LED timeout timer
  110. static uint8_t idle_second_counter; // Idle LED seconds counter, counts seconds not milliseconds
  111. static uint8_t key_event_counter; // This counter is used to check if any keys are being held
  112. static const char * sendstring_commands[] = {
  113. "git init",
  114. "git clone ",
  115. "git add ",
  116. "git diff ",
  117. "git reset --soft ",
  118. "git branch --list",
  119. "git checkout ",
  120. "git remote add ",
  121. "git fetch ",
  122. "git pull",
  123. "git pull upstream ",
  124. "git push",
  125. "git push -u origin ",
  126. "git push --force-with-lease",
  127. "git commit ",
  128. "git commit -m \": [TFS-]\"",
  129. "git status",
  130. "git log",
  131. };
  132. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  133. [_KL] = LAYOUT(
  134. // ESC F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 PRINT SCLCK PAUSE
  135. KC_ESC , 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_PSCR, KC_SCRL,RCS(KC_M),
  136. // ~ 1 2 3 4 5 6 7 8 9 0 - = BCKSP INS HOME PGUP
  137. 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, KC_INS , KC_HOME, KC_PGUP,
  138. // TAB Q W E R T Y U I O P [ ] \ DEL END PGDN
  139. 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, KC_DEL , KC_END , KC_PGDN,
  140. // CAPS A S D F G H J K L ; ' ENTER
  141. KC_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 ,
  142. // SHIFT Z X C V B N M , . / RSHIFT UP
  143. SC_LSPO, KC_Z , KC_X , KC_C , KC_V , KC_B , KC_N , KC_M , KC_COMM, KC_DOT , KC_SLSH, SC_RSPC, KC_UP ,
  144. // CTRL GUI ALT SPACE RALT MENU RGUI RCTRL LEFT DOWN RIGHT
  145. KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, TD(TD_FN_SWITCH), KC_RALT, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
  146. ),
  147. [_FL] = LAYOUT(
  148. // ESC F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 PRINT SCLCK PAUSE
  149. _______, ROUT_TG, ROUT_FM, ROUT_VD, ROUT_VI, _______, _______, _______, _______, _______, _______, KC_WAKE, KC_SLEP, KC_PAUS, _______, KC_MUTE,
  150. // ~ 1 2 3 4 5 6 7 8 9 0 - = BCKSP INS HOME PGUP
  151. RGB_TOG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MSTP, KC_MPLY, KC_VOLU,
  152. // TAB Q W E R T Y U I O P [ ] \ DEL END PGDN
  153. _______, RGB_MOD, RGB_SPI, RGB_VAI, RGB_HUI, RGB_SAI, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPRV, KC_MNXT, KC_VOLD,
  154. // CAPS A S D F G H J K L ; ' ENTER
  155. _______,RGB_RMOD, RGB_SPD, RGB_VAD, RGB_HUD, RGB_SAD, _______, _______, _______, _______, _______, _______, _______,
  156. // SHIFT Z X C V B N M , . / RSHIFT UP
  157. _______, _______, _______,COPY_ALL, _______, MD_BOOT, NK_TOGG, _______, _______, _______, _______, TOG_NPD, KC_BRIU,
  158. // CTRL GUI ALT SPACE RALT MENU RGUI RCTRL LEFT DOWN RIGHT
  159. _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_BRID, _______
  160. ),
  161. [_GL] = LAYOUT(
  162. // ESC F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 PRINT SCLCK PAUSE
  163. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  164. // ~ 1 2 3 4 5 6 7 8 9 0 - = BCKSP INS HOME PGUP
  165. G_INIT, G_CLONE, G_REMTE, G_RESET, G_PSFWL, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  166. // TAB Q W E R T Y U I O P [ ] \ DEL END PGDN
  167. _______, G_PUPST, G_PULL, G_PSORG, G_PUSH, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  168. // CAPS A S D F G H J K L ; ' ENTER
  169. _______, G_ADD, G_STAT, G_DIFF, G_FETCH, _______, _______, _______, _______, _______, _______, _______, _______,
  170. // SHIFT Z X C V B N M , . / RSHIFT UP
  171. _______, G_LOG, G_CHECK, G_COMM, G_COMSG, G_BRANH, _______, _______, _______, _______, _______, _______, _______,
  172. // CTRL GUI ALT SPACE RALT MENU RGUI RCTRL LEFT DOWN RIGHT
  173. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
  174. ),
  175. [_NUMPAD] = LAYOUT(
  176. // ESC F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 PRINT SCLCK PAUSE
  177. TOG_NPD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  178. // ~ 1 2 3 4 5 6 7 8 9 0 - = BCKSP INS HOME PGUP
  179. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  180. // TAB Q W E R T Y U I O P [ ] \ DEL END PGDN
  181. _______, _______, _______, _______, _______, _______, KC_P7, KC_P8, KC_P9, _______, _______, _______, _______, _______, _______, _______, _______,
  182. // CAPS A S D F G H J K L ; ' ENTER
  183. _______, _______, _______, _______, _______, _______, KC_P4, KC_P5, KC_P6, _______, _______, _______, _______,
  184. // SHIFT Z X C V B N M , . / RSHIFT UP
  185. _______, _______, _______, _______, _______, KC_P1, KC_P2, KC_P3, KC_PDOT, _______, _______, _______, _______,
  186. // CTRL GUI ALT SPACE RALT MENU RGUI RCTRL LEFT DOWN RIGHT
  187. _______, _______, _______, KC_P0, _______, _______, _______, _______, _______, _______, _______
  188. ),
  189. /*
  190. [X] = LAYOUT(
  191. // ESC F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 PRINT SCLCK PAUSE
  192. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  193. // ~ 1 2 3 4 5 6 7 8 9 0 - = BCKSP INS HOME PGUP
  194. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  195. // TAB Q W E R T Y U I O P [ ] \ DEL END PGDN
  196. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  197. // CAPS A S D F G H J K L ; ' ENTER
  198. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  199. // SHIFT Z X C V B N M , . / RSHIFT UP
  200. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  201. // CTRL GUI ALT SPACE RALT MENU RGUI RCTRL LEFT DOWN RIGHT
  202. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
  203. ),
  204. */
  205. };
  206. #define __OFF__ {0, 0, 0}
  207. const uint8_t PROGMEM ledmap[][RGB_MATRIX_LED_COUNT][3] = {
  208. [_FL] = {
  209. // These remain on base layer rgb to see adjustments ;)
  210. // |----------------------------------|
  211. // _______, ROUT_TG, ROUT_FM, ROUT_VD, ROUT_VI, _______, _______, _______, _______, _______, _______, KC_WAKE, KC_SLEP, KC_PAUS, _______, KC_MUTE,
  212. __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, YELLOW, YELLOW, ORANGE, __OFF__, GOLD,
  213. // RGB_TOG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MSTP, KC_MPLY, KC_VOLU,
  214. GOLD, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, RED, SPRING, ORANGE,
  215. // _______, RGB_MOD, RGB_SPI, RGB_VAI, RGB_HUI, RGB_SAI, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPRV, KC_MNXT, KC_VOLD,
  216. __OFF__, ORANGE, GREEN, AZURE, GOLDEN, MAGENT, __OFF__, AZURE, AZURE, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, TEAL, TEAL, ORANGE,
  217. // _______,RGB_RMOD, RGB_SPD, RGB_VAD, RGB_HUD, RGB_SAD, _______, _______, _______, _______, _______, _______, _______,
  218. __OFF__, ORANGE, GREEN, AZURE, GOLDEN, MAGENT, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__,
  219. // _______, _______, _______,COPY_ALL, _______, MD_BOOT, NK_TOGG, _______, _______, _______, _______, TO(_NUMPAD), KC_BRIU,
  220. __OFF__, __OFF__, __OFF__, CORAL, __OFF__, RED, TURQ, __OFF__, __OFF__, __OFF__, __OFF__, CYAN, SPRING,
  221. // _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_BRID, _______
  222. __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, SPRING, __OFF__
  223. },
  224. [_GL] = {
  225. // _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  226. __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__,
  227. // G_INIT, G_CLONE, G_REMTE, G_RESET, G_PSFWL, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  228. AZURE, CHART, CHART, RED, CORAL, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__,
  229. // _______, G_PUPST, G_PULL, G_PSORG, G_PUSH, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  230. __OFF__, BLUE, PURPLE, MAGENT, PINK, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__,
  231. // _______, G_ADD, G_STAT, G_DIFF, G_FETCH, _______, _______, _______, _______, _______, _______, _______, _______,
  232. __OFF__, SPRING, GREEN, TURQ, TEAL, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__,
  233. // _______, G_LOG, G_CHECK, G_COMM, G_COMSG, G_BRANH, _______, _______, _______, _______, _______, _______, _______,
  234. __OFF__, CYAN, GOLDEN, YELLOW, GOLD, CHART, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__,
  235. // _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
  236. __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__
  237. },
  238. [_NUMPAD] = {
  239. // TO(_KL), _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  240. RED, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__,
  241. // _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  242. __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__,
  243. // _______, _______, _______, _______, _______, _______, KC_P7, KC_P8, KC_P9, _______, _______, _______, _______, _______, _______, _______, _______,
  244. __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, GREEN, GREEN, GREEN, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__,
  245. // _______, _______, _______, _______, _______, _______, KC_P4, KC_P5, KC_P6, _______, _______, _______, _______,
  246. __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, TURQ, TURQ, TURQ, __OFF__, __OFF__, __OFF__, __OFF__,
  247. // _______, _______, _______, _______, _______, _______, KC_P1, KC_P2, KC_P3, KC_PDOT, _______, _______, _______,
  248. __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, CYAN, CYAN, CYAN, AZURE, __OFF__, __OFF__, __OFF__, __OFF__,
  249. // _______, _______, _______, KC_P0, _______, _______, _______, _______, _______, _______, _______
  250. __OFF__, __OFF__, __OFF__, CYAN, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__
  251. },
  252. };
  253. // Runs just one time when the keyboard initializes.
  254. void matrix_init_user(void) {
  255. // Enable or disable debugging
  256. debug_enable = false;
  257. debug_matrix = false;
  258. debug_keyboard = false;
  259. debug_mouse = false;
  260. idle_second_counter = 0; // Counter for number of seconds keyboard has been idle.
  261. key_event_counter = 0; // Counter to determine if keys are being held, neutral at 0.
  262. rgb_time_out_seconds = RGB_DEFAULT_TIME_OUT; // RGB timeout initialized to its default configure in keymap.h
  263. rgb_time_out_enable = false; // Disable RGB timeout by default. Enable using toggle key.
  264. rgb_time_out_user_value = false; // Has to have the same initial value as rgb_time_out_enable.
  265. rgb_enabled_flag = true; // Initially, keyboard RGB is enabled. Change to false config.h initializes RGB disabled.
  266. rgb_time_out_fast_mode_enabled = false; // RGB timeout fast mode disabled initially.
  267. rgb_time_out_saved_flag = rgb_matrix_get_flags(); // Save RGB matrix state for when keyboard comes back from ide.
  268. };
  269. void keyboard_post_init_user(void) {
  270. rgb_matrix_enable();
  271. }
  272. // Runs constantly in the background, in a loop.
  273. void matrix_scan_user(void) {
  274. if(rgb_time_out_enable && rgb_enabled_flag) {
  275. // If the key event counter is not zero then some key was pressed down but not released, thus reset the timeout counter.
  276. if (key_event_counter) {
  277. idle_second_counter = 0;
  278. } else if (timer_elapsed(idle_timer) > MILLISECONDS_IN_SECOND) {
  279. idle_second_counter++;
  280. idle_timer = timer_read();
  281. }
  282. if (idle_second_counter >= rgb_time_out_seconds) {
  283. rgb_time_out_saved_flag = rgb_matrix_get_flags();
  284. rgb_matrix_set_flags(LED_FLAG_NONE);
  285. rgb_matrix_disable_noeeprom();
  286. rgb_enabled_flag = false;
  287. idle_second_counter = 0;
  288. }
  289. }
  290. };
  291. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  292. static uint32_t key_timer;
  293. // Increment key event counter for every press and decrement for every release.
  294. if (record->event.pressed) {
  295. key_event_counter++;
  296. } else {
  297. key_event_counter--;
  298. }
  299. if (rgb_time_out_enable) {
  300. idle_timer = timer_read();
  301. // Reset the seconds counter. Without this, something like press> leave x seconds> press, would be x seconds on the effective counter not 0 as it should.
  302. idle_second_counter = 0;
  303. if (!rgb_enabled_flag) {
  304. rgb_matrix_enable_noeeprom();
  305. rgb_matrix_set_flags(rgb_time_out_saved_flag);
  306. rgb_enabled_flag = true;
  307. }
  308. }
  309. switch (keycode) {
  310. case MD_BOOT:
  311. if (record->event.pressed) {
  312. key_timer = timer_read32();
  313. } else {
  314. if (timer_elapsed32(key_timer) >= 500) {
  315. reset_keyboard();
  316. }
  317. }
  318. return false;
  319. }
  320. if (record->event.pressed) {
  321. switch (keycode) {
  322. case RGB_TOG:
  323. rgb_time_out_enable = rgb_time_out_user_value;
  324. switch (rgb_matrix_get_flags()) {
  325. case LED_FLAG_ALL: {
  326. rgb_matrix_set_flags(LED_FLAG_KEYLIGHT | LED_FLAG_MODIFIER);
  327. rgb_matrix_set_color_all(0, 0, 0);
  328. }
  329. break;
  330. case LED_FLAG_KEYLIGHT | LED_FLAG_MODIFIER: {
  331. rgb_matrix_set_flags(LED_FLAG_UNDERGLOW);
  332. rgb_matrix_set_color_all(0, 0, 0);
  333. }
  334. break;
  335. case LED_FLAG_UNDERGLOW: {
  336. // This line is for LED idle timer. It disables the toggle so you can turn off LED completely if you like
  337. rgb_time_out_enable = false;
  338. rgb_matrix_set_flags(LED_FLAG_NONE);
  339. rgb_matrix_disable_noeeprom();
  340. }
  341. break;
  342. default: {
  343. rgb_matrix_set_flags(LED_FLAG_ALL);
  344. rgb_matrix_enable_noeeprom();
  345. }
  346. break;
  347. }
  348. return false;
  349. // ======================================================== CUSTOM KEYCOADS BELOW ========================================================
  350. case COPY_ALL:
  351. // Selects all and text and copy
  352. SEND_STRING(SS_LCTL("ac"));
  353. return false;
  354. case ROUT_TG:
  355. // Toggle idle LED timeout on or off
  356. rgb_time_out_enable = !rgb_time_out_enable;
  357. rgb_time_out_user_value = rgb_time_out_enable;
  358. return false;
  359. case ROUT_VI:
  360. // Increase idle LED timeout value in seconds
  361. // Only increase if current value is lower than RGB_TIME_OUT_MAX. Don't care what value the result will be
  362. // Modity RGB_TIME_OUT_STEP for bigger or smaller increments
  363. if (!rgb_time_out_fast_mode_enabled && rgb_time_out_seconds <= RGB_TIME_OUT_MAX) {
  364. rgb_time_out_seconds += RGB_TIME_OUT_STEP;
  365. }
  366. return false;
  367. case ROUT_VD:
  368. // Decrease idle LED timeout value in seconds
  369. // Only decrease if current value is higher than minimum value and the result is larger than zero
  370. // Modity RGB_TIME_OUT_STEP for bigger or smaller decrements
  371. if (!rgb_time_out_fast_mode_enabled && rgb_time_out_seconds > RGB_TIME_OUT_MIN) {
  372. rgb_time_out_seconds -= RGB_TIME_OUT_STEP;
  373. }
  374. return false;
  375. case ROUT_FM:
  376. if (rgb_time_out_fast_mode_enabled) {
  377. rgb_time_out_seconds = rgb_time_out_saved_seconds;
  378. } else {
  379. rgb_time_out_saved_seconds = rgb_time_out_seconds;
  380. rgb_time_out_seconds = RGB_FAST_MODE_TIME_OUT;
  381. }
  382. rgb_time_out_fast_mode_enabled = !rgb_time_out_fast_mode_enabled;
  383. return false;
  384. case G_INIT ... G_LOG:
  385. send_string_with_delay(sendstring_commands[keycode - G_INIT], 5);
  386. return false;
  387. case TOG_NPD:
  388. if (get_highest_layer(layer_state) != _NUMPAD) {
  389. layer_move(_NUMPAD);
  390. } else {
  391. layer_move(_KL);
  392. }
  393. return false;
  394. }
  395. }
  396. return true;
  397. }
  398. void set_layer_color(int layer) {
  399. if (layer == 0) { return; }
  400. for (int i = 0; i < RGB_MATRIX_LED_COUNT; i++) {
  401. HSV hsv = {
  402. .h = pgm_read_byte(&ledmap[layer][i][0]),
  403. .s = pgm_read_byte(&ledmap[layer][i][1]),
  404. .v = pgm_read_byte(&ledmap[layer][i][2]),
  405. };
  406. if (hsv.h || hsv.s || hsv.v) {
  407. RGB rgb = hsv_to_rgb(hsv);
  408. float f = (float)rgb_matrix_config.hsv.v / UINT8_MAX;
  409. rgb_matrix_set_color(i, f * rgb.r, f * rgb.g, f * rgb.b);
  410. continue;
  411. }
  412. if(layer == _FL && i <= 4 && i >= 1) {
  413. continue; // Leave RGB for F1-F4 of function layer to adjust RGB settings
  414. }
  415. rgb_matrix_set_color(i, 0, 0, 0);
  416. }
  417. }
  418. bool rgb_matrix_indicators_user(void) {
  419. if (disable_layer_color ||
  420. rgb_matrix_get_flags() == LED_FLAG_NONE ||
  421. rgb_matrix_get_flags() == LED_FLAG_UNDERGLOW) {
  422. return;
  423. }
  424. set_layer_color(get_highest_layer(layer_state));
  425. return false;
  426. }
  427. td_state_t cur_dance(tap_dance_state_t *state) {
  428. if (state->pressed && !state->interrupted) {
  429. if (state->count == 1) { return TD_SINGLE_HOLD; }
  430. return TD_DOUBLE_HOLD;
  431. }
  432. return TD_UNKNOWN;
  433. }
  434. static td_tap_t fn_tap_state = {
  435. .is_press_action = true,
  436. .state = TD_NONE
  437. };
  438. void fn_tap_finished(tap_dance_state_t *state, void *user_data) {
  439. fn_tap_state.state = cur_dance(state);
  440. switch (fn_tap_state.state) {
  441. case TD_SINGLE_HOLD:
  442. // set function layer
  443. layer_move(_FL);
  444. break;
  445. case TD_DOUBLE_HOLD:
  446. // set git layer
  447. layer_move(_GL);
  448. break;
  449. case TD_UNKNOWN:
  450. register_code(KC_APP);
  451. break;
  452. default:
  453. break;
  454. }
  455. }
  456. void fn_tap_reset(tap_dance_state_t *state, void *user_data) {
  457. switch (fn_tap_state.state) {
  458. case TD_UNKNOWN:
  459. unregister_code(KC_APP);
  460. break;
  461. case TD_DOUBLE_HOLD:
  462. case TD_SINGLE_HOLD:
  463. // Set default layer if we didn't activate numpad layer in function
  464. if (get_highest_layer(layer_state) != _NUMPAD) {
  465. layer_move(_KL);
  466. }
  467. break;
  468. break;
  469. default:
  470. break;
  471. }
  472. fn_tap_state.state = TD_NONE;
  473. }
  474. tap_dance_action_t tap_dance_actions[] = {
  475. [TD_FN_SWITCH] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, fn_tap_finished, fn_tap_reset)
  476. };