fix(core): Address review comments from Joel.

* Fix up some lingering events API tweaks for heap-less event manager.
This commit is contained in:
Peter Johanson 2024-01-13 21:17:35 +00:00 committed by Pete Johanson
parent 33209dee1d
commit 644feeb40d
6 changed files with 26 additions and 19 deletions

View file

@ -52,8 +52,8 @@ struct zmk_event_subscription {
return *outer; \ return *outer; \
}; \ }; \
int raise_##event_type(struct event_type data) { \ int raise_##event_type(struct event_type data) { \
struct event_type##_event ev = {.data = data}; \ struct event_type##_event ev = {.data = data, \
ev.header.event = &zmk_event_##event_type; \ .header = {.event = &zmk_event_##event_type}}; \
return ZMK_EVENT_RAISE(ev); \ return ZMK_EVENT_RAISE(ev); \
}; \ }; \
struct event_type *as_##event_type(const zmk_event_t *eh) { \ struct event_type *as_##event_type(const zmk_event_t *eh) { \
@ -71,15 +71,19 @@ struct zmk_event_subscription {
.listener = &zmk_listener_##mod, \ .listener = &zmk_listener_##mod, \
}; };
#define ZMK_EVENT_RAISE(ev) zmk_event_manager_raise((zmk_event_t *)&ev); #define ZMK_ASSERT_EVENT_LIKE(ev) \
(__ASSERT((uint8_t *)&(ev).header - (uint8_t *)&ev == 0, \
"header must be first element of event"))
#define ZMK_EVENT_RAISE(ev) (ZMK_ASSERT_EVENT_LIKE(ev), zmk_event_manager_raise(&(ev).header))
#define ZMK_EVENT_RAISE_AFTER(ev, mod) \ #define ZMK_EVENT_RAISE_AFTER(ev, mod) \
zmk_event_manager_raise_after((zmk_event_t *)&ev, &zmk_listener_##mod); (ZMK_ASSERT_EVENT_LIKE(ev), zmk_event_manager_raise_after(&(ev).header, &zmk_listener_##mod))
#define ZMK_EVENT_RAISE_AT(ev, mod) \ #define ZMK_EVENT_RAISE_AT(ev, mod) \
zmk_event_manager_raise_at((zmk_event_t *)&ev, &zmk_listener_##mod); (ZMK_ASSERT_EVENT_LIKE(ev), zmk_event_manager_raise_at(&(ev).header, &zmk_listener_##mod))
#define ZMK_EVENT_RELEASE(ev) zmk_event_manager_release((zmk_event_t *)&ev); #define ZMK_EVENT_RELEASE(ev) (ZMK_ASSERT_EVENT_LIKE(ev), zmk_event_manager_release(&(ev).header))
int zmk_event_manager_raise(zmk_event_t *event); int zmk_event_manager_raise(zmk_event_t *event);
int zmk_event_manager_raise_after(zmk_event_t *event, const struct zmk_listener *listener); int zmk_event_manager_raise_after(zmk_event_t *event, const struct zmk_listener *listener);

View file

@ -45,3 +45,9 @@ zmk_keycode_state_changed_from_encoded(uint32_t encoded, bool pressed, int64_t t
.state = pressed, .state = pressed,
.timestamp = timestamp}; .timestamp = timestamp};
} }
static inline int raise_zmk_keycode_state_changed_from_encoded(uint32_t encoded, bool pressed,
int64_t timestamp) {
return raise_zmk_keycode_state_changed(
zmk_keycode_state_changed_from_encoded(encoded, pressed, timestamp));
}

View file

