allow sticky keys to hold for more than one press
This commit is contained in:
parent
7b023affbd
commit
7d1be58e60
2 changed files with 16 additions and 1 deletions
|
@ -15,3 +15,6 @@ properties:
|
||||||
type: int
|
type: int
|
||||||
quick-release:
|
quick-release:
|
||||||
type: boolean
|
type: boolean
|
||||||
|
count:
|
||||||
|
type: int
|
||||||
|
default: 1
|
||||||
|
|
|
@ -31,6 +31,7 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);
|
||||||
struct behavior_sticky_key_config {
|
struct behavior_sticky_key_config {
|
||||||
uint32_t release_after_ms;
|
uint32_t release_after_ms;
|
||||||
bool quick_release;
|
bool quick_release;
|
||||||
|
uint32_t count;
|
||||||
struct zmk_behavior_binding behavior;
|
struct zmk_behavior_binding behavior;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -39,6 +40,7 @@ struct active_sticky_key {
|
||||||
uint32_t param1;
|
uint32_t param1;
|
||||||
uint32_t param2;
|
uint32_t param2;
|
||||||
const struct behavior_sticky_key_config *config;
|
const struct behavior_sticky_key_config *config;
|
||||||
|
int32_t remaining_presses;
|
||||||
// timer data.
|
// timer data.
|
||||||
bool timer_started;
|
bool timer_started;
|
||||||
bool timer_cancelled;
|
bool timer_cancelled;
|
||||||
|
@ -169,6 +171,9 @@ static int on_sticky_key_binding_released(struct zmk_behavior_binding *binding,
|
||||||
if (ms_left > 0) {
|
if (ms_left > 0) {
|
||||||
k_delayed_work_submit(&sticky_key->release_timer, K_MSEC(ms_left));
|
k_delayed_work_submit(&sticky_key->release_timer, K_MSEC(ms_left));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sticky_key->remaining_presses = sticky_key->config->count;
|
||||||
|
|
||||||
return ZMK_BEHAVIOR_OPAQUE;
|
return ZMK_BEHAVIOR_OPAQUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -210,6 +215,7 @@ static int sticky_key_keycode_state_changed_listener(const zmk_event_t *eh) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ev->state) { // key down
|
if (ev->state) { // key down
|
||||||
|
--sticky_key->remaining_presses;
|
||||||
if (sticky_key->modified_key_usage_page != 0 || sticky_key->modified_key_keycode != 0) {
|
if (sticky_key->modified_key_usage_page != 0 || sticky_key->modified_key_keycode != 0) {
|
||||||
// this sticky key is already in use for a keycode
|
// this sticky key is already in use for a keycode
|
||||||
continue;
|
continue;
|
||||||
|
@ -230,7 +236,12 @@ static int sticky_key_keycode_state_changed_listener(const zmk_event_t *eh) {
|
||||||
sticky_key->modified_key_usage_page == ev->usage_page &&
|
sticky_key->modified_key_usage_page == ev->usage_page &&
|
||||||
sticky_key->modified_key_keycode == ev->keycode) {
|
sticky_key->modified_key_keycode == ev->keycode) {
|
||||||
stop_timer(sticky_key);
|
stop_timer(sticky_key);
|
||||||
release_sticky_key_behavior(sticky_key, ev->timestamp);
|
if (sticky_key->remaining_presses <= 0) {
|
||||||
|
release_sticky_key_behavior(sticky_key, ev->timestamp);
|
||||||
|
} else {
|
||||||
|
sticky_key->modified_key_usage_page = 0;
|
||||||
|
sticky_key->modified_key_keycode = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -271,6 +282,7 @@ static struct behavior_sticky_key_data behavior_sticky_key_data;
|
||||||
.behavior = ZMK_KEYMAP_EXTRACT_BINDING(0, DT_DRV_INST(n)), \
|
.behavior = ZMK_KEYMAP_EXTRACT_BINDING(0, DT_DRV_INST(n)), \
|
||||||
.release_after_ms = DT_INST_PROP(n, release_after_ms), \
|
.release_after_ms = DT_INST_PROP(n, release_after_ms), \
|
||||||
.quick_release = DT_INST_PROP(n, quick_release), \
|
.quick_release = DT_INST_PROP(n, quick_release), \
|
||||||
|
.count = DT_INST_PROP(n, count), \
|
||||||
}; \
|
}; \
|
||||||
DEVICE_DT_INST_DEFINE(n, behavior_sticky_key_init, device_pm_control_nop, \
|
DEVICE_DT_INST_DEFINE(n, behavior_sticky_key_init, device_pm_control_nop, \
|
||||||
&behavior_sticky_key_data, &behavior_sticky_key_config_##n, APPLICATION, \
|
&behavior_sticky_key_data, &behavior_sticky_key_config_##n, APPLICATION, \
|
||||||
|
|
Loading…
Add table
Reference in a new issue