]> git.friedersdorff.com Git - max/tmk_keyboard.git/blobdiff - common/action.c
Make Transparent feature available to new keymaps.
[max/tmk_keyboard.git] / common / action.c
index f6e50032eb0d705c5f57b4d380127f0c75e593bb..710300eb3062bb86c5d62028f758fac126ce8474 100644 (file)
@@ -201,6 +201,19 @@ void action_exec(keyevent_t event)
     }
 }
 
+static action_t get_action(key_t key)
+{
+    action_t action = keymap_get_action(current_layer, key.pos.row, key.pos.col);
+
+    /* Transparently use default layer */
+    if (action.code == ACTION_TRANSPARENT) {
+        // TODO: layer stacking
+        action = keymap_get_action(default_layer, key.pos.row, key.pos.col);
+        debug("TRNASPARENT: "); debug_hex16(action.code); debug("\n");
+    }
+    return action;
+}
+
 static void process_action(keyrecord_t *record)
 {
     keyevent_t event = record->event;
@@ -208,8 +221,7 @@ static void process_action(keyrecord_t *record)
 
     if (IS_NOEVENT(event)) { return; }
 
-    action_t action = keymap_get_action(current_layer, event.key.pos.row, event.key.pos.col);
-    //debug("action: "); debug_hex16(action.code); if (event.pressed) debug("d\n"); else debug("u\n");
+    action_t action = get_action(event.key);
     debug("ACTION: "); debug_action(action); debug("\n");
 
     switch (action.kind.id) {
@@ -358,6 +370,7 @@ static void process_action(keyrecord_t *record)
                         layer_switch(action.layer.val);
                     }
                     else {
+                        // NOTE: This is needed by legacy keymap support
                         layer_switch(default_layer);
                     }
                     break;
@@ -421,7 +434,7 @@ static void process_action(keyrecord_t *record)
                             unregister_code(action.layer.code);
                         } else {
                             //debug("LAYER_PRESSED: No tap: NO ACTION\n");
-//TODO: this is ok?
+                            // NOTE: This is needed by legacy keymap support
                             debug("LAYER_PRESSED: No tap: return to default layer\n");
                             layer_switch(default_layer);
                         }
@@ -808,7 +821,8 @@ void layer_switch(uint8_t new_layer)
 
 bool is_tap_key(key_t key)
 {
-    action_t action = keymap_get_action(current_layer, key.pos.row, key.pos.col);
+    action_t action = get_action(key);
+
     switch (action.kind.id) {
         case ACT_LMODS_TAP:
         case ACT_RMODS_TAP:
@@ -816,18 +830,18 @@ bool is_tap_key(key_t key)
         case ACT_LAYER:
         case ACT_LAYER_BIT:
             switch (action.layer.code) {
-                case 0x00:
-                case 0xF1 ... 0xFF:
+                case LAYER_MOMENTARY:
+                case LAYER_ON_PRESS:
+                case LAYER_ON_RELEASE:
+                case LAYER_DEFAULT:
                     return false;
-                case 0xF0:
-                default:
+                case LAYER_TAP_TOGGLE:
+                default:    /* tap key */
                     return true;
             }
             return false;
         case ACT_FUNCTION:
-            if (action.func.opt & FUNC_TAP) {
-                return true;
-            }
+            if (action.func.opt & FUNC_TAP) { return true; }
             return false;
     }
     return false;