diff --git a/app/src/behaviors/behavior_macro.c b/app/src/behaviors/behavior_macro.c index c16fb69a9..3e4d17321 100644 --- a/app/src/behaviors/behavior_macro.c +++ b/app/src/behaviors/behavior_macro.c @@ -129,7 +129,9 @@ static int behavior_macro_init(const struct device *dev) { LOG_DBG("Release will resume at %d", state->release_state.start_index); break; } else { - // Ignore regular invokable bindings + // Mostly ignore regular invokable bindings, except they will consume macro parameters + state->release_state.param1_source = PARAM_SOURCE_BINDING; + state->release_state.param2_source = PARAM_SOURCE_BINDING; } } diff --git a/app/tests/macros/param-then-no-param/events.patterns b/app/tests/macros/param-then-no-param/events.patterns new file mode 100644 index 000000000..a23e05630 --- /dev/null +++ b/app/tests/macros/param-then-no-param/events.patterns @@ -0,0 +1,2 @@ +s/.*hid_listener_keycode/kp/p +s/.*mo_keymap_binding/mo/p diff --git a/app/tests/macros/param-then-no-param/keycode_events.snapshot b/app/tests/macros/param-then-no-param/keycode_events.snapshot new file mode 100644 index 000000000..aee0e1e6b --- /dev/null +++ b/app/tests/macros/param-then-no-param/keycode_events.snapshot @@ -0,0 +1,8 @@ +kp_pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 +mo_pressed: position 0 layer 1 +kp_pressed: usage_page 0x07 keycode 0x1C implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x1C implicit_mods 0x00 explicit_mods 0x00 +mo_released: position 0 layer 1 +kp_pressed: usage_page 0x07 keycode 0x06 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x06 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/macros/param-then-no-param/native_posix_64.keymap b/app/tests/macros/param-then-no-param/native_posix_64.keymap new file mode 100644 index 000000000..e6c42901c --- /dev/null +++ b/app/tests/macros/param-then-no-param/native_posix_64.keymap @@ -0,0 +1,47 @@ +#include +#include +#include + +/ { + macros { + kp_l1: kp_l1 { + compatible = "zmk,behavior-macro-one-param"; + #binding-cells = <1>; + wait-ms = <5>; + tap-ms = <5>; + bindings + = <¯o_param_1to1> + , <¯o_tap &kp MACRO_PLACEHOLDER> + , <¯o_press &mo 1> + , <¯o_pause_for_release> + , <¯o_release &mo 1>; + }; + }; + + keymap { + compatible = "zmk,keymap"; + + default_layer { + bindings = < + &kp_l1 A &kp B + &kp C &none>; + }; + + other_layer { + bindings = < + &kp X &kp Y + &kp Z &none>; + }; + }; +}; + +&kscan { + events = < + ZMK_MOCK_PRESS(0,0,20) // press macro (taps A) + ZMK_MOCK_PRESS(0,1,20) // press Y + ZMK_MOCK_RELEASE(0,1,20) // release Y + ZMK_MOCK_RELEASE(0,0,20) // release macro + ZMK_MOCK_PRESS(1,0,10) // press C + ZMK_MOCK_RELEASE(1,0,10) // release C + >; +};