From caa70df816033c30dbbbf4c5a90d803c7bb1dfde Mon Sep 17 00:00:00 2001 From: Akaash Suresh Date: Thu, 9 Jan 2020 13:57:54 -0600 Subject: [Keymap] Userspace refactor, adding leader key functionality (#7790) * Userspace refactor * Fixed missed ifdef * tapcode16, adjust layout * glcdfont changes from #7745 * Modify Keymaps, add workman * RGB & OLED update --- users/curry/LICENSE | 14 ++ users/curry/LICENSE.md | 14 -- users/curry/config.h | 129 ++++++----- users/curry/curry.c | 19 +- users/curry/curry.h | 14 +- users/curry/glcdfont.c | 11 +- users/curry/leader.c | 24 ++ users/curry/leader.h | 3 + users/curry/oled.c | 13 +- users/curry/process_records.c | 27 +-- users/curry/process_records.h | 62 ++---- users/curry/rgb_lighting_user.c | 325 +++++++++++++++++++++++++++ users/curry/rgb_lighting_user.h | 19 ++ users/curry/rgb_matrix_user.c | 144 ++++++++++++ users/curry/rgb_matrix_user.h | 7 + users/curry/rgb_stuff.c | 471 ---------------------------------------- users/curry/rgb_stuff.h | 32 --- users/curry/rules.mk | 20 +- users/curry/tap_dances.c | 1 + users/curry/tap_dances.h | 2 - users/curry/wrappers.h | 30 ++- 21 files changed, 684 insertions(+), 697 deletions(-) create mode 100644 users/curry/LICENSE delete mode 100644 users/curry/LICENSE.md create mode 100644 users/curry/leader.c create mode 100644 users/curry/leader.h create mode 100644 users/curry/rgb_lighting_user.c create mode 100644 users/curry/rgb_lighting_user.h create mode 100644 users/curry/rgb_matrix_user.c create mode 100644 users/curry/rgb_matrix_user.h delete mode 100644 users/curry/rgb_stuff.c delete mode 100644 users/curry/rgb_stuff.h (limited to 'users') diff --git a/users/curry/LICENSE b/users/curry/LICENSE new file mode 100644 index 0000000000..198ae45b2e --- /dev/null +++ b/users/curry/LICENSE @@ -0,0 +1,14 @@ +Copyright 2020 Akaash Suresh casa.akaash@gmail.com @CurryFurious + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . diff --git a/users/curry/LICENSE.md b/users/curry/LICENSE.md deleted file mode 100644 index 198ae45b2e..0000000000 --- a/users/curry/LICENSE.md +++ /dev/null @@ -1,14 +0,0 @@ -Copyright 2020 Akaash Suresh casa.akaash@gmail.com @CurryFurious - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . diff --git a/users/curry/config.h b/users/curry/config.h index 45b8364e12..b982dab038 100644 --- a/users/curry/config.h +++ b/users/curry/config.h @@ -6,97 +6,82 @@ /* Set Polling rate to 1000Hz */ #define USB_POLLING_INTERVAL_MS 1 -#ifdef RGBLIGHT_ENABLE +#if defined(RGBLIGHT_ENABLE) # undef RGBLIGHT_ANIMATIONS -# if defined(__AVR__) && !defined(__AVR_AT90USB1286__) -# define RGBLIGHT_SLEEP -# define RGBLIGHT_EFFECT_BREATHING -# define RGBLIGHT_EFFECT_SNAKE -# define RGBLIGHT_EFFECT_KNIGHT -# else -# define RGBLIGHT_ANIMATIONS -# endif +# define RGBLIGHT_SLEEP +# define RGBLIGHT_EFFECT_BREATHING +# define RGBLIGHT_EFFECT_SNAKE +# define RGBLIGHT_EFFECT_KNIGHT #endif // RGBLIGHT_ENABLE -#ifdef RGB_MATRIX_ENABLE -# define RGB_MATRIX_KEYPRESSES // reacts to keypresses (will slow down matrix scan by a lot) -// # define RGB_MATRIX_KEYRELEASES // reacts to keyreleases (not recommened) +#if defined(RGB_MATRIX_ENABLE) +# define RGB_MATRIX_KEYPRESSES # define RGB_MATRIX_FRAMEBUFFER_EFFECTS -// # define RGB_DISABLE_AFTER_TIMEOUT 0 // number of ticks to wait until disabling effects -# define RGB_DISABLE_WHEN_USB_SUSPENDED true // turn off effects when suspended -// # define RGB_MATRIX_MAXIMUM_BRIGHTNESS 200 // limits maximum brightness of LEDs to 200 out of 255. If not defined maximum brightness is set to 255 -// # define EECONFIG_RGB_MATRIX (uint32_t *)16 - -# if defined(__AVR__) && !defined(__AVR_AT90USB1286__) -# define DISABLE_RGB_MATRIX_ALPHAS_MODS -# define DISABLE_RGB_MATRIX_GRADIENT_UP_DOWN -# define DISABLE_RGB_MATRIX_BREATHING -# define DISABLE_RGB_MATRIX_BAND_SAT -# define DISABLE_RGB_MATRIX_BAND_VAL -# define DISABLE_RGB_MATRIX_BAND_PINWHEEL_SAT -# define DISABLE_RGB_MATRIX_BAND_PINWHEEL_VAL -# define DISABLE_RGB_MATRIX_BAND_SPIRAL_SAT -# define DISABLE_RGB_MATRIX_BAND_SPIRAL_VAL -# define DISABLE_RGB_MATRIX_CYCLE_ALL -# define DISABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT -# define DISABLE_RGB_MATRIX_CYCLE_UP_DOWN -# define DISABLE_RGB_MATRIX_CYCLE_OUT_IN +# define RGB_DISABLE_WHEN_USB_SUSPENDED true + +# define DISABLE_RGB_MATRIX_ALPHAS_MODS +# define DISABLE_RGB_MATRIX_GRADIENT_UP_DOWN +# define DISABLE_RGB_MATRIX_BREATHING +# define DISABLE_RGB_MATRIX_BAND_SAT +# define DISABLE_RGB_MATRIX_BAND_VAL +# define DISABLE_RGB_MATRIX_BAND_PINWHEEL_SAT +# define DISABLE_RGB_MATRIX_BAND_PINWHEEL_VAL +# define DISABLE_RGB_MATRIX_BAND_SPIRAL_SAT +# define DISABLE_RGB_MATRIX_BAND_SPIRAL_VAL +# define DISABLE_RGB_MATRIX_CYCLE_ALL +# define DISABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT +# define DISABLE_RGB_MATRIX_CYCLE_UP_DOWN +# define DISABLE_RGB_MATRIX_CYCLE_OUT_IN // # define DISABLE_RGB_MATRIX_CYCLE_OUT_IN_DUAL -# define DISABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON -# define DISABLE_RGB_MATRIX_DUAL_BEACON -# define DISABLE_RGB_MATRIX_CYCLE_PINWHEEL -# define DISABLE_RGB_MATRIX_CYCLE_SPIRAL -# define DISABLE_RGB_MATRIX_RAINBOW_BEACON -# define DISABLE_RGB_MATRIX_RAINBOW_PINWHEELS -# define DISABLE_RGB_MATRIX_RAINDROPS -# define DISABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS +# define DISABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON +# define DISABLE_RGB_MATRIX_DUAL_BEACON +# define DISABLE_RGB_MATRIX_CYCLE_PINWHEEL +# define DISABLE_RGB_MATRIX_CYCLE_SPIRAL +# define DISABLE_RGB_MATRIX_RAINBOW_BEACON +# define DISABLE_RGB_MATRIX_RAINBOW_PINWHEELS +# define DISABLE_RGB_MATRIX_RAINDROPS +# define DISABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS // # define DISABLE_RGB_MATRIX_TYPING_HEATMAP -# define DISABLE_RGB_MATRIX_DIGITAL_RAIN -# define DISABLE_RGB_MATRIX_SOLID_REACTIVE -# define DISABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE -# define DISABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE -# define DISABLE_RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE -# define DISABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS -# define DISABLE_RGB_MATRIX_SOLID_REACTIVE_MULTICROSS -# define DISABLE_RGB_MATRIX_SOLID_REACTIVE_NEXUS -# define DISABLE_RGB_MATRIX_SOLID_REACTIVE_MULTINEXUS -# define DISABLE_RGB_MATRIX_SPLASH -# define DISABLE_RGB_MATRIX_MULTISPLASH -# define DISABLE_RGB_MATRIX_SOLID_SPLASH -# define DISABLE_RGB_MATRIX_SOLID_MULTISPLASH -# endif // AVR -#endif // RGB_MATRIX_ENABLE - -#ifndef ONESHOT_TAP_TOGGLE +# define DISABLE_RGB_MATRIX_DIGITAL_RAIN +# define DISABLE_RGB_MATRIX_SOLID_REACTIVE +# define DISABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE +# define DISABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE +# define DISABLE_RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE +# define DISABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS +# define DISABLE_RGB_MATRIX_SOLID_REACTIVE_MULTICROSS +# define DISABLE_RGB_MATRIX_SOLID_REACTIVE_NEXUS +# define DISABLE_RGB_MATRIX_SOLID_REACTIVE_MULTINEXUS +# define DISABLE_RGB_MATRIX_SPLASH +# define DISABLE_RGB_MATRIX_MULTISPLASH +# define DISABLE_RGB_MATRIX_SOLID_SPLASH +# define DISABLE_RGB_MATRIX_SOLID_MULTISPLASH +#endif // RGB_MATRIX_ENABLE + +#if !defined(ONESHOT_TAP_TOGGLE) # define ONESHOT_TAP_TOGGLE 2 #endif // !ONESHOT_TAP_TOGGLE -#ifndef ONESHOT_TIMEOUT +#if !defined(ONESHOT_TIMEOUT) # define ONESHOT_TIMEOUT 3000 #endif // !ONESHOT_TIMEOUT -#ifndef QMK_KEYS_PER_SCAN +#if !defined(QMK_KEYS_PER_SCAN) # define QMK_KEYS_PER_SCAN 4 #endif // !QMK_KEYS_PER_SCAN -// this makes it possible to do rolling combos (zx) with keys that -// convert to other keys on hold (z becomes ctrl when you hold it, -// and when this option isn't enabled, z rapidly followed by x -// actually sends Ctrl-x. That's bad.) #define IGNORE_MOD_TAP_INTERRUPT #undef PERMISSIVE_HOLD -//#define TAPPING_FORCE_HOLD -//#define RETRO_TAPPING #define FORCE_NKRO -#ifndef TAPPING_TOGGLE +#if !defined(TAPPING_TOGGLE) # define TAPPING_TOGGLE 1 #endif -#ifdef TAPPING_TERM +#if defined(TAPPING_TERM) # undef TAPPING_TERM #endif // TAPPING_TERM + #if defined(KEYBOARD_ergodox_ez) # define TAPPING_TERM 185 #elif defined(KEYBOARD_crkbd) @@ -107,12 +92,20 @@ #define TAP_CODE_DELAY 5 +#define LEADER_TIMEOUT 250 +#define LEADER_PER_KEY_TIMING + /* Disable unused and unneeded features to reduce on firmware size */ -#ifdef LOCKING_SUPPORT_ENABLE +#if defined(LOCKING_SUPPORT_ENABLE) # undef LOCKING_SUPPORT_ENABLE #endif -#ifdef LOCKING_RESYNC_ENABLE + +#if defined(LOCKING_RESYNC_ENABLE) # undef LOCKING_RESYNC_ENABLE #endif +#if defined(OLED_FONT_H) +# undef OLED_FONT_H +#endif + #define OLED_FONT_H "users/curry/glcdfont.c" diff --git a/users/curry/curry.c b/users/curry/curry.c index b6afa5ef2e..0353553591 100644 --- a/users/curry/curry.c +++ b/users/curry/curry.c @@ -53,15 +53,16 @@ void rgb_matrix_update_pwm_buffers(void); // On RESET, set all RGB to red, shutdown the keymap. void shutdown_user(void) { -#ifdef RGBLIGHT_ENABLE +#if defined(RGBLIGHT_ENABLE) rgblight_enable_noeeprom(); rgblight_mode_noeeprom(1); rgblight_setrgb_red(); -#endif // RGBLIGHT_ENABLE -#ifdef RGB_MATRIX_ENABLE +#endif + +#if defined(RGB_MATRIX_ENABLE) rgb_matrix_set_color_all(0xFF, 0x00, 0x00); rgb_matrix_update_pwm_buffers(); -#endif // RGB_MATRIX_ENABLE +#endif shutdown_keymap(); } @@ -77,7 +78,7 @@ __attribute__((weak)) void matrix_scan_keymap(void) {} // No global matrix scan code, so just run keymap's matrix // scan function -void matrix_scan_user(void) { +__attribute__((weak)) void matrix_scan_user(void) { static bool has_ran_yet; if (!has_ran_yet) { has_ran_yet = true; @@ -96,18 +97,16 @@ __attribute__((weak)) layer_state_t layer_state_set_keymap(layer_state_t state) // On Layer change, run keymap's layer change check layer_state_t layer_state_set_user(layer_state_t state) { state = update_tri_layer_state(state, _RAISE, _LOWER, _ADJUST); -#if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE) +#if defined(RGBLIGHT_ENABLE) state = layer_state_set_rgb(state); -#endif // RGBLIGHT_ENABLE +#endif return layer_state_set_keymap(state); } __attribute__((weak)) layer_state_t default_layer_state_set_keymap(layer_state_t state) { return state; } // Runs state check and changes underglow color and animation -layer_state_t default_layer_state_set_user(layer_state_t state) { - return default_layer_state_set_keymap(state); -} +layer_state_t default_layer_state_set_user(layer_state_t state) { return default_layer_state_set_keymap(state); } __attribute__((weak)) void led_set_keymap(uint8_t usb_led) {} diff --git a/users/curry/curry.h b/users/curry/curry.h index a9de9ae510..ee4a736835 100644 --- a/users/curry/curry.h +++ b/users/curry/curry.h @@ -1,18 +1,23 @@ #pragma once #include QMK_KEYBOARD_H - #include "version.h" #include "eeprom.h" #include "wrappers.h" #include "process_records.h" -#ifdef TAP_DANCE_ENABLE +#if defined(TAP_DANCE_ENABLE) # include "tap_dances.h" #endif // TAP_DANCE_ENABLE -#if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE) -# include "rgb_stuff.h" + +#if defined(RGB_MATRIX_ENABLE) +# include "rgb_matrix_user.h" #endif + +#if defined(RGBLIGHT_ENABLE) +# include "rgb_lighting_user.h" +#endif + #if defined(KEYBOARD_lily58_rev1) & defined(PROTOCOL_LUFA) # include "lufa.h" # include "split_util.h" @@ -23,6 +28,7 @@ enum userspace_layers { _QWERTY = 0, _COLEMAK, _DVORAK, + _WORKMAN, _MODS, _LOWER, _RAISE, diff --git a/users/curry/glcdfont.c b/users/curry/glcdfont.c index 2bfc3fac6d..10ce3b3457 100644 --- a/users/curry/glcdfont.c +++ b/users/curry/glcdfont.c @@ -1,13 +1,4 @@ -#pragma once - -#ifdef __AVR__ -# include -# include -#elif defined(ESP8266) -# include -#else -# define PROGMEM -#endif +#include "progmem.h" // Corne 8x6 font with QMK Firmware Logo // Online editor: https://helixfonteditor.netlify.com/ diff --git a/users/curry/leader.c b/users/curry/leader.c new file mode 100644 index 0000000000..3fca6a2ec3 --- /dev/null +++ b/users/curry/leader.c @@ -0,0 +1,24 @@ +#include "curry.h" +#include "leader.h" + +LEADER_EXTERNS(); + +void matrix_scan_user(void) { + static bool has_ran_yet; + if (!has_ran_yet) { + has_ran_yet = true; + startup_user(); + } + +#if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE) + matrix_scan_rgb(); +#endif // RGBLIGHT_ENABLE + LEADER_DICTIONARY() { + leading = false; + leader_end(); + SEQ_ONE_KEY(KC_F) { SEND_STRING(SS_LCTL("akf")); } // Select all and format + SEQ_ONE_KEY(KC_P) { SEND_STRING(SS_LCTL(SS_LSFT("4"))); } // Screenshot region + SEQ_TWO_KEYS(KC_D, KC_D) { SEND_STRING(SS_LCTL("ac")); } // Copy all + } + matrix_scan_keymap(); +} diff --git a/users/curry/leader.h b/users/curry/leader.h new file mode 100644 index 0000000000..f215893b9e --- /dev/null +++ b/users/curry/leader.h @@ -0,0 +1,3 @@ +#pragma once + +void matrix_scan_user(void); diff --git a/users/curry/oled.c b/users/curry/oled.c index 4eb23423eb..fc87a46e50 100644 --- a/users/curry/oled.c +++ b/users/curry/oled.c @@ -1,6 +1,5 @@ #include "curry.h" -#ifdef OLED_DRIVER_ENABLE #define KEYLOGGER_LENGTH 5 static uint32_t oled_timer = 0; static char keylog_str[KEYLOGGER_LENGTH + 1] = {"\n"}; @@ -26,6 +25,7 @@ static const char PROGMEM code_to_name[0xFF] = { ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' // Fx }; +// clang-format on void add_keylog(uint16_t keycode); oled_rotation_t oled_init_user(oled_rotation_t rotation) { return OLED_ROTATION_270; } @@ -49,7 +49,7 @@ void add_keylog(uint16_t keycode) { } void render_keylogger_status(void) { - oled_write_P(PSTR("Keys"), false); + oled_write_P(PSTR("Keys:"), false); oled_write(keylog_str, false); } @@ -65,6 +65,9 @@ void render_default_layer_state(void) { case _DVORAK: oled_write_P(PSTR(" DVRK"), false); break; + case _WORKMAN: + oled_write_P(PSTR(" WRKM"), false); + break; } } @@ -139,11 +142,11 @@ void oled_task_user(void) { oled_off(); return; } -# ifndef SPLIT_KEYBOARD +#if !defined(SPLIT_KEYBOARD) else { oled_on(); } -# endif +#endif if (is_keyboard_master()) { render_status_main(); // Renders the current keyboard state (layer, lock, caps, scroll, etc) } else { @@ -158,5 +161,3 @@ bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { } return true; } - -#endif diff --git a/users/curry/process_records.c b/users/curry/process_records.c index fd1d61ad9d..fd58ea181b 100644 --- a/users/curry/process_records.c +++ b/users/curry/process_records.c @@ -9,6 +9,11 @@ __attribute__((weak)) bool process_record_secrets(uint16_t keycode, keyrecord_t bool process_record_user(uint16_t keycode, keyrecord_t *record) { xprintf("KL: kc: %u, col: %u, row: %u, pressed: %u\n", keycode, record->event.key.col, record->event.key.row, record->event.pressed); switch (keycode) { + case KC_QWERTY ... KC_WORKMAN: + if (record->event.pressed) { + set_single_persistent_default_layer(keycode - KC_QWERTY); + } + break; case KC_MAKE: if (!record->event.pressed) { uint8_t temp_mod = mod_config(get_mods()); @@ -19,18 +24,8 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { if ((temp_mod | temp_osm) & MOD_MASK_SHIFT) { send_string_with_delay_P(PSTR(":flash"), TAP_CODE_DELAY); } - if ((temp_mod | temp_osm) & MOD_MASK_CTRL) { - send_string_with_delay_P(PSTR(" -j8 --output-sync"), TAP_CODE_DELAY); - } -#ifdef RGB_MATRIX_SPLIT_RIGHT - send_string_with_delay_P(PSTR(" RGB_MATRIX_SPLIT_RIGHT=yes"), TAP_CODE_DELAY); -# ifndef OLED_DRIVER_ENABLE - send_string_with_delay_P(PSTR(" OLED_DRIVER_ENABLE=no"), TAP_CODE_DELAY); -# endif -#endif - send_string_with_delay_P(PSTR(SS_TAP(X_ENTER)), TAP_CODE_DELAY); + send_string_with_delay_P(PSTR(" -j8 --output-sync\n"), TAP_CODE_DELAY); } - break; case VRSN: // Prints firmware version @@ -44,17 +39,13 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { copy_paste_timer = timer_read(); } else { if (timer_elapsed(copy_paste_timer) > TAPPING_TERM) { // Hold, copy - register_code(KC_LCTL); - tap_code(KC_C); - unregister_code(KC_LCTL); + tap_code16(LCTL(KC_C)); } else { // Tap, paste - register_code(KC_LCTL); - tap_code(KC_V); - unregister_code(KC_LCTL); + tap_code16(LCTL(KC_V)); } } break; -#ifdef UNICODE_ENABLE +#if defined(UNICODE_ENABLE) case UC_FLIP: // (ノಠ痊ಠ)ノ彡┻━┻ if (record->event.pressed) { send_unicode_hex_string("0028 30CE 0CA0 75CA 0CA0 0029 30CE 5F61 253B 2501 253B"); diff --git a/users/curry/process_records.h b/users/curry/process_records.h index 6170ed4c7e..49e7240c67 100644 --- a/users/curry/process_records.h +++ b/users/curry/process_records.h @@ -1,36 +1,29 @@ #pragma once -#include "curry.h" - -#if defined(KEYMAP_SAFE_RANGE) -# define PLACEHOLDER_SAFE_RANGE KEYMAP_SAFE_RANGE -#else -# define PLACEHOLDER_SAFE_RANGE SAFE_RANGE -#endif enum userspace_custom_keycodes { - VRSN = PLACEHOLDER_SAFE_RANGE, // Prints QMK Firmware and board info - KC_QWERTY, // Sets default layer to QWERTY - KC_COLEMAK, // Sets default layer to COLEMAK - KC_DVORAK, // Sets default layer to DVORAK - KC_MAKE, // Run keyboard's customized make command - KC_RGB_T, // Toggles RGB Layer Indication mode - RGB_IDL, // RGB Idling animations - KC_SECRET_1, // test1 - KC_SECRET_2, // test2 - KC_SECRET_3, // test3 - KC_SECRET_4, // test4 - KC_SECRET_5, // test5 - KC_CCCV, // Hold to copy, tap to paste - KC_NUKE, // NUCLEAR LAUNCH DETECTED!!! - UC_FLIP, // (ಠ痊ಠ)┻━┻ - UC_TABL, // ┬─┬ノ( º _ ºノ) - UC_SHRG, // ¯\_(ツ)_/¯ - UC_DISA, // ಠ_ಠ + VRSN = SAFE_RANGE, // Prints QMK Firmware and board info + KC_QWERTY, // Sets default layer to QWERTY + KC_COLEMAK, // Sets default layer to COLEMAK + KC_DVORAK, // Sets default layer to DVORAK + KC_WORKMAN, // Sets default layer to WORKMAN + KC_MAKE, // Run keyboard's customized make command + KC_RGB_T, // Toggles RGB Layer Indication mode + RGB_IDL, // RGB Idling animations + KC_SECRET_1, // test1 + KC_SECRET_2, // test2 + KC_SECRET_3, // test3 + KC_SECRET_4, // test4 + KC_SECRET_5, // test5 + KC_CCCV, // Hold to copy, tap to paste + UC_FLIP, // (ಠ痊ಠ)┻━┻ + UC_TABL, // ┬─┬ノ( º _ ºノ) + UC_SHRG, // ¯\_(ツ)_/¯ + UC_DISA, // ಠ_ಠ KC_DT1, KC_DT2, KC_DT3, KC_DT4, - NEW_SAFE_RANGE // use "NEWPLACEHOLDER for keymap specific codes + NEW_SAFE_RANGE // use "NEWPLACEHOLDER for keymap specific codes }; bool process_record_secrets(uint16_t keycode, keyrecord_t *record); @@ -52,25 +45,20 @@ bool process_record_keymap(uint16_t keycode, keyrecord_t *record); #define QWERTY KC_QWERTY #define DVORAK KC_DVORAK #define COLEMAK KC_COLEMAK +#define WORKMAN KC_WORKMAN -#define KC_RESET RESET -#define KC_RST KC_RESET +#define KC_RST RESET -#ifdef SWAP_HANDS_ENABLE +#if defined(SWAP_HANDS_ENABLE) # define KC_C1R3 SH_T(KC_TAB) #else // SWAP_HANDS_ENABLE # define KC_C1R3 KC_TAB #endif // SWAP_HANDS_ENABLE -#define BK_LWER LT(_LOWER, KC_BSPC) #define SP_LWER LT(_LOWER, KC_SPC) -#define DL_RAIS LT(_RAISE, KC_DEL) #define ET_RAIS LT(_RAISE, KC_ENTER) /* OSM keycodes, to keep things clean and easy to change */ -#define KC_MLSF OSM(MOD_LSFT) -#define KC_MRSF OSM(MOD_RSFT) - #define OS_LGUI OSM(MOD_LGUI) #define OS_RGUI OSM(MOD_RGUI) #define OS_LSFT OSM(MOD_LSFT) @@ -82,12 +70,6 @@ bool process_record_keymap(uint16_t keycode, keyrecord_t *record); #define OS_MEH OSM(MOD_MEH) #define OS_HYPR OSM(MOD_HYPR) -#define M_LALT ALT_T(KC_TAB) -#define M_RALT RALT_T(KC_QUOT) - -#define M_LCTL CTL_T(KC_TAB) -#define M_RCTL RCTL_T(KC_QUOT) - #define MT_ESC MT(MOD_LCTL, KC_ESC) #define ALT_APP ALT_T(KC_APP) diff --git a/users/curry/rgb_lighting_user.c b/users/curry/rgb_lighting_user.c new file mode 100644 index 0000000000..25e1ce0104 --- /dev/null +++ b/users/curry/rgb_lighting_user.c @@ -0,0 +1,325 @@ +#include "curry.h" +#include "rgb_lighting_user.h" + +extern rgblight_config_t rgblight_config; +bool has_initialized; + +void rgblight_sethsv_default_helper(uint8_t index) { rgblight_sethsv_at(rgblight_config.hue, rgblight_config.sat, rgblight_config.val, index); } + +/* Custom indicators for modifiers. + * This allows for certain lights to be lit up, based on what mods are active, giving some visual feedback. + * This is especially useful for One Shot Mods, since it's not always obvious if they're still lit up. + */ +#if defined(INDICATOR_LIGHTS) +void set_rgb_indicators(uint8_t this_mod, uint8_t this_led, uint8_t this_osm) { + if (userspace_config.rgb_layer_change && get_highest_layer(layer_state) == 0) { + if ((this_mod | this_osm) & MOD_MASK_SHIFT || this_led & (1 << USB_LED_CAPS_LOCK)) { +# ifdef SHFT_LED1 + rgblight_sethsv_at(120, 255, 255, SHFT_LED1); +# endif // SHFT_LED1 +# ifdef SHFT_LED2 + rgblight_sethsv_at(120, 255, 255, SHFT_LED2); +# endif // SHFT_LED2 + } else { +# ifdef SHFT_LED1 + rgblight_sethsv_default_helper(SHFT_LED1); +# endif // SHFT_LED1 +# ifdef SHFT_LED2 + rgblight_sethsv_default_helper(SHFT_LED2); +# endif // SHFT_LED2 + } + if ((this_mod | this_osm) & MOD_MASK_CTRL) { +# ifdef CTRL_LED1 + rgblight_sethsv_at(0, 255, 255, CTRL_LED1); +# endif // CTRL_LED1 +# ifdef CTRL_LED2 + rgblight_sethsv_at(0, 255, 255, CTRL_LED2); +# endif // CTRL_LED2 + } else { +# ifdef CTRL_LED1 + rgblight_sethsv_default_helper(CTRL_LED1); +# endif // CTRL_LED1 +# ifdef CTRL_LED2 + rgblight_sethsv_default_helper(CTRL_LED2); +# endif // CTRL_LED2 + } + if ((this_mod | this_osm) & MOD_MASK_GUI) { +# ifdef GUI_LED1 + rgblight_sethsv_at(51, 255, 255, GUI_LED1); +# endif // GUI_LED1 +# ifdef GUI_LED2 + rgblight_sethsv_at(51, 255, 255, GUI_LED2); +# endif // GUI_LED2 + } else { +# ifdef GUI_LED1 + rgblight_sethsv_default_helper(GUI_LED1); +# endif // GUI_LED1 +# ifdef GUI_LED2 + rgblight_sethsv_default_helper(GUI_LED2); +# endif // GUI_LED2 + } + if ((this_mod | this_osm) & MOD_MASK_ALT) { +# ifdef ALT_LED1 + rgblight_sethsv_at(240, 255, 255, ALT_LED1); +# endif // ALT_LED1 +# ifdef GUI_LED2 + rgblight_sethsv_at(240, 255, 255, ALT_LED2); +# endif // GUI_LED2 + } else { +# ifdef GUI_LED1 + rgblight_sethsv_default_helper(ALT_LED1); +# endif // GUI_LED1 +# ifdef GUI_LED2 + rgblight_sethsv_default_helper(ALT_LED2); +# endif // GUI_LED2 + } + } +} + +/* Function for the indicators */ +void matrix_scan_indicator(void) { + if (has_initialized) { + set_rgb_indicators(get_mods(), host_keyboard_leds(), get_oneshot_mods()); + } +} +#endif // INDICATOR_LIGHTS + +#if defined(RGBLIGHT_TWINKLE) +static rgblight_fadeout lights[RGBLED_NUM]; + +__attribute__((weak)) bool rgblight_twinkle_is_led_used_keymap(uint8_t index) { return false; } + +/* This function checks for used LEDs. This way, collisions don't occur and cause weird rendering */ +bool rgblight_twinkle_is_led_used(uint8_t index) { + switch (index) { +# ifdef INDICATOR_LIGHTS +# ifdef SHFT_LED1 + case SHFT_LED1: + return true; +# endif // SHFT_LED1 +# ifdef SHFT_LED2 + case SHFT_LED2: + return true; +# endif // SHFT_LED2 +# ifdef CTRL_LED1 + case CTRL_LED1: + return true; +# endif // CTRL_LED1 +# ifdef CTRL_LED2 + case CTRL_LED2: + return true; +# endif // CTRL_LED2 +# ifdef GUI_LED1 + case GUI_LED1: + return true; +# endif // GUI_LED1 +# ifdef GUI_LED2 + case GUI_LED2: + return true; +# endif // GUI_LED2 +# ifdef ALT_LED1 + case ALT_LED1: + return true; +# endif // ALT_LED1 +# ifdef ALT_LED2 + case ALT_LED2: + return true; +# endif // ALT_LED2 +# endif // INDICATOR_LIGHTS + default: + return rgblight_twinkle_is_led_used_keymap(index); + } +} + +/* Handler for fading/twinkling effect */ +void scan_rgblight_fadeout(void) { // Don't effing change this function .... rgblight_sethsv is supppppper intensive + bool litup = false; + for (uint8_t light_index = 0; light_index < RGBLED_NUM; ++light_index) { + if (lights[light_index].enabled && timer_elapsed(lights[light_index].timer) > 10) { + rgblight_fadeout *light = &lights[light_index]; + litup = true; + + if (light->life) { + light->life -= 1; + if (get_highest_layer(layer_state) == 0) { + sethsv(light->hue + rand() % 0xF, 255, light->life, (LED_TYPE *)&led[light_index]); + } + light->timer = timer_read(); + } else { + if (light->enabled && get_highest_layer(layer_state) == 0) { + rgblight_sethsv_default_helper(light_index); + } + litup = light->enabled = false; + } + } + } + if (litup && get_highest_layer(layer_state) == 0) { + rgblight_set(); + } +} + +/* Triggers a LED to fade/twinkle. + * This function handles the selection of the LED and prepres for it to be used. + */ +void start_rgb_light(void) { + uint8_t indices[RGBLED_NUM]; + uint8_t indices_count = 0; + uint8_t min_life = 0xFF; + uint8_t min_life_index = -1; + for (uint8_t index = 0; index < RGBLED_NUM; ++index) { + if (rgblight_twinkle_is_led_used(index)) { + continue; + } + if (lights[index].enabled) { + if (min_life_index == -1 || lights[index].life < min_life) { + min_life = lights[index].life; + min_life_index = index; + } + continue; + } + + indices[indices_count] = index; + ++indices_count; + } + + uint8_t light_index; + if (!indices_count) { + light_index = min_life_index; + } else { + light_index = indices[rand() % indices_count]; + } + + rgblight_fadeout *light = &lights[light_index]; + light->enabled = true; + light->timer = timer_read(); + light->life = 0xC0 + rand() % 0x40; + + light->hue = rgblight_config.hue + (rand() % 0xB4) - 0x54; + + rgblight_sethsv_at(light->hue, 255, light->life, light_index); +} +#endif + +bool process_record_user_rgb(uint16_t keycode, keyrecord_t *record) { + uint16_t temp_keycode = keycode; + // Filter out the actual keycode from MT and LT keys. + if ((keycode >= QK_MOD_TAP && keycode <= QK_MOD_TAP_MAX) || (keycode >= QK_LAYER_TAP && keycode <= QK_LAYER_TAP_MAX)) { + temp_keycode &= 0xFF; + } + + switch (temp_keycode) { +#if defined(RGBLIGHT_TWINKLE) + case KC_A ... KC_SLASH: + case KC_F1 ... KC_F12: + case KC_INSERT ... KC_UP: + case KC_KP_SLASH ... KC_KP_DOT: + case KC_F13 ... KC_F24: + case KC_AUDIO_MUTE ... KC_MEDIA_REWIND: + if (record->event.pressed) { + start_rgb_light(); + } + break; +#endif // RGBLIGHT_TWINKLE + case KC_RGB_T: // This allows me to use underglow as layer indication, or as normal + if (record->event.pressed) { + userspace_config.rgb_layer_change ^= 1; + dprintf("rgblight layer change [EEPROM]: %u\n", userspace_config.rgb_layer_change); + eeconfig_update_user(userspace_config.raw); + if (userspace_config.rgb_layer_change) { + layer_state_set(layer_state); // This is needed to immediately set the layer color (looks better) + } + } + break; + case RGB_MODE_FORWARD ... RGB_MODE_GRADIENT: // quantum_keycodes.h L400 for definitions + if (record->event.pressed) { + bool is_eeprom_updated = false; + // This disables layer indication, as it's assumed that if you're changing this ... you want that disabled + if (userspace_config.rgb_layer_change) { + userspace_config.rgb_layer_change = false; + dprintf("rgblight layer change [EEPROM]: %u\n", userspace_config.rgb_layer_change); + is_eeprom_updated = true; + } + if (is_eeprom_updated) { + eeconfig_update_user(userspace_config.raw); + } + } + break; + } + return true; +} + +void keyboard_post_init_rgb(void) { +#if defined(RGBLIGHT_STARTUP_ANIMATION) + bool is_enabled = rgblight_config.enable; + if (userspace_config.rgb_layer_change) { + rgblight_enable_noeeprom(); + } + if (rgblight_config.enable) { + layer_state_set_user(layer_state); + uint16_t old_hue = rgblight_config.hue; + rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT); + for (uint16_t i = 255; i > 0; i--) { + rgblight_sethsv_noeeprom((i + old_hue) % 255, 255, 255); + matrix_scan(); + wait_ms(10); + } + } + if (!is_enabled) { + rgblight_disable_noeeprom(); + } + +#endif + layer_state_set_user(layer_state); +} + +void matrix_scan_rgb(void) { +#if defined(RGBLIGHT_TWINKLE) + scan_rgblight_fadeout(); +#endif // RGBLIGHT_ENABLE + +#if defined(INDICATOR_LIGHTS) + matrix_scan_indicator(); +#endif +} + +void rgblight_set_hsv_and_mode(uint8_t hue, uint8_t sat, uint8_t val, uint8_t mode) { + rgblight_sethsv_noeeprom(hue, sat, val); + wait_us(175); // Add a slight delay between color and mode to ensure it's processed correctly + rgblight_mode_noeeprom(mode); +} + +layer_state_t layer_state_set_rgb(layer_state_t state) { + if (userspace_config.rgb_layer_change) { + switch (get_highest_layer(state)) { + case _RAISE: + rgblight_set_hsv_and_mode(HSV_YELLOW, RGBLIGHT_MODE_BREATHING + 3); + break; + case _LOWER: + rgblight_set_hsv_and_mode(HSV_GREEN, RGBLIGHT_MODE_BREATHING + 3); + break; + case _ADJUST: + rgblight_set_hsv_and_mode(HSV_RED, RGBLIGHT_MODE_KNIGHT + 2); + break; + default: // for any other layers, or the default layer + { + uint8_t mode = get_highest_layer(state) == _MODS ? RGBLIGHT_MODE_BREATHING : RGBLIGHT_MODE_STATIC_LIGHT; + switch (get_highest_layer(default_layer_state)) { + case _COLEMAK: + rgblight_set_hsv_and_mode(HSV_MAGENTA, mode); + break; + case _DVORAK: + rgblight_set_hsv_and_mode(HSV_SPRINGGREEN, mode); + break; + case _WORKMAN: + rgblight_set_hsv_and_mode(HSV_GOLDENROD, mode); + break; + default: + rgblight_set_hsv_and_mode(HSV_CYAN, mode); + break; + } + break; + } + } + } + return state; +} diff --git a/users/curry/rgb_lighting_user.h b/users/curry/rgb_lighting_user.h new file mode 100644 index 0000000000..91d7a7061e --- /dev/null +++ b/users/curry/rgb_lighting_user.h @@ -0,0 +1,19 @@ +#pragma once + +typedef struct { + bool enabled; + uint8_t hue; + uint16_t timer; + uint8_t life; +} rgblight_fadeout; + +bool process_record_user_rgb(uint16_t keycode, keyrecord_t *record); +void keyboard_post_init_rgb(void); +void matrix_scan_rgb(void); +layer_state_t layer_state_set_rgb(layer_state_t state); +layer_state_t default_layer_state_set_rgb(layer_state_t state); +void rgblight_sethsv_default_helper(uint8_t index); + +#if defined(RGBLIGHT_TWINKLE) +void scan_rgblight_fadeout(void); +#endif diff --git a/users/curry/rgb_matrix_user.c b/users/curry/rgb_matrix_user.c new file mode 100644 index 0000000000..d1698b087c --- /dev/null +++ b/users/curry/rgb_matrix_user.c @@ -0,0 +1,144 @@ +#include "curry.h" +#include "rgb_matrix_user.h" +#include "lib/lib8tion/lib8tion.h" + +static uint32_t hypno_timer; +extern led_config_t g_led_config; + +#define RGB_MATRIX_REST_MODE RGB_MATRIX_CYCLE_OUT_IN_DUAL + +void suspend_power_down_keymap(void) { rgb_matrix_set_suspend_state(true); } + +void suspend_wakeup_init_keymap(void) { rgb_matrix_set_suspend_state(false); } + +void check_default_layer(uint8_t mode, uint8_t type) { + switch (get_highest_layer(default_layer_state)) { + case _QWERTY: + rgb_matrix_layer_helper(HSV_CYAN, mode, rgb_matrix_config.speed, type); + break; + case _COLEMAK: + rgb_matrix_layer_helper(HSV_MAGENTA, mode, rgb_matrix_config.speed, type); + break; + case _DVORAK: + rgb_matrix_layer_helper(HSV_SPRINGGREEN, mode, rgb_matrix_config.speed, type); + break; + case _WORKMAN: + rgb_matrix_layer_helper(HSV_GOLDENROD, mode, rgb_matrix_config.speed, type); + break; + } +} + +void rgb_matrix_indicators_user(void) { + if (userspace_config.rgb_layer_change && !g_suspend_state && rgb_matrix_config.enable) { + switch (get_highest_layer(layer_state)) { + case _RAISE: + rgb_matrix_layer_helper(HSV_YELLOW, 0, rgb_matrix_config.speed, LED_FLAG_UNDERGLOW); + break; + case _LOWER: + rgb_matrix_layer_helper(HSV_GREEN, 0, rgb_matrix_config.speed, LED_FLAG_UNDERGLOW); + break; + case _ADJUST: + rgb_matrix_layer_helper(HSV_RED, 0, rgb_matrix_config.speed, LED_FLAG_UNDERGLOW); + break; + default: { + check_default_layer(IS_LAYER_ON(_MODS), LED_FLAG_UNDERGLOW); + break; + } + } + check_default_layer(0, LED_FLAG_MODIFIER); + } +} + +bool process_record_user_rgb(uint16_t keycode, keyrecord_t *record) { + uint16_t temp_keycode = keycode; + // Filter out the actual keycode from MT and LT keys. + if ((keycode >= QK_MOD_TAP && keycode <= QK_MOD_TAP_MAX) || (keycode >= QK_LAYER_TAP && keycode <= QK_LAYER_TAP_MAX)) { + temp_keycode &= 0xFF; + } + + hypno_timer = timer_read32(); + if (userspace_config.rgb_matrix_idle_anim && rgb_matrix_get_mode() == RGB_MATRIX_REST_MODE) { + rgb_matrix_mode_noeeprom(RGB_MATRIX_TYPING_HEATMAP); + } + + switch (temp_keycode) { + case KC_RGB_T: // This allows me to use underglow as layer indication, or as normal + if (record->event.pressed) { + userspace_config.rgb_layer_change ^= 1; + dprintf("rgblight layer change [EEPROM]: %u\n", userspace_config.rgb_layer_change); + eeconfig_update_user(userspace_config.raw); + if (userspace_config.rgb_layer_change) { + layer_state_set(layer_state); // This is needed to immediately set the layer color (looks better) + } + } + break; + case RGB_IDL: // This allows me to use underglow as layer indication, or as normal + if (record->event.pressed) { + userspace_config.rgb_matrix_idle_anim ^= 1; + dprintf("RGB Matrix Idle Animation [EEPROM]: %u\n", userspace_config.rgb_matrix_idle_anim); + eeconfig_update_user(userspace_config.raw); + if (userspace_config.rgb_matrix_idle_anim) { + rgb_matrix_mode_noeeprom(RGB_MATRIX_TYPING_HEATMAP); + } + } + break; + case RGB_MODE_FORWARD ... RGB_MODE_GRADIENT: // quantum_keycodes.h L400 for definitions + if (record->event.pressed) { + bool is_eeprom_updated = false; + if (userspace_config.rgb_matrix_idle_anim) { + userspace_config.rgb_matrix_idle_anim = false; + dprintf("RGB Matrix Idle Animation [EEPROM]: %u\n", userspace_config.rgb_matrix_idle_anim); + is_eeprom_updated = true; + } + if (is_eeprom_updated) { + eeconfig_update_user(userspace_config.raw); + } + } + break; + } + return true; +} + +void keyboard_post_init_rgb(void) { + if (userspace_config.rgb_matrix_idle_anim) { + rgb_matrix_mode_noeeprom(RGB_MATRIX_REST_MODE); + } +} + +void matrix_scan_rgb(void) { + if (userspace_config.rgb_matrix_idle_anim && rgb_matrix_get_mode() == RGB_MATRIX_TYPING_HEATMAP && timer_elapsed32(hypno_timer) > 15000) { + rgb_matrix_mode_noeeprom(RGB_MATRIX_REST_MODE); + } +} + +void rgb_matrix_layer_helper(uint8_t hue, uint8_t sat, uint8_t val, uint8_t mode, uint8_t speed, uint8_t led_type) { + HSV hsv = {hue, sat, val}; + if (hsv.v > rgb_matrix_config.hsv.v) { + hsv.v = rgb_matrix_config.hsv.v; + } + + switch (mode) { + case 1: // breathing + { + uint16_t time = scale16by8(g_rgb_counters.tick, speed / 8); + hsv.v = scale8(abs8(sin8(time) - 128) * 2, hsv.v); + RGB rgb = hsv_to_rgb(hsv); + for (uint8_t i = 0; i < DRIVER_LED_TOTAL; i++) { + if (HAS_FLAGS(g_led_config.flags[i], led_type)) { + rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b); + } + } + break; + } + default: // Solid Color + { + RGB rgb = hsv_to_rgb(hsv); + for (uint8_t i = 0; i < DRIVER_LED_TOTAL; i++) { + if (HAS_FLAGS(g_led_config.flags[i], led_type)) { + rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b); + } + } + break; + } + } +} diff --git a/users/curry/rgb_matrix_user.h b/users/curry/rgb_matrix_user.h new file mode 100644 index 0000000000..d7db29bff9 --- /dev/null +++ b/users/curry/rgb_matrix_user.h @@ -0,0 +1,7 @@ +#pragma once + +bool process_record_user_rgb(uint16_t keycode, keyrecord_t *record); +void keyboard_post_init_rgb(void); +void matrix_scan_rgb(void); +void rgb_matrix_set_color_all(uint8_t red, uint8_t green, uint8_t blue); +void rgb_matrix_layer_helper(uint8_t hue, uint8_t sat, uint8_t val, uint8_t mode, uint8_t speed, uint8_t led_type); diff --git a/users/curry/rgb_stuff.c b/users/curry/rgb_stuff.c deleted file mode 100644 index 1129f70be9..0000000000 --- a/users/curry/rgb_stuff.c +++ /dev/null @@ -1,471 +0,0 @@ -#include "curry.h" -#include "rgb_stuff.h" -#include "eeprom.h" - -#if defined(RGBLIGHT_ENABLE) -extern rgblight_config_t rgblight_config; -bool has_initialized; - -void rgblight_sethsv_default_helper(uint8_t index) { rgblight_sethsv_at(rgblight_config.hue, rgblight_config.sat, rgblight_config.val, index); } -#endif // RGBLIGHT_ENABLE - -#if defined(RGB_MATRIX_ENABLE) -static uint32_t hypno_timer; -# if defined(SPLIT_KEYBOARD) || defined(KEYBOARD_ergodox_ez) || defined(KEYBOARD_crkbd) -# define RGB_MATRIX_REST_MODE RGB_MATRIX_CYCLE_OUT_IN_DUAL -# else -# define RGB_MATRIX_REST_MODE RGB_MATRIX_CYCLE_OUT_IN -# endif - -void suspend_power_down_keymap(void) { rgb_matrix_set_suspend_state(true); } - -void suspend_wakeup_init_keymap(void) { rgb_matrix_set_suspend_state(false); } - -void check_default_layer(uint8_t mode, uint8_t type) { - switch (get_highest_layer(default_layer_state)) { - case _QWERTY: - rgb_matrix_layer_helper(HSV_CYAN, mode, rgb_matrix_config.speed, type); - break; - case _COLEMAK: - rgb_matrix_layer_helper(HSV_MAGENTA, mode, rgb_matrix_config.speed, type); - break; - case _DVORAK: - rgb_matrix_layer_helper(HSV_SPRINGGREEN, mode, rgb_matrix_config.speed, type); - break; - } -} - -void rgb_matrix_indicators_user(void) { - if (userspace_config.rgb_layer_change && -# ifdef RGB_DISABLE_WHEN_USB_SUSPENDED - !g_suspend_state && -# endif -# if defined(RGBLIGHT_ENABLE) - (!rgblight_config.enable && rgb_matrix_config.enable) -# else - rgb_matrix_config.enable -# endif - ) { - switch (get_highest_layer(layer_state)) { - case _RAISE: - rgb_matrix_layer_helper(HSV_YELLOW, 0, rgb_matrix_config.speed, LED_FLAG_UNDERGLOW); - break; - case _LOWER: - rgb_matrix_layer_helper(HSV_GREEN, 0, rgb_matrix_config.speed, LED_FLAG_UNDERGLOW); - break; - case _ADJUST: - rgb_matrix_layer_helper(HSV_RED, 0, rgb_matrix_config.speed, LED_FLAG_UNDERGLOW); - break; - default: { - check_default_layer(IS_LAYER_ON(_MODS), LED_FLAG_UNDERGLOW); - break; - } - } - check_default_layer(0, LED_FLAG_MODIFIER); - } -} -#endif - -/* Custom indicators for modifiers. - * This allows for certain lights to be lit up, based on what mods are active, giving some visual feedback. - * This is especially useful for One Shot Mods, since it's not always obvious if they're still lit up. - */ -#ifdef RGBLIGHT_ENABLE -# ifdef INDICATOR_LIGHTS -void set_rgb_indicators(uint8_t this_mod, uint8_t this_led, uint8_t this_osm) { - if (userspace_config.rgb_layer_change && get_highest_layer(layer_state) == 0) { - if ((this_mod | this_osm) & MOD_MASK_SHIFT || this_led & (1 << USB_LED_CAPS_LOCK)) { -# ifdef SHFT_LED1 - rgblight_sethsv_at(120, 255, 255, SHFT_LED1); -# endif // SHFT_LED1 -# ifdef SHFT_LED2 - rgblight_sethsv_at(120, 255, 255, SHFT_LED2); -# endif // SHFT_LED2 - } else { -# ifdef SHFT_LED1 - rgblight_sethsv_default_helper(SHFT_LED1); -# endif // SHFT_LED1 -# ifdef SHFT_LED2 - rgblight_sethsv_default_helper(SHFT_LED2); -# endif // SHFT_LED2 - } - if ((this_mod | this_osm) & MOD_MASK_CTRL) { -# ifdef CTRL_LED1 - rgblight_sethsv_at(0, 255, 255, CTRL_LED1); -# endif // CTRL_LED1 -# ifdef CTRL_LED2 - rgblight_sethsv_at(0, 255, 255, CTRL_LED2); -# endif // CTRL_LED2 - } else { -# ifdef CTRL_LED1 - rgblight_sethsv_default_helper(CTRL_LED1); -# endif // CTRL_LED1 -# ifdef CTRL_LED2 - rgblight_sethsv_default_helper(CTRL_LED2); -# endif // CTRL_LED2 - } - if ((this_mod | this_osm) & MOD_MASK_GUI) { -# ifdef GUI_LED1 - rgblight_sethsv_at(51, 255, 255, GUI_LED1); -# endif // GUI_LED1 -# ifdef GUI_LED2 - rgblight_sethsv_at(51, 255, 255, GUI_LED2); -# endif // GUI_LED2 - } else { -# ifdef GUI_LED1 - rgblight_sethsv_default_helper(GUI_LED1); -# endif // GUI_LED1 -# ifdef GUI_LED2 - rgblight_sethsv_default_helper(GUI_LED2); -# endif // GUI_LED2 - } - if ((this_mod | this_osm) & MOD_MASK_ALT) { -# ifdef ALT_LED1 - rgblight_sethsv_at(240, 255, 255, ALT_LED1); -# endif // ALT_LED1 -# ifdef GUI_LED2 - rgblight_sethsv_at(240, 255, 255, ALT_LED2); -# endif // GUI_LED2 - } else { -# ifdef GUI_LED1 - rgblight_sethsv_default_helper(ALT_LED1); -# endif // GUI_LED1 -# ifdef GUI_LED2 - rgblight_sethsv_default_helper(ALT_LED2); -# endif // GUI_LED2 - } - } -} - -/* Function for the indicators */ -void matrix_scan_indicator(void) { - if (has_initialized) { - set_rgb_indicators(get_mods(), host_keyboard_leds(), get_oneshot_mods()); - } -} -# endif // INDICATOR_LIGHTS - -# ifdef RGBLIGHT_TWINKLE -static rgblight_fadeout lights[RGBLED_NUM]; - -__attribute__((weak)) bool rgblight_twinkle_is_led_used_keymap(uint8_t index) { return false; } - -/* This function checks for used LEDs. This way, collisions don't occur and cause weird rendering */ -bool rgblight_twinkle_is_led_used(uint8_t index) { - switch (index) { -# ifdef INDICATOR_LIGHTS -# ifdef SHFT_LED1 - case SHFT_LED1: - return true; -# endif // SHFT_LED1 -# ifdef SHFT_LED2 - case SHFT_LED2: - return true; -# endif // SHFT_LED2 -# ifdef CTRL_LED1 - case CTRL_LED1: - return true; -# endif // CTRL_LED1 -# ifdef CTRL_LED2 - case CTRL_LED2: - return true; -# endif // CTRL_LED2 -# ifdef GUI_LED1 - case GUI_LED1: - return true; -# endif // GUI_LED1 -# ifdef GUI_LED2 - case GUI_LED2: - return true; -# endif // GUI_LED2 -# ifdef ALT_LED1 - case ALT_LED1: - return true; -# endif // ALT_LED1 -# ifdef ALT_LED2 - case ALT_LED2: - return true; -# endif // ALT_LED2 -# endif // INDICATOR_LIGHTS - default: - return rgblight_twinkle_is_led_used_keymap(index); - } -} - -/* Handler for fading/twinkling effect */ -void scan_rgblight_fadeout(void) { // Don't effing change this function .... rgblight_sethsv is supppppper intensive - bool litup = false; - for (uint8_t light_index = 0; light_index < RGBLED_NUM; ++light_index) { - if (lights[light_index].enabled && timer_elapsed(lights[light_index].timer) > 10) { - rgblight_fadeout *light = &lights[light_index]; - litup = true; - - if (light->life) { - light->life -= 1; - if (get_highest_layer(layer_state) == 0) { - sethsv(light->hue + rand() % 0xF, 255, light->life, (LED_TYPE *)&led[light_index]); - } - light->timer = timer_read(); - } else { - if (light->enabled && get_highest_layer(layer_state) == 0) { - rgblight_sethsv_default_helper(light_index); - } - litup = light->enabled = false; - } - } - } - if (litup && get_highest_layer(layer_state) == 0) { - rgblight_set(); - } -} - -/* Triggers a LED to fade/twinkle. - * This function handles the selection of the LED and prepres for it to be used. - */ -void start_rgb_light(void) { - uint8_t indices[RGBLED_NUM]; - uint8_t indices_count = 0; - uint8_t min_life = 0xFF; - uint8_t min_life_index = -1; - for (uint8_t index = 0; index < RGBLED_NUM; ++index) { - if (rgblight_twinkle_is_led_used(index)) { - continue; - } - if (lights[index].enabled) { - if (min_life_index == -1 || lights[index].life < min_life) { - min_life = lights[index].life; - min_life_index = index; - } - continue; - } - - indices[indices_count] = index; - ++indices_count; - } - - uint8_t light_index; - if (!indices_count) { - light_index = min_life_index; - } else { - light_index = indices[rand() % indices_count]; - } - - rgblight_fadeout *light = &lights[light_index]; - light->enabled = true; - light->timer = timer_read(); - light->life = 0xC0 + rand() % 0x40; - - light->hue = rgblight_config.hue + (rand() % 0xB4) - 0x54; - - rgblight_sethsv_at(light->hue, 255, light->life, light_index); -} -# endif -#endif // RGBLIGHT_ENABLE - -bool process_record_user_rgb(uint16_t keycode, keyrecord_t *record) { - uint16_t temp_keycode = keycode; - // Filter out the actual keycode from MT and LT keys. - if ((keycode >= QK_MOD_TAP && keycode <= QK_MOD_TAP_MAX) || (keycode >= QK_LAYER_TAP && keycode <= QK_LAYER_TAP_MAX)) { - temp_keycode &= 0xFF; - } - -#if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_FRAMEBUFFER_EFFECTS) - hypno_timer = timer_read32(); - if (userspace_config.rgb_matrix_idle_anim && rgb_matrix_get_mode() == RGB_MATRIX_REST_MODE) { - rgb_matrix_mode_noeeprom(RGB_MATRIX_TYPING_HEATMAP); - } -#endif - - switch (temp_keycode) { -#ifdef RGBLIGHT_TWINKLE - case KC_A ... KC_SLASH: - case KC_F1 ... KC_F12: - case KC_INSERT ... KC_UP: - case KC_KP_SLASH ... KC_KP_DOT: - case KC_F13 ... KC_F24: - case KC_AUDIO_MUTE ... KC_MEDIA_REWIND: - if (record->event.pressed) { - start_rgb_light(); - } - break; -#endif // RGBLIGHT_TWINKLE - case KC_RGB_T: // This allows me to use underglow as layer indication, or as normal -#if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE) - if (record->event.pressed) { - userspace_config.rgb_layer_change ^= 1; - dprintf("rgblight layer change [EEPROM]: %u\n", userspace_config.rgb_layer_change); - eeconfig_update_user(userspace_config.raw); - if (userspace_config.rgb_layer_change) { - layer_state_set(layer_state); // This is needed to immediately set the layer color (looks better) - } - } -#endif // RGBLIGHT_ENABLE - break; - case RGB_IDL: // This allows me to use underglow as layer indication, or as normal -#if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_FRAMEBUFFER_EFFECTS) - if (record->event.pressed) { - userspace_config.rgb_matrix_idle_anim ^= 1; - dprintf("RGB Matrix Idle Animation [EEPROM]: %u\n", userspace_config.rgb_matrix_idle_anim); - eeconfig_update_user(userspace_config.raw); - if (userspace_config.rgb_matrix_idle_anim) { - rgb_matrix_mode_noeeprom(RGB_MATRIX_TYPING_HEATMAP); - } - } -#endif - break; - case RGB_MODE_FORWARD ... RGB_MODE_GRADIENT: // quantum_keycodes.h L400 for definitions - if (record->event.pressed) { - bool is_eeprom_updated = false; -#ifdef RGBLIGHT_ENABLE - // This disables layer indication, as it's assumed that if you're changing this ... you want that disabled - if (userspace_config.rgb_layer_change) { - userspace_config.rgb_layer_change = false; - dprintf("rgblight layer change [EEPROM]: %u\n", userspace_config.rgb_layer_change); - is_eeprom_updated = true; - } -#endif -#if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_FRAMEBUFFER_EFFECTS) - if (userspace_config.rgb_matrix_idle_anim) { - userspace_config.rgb_matrix_idle_anim = false; - dprintf("RGB Matrix Idle Animation [EEPROM]: %u\n", userspace_config.rgb_matrix_idle_anim); - is_eeprom_updated = true; - } -#endif - if (is_eeprom_updated) { - eeconfig_update_user(userspace_config.raw); - } - } - break; - } - return true; -} - -void keyboard_post_init_rgb(void) { -#if defined(RGBLIGHT_ENABLE) -# if defined(RGBLIGHT_STARTUP_ANIMATION) - bool is_enabled = rgblight_config.enable; - if (userspace_config.rgb_layer_change) { - rgblight_enable_noeeprom(); - } - if (rgblight_config.enable) { - layer_state_set_user(layer_state); - uint16_t old_hue = rgblight_config.hue; - rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT); - for (uint16_t i = 255; i > 0; i--) { - rgblight_sethsv_noeeprom((i + old_hue) % 255, 255, 255); - matrix_scan(); - wait_ms(10); - } - } - if (!is_enabled) { - rgblight_disable_noeeprom(); - } - -# endif - layer_state_set_user(layer_state); -#endif -#if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_FRAMEBUFFER_EFFECTS) - if (userspace_config.rgb_matrix_idle_anim) { - rgb_matrix_mode_noeeprom(RGB_MATRIX_REST_MODE); - } -#endif -} - -void matrix_scan_rgb(void) { -#ifdef RGBLIGHT_ENABLE -# ifdef RGBLIGHT_TWINKLE - scan_rgblight_fadeout(); -# endif // RGBLIGHT_ENABLE - -# ifdef INDICATOR_LIGHTS - matrix_scan_indicator(); -# endif -#endif - -#if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_FRAMEBUFFER_EFFECTS) - if (userspace_config.rgb_matrix_idle_anim && rgb_matrix_get_mode() == RGB_MATRIX_TYPING_HEATMAP && timer_elapsed32(hypno_timer) > 15000) { - rgb_matrix_mode_noeeprom(RGB_MATRIX_REST_MODE); - } -#endif -} - -#ifdef RGBLIGHT_ENABLE -void rgblight_set_hsv_and_mode(uint8_t hue, uint8_t sat, uint8_t val, uint8_t mode) { - rgblight_sethsv_noeeprom(hue, sat, val); - wait_us(175); // Add a slight delay between color and mode to ensure it's processed correctly - rgblight_mode_noeeprom(mode); -} -#endif - -layer_state_t layer_state_set_rgb(layer_state_t state) { -#ifdef RGBLIGHT_ENABLE - if (userspace_config.rgb_layer_change) { - switch (get_highest_layer(state)) { - case _RAISE: - rgblight_set_hsv_and_mode(HSV_YELLOW, RGBLIGHT_MODE_BREATHING + 3); - break; - case _LOWER: - rgblight_set_hsv_and_mode(HSV_GREEN, RGBLIGHT_MODE_BREATHING + 3); - break; - case _ADJUST: - rgblight_set_hsv_and_mode(HSV_RED, RGBLIGHT_MODE_KNIGHT + 2); - break; - default: // for any other layers, or the default layer - { - uint8_t mode = get_highest_layer(state) == _MODS ? RGBLIGHT_MODE_BREATHING : RGBLIGHT_MODE_STATIC_LIGHT; - switch (get_highest_layer(default_layer_state)) { - case _COLEMAK: - rgblight_set_hsv_and_mode(HSV_MAGENTA, mode); - break; - case _DVORAK: - rgblight_set_hsv_and_mode(HSV_SPRINGGREEN, mode); - break; - default: - rgblight_set_hsv_and_mode(HSV_CYAN, mode); - break; - } - break; - } - } - } -#endif // RGBLIGHT_ENABLE - - return state; -} - -#ifdef RGB_MATRIX_ENABLE -# include "lib/lib8tion/lib8tion.h" -extern led_config_t g_led_config; - -void rgb_matrix_layer_helper(uint8_t hue, uint8_t sat, uint8_t val, uint8_t mode, uint8_t speed, uint8_t led_type) { - HSV hsv = {hue, sat, val}; - if (hsv.v > rgb_matrix_config.hsv.v) { - hsv.v = rgb_matrix_config.hsv.v; - } - - switch (mode) { - case 1: // breathing - { - uint16_t time = scale16by8(g_rgb_counters.tick, speed / 8); - hsv.v = scale8(abs8(sin8(time) - 128) * 2, hsv.v); - RGB rgb = hsv_to_rgb(hsv); - for (uint8_t i = 0; i < DRIVER_LED_TOTAL; i++) { - if (HAS_FLAGS(g_led_config.flags[i], led_type)) { - rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b); - } - } - break; - } - default: // Solid Color - { - RGB rgb = hsv_to_rgb(hsv); - for (uint8_t i = 0; i < DRIVER_LED_TOTAL; i++) { - if (HAS_FLAGS(g_led_config.flags[i], led_type)) { - rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b); - } - } - break; - } - } -} -#endif diff --git a/users/curry/rgb_stuff.h b/users/curry/rgb_stuff.h deleted file mode 100644 index 50b73c1c3c..0000000000 --- a/users/curry/rgb_stuff.h +++ /dev/null @@ -1,32 +0,0 @@ -#pragma once -#include "quantum.h" -#ifdef RGB_MATRIX_ENABLE -# include "rgb_matrix.h" -#endif - -#if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_TWINKLE) -typedef struct { - bool enabled; - uint8_t hue; - uint16_t timer; - uint8_t life; -} rgblight_fadeout; -#endif - -bool process_record_user_rgb(uint16_t keycode, keyrecord_t *record); -void keyboard_post_init_rgb(void); -void matrix_scan_rgb(void); -layer_state_t layer_state_set_rgb(layer_state_t state); -layer_state_t default_layer_state_set_rgb(layer_state_t state); - -#if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_TWINKLE) -void scan_rgblight_fadeout(void); -#endif -#if defined(RGBLIGHT_ENABLE) -void rgblight_sethsv_default_helper(uint8_t index); -#endif - -#ifdef RGB_MATRIX_ENABLE -void rgb_matrix_set_color_all(uint8_t red, uint8_t green, uint8_t blue); -void rgb_matrix_layer_helper(uint8_t hue, uint8_t sat, uint8_t val, uint8_t mode, uint8_t speed, uint8_t led_type); -#endif diff --git a/users/curry/rules.mk b/users/curry/rules.mk index 2ebb807946..87d3b38ead 100644 --- a/users/curry/rules.mk +++ b/users/curry/rules.mk @@ -1,8 +1,15 @@ SRC += curry.c \ process_records.c -LTO_ENABLE = yes -SPACE_CADET_ENABLE = no +# Common flags +SPACE_CADET_ENABLE = no +LTO_ENABLE = yes +EXTRAKEY_ENABLE = yes +UNICODE_ENABLE = yes +NKRO_ENABLE = yes +EXTRAKEY_ENABLE = yes +LEADER_ENABLE = yes +TAP_DANCE_ENABLE = no ifneq ($(strip $(NO_SECRETS)), yes) ifneq ("$(wildcard $(USER_PATH)/secrets.c)","") @@ -21,8 +28,12 @@ ifeq ($(strip $(OLED_DRIVER_ENABLE)), yes) SRC += oled.c endif +ifeq ($(strip $(LEADER_ENABLE)), yes) + SRC += leader.c +endif + ifeq ($(strip $(RGBLIGHT_ENABLE)), yes) - SRC += rgb_stuff.c + SRC += rgb_lighting_user.c ifeq ($(strip $(INDICATOR_LIGHTS)), yes) OPT_DEFS += -DINDICATOR_LIGHTS endif @@ -39,10 +50,9 @@ endif RGB_MATRIX_ENABLE ?= no ifneq ($(strip $(RGB_MATRIX_ENABLE)), no) - SRC += rgb_stuff.c + SRC += rgb_matrix_user.c endif - ifdef CONSOLE_ENABLE ifeq ($(strip $(KEYLOGGER_ENABLE)), yes) OPT_DEFS += -DKEYLOGGER_ENABLE diff --git a/users/curry/tap_dances.c b/users/curry/tap_dances.c index fe62def0d4..166ea2c686 100644 --- a/users/curry/tap_dances.c +++ b/users/curry/tap_dances.c @@ -1,3 +1,4 @@ +#include "tap_dances.h" #include "curry.h" qk_tap_dance_action_t tap_dance_actions[] = {}; diff --git a/users/curry/tap_dances.h b/users/curry/tap_dances.h index 43ce12ffcf..6f70f09bee 100644 --- a/users/curry/tap_dances.h +++ b/users/curry/tap_dances.h @@ -1,3 +1 @@ #pragma once -#include "curry.h" - diff --git a/users/curry/wrappers.h b/users/curry/wrappers.h index fa181af2ef..62e89a7175 100644 --- a/users/curry/wrappers.h +++ b/users/curry/wrappers.h @@ -15,18 +15,6 @@ expanded before being used as arguments to the LAYOUT_xxx macro. #define LAYOUT_ortho_4x12_wrapper(...) LAYOUT_ortho_4x12(__VA_ARGS__) #define LAYOUT_ortho_5x12_wrapper(...) LAYOUT_ortho_5x12(__VA_ARGS__) -/* -Blocks for each of the four major keyboard layouts -Organized so we can quickly adapt and modify all of them -at once, rather than for each keyboard, one at a time. -And this allows for much cleaner blocks in the keymaps. -For instance Tap/Hold for Control on all of the layouts - -NOTE: These are all the same length. If you do a search/replace - then you need to add/remove underscores to keep the - lengths consistent. -*/ - #define _________________QWERTY_L1_________________ KC_Q, KC_W, KC_E, KC_R, KC_T #define _________________QWERTY_L2_________________ KC_A, KC_S, KC_D, KC_F, KC_G #define _________________QWERTY_L3_________________ KC_Z, KC_X, KC_C, KC_V, KC_B @@ -51,6 +39,14 @@ NOTE: These are all the same length. If you do a search/replace #define _________________DVORAK_R2_________________ KC_D, KC_H, KC_T, KC_N, KC_S #define _________________DVORAK_R3_________________ KC_B, KC_M, KC_W, KC_V, KC_Z +#define _________________WORKMAN_L1________________ KC_Q, KC_D, KC_R, KC_W, KC_B +#define _________________WORKMAN_L2________________ KC_A, KC_S, KC_H, KC_T, KC_G +#define _________________WORKMAN_L3________________ KC_Z, KC_X, KC_M, KC_C, KC_V + +#define _________________WORKMAN_R1________________ KC_J, KC_F, KC_U, KC_P, KC_SCLN +#define _________________WORKMAN_R2________________ KC_Y, KC_N, KC_E, KC_O, KC_I +#define _________________WORKMAN_R3________________ KC_K, KC_L, KC_COMM, KC_DOT, KC_SLASH + #define ________________NUMBER_LEFT________________ KC_1, KC_2, KC_3, KC_4, KC_5 #define ________________NUMBER_RIGHT_______________ KC_6, KC_7, KC_8, KC_9, KC_0 @@ -67,26 +63,26 @@ NOTE: These are all the same length. If you do a search/replace #define _________________LOWER_L1__________________ _________________FUNC_LEFT_________________ #define _________________LOWER_L2__________________ _________________SYM_LEFT__________________ -#define _________________LOWER_L3__________________ KC_DT1, KC_DT2, KC_DT3, KC_DT4, _______ +#define _________________LOWER_L3__________________ KC_DT1, KC_DT2, KC_DT3, KC_DT4, KC_CCCV #define _________________LOWER_R1__________________ _________________FUNC_RIGHT________________ #define _________________LOWER_R2__________________ _________________SYM_RIGHT_________________ -#define _________________LOWER_R3__________________ _______, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR +#define _________________LOWER_R3__________________ KC_DQUO, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR #define _________________RAISE_L1__________________ ________________NUMBER_LEFT________________ #define _________________RAISE_L2__________________ KC_PGUP, KC_PGDN, KC_HOME, KC_END, _______ -#define _________________RAISE_L3__________________ _______, _______, _______, _______, _______ +#define _________________RAISE_L3__________________ UC_FLIP, UC_TABL, UC_SHRG, UC_DISA, _______ #define _________________RAISE_R1__________________ ________________NUMBER_RIGHT_______________ #define _________________RAISE_R2__________________ KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______ -#define _________________RAISE_R3__________________ _______, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC +#define _________________RAISE_R3__________________ KC_QUOT, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC #define _________________ADJUST_L1_________________ RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, RGB_TOG #define _________________ADJUST_L2_________________ MU_TOG , CK_TOGG, AU_ON, AU_OFF, CG_NORM #define _________________ADJUST_L3_________________ RGB_RMOD,RGB_HUD,RGB_SAD, RGB_VAD, KC_RGB_T #define _________________ADJUST_R1_________________ KC_SEC1, KC_SEC2, KC_SEC3, KC_SEC4, KC_SEC5 -#define _________________ADJUST_R2_________________ CG_SWAP, QWERTY, COLEMAK, DVORAK, XXXXXXX +#define _________________ADJUST_R2_________________ CG_SWAP, QWERTY, COLEMAK, DVORAK, WORKMAN #define _________________ADJUST_R3_________________ MG_NKRO, KC_MUTE, KC_VOLD, KC_VOLU, KC_MNXT // clang-format on -- cgit v1.2.3