]> git.donarmstrong.com Git - qmk_firmware.git/blobdiff - quantum/keymap_common.c
zweihander-osx: use eject instead of power
[qmk_firmware.git] / quantum / keymap_common.c
index 7068ca4f3152e78d8d6af5fd4d9b51b7c790ee38..ba7269388bc749152d0846e7f3311cc0a46616f1 100644 (file)
@@ -24,142 +24,33 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #include "action_macro.h"
 #include "debug.h"
 #include "backlight.h"
-#include "keymap_midi.h"
+#include "bootloader.h"
+#include "eeconfig.h"
+#include "quantum.h"
+
+#ifdef MIDI_ENABLE
+       #include "keymap_midi.h"
+#endif
+
+extern keymap_config_t keymap_config;
 
 #include <stdio.h>
 #include <inttypes.h>
 #ifdef AUDIO_ENABLE
     #include "audio.h"
-
-    float goodbye[][2] = {
-        {440.0*pow(2.0,(67)/12.0), 400},
-        {0, 50},
-        {440.0*pow(2.0,(60)/12.0), 400},
-        {0, 50},
-        {440.0*pow(2.0,(55)/12.0), 600},
-    };
-#endif
+#endif /* AUDIO_ENABLE */
 
 static action_t keycode_to_action(uint16_t keycode);
 
 /* converts key to action */
 action_t action_for_key(uint8_t layer, keypos_t key)
 {
-       // 16bit keycodes - important
+    // 16bit keycodes - important
     uint16_t keycode = keymap_key_to_keycode(layer, key);
 
-    if (keycode >= 0x0100 && keycode < 0x2000) {
-       // Has a modifier
-       action_t action;
-       // Split it up
-       action.code = ACTION_MODS_KEY(keycode >> 8, keycode & 0xFF); // adds modifier to key
-       return action;
-       } else if (keycode >= 0x2000 && keycode < 0x3000) {
-        // Is a shortcut for function layer, pull last 12bits
-        // This means we have 4,096 FN macros at our disposal
-        return keymap_func_to_action(keycode & 0xFFF);
-       } else if (keycode >= 0x3000 && keycode < 0x4000) {
-      // When the code starts with 3, it's an action macro.
-       action_t action;
-       action.code = ACTION_MACRO(keycode & 0xFF);
-       return action;
-#ifdef BACKLIGHT_ENABLE
-       } else if (keycode >= BL_0 && keycode <= BL_15) {
-        action_t action;
-        action.code = ACTION_BACKLIGHT_LEVEL(keycode & 0x000F);
-        return action;
-    } else if (keycode == BL_DEC) {
-        action_t action;
-        action.code = ACTION_BACKLIGHT_DECREASE();
-        return action;
-    } else if (keycode == BL_INC) {
-        action_t action;
-        action.code = ACTION_BACKLIGHT_INCREASE();
-        return action;
-    } else if (keycode == BL_TOGG) {
-        action_t action;
-        action.code = ACTION_BACKLIGHT_TOGGLE();
-        return action;
-    } else if (keycode == BL_STEP) {
-        action_t action;
-        action.code = ACTION_BACKLIGHT_STEP();
-        return action;
-#endif
-    } else if (keycode == RESET) { // RESET is 0x5000, which is why this is here
-        clear_keyboard();
-        #ifdef AUDIO_ENABLE
-            play_notes(&goodbye, 5, false);
-        #endif
-        _delay_ms(250);
-        #ifdef ATREUS_ASTAR
-            *(uint16_t *)0x0800 = 0x7777; // these two are a-star-specific
-        #endif
-        bootloader_jump();
-        return;
-    } else if (keycode == DEBUG) { // DEBUG is 0x5001
-      // TODO: Does this actually work?
-        print("\nDEBUG: enabled.\n");
-        debug_enable = true;
-        return;
-    } else if (keycode >= 0x5000 && keycode < 0x6000) {
-        // Layer movement shortcuts
-        // See .h to see constraints/usage
-        int type = (keycode >> 0x8) & 0xF;
-        if (type == 0x1) {
-            // Layer set "GOTO"
-            int when = (keycode >> 0x4) & 0x3;
-            int layer = keycode & 0xF;
-            action_t action;
-            action.code = ACTION_LAYER_SET(layer, when);
-            return action;
-        } else if (type == 0x2) {
-            // Momentary layer
-            int layer = keycode & 0xFF;
-            action_t action;
-            action.code = ACTION_LAYER_MOMENTARY(layer);
-            return action;
-        } else if (type == 0x3) {
-            // Set default layer
-            int layer = keycode & 0xFF;
-            action_t action;
-            action.code = ACTION_DEFAULT_LAYER_SET(layer);
-            return action;
-        } else if (type == 0x4) {
-            // Set default layer
-            int layer = keycode & 0xFF;
-            action_t action;
-            action.code = ACTION_LAYER_TOGGLE(layer);
-            return action;
-        }
-#ifdef MIDI_ENABLE
-    } else if (keycode >= 0x6000 && keycode < 0x7000) {
-        action_t action;
-        action.code =  ACTION_FUNCTION_OPT(keycode & 0xFF, (keycode & 0x0F00) >> 8);
-        return action;
-#endif
-    } else if (keycode >= 0x7000 && keycode < 0x8000) {
-        action_t action;
-        action.code = ACTION_MODS_TAP_KEY((keycode >> 0x8) & 0xF, keycode & 0xFF);
-        return action;
-    } else if (keycode >= 0x8000 && keycode < 0x9000) {
-        action_t action;
-        action.code = ACTION_LAYER_TAP_KEY((keycode >> 0x8) & 0xF, keycode & 0xFF);
-        return action;
-#ifdef UNICODE_ENABLE
-    } else if (keycode >= 0x8000000) {
-        action_t action;
-        uint16_t unicode = keycode & ~(0x8000);
-        action.code =  ACTION_FUNCTION_OPT(unicode & 0xFF, (unicode & 0xFF00) >> 8);
-        return action;
-#endif
-    } else {
-
-    }
-
     switch (keycode) {
         case KC_FN0 ... KC_FN31:
             return keymap_fn_to_action(keycode);
-#ifdef BOOTMAGIC_ENABLE
         case KC_CAPSLOCK:
         case KC_LOCKING_CAPS:
             if (keymap_config.swap_control_capslock || keymap_config.capslock_to_control) {
@@ -223,7 +114,6 @@ action_t action_for_key(uint8_t layer, keypos_t key)
                 return keycode_to_action(KC_BSLASH);
             }
             return keycode_to_action(KC_BSPACE);
-#endif
         default:
             return keycode_to_action(keycode);
     }
@@ -264,6 +154,139 @@ static action_t keycode_to_action(uint16_t keycode)
         case KC_TRNS:
             action.code = ACTION_TRANSPARENT;
             break;
+        case LCTL(0) ... 0x1FFF: ;
+            // Has a modifier
+            // Split it up
+            action.code = ACTION_MODS_KEY(keycode >> 8, keycode & 0xFF); // adds modifier to key
+            break;
+        case FUNC(0) ... FUNC(0xFFF): ;
+            // Is a shortcut for function layer, pull last 12bits
+            // This means we have 4,096 FN macros at our disposal
+            return keymap_func_to_action(keycode & 0xFFF);
+            break;
+        case M(0) ... M(0xFF):
+            action.code = ACTION_MACRO(keycode & 0xFF);
+            break;
+        case LT(0, 0) ... LT(0xFF, 0xF):
+            action.code = ACTION_LAYER_TAP_KEY((keycode >> 0x8) & 0xF, keycode & 0xFF);
+            break;
+    #ifdef BACKLIGHT_ENABLE
+        case BL_0 ... BL_15:
+            action.code = ACTION_BACKLIGHT_LEVEL(keycode & 0x000F);
+            break;
+        case BL_DEC:
+            action.code = ACTION_BACKLIGHT_DECREASE();
+            break;
+        case BL_INC:
+            action.code = ACTION_BACKLIGHT_INCREASE();
+            break;
+        case BL_TOGG:
+            action.code = ACTION_BACKLIGHT_TOGGLE();
+            break;
+        case BL_STEP:
+            action.code = ACTION_BACKLIGHT_STEP();
+            break;
+    #endif
+        case RESET: ; // RESET is 0x5000, which is why this is here
+            clear_keyboard();
+            #ifdef AUDIO_ENABLE
+                stop_all_notes();
+                shutdown_user();
+            #endif
+            _delay_ms(250);
+            #ifdef ATREUS_ASTAR
+                *(uint16_t *)0x0800 = 0x7777; // these two are a-star-specific
+            #endif
+            bootloader_jump();
+            break;
+        case DEBUG: ; // DEBUG is 0x5001
+            print("\nDEBUG: enabled.\n");
+            debug_enable = true;
+            break;
+        case MAGIC_SWAP_CONTROL_CAPSLOCK ... MAGIC_UNSWAP_ALT_GUI:
+            // MAGIC actions (BOOTMAGIC without the boot)
+            if (!eeconfig_is_enabled()) {
+                eeconfig_init();
+            }
+            /* keymap config */
+            keymap_config.raw = eeconfig_read_keymap();
+            if (keycode == MAGIC_SWAP_CONTROL_CAPSLOCK) {
+                keymap_config.swap_control_capslock = 1;
+            } else if (keycode == MAGIC_CAPSLOCK_TO_CONTROL) {
+                keymap_config.capslock_to_control = 1;
+            } else if (keycode == MAGIC_SWAP_LALT_LGUI) {
+                keymap_config.swap_lalt_lgui = 1;
+            } else if (keycode == MAGIC_SWAP_RALT_RGUI) {
+                keymap_config.swap_ralt_rgui = 1;
+            } else if (keycode == MAGIC_NO_GUI) {
+                keymap_config.no_gui = 1;
+            } else if (keycode == MAGIC_SWAP_GRAVE_ESC) {
+                keymap_config.swap_grave_esc = 1;
+            } else if (keycode == MAGIC_SWAP_BACKSLASH_BACKSPACE) {
+                keymap_config.swap_backslash_backspace = 1;
+            } else if (keycode == MAGIC_HOST_NKRO) {
+                keymap_config.nkro = 1;
+            } else if (keycode == MAGIC_SWAP_ALT_GUI) {
+                keymap_config.swap_lalt_lgui = 1;
+                keymap_config.swap_ralt_rgui = 1;
+            }
+            /* UNs */
+            else if (keycode == MAGIC_UNSWAP_CONTROL_CAPSLOCK) {
+                keymap_config.swap_control_capslock = 0;
+            } else if (keycode == MAGIC_UNCAPSLOCK_TO_CONTROL) {
+                keymap_config.capslock_to_control = 0;
+            } else if (keycode == MAGIC_UNSWAP_LALT_LGUI) {
+                keymap_config.swap_lalt_lgui = 0;
+            } else if (keycode == MAGIC_UNSWAP_RALT_RGUI) {
+                keymap_config.swap_ralt_rgui = 0;
+            } else if (keycode == MAGIC_UNNO_GUI) {
+                keymap_config.no_gui = 0;
+            } else if (keycode == MAGIC_UNSWAP_GRAVE_ESC) {
+                keymap_config.swap_grave_esc = 0;
+            } else if (keycode == MAGIC_UNSWAP_BACKSLASH_BACKSPACE) {
+                keymap_config.swap_backslash_backspace = 0;
+            } else if (keycode == MAGIC_UNHOST_NKRO) {
+                keymap_config.nkro = 0;
+            } else if (keycode == MAGIC_UNSWAP_ALT_GUI) {
+                keymap_config.swap_lalt_lgui = 0;
+                keymap_config.swap_ralt_rgui = 0;
+            }
+            eeconfig_update_keymap(keymap_config.raw);
+            break;
+        case TO(0, 1) ... OSM(0xFF): ;
+            // Layer movement shortcuts
+            // See .h to see constraints/usage
+            int type = (keycode >> 0x8) & 0xF;
+            if (type == 0x1) {
+                // Layer set "GOTO"
+                int when = (keycode >> 0x4) & 0x3;
+                int layer = keycode & 0xF;
+                action.code = ACTION_LAYER_SET(layer, when);
+            } else if (type == 0x2) {
+                // Momentary layer
+                int layer = keycode & 0xFF;
+                action.code = ACTION_LAYER_MOMENTARY(layer);
+            } else if (type == 0x3) {
+                // Set default layer
+                int layer = keycode & 0xFF;
+                action.code = ACTION_DEFAULT_LAYER_SET(layer);
+            } else if (type == 0x4) {
+                // Set default layer
+                int layer = keycode & 0xFF;
+                action.code = ACTION_LAYER_TOGGLE(layer);
+            } else if (type == 0x5) {
+                // OSL(layer) - One-shot layer
+                int layer = keycode & 0xFF;
+                action.code = ACTION_LAYER_ONESHOT(layer);
+            } else if (type == 0x6) {
+                // OSM(mod) - One-shot mod
+                int mod = keycode & 0xFF;
+                action.code = ACTION_MODS_ONESHOT(mod);
+            }
+            break;
+        case MT(0, 0) ... MT(0xF, 0xFF):
+            action.code = ACTION_MODS_TAP_KEY((keycode >> 0x8) & 0xF, keycode & 0xFF);
+            break;
         default:
             action.code = ACTION_NO;
             break;
@@ -275,7 +298,7 @@ static action_t keycode_to_action(uint16_t keycode)
 /* translates key to keycode */
 uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key)
 {
-       // Read entire word (16bits)
+    // Read entire word (16bits)
     return pgm_read_word(&keymaps[(layer)][(key.row)][(key.col)]);
 }
 
@@ -287,6 +310,14 @@ action_t keymap_fn_to_action(uint16_t keycode)
 
 action_t keymap_func_to_action(uint16_t keycode)
 {
-       // For FUNC without 8bit limit
+    // For FUNC without 8bit limit
     return (action_t){ .code = pgm_read_word(&fn_actions[(int)keycode]) };
 }
+
+void update_tri_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3) {
+  if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) {
+    layer_on(layer3);
+  } else {
+    layer_off(layer3);
+  }
+}