Skip to content

Commit cb427b8

Browse files
committed
Tweaks and update docs
1 parent 05bd3b1 commit cb427b8

File tree

3 files changed

+36
-37
lines changed

3 files changed

+36
-37
lines changed

app/Kconfig.behaviors

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,12 @@
44
config ZMK_BEHAVIOR_BACKLIGHT
55
bool
66
default y
7-
depends on DT_HAS_ZMK_BEHAVIOR_BACKLIGHT_ENABLED
8-
imply ZMK_BACKLIGHT
7+
depends on DT_HAS_ZMK_BEHAVIOR_BACKLIGHT_ENABLED && ZMK_BACKLIGHT
98

109
config ZMK_BEHAVIOR_BLUETOOTH
1110
bool
1211
default y
13-
depends on DT_HAS_ZMK_BEHAVIOR_BLUETOOTH_ENABLED
12+
depends on DT_HAS_ZMK_BEHAVIOR_BLUETOOTH_ENABLED && ZMK_BLE
1413

1514
config ZMK_BEHAVIOR_CAPS_WORD
1615
bool
@@ -20,8 +19,7 @@ config ZMK_BEHAVIOR_CAPS_WORD
2019
config ZMK_BEHAVIOR_EXT_POWER
2120
bool
2221
default y
23-
depends on DT_HAS_ZMK_BEHAVIOR_EXT_POWER_ENABLED
24-
imply ZMK_EXT_POWER
22+
depends on DT_HAS_ZMK_BEHAVIOR_EXT_POWER_ENABLED && ZMK_EXT_POWER
2523

2624
config ZMK_BEHAVIOR_HOLD_TAP
2725
bool
@@ -82,8 +80,7 @@ config ZMK_BEHAVIOR_RESET
8280
config ZMK_BEHAVIOR_RGB_UNDERGLOW
8381
bool
8482
default y
85-
depends on DT_HAS_ZMK_BEHAVIOR_RGB_UNDERGLOW_ENABLED
86-
imply ZMK_RGB_UNDERGLOW
83+
depends on DT_HAS_ZMK_BEHAVIOR_RGB_UNDERGLOW_ENABLED && ZMK_RGB_UNDERGLOW
8784

8885
config ZMK_BEHAVIOR_SENSOR_ROTATE_COMMON
8986
bool

app/src/behaviors/behavior_mouse_key_press.c

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@
1616

1717
LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);
1818

19-
#if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT)
20-
2119
static int behavior_mouse_key_press_init(const struct device *dev) { return 0; };
2220

