Skip to content

Commit

Permalink
refactor(behaviors) Update Behaviors to use Custom Kconfig Preprocess…
Browse files Browse the repository at this point in the history
…or Functions

Updates behaviors to compile only those explicitly used in a keymap, similarly to zmkfirmware#1269.
  • Loading branch information
kurtis-lew committed May 3, 2022
1 parent 8bbbf53 commit c14706c
Show file tree
Hide file tree
Showing 16 changed files with 101 additions and 80 deletions.
30 changes: 15 additions & 15 deletions app/CMakeLists.txt
Expand Up @@ -45,21 +45,21 @@ target_sources_ifdef(CONFIG_USB_DEVICE_STACK app PRIVATE src/events/usb_conn_sta
target_sources(app PRIVATE src/behaviors/behavior_reset.c)
target_sources_ifdef(CONFIG_ZMK_EXT_POWER app PRIVATE src/behaviors/behavior_ext_power.c)
if ((NOT CONFIG_ZMK_SPLIT) OR CONFIG_ZMK_SPLIT_BLE_ROLE_CENTRAL)
target_sources(app PRIVATE src/behaviors/behavior_key_press.c)
target_sources(app PRIVATE src/behaviors/behavior_hold_tap.c)
target_sources(app PRIVATE src/behaviors/behavior_sticky_key.c)
target_sources(app PRIVATE src/behaviors/behavior_caps_word.c)
target_sources(app PRIVATE src/behaviors/behavior_key_repeat.c)
target_sources(app PRIVATE src/behaviors/behavior_macro.c)
target_sources(app PRIVATE src/behaviors/behavior_momentary_layer.c)
target_sources(app PRIVATE src/behaviors/behavior_mod_morph.c)
target_sources(app PRIVATE src/behaviors/behavior_outputs.c)
target_sources(app PRIVATE src/behaviors/behavior_tap_dance.c)
target_sources(app PRIVATE src/behaviors/behavior_toggle_layer.c)
target_sources(app PRIVATE src/behaviors/behavior_to_layer.c)
target_sources(app PRIVATE src/behaviors/behavior_transparent.c)
target_sources(app PRIVATE src/behaviors/behavior_none.c)
target_sources(app PRIVATE src/behaviors/behavior_sensor_rotate_key_press.c)
target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_KEY_PRESS app PRIVATE src/behaviors/behavior_key_press.c)
target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_HOLD_TAP app PRIVATE src/behaviors/behavior_hold_tap.c)
target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_STICKY_KEY app PRIVATE src/behaviors/behavior_sticky_key.c)
target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_CAPS_WORD app PRIVATE src/behaviors/behavior_caps_word.c)
target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_KEY_REPEAT app PRIVATE src/behaviors/behavior_key_repeat.c)
target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_MACRO app PRIVATE src/behaviors/behavior_macro.c)
target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_MOMENTARY_LAYER app PRIVATE src/behaviors/behavior_momentary_layer.c)
target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_MOD_MORPH app PRIVATE src/behaviors/behavior_mod_morph.c)
target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_OUTPUTS app PRIVATE src/behaviors/behavior_outputs.c)
target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_TAP_DANCE app PRIVATE src/behaviors/behavior_tap_dance.c)
target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_TOGGLE_LAYER app PRIVATE src/behaviors/behavior_toggle_layer.c)
target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_TO_LAYER app PRIVATE src/behaviors/behavior_to_layer.c)
target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_TRANSPARENT app PRIVATE src/behaviors/behavior_transparent.c)
target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_NONE app PRIVATE src/behaviors/behavior_none.c)
target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_SENSOR_ROTATE_KEY_PRESS app PRIVATE src/behaviors/behavior_sensor_rotate_key_press.c)
target_sources(app PRIVATE src/combo.c)
target_sources(app PRIVATE src/behavior_queue.c)
target_sources(app PRIVATE src/conditional_layer.c)
Expand Down
76 changes: 76 additions & 0 deletions app/Kconfig
Expand Up @@ -431,6 +431,82 @@ config ZMK_BEHAVIORS_QUEUE_SIZE
int "Maximum number of behaviors to allow queueing from a macro or other complex behavior"
default 64

