#ifndef AG_SWAP_SONG
#define AG_SWAP_SONG SONG(AG_SWAP_SOUND)
#endif
- #ifndef DEFAULT_LAYER_SONGS
- #define DEFAULT_LAYER_SONGS { }
- #endif
float goodbye_song[][2] = GOODBYE_SONG;
float ag_norm_song[][2] = AG_NORM_SONG;
float ag_swap_song[][2] = AG_SWAP_SONG;
- float default_layer_songs[][16][2] = DEFAULT_LAYER_SONGS;
+ #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)) {
static bool shift_interrupted[2] = {0, 0};
static uint16_t scs_timer[2] = {0, 0};
+/* true if the last press of GRAVE_ESC was shifted (i.e. GUI or SHIFT were pressed), false otherwise.
+ * Used to ensure that the correct keycode is released if the key is released.
+ */
+static bool grave_esc_was_shifted = false;
+
bool process_record_quantum(keyrecord_t *record) {
/* This gets the keycode from the key pressed */
// }
if (!(
+ #if defined(KEY_LOCK_ENABLE)
+ // Must run first to be able to mask key_up events.
+ process_key_lock(&keycode, record) &&
+ #endif
process_record_kb(keycode, record) &&
#if defined(MIDI_ENABLE) && defined(MIDI_ADVANCED)
process_midi(keycode, record) &&
#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))
process_music(keycode, record) &&
#endif
#ifdef PRINTING_ENABLE
process_printer(keycode, record) &&
#endif
+ #ifdef AUTO_SHIFT_ENABLE
+ process_auto_shift(keycode, record) &&
+ #endif
#ifdef UNICODEMAP_ENABLE
process_unicode_map(keycode, record) &&
+ #endif
+ #ifdef TERMINAL_ENABLE
+ process_terminal(keycode, record) &&
#endif
true)) {
return false;
if (record->event.pressed) {
reset_keyboard();
}
- return false;
- break;
+ return false;
case DEBUG:
if (record->event.pressed) {
- print("\nDEBUG: enabled.\n");
debug_enable = true;
+ print("DEBUG: enabled.\n");
}
- return false;
- break;
+ return false;
#ifdef FAUXCLICKY_ENABLE
case FC_TOG:
if (record->event.pressed) {
FAUXCLICKY_TOGGLE;
}
return false;
- break;
case FC_ON:
if (record->event.pressed) {
FAUXCLICKY_ON;
}
return false;
- break;
case FC_OFF:
if (record->event.pressed) {
FAUXCLICKY_OFF;
}
return false;
- break;
#endif
- #ifdef RGBLIGHT_ENABLE
- case RGB_TOG:
- if (record->event.pressed) {
- rgblight_toggle();
+ #ifdef RGBLIGHT_ENABLE
+ case RGB_TOG:
+ if (record->event.pressed) {
+ rgblight_toggle();
+ }
+ return false;
+ case RGB_MOD:
+ if (record->event.pressed) {
+ rgblight_step();
+ }
+ return false;
+ case RGB_SMOD:
+ // same as RBG_MOD, but if shift is pressed, it will use the reverese direction instead.
+ if (record->event.pressed) {
+ uint8_t shifted = get_mods() & (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT));
+ if(shifted) {
+ rgblight_step_reverse();
}
- return false;
- break;
- case RGB_MOD:
- if (record->event.pressed) {
- rgblight_step();
+ else {
+ rgblight_step();
}
- return false;
- break;
- case RGB_HUI:
- if (record->event.pressed) {
- rgblight_increase_hue();
+ }
+ return false;
+ case RGB_HUI:
+ if (record->event.pressed) {
+ rgblight_increase_hue();
+ }
+ return false;
+ case RGB_HUD:
+ if (record->event.pressed) {
+ rgblight_decrease_hue();
+ }
+ return false;
+ case RGB_SAI:
+ if (record->event.pressed) {
+ rgblight_increase_sat();
+ }
+ return false;
+ case RGB_SAD:
+ if (record->event.pressed) {
+ rgblight_decrease_sat();
+ }
+ return false;
+ case RGB_VAI:
+ if (record->event.pressed) {
+ rgblight_increase_val();
+ }
+ return false;
+ case RGB_VAD:
+ if (record->event.pressed) {
+ rgblight_decrease_val();
+ }
+ return false;
+ case RGB_MODE_PLAIN:
+ if (record->event.pressed) {
+ rgblight_mode(1);
+ }
+ return false;
+ case RGB_MODE_BREATHE:
+ if (record->event.pressed) {
+ if ((2 <= rgblight_get_mode()) && (rgblight_get_mode() < 5)) {
+ rgblight_step();
+ } else {
+ rgblight_mode(2);
}
- return false;
- break;
- case RGB_HUD:
- if (record->event.pressed) {
- rgblight_decrease_hue();
+ }
+ return false;
+ case RGB_MODE_RAINBOW:
+ if (record->event.pressed) {
+ if ((6 <= rgblight_get_mode()) && (rgblight_get_mode() < 8)) {
+ rgblight_step();
+ } else {
+ rgblight_mode(6);
}
- return false;
- break;
- case RGB_SAI:
- if (record->event.pressed) {
- rgblight_increase_sat();
+ }
+ return false;
+ case RGB_MODE_SWIRL:
+ if (record->event.pressed) {
+ if ((9 <= rgblight_get_mode()) && (rgblight_get_mode() < 14)) {
+ rgblight_step();
+ } else {
+ rgblight_mode(9);
}
- return false;
- break;
- case RGB_SAD:
- if (record->event.pressed) {
- rgblight_decrease_sat();
+ }
+ return false;
+ case RGB_MODE_SNAKE:
+ if (record->event.pressed) {
+ if ((15 <= rgblight_get_mode()) && (rgblight_get_mode() < 20)) {
+ rgblight_step();
+ } else {
+ rgblight_mode(15);
}
- return false;
- break;
- case RGB_VAI:
- if (record->event.pressed) {
- rgblight_increase_val();
+ }
+ return false;
+ case RGB_MODE_KNIGHT:
+ if (record->event.pressed) {
+ if ((21 <= rgblight_get_mode()) && (rgblight_get_mode() < 23)) {
+ rgblight_step();
+ } else {
+ rgblight_mode(21);
}
- return false;
- break;
- case RGB_VAD:
- if (record->event.pressed) {
- rgblight_decrease_val();
+ }
+ return false;
+ case RGB_MODE_XMAS:
+ if (record->event.pressed) {
+ rgblight_mode(24);
+ }
+ return false;
+ case RGB_MODE_GRADIENT:
+ if (record->event.pressed) {
+ if ((25 <= rgblight_get_mode()) && (rgblight_get_mode() < 34)) {
+ rgblight_step();
+ } else {
+ rgblight_mode(25);
}
- return false;
- break;
- #endif
+ }
+ return false;
+ #endif
#ifdef PROTOCOL_LUFA
case OUT_AUTO:
if (record->event.pressed) {
set_output(OUTPUT_AUTO);
}
return false;
- break;
case OUT_USB:
if (record->event.pressed) {
set_output(OUTPUT_USB);
}
return false;
- break;
#ifdef BLUETOOTH_ENABLE
case OUT_BT:
if (record->event.pressed) {
set_output(OUTPUT_BLUETOOTH);
}
return false;
- break;
#endif
#endif
case MAGIC_SWAP_CONTROL_CAPSLOCK ... MAGIC_TOGGLE_NKRO:
unregister_mods(MOD_BIT(KC_LSFT));
}
return false;
- // break;
}
case KC_RSPC: {
unregister_mods(MOD_BIT(KC_RSFT));
}
return false;
- // break;
}
case GRAVE_ESC: {
- void (*method)(uint8_t) = (record->event.pressed) ? &add_key : &del_key;
uint8_t shifted = get_mods() & ((MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)
|MOD_BIT(KC_LGUI)|MOD_BIT(KC_RGUI)));
- method(shifted ? KC_GRAVE : KC_ESCAPE);
- send_keyboard_report();
+#ifdef GRAVE_ESC_CTRL_OVERRIDE
+ // if CTRL is pressed, ESC is always read as ESC, even if SHIFT or GUI is pressed.
+ // this is handy for the ctrl+shift+esc shortcut on windows, among other things.
+ if (get_mods() & (MOD_BIT(KC_LCTL) | MOD_BIT(KC_RCTL)))
+ shifted = 0;
+#endif
+
+ if (record->event.pressed) {
+ grave_esc_was_shifted = shifted;
+ add_key(shifted ? KC_GRAVE : KC_ESCAPE);
+ }
+ else {
+ del_key(grave_esc_was_shifted ? KC_GRAVE : KC_ESCAPE);
+ }
+
+ send_keyboard_report();
}
default: {
shift_interrupted[0] = true;
send_string_with_delay(str, 0);
}
+void send_string_P(const char *str) {
+ send_string_with_delay_P(str, 0);
+}
+
void send_string_with_delay(const char *str, uint8_t interval) {
while (1) {
- uint8_t keycode;
- uint8_t ascii_code = pgm_read_byte(str);
+ char ascii_code = *str;
if (!ascii_code) break;
- keycode = pgm_read_byte(&ascii_to_keycode_lut[ascii_code]);
- if (pgm_read_byte(&ascii_to_shift_lut[ascii_code])) {
- register_code(KC_LSFT);
- register_code(keycode);
- unregister_code(keycode);
- unregister_code(KC_LSFT);
+ if (ascii_code == 1) {
+ // tap
+ uint8_t keycode = *(++str);
+ register_code(keycode);
+ unregister_code(keycode);
+ } else if (ascii_code == 2) {
+ // down
+ uint8_t keycode = *(++str);
+ register_code(keycode);
+ } else if (ascii_code == 3) {
+ // up
+ uint8_t keycode = *(++str);
+ unregister_code(keycode);
+ } else {
+ send_char(ascii_code);
}
- else {
- register_code(keycode);
- unregister_code(keycode);
+ ++str;
+ // interval
+ { uint8_t ms = interval; while (ms--) wait_ms(1); }
+ }
+}
+
+void send_string_with_delay_P(const char *str, uint8_t interval) {
+ while (1) {
+ char ascii_code = pgm_read_byte(str);
+ if (!ascii_code) break;
+ if (ascii_code == 1) {
+ // tap
+ uint8_t keycode = pgm_read_byte(++str);
+ register_code(keycode);
+ unregister_code(keycode);
+ } else if (ascii_code == 2) {
+ // down
+ uint8_t keycode = pgm_read_byte(++str);
+ register_code(keycode);
+ } else if (ascii_code == 3) {
+ // up
+ uint8_t keycode = pgm_read_byte(++str);
+ unregister_code(keycode);
+ } else {
+ send_char(ascii_code);
}
++str;
// interval
}
}
+void send_char(char ascii_code) {
+ uint8_t keycode;
+ keycode = pgm_read_byte(&ascii_to_keycode_lut[(uint8_t)ascii_code]);
+ if (pgm_read_byte(&ascii_to_shift_lut[(uint8_t)ascii_code])) {
+ register_code(KC_LSFT);
+ register_code(keycode);
+ unregister_code(keycode);
+ unregister_code(KC_LSFT);
+ } else {
+ register_code(keycode);
+ unregister_code(keycode);
+ }
+}
+
void set_single_persistent_default_layer(uint8_t default_layer) {
- #ifdef AUDIO_ENABLE
+ #if defined(AUDIO_ENABLE) && defined(DEFAULT_LAYER_SONGS)
PLAY_SONG(default_layer_songs[default_layer]);
#endif
eeconfig_update_default_layer(1U<<default_layer);
// _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF);
// #endif
#endif
- }
+ }
#ifndef NO_BACKLIGHT_CLOCK
else if ( level == BACKLIGHT_LEVELS ) {
// Turn on PWM control of backlight pin
TCCR1A |= _BV(COM1x1);
// Set the brightness
OCR1x = 0xFFFF;
- }
+ }
else {
// Turn on PWM control of backlight pin
TCCR1A |= _BV(COM1x1);
void backlight_task(void) {
#ifdef NO_BACKLIGHT_CLOCK
- if ((0xFFFF >> ((BACKLIGHT_LEVELS - backlight_config.level) * ((BACKLIGHT_LEVELS + 1) / 2))) & (1 << backlight_tick)) {
+ if ((0xFFFF >> ((BACKLIGHT_LEVELS - backlight_config.level) * ((BACKLIGHT_LEVELS + 1) / 2))) & (1 << backlight_tick)) {
#if BACKLIGHT_ON_STATE == 0
// PORTx &= ~n
_SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF);