Skip to content

Commit

Permalink
fix(behaviors): Make multiple sticky keys work on same key position
Browse files Browse the repository at this point in the history
  • Loading branch information
caksoylar committed Jan 10, 2025
1 parent c12bcf6 commit 8471399
Showing 1 changed file with 14 additions and 4 deletions.
18 changes: 14 additions & 4 deletions app/src/behaviors/behavior_sticky_key.c
Original file line number Diff line number Diff line change
Expand Up @@ -85,12 +85,18 @@ static struct active_sticky_key *store_sticky_key(struct zmk_behavior_binding_ev
}

static void clear_sticky_key(struct active_sticky_key *sticky_key) {
LOG_DBG("clearing sticky key at position %d, param %d", sticky_key->position,
sticky_key->param1);
sticky_key->position = ZMK_BHV_STICKY_KEY_POSITION_FREE;
}

static struct active_sticky_key *find_sticky_key(uint32_t position) {
static struct active_sticky_key *
find_sticky_key(uint32_t position, struct zmk_behavior_binding behavior, uint32_t binding_param) {
for (int i = 0; i < ZMK_BHV_STICKY_KEY_MAX_HELD; i++) {
if (active_sticky_keys[i].position == position && !active_sticky_keys[i].timer_cancelled) {
if (active_sticky_keys[i].position == position &&
active_sticky_keys[i].config->behavior.behavior_dev == behavior.behavior_dev &&
active_sticky_keys[i].param1 == binding_param &&
!active_sticky_keys[i].timer_cancelled) {
return &active_sticky_keys[i];
}
}
Expand Down Expand Up @@ -156,8 +162,9 @@ static int on_sticky_key_binding_pressed(struct zmk_behavior_binding *binding,
const struct device *dev = zmk_behavior_get_binding(binding->behavior_dev);
const struct behavior_sticky_key_config *cfg = dev->config;
struct active_sticky_key *sticky_key;
sticky_key = find_sticky_key(event.position);
sticky_key = find_sticky_key(event.position, cfg->behavior, binding->param1);
if (sticky_key != NULL) {
LOG_DBG("found same sticky key pressed at position %d, release it first", event.position);
stop_timer(sticky_key);
release_sticky_key_behavior(sticky_key, event.timestamp);
}
Expand All @@ -178,7 +185,10 @@ static int on_sticky_key_binding_pressed(struct zmk_behavior_binding *binding,

static int on_sticky_key_binding_released(struct zmk_behavior_binding *binding,
struct zmk_behavior_binding_event event) {
struct active_sticky_key *sticky_key = find_sticky_key(event.position);
const struct device *dev = zmk_behavior_get_binding(binding->behavior_dev);
const struct behavior_sticky_key_config *cfg = dev->config;
struct active_sticky_key *sticky_key =
find_sticky_key(event.position, cfg->behavior, binding->param1);
if (sticky_key == NULL) {
LOG_ERR("ACTIVE STICKY KEY CLEARED TOO EARLY");
return ZMK_BEHAVIOR_OPAQUE;
Expand Down

0 comments on commit 8471399

Please sign in to comment.