From 086cc937b7f8f8ef403957be57e916d608b07d48 Mon Sep 17 00:00:00 2001 From: Nicolas Munnich Date: Wed, 5 Mar 2025 22:50:27 +0100 Subject: [PATCH] fixup! feat: Refactor behaviors, sensor to raise behavior_binding_event --- app/include/zmk/keymap.h | 13 +++++++++--- app/src/behaviors/behavior_transparent.c | 9 ++++++-- app/src/keymap.c | 21 ++++++++----------- app/src/sensors.c | 6 +++--- .../macros/press-mid-macro/events.patterns | 2 +- 5 files changed, 30 insertions(+), 21 deletions(-) diff --git a/app/include/zmk/keymap.h b/app/include/zmk/keymap.h index 463105bc938..9f35c6c34b2 100644 --- a/app/include/zmk/keymap.h +++ b/app/include/zmk/keymap.h @@ -59,6 +59,13 @@ int zmk_keymap_restore_layer(zmk_keymap_layer_id_t id, zmk_keymap_layer_index_t int zmk_keymap_move_layer(zmk_keymap_layer_index_t start_idx, zmk_keymap_layer_index_t dest_idx); int zmk_keymap_set_layer_name(zmk_keymap_layer_id_t id, const char *name, size_t size); +uint8_t zmk_keymap_map_layer_id_to_index(zmk_keymap_layer_id_t layer_id); + +#define LAYER_ID_TO_INDEX(_layer) zmk_keymap_map_layer_id_to_index(_layer) + +#else + +#define LAYER_ID_TO_INDEX(_layer) _layer #endif @@ -74,9 +81,9 @@ int zmk_keymap_save_changes(void); int zmk_keymap_discard_changes(void); int zmk_keymap_reset_settings(void); -int zmk_keymap_raise_binding_event_at_layer_idx(zmk_keymap_layer_id_t layer_id, uint8_t source, - uint32_t position, enum trigger_type type, - int64_t timestamp); +int zmk_keymap_raise_binding_event_at_layer_index(zmk_keymap_layer_id_t layer_index, uint8_t source, + uint32_t position, enum trigger_type type, + int64_t timestamp); #define ZMK_KEYMAP_EXTRACT_BINDING(idx, drv_inst) \ { \ diff --git a/app/src/behaviors/behavior_transparent.c b/app/src/behaviors/behavior_transparent.c index d42e19efcf5..ee889f1c239 100644 --- a/app/src/behaviors/behavior_transparent.c +++ b/app/src/behaviors/behavior_transparent.c @@ -19,8 +19,13 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); static int on_keymap_binding_trigger(struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event) { - return zmk_keymap_raise_binding_event_at_layer_idx(event.layer - 1, event.source, - event.position, event.type, event.timestamp); + // Avoid uint8_t overflow resulting in an infinite loop + if (LAYER_ID_TO_INDEX(event.layer) == 0) { + return 0; + } + return zmk_keymap_raise_binding_event_at_layer_index(LAYER_ID_TO_INDEX(event.layer) - 1, + event.source, event.position, event.type, + event.timestamp); } static const struct behavior_driver_api behavior_transparent_driver_api = { diff --git a/app/src/keymap.c b/app/src/keymap.c index d5c44451b06..04ffaad4a98 100644 --- a/app/src/keymap.c +++ b/app/src/keymap.c @@ -116,7 +116,7 @@ static struct zmk_behavior_binding #if IS_ENABLED(CONFIG_ZMK_KEYMAP_LAYER_REORDERING) -uint8_t map_layer_id_to_index(zmk_keymap_layer_id_t layer_id) { +uint8_t zmk_keymap_map_layer_id_to_index(zmk_keymap_layer_id_t layer_id) { for (uint8_t i = 0; i < ZMK_KEYMAP_LAYERS_LEN; i++) { if (keymap_layer_orders[i] == layer_id) { return i; @@ -127,12 +127,10 @@ uint8_t map_layer_id_to_index(zmk_keymap_layer_id_t layer_id) { } #define LAYER_INDEX_TO_ID(_layer) keymap_layer_orders[_layer] -#define LAYER_ID_TO_INDEX(_layer) map_layer_id_to_index(_layer) #else #define LAYER_INDEX_TO_ID(_layer) _layer -#define LAYER_ID_TO_INDEX(_layer) _layer #endif // IS_ENABLED(CONFIG_ZMK_KEYMAP_LAYER_REORDERING) @@ -686,12 +684,11 @@ int zmk_keymap_reset_settings(void) { return -ENOTSUP; } #endif // IS_ENABLED(CONFIG_ZMK_KEYMAP_SETTINGS_STORAGE) -int zmk_keymap_raise_binding_event_at_layer_idx(zmk_keymap_layer_id_t layer_id, uint8_t source, - uint32_t position, enum trigger_type type, - int64_t timestamp) { +int zmk_keymap_raise_binding_event_at_layer_index(zmk_keymap_layer_id_t layer_index, uint8_t source, + uint32_t position, enum trigger_type type, + int64_t timestamp) { // We use int here to be sure we don't loop layer_idx back to UINT8_MAX - for (int layer_idx = layer_id; layer_idx >= LAYER_ID_TO_INDEX(_zmk_keymap_layer_default); - layer_idx--) { + for (int layer_idx = layer_index; layer_idx >= 0; layer_idx--) { zmk_keymap_layer_id_t candidate_layer = LAYER_INDEX_TO_ID(layer_idx); if (candidate_layer >= ZMK_KEYMAP_LAYERS_LEN) { @@ -704,10 +701,10 @@ int zmk_keymap_raise_binding_event_at_layer_idx(zmk_keymap_layer_id_t layer_id, if (position >= ZMK_KEYMAP_LEN) { #if ZMK_KEYMAP_HAS_SENSORS int sensor_index = ZMK_SENSOR_POSITION_FROM_VIRTUAL_KEY_POSITION(position); - binding = &zmk_sensor_keymap[layer_idx][sensor_index]; + binding = &zmk_sensor_keymap[candidate_layer][sensor_index]; if (!zmk_behavior_get_binding(binding->behavior_dev)) { LOG_DBG("No behavior assigned to sensor index %d on layer %d", sensor_index, - layer_idx); + candidate_layer); continue; } LOG_DBG("layer_id: %d sensor_index: %d, binding name: %s", candidate_layer, @@ -743,8 +740,8 @@ static int zmk_keymap_position_state_changed(uint8_t source, uint32_t position, } enum trigger_type type = pressed ? PRESS : RELEASE; - int ret = zmk_keymap_raise_binding_event_at_layer_idx(ZMK_KEYMAP_LAYERS_LEN - 1, source, - position, type, timestamp); + int ret = zmk_keymap_raise_binding_event_at_layer_index(ZMK_KEYMAP_LAYERS_LEN - 1, source, + position, type, timestamp); if (ret < 0) { LOG_DBG("Behavior returned error: %d", ret); } diff --git a/app/src/sensors.c b/app/src/sensors.c index 98855d38549..0cc89be6454 100644 --- a/app/src/sensors.c +++ b/app/src/sensors.c @@ -173,9 +173,9 @@ int sensor_listener(const zmk_event_t *eh) { int position = ZMK_VIRTUAL_KEY_POSITION_SENSOR(sensor_index); // Source is set to local for the time being, to be improved in the future - int ret = zmk_keymap_raise_binding_event_at_layer_idx(ZMK_KEYMAP_LAYERS_LEN - 1, - ZMK_POSITION_STATE_CHANGE_SOURCE_LOCAL, - position, SENSOR, sensor_ev->timestamp); + int ret = zmk_keymap_raise_binding_event_at_layer_index(ZMK_KEYMAP_LAYERS_LEN - 1, + ZMK_POSITION_STATE_CHANGE_SOURCE_LOCAL, + position, SENSOR, sensor_ev->timestamp); if (ret < 0) { LOG_DBG("Behavior returned error: %d", ret); } diff --git a/app/tests/macros/press-mid-macro/events.patterns b/app/tests/macros/press-mid-macro/events.patterns index dcc61e55026..7a4e838abb5 100644 --- a/app/tests/macros/press-mid-macro/events.patterns +++ b/app/tests/macros/press-mid-macro/events.patterns @@ -1,2 +1,2 @@ s/.*hid_listener_keycode/kp/p -s/.*raise_binding_event_at_layer_idx/binding_ev/p \ No newline at end of file +s/.*raise_binding_event_at_layer_index/binding_ev/p \ No newline at end of file