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)
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_TRANSPARENT;
-
#ifndef NO_ACTION_LAYER
+ action_t action = ACTION_TRANSPARENT;
uint32_t layers = layer_state | default_layer_state;
/* check top layer first */
for (int8_t i = 31; i >= 0; i--) {
if (layers & (1UL<<i)) {
action = action_for_key(i, key);
if (action.code != (action_t)ACTION_TRANSPARENT.code) {
- return action;
+ 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)
+{
+ if (IS_NOEVENT(event)) return (action_t)ACTION_NO;
+
+ 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);
}