Skip to content

Commit

Permalink
fixup! feat: Refactor behaviors, sensor to raise behavior_binding_event
Browse files Browse the repository at this point in the history
  • Loading branch information
Nick-Munnich committed Mar 6, 2025
1 parent bce91a1 commit 086cc93
Show file tree
Hide file tree
Showing 5 changed files with 30 additions and 21 deletions.
13 changes: 10 additions & 3 deletions app/include/zmk/keymap.h
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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) \
{ \
Expand Down
9 changes: 7 additions & 2 deletions app/src/behaviors/behavior_transparent.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 = {
Expand Down
21 changes: 9 additions & 12 deletions app/src/keymap.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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)

Expand Down Expand Up @@ -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) {
Expand All @@ -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,
Expand Down Expand Up @@ -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);
}
Expand Down
6 changes: 3 additions & 3 deletions app/src/sensors.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down
2 changes: 1 addition & 1 deletion app/tests/macros/press-mid-macro/events.patterns
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
s/.*hid_listener_keycode/kp/p
s/.*raise_binding_event_at_layer_idx/binding_ev/p
s/.*raise_binding_event_at_layer_index/binding_ev/p

0 comments on commit 086cc93

Please sign in to comment.