diff options
Diffstat (limited to 'quantum/quantum.c')
-rw-r--r-- | quantum/quantum.c | 2495 |
1 files changed, 1181 insertions, 1314 deletions
diff --git a/quantum/quantum.c b/quantum/quantum.c index cbd1f9df0c..61e9003b72 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c @@ -17,97 +17,89 @@ #include "quantum.h" #if !defined(RGBLIGHT_ENABLE) && !defined(RGB_MATRIX_ENABLE) - #include "rgb.h" +# include "rgb.h" #endif #ifdef PROTOCOL_LUFA -#include "outputselect.h" +# include "outputselect.h" #endif #ifndef BREATHING_PERIOD -#define BREATHING_PERIOD 6 +# define BREATHING_PERIOD 6 #endif #include "backlight.h" extern backlight_config_t backlight_config; #ifdef FAUXCLICKY_ENABLE -#include "fauxclicky.h" +# include "fauxclicky.h" #endif #ifdef API_ENABLE -#include "api.h" +# include "api.h" #endif #ifdef MIDI_ENABLE -#include "process_midi.h" +# include "process_midi.h" #endif #ifdef VELOCIKEY_ENABLE -#include "velocikey.h" +# include "velocikey.h" #endif #ifdef HAPTIC_ENABLE - #include "haptic.h" +# include "haptic.h" #endif #ifdef ENCODER_ENABLE -#include "encoder.h" +# include "encoder.h" #endif #ifdef AUDIO_ENABLE - #ifndef GOODBYE_SONG - #define GOODBYE_SONG SONG(GOODBYE_SOUND) - #endif - #ifndef AG_NORM_SONG - #define AG_NORM_SONG SONG(AG_NORM_SOUND) - #endif - #ifndef AG_SWAP_SONG - #define AG_SWAP_SONG SONG(AG_SWAP_SOUND) - #endif - #ifndef CG_NORM_SONG - #define CG_NORM_SONG SONG(AG_NORM_SOUND) - #endif - #ifndef CG_SWAP_SONG - #define CG_SWAP_SONG SONG(AG_SWAP_SOUND) - #endif - float goodbye_song[][2] = GOODBYE_SONG; - float ag_norm_song[][2] = AG_NORM_SONG; - float ag_swap_song[][2] = AG_SWAP_SONG; - float cg_norm_song[][2] = CG_NORM_SONG; - float cg_swap_song[][2] = CG_SWAP_SONG; - #ifdef DEFAULT_LAYER_SONGS - float default_layer_songs[][16][2] = DEFAULT_LAYER_SONGS; - #endif -#endif - -static void do_code16 (uint16_t code, void (*f) (uint8_t)) { - switch (code) { - case QK_MODS ... QK_MODS_MAX: - break; - default: - return; - } - - if (code & QK_LCTL) - f(KC_LCTL); - if (code & QK_LSFT) - f(KC_LSFT); - if (code & QK_LALT) - f(KC_LALT); - if (code & QK_LGUI) - f(KC_LGUI); - - if (code < QK_RMODS_MIN) return; - - if (code & QK_RCTL) - f(KC_RCTL); - if (code & QK_RSFT) - f(KC_RSFT); - if (code & QK_RALT) - f(KC_RALT); - if (code & QK_RGUI) - f(KC_RGUI); +# ifndef GOODBYE_SONG +# define GOODBYE_SONG SONG(GOODBYE_SOUND) +# endif +# ifndef AG_NORM_SONG +# define AG_NORM_SONG SONG(AG_NORM_SOUND) +# endif +# ifndef AG_SWAP_SONG +# define AG_SWAP_SONG SONG(AG_SWAP_SOUND) +# endif +# ifndef CG_NORM_SONG +# define CG_NORM_SONG SONG(AG_NORM_SOUND) +# endif +# ifndef CG_SWAP_SONG +# define CG_SWAP_SONG SONG(AG_SWAP_SOUND) +# endif +float goodbye_song[][2] = GOODBYE_SONG; +float ag_norm_song[][2] = AG_NORM_SONG; +float ag_swap_song[][2] = AG_SWAP_SONG; +float cg_norm_song[][2] = CG_NORM_SONG; +float cg_swap_song[][2] = CG_SWAP_SONG; +# ifdef DEFAULT_LAYER_SONGS +float default_layer_songs[][16][2] = DEFAULT_LAYER_SONGS; +# endif +#endif + +static void do_code16(uint16_t code, void (*f)(uint8_t)) { + switch (code) { + case QK_MODS ... QK_MODS_MAX: + break; + default: + return; + } + + if (code & QK_LCTL) f(KC_LCTL); + if (code & QK_LSFT) f(KC_LSFT); + if (code & QK_LALT) f(KC_LALT); + if (code & QK_LGUI) f(KC_LGUI); + + if (code < QK_RMODS_MIN) return; + + if (code & QK_RCTL) f(KC_RCTL); + if (code & QK_RSFT) f(KC_RSFT); + if (code & QK_RALT) f(KC_RALT); + if (code & QK_RGUI) f(KC_RGUI); } static inline void qk_register_weak_mods(uint8_t kc) { @@ -130,74 +122,64 @@ static inline void qk_unregister_mods(uint8_t kc) { send_keyboard_report(); } -void register_code16 (uint16_t code) { - if (IS_MOD(code) || code == KC_NO) { - do_code16 (code, qk_register_mods); - } else { - do_code16 (code, qk_register_weak_mods); - } - register_code (code); +void register_code16(uint16_t code) { + if (IS_MOD(code) || code == KC_NO) { + do_code16(code, qk_register_mods); + } else { + do_code16(code, qk_register_weak_mods); + } + register_code(code); } -void unregister_code16 (uint16_t code) { - unregister_code (code); - if (IS_MOD(code) || code == KC_NO) { - do_code16 (code, qk_unregister_mods); - } else { - do_code16 (code, qk_unregister_weak_mods); - } +void unregister_code16(uint16_t code) { + unregister_code(code); + if (IS_MOD(code) || code == KC_NO) { + do_code16(code, qk_unregister_mods); + } else { + do_code16(code, qk_unregister_weak_mods); + } } void tap_code16(uint16_t code) { - register_code16(code); - #if TAP_CODE_DELAY > 0 + register_code16(code); +#if TAP_CODE_DELAY > 0 wait_ms(TAP_CODE_DELAY); - #endif - unregister_code16(code); +#endif + unregister_code16(code); } -__attribute__ ((weak)) -bool process_action_kb(keyrecord_t *record) { - return true; -} +__attribute__((weak)) bool process_action_kb(keyrecord_t *record) { return true; } -__attribute__ ((weak)) -bool process_record_kb(uint16_t keycode, keyrecord_t *record) { - return process_record_user(keycode, record); -} +__attribute__((weak)) bool process_record_kb(uint16_t keycode, keyrecord_t *record) { return process_record_user(keycode, record); } -__attribute__ ((weak)) -bool process_record_user(uint16_t keycode, keyrecord_t *record) { - return true; -} +__attribute__((weak)) bool process_record_user(uint16_t keycode, keyrecord_t *record) { return true; } void reset_keyboard(void) { - clear_keyboard(); + clear_keyboard(); #if defined(MIDI_ENABLE) && defined(MIDI_BASIC) - process_midi_all_notes_off(); + process_midi_all_notes_off(); #endif #ifdef AUDIO_ENABLE - #ifndef NO_MUSIC_MODE +# ifndef NO_MUSIC_MODE music_all_notes_off(); - #endif - uint16_t timer_start = timer_read(); - PLAY_SONG(goodbye_song); - shutdown_user(); - while(timer_elapsed(timer_start) < 250) - wait_ms(1); - stop_all_notes(); +# endif + uint16_t timer_start = timer_read(); + PLAY_SONG(goodbye_song); + shutdown_user(); + while (timer_elapsed(timer_start) < 250) wait_ms(1); + stop_all_notes(); #else - shutdown_user(); - wait_ms(250); + shutdown_user(); + wait_ms(250); #endif #ifdef HAPTIC_ENABLE - haptic_shutdown(); + haptic_shutdown(); #endif // this is also done later in bootloader.c - not sure if it's neccesary here #ifdef BOOTLOADER_CATERINA - *(uint16_t *)0x0800 = 0x7777; // these two are a-star-specific + *(uint16_t *)0x0800 = 0x7777; // these two are a-star-specific #endif - bootloader_jump(); + bootloader_jump(); } /* true if the last press of GRAVE_ESC was shifted (i.e. GUI or SHIFT were pressed), false otherwise. @@ -206,31 +188,27 @@ void reset_keyboard(void) { static bool grave_esc_was_shifted = false; /* Convert record into usable keycode via the contained event. */ -uint16_t get_record_keycode(keyrecord_t *record) { - return get_event_keycode(record->event); -} - +uint16_t get_record_keycode(keyrecord_t *record) { return get_event_keycode(record->event); } /* Convert event into usable keycode. Checks the layer cache to ensure that it * retains the correct keycode after a layer change, if the key is still pressed. */ uint16_t get_event_keycode(keyevent_t event) { - - #if !defined(NO_ACTION_LAYER) && !defined(STRICT_LAYER_RELEASE) +#if !defined(NO_ACTION_LAYER) && !defined(STRICT_LAYER_RELEASE) /* TODO: Use store_or_get_action() or a similar function. */ if (!disable_action_cache) { - uint8_t layer; - - if (event.pressed) { - layer = layer_switch_get_layer(event.key); - update_source_layers_cache(event.key, layer); - } else { - layer = read_source_layers_cache(event.key); - } - return keymap_key_to_keycode(layer, event.key); + uint8_t layer; + + if (event.pressed) { + layer = layer_switch_get_layer(event.key); + update_source_layers_cache(event.key, layer); + } else { + layer = read_source_layers_cache(event.key); + } + return keymap_key_to_keycode(layer, event.key); } else - #endif - return keymap_key_to_keycode(layer_switch_get_layer(event.key), event.key); +#endif + return keymap_key_to_keycode(layer_switch_get_layer(event.key), event.key); } /* Main keycode processing function. Hands off handling to other functions, @@ -247,629 +225,582 @@ bool process_record_quantum(keyrecord_t *record) { // return false; // } - #ifdef VELOCIKEY_ENABLE - if (velocikey_enabled() && record->event.pressed) { velocikey_accelerate(); } - #endif +#ifdef VELOCIKEY_ENABLE + if (velocikey_enabled() && record->event.pressed) { + velocikey_accelerate(); + } +#endif - #ifdef TAP_DANCE_ENABLE +#ifdef TAP_DANCE_ENABLE preprocess_tap_dance(keycode, record); - #endif - - if (!( - #if defined(KEY_LOCK_ENABLE) - // Must run first to be able to mask key_up events. - process_key_lock(&keycode, record) && - #endif - #if defined(AUDIO_ENABLE) && defined(AUDIO_CLICKY) - process_clicky(keycode, record) && - #endif //AUDIO_CLICKY - #ifdef HAPTIC_ENABLE - process_haptic(keycode, record) && - #endif //HAPTIC_ENABLE - #if defined(RGB_MATRIX_ENABLE) - process_rgb_matrix(keycode, record) && - #endif - process_record_kb(keycode, record) && - #if defined(MIDI_ENABLE) && defined(MIDI_ADVANCED) - process_midi(keycode, record) && - #endif - #ifdef AUDIO_ENABLE - process_audio(keycode, record) && - #endif - #ifdef STENO_ENABLE - process_steno(keycode, record) && - #endif - #if (defined(AUDIO_ENABLE) || (defined(MIDI_ENABLE) && defined(MIDI_BASIC))) && !defined(NO_MUSIC_MODE) - process_music(keycode, record) && - #endif - #ifdef TAP_DANCE_ENABLE - process_tap_dance(keycode, record) && - #endif - #if defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE) - process_unicode_common(keycode, record) && - #endif - #ifdef LEADER_ENABLE - process_leader(keycode, record) && - #endif - #ifdef COMBO_ENABLE - process_combo(keycode, record) && - #endif - #ifdef PRINTING_ENABLE - process_printer(keycode, record) && - #endif - #ifdef AUTO_SHIFT_ENABLE - process_auto_shift(keycode, record) && - #endif - #ifdef TERMINAL_ENABLE - process_terminal(keycode, record) && - #endif - #ifdef SPACE_CADET_ENABLE - process_space_cadet(keycode, record) && - #endif - true)) { - return false; - } - - // Shift / paren setup - - switch(keycode) { - case RESET: - if (record->event.pressed) { - reset_keyboard(); - } - return false; - case DEBUG: - if (record->event.pressed) { - debug_enable ^= 1; - if (debug_enable) { - print("DEBUG: enabled.\n"); - } else { - print("DEBUG: disabled.\n"); - } - } - return false; - case EEPROM_RESET: - if (record->event.pressed) { - eeconfig_init(); - } - return false; - #ifdef FAUXCLICKY_ENABLE - case FC_TOG: - if (record->event.pressed) { - FAUXCLICKY_TOGGLE; - } - return false; - case FC_ON: - if (record->event.pressed) { - FAUXCLICKY_ON; - } - return false; - case FC_OFF: - if (record->event.pressed) { - FAUXCLICKY_OFF; - } - return false; - #endif - #if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE) - case RGB_TOG: - // Split keyboards need to trigger on key-up for edge-case issue - #ifndef SPLIT_KEYBOARD - if (record->event.pressed) { - #else - if (!record->event.pressed) { - #endif - rgblight_toggle(); - } - return false; - case RGB_MODE_FORWARD: - if (record->event.pressed) { - uint8_t shifted = get_mods() & (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)); - if(shifted) { - rgblight_step_reverse(); - } - else { - rgblight_step(); - } - } - return false; - case RGB_MODE_REVERSE: - if (record->event.pressed) { - uint8_t shifted = get_mods() & (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)); - if(shifted) { - rgblight_step(); - } - else { - rgblight_step_reverse(); - } - } - return false; - case RGB_HUI: - // Split keyboards need to trigger on key-up for edge-case issue - #ifndef SPLIT_KEYBOARD - if (record->event.pressed) { - #else - if (!record->event.pressed) { - #endif - rgblight_increase_hue(); - } - return false; - case RGB_HUD: - // Split keyboards need to trigger on key-up for edge-case issue - #ifndef SPLIT_KEYBOARD - if (record->event.pressed) { - #else - if (!record->event.pressed) { - #endif - rgblight_decrease_hue(); - } - return false; - case RGB_SAI: - // Split keyboards need to trigger on key-up for edge-case issue - #ifndef SPLIT_KEYBOARD - if (record->event.pressed) { - #else - if (!record->event.pressed) { - #endif - rgblight_increase_sat(); - } - return false; - case RGB_SAD: - // Split keyboards need to trigger on key-up for edge-case issue - #ifndef SPLIT_KEYBOARD - if (record->event.pressed) { - #else - if (!record->event.pressed) { - #endif - rgblight_decrease_sat(); - } - return false; - case RGB_VAI: - // Split keyboards need to trigger on key-up for edge-case issue - #ifndef SPLIT_KEYBOARD - if (record->event.pressed) { - #else - if (!record->event.pressed) { - #endif - rgblight_increase_val(); - } - return false; - case RGB_VAD: - // Split keyboards need to trigger on key-up for edge-case issue - #ifndef SPLIT_KEYBOARD - if (record->event.pressed) { - #else - if (!record->event.pressed) { - #endif - rgblight_decrease_val(); - } - return false; - case RGB_SPI: - if (record->event.pressed) { - rgblight_increase_speed(); - } - return false; - case RGB_SPD: - if (record->event.pressed) { - rgblight_decrease_speed(); - } - return false; - case RGB_MODE_PLAIN: - if (record->event.pressed) { - rgblight_mode(RGBLIGHT_MODE_STATIC_LIGHT); - } - return false; - case RGB_MODE_BREATHE: - #ifdef RGBLIGHT_EFFECT_BREATHING - if (record->event.pressed) { - if ((RGBLIGHT_MODE_BREATHING <= rgblight_get_mode()) && - (rgblight_get_mode() < RGBLIGHT_MODE_BREATHING_end)) { - rgblight_step(); - } else { - rgblight_mode(RGBLIGHT_MODE_BREATHING); - } - } - #endif - return false; - case RGB_MODE_RAINBOW: - #ifdef RGBLIGHT_EFFECT_RAINBOW_MOOD - if (record->event.pressed) { - if ((RGBLIGHT_MODE_RAINBOW_MOOD <= rgblight_get_mode()) && - (rgblight_get_mode() < RGBLIGHT_MODE_RAINBOW_MOOD_end)) { - rgblight_step(); - } else { - rgblight_mode(RGBLIGHT_MODE_RAINBOW_MOOD); - } - } - #endif - return false; - case RGB_MODE_SWIRL: - #ifdef RGBLIGHT_EFFECT_RAINBOW_SWIRL - if (record->event.pressed) { - if ((RGBLIGHT_MODE_RAINBOW_SWIRL <= rgblight_get_mode()) && - (rgblight_get_mode() < RGBLIGHT_MODE_RAINBOW_SWIRL_end)) { - rgblight_step(); - } else { - rgblight_mode(RGBLIGHT_MODE_RAINBOW_SWIRL); - } - } - #endif - return false; - case RGB_MODE_SNAKE: - #ifdef RGBLIGHT_EFFECT_SNAKE - if (record->event.pressed) { - if ((RGBLIGHT_MODE_SNAKE <= rgblight_get_mode()) && - (rgblight_get_mode() < RGBLIGHT_MODE_SNAKE_end)) { - rgblight_step(); - } else { - rgblight_mode(RGBLIGHT_MODE_SNAKE); - } - } - #endif - return false; - case RGB_MODE_KNIGHT: - #ifdef RGBLIGHT_EFFECT_KNIGHT - if (record->event.pressed) { - if ((RGBLIGHT_MODE_KNIGHT <= rgblight_get_mode()) && - (rgblight_get_mode() < RGBLIGHT_MODE_KNIGHT_end)) { - rgblight_step(); - } else { - rgblight_mode(RGBLIGHT_MODE_KNIGHT); - } - } - #endif - return false; - case RGB_MODE_XMAS: - #ifdef RGBLIGHT_EFFECT_CHRISTMAS - if (record->event.pressed) { - rgblight_mode(RGBLIGHT_MODE_CHRISTMAS); - } - #endif - return false; - case RGB_MODE_GRADIENT: - #ifdef RGBLIGHT_EFFECT_STATIC_GRADIENT - if (record->event.pressed) { - if ((RGBLIGHT_MODE_STATIC_GRADIENT <= rgblight_get_mode()) && - (rgblight_get_mode() < RGBLIGHT_MODE_STATIC_GRADIENT_end)) { - rgblight_step(); - } else { - rgblight_mode(RGBLIGHT_MODE_STATIC_GRADIENT); - } - } - #endif - return false; - case RGB_MODE_RGBTEST: - #ifdef RGBLIGHT_EFFECT_RGB_TEST - if (record->event.pressed) { - rgblight_mode(RGBLIGHT_MODE_RGB_TEST); - } - #endif - return false; - #endif // defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE) - #ifdef VELOCIKEY_ENABLE - case VLK_TOG: - if (record->event.pressed) { - velocikey_toggle(); - } - return false; - #endif - #ifdef PROTOCOL_LUFA - case OUT_AUTO: - if (record->event.pressed) { - set_output(OUTPUT_AUTO); - } - return false; - case OUT_USB: - if (record->event.pressed) { - set_output(OUTPUT_USB); - } - return false; - #ifdef BLUETOOTH_ENABLE - case OUT_BT: - if (record->event.pressed) { - set_output(OUTPUT_BLUETOOTH); - } - return false; - #endif - #endif - case MAGIC_SWAP_CONTROL_CAPSLOCK ... MAGIC_TOGGLE_ALT_GUI: - case MAGIC_SWAP_LCTL_LGUI ... MAGIC_TOGGLE_CTL_GUI: - if (record->event.pressed) { - // MAGIC actions (BOOTMAGIC without the boot) - if (!eeconfig_is_enabled()) { - eeconfig_init(); - } - /* keymap config */ - keymap_config.raw = eeconfig_read_keymap(); - switch (keycode) - { - case MAGIC_SWAP_CONTROL_CAPSLOCK: - keymap_config.swap_control_capslock = true; - break; - case MAGIC_CAPSLOCK_TO_CONTROL: - keymap_config.capslock_to_control = true; - break; - case MAGIC_SWAP_LALT_LGUI: - keymap_config.swap_lalt_lgui = true; - break; - case MAGIC_SWAP_RALT_RGUI: - keymap_config.swap_ralt_rgui = true; - break; - case MAGIC_SWAP_LCTL_LGUI: - keymap_config.swap_lctl_lgui = true; - break; - case MAGIC_SWAP_RCTL_RGUI: - keymap_config.swap_rctl_rgui = true; - break; - case MAGIC_NO_GUI: - keymap_config.no_gui = true; - break; - case MAGIC_SWAP_GRAVE_ESC: - keymap_config.swap_grave_esc = true; - break; - case MAGIC_SWAP_BACKSLASH_BACKSPACE: - keymap_config.swap_backslash_backspace = true; - break; - case MAGIC_HOST_NKRO: - keymap_config.nkro = true; - break; - case MAGIC_SWAP_ALT_GUI: - keymap_config.swap_lalt_lgui = keymap_config.swap_ralt_rgui = true; - #ifdef AUDIO_ENABLE - PLAY_SONG(ag_swap_song); - #endif - break; - case MAGIC_SWAP_CTL_GUI: - keymap_config.swap_lctl_lgui = keymap_config.swap_rctl_rgui = true; - #ifdef AUDIO_ENABLE - PLAY_SONG(cg_swap_song); - #endif - break; - case MAGIC_UNSWAP_CONTROL_CAPSLOCK: - keymap_config.swap_control_capslock = false; - break; - case MAGIC_UNCAPSLOCK_TO_CONTROL: - keymap_config.capslock_to_control = false; - break; - case MAGIC_UNSWAP_LALT_LGUI: - keymap_config.swap_lalt_lgui = false; - break; - case MAGIC_UNSWAP_RALT_RGUI: - keymap_config.swap_ralt_rgui = false; - break; - case MAGIC_UNSWAP_LCTL_LGUI: - keymap_config.swap_lctl_lgui = false; - break; - case MAGIC_UNSWAP_RCTL_RGUI: - keymap_config.swap_rctl_rgui = false; - break; - case MAGIC_UNNO_GUI: - keymap_config.no_gui = false; - break; - case MAGIC_UNSWAP_GRAVE_ESC: - keymap_config.swap_grave_esc = false; - break; - case MAGIC_UNSWAP_BACKSLASH_BACKSPACE: - keymap_config.swap_backslash_backspace = false; - break; - case MAGIC_UNHOST_NKRO: - keymap_config.nkro = false; - break; - case MAGIC_UNSWAP_ALT_GUI: - keymap_config.swap_lalt_lgui = keymap_config.swap_ralt_rgui = false; - #ifdef AUDIO_ENABLE - PLAY_SONG(ag_norm_song); - #endif - break; - case MAGIC_UNSWAP_CTL_GUI: - keymap_config.swap_lctl_lgui = keymap_config.swap_rctl_rgui = false; - #ifdef AUDIO_ENABLE - PLAY_SONG(cg_norm_song); - #endif - break; - case MAGIC_TOGGLE_ALT_GUI: - keymap_config.swap_lalt_lgui = !keymap_config.swap_lalt_lgui; - keymap_config.swap_ralt_rgui = keymap_config.swap_lalt_lgui; - #ifdef AUDIO_ENABLE - if (keymap_config.swap_ralt_rgui) { - PLAY_SONG(ag_swap_song); - } else { - PLAY_SONG(ag_norm_song); - } - #endif - break; - case MAGIC_TOGGLE_CTL_GUI: - keymap_config.swap_lctl_lgui = !keymap_config.swap_lctl_lgui; - keymap_config.swap_rctl_rgui = keymap_config.swap_lctl_lgui; - #ifdef AUDIO_ENABLE - if (keymap_config.swap_rctl_rgui) { - PLAY_SONG(cg_swap_song); - } else { - PLAY_SONG(cg_norm_song); - } - #endif - break; - case MAGIC_TOGGLE_NKRO: - keymap_config.nkro = !keymap_config.nkro; - break; - default: - break; - } - eeconfig_update_keymap(keymap_config.raw); - clear_keyboard(); // clear to prevent stuck keys +#endif + if (!( +#if defined(KEY_LOCK_ENABLE) + // Must run first to be able to mask key_up events. + process_key_lock(&keycode, record) && +#endif +#if defined(AUDIO_ENABLE) && defined(AUDIO_CLICKY) + process_clicky(keycode, record) && +#endif // AUDIO_CLICKY +#ifdef HAPTIC_ENABLE + process_haptic(keycode, record) && +#endif // HAPTIC_ENABLE +#if defined(RGB_MATRIX_ENABLE) + process_rgb_matrix(keycode, record) && +#endif + process_record_kb(keycode, record) && +#if defined(MIDI_ENABLE) && defined(MIDI_ADVANCED) + process_midi(keycode, record) && +#endif +#ifdef AUDIO_ENABLE + process_audio(keycode, record) && +#endif +#ifdef STENO_ENABLE + process_steno(keycode, record) && +#endif +#if (defined(AUDIO_ENABLE) || (defined(MIDI_ENABLE) && defined(MIDI_BASIC))) && !defined(NO_MUSIC_MODE) + process_music(keycode, record) && +#endif +#ifdef TAP_DANCE_ENABLE + process_tap_dance(keycode, record) && +#endif +#if defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE) + process_unicode_common(keycode, record) && +#endif +#ifdef LEADER_ENABLE + process_leader(keycode, record) && +#endif +#ifdef COMBO_ENABLE + process_combo(keycode, record) && +#endif +#ifdef PRINTING_ENABLE + process_printer(keycode, record) && +#endif +#ifdef AUTO_SHIFT_ENABLE + process_auto_shift(keycode, record) && +#endif +#ifdef TERMINAL_ENABLE + process_terminal(keycode, record) && +#endif +#ifdef SPACE_CADET_ENABLE + process_space_cadet(keycode, record) && +#endif + true)) { return false; - } - break; + } - case GRAVE_ESC: { - uint8_t shifted = get_mods() & ((MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT) - |MOD_BIT(KC_LGUI)|MOD_BIT(KC_RGUI))); + // Shift / paren setup + + switch (keycode) { + case RESET: + if (record->event.pressed) { + reset_keyboard(); + } + return false; + case DEBUG: + if (record->event.pressed) { + debug_enable ^= 1; + if (debug_enable) { + print("DEBUG: enabled.\n"); + } else { + print("DEBUG: disabled.\n"); + } + } + return false; + case EEPROM_RESET: + if (record->event.pressed) { + eeconfig_init(); + } + return false; +#ifdef FAUXCLICKY_ENABLE + case FC_TOG: + if (record->event.pressed) { + FAUXCLICKY_TOGGLE; + } + return false; + case FC_ON: + if (record->event.pressed) { + FAUXCLICKY_ON; + } + return false; + case FC_OFF: + if (record->event.pressed) { + FAUXCLICKY_OFF; + } + return false; +#endif +#if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE) + case RGB_TOG: +// Split keyboards need to trigger on key-up for edge-case issue +# ifndef SPLIT_KEYBOARD + if (record->event.pressed) { +# else + if (!record->event.pressed) { +# endif + rgblight_toggle(); + } + return false; + case RGB_MODE_FORWARD: + if (record->event.pressed) { + uint8_t shifted = get_mods() & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)); + if (shifted) { + rgblight_step_reverse(); + } else { + rgblight_step(); + } + } + return false; + case RGB_MODE_REVERSE: + if (record->event.pressed) { + uint8_t shifted = get_mods() & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)); + if (shifted) { + rgblight_step(); + } else { + rgblight_step_reverse(); + } + } + return false; + case RGB_HUI: +// Split keyboards need to trigger on key-up for edge-case issue +# ifndef SPLIT_KEYBOARD + if (record->event.pressed) { +# else + if (!record->event.pressed) { +# endif + rgblight_increase_hue(); + } + return false; + case RGB_HUD: +// Split keyboards need to trigger on key-up for edge-case issue +# ifndef SPLIT_KEYBOARD + if (record->event.pressed) { +# else + if (!record->event.pressed) { +# endif + rgblight_decrease_hue(); + } + return false; + case RGB_SAI: +// Split keyboards need to trigger on key-up for edge-case issue +# ifndef SPLIT_KEYBOARD + if (record->event.pressed) { +# else + if (!record->event.pressed) { +# endif + rgblight_increase_sat(); + } + return false; + case RGB_SAD: +// Split keyboards need to trigger on key-up for edge-case issue +# ifndef SPLIT_KEYBOARD + if (record->event.pressed) { +# else + if (!record->event.pressed) { +# endif + rgblight_decrease_sat(); + } + return false; + case RGB_VAI: +// Split keyboards need to trigger on key-up for edge-case issue +# ifndef SPLIT_KEYBOARD + if (record->event.pressed) { +# else + if (!record->event.pressed) { +# endif + rgblight_increase_val(); + } + return false; + case RGB_VAD: +// Split keyboards need to trigger on key-up for edge-case issue +# ifndef SPLIT_KEYBOARD + if (record->event.pressed) { +# else + if (!record->event.pressed) { +# endif + rgblight_decrease_val(); + } + return false; + case RGB_SPI: + if (record->event.pressed) { + rgblight_increase_speed(); + } + return false; + case RGB_SPD: + if (record->event.pressed) { + rgblight_decrease_speed(); + } + return false; + case RGB_MODE_PLAIN: + if (record->event.pressed) { + rgblight_mode(RGBLIGHT_MODE_STATIC_LIGHT); + } + return false; + case RGB_MODE_BREATHE: +# ifdef RGBLIGHT_EFFECT_BREATHING + if (record->event.pressed) { + if ((RGBLIGHT_MODE_BREATHING <= rgblight_get_mode()) && (rgblight_get_mode() < RGBLIGHT_MODE_BREATHING_end)) { + rgblight_step(); + } else { + rgblight_mode(RGBLIGHT_MODE_BREATHING); + } + } +# endif + return false; + case RGB_MODE_RAINBOW: +# ifdef RGBLIGHT_EFFECT_RAINBOW_MOOD + if (record->event.pressed) { + if ((RGBLIGHT_MODE_RAINBOW_MOOD <= rgblight_get_mode()) && (rgblight_get_mode() < RGBLIGHT_MODE_RAINBOW_MOOD_end)) { + rgblight_step(); + } else { + rgblight_mode(RGBLIGHT_MODE_RAINBOW_MOOD); + } + } +# endif + return false; + case RGB_MODE_SWIRL: +# ifdef RGBLIGHT_EFFECT_RAINBOW_SWIRL + if (record->event.pressed) { + if ((RGBLIGHT_MODE_RAINBOW_SWIRL <= rgblight_get_mode()) && (rgblight_get_mode() < RGBLIGHT_MODE_RAINBOW_SWIRL_end)) { + rgblight_step(); + } else { + rgblight_mode(RGBLIGHT_MODE_RAINBOW_SWIRL); + } + } +# endif + return false; + case RGB_MODE_SNAKE: +# ifdef RGBLIGHT_EFFECT_SNAKE + if (record->event.pressed) { + if ((RGBLIGHT_MODE_SNAKE <= rgblight_get_mode()) && (rgblight_get_mode() < RGBLIGHT_MODE_SNAKE_end)) { + rgblight_step(); + } else { + rgblight_mode(RGBLIGHT_MODE_SNAKE); + } + } +# endif + return false; + case RGB_MODE_KNIGHT: +# ifdef RGBLIGHT_EFFECT_KNIGHT + if (record->event.pressed) { + if ((RGBLIGHT_MODE_KNIGHT <= rgblight_get_mode()) && (rgblight_get_mode() < RGBLIGHT_MODE_KNIGHT_end)) { + rgblight_step(); + } else { + rgblight_mode(RGBLIGHT_MODE_KNIGHT); + } + } +# endif + return false; + case RGB_MODE_XMAS: +# ifdef RGBLIGHT_EFFECT_CHRISTMAS + if (record->event.pressed) { + rgblight_mode(RGBLIGHT_MODE_CHRISTMAS); + } +# endif + return false; + case RGB_MODE_GRADIENT: +# ifdef RGBLIGHT_EFFECT_STATIC_GRADIENT + if (record->event.pressed) { + if ((RGBLIGHT_MODE_STATIC_GRADIENT <= rgblight_get_mode()) && (rgblight_get_mode() < RGBLIGHT_MODE_STATIC_GRADIENT_end)) { + rgblight_step(); + } else { + rgblight_mode(RGBLIGHT_MODE_STATIC_GRADIENT); + } + } +# endif + return false; + case RGB_MODE_RGBTEST: +# ifdef RGBLIGHT_EFFECT_RGB_TEST + if (record->event.pressed) { + rgblight_mode(RGBLIGHT_MODE_RGB_TEST); + } +# endif + return false; +#endif // defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE) +#ifdef VELOCIKEY_ENABLE + case VLK_TOG: + if (record->event.pressed) { + velocikey_toggle(); + } + return false; +#endif +#ifdef PROTOCOL_LUFA + case OUT_AUTO: + if (record->event.pressed) { + set_output(OUTPUT_AUTO); + } + return false; + case OUT_USB: + if (record->event.pressed) { + set_output(OUTPUT_USB); + } + return false; +# ifdef BLUETOOTH_ENABLE + case OUT_BT: + if (record->event.pressed) { + set_output(OUTPUT_BLUETOOTH); + } + return false; +# endif +#endif + case MAGIC_SWAP_CONTROL_CAPSLOCK ... MAGIC_TOGGLE_ALT_GUI: + case MAGIC_SWAP_LCTL_LGUI ... MAGIC_TOGGLE_CTL_GUI: + if (record->event.pressed) { + // MAGIC actions (BOOTMAGIC without the boot) + if (!eeconfig_is_enabled()) { + eeconfig_init(); + } + /* keymap config */ + keymap_config.raw = eeconfig_read_keymap(); + switch (keycode) { + case MAGIC_SWAP_CONTROL_CAPSLOCK: + keymap_config.swap_control_capslock = true; + break; + case MAGIC_CAPSLOCK_TO_CONTROL: + keymap_config.capslock_to_control = true; + break; + case MAGIC_SWAP_LALT_LGUI: + keymap_config.swap_lalt_lgui = true; + break; + case MAGIC_SWAP_RALT_RGUI: + keymap_config.swap_ralt_rgui = true; + break; + case MAGIC_SWAP_LCTL_LGUI: + keymap_config.swap_lctl_lgui = true; + break; + case MAGIC_SWAP_RCTL_RGUI: + keymap_config.swap_rctl_rgui = true; + break; + case MAGIC_NO_GUI: + keymap_config.no_gui = true; + break; + case MAGIC_SWAP_GRAVE_ESC: + keymap_config.swap_grave_esc = true; + break; + case MAGIC_SWAP_BACKSLASH_BACKSPACE: + keymap_config.swap_backslash_backspace = true; + break; + case MAGIC_HOST_NKRO: + keymap_config.nkro = true; + break; + case MAGIC_SWAP_ALT_GUI: + keymap_config.swap_lalt_lgui = keymap_config.swap_ralt_rgui = true; +#ifdef AUDIO_ENABLE + PLAY_SONG(ag_swap_song); +#endif + break; + case MAGIC_SWAP_CTL_GUI: + keymap_config.swap_lctl_lgui = keymap_config.swap_rctl_rgui = true; |