keymap.c 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411
  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 "keymap.h"
  17. static uint16_t idle_timer; // Idle LED timeout timer
  18. static uint8_t idle_second_counter; // Idle LED seconds counter, counts seconds not milliseconds
  19. static uint8_t key_event_counter; // This counter is used to check if any keys are being held
  20. static const char * sendstring_commands[] = {
  21. "git init",
  22. "git clone ",
  23. "git add ",
  24. "git diff ",
  25. "git reset --soft ",
  26. "git branch --list",
  27. "git checkout ",
  28. "git remote add ",
  29. "git fetch ",
  30. "git pull",
  31. "git pull upstream ",
  32. "git push",
  33. "git push -u origin ",
  34. "git push --force-with-lease",
  35. "git commit ",
  36. "git commit -m \": [TFS-]\"",
  37. "git status",
  38. "git log",
  39. };
  40. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  41. [_KL] = LAYOUT(
  42. // ESC F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 PRINT SCLCK PAUSE
  43. 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),
  44. // ~ 1 2 3 4 5 6 7 8 9 0 - = BCKSP INS HOME PGUP
  45. 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,
  46. // TAB Q W E R T Y U I O P [ ] \ DEL END PGDN
  47. 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,
  48. // CAPS A S D F G H J K L ; ' ENTER
  49. 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 ,
  50. // SHIFT Z X C V B N M , . / RSHIFT UP
  51. 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 ,
  52. // CTRL GUI ALT SPACE RALT MENU RGUI RCTRL LEFT DOWN RIGHT
  53. KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, TD(TD_FN_SWITCH), KC_RALT, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
  54. ),
  55. [_FL] = LAYOUT(
  56. // ESC F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 PRINT SCLCK PAUSE
  57. _______, ROUT_TG, ROUT_FM, ROUT_VD, ROUT_VI, _______, _______, _______, _______, _______, _______, KC_WAKE, KC_SLEP, KC_PAUS, _______, KC_MUTE,
  58. // ~ 1 2 3 4 5 6 7 8 9 0 - = BCKSP INS HOME PGUP
  59. RGB_TOG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MSTP, KC_MPLY, KC_VOLU,
  60. // TAB Q W E R T Y U I O P [ ] \ DEL END PGDN
  61. _______, RGB_MOD, RGB_SPI, RGB_VAI, RGB_HUI, RGB_SAI, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPRV, KC_MNXT, KC_VOLD,
  62. // CAPS A S D F G H J K L ; ' ENTER
  63. _______,RGB_RMOD, RGB_SPD, RGB_VAD, RGB_HUD, RGB_SAD, _______, _______, _______, _______, _______, _______, _______,
  64. // SHIFT Z X C V B N M , . / RSHIFT UP
  65. _______, _______, _______,COPY_ALL, _______, MD_BOOT, NK_TOGG, _______, _______, _______, _______, TOG_NPD, KC_BRIU,
  66. // CTRL GUI ALT SPACE RALT MENU RGUI RCTRL LEFT DOWN RIGHT
  67. _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_BRID, _______
  68. ),
  69. [_GL] = LAYOUT(
  70. // ESC F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 PRINT SCLCK PAUSE
  71. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  72. // ~ 1 2 3 4 5 6 7 8 9 0 - = BCKSP INS HOME PGUP
  73. G_INIT, G_CLONE, G_REMTE, G_RESET, G_PSFWL, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  74. // TAB Q W E R T Y U I O P [ ] \ DEL END PGDN
  75. _______, G_PUPST, G_PULL, G_PSORG, G_PUSH, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  76. // CAPS A S D F G H J K L ; ' ENTER
  77. _______, G_ADD, G_STAT, G_DIFF, G_FETCH, _______, _______, _______, _______, _______, _______, _______, _______,
  78. // SHIFT Z X C V B N M , . / RSHIFT UP
  79. _______, G_LOG, G_CHECK, G_COMM, G_COMSG, G_BRANH, _______, _______, _______, _______, _______, _______, _______,
  80. // CTRL GUI ALT SPACE RALT MENU RGUI RCTRL LEFT DOWN RIGHT
  81. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
  82. ),
  83. [_NUMPAD] = LAYOUT(
  84. // ESC F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 PRINT SCLCK PAUSE
  85. TOG_NPD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  86. // ~ 1 2 3 4 5 6 7 8 9 0 - = BCKSP INS HOME PGUP
  87. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  88. // TAB Q W E R T Y U I O P [ ] \ DEL END PGDN
  89. _______, _______, _______, _______, _______, _______, KC_P7, KC_P8, KC_P9, _______, _______, _______, _______, _______, _______, _______, _______,
  90. // CAPS A S D F G H J K L ; ' ENTER
  91. _______, _______, _______, _______, _______, _______, KC_P4, KC_P5, KC_P6, _______, _______, _______, _______,
  92. // SHIFT Z X C V B N M , . / RSHIFT UP
  93. _______, _______, _______, _______, _______, KC_P1, KC_P2, KC_P3, KC_PDOT, _______, _______, _______, _______,
  94. // CTRL GUI ALT SPACE RALT MENU RGUI RCTRL LEFT DOWN RIGHT
  95. _______, _______, _______, KC_P0, _______, _______, _______, _______, _______, _______, _______
  96. ),
  97. /*
  98. [X] = LAYOUT(
  99. // ESC F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 PRINT SCLCK PAUSE
  100. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  101. // ~ 1 2 3 4 5 6 7 8 9 0 - = BCKSP INS HOME PGUP
  102. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  103. // TAB Q W E R T Y U I O P [ ] \ DEL END PGDN
  104. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  105. // CAPS A S D F G H J K L ; ' ENTER
  106. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  107. // SHIFT Z X C V B N M , . / RSHIFT UP
  108. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  109. // CTRL GUI ALT SPACE RALT MENU RGUI RCTRL LEFT DOWN RIGHT
  110. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
  111. ),
  112. */
  113. };
  114. #define __OFF__ {0, 0, 0}
  115. const uint8_t PROGMEM ledmap[][RGB_MATRIX_LED_COUNT][3] = {
  116. [_FL] = {
  117. // These remain on base layer rgb to see adjustments ;)
  118. // |----------------------------------|
  119. // _______, ROUT_TG, ROUT_FM, ROUT_VD, ROUT_VI, _______, _______, _______, _______, _______, _______, KC_WAKE, KC_SLEP, KC_PAUS, _______, KC_MUTE,
  120. __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, YELLOW, YELLOW, ORANGE, __OFF__, GOLD,
  121. // RGB_TOG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MSTP, KC_MPLY, KC_VOLU,
  122. GOLD, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, RED, SPRING, ORANGE,
  123. // _______, RGB_MOD, RGB_SPI, RGB_VAI, RGB_HUI, RGB_SAI, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPRV, KC_MNXT, KC_VOLD,
  124. __OFF__, ORANGE, GREEN, AZURE, GOLDEN, MAGENT, __OFF__, AZURE, AZURE, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, TEAL, TEAL, ORANGE,
  125. // _______,RGB_RMOD, RGB_SPD, RGB_VAD, RGB_HUD, RGB_SAD, _______, _______, _______, _______, _______, _______, _______,
  126. __OFF__, ORANGE, GREEN, AZURE, GOLDEN, MAGENT, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__,
  127. // _______, _______, _______,COPY_ALL, _______, MD_BOOT, NK_TOGG, _______, _______, _______, _______, TO(_NUMPAD), KC_BRIU,
  128. __OFF__, __OFF__, __OFF__, CORAL, __OFF__, RED, TURQ, __OFF__, __OFF__, __OFF__, __OFF__, CYAN, SPRING,
  129. // _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_BRID, _______
  130. __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, SPRING, __OFF__
  131. },
  132. [_GL] = {
  133. // _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  134. __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__,
  135. // G_INIT, G_CLONE, G_REMTE, G_RESET, G_PSFWL, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  136. AZURE, CHART, CHART, RED, CORAL, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__,
  137. // _______, G_PUPST, G_PULL, G_PSORG, G_PUSH, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  138. __OFF__, BLUE, PURPLE, MAGENT, PINK, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__,
  139. // _______, G_ADD, G_STAT, G_DIFF, G_FETCH, _______, _______, _______, _______, _______, _______, _______, _______,
  140. __OFF__, SPRING, GREEN, TURQ, TEAL, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__,
  141. // _______, G_LOG, G_CHECK, G_COMM, G_COMSG, G_BRANH, _______, _______, _______, _______, _______, _______, _______,
  142. __OFF__, CYAN, GOLDEN, YELLOW, GOLD, CHART, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__,
  143. // _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
  144. __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__
  145. },
  146. [_NUMPAD] = {
  147. // TO(_KL), _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  148. RED, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__,
  149. // _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  150. __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__,
  151. // _______, _______, _______, _______, _______, _______, KC_P7, KC_P8, KC_P9, _______, _______, _______, _______, _______, _______, _______, _______,
  152. __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, GREEN, GREEN, GREEN, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__,
  153. // _______, _______, _______, _______, _______, _______, KC_P4, KC_P5, KC_P6, _______, _______, _______, _______,
  154. __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, TURQ, TURQ, TURQ, __OFF__, __OFF__, __OFF__, __OFF__,
  155. // _______, _______, _______, _______, _______, _______, KC_P1, KC_P2, KC_P3, KC_PDOT, _______, _______, _______,
  156. __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, CYAN, CYAN, CYAN, AZURE, __OFF__, __OFF__, __OFF__, __OFF__,
  157. // _______, _______, _______, KC_P0, _______, _______, _______, _______, _______, _______, _______
  158. __OFF__, __OFF__, __OFF__, CYAN, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__
  159. },
  160. };
  161. // Runs just one time when the keyboard initializes.
  162. void matrix_init_user(void) {
  163. // Enable or disable debugging
  164. debug_enable = false;
  165. debug_matrix = false;
  166. debug_keyboard = false;
  167. debug_mouse = false;
  168. idle_second_counter = 0; // Counter for number of seconds keyboard has been idle.
  169. key_event_counter = 0; // Counter to determine if keys are being held, neutral at 0.
  170. rgb_time_out_seconds = RGB_DEFAULT_TIME_OUT; // RGB timeout initialized to its default configure in keymap.h
  171. rgb_time_out_enable = false; // Disable RGB timeout by default. Enable using toggle key.
  172. rgb_time_out_user_value = false; // Has to have the same initial value as rgb_time_out_enable.
  173. rgb_enabled_flag = true; // Initially, keyboard RGB is enabled. Change to false config.h initializes RGB disabled.
  174. rgb_time_out_fast_mode_enabled = false; // RGB timeout fast mode disabled initially.
  175. rgb_time_out_saved_flag = rgb_matrix_get_flags(); // Save RGB matrix state for when keyboard comes back from ide.
  176. };
  177. void keyboard_post_init_user(void) {
  178. rgb_matrix_enable();
  179. }
  180. // Runs constantly in the background, in a loop.
  181. void matrix_scan_user(void) {
  182. if(rgb_time_out_enable && rgb_enabled_flag) {
  183. // If the key event counter is not zero then some key was pressed down but not released, thus reset the timeout counter.
  184. if (key_event_counter) {
  185. idle_second_counter = 0;
  186. } else if (timer_elapsed(idle_timer) > MILLISECONDS_IN_SECOND) {
  187. idle_second_counter++;
  188. idle_timer = timer_read();
  189. }
  190. if (idle_second_counter >= rgb_time_out_seconds) {
  191. rgb_time_out_saved_flag = rgb_matrix_get_flags();
  192. rgb_matrix_set_flags(LED_FLAG_NONE);
  193. rgb_matrix_disable_noeeprom();
  194. rgb_enabled_flag = false;
  195. idle_second_counter = 0;
  196. }
  197. }
  198. };
  199. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  200. static uint32_t key_timer;
  201. // Increment key event counter for every press and decrement for every release.
  202. if (record->event.pressed) {
  203. key_event_counter++;
  204. } else {
  205. key_event_counter--;
  206. }
  207. if (rgb_time_out_enable) {
  208. idle_timer = timer_read();
  209. // 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.
  210. idle_second_counter = 0;
  211. if (!rgb_enabled_flag) {
  212. rgb_matrix_enable_noeeprom();
  213. rgb_matrix_set_flags(rgb_time_out_saved_flag);
  214. rgb_enabled_flag = true;
  215. }
  216. }
  217. switch (keycode) {
  218. case MD_BOOT:
  219. if (record->event.pressed) {
  220. key_timer = timer_read32();
  221. } else {
  222. if (timer_elapsed32(key_timer) >= 500) {
  223. reset_keyboard();
  224. }
  225. }
  226. return false;
  227. }
  228. if (record->event.pressed) {
  229. switch (keycode) {
  230. case RGB_TOG:
  231. rgb_time_out_enable = rgb_time_out_user_value;
  232. switch (rgb_matrix_get_flags()) {
  233. case LED_FLAG_ALL: {
  234. rgb_matrix_set_flags(LED_FLAG_KEYLIGHT | LED_FLAG_MODIFIER);
  235. rgb_matrix_set_color_all(0, 0, 0);
  236. }
  237. break;
  238. case LED_FLAG_KEYLIGHT | LED_FLAG_MODIFIER: {
  239. rgb_matrix_set_flags(LED_FLAG_UNDERGLOW);
  240. rgb_matrix_set_color_all(0, 0, 0);
  241. }
  242. break;
  243. case LED_FLAG_UNDERGLOW: {
  244. // This line is for LED idle timer. It disables the toggle so you can turn off LED completely if you like
  245. rgb_time_out_enable = false;
  246. rgb_matrix_set_flags(LED_FLAG_NONE);
  247. rgb_matrix_disable_noeeprom();
  248. }
  249. break;
  250. default: {
  251. rgb_matrix_set_flags(LED_FLAG_ALL);
  252. rgb_matrix_enable_noeeprom();
  253. }
  254. break;
  255. }
  256. return false;
  257. // ======================================================== CUSTOM KEYCOADS BELOW ========================================================
  258. case COPY_ALL:
  259. // Selects all and text and copy
  260. SEND_STRING(SS_LCTL("ac"));
  261. return false;
  262. case ROUT_TG:
  263. // Toggle idle LED timeout on or off
  264. rgb_time_out_enable = !rgb_time_out_enable;
  265. rgb_time_out_user_value = rgb_time_out_enable;
  266. return false;
  267. case ROUT_VI:
  268. // Increase idle LED timeout value in seconds
  269. // Only increase if current value is lower than RGB_TIME_OUT_MAX. Don't care what value the result will be
  270. // Modity RGB_TIME_OUT_STEP for bigger or smaller increments
  271. if (!rgb_time_out_fast_mode_enabled && rgb_time_out_seconds <= RGB_TIME_OUT_MAX) {
  272. rgb_time_out_seconds += RGB_TIME_OUT_STEP;
  273. }
  274. return false;
  275. case ROUT_VD:
  276. // Decrease idle LED timeout value in seconds
  277. // Only decrease if current value is higher than minimum value and the result is larger than zero
  278. // Modity RGB_TIME_OUT_STEP for bigger or smaller decrements
  279. if (!rgb_time_out_fast_mode_enabled && rgb_time_out_seconds > RGB_TIME_OUT_MIN) {
  280. rgb_time_out_seconds -= RGB_TIME_OUT_STEP;
  281. }
  282. return false;
  283. case ROUT_FM:
  284. if (rgb_time_out_fast_mode_enabled) {
  285. rgb_time_out_seconds = rgb_time_out_saved_seconds;
  286. } else {
  287. rgb_time_out_saved_seconds = rgb_time_out_seconds;
  288. rgb_time_out_seconds = RGB_FAST_MODE_TIME_OUT;
  289. }
  290. rgb_time_out_fast_mode_enabled = !rgb_time_out_fast_mode_enabled;
  291. return false;
  292. case G_INIT ... G_LOG:
  293. send_string_with_delay(sendstring_commands[keycode - G_INIT], 5);
  294. return false;
  295. case TOG_NPD:
  296. if (get_highest_layer(layer_state) != _NUMPAD) {
  297. layer_move(_NUMPAD);
  298. } else {
  299. layer_move(_KL);
  300. }
  301. return false;
  302. }
  303. }
  304. return true;
  305. }
  306. void set_layer_color(int layer) {
  307. if (layer == 0) { return; }
  308. for (int i = 0; i < RGB_MATRIX_LED_COUNT; i++) {
  309. HSV hsv = {
  310. .h = pgm_read_byte(&ledmap[layer][i][0]),
  311. .s = pgm_read_byte(&ledmap[layer][i][1]),
  312. .v = pgm_read_byte(&ledmap[layer][i][2]),
  313. };
  314. if (hsv.h || hsv.s || hsv.v) {
  315. RGB rgb = hsv_to_rgb(hsv);
  316. float f = (float)rgb_matrix_config.hsv.v / UINT8_MAX;
  317. rgb_matrix_set_color(i, f * rgb.r, f * rgb.g, f * rgb.b);
  318. continue;
  319. }
  320. if(layer == _FL && i <= 4 && i >= 1) {
  321. continue; // Leave RGB for F1-F4 of function layer to adjust RGB settings
  322. }
  323. rgb_matrix_set_color(i, 0, 0, 0);
  324. }
  325. }
  326. bool rgb_matrix_indicators_user(void) {
  327. if (disable_layer_color ||
  328. rgb_matrix_get_flags() == LED_FLAG_NONE ||
  329. rgb_matrix_get_flags() == LED_FLAG_UNDERGLOW) {
  330. return;
  331. }
  332. set_layer_color(get_highest_layer(layer_state));
  333. return false;
  334. }
  335. td_state_t cur_dance(tap_dance_state_t *state) {
  336. if (state->pressed && !state->interrupted) {
  337. if (state->count == 1) { return TD_SINGLE_HOLD; }
  338. return TD_DOUBLE_HOLD;
  339. }
  340. return TD_UNKNOWN;
  341. }
  342. static td_tap_t fn_tap_state = {
  343. .is_press_action = true,
  344. .state = TD_NONE
  345. };
  346. void fn_tap_finished(tap_dance_state_t *state, void *user_data) {
  347. fn_tap_state.state = cur_dance(state);
  348. switch (fn_tap_state.state) {
  349. case TD_SINGLE_HOLD:
  350. // set function layer
  351. layer_move(_FL);
  352. break;
  353. case TD_DOUBLE_HOLD:
  354. // set git layer
  355. layer_move(_GL);
  356. break;
  357. case TD_UNKNOWN:
  358. register_code(KC_APP);
  359. break;
  360. default:
  361. break;
  362. }
  363. }
  364. void fn_tap_reset(tap_dance_state_t *state, void *user_data) {
  365. switch (fn_tap_state.state) {
  366. case TD_UNKNOWN:
  367. unregister_code(KC_APP);
  368. break;
  369. case TD_DOUBLE_HOLD:
  370. case TD_SINGLE_HOLD:
  371. // Set default layer if we didn't activate numpad layer in function
  372. if (get_highest_layer(layer_state) != _NUMPAD) {
  373. layer_move(_KL);
  374. }
  375. break;
  376. break;
  377. default:
  378. break;
  379. }
  380. fn_tap_state.state = TD_NONE;
  381. }
  382. tap_dance_action_t tap_dance_actions[] = {
  383. [TD_FN_SWITCH] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, fn_tap_finished, fn_tap_reset)
  384. };