Skip to content

Commit e518220

Browse files
committed
1 parent 3e8f475 commit e518220

File tree

4 files changed

+60
-4
lines changed

4 files changed

+60
-4
lines changed

app/dts/behaviors/caps_word.dtsi

+15
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,22 @@
1212
compatible = "zmk,behavior-caps-word";
1313
label = "CAPS_WORD";
1414
#binding-cells = <0>;
15+
mods = <MOD_LSFT>;
1516
continue-list = <UNDERSCORE BACKSPACE DELETE>;
17+
ignore-alphas;
18+
ignore-numbers;
19+
ignore-modifiers;
20+
};
21+
};
22+
23+
behaviors {
24+
/omit-if-no-ref/ num_word: behavior_num_word {
25+
compatible = "zmk,behavior-caps-word";
26+
label = "NUM_WORD";
27+
#binding-cells = <0>;
28+
// layers = <xx>; // to be specified in user config using "&num_word { layers = <xx>; };"
29+
continue-list = <BACKSPACE DELETE DOT COMMA>;
30+
ignore-numbers;
1631
};
1732
};
1833
};

app/dts/bindings/behaviors/zmk,behavior-caps-word.yaml

+8
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,11 @@ properties:
1313
required: true
1414
mods:
1515
type: int
16+
layers:
17+
type: int
18+
ignore-alphas:
19+
type: boolean
20+
ignore-numbers:
21+
type: boolean
22+
ignore-modifiers:
23+
type: boolean

app/src/behaviors/behavior_caps_word.c

+25-4
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@ struct caps_word_continue_item {
3232

3333
struct behavior_caps_word_config {
3434
zmk_mod_flags_t mods;
35+
int8_t layers;
36+
bool ignore_alphas;
37+
bool ignore_numbers;
38+
bool ignore_modifiers;
3539
uint8_t index;
3640
uint8_t continuations_count;
3741
struct caps_word_continue_item continuations[];
@@ -44,12 +48,22 @@ struct behavior_caps_word_data {
4448
static void activate_caps_word(const struct device *dev) {
4549
struct behavior_caps_word_data *data = dev->data;
4650

51+
const struct behavior_caps_word_config *config = dev->config;
52+
53+
if (config->layers > -1) {
54+
zmk_keymap_layer_activate(config->layers);
55+
}
4756
data->active = true;
4857
}
4958

5059
static void deactivate_caps_word(const struct device *dev) {
5160
struct behavior_caps_word_data *data = dev->data;
5261

62+
const struct behavior_caps_word_config *config = dev->config;
63+
64+
if (config->layers > -1) {
65+
zmk_keymap_layer_deactivate(config->layers);
66+
}
5367
data->active = false;
5468
}
5569

@@ -121,7 +135,9 @@ static void caps_word_enhance_usage(const struct behavior_caps_word_config *conf
121135
}
122136

123137
LOG_DBG("Enhancing usage 0x%02X with modifiers: 0x%02X", ev->keycode, config->mods);
124-
ev->implicit_modifiers |= config->mods;
138+
if (config->mods != 0) {
139+
ev->implicit_modifiers |= config->mods;
140+
}
125141
}
126142

127143
static int caps_word_keycode_state_changed_listener(const zmk_event_t *eh) {
@@ -145,8 +161,9 @@ static int caps_word_keycode_state_changed_listener(const zmk_event_t *eh) {
145161

146162
caps_word_enhance_usage(config, ev);
147163

148-
if (!caps_word_is_alpha(ev->keycode) && !caps_word_is_numeric(ev->keycode) &&
149-
!is_mod(ev->usage_page, ev->keycode) &&
164+
if ((!caps_word_is_alpha(ev->keycode) || !config->ignore_alphas) &&
165+
(!caps_word_is_numeric(ev->keycode) || !config->ignore_numbers) &&
166+
(!is_mod(ev->usage_page, ev->keycode) || !config->ignore_modifiers) &&
150167
!caps_word_is_caps_includelist(config, ev->usage_page, ev->keycode,
151168
ev->implicit_modifiers)) {
152169
LOG_DBG("Deactivating caps_word for 0x%02X - 0x%02X", ev->usage_page, ev->keycode);
@@ -176,7 +193,11 @@ static int behavior_caps_word_init(const struct device *dev) {
176193
static struct behavior_caps_word_data behavior_caps_word_data_##n = {.active = false}; \
177194
static struct behavior_caps_word_config behavior_caps_word_config_##n = { \
178195
.index = n, \
179-
.mods = DT_INST_PROP_OR(n, mods, MOD_LSFT), \
196+
.mods = DT_INST_PROP_OR(n, mods, 0), \
197+
.layers = DT_INST_PROP_OR(n, layers, -1), \
198+
.ignore_alphas = DT_INST_PROP(n, ignore_alphas), \
199+
.ignore_numbers = DT_INST_PROP(n, ignore_numbers), \
200+
.ignore_modifiers = DT_INST_PROP(n, ignore_modifiers), \
180201
.continuations = {UTIL_LISTIFY(DT_INST_PROP_LEN(n, continue_list), BREAK_ITEM, n)}, \
181202
.continuations_count = DT_INST_PROP_LEN(n, continue_list), \
182203
}; \

docs/docs/behaviors/caps-word.md

+12
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,18 @@ By default, the caps word will remain active when any alphanumeric character or
3737
};
3838
```
3939

40+
#### Continue on modifiers
41+
42+
By default, the caps word will remain active when any modifiers are pressed. If you
43+
would like to deactivate caps word when modifiers are pressed, you can delete the
44+
`ignored-modifiers` property in your keymap:
45+
46+
```
47+
&caps_word {
48+
/delete-property/ ignore-modifiers;
49+
};
50+
```
51+
4052
#### Applied Modifier(s)
4153

4254
In addition, if you would like _multiple_ modifiers, instead of just `MOD_LSFT`, you can override the `mods` property:

0 commit comments

Comments
 (0)