2321
static int on_keymap_binding_pressed(struct zmk_behavior_binding *binding,
@@ -44,5 +42,3 @@ static const struct behavior_driver_api behavior_mouse_key_press_driver_api = {
4442
&behavior_mouse_key_press_driver_api);
4543

4644
DT_INST_FOREACH_STATUS_OKAY(MKP_INST)
47-
48-
#endif /* DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) */

docs/docs/development/new-behavior.md

Lines changed: 32 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ The general process for developing behaviors is:
1717
1. [Create the behavior](#creating-the-behavior)
1818
1. [Create the devicetree binding (`.yaml`)](#creating-the-devicetree-binding-yaml)
1919
1. [Create the driver (`.c`)](#creating-the-driver-c)
20+
1. [Update `app/Kconfig.behavior`](#updating-appkconfigbehavior)
2021
1. [Update `app/CmakeLists.txt` to include the new driver](#updating-appcmakeliststxt-to-include-the-new-driver)
2122
1. [Define common use-cases for the behavior (`.dtsi`) (Optional)](#defining-common-use-cases-for-the-behavior-dtsi-optional)
2223
1. [Test changes locally](#testing-changes-locally)
@@ -145,8 +146,6 @@ The code snippet below shows the essential components of a new driver.
145146
146147
LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);
147148
148-
#if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT)
149-
150149
// Instance-Unique Data Struct (Optional)
151150
struct behavior_<behavior_name>_data {
152151
bool example_data_param1;
@@ -178,8 +177,6 @@ BEHAVIOR_DT_INST_DEFINE(0, //
178177
APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, // Initialization Level, Device Priority
179178
&<behavior_name>_driver_api); // API Structure
180179
181-
#endif /* DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) */
182-
183180
```
184181

185182
#### `DT_DRV_COMPAT`
@@ -320,38 +317,47 @@ The fifth cell of `BEHAVIOR_DT_INST_DEFINE` can be set to `NULL` instead if inst
320317
Remember that `.c` files should be formatted according to `clang-format` to ensure that checks run smoothly once the pull request is submitted.
321318
:::
322319

320+
### Updating `app/Kconfig.behaviors`
321+
322+
In order to compile the behavior only when a user includes it in their keymap, an entry needs to be added to `app/Kconfig.behaviors` similar to the entry for hold-tap, which is shown below as a reference:
323+
324+
```txt title="app/Kconfig.behaviors"
325+
config ZMK_BEHAVIOR_HOLD_TAP
326+
bool
327+
default y
328+
depends on DT_HAS_ZMK_BEHAVIOR_HOLD_TAP_ENABLED
329+
```
330+
331+
In the case of a new behavior, replace `HOLD_TAP` with the upper-snake-cased name. If the inclusion of the behavior in a keyboard's keymap should enable a Kconfig option, append `imply ZMK_<Configuration Option>` to the entry. If the behavior requires a certain condition in a keyboard's `.conf` file to be met, append `&& ZMK_<Configuration Requirement>` to the `depends on` line.
332+
323333
### Updating `app/CmakeLists.txt` to include the new driver
324334

325-
Most behavior drivers' are invoked according to the central half's [locality](#api-structure), and are therefore stored after the line `if ((NOT CONFIG_ZMK_SPLIT) OR CONFIG_ZMK_SPLIT_ROLE_CENTRAL)` in the form, `target_sources(app PRIVATE src/behaviors/<behavior_name>.c)`, as shown below.
335+
Most behavior drivers are invoked according to the central half's [locality](#api-structure), and are therefore stored after the line `if ((NOT CONFIG_ZMK_SPLIT) OR CONFIG_ZMK_SPLIT_ROLE_CENTRAL)` in the form, `target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_<BEHAVIOR_NAME> app PRIVATE src/behaviors/<behavior_name>.c)`, as shown below.
326336

327337
```txt title="app/CmakeLists.txt"
328338
if ((NOT CONFIG_ZMK_SPLIT) OR CONFIG_ZMK_SPLIT_ROLE_CENTRAL)
329-
target_sources(app PRIVATE src/behaviors/behavior_key_press.c)
330-
target_sources(app PRIVATE src/behaviors/behavior_hold_tap.c)
331-
target_sources(app PRIVATE src/behaviors/behavior_sticky_key.c)
332-
target_sources(app PRIVATE src/behaviors/behavior_caps_word.c)
333-
target_sources(app PRIVATE src/behaviors/behavior_key_repeat.c)
334-
target_sources(app PRIVATE src/behaviors/behavior_momentary_layer.c)
335-
target_sources(app PRIVATE src/behaviors/behavior_mod_morph.c)
336-
target_sources(app PRIVATE src/behaviors/behavior_outputs.c)
337-
target_sources(app PRIVATE src/behaviors/behavior_tap_dance.c)
338-
target_sources(app PRIVATE src/behaviors/behavior_toggle_layer.c)
339-
target_sources(app PRIVATE src/behaviors/behavior_to_layer.c)
340-
target_sources(app PRIVATE src/behaviors/behavior_transparent.c)
341-
target_sources(app PRIVATE src/behaviors/behavior_none.c)
342-
target_sources(app PRIVATE src/behaviors/behavior_sensor_rotate_key_press.c)
343-
target_sources(app PRIVATE src/combo.c)
344-
target_sources(app PRIVATE src/conditional_layer.c)
345-
target_sources(app PRIVATE src/keymap.c)
339+
target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_KEY_PRESS app PRIVATE src/behaviors/behavior_key_press.c)
340+
target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_KEY_TOGGLE app PRIVATE src/behaviors/behavior_key_toggle.c)
341+
target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_HOLD_TAP app PRIVATE src/behaviors/behavior_hold_tap.c)
342+
target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_STICKY_KEY app PRIVATE src/behaviors/behavior_sticky_key.c)
343+
target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_CAPS_WORD app PRIVATE src/behaviors/behavior_caps_word.c)
344+
target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_KEY_REPEAT app PRIVATE src/behaviors/behavior_key_repeat.c)
345+
target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_MACRO app PRIVATE src/behaviors/behavior_macro.c)
346+
target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_MOMENTARY_LAYER app PRIVATE src/behaviors/behavior_momentary_layer.c)
347+
target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_MOD_MORPH app PRIVATE src/behaviors/behavior_mod_morph.c)
348+
target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_OUTPUTS app PRIVATE src/behaviors/behavior_outputs.c)
349+
target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_TOGGLE_LAYER app PRIVATE src/behaviors/behavior_toggle_layer.c)
350+
target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_TO_LAYER app PRIVATE src/behaviors/behavior_to_layer.c)
351+
target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_TRANSPARENT app PRIVATE src/behaviors/behavior_transparent.c)
352+
target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_NONE app PRIVATE src/behaviors/behavior_none.c)
346353
endif()
347354
```
348355

349356
For behaviors that do not require central locality, the following options for updating `app/CmakeLists.txt` also exist:
350357

351-
- Behavior applies to unibody, or central or peripheral half of keyboard: place `target_sources(app PRIVATE <behavior_name>.c)` line _before_ `if ((NOT CONFIG_ZMK_SPLIT) OR CONFIG_ZMK_SPLIT_ROLE_CENTRAL)`
352-
- Behavior applies to _only_ central half of split keyboard: place `target_sources(app PRIVATE <behavior_name>.c)` after `if (CONFIG_ZMK_SPLIT AND CONFIG_ZMK_SPLIT_ROLE_CENTRAL)`
353-
- Behavior applies to _only_ peripheral half of split keyboard: place `target_sources(app PRIVATE <behavior_name>.c)` after `if (CONFIG_ZMK_SPLIT AND (NOT CONFIG_ZMK_SPLIT_ROLE_CENTRAL))`
354-
- Behavior requires certain condition in a keyboard's `.conf` file to be met: use `target_sources_ifdef(CONFIG_<Configuration Requirement> app PRIVATE <behavior_name>.c)` instead of `target_sources(<behavior_name>.c)`
358+
- Behavior applies to unibody, or central or peripheral half of keyboard: place `target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_<BEHAVIOR_NAME> app PRIVATE src/behaviors/<behavior_name>.c)` line _before_ `if ((NOT CONFIG_ZMK_SPLIT) OR CONFIG_ZMK_SPLIT_ROLE_CENTRAL)`
359+
- Behavior applies to _only_ central half of split keyboard: place `target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_<BEHAVIOR_NAME> app PRIVATE src/behaviors/<behavior_name>.c)` after `if (CONFIG_ZMK_SPLIT AND CONFIG_ZMK_SPLIT_ROLE_CENTRAL)`
360+
- Behavior applies to _only_ peripheral half of split keyboard: place `target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_<BEHAVIOR_NAME> app PRIVATE src/behaviors/<behavior_name>.c)` after `if (CONFIG_ZMK_SPLIT AND (NOT CONFIG_ZMK_SPLIT_ROLE_CENTRAL))`
355361

356362
### Defining common use-cases for the behavior (`.dtsi`) (Optional)
357363

0 commit comments

Comments
 (0)