#include "action.h"
#include "util.h"
#include "action_layer.h"
+#include "hook.h"
#ifdef DEBUG_ACTION
#include "debug.h"
debug("default_layer_state: ");
default_layer_debug(); debug(" to ");
default_layer_state = state;
+ hook_default_layer_change(default_layer_state);
default_layer_debug(); debug("\n");
+#ifdef NO_TRACK_KEY_PRESS
clear_keyboard_but_mods(); // To avoid stuck keys
+#endif
}
void default_layer_debug(void)
dprint("layer_state: ");
layer_debug(); dprint(" to ");
layer_state = state;
+ hook_layer_change(layer_state);
layer_debug(); dprintln();
+#ifdef NO_TRACK_KEY_PRESS
clear_keyboard_but_mods(); // To avoid stuck keys
+#endif
}
void layer_clear(void)
-action_t layer_switch_get_action(keypos_t key)
+/* return layer effective for key at this time */
+static uint8_t current_layer_for_key(keypos_t key)
{
- action_t action;
- action.code = ACTION_TRANSPARENT;
+ action_t action = ACTION_TRANSPARENT;
#ifndef NO_ACTION_LAYER
uint32_t layers = layer_state | default_layer_state;
for (int8_t i = 31; i >= 0; i--) {
if (layers & (1UL<<i)) {
action = action_for_key(i, key);
- if (action.code != ACTION_TRANSPARENT) {
- return action;
+ if (action.code != (action_t)ACTION_TRANSPARENT.code) {
+ return i;
}
}
}
/* fall back to layer 0 */
- action = action_for_key(0, key);
- return action;
+ return 0;
+#else
+ return biton32(default_layer_state);
+#endif
+}
+
+
+#ifndef NO_TRACK_KEY_PRESS
+/* record layer on where key is pressed */
+static uint8_t layer_pressed[MATRIX_ROWS][MATRIX_COLS] = {};
+#endif
+action_t layer_switch_get_action(keyevent_t event)
+{
+ uint8_t layer = 0;
+#ifndef NO_TRACK_KEY_PRESS
+ if (event.pressed) {
+ layer = current_layer_for_key(event.key);
+ layer_pressed[event.key.row][event.key.col] = layer;
+ } else {
+ layer = layer_pressed[event.key.row][event.key.col];
+ }
#else
- action = action_for_key(biton32(default_layer_state), key);
- return action;
+ layer = current_layer_for_key(event.key);
#endif
+ return action_for_key(layer, event.key);
}