DT_COMPAT_ZMK_BEHAVIOR_CAPS_WORD := zmk,behavior-caps-word
DT_COMPAT_ZMK_BEHAVIOR_HOLD_TAP := zmk,behavior-hold-tap
DT_COMPAT_ZMK_BEHAVIOR_KEY_PRESS := zmk,behavior-key-press
DT_COMPAT_ZMK_BEHAVIOR_KEY_REPEAT := zmk,behavior-key-repeat
DT_COMPAT_ZMK_BEHAVIOR_MACRO := zmk,behavior-macro
DT_COMPAT_ZMK_BEHAVIOR_MOD_MORPH := zmk,behavior-mod-morph
DT_COMPAT_ZMK_BEHAVIOR_MOMENTARY_LAYER := zmk,behavior-momentary-layer
DT_COMPAT_ZMK_BEHAVIOR_NONE := zmk,behavior-none
DT_COMPAT_ZMK_BEHAVIOR_OUTPUTS := zmk,behavior-outputs
DT_COMPAT_ZMK_BEHAVIOR_SENSOR_ROTATE_KEY_PRESS := zmk,behavior-sensor-rotate-key-press
DT_COMPAT_ZMK_BEHAVIOR_STICKY_KEY := zmk,behavior-sticky-key
DT_COMPAT_ZMK_BEHAVIOR_TAP_DANCE := zmk,behavior-tap-dance
DT_COMPAT_ZMK_BEHAVIOR_TO_LAYER := zmk,behavior-to-layer
DT_COMPAT_ZMK_BEHAVIOR_TOGGLE_LAYER := zmk,behavior-toggle-layer
DT_COMPAT_ZMK_BEHAVIOR_TRANSPARENT := zmk,behavior-transparent

config ZMK_BEHAVIOR_CAPS_WORD
bool
default $(dt_compat_enabled,$(DT_COMPAT_ZMK_BEHAVIOR_CAPS_WORD))

config ZMK_BEHAVIOR_HOLD_TAP
bool
default $(dt_compat_enabled,$(DT_COMPAT_ZMK_BEHAVIOR_HOLD_TAP))

config ZMK_BEHAVIOR_KEY_PRESS
bool
default $(dt_compat_enabled,$(DT_COMPAT_ZMK_BEHAVIOR_KEY_PRESS))

config ZMK_BEHAVIOR_KEY_REPEAT
bool
default $(dt_compat_enabled,$(DT_COMPAT_ZMK_BEHAVIOR_KEY_REPEAT))

config ZMK_BEHAVIOR_MACRO
bool
default $(dt_compat_enabled,$(DT_COMPAT_ZMK_BEHAVIOR_MACRO))

config ZMK_BEHAVIOR_MOD_MORPH
bool
default $(dt_compat_enabled,$(DT_COMPAT_ZMK_BEHAVIOR_MOD_MORPH))

config ZMK_BEHAVIOR_MOMENTARY_LAYER
bool
default $(dt_compat_enabled,$(DT_COMPAT_ZMK_BEHAVIOR_MOMENTARY_LAYER))

config ZMK_BEHAVIOR_NONE
bool
default $(dt_compat_enabled,$(DT_COMPAT_ZMK_BEHAVIOR_NONE))

config ZMK_BEHAVIOR_OUTPUTS
bool
default $(dt_compat_enabled,$(DT_COMPAT_ZMK_BEHAVIOR_OUTPUTS))

config ZMK_BEHAVIOR_SENSOR_ROTATE_KEY_PRESS
bool
default $(dt_compat_enabled,$(DT_COMPAT_ZMK_BEHAVIOR_SENSOR_ROTATE_KEY_PRESS))

config ZMK_BEHAVIOR_STICKY_KEY
bool
default $(dt_compat_enabled,$(DT_COMPAT_ZMK_BEHAVIOR_STICKY_KEY))

