]> git.donarmstrong.com Git - tmk_firmware.git/blobdiff - common/layer_switch.c
Add NO_ACTION_KEYMAP config option
[tmk_firmware.git] / common / layer_switch.c
index 9bc804e641c3f403dbda60a3381a3d9fce41a845..a5d426a899be33280159760af416f6a18a6fb3e4 100644 (file)
 #include "keyboard.h"
 #include "action.h"
 #include "debug.h"
+#include "util.h"
 #include "layer_switch.h"
 
 
-uint16_t layer_switch_stat = 0;
+/* 
+ * Default Layer (0-15)
+ */
+uint8_t default_layer = 0;
 
+void default_layer_set(uint8_t layer)
+{
+    debug("default_layer_set: ");
+    debug_dec(default_layer); debug(" to ");
+
+    default_layer = layer;
+
+    debug_dec(default_layer); debug("\n");
+
+    clear_keyboard_but_mods(); // To avoid stuck keys
+}
 
-uint16_t layer_switch_stat_get(void)
+
+#ifndef NO_ACTION_KEYMAP
+/* 
+ * Keymap Layer (0-15)
+ */
+uint16_t keymap_stat = 0;
+
+/* return highest layer whose state is on */
+uint8_t keymap_get_layer(void)
 {
-    return layer_switch_stat;
+    return biton16(keymap_stat);
 }
 
-void layer_switch_stat_set(uint16_t stat)
+static void keymap_stat_set(uint16_t stat)
 {
-    layer_switch_stat = stat;
-    layer_switch_debug();
+    debug("keymap: ");
+    keymap_debug(); debug(" to ");
+
+    keymap_stat = stat;
+
+    keymap_debug(); debug("\n");
+
+    clear_keyboard_but_mods(); // To avoid stuck keys
 }
 
-void layer_switch_clear(void)
+void keymap_clear(void)
 {
-    layer_switch_stat = 0;
-    layer_switch_debug();
+    keymap_stat_set(0);
 }
 
-void layer_switch_on(uint8_t layer)
+
+void keymap_set(uint16_t stat)
 {
-    layer_switch_stat |= (1<<layer);
-    layer_switch_debug();
+    keymap_stat_set(stat);
 }
 
-void layer_switch_off(uint8_t layer)
+void keymap_move(uint8_t layer)
 {
-    layer_switch_stat &= ~(1<<layer);
-    layer_switch_debug();
+    keymap_stat_set(1<<layer);
 }
 
-void layer_switch_inv(uint8_t layer)
+void keymap_on(uint8_t layer)
 {
-    layer_switch_stat ^= (1<<layer);
-    layer_switch_debug();
+    keymap_stat_set(keymap_stat | (1<<layer));
 }
 
-void layer_switch_debug(void)
+void keymap_off(uint8_t layer)
 {
-    debug("layer_switch_stat: "); debug_bin16(layer_switch_stat); debug("\n");
+    keymap_stat_set(keymap_stat & ~(1<<layer));
 }
 
+void keymap_invert(uint8_t layer)
+{
+    keymap_stat_set(keymap_stat ^ (1<<layer));
+}
+
+void keymap_or(uint16_t stat)
+{
+    keymap_stat_set(keymap_stat | stat);
+}
+void keymap_and(uint16_t stat)
+{
+    keymap_stat_set(keymap_stat & stat);
+}
+void keymap_xor(uint16_t stat)
+{
+    keymap_stat_set(keymap_stat ^ stat);
+}
+
+void keymap_debug(void)
+{
+    debug_hex16(keymap_stat); debug("("); debug_dec(keymap_get_layer()); debug(")");
+}
+#endif
+
+
+
+#ifndef NO_ACTION_OVERLAY
+/* 
+ * Overlay Layer (16-31 = 0-15|0x10)
+ */
+uint16_t overlay_stat = 0;
+
+/* return highest layer whose state is on */
+uint8_t overlay_get_layer(void)
+{
+    return biton16(overlay_stat);
+}
+
+static void overlay_stat_set(uint16_t stat)
+{
+    debug("overlay: ");
+    overlay_debug(); debug(" to ");
+
+    overlay_stat = stat;
+
+    overlay_debug(); debug("\n");
+
+    clear_keyboard_but_mods(); // To avoid stuck keys
+}
+
+void overlay_clear(void)
+{
+    overlay_stat_set(0);
+}
+
+
+void overlay_set(uint16_t stat)
+{
+    overlay_stat_set(stat);
+}
+
+void overlay_move(uint8_t layer)
+{
+    overlay_stat_set(1<<layer);
+}
+
+void overlay_on(uint8_t layer)
+{
+    overlay_stat_set(overlay_stat | (1<<layer));
+}
+
+void overlay_off(uint8_t layer)
+{
+    overlay_stat_set(overlay_stat & ~(1<<layer));
+}
+
+void overlay_invert(uint8_t layer)
+{
+    overlay_stat_set(overlay_stat ^ (1<<layer));
+}
+
+void overlay_or(uint16_t stat)
+{
+    overlay_stat_set(overlay_stat | stat);
+}
+void overlay_and(uint16_t stat)
+{
+    overlay_stat_set(overlay_stat & stat);
+}
+void overlay_xor(uint16_t stat)
+{
+    overlay_stat_set(overlay_stat ^ stat);
+}
+
+void overlay_debug(void)
+{
+    debug_hex16(overlay_stat); debug("("); debug_dec(overlay_get_layer()); debug(")");
+}
+#endif
+
 action_t layer_switch_get_action(key_t key)
 {
     action_t action;
     action.code = ACTION_TRANSPARENT;
 
-    /* higher layer first */
+#ifndef NO_ACTION_OVERLAY
+    /* overlay: top layer first */
     for (int8_t i = 15; i >= 0; i--) {
-        if (layer_switch_stat & (1<<i)) {
+        if (overlay_stat & (1<<i)) {
+            action = action_for_key(i | OVERLAY_BIT, key);
+            if (action.code != ACTION_TRANSPARENT) {
+                return action;
+            }
+        }
+    }
+#endif
+
+#ifndef NO_ACTION_KEYMAP
+    /* keymap: top layer first */
+    for (int8_t i = 15; i >= 0; i--) {
+        if (keymap_stat & (1<<i)) {
             action = action_for_key(i, key);
             if (action.code != ACTION_TRANSPARENT) {
-                layer_switch_debug();
-                debug("layer_switch: used. "); debug_dec(i); debug("\n");
                 return action;
             }
         }
     }
+#endif
+
+    /* default layer */
+    action = action_for_key(default_layer, key);
     return action;
 }