forked from kofal.net/zmk
fix(behaviors): Fix sticky keys quick-release for normal keypresses
Quick release for sticky keys failed for non-layer keys. The sticky key was released just before the key that was supposed to be modified was handled. The issue was caused by an error in the sticky key logic, which released the sticky key before handling the key up event. Fixes #696.
This commit is contained in:
committed by
Pete Johanson
parent
a006970825
commit
de4979bf58
@@ -177,6 +177,11 @@ static const struct behavior_driver_api behavior_sticky_key_driver_api = {
|
||||
.binding_released = on_sticky_key_binding_released,
|
||||
};
|
||||
|
||||
static int sticky_key_keycode_state_changed_listener(const zmk_event_t *eh);
|
||||
|
||||
ZMK_LISTENER(behavior_sticky_key, sticky_key_keycode_state_changed_listener);
|
||||
ZMK_SUBSCRIPTION(behavior_sticky_key, zmk_keycode_state_changed);
|
||||
|
||||
static int sticky_key_keycode_state_changed_listener(const zmk_event_t *eh) {
|
||||
struct zmk_keycode_state_changed *ev = as_zmk_keycode_state_changed(eh);
|
||||
if (ev == NULL) {
|
||||
@@ -212,7 +217,10 @@ static int sticky_key_keycode_state_changed_listener(const zmk_event_t *eh) {
|
||||
if (sticky_key->timer_started) {
|
||||
stop_timer(sticky_key);
|
||||
if (sticky_key->config->quick_release) {
|
||||
// continue processing the event. Release the sticky key afterwards.
|
||||
ZMK_EVENT_RAISE_AFTER(eh, behavior_sticky_key);
|
||||
release_sticky_key_behavior(sticky_key, ev->timestamp);
|
||||
return ZMK_EV_EVENT_CAPTURED;
|
||||
}
|
||||
}
|
||||
sticky_key->modified_key_usage_page = ev->usage_page;
|
||||
@@ -229,9 +237,6 @@ static int sticky_key_keycode_state_changed_listener(const zmk_event_t *eh) {
|
||||
return ZMK_EV_EVENT_BUBBLE;
|
||||
}
|
||||
|
||||
ZMK_LISTENER(behavior_sticky_key, sticky_key_keycode_state_changed_listener);
|
||||
ZMK_SUBSCRIPTION(behavior_sticky_key, zmk_keycode_state_changed);
|
||||
|
||||
void behavior_sticky_key_timer_handler(struct k_work *item) {
|
||||
struct active_sticky_key *sticky_key =
|
||||
CONTAINER_OF(item, struct active_sticky_key, release_timer);
|
||||
|
||||
Reference in New Issue
Block a user