diff --git a/src/keyboard.c b/src/keyboard.c index c012cde..e2b9b8f 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -582,6 +582,13 @@ static long process_descriptor(struct keyboard *kbd, uint8_t code, if (pressed) { kbd->overload_start_time = time; + + /* + * Preserve the original last layer activation code in the event + * that the tap action is a swap. + */ + kbd->overload_last_layer_code = kbd->last_layer_code; + activate_layer(kbd, code, idx); update_mods(kbd, -1, 0); } else { @@ -591,6 +598,7 @@ static long process_descriptor(struct keyboard *kbd, uint8_t code, if (kbd->last_pressed_code == code && (!kbd->config.overload_tap_timeout || ((time - kbd->overload_start_time) < kbd->config.overload_tap_timeout))) { + kbd->last_layer_code = kbd->overload_last_layer_code; clear_oneshot(kbd); process_descriptor(kbd, code, action, dl, 1, time); diff --git a/src/keyboard.h b/src/keyboard.h index 818892a..7a50b11 100644 --- a/src/keyboard.h +++ b/src/keyboard.h @@ -48,6 +48,8 @@ struct keyboard { struct macro *active_macro; int active_macro_layer; + int overload_last_layer_code; + long macro_timeout; long oneshot_timeout; diff --git a/t/overload-swap.t b/t/overload-swap.t new file mode 100644 index 0000000..7849b3a --- /dev/null +++ b/t/overload-swap.t @@ -0,0 +1,27 @@ +6 down +x down +x up +a down +a up +6 up +6 down +x down +a down +a up +x up +6 up + +control down +meta down +meta up +shift down +control up +a down +a up +shift up +control down +meta down +a down +a up +meta up +control up diff --git a/t/test.conf b/t/test.conf index b2baa55..af38603 100644 --- a/t/test.conf +++ b/t/test.conf @@ -67,6 +67,7 @@ m = macro(mac) e = macro(leftcontrol o+n leftcontrol+1) b = macro(leftcontrol+n) c = macro(leftcontrol n) +x = overload(meta, swap(shift)) [test]