config ZMK_BEHAVIOR_TAP_DANCE
bool
default $(dt_compat_enabled,$(DT_COMPAT_ZMK_BEHAVIOR_TAP_DANCE))

config ZMK_BEHAVIOR_TO_LAYER
bool
default $(dt_compat_enabled,$(DT_COMPAT_ZMK_BEHAVIOR_TO_LAYER))

config ZMK_BEHAVIOR_TOGGLE_LAYER
bool
default $(dt_compat_enabled,$(DT_COMPAT_ZMK_BEHAVIOR_TOGGLE_LAYER))

config ZMK_BEHAVIOR_TRANSPARENT
bool
default $(dt_compat_enabled,$(DT_COMPAT_ZMK_BEHAVIOR_TRANSPARENT))

endmenu

menu "Advanced"
Expand Down
8 changes: 2 additions & 6 deletions app/src/behaviors/behavior_caps_word.c
Expand Up @@ -21,8 +21,6 @@

LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);

#if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT)

struct caps_word_continue_item {
uint16_t page;
uint32_t id;
Expand Down Expand Up @@ -168,7 +166,7 @@ static int behavior_caps_word_init(const struct device *dev) {

#define BREAK_ITEM(i, n) PARSE_BREAK(DT_INST_PROP_BY_IDX(n, continue_list, i))

#define KP_INST(n) \
#define CW_INST(n) \
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, \
Expand All @@ -180,6 +178,4 @@ static int behavior_caps_word_init(const struct device *dev) {
&behavior_caps_word_config_##n, APPLICATION, \
CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_caps_word_driver_api);

DT_INST_FOREACH_STATUS_OKAY(KP_INST)

#endif
DT_INST_FOREACH_STATUS_OKAY(CW_INST)
8 changes: 2 additions & 6 deletions app/src/behaviors/behavior_hold_tap.c
Expand Up @@ -22,8 +22,6 @@

LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);

#if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT)

#define ZMK_BHV_HOLD_TAP_MAX_HELD 10
#define ZMK_BHV_HOLD_TAP_MAX_CAPTURED_EVENTS 40

Expand Down Expand Up @@ -690,7 +688,7 @@ static int behavior_hold_tap_init(const struct device *dev) {
return 0;
}

#define KP_INST(n) \
#define HT_INST(n) \
static struct behavior_hold_tap_config behavior_hold_tap_config_##n = { \
.tapping_term_ms = DT_INST_PROP(n, tapping_term_ms), \
.hold_behavior_dev = DT_LABEL(DT_INST_PHANDLE_BY_IDX(n, bindings, 0)), \
Expand All @@ -706,6 +704,4 @@ static int behavior_hold_tap_init(const struct device *dev) {
APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, \
&behavior_hold_tap_driver_api);

DT_INST_FOREACH_STATUS_OKAY(KP_INST)

#endif /* DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) */
DT_INST_FOREACH_STATUS_OKAY(HT_INST)
4 changes: 0 additions & 4 deletions app/src/behaviors/behavior_key_repeat.c
Expand Up @@ -17,8 +17,6 @@

LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);

#if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT)

struct behavior_key_repeat_config {
uint8_t index;
uint8_t usage_pages_count;
Expand Down Expand Up @@ -121,5 +119,3 @@ static int behavior_key_repeat_init(const struct device *dev) {
CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_key_repeat_driver_api);

DT_INST_FOREACH_STATUS_OKAY(KR_INST)

#endif
4 changes: 0 additions & 4 deletions app/src/behaviors/behavior_macro.c
Expand Up @@ -15,8 +15,6 @@

LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);

#if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT)

enum behavior_macro_mode {
MACRO_MODE_TAP,
MACRO_MODE_PRESS,
Expand Down Expand Up @@ -183,5 +181,3 @@ static const struct behavior_driver_api behavior_macro_driver_api = {
CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_macro_driver_api);

DT_INST_FOREACH_STATUS_OKAY(MACRO_INST)

#endif /* DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) */
8 changes: 2 additions & 6 deletions app/src/behaviors/behavior_mod_morph.c
Expand Up @@ -21,8 +21,6 @@

LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);

