Skip to content

Commit d72dc27

Browse files
committed
Preserve locality of macro'd events.
Adapted from zmkfirmware#1630.
1 parent 3f7cc79 commit d72dc27

File tree

3 files changed

+24
-13
lines changed

3 files changed

+24
-13
lines changed

app/include/zmk/keymap.h

+3
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ int zmk_keymap_layer_activate(uint8_t layer);
2222
int zmk_keymap_layer_deactivate(uint8_t layer);
2323
int zmk_keymap_layer_toggle(uint8_t layer);
2424
int zmk_keymap_layer_to(uint8_t layer);
25+
int zmk_keymap_trigger_callbacks(struct zmk_behavior_binding *binding,
26+
struct zmk_behavior_binding_event event, uint8_t source,
27+
bool pressed);
2528
const char *zmk_keymap_layer_name(uint8_t layer);
2629

2730
int zmk_keymap_position_state_changed(uint8_t source, uint32_t position, bool pressed,

app/src/behavior_queue.c

+3-2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include <zephyr/kernel.h>
1010
#include <zephyr/logging/log.h>
1111
#include <drivers/behavior.h>
12+
#include <zmk/split/bluetooth/central.h>
1213

1314
LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);
1415

@@ -35,9 +36,9 @@ static void behavior_queue_process_next(struct k_work *work) {
3536
.timestamp = k_uptime_get()};
3637

3738
if (item.press) {
38-
behavior_keymap_binding_pressed(&item.binding, event);
39+
zmk_keymap_trigger_callbacks(&item.binding, event, 0, true);
3940
} else {
40-
behavior_keymap_binding_released(&item.binding, event);
41+
zmk_keymap_trigger_callbacks(&item.binding, event, 0, true);
4142
}
4243

4344
LOG_DBG("Processing next queued behavior in %dms", item.wait);

app/src/keymap.c

+18-11
Original file line numberDiff line numberDiff line change
@@ -171,23 +171,30 @@ int zmk_keymap_apply_position_state(uint8_t source, int layer, uint32_t position
171171
// We want to make a copy of this, since it may be converted from
172172
// relative to absolute before being invoked
173173
struct zmk_behavior_binding binding = zmk_keymap[layer][position];
174-
const struct device *behavior;
175174
struct zmk_behavior_binding_event event = {
176175
.layer = layer,
177176
.position = position,
178177
.timestamp = timestamp,
179178
};
180179

181-
LOG_DBG("layer: %d position: %d, binding name: %s", layer, position, binding.behavior_dev);
180+
return zmk_keymap_trigger_callbacks(&binding, event, source, pressed);
181+
}
182+
183+
int zmk_keymap_trigger_callbacks(struct zmk_behavior_binding *binding,
184+
struct zmk_behavior_binding_event event, uint8_t source,
185+
bool pressed) {
186+
187+
LOG_DBG("layer: %d position: %d, binding name: %s", event.layer, event.position,
188+
log_strdup(binding->behavior_dev));
182189

183-
behavior = zmk_behavior_get_binding(binding.behavior_dev);
190+
const struct device *behavior = zmk_behavior_get_binding(binding->behavior_dev);
184191

185192
if (!behavior) {
186-
LOG_WRN("No behavior assigned to %d on layer %d", position, layer);
193+
LOG_WRN("No behavior assigned to %d on layer %d", event.position, event.layer);
187194
return 1;
188195
}
189196

190-
int err = behavior_keymap_binding_convert_central_state_dependent_params(&binding, event);
197+
int err = behavior_keymap_binding_convert_central_state_dependent_params(binding, event);
191198
if (err) {
192199
LOG_ERR("Failed to convert relative to absolute behavior binding (err %d)", err);
193200
return err;
@@ -202,24 +209,24 @@ int zmk_keymap_apply_position_state(uint8_t source, int layer, uint32_t position
202209

203210
switch (locality) {
204211
case BEHAVIOR_LOCALITY_CENTRAL:
205-
return invoke_locally(&binding, event, pressed);
212+
return invoke_locally(binding, event, pressed);
206213
case BEHAVIOR_LOCALITY_EVENT_SOURCE:
207214
#if ZMK_BLE_IS_CENTRAL
208215
if (source == ZMK_POSITION_STATE_CHANGE_SOURCE_LOCAL) {
209-
return invoke_locally(&binding, event, pressed);
216+
return invoke_locally(binding, event, pressed);
210217
} else {
211-
return zmk_split_bt_invoke_behavior(source, &binding, event, pressed);
218+
return zmk_split_bt_invoke_behavior(source, binding, event, pressed);
212219
}
213220
#else
214-
return invoke_locally(&binding, event, pressed);
221+
return invoke_locally(binding, event, pressed);
215222
#endif
216223
case BEHAVIOR_LOCALITY_GLOBAL:
217224
#if ZMK_BLE_IS_CENTRAL
218225
for (int i = 0; i < ZMK_SPLIT_BLE_PERIPHERAL_COUNT; i++) {
219-
zmk_split_bt_invoke_behavior(i, &binding, event, pressed);
226+
zmk_split_bt_invoke_behavior(i, binding, event, pressed);
220227
}
221228
#endif
222-
return invoke_locally(&binding, event, pressed);
229+
return invoke_locally(binding, event, pressed);
223230
}
224231

225232
return -ENOTSUP;

0 commit comments

Comments
 (0)