From e4f1454e0bc9d86540f738c9de11ff9811290ed0 Mon Sep 17 00:00:00 2001 From: Pete Johanson Date: Wed, 15 Jan 2025 14:51:26 -0700 Subject: [PATCH] refactor(keymap): Reduce flash usage for studio builds (#2771) When building for ZMK Studio, we can use the constant stock keymap for init of the in-memory keymap, to avoid duplicate flash usage for the keymap from the devicetree. --- app/include/zmk/keymap.h | 5 ++++- app/src/keymap.c | 19 +++++++++++++------ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/app/include/zmk/keymap.h b/app/include/zmk/keymap.h index 9b278a6050f..9b7a00c61fd 100644 --- a/app/include/zmk/keymap.h +++ b/app/include/zmk/keymap.h @@ -10,7 +10,10 @@ #define ZMK_LAYER_CHILD_LEN_PLUS_ONE(node) 1 + #define ZMK_KEYMAP_LAYERS_LEN \ - (DT_FOREACH_CHILD(DT_INST(0, zmk_keymap), ZMK_LAYER_CHILD_LEN_PLUS_ONE) 0) + (COND_CODE_1( \ + IS_ENABLED(CONFIG_ZMK_STUDIO), \ + (DT_FOREACH_CHILD(DT_INST(0, zmk_keymap), ZMK_LAYER_CHILD_LEN_PLUS_ONE)), \ + (DT_FOREACH_CHILD_STATUS_OKAY(DT_INST(0, zmk_keymap), ZMK_LAYER_CHILD_LEN_PLUS_ONE))) 0) /** * @brief A layer ID is a stable identifier to refer to a layer, regardless of ordering. diff --git a/app/src/keymap.c b/app/src/keymap.c index 16b24bf2746..762dd4f4112 100644 --- a/app/src/keymap.c +++ b/app/src/keymap.c @@ -72,17 +72,21 @@ static uint8_t keymap_layer_orders[ZMK_KEYMAP_LAYERS_LEN]; #endif // IS_ENABLED(CONFIG_ZMK_KEYMAP_LAYER_REORDERING) -#define KEYMAP_VAR(_name, _opts) \ +#define KEYMAP_VAR(_name, _opts, no_init) \ static _opts struct zmk_behavior_binding _name[ZMK_KEYMAP_LAYERS_LEN][ZMK_KEYMAP_LEN] = { \ - COND_CODE_1(IS_ENABLED(CONFIG_ZMK_STUDIO), \ - (DT_INST_FOREACH_CHILD_SEP(0, TRANSFORMED_LAYER, (, ))), \ - (DT_INST_FOREACH_CHILD_STATUS_OKAY_SEP(0, TRANSFORMED_LAYER, (, ))))}; + COND_CODE_0( \ + no_init, \ + (COND_CODE_1(IS_ENABLED(CONFIG_ZMK_STUDIO), \ + (DT_INST_FOREACH_CHILD_SEP(0, TRANSFORMED_LAYER, (, ))), \ + (DT_INST_FOREACH_CHILD_STATUS_OKAY_SEP(0, TRANSFORMED_LAYER, (, ))))), \ + (0))}; -KEYMAP_VAR(zmk_keymap, COND_CODE_1(IS_ENABLED(CONFIG_ZMK_KEYMAP_SETTINGS_STORAGE), (), (const))) +KEYMAP_VAR(zmk_keymap, COND_CODE_1(IS_ENABLED(CONFIG_ZMK_KEYMAP_SETTINGS_STORAGE), (), (const)), + IS_ENABLED(CONFIG_ZMK_STUDIO)) #if IS_ENABLED(CONFIG_ZMK_KEYMAP_SETTINGS_STORAGE) -KEYMAP_VAR(zmk_stock_keymap, const) +KEYMAP_VAR(zmk_stock_keymap, const, 0) static char zmk_keymap_layer_names[ZMK_KEYMAP_LAYERS_LEN][CONFIG_ZMK_KEYMAP_LAYER_NAME_MAX_LEN] = { DT_INST_FOREACH_CHILD_SEP(0, LAYER_NAME, (, ))}; @@ -955,6 +959,9 @@ int keymap_init(void) { #if IS_ENABLED(CONFIG_ZMK_KEYMAP_LAYER_REORDERING) load_stock_keymap_layer_ordering(); #endif +#if IS_ENABLED(CONFIG_ZMK_STUDIO) + reload_from_stock_keymap(); +#endif return 0; }