diff options
author | Pete Johanson <peter@peterjohanson.com> | 2020-06-30 16:42:52 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-06-30 16:42:52 -0400 |
commit | 4c5ed99381c47633c009177639896eebfb7e2002 (patch) | |
tree | b0c6ddd628fd4357e04905182ba6f0e620f5390e /app/src | |
parent | b23a73e4888856fe476ab5fee655f8ccf6626e4c (diff) | |
parent | 7bf8621d5bea45c57dbbf0fac927d3332177b81b (diff) |
Merge pull request #42 from petejohanson/core/event-manager-refactor
Refactor to generic event manager, ditch "global behaviors" as a concept.
Diffstat (limited to 'app/src')
-rw-r--r-- | app/src/behaviors/behavior_hid.c | 108 | ||||
-rw-r--r-- | app/src/behaviors/behavior_key_press.c | 19 | ||||
-rw-r--r-- | app/src/behaviors/behavior_keymap.c | 50 | ||||
-rw-r--r-- | app/src/behaviors/behavior_mod_tap.c | 55 | ||||
-rw-r--r-- | app/src/behaviors/behavior_momentary_layer.c | 1 | ||||
-rw-r--r-- | app/src/event_manager.c | 37 | ||||
-rw-r--r-- | app/src/events.c | 83 | ||||
-rw-r--r-- | app/src/events/keycode_state_changed.c | 10 | ||||
-rw-r--r-- | app/src/events/modifiers_state_changed.c | 10 | ||||
-rw-r--r-- | app/src/events/position_state_changed.c | 10 | ||||
-rw-r--r-- | app/src/hid_listener.c | 106 | ||||
-rw-r--r-- | app/src/keymap.c | 16 | ||||
-rw-r--r-- | app/src/kscan.c | 13 |
13 files changed, 237 insertions, 281 deletions
diff --git a/app/src/behaviors/behavior_hid.c b/app/src/behaviors/behavior_hid.c deleted file mode 100644 index 1ac7404..0000000 --- a/app/src/behaviors/behavior_hid.c +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright (c) 2020 Peter Johanson <peter@peterjohanson.com> - * - * SPDX-License-Identifier: MIT - */ - -#define DT_DRV_COMPAT zmk_behavior_hid - -#include <device.h> -#include <power/reboot.h> -#include <drivers/behavior.h> -#include <logging/log.h> - -LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); - -#include <zmk/hid.h> -#include <zmk/endpoints.h> - -struct behavior_hid_config { }; -struct behavior_hid_data { }; - -static int behavior_hid_init(struct device *dev) -{ - return 0; -}; - -static int on_keycode_pressed(struct device *dev, u8_t usage_page, u32_t keycode) -{ - int err; - LOG_DBG("keycode %d", keycode); - - switch (usage_page) { - case USAGE_KEYPAD: - err = zmk_hid_keypad_press(keycode); - if (err) { - LOG_ERR("Unable to press keycode"); - return err; - } - break; - case USAGE_CONSUMER: - err = zmk_hid_consumer_press(keycode); - if (err) { - LOG_ERR("Unable to press keycode"); - return err; - } - break; - } - - return zmk_endpoints_send_report(usage_page); -} - -static int on_keycode_released(struct device *dev, u8_t usage_page, u32_t keycode) -{ - int err; - LOG_DBG("keycode %d", keycode); - - switch (usage_page) { - case USAGE_KEYPAD: - err = zmk_hid_keypad_release(keycode); - if (err) { - LOG_ERR("Unable to press keycode"); - return err; - } - break; - case USAGE_CONSUMER: - err = zmk_hid_consumer_release(keycode); - if (err) { - LOG_ERR("Unable to press keycode"); - return err; - } - break; - } - return zmk_endpoints_send_report(usage_page); -} - -static int on_modifiers_pressed(struct device *dev, zmk_mod_flags modifiers) -{ - LOG_DBG("modifiers %d", modifiers); - - zmk_hid_register_mods(modifiers); - return zmk_endpoints_send_report(USAGE_KEYPAD); -} - -static int on_modifiers_released(struct device *dev, zmk_mod_flags modifiers) -{ - LOG_DBG("modifiers %d", modifiers); - - zmk_hid_unregister_mods(modifiers); - return zmk_endpoints_send_report(USAGE_KEYPAD); -} - -static const struct behavior_driver_api behavior_hid_driver_api = { - .keycode_pressed = on_keycode_pressed, - .keycode_released = on_keycode_released, - .modifiers_pressed = on_modifiers_pressed, - .modifiers_released = on_modifiers_released -}; - - -static const struct behavior_hid_config behavior_hid_config = {}; - -static struct behavior_hid_data behavior_hid_data; - -DEVICE_AND_API_INIT(behavior_hid, DT_INST_LABEL(0), behavior_hid_init, - &behavior_hid_data, - &behavior_hid_config, - APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, - &behavior_hid_driver_api);
\ No newline at end of file diff --git a/app/src/behaviors/behavior_key_press.c b/app/src/behaviors/behavior_key_press.c index 7213b3c..34df1c0 100644 --- a/app/src/behaviors/behavior_key_press.c +++ b/app/src/behaviors/behavior_key_press.c @@ -10,7 +10,8 @@ #include <drivers/behavior.h> #include <logging/log.h> -#include <zmk/events.h> +#include <zmk/event-manager.h> +#include <zmk/events/keycode-state-changed.h> LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); @@ -27,15 +28,27 @@ static int behavior_key_press_init(struct device *dev) static int on_keymap_binding_pressed(struct device *dev, u32_t position, u32_t keycode, u32_t _) { const struct behavior_key_press_config *cfg = dev->config_info; + struct keycode_state_changed *ev; LOG_DBG("position %d usage_page 0x%02X keycode 0x%02X", position, cfg->usage_page, keycode); - return zmk_events_keycode_pressed(cfg->usage_page, keycode); + + ev = new_keycode_state_changed(); + ev->usage_page = cfg->usage_page; + ev->keycode = keycode; + ev->state = true; + return ZMK_EVENT_RAISE(ev); } static int on_keymap_binding_released(struct device *dev, u32_t position, u32_t keycode, u32_t _) { const struct behavior_key_press_config *cfg = dev->config_info; + struct keycode_state_changed *ev; LOG_DBG("position %d usage_page 0x%02X keycode 0x%02X", position, cfg->usage_page, keycode); - return zmk_events_keycode_released(cfg->usage_page, keycode); + + ev = new_keycode_state_changed(); + ev->usage_page = cfg->usage_page; + ev->keycode = keycode; + ev->state = false; + return ZMK_EVENT_RAISE(ev); } static const struct behavior_driver_api behavior_key_press_driver_api = { diff --git a/app/src/behaviors/behavior_keymap.c b/app/src/behaviors/behavior_keymap.c deleted file mode 100644 index 7a06b2f..0000000 --- a/app/src/behaviors/behavior_keymap.c +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 2020 Peter Johanson <peter@peterjohanson.com> - * - * SPDX-License-Identifier: MIT - */ - -#define DT_DRV_COMPAT zmk_behavior_keymap - -#include <device.h> -#include <power/reboot.h> -#include <drivers/behavior.h> -#include <logging/log.h> - -LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); - -#include <zmk/keymap.h> - -struct behavior_keymap_config { }; -struct behavior_keymap_data { }; - -static int behavior_keymap_init(struct device *dev) -{ - return 0; -}; - -static int on_position_pressed(struct device *dev, u32_t position) -{ - return zmk_keymap_position_state_changed(position, true); -} - -static int on_position_released(struct device *dev, u32_t position) -{ - return zmk_keymap_position_state_changed(position, false); -} - -static const struct behavior_driver_api behavior_keymap_driver_api = { - .position_pressed = on_position_pressed, - .position_released = on_position_released, -}; - - -static const struct behavior_keymap_config behavior_keymap_config = {}; - -static struct behavior_keymap_data behavior_keymap_data; - -DEVICE_AND_API_INIT(behavior_keymap, DT_INST_LABEL(0), behavior_keymap_init, - &behavior_keymap_data, - &behavior_keymap_config, - APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, - &behavior_keymap_driver_api); diff --git a/app/src/behaviors/behavior_mod_tap.c b/app/src/behaviors/behavior_mod_tap.c index 2e6e339..62604eb 100644 --- a/app/src/behaviors/behavior_mod_tap.c +++ b/app/src/behaviors/behavior_mod_tap.c @@ -10,7 +10,9 @@ #include <drivers/behavior.h> #include <logging/log.h> -#include <zmk/events.h> +#include <zmk/event-manager.h> +#include <zmk/events/keycode-state-changed.h> +#include <zmk/events/modifiers-state-changed.h> LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); @@ -19,6 +21,22 @@ struct behavior_mod_tap_data { u16_t pending_press_positions; }; +int behavior_mod_tap_listener(const struct zmk_event_header *eh) +{ + if (is_keycode_state_changed(eh)) { + struct device *dev = device_get_binding(DT_INST_LABEL(0)); + const struct keycode_state_changed *ev = cast_keycode_state_changed(eh); + if (ev->state) { + struct behavior_mod_tap_data *data = dev->driver_data; + data->pending_press_positions = 0; + } + } + return 0; +} + +ZMK_LISTENER(behavior_mod_tap, behavior_mod_tap_listener); +ZMK_SUBSCRIPTION(behavior_mod_tap, keycode_state_changed); + static int behavior_mod_tap_init(struct device *dev) { return 0; @@ -30,58 +48,35 @@ static int on_keymap_binding_pressed(struct device *dev, u32_t position, u32_t m struct behavior_mod_tap_data *data = dev->driver_data; LOG_DBG("mods: %d, keycode: %d", mods, keycode); WRITE_BIT(data->pending_press_positions, position, true); - return zmk_events_modifiers_pressed(mods); + return ZMK_EVENT_RAISE(create_modifiers_state_changed(mods, true)); } - -// They keycode is passed by the "keymap" based on the parameter created as part of the assignment. static int on_keymap_binding_released(struct device *dev, u32_t position, u32_t mods, u32_t keycode) { struct behavior_mod_tap_data *data = dev->driver_data; LOG_DBG("mods: %d, keycode: %d", mods, keycode); -zmk_events_modifiers_released(mods); + ZMK_EVENT_RAISE(create_modifiers_state_changed(mods, false)); + k_msleep(10); // TODO: Better approach than k_msleep to avoid USB send failures? Retries in the USB endpoint layer? if (data->pending_press_positions & BIT(position)) { - zmk_events_keycode_pressed(USAGE_KEYPAD, keycode); + ZMK_EVENT_RAISE(create_keycode_state_changed(USAGE_KEYPAD, keycode, true)); k_msleep(10); - zmk_events_keycode_released(USAGE_KEYPAD, keycode); + ZMK_EVENT_RAISE(create_keycode_state_changed(USAGE_KEYPAD, keycode, false)); } return 0; } -static int on_keycode_pressed(struct device *dev, u8_t usage_page, u32_t keycode) -{ - struct behavior_mod_tap_data *data = dev->driver_data; - data->pending_press_positions = 0; - LOG_DBG("pressing: %d", keycode); - return 0; -} - -static int on_keycode_released(struct device *dev, u8_t usage_page, u32_t keycode) -{ - LOG_DBG("releasing: %d", keycode); - return 0; -} - static const struct behavior_driver_api behavior_mod_tap_driver_api = { - // These callbacks are all optional, and define which kinds of events the behavior can handle. - // They can reference local functions defined here, or shared event handlers. .binding_pressed = on_keymap_binding_pressed, .binding_released = on_keymap_binding_released, - .keycode_pressed = on_keycode_pressed, - .keycode_released = on_keycode_released - // Other optional callbacks a behavior can implement - // .on_mouse_moved - // .on_sensor_data - Any behaviour that wants to be linked to a censor can implement this behavior }; - static const struct behavior_mod_tap_config behavior_mod_tap_config = {}; static struct behavior_mod_tap_data behavior_mod_tap_data; -DEVICE_AND_API_INIT(behavior_key_press, DT_INST_LABEL(0), behavior_mod_tap_init, +DEVICE_AND_API_INIT(behavior_mod_tap, DT_INST_LABEL(0), behavior_mod_tap_init, &behavior_mod_tap_data, &behavior_mod_tap_config, APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, diff --git a/app/src/behaviors/behavior_momentary_layer.c b/app/src/behaviors/behavior_momentary_layer.c index 904051e..8a8584a 100644 --- a/app/src/behaviors/behavior_momentary_layer.c +++ b/app/src/behaviors/behavior_momentary_layer.c @@ -10,7 +10,6 @@ #include <drivers/behavior.h> #include <logging/log.h> -#include <zmk/events.h> #include <zmk/keymap.h> LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); diff --git a/app/src/event_manager.c b/app/src/event_manager.c new file mode 100644 index 0000000..567cdf0 --- /dev/null +++ b/app/src/event_manager.c @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Peter Johanson <peter@peterjohanson.com> + * + * SPDX-License-Identifier: MIT + */ + +#include <zephyr.h> +#include <logging/log.h> + +LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); + +#include <zmk/event-manager.h> + +extern struct zmk_event_type* __event_type_start[]; +extern struct zmk_event_type* __event_type_end[]; + +extern struct zmk_event_subscription __event_subscriptions_start[]; +extern struct zmk_event_subscription __event_subscriptions_end[]; + +int zmk_event_manager_raise(struct zmk_event_header *event) +{ + int ret; + struct zmk_event_subscription *ev_sub; + for (ev_sub = __event_subscriptions_start; ev_sub != __event_subscriptions_end; ev_sub++) { + if (ev_sub->event_type == event->event) { + ret = ev_sub->listener->callback(event); + if (ret) { + LOG_DBG("Listener returned an error: %d", ret); + goto release; + } + } + } + +release: + k_free(event); + return ret; +}
\ No newline at end of file diff --git a/app/src/events.c b/app/src/events.c deleted file mode 100644 index fabb93e..0000000 --- a/app/src/events.c +++ /dev/null @@ -1,83 +0,0 @@ - -#include <zephyr.h> -#include <drivers/behavior.h> -#include <zmk/behavior.h> -#include <zmk/events.h> -#include <sys/util.h> - -#define DT_DRV_COMPAT zmk_behavior_global -#define GLOBAL_BEHAVIOR_LEN DT_NUM_INST_STATUS_OKAY(DT_DRV_COMPAT) - -#define LABEL_ENTRY(i) DT_INST_LABEL(i), -static const char *global_behaviors[] = { - DT_INST_FOREACH_STATUS_OKAY(LABEL_ENTRY) -}; - -int zmk_events_position_pressed(u32_t position) -{ - for (int i = 0; i < GLOBAL_BEHAVIOR_LEN; i++) { - const char* label = global_behaviors[i]; - struct device *dev = device_get_binding(label); - behavior_position_pressed(dev, position); - } - return 0; -}; - -int zmk_events_position_released(u32_t position) -{ - for (int i = 0; i < GLOBAL_BEHAVIOR_LEN; i++) { - const char* label = global_behaviors[i]; - struct device *dev = device_get_binding(label); - behavior_position_released(dev, position); - } - return 0; -}; - -int zmk_events_keycode_pressed(u8_t usage_page, u32_t keycode) -{ - for (int i = 0; i < GLOBAL_BEHAVIOR_LEN; i++) { - const char* label = global_behaviors[i]; - struct device *dev = device_get_binding(label); - behavior_keycode_pressed(dev, usage_page, keycode); - } - return 0; -}; - -int zmk_events_keycode_released(u8_t usage_page, u32_t keycode) -{ - for (int i = 0; i < GLOBAL_BEHAVIOR_LEN; i++) { - const char* label = global_behaviors[i]; - struct device *dev = device_get_binding(label); - behavior_keycode_released(dev, usage_page, keycode); - } - return 0; -}; - -int zmk_events_modifiers_pressed(zmk_mod_flags modifiers) -{ - for (int i = 0; i < GLOBAL_BEHAVIOR_LEN; i++) { - const char* label = global_behaviors[i]; - struct device *dev = device_get_binding(label); - behavior_modifiers_pressed(dev, modifiers); - } - return 0; -}; - -int zmk_events_modifiers_released(zmk_mod_flags modifiers) -{ - for (int i = 0; i < GLOBAL_BEHAVIOR_LEN; i++) { - const char* label = global_behaviors[i]; - struct device *dev = device_get_binding(label); - behavior_modifiers_released(dev, modifiers); - } - return 0; -}; - -int zmk_events_consumer_key_pressed(u32_t usage) -{ - return 0; -}; -int zmk_events_consumer_key_released(u32_t usage) -{ - return 0; -}; diff --git a/app/src/events/keycode_state_changed.c b/app/src/events/keycode_state_changed.c new file mode 100644 index 0000000..964b24a --- /dev/null +++ b/app/src/events/keycode_state_changed.c @@ -0,0 +1,10 @@ +/* + * Copyright (c) 2020 Peter Johanson <peter@peterjohanson.com> + * + * SPDX-License-Identifier: MIT + */ + +#include <kernel.h> +#include <zmk/events/keycode-state-changed.h> + +ZMK_EVENT_IMPL(keycode_state_changed);
\ No newline at end of file diff --git a/app/src/events/modifiers_state_changed.c b/app/src/events/modifiers_state_changed.c new file mode 100644 index 0000000..71ec015 --- /dev/null +++ b/app/src/events/modifiers_state_changed.c @@ -0,0 +1,10 @@ +/* + * Copyright (c) 2020 Peter Johanson <peter@peterjohanson.com> + * + * SPDX-License-Identifier: MIT + */ + +#include <kernel.h> +#include <zmk/events/modifiers-state-changed.h> + +ZMK_EVENT_IMPL(modifiers_state_changed);
\ No newline at end of file diff --git a/app/src/events/position_state_changed.c b/app/src/events/position_state_changed.c new file mode 100644 index 0000000..69cba03 --- /dev/null +++ b/app/src/events/position_state_changed.c @@ -0,0 +1,10 @@ +/* + * Copyright (c) 2020 Peter Johanson <peter@peterjohanson.com> + * + * SPDX-License-Identifier: MIT + */ + +#include <kernel.h> +#include <zmk/events/position-state-changed.h> + +ZMK_EVENT_IMPL(position_state_changed);
\ No newline at end of file diff --git a/app/src/hid_listener.c b/app/src/hid_listener.c new file mode 100644 index 0000000..69aa23e --- /dev/null +++ b/app/src/hid_listener.c @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2020 Peter Johanson <peter@peterjohanson.com> + * + * SPDX-License-Identifier: MIT + */ + +#include <drivers/behavior.h> +#include <logging/log.h> + +LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); + +#include <zmk/event-manager.h> +#include <zmk/events/keycode-state-changed.h> +#include <zmk/events/modifiers-state-changed.h> +#include <zmk/hid.h> +#include <zmk/endpoints.h> + + +static int hid_listener_keycode_pressed(u8_t usage_page, u32_t keycode) +{ + int err; + LOG_DBG("usage_page 0x%02X keycode 0x%02X", usage_page, keycode); + + switch (usage_page) { + case USAGE_KEYPAD: + err = zmk_hid_keypad_press(keycode); + if (err) { + LOG_ERR("Unable to press keycode"); + return err; + } + break; + case USAGE_CONSUMER: + err = zmk_hid_consumer_press(keycode); + if (err) { + LOG_ERR("Unable to press keycode"); + return err; + } + break; + } + + return zmk_endpoints_send_report(usage_page); +} + +static int hid_listener_keycode_released(u8_t usage_page, u32_t keycode) +{ + int err; + LOG_DBG("usage_page 0x%02X keycode 0x%02X", usage_page, keycode); + + switch (usage_page) { + case USAGE_KEYPAD: + err = zmk_hid_keypad_release(keycode); + if (err) { + LOG_ERR("Unable to release keycode"); + return err; + } + break; + case USAGE_CONSUMER: + err = zmk_hid_consumer_release(keycode); + if (err) { + LOG_ERR("Unable to release keycode"); + return err; + } + break; + } + return zmk_endpoints_send_report(usage_page); +} + +static int hid_listener_modifiers_pressed(zmk_mod_flags modifiers) +{ + LOG_DBG("modifiers %d", modifiers); + + zmk_hid_register_mods(modifiers); + return zmk_endpoints_send_report(USAGE_KEYPAD); +} + +static int hid_listener_modifiers_released(zmk_mod_flags modifiers) +{ + LOG_DBG("modifiers %d", modifiers); + + zmk_hid_unregister_mods(modifiers); + return zmk_endpoints_send_report(USAGE_KEYPAD); +} + +int hid_listener(const struct zmk_event_header *eh) +{ + if (is_keycode_state_changed(eh)) { + const struct keycode_state_changed *ev = cast_keycode_state_changed(eh); + if (ev->state) { + hid_listener_keycode_pressed(ev->usage_page, ev->keycode); + } else { + hid_listener_keycode_released(ev->usage_page, ev->keycode); + } + } else if (is_modifiers_state_changed(eh)) { + const struct modifiers_state_changed *ev = cast_modifiers_state_changed(eh); + if (ev->state) { + hid_listener_modifiers_pressed(ev->modifiers); + } else { + hid_listener_modifiers_released(ev->modifiers); + } + } + return 0; +} + +ZMK_LISTENER(hid_listener, hid_listener); +ZMK_SUBSCRIPTION(hid_listener, keycode_state_changed); +ZMK_SUBSCRIPTION(hid_listener, modifiers_state_changed);
\ No newline at end of file diff --git a/app/src/keymap.c b/app/src/keymap.c index f951dd7..dcfd0f1 100644 --- a/app/src/keymap.c +++ b/app/src/keymap.c @@ -9,6 +9,9 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include <drivers/behavior.h> #include <zmk/behavior.h> +#include <zmk/event-manager.h> +#include <zmk/events/position-state-changed.h> + static u32_t zmk_keymap_layer_state = 0; static u8_t zmk_keymap_layer_default = 0; @@ -116,3 +119,16 @@ int zmk_keymap_position_state_changed(u32_t position, bool pressed) return -ENOTSUP; } + +int keymap_listener(const struct zmk_event_header *eh) +{ + if (is_position_state_changed(eh)) { + const struct position_state_changed *ev = cast_position_state_changed(eh); + zmk_keymap_position_state_changed(ev->position, ev->state); + } + return 0; +} + +ZMK_LISTENER(keymap, keymap_listener); +ZMK_SUBSCRIPTION(keymap, position_state_changed); + diff --git a/app/src/kscan.c b/app/src/kscan.c index 29a6019..63713f1 100644 --- a/app/src/kscan.c +++ b/app/src/kscan.c @@ -12,7 +12,8 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include <zmk/matrix_transform.h> -#include <zmk/events.h> +#include <zmk/event-manager.h> +#include <zmk/events/position-state-changed.h> #define ZMK_KSCAN_EVENT_STATE_PRESSED 0 #define ZMK_KSCAN_EVENT_STATE_RELEASED 1 @@ -50,12 +51,12 @@ void zmk_kscan_process_msgq(struct k_work *item) { bool pressed = (ev.state == ZMK_KSCAN_EVENT_STATE_PRESSED); u32_t position = zmk_matrix_transform_row_column_to_position(ev.row, ev.column); + struct position_state_changed *pos_ev; LOG_DBG("Row: %d, col: %d, position: %d, pressed: %s\n", ev.row, ev.column, position, (pressed ? "true" : "false")); - if (pressed) { - zmk_events_position_pressed(position); - } else { - zmk_events_position_released(position); - } + pos_ev = new_position_state_changed(); + pos_ev->state = pressed; + pos_ev->position = position; + ZMK_EVENT_RAISE(pos_ev); } } |