From b3c9c18feea07646432c0998f767f4cf9b76c399 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sat, 4 Jun 2022 03:27:40 +0000 Subject: [PATCH] feat(behaviors): Continue on mods in caps word. * Continue caps word when mods are changed, and match the continue list on combination of explicit and implicit modifiers. --- app/src/behaviors/behavior_caps_word.c | 6 +++- .../continue-with-modifiers/events.patterns | 4 +++ .../keycode_events.snapshot | 20 +++++++++++ .../native_posix_64.keymap | 33 +++++++++++++++++++ 4 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 app/tests/caps-word/continue-with-modifiers/events.patterns create mode 100644 app/tests/caps-word/continue-with-modifiers/keycode_events.snapshot create mode 100644 app/tests/caps-word/continue-with-modifiers/native_posix_64.keymap diff --git a/app/src/behaviors/behavior_caps_word.c b/app/src/behaviors/behavior_caps_word.c index 0423dc62..3842a31f 100644 --- a/app/src/behaviors/behavior_caps_word.c +++ b/app/src/behaviors/behavior_caps_word.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include @@ -92,7 +93,9 @@ static bool caps_word_is_caps_includelist(const struct behavior_caps_word_config continuation->id, continuation->implicit_modifiers); if (continuation->page == usage_page && continuation->id == usage_id && - continuation->implicit_modifiers == implicit_modifiers) { + (continuation->implicit_modifiers & + (implicit_modifiers | zmk_hid_get_explicit_mods())) == + continuation->implicit_modifiers) { LOG_DBG("Continuing capsword, found included usage: 0x%02X - 0x%02X", usage_page, usage_id); return true; @@ -143,6 +146,7 @@ static int caps_word_keycode_state_changed_listener(const zmk_event_t *eh) { caps_word_enhance_usage(config, ev); if (!caps_word_is_alpha(ev->keycode) && !caps_word_is_numeric(ev->keycode) && + !is_mod(ev->usage_page, ev->keycode) && !caps_word_is_caps_includelist(config, ev->usage_page, ev->keycode, ev->implicit_modifiers)) { LOG_DBG("Deactivating caps_word for 0x%02X - 0x%02X", ev->usage_page, ev->keycode); diff --git a/app/tests/caps-word/continue-with-modifiers/events.patterns b/app/tests/caps-word/continue-with-modifiers/events.patterns new file mode 100644 index 00000000..dd4d3d3f --- /dev/null +++ b/app/tests/caps-word/continue-with-modifiers/events.patterns @@ -0,0 +1,4 @@ +s/.*hid_listener_keycode_//p +s/.*hid_implicit_modifiers_//p +s/.*caps_word_enhance_usage/enhance_usage/p +s/.*caps_word_is_caps_includelist/caps_includelist/p \ No newline at end of file diff --git a/app/tests/caps-word/continue-with-modifiers/keycode_events.snapshot b/app/tests/caps-word/continue-with-modifiers/keycode_events.snapshot new file mode 100644 index 00000000..b4752fd4 --- /dev/null +++ b/app/tests/caps-word/continue-with-modifiers/keycode_events.snapshot @@ -0,0 +1,20 @@ +enhance_usage: Enhancing usage 0x04 with modifiers: 0x02 +pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x02 explicit_mods 0x00 +press: Modifiers set to 0x02 +released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 +release: Modifiers set to 0x00 +pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +press: Modifiers set to 0x02 +caps_includelist: Comparing with 0x07 - 0x2D (with implicit mods: 0x02) +caps_includelist: Continuing capsword, found included usage: 0x07 - 0x2D +pressed: usage_page 0x07 keycode 0x2D implicit_mods 0x00 explicit_mods 0x00 +press: Modifiers set to 0x02 +released: usage_page 0x07 keycode 0x2D implicit_mods 0x00 explicit_mods 0x00 +release: Modifiers set to 0x02 +released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +release: Modifiers set to 0x00 +enhance_usage: Enhancing usage 0x04 with modifiers: 0x02 +pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x02 explicit_mods 0x00 +press: Modifiers set to 0x02 +released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 +release: Modifiers set to 0x00 diff --git a/app/tests/caps-word/continue-with-modifiers/native_posix_64.keymap b/app/tests/caps-word/continue-with-modifiers/native_posix_64.keymap new file mode 100644 index 00000000..3053d5df --- /dev/null +++ b/app/tests/caps-word/continue-with-modifiers/native_posix_64.keymap @@ -0,0 +1,33 @@ +#include +#include +#include +#include "../behavior_keymap.dtsi" + +/ { + keymap { + compatible = "zmk,keymap"; + label = "Default keymap"; + + default_layer { + bindings = < + &caps_word &kp A + &kp LSHFT &kp MINUS + >; + }; + }; +}; + +&kscan { + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + >; +}; \ No newline at end of file