]> git.donarmstrong.com Git - qmk_firmware.git/blobdiff - quantum/quantum.c
Remove all Makefiles from the keyboards directory. (#1660)
[qmk_firmware.git] / quantum / quantum.c
index 1f8ce6c46f52464817f37f5777256c8d27a75428..285e1e81ee37bab17bffc71e918db46e44bca876 100644 (file)
@@ -40,13 +40,12 @@ extern backlight_config_t backlight_config;
   #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)) {
@@ -162,6 +161,11 @@ void reset_keyboard(void) {
 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 */
@@ -193,6 +197,10 @@ bool process_record_quantum(keyrecord_t *record) {
     // }
 
   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) &&
@@ -241,105 +249,153 @@ bool process_record_quantum(keyrecord_t *record) {
       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();
-      }
-         return false;
-      break;
-       case RGB_MOD:
-               if (record->event.pressed) {
-                       rgblight_step();
-      }
-         return false;
-      break;
-       case RGB_HUI:
-               if (record->event.pressed) {
-                       rgblight_increase_hue();
+  #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_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:
@@ -446,7 +502,6 @@ bool process_record_quantum(keyrecord_t *record) {
         unregister_mods(MOD_BIT(KC_LSFT));
       }
       return false;
-      // break;
     }
 
     case KC_RSPC: {
@@ -469,15 +524,27 @@ bool process_record_quantum(keyrecord_t *record) {
         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;
@@ -556,7 +623,7 @@ void send_string_with_delay(const char *str, uint8_t interval) {
 }
 
 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);