#if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT)

struct behavior_mod_morph_config {
struct zmk_behavior_binding normal_binding;
struct zmk_behavior_binding morph_binding;
Expand Down Expand Up @@ -83,7 +81,7 @@ static int behavior_mod_morph_init(const struct device *dev) { return 0; }
(DT_INST_PHA_BY_IDX(node, bindings, idx, param2))), \
}

#define KP_INST(n) \
#define MM_INST(n) \
static struct behavior_mod_morph_config behavior_mod_morph_config_##n = { \
.normal_binding = _TRANSFORM_ENTRY(0, n), \
.morph_binding = _TRANSFORM_ENTRY(1, n), \
Expand All @@ -94,6 +92,4 @@ static int behavior_mod_morph_init(const struct device *dev) { return 0; }
&behavior_mod_morph_config_##n, APPLICATION, \
CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_mod_morph_driver_api);

DT_INST_FOREACH_STATUS_OKAY(KP_INST)

#endif
DT_INST_FOREACH_STATUS_OKAY(MM_INST)
4 changes: 0 additions & 4 deletions app/src/behaviors/behavior_none.c
Expand Up @@ -14,8 +14,6 @@

LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);

#if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT)

static int behavior_none_init(const struct device *dev) { return 0; };

static int on_keymap_binding_pressed(struct zmk_behavior_binding *binding,
Expand All @@ -35,5 +33,3 @@ static const struct behavior_driver_api behavior_none_driver_api = {

DEVICE_DT_INST_DEFINE(0, behavior_none_init, NULL, NULL, NULL, APPLICATION,
CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_none_driver_api);

#endif /* DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) */
4 changes: 0 additions & 4 deletions app/src/behaviors/behavior_outputs.c
Expand Up @@ -18,8 +18,6 @@
#include <logging/log.h>
LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);

#if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT)

static int on_keymap_binding_pressed(struct zmk_behavior_binding *binding,
struct zmk_behavior_binding_event event) {
switch (binding->param1) {
Expand All @@ -44,5 +42,3 @@ static const struct behavior_driver_api behavior_outputs_driver_api = {

DEVICE_DT_INST_DEFINE(0, behavior_out_init, NULL, NULL, NULL, APPLICATION,
CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_outputs_driver_api);

#endif /* DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) */
3 changes: 0 additions & 3 deletions app/src/behaviors/behavior_reset.c
Expand Up @@ -15,7 +15,6 @@

LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);

#if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT)
struct behavior_reset_config {
int type;
};
Expand Down Expand Up @@ -47,5 +46,3 @@ static const struct behavior_driver_api behavior_reset_driver_api = {
&behavior_reset_driver_api);

DT_INST_FOREACH_STATUS_OKAY(RST_INST)

#endif /* DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) */
4 changes: 0 additions & 4 deletions app/src/behaviors/behavior_sensor_rotate_key_press.c
Expand Up @@ -16,8 +16,6 @@

LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);

#if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT)

static int behavior_sensor_rotate_key_press_init(const struct device *dev) { return 0; };

static int on_sensor_binding_triggered(struct zmk_behavior_binding *binding,
Expand Down Expand Up @@ -64,5 +62,3 @@ static const struct behavior_driver_api behavior_sensor_rotate_key_press_driver_
&behavior_sensor_rotate_key_press_driver_api);

DT_INST_FOREACH_STATUS_OKAY(KP_INST)

#endif /* DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) */
8 changes: 2 additions & 6 deletions app/src/behaviors/behavior_sticky_key.c
Expand Up @@ -22,8 +22,6 @@

LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);

#if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT)

#define ZMK_BHV_STICKY_KEY_MAX_HELD 10

#define ZMK_BHV_STICKY_KEY_POSITION_FREE UINT32_MAX
Expand Down Expand Up @@ -280,7 +278,7 @@ static int behavior_sticky_key_init(const struct device *dev) {
struct behavior_sticky_key_data {};
static struct behavior_sticky_key_data behavior_sticky_key_data;

#define KP_INST(n) \
#define SK_INST(n) \
static struct behavior_sticky_key_config behavior_sticky_key_config_##n = { \
.behavior = ZMK_KEYMAP_EXTRACT_BINDING(0, DT_DRV_INST(n)), \
.release_after_ms = DT_INST_PROP(n, release_after_ms), \
Expand All @@ -291,6 +289,4 @@ static struct behavior_sticky_key_data behavior_sticky_key_data;
&behavior_sticky_key_config_##n, APPLICATION, \
CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_sticky_key_driver_api);

DT_INST_FOREACH_STATUS_OKAY(KP_INST)

#endif
DT_INST_FOREACH_STATUS_OKAY(SK_INST)
8 changes: 2 additions & 6 deletions app/src/behaviors/behavior_tap_dance.c
Expand Up @@ -19,8 +19,6 @@

LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);

