From ad69b57c399ecd66ba9ae1d0a6ac7b7a83563960 Mon Sep 17 00:00:00 2001 From: urob <978080+urob@users.noreply.github.com> Date: Fri, 5 Aug 2022 16:58:59 -0400 Subject: [PATCH 1/6] Ignore-modifiers property for capsword Squashed commit of the following: commit ba38925b3e471c5fe92763fe026b22c2c9a7b13d Author: urob <978080+urob@users.noreply.github.com> Date: Fri Aug 5 16:05:58 2022 -0400 Ignore-modifiers property for capsword --- app/dts/behaviors/caps_word.dtsi | 1 + .../behaviors/zmk,behavior-caps-word.yaml | 2 ++ app/src/behaviors/behavior_caps_word.c | 4 ++- .../deactivate-by-mod/events.patterns | 3 ++ .../deactivate-by-mod/keycode_events.snapshot | 13 +++++++ .../deactivate-by-mod/native_posix_64.keymap | 35 +++++++++++++++++++ docs/docs/behaviors/caps-word.md | 12 +++++++ 7 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 app/tests/caps-word/deactivate-by-mod/events.patterns create mode 100644 app/tests/caps-word/deactivate-by-mod/keycode_events.snapshot create mode 100644 app/tests/caps-word/deactivate-by-mod/native_posix_64.keymap diff --git a/app/dts/behaviors/caps_word.dtsi b/app/dts/behaviors/caps_word.dtsi index ac04e26b..cba85b37 100644 --- a/app/dts/behaviors/caps_word.dtsi +++ b/app/dts/behaviors/caps_word.dtsi @@ -13,6 +13,7 @@ label = "CAPS_WORD"; #binding-cells = <0>; continue-list = ; + ignore-modifiers; }; }; }; diff --git a/app/dts/bindings/behaviors/zmk,behavior-caps-word.yaml b/app/dts/bindings/behaviors/zmk,behavior-caps-word.yaml index cc1dda01..ee217b99 100644 --- a/app/dts/bindings/behaviors/zmk,behavior-caps-word.yaml +++ b/app/dts/bindings/behaviors/zmk,behavior-caps-word.yaml @@ -13,3 +13,5 @@ properties: required: true mods: type: int + ignore-modifiers: + type: boolean diff --git a/app/src/behaviors/behavior_caps_word.c b/app/src/behaviors/behavior_caps_word.c index 4c9fd711..b6bd8729 100644 --- a/app/src/behaviors/behavior_caps_word.c +++ b/app/src/behaviors/behavior_caps_word.c @@ -32,6 +32,7 @@ struct caps_word_continue_item { struct behavior_caps_word_config { zmk_mod_flags_t mods; + bool ignore_modifiers; uint8_t index; uint8_t continuations_count; struct caps_word_continue_item continuations[]; @@ -146,7 +147,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) && + (!is_mod(ev->usage_page, ev->keycode) || !(config->ignore_modifiers)) && !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); @@ -178,6 +179,7 @@ static int behavior_caps_word_init(const struct device *dev) { static struct behavior_caps_word_config behavior_caps_word_config_##n = { \ .index = n, \ .mods = DT_INST_PROP_OR(n, mods, MOD_LSFT), \ + .ignore_modifiers = DT_INST_PROP(n, ignore_modifiers), \ .continuations = {LISTIFY(DT_INST_PROP_LEN(n, continue_list), BREAK_ITEM, (, ), n)}, \ .continuations_count = DT_INST_PROP_LEN(n, continue_list), \ }; \ diff --git a/app/tests/caps-word/deactivate-by-mod/events.patterns b/app/tests/caps-word/deactivate-by-mod/events.patterns new file mode 100644 index 00000000..e9b216a8 --- /dev/null +++ b/app/tests/caps-word/deactivate-by-mod/events.patterns @@ -0,0 +1,3 @@ +s/.*hid_listener_keycode_//p +s/.*hid_implicit_modifiers_//p +s/.*caps_word_enhance_usage/enhance_usage/p diff --git a/app/tests/caps-word/deactivate-by-mod/keycode_events.snapshot b/app/tests/caps-word/deactivate-by-mod/keycode_events.snapshot new file mode 100644 index 00000000..4f27b89f --- /dev/null +++ b/app/tests/caps-word/deactivate-by-mod/keycode_events.snapshot @@ -0,0 +1,13 @@ +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 +released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +release: Modifiers set to 0x00 +pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 +press: Modifiers set to 0x00 +released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 +release: Modifiers set to 0x00 diff --git a/app/tests/caps-word/deactivate-by-mod/native_posix_64.keymap b/app/tests/caps-word/deactivate-by-mod/native_posix_64.keymap new file mode 100644 index 00000000..c77f5d47 --- /dev/null +++ b/app/tests/caps-word/deactivate-by-mod/native_posix_64.keymap @@ -0,0 +1,35 @@ +#include +#include +#include + +&caps_word { + /delete-property/ ignore-modifiers; +}; + +/ { + keymap { + compatible = "zmk,keymap"; + label = "Default keymap"; + + default_layer { + bindings = < + &caps_word &kp A + &kp LSHFT &none + >; + }; + }; +}; + + +&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_RELEASE(1,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + >; +}; diff --git a/docs/docs/behaviors/caps-word.md b/docs/docs/behaviors/caps-word.md index e85d7eca..86613ed7 100644 --- a/docs/docs/behaviors/caps-word.md +++ b/docs/docs/behaviors/caps-word.md @@ -37,6 +37,18 @@ By default, the caps word will remain active when any alphanumeric character or }; ``` +#### Continue on modifiers + +By default, the caps word will remain active when any modifiers are pressed. If you +would like to deactivate caps word when modifiers are pressed, you can delete the +`ignored-modifiers` property in your keymap: + +``` +&caps_word { + /delete-property/ ignore-modifiers; +}; +``` + #### Applied Modifier(s) In addition, if you would like _multiple_ modifiers, instead of just `MOD_LSFT`, you can override the `mods` property: From c26ba2c61a25d2339a75d52f76a900017256c8b6 Mon Sep 17 00:00:00 2001 From: urob <978080+urob@users.noreply.github.com> Date: Sat, 10 Sep 2022 17:28:00 -0400 Subject: [PATCH 2/6] Num-word --- app/dts/behaviors/caps_word.dtsi | 14 +++++++++++ .../behaviors/zmk,behavior-caps-word.yaml | 6 +++++ app/src/behaviors/behavior_caps_word.c | 25 ++++++++++++++++--- 3 files changed, 42 insertions(+), 3 deletions(-) diff --git a/app/dts/behaviors/caps_word.dtsi b/app/dts/behaviors/caps_word.dtsi index cba85b37..5251e55e 100644 --- a/app/dts/behaviors/caps_word.dtsi +++ b/app/dts/behaviors/caps_word.dtsi @@ -13,8 +13,22 @@ label = "CAPS_WORD"; #binding-cells = <0>; continue-list = ; + ignore-alphas; + ignore-numbers; ignore-modifiers; }; }; + + behaviors { + /omit-if-no-ref/ num_word: behavior_num_word { + compatible = "zmk,behavior-caps-word"; + label = "NUM_WORD"; + #binding-cells = <0>; + mods = <0>; + // layers = ; // to be specified in user config using &num_word {} + continue-list = ; + ignore-numbers; + }; + }; }; diff --git a/app/dts/bindings/behaviors/zmk,behavior-caps-word.yaml b/app/dts/bindings/behaviors/zmk,behavior-caps-word.yaml index ee217b99..eb67a203 100644 --- a/app/dts/bindings/behaviors/zmk,behavior-caps-word.yaml +++ b/app/dts/bindings/behaviors/zmk,behavior-caps-word.yaml @@ -13,5 +13,11 @@ properties: required: true mods: type: int + layers: + type: int + ignore-alphas: + type: boolean + ignore-numbers: + type: boolean ignore-modifiers: type: boolean diff --git a/app/src/behaviors/behavior_caps_word.c b/app/src/behaviors/behavior_caps_word.c index b6bd8729..ba1a998b 100644 --- a/app/src/behaviors/behavior_caps_word.c +++ b/app/src/behaviors/behavior_caps_word.c @@ -32,6 +32,9 @@ struct caps_word_continue_item { struct behavior_caps_word_config { zmk_mod_flags_t mods; + int8_t layers; + bool ignore_alphas; + bool ignore_numbers; bool ignore_modifiers; uint8_t index; uint8_t continuations_count; @@ -45,12 +48,22 @@ struct behavior_caps_word_data { static void activate_caps_word(const struct device *dev) { struct behavior_caps_word_data *data = dev->data; + const struct behavior_caps_word_config *config = dev->config; + + if (config->layers > -1) { + zmk_keymap_layer_activate(config->layers); + } data->active = true; } static void deactivate_caps_word(const struct device *dev) { struct behavior_caps_word_data *data = dev->data; + const struct behavior_caps_word_config *config = dev->config; + + if (config->layers > -1) { + zmk_keymap_layer_deactivate(config->layers); + } data->active = false; } @@ -122,7 +135,10 @@ static void caps_word_enhance_usage(const struct behavior_caps_word_config *conf } LOG_DBG("Enhancing usage 0x%02X with modifiers: 0x%02X", ev->keycode, config->mods); - ev->implicit_modifiers |= config->mods; + if (config->mods != 0) { + ev->implicit_modifiers |= config->mods; + } + } static int caps_word_keycode_state_changed_listener(const zmk_event_t *eh) { @@ -146,8 +162,8 @@ 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) || !(config->ignore_modifiers)) && + if ((!caps_word_is_alpha(ev->keycode) || !config->ignore_alphas) && (!caps_word_is_numeric(ev->keycode) || !config->ignore_numbers) && + (!is_mod(ev->usage_page, ev->keycode) || !config->ignore_modifiers) && !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); @@ -179,6 +195,9 @@ static int behavior_caps_word_init(const struct device *dev) { static struct behavior_caps_word_config behavior_caps_word_config_##n = { \ .index = n, \ .mods = DT_INST_PROP_OR(n, mods, MOD_LSFT), \ + .layers = DT_INST_PROP_OR(n, layers, -1), \ + .ignore_alphas = DT_INST_PROP(n, ignore_alphas), \ + .ignore_numbers = DT_INST_PROP(n, ignore_numbers), \ .ignore_modifiers = DT_INST_PROP(n, ignore_modifiers), \ .continuations = {LISTIFY(DT_INST_PROP_LEN(n, continue_list), BREAK_ITEM, (, ), n)}, \ .continuations_count = DT_INST_PROP_LEN(n, continue_list), \ From 0a76d3119d74f9749f308171c5a0b69875820f18 Mon Sep 17 00:00:00 2001 From: urob <978080+urob@users.noreply.github.com> Date: Sat, 10 Sep 2022 18:03:37 -0400 Subject: [PATCH 3/6] Clang format --- app/src/behaviors/behavior_caps_word.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/behaviors/behavior_caps_word.c b/app/src/behaviors/behavior_caps_word.c index ba1a998b..c8bc8c36 100644 --- a/app/src/behaviors/behavior_caps_word.c +++ b/app/src/behaviors/behavior_caps_word.c @@ -138,7 +138,6 @@ static void caps_word_enhance_usage(const struct behavior_caps_word_config *conf if (config->mods != 0) { ev->implicit_modifiers |= config->mods; } - } static int caps_word_keycode_state_changed_listener(const zmk_event_t *eh) { @@ -162,7 +161,8 @@ 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) || !config->ignore_alphas) && (!caps_word_is_numeric(ev->keycode) || !config->ignore_numbers) && + if ((!caps_word_is_alpha(ev->keycode) || !config->ignore_alphas) && + (!caps_word_is_numeric(ev->keycode) || !config->ignore_numbers) && (!is_mod(ev->usage_page, ev->keycode) || !config->ignore_modifiers) && !caps_word_is_caps_includelist(config, ev->usage_page, ev->keycode, ev->implicit_modifiers)) { @@ -195,9 +195,9 @@ static int behavior_caps_word_init(const struct device *dev) { static struct behavior_caps_word_config behavior_caps_word_config_##n = { \ .index = n, \ .mods = DT_INST_PROP_OR(n, mods, MOD_LSFT), \ - .layers = DT_INST_PROP_OR(n, layers, -1), \ - .ignore_alphas = DT_INST_PROP(n, ignore_alphas), \ - .ignore_numbers = DT_INST_PROP(n, ignore_numbers), \ + .layers = DT_INST_PROP_OR(n, layers, -1), \ + .ignore_alphas = DT_INST_PROP(n, ignore_alphas), \ + .ignore_numbers = DT_INST_PROP(n, ignore_numbers), \ .ignore_modifiers = DT_INST_PROP(n, ignore_modifiers), \ .continuations = {LISTIFY(DT_INST_PROP_LEN(n, continue_list), BREAK_ITEM, (, ), n)}, \ .continuations_count = DT_INST_PROP_LEN(n, continue_list), \ From 3c3b9d82be33d13cc103bbd24e8e897a46478326 Mon Sep 17 00:00:00 2001 From: urob <978080+urob@users.noreply.github.com> Date: Sat, 10 Sep 2022 18:54:10 -0400 Subject: [PATCH 4/6] Default to mods = 0 --- app/dts/behaviors/caps_word.dtsi | 2 +- app/src/behaviors/behavior_caps_word.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/dts/behaviors/caps_word.dtsi b/app/dts/behaviors/caps_word.dtsi index 5251e55e..49d43156 100644 --- a/app/dts/behaviors/caps_word.dtsi +++ b/app/dts/behaviors/caps_word.dtsi @@ -12,6 +12,7 @@ compatible = "zmk,behavior-caps-word"; label = "CAPS_WORD"; #binding-cells = <0>; + mods = ; continue-list = ; ignore-alphas; ignore-numbers; @@ -24,7 +25,6 @@ compatible = "zmk,behavior-caps-word"; label = "NUM_WORD"; #binding-cells = <0>; - mods = <0>; // layers = ; // to be specified in user config using &num_word {} continue-list = ; ignore-numbers; diff --git a/app/src/behaviors/behavior_caps_word.c b/app/src/behaviors/behavior_caps_word.c index c8bc8c36..45b42b80 100644 --- a/app/src/behaviors/behavior_caps_word.c +++ b/app/src/behaviors/behavior_caps_word.c @@ -194,7 +194,7 @@ static int behavior_caps_word_init(const struct device *dev) { static struct behavior_caps_word_data behavior_caps_word_data_##n = {.active = false}; \ static struct behavior_caps_word_config behavior_caps_word_config_##n = { \ .index = n, \ - .mods = DT_INST_PROP_OR(n, mods, MOD_LSFT), \ + .mods = DT_INST_PROP_OR(n, mods, 0), \ .layers = DT_INST_PROP_OR(n, layers, -1), \ .ignore_alphas = DT_INST_PROP(n, ignore_alphas), \ .ignore_numbers = DT_INST_PROP(n, ignore_numbers), \ From 425777c57c5dc8266cbc5c13bc028c2a73817d4a Mon Sep 17 00:00:00 2001 From: urob <978080+urob@users.noreply.github.com> Date: Sat, 10 Sep 2022 20:37:18 -0400 Subject: [PATCH 5/6] Continue num_word on DOT and COMMA by default --- app/dts/behaviors/caps_word.dtsi | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/app/dts/behaviors/caps_word.dtsi b/app/dts/behaviors/caps_word.dtsi index 49d43156..262ed601 100644 --- a/app/dts/behaviors/caps_word.dtsi +++ b/app/dts/behaviors/caps_word.dtsi @@ -12,22 +12,22 @@ compatible = "zmk,behavior-caps-word"; label = "CAPS_WORD"; #binding-cells = <0>; - mods = ; + mods = ; continue-list = ; - ignore-alphas; - ignore-numbers; - ignore-modifiers; + ignore-alphas; + ignore-numbers; + ignore-modifiers; }; }; - behaviors { + behaviors { /omit-if-no-ref/ num_word: behavior_num_word { compatible = "zmk,behavior-caps-word"; label = "NUM_WORD"; #binding-cells = <0>; - // layers = ; // to be specified in user config using &num_word {} - continue-list = ; - ignore-numbers; + // layers = ; // to be specified in user config using "&num_word { layers = ; };" + continue-list = ; + ignore-numbers; }; }; }; From b12681458cd5427beb791bfa28f65ecdfb57b089 Mon Sep 17 00:00:00 2001 From: urob <978080+urob@users.noreply.github.com> Date: Sun, 11 Sep 2022 20:07:57 -0400 Subject: [PATCH 6/6] Only send DBG message for non-empty mods --- app/src/behaviors/behavior_caps_word.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/behaviors/behavior_caps_word.c b/app/src/behaviors/behavior_caps_word.c index 45b42b80..5e31dcd3 100644 --- a/app/src/behaviors/behavior_caps_word.c +++ b/app/src/behaviors/behavior_caps_word.c @@ -134,8 +134,8 @@ static void caps_word_enhance_usage(const struct behavior_caps_word_config *conf return; } - LOG_DBG("Enhancing usage 0x%02X with modifiers: 0x%02X", ev->keycode, config->mods); if (config->mods != 0) { + LOG_DBG("Enhancing usage 0x%02X with modifiers: 0x%02X", ev->keycode, config->mods); ev->implicit_modifiers |= config->mods; } }