Skip to content

Commit

Permalink
Apply smart-layer. PR zmkfirmware#1451
Browse files Browse the repository at this point in the history
  • Loading branch information
yuanbin committed Jun 13, 2023
1 parent 3e8f475 commit e518220
Show file tree
Hide file tree
Showing 4 changed files with 60 additions and 4 deletions.
15 changes: 15 additions & 0 deletions app/dts/behaviors/caps_word.dtsi
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,22 @@
compatible = "zmk,behavior-caps-word";
label = "CAPS_WORD";
#binding-cells = <0>;
mods = <MOD_LSFT>;
continue-list = <UNDERSCORE BACKSPACE DELETE>;
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>;
// layers = <xx>; // to be specified in user config using "&num_word { layers = <xx>; };"
continue-list = <BACKSPACE DELETE DOT COMMA>;
ignore-numbers;
};
};
};
Expand Down
8 changes: 8 additions & 0 deletions app/dts/bindings/behaviors/zmk,behavior-caps-word.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,11 @@ properties:
required: true
mods:
type: int
layers:
type: int
ignore-alphas:
type: boolean
ignore-numbers:
type: boolean
ignore-modifiers:
type: boolean
29 changes: 25 additions & 4 deletions app/src/behaviors/behavior_caps_word.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,10 @@ 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;
struct caps_word_continue_item continuations[];
Expand All @@ -44,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;
}

Expand Down Expand Up @@ -121,7 +135,9 @@ 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) {
Expand All @@ -145,8 +161,9 @@ 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) &&
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);
Expand Down Expand Up @@ -176,7 +193,11 @@ 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), \
.ignore_modifiers = DT_INST_PROP(n, ignore_modifiers), \
.continuations = {UTIL_LISTIFY(DT_INST_PROP_LEN(n, continue_list), BREAK_ITEM, n)}, \
.continuations_count = DT_INST_PROP_LEN(n, continue_list), \
}; \
Expand Down
12 changes: 12 additions & 0 deletions docs/docs/behaviors/caps-word.md
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down

0 comments on commit e518220

Please sign in to comment.