#endif
}
+/*
+ * Make sure the action triggered when the key is released is the same
+ * one as the one triggered on press. It's important for the mod keys
+ * when the layer is switched after the down event but before the up
+ * event as they may get stuck otherwise.
+ */
+action_t store_or_get_action(bool pressed, keypos_t key)
+{
+#if !defined(NO_ACTION_LAYER) && defined(PREVENT_STUCK_MODIFIERS)
+ static action_t pressed_actions[MATRIX_ROWS][MATRIX_COLS];
+
+ if (pressed) {
+ pressed_actions[key.row][key.col] = layer_switch_get_action(key);
+ }
+ return pressed_actions[key.row][key.col];
+#else
+ return layer_switch_get_action(key);
+#endif
+}
+
void process_action(keyrecord_t *record)
{
keyevent_t event = record->event;
if (IS_NOEVENT(event)) { return; }
- action_t action = layer_switch_get_action(event.key);
+ action_t action = store_or_get_action(event.pressed, event.key);
dprint("ACTION: "); debug_action(action);
#ifndef NO_ACTION_LAYER
dprint(" layer_state: "); layer_debug();
default:
if (event.pressed) {
if (tap_count > 0) {
+#ifndef IGNORE_MOD_TAP_INTERRUPT
if (record->tap.interrupted) {
- dprint("MODS_TAP: Tap: Cancel: add_mods\n");
+ dprint("mods_tap: tap: cancel: add_mods\n");
// ad hoc: set 0 to cancel tap
record->tap.count = 0;
register_mods(mods);
- } else {
+ } else
+#endif
+ {
dprint("MODS_TAP: Tap: register_code\n");
register_code(action.key.code);
}
set_mods(tmp_mods);
send_keyboard_report();
oneshot_cancel();
- } else
+ } else
*/
#endif
{