#if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT)

#define ZMK_BHV_TAP_DANCE_MAX_HELD 10

#define ZMK_BHV_TAP_DANCE_POSITION_FREE UINT32_MAX
Expand Down Expand Up @@ -242,7 +240,7 @@ static int behavior_tap_dance_init(const struct device *dev) {
#define TRANSFORMED_BINDINGS(node) \
{ UTIL_LISTIFY(DT_INST_PROP_LEN(node, bindings), _TRANSFORM_ENTRY, DT_DRV_INST(node)) }

#define KP_INST(n) \
#define TD_INST(n) \
static struct zmk_behavior_binding \
behavior_tap_dance_config_##n##_bindings[DT_INST_PROP_LEN(n, bindings)] = \
TRANSFORMED_BINDINGS(n); \
Expand All @@ -254,6 +252,4 @@ static int behavior_tap_dance_init(const struct device *dev) {
APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, \
&behavior_tap_dance_driver_api);

DT_INST_FOREACH_STATUS_OKAY(KP_INST)

#endif
DT_INST_FOREACH_STATUS_OKAY(TD_INST)
4 changes: 0 additions & 4 deletions app/src/behaviors/behavior_to_layer.c
Expand Up @@ -15,8 +15,6 @@

LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);

#if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT)

static int behavior_to_init(const struct device *dev) { return 0; };

static int to_keymap_binding_pressed(struct zmk_behavior_binding *binding,
Expand All @@ -39,5 +37,3 @@ static const struct behavior_driver_api behavior_to_driver_api = {

DEVICE_DT_INST_DEFINE(0, behavior_to_init, NULL, NULL, NULL, APPLICATION,
CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_to_driver_api);

#endif /* DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) */
4 changes: 0 additions & 4 deletions app/src/behaviors/behavior_toggle_layer.c
Expand Up @@ -15,8 +15,6 @@

LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);

#if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT)

struct behavior_tog_config {};
struct behavior_tog_data {};

Expand Down Expand Up @@ -45,5 +43,3 @@ static struct behavior_tog_data behavior_tog_data;

DEVICE_DT_INST_DEFINE(0, behavior_tog_init, NULL, &behavior_tog_data, &behavior_tog_config,
APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_tog_driver_api);

#endif /* DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) */
4 changes: 0 additions & 4 deletions app/src/behaviors/behavior_transparent.c
Expand Up @@ -14,8 +14,6 @@

LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);

#if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT)

static int behavior_transparent_init(const struct device *dev) { return 0; };

static int on_keymap_binding_pressed(struct zmk_behavior_binding *binding,
Expand All @@ -35,5 +33,3 @@ static const struct behavior_driver_api behavior_transparent_driver_api = {

DEVICE_DT_INST_DEFINE(0, behavior_transparent_init, NULL, NULL, NULL, APPLICATION,
CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_transparent_driver_api);

#endif /* DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) */

0 comments on commit c14706c

Please sign in to comment.