@ -21,15 +21,13 @@ static int behavior_key_press_init(const struct device *dev) { return 0; };
static int on_keymap_binding_pressed(struct zmk_behavior_binding *binding, static int on_keymap_binding_pressed(struct zmk_behavior_binding *binding,
struct zmk_behavior_binding_event event) { struct zmk_behavior_binding_event event) {
LOG_DBG("position %d keycode 0x%02X", event.position, binding->param1); LOG_DBG("position %d keycode 0x%02X", event.position, binding->param1);
return raise_zmk_keycode_state_changed( return raise_zmk_keycode_state_changed_from_encoded(binding->param1, true, event.timestamp);
zmk_keycode_state_changed_from_encoded(binding->param1, true, event.timestamp));
} }
static int on_keymap_binding_released(struct zmk_behavior_binding *binding, static int on_keymap_binding_released(struct zmk_behavior_binding *binding,
struct zmk_behavior_binding_event event) { struct zmk_behavior_binding_event event) {
LOG_DBG("position %d keycode 0x%02X", event.position, binding->param1); LOG_DBG("position %d keycode 0x%02X", event.position, binding->param1);
return raise_zmk_keycode_state_changed( return raise_zmk_keycode_state_changed_from_encoded(binding->param1, false, event.timestamp);
zmk_keycode_state_changed_from_encoded(binding->param1, false, event.timestamp));
} }
static const struct behavior_driver_api behavior_key_press_driver_api = { static const struct behavior_driver_api behavior_key_press_driver_api = {

View file

@ -23,8 +23,7 @@ static int on_keymap_binding_pressed(struct zmk_behavior_binding *binding,
struct zmk_behavior_binding_event event) { struct zmk_behavior_binding_event event) {
LOG_DBG("position %d keycode 0x%02X", event.position, binding->param1); LOG_DBG("position %d keycode 0x%02X", event.position, binding->param1);
bool pressed = zmk_hid_is_pressed(binding->param1); bool pressed = zmk_hid_is_pressed(binding->param1);
return raise_zmk_keycode_state_changed( return raise_zmk_keycode_state_changed_from_encoded(binding->param1, !pressed, event.timestamp);
zmk_keycode_state_changed_from_encoded(binding->param1, !pressed, event.timestamp));
} }
static int on_keymap_binding_released(struct zmk_behavior_binding *binding, static int on_keymap_binding_released(struct zmk_behavior_binding *binding,

View file

@ -236,8 +236,8 @@ static int sticky_key_keycode_state_changed_listener(const zmk_event_t *eh) {
if (sticky_key->config->quick_release) { if (sticky_key->config->quick_release) {
// immediately release the sticky key after the key press is handled. // immediately release the sticky key after the key press is handled.
if (!event_reraised) { if (!event_reraised) {
struct zmk_keycode_state_changed_event dupe_ev; struct zmk_keycode_state_changed_event dupe_ev =
memcpy(&dupe_ev, eh, sizeof(struct zmk_keycode_state_changed_event)); copy_raised_zmk_keycode_state_changed(ev);
ZMK_EVENT_RAISE_AFTER(dupe_ev, behavior_sticky_key); ZMK_EVENT_RAISE_AFTER(dupe_ev, behavior_sticky_key);
event_reraised = true; event_reraised = true;
} }

View file

@ -274,14 +274,14 @@ static int release_pressed_keys() {
uint32_t count = pressed_keys_count; uint32_t count = pressed_keys_count;
pressed_keys_count = 0; pressed_keys_count = 0;
for (int i = 0; i < count; i++) { for (int i = 0; i < count; i++) {
struct zmk_position_state_changed_event ev = pressed_keys[i]; struct zmk_position_state_changed_event *ev = &pressed_keys[i];
if (i == 0) { if (i == 0) {
LOG_DBG("combo: releasing position event %d", ev.data.position); LOG_DBG("combo: releasing position event %d", ev->data.position);
ZMK_EVENT_RELEASE(ev) ZMK_EVENT_RELEASE(*ev);
} else { } else {
// reprocess events (see tests/combo/fully-overlapping-combos-3 for why this is needed) // reprocess events (see tests/combo/fully-overlapping-combos-3 for why this is needed)
LOG_DBG("combo: reraising position event %d", ev.data.position); LOG_DBG("combo: reraising position event %d", ev->data.position);
ZMK_EVENT_RAISE(ev); ZMK_EVENT_RAISE(*ev);
} }
} }