This commit is contained in:
urob 2022-09-10 17:28:00 -04:00
parent ad69b57c39
commit c26ba2c61a
3 changed files with 42 additions and 3 deletions

View file

@ -13,8 +13,22 @@
label = "CAPS_WORD"; label = "CAPS_WORD";
#binding-cells = <0>; #binding-cells = <0>;
continue-list = <UNDERSCORE BACKSPACE DELETE>; continue-list = <UNDERSCORE BACKSPACE DELETE>;
ignore-alphas;
ignore-numbers;
ignore-modifiers; 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 = <xxx>; // to be specified in user config using &num_word {}
continue-list = <BACKSPACE DELETE>;
ignore-numbers;
};
};
}; };

View file

@ -13,5 +13,11 @@ properties:
required: true required: true
mods: mods:
type: int type: int
layers:
type: int
ignore-alphas:
type: boolean
ignore-numbers:
type: boolean
ignore-modifiers: ignore-modifiers:
type: boolean type: boolean

View file

@ -32,6 +32,9 @@ struct caps_word_continue_item {
struct behavior_caps_word_config { struct behavior_caps_word_config {
zmk_mod_flags_t mods; zmk_mod_flags_t mods;
int8_t layers;
bool ignore_alphas;
bool ignore_numbers;
bool ignore_modifiers; bool ignore_modifiers;
uint8_t index; uint8_t index;
uint8_t continuations_count; uint8_t continuations_count;
@ -45,12 +48,22 @@ struct behavior_caps_word_data {
static void activate_caps_word(const struct device *dev) { static void activate_caps_word(const struct device *dev) {
struct behavior_caps_word_data *data = dev->data; 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; data->active = true;
} }
static void deactivate_caps_word(const struct device *dev) { static void deactivate_caps_word(const struct device *dev) {
struct behavior_caps_word_data *data = dev->data; 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; 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); LOG_DBG("Enhancing usage 0x%02X with modifiers: 0x%02X", ev->keycode, config->mods);
if (config->mods != 0) {
ev->implicit_modifiers |= config->mods; ev->implicit_modifiers |= config->mods;
}
} }
static int caps_word_keycode_state_changed_listener(const zmk_event_t *eh) { 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); caps_word_enhance_usage(config, ev);
if (!caps_word_is_alpha(ev->keycode) && !caps_word_is_numeric(ev->keycode) && 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)) && (!is_mod(ev->usage_page, ev->keycode) || !config->ignore_modifiers) &&
!caps_word_is_caps_includelist(config, ev->usage_page, ev->keycode, !caps_word_is_caps_includelist(config, ev->usage_page, ev->keycode,
ev->implicit_modifiers)) { ev->implicit_modifiers)) {
LOG_DBG("Deactivating caps_word for 0x%02X - 0x%02X", ev->usage_page, ev->keycode); 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 = { \ static struct behavior_caps_word_config behavior_caps_word_config_##n = { \
.index = n, \ .index = n, \
.mods = DT_INST_PROP_OR(n, mods, MOD_LSFT), \ .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), \ .ignore_modifiers = DT_INST_PROP(n, ignore_modifiers), \
.continuations = {LISTIFY(DT_INST_PROP_LEN(n, continue_list), BREAK_ITEM, (, ), n)}, \ .continuations = {LISTIFY(DT_INST_PROP_LEN(n, continue_list), BREAK_ITEM, (, ), n)}, \
.continuations_count = DT_INST_PROP_LEN(n, continue_list), \ .continuations_count = DT_INST_PROP_LEN(n, continue_list), \