refactor(hold-tap): create press_binding and release_binding functions
This commit is contained in:
parent
abc60fc7cb
commit
0ebf440de8
1 changed files with 37 additions and 37 deletions
|
@ -296,6 +296,41 @@ static inline const char *status_str(enum status status) {
|
||||||
return "UNKNOWN STATUS";
|
return "UNKNOWN STATUS";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int press_binding(struct active_hold_tap *hold_tap) {
|
||||||
|
struct zmk_behavior_binding_event event = {
|
||||||
|
.position = hold_tap->position,
|
||||||
|
.timestamp = hold_tap->timestamp,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct zmk_behavior_binding binding = {0};
|
||||||
|
if (hold_tap->status == STATUS_HOLD_TIMER || hold_tap->status == STATUS_HOLD_INTERRUPT) {
|
||||||
|
binding.behavior_dev = hold_tap->config->hold_behavior_dev;
|
||||||
|
binding.param1 = hold_tap->param_hold;
|
||||||
|
} else {
|
||||||
|
binding.behavior_dev = hold_tap->config->tap_behavior_dev;
|
||||||
|
binding.param1 = hold_tap->param_tap;
|
||||||
|
store_last_tapped(hold_tap);
|
||||||
|
}
|
||||||
|
return behavior_keymap_binding_pressed(&binding, event);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int release_binding(struct active_hold_tap *hold_tap) {
|
||||||
|
struct zmk_behavior_binding_event event = {
|
||||||
|
.position = hold_tap->position,
|
||||||
|
.timestamp = hold_tap->timestamp,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct zmk_behavior_binding binding = {0};
|
||||||
|
if (hold_tap->status == STATUS_HOLD_TIMER || hold_tap->status == STATUS_HOLD_INTERRUPT) {
|
||||||
|
binding.behavior_dev = hold_tap->config->hold_behavior_dev;
|
||||||
|
binding.param1 = hold_tap->param_hold;
|
||||||
|
} else {
|
||||||
|
binding.behavior_dev = hold_tap->config->tap_behavior_dev;
|
||||||
|
binding.param1 = hold_tap->param_tap;
|
||||||
|
}
|
||||||
|
return behavior_keymap_binding_released(&binding, event);
|
||||||
|
}
|
||||||
|
|
||||||
static void decide_hold_tap(struct active_hold_tap *hold_tap, enum decision_moment event_type) {
|
static void decide_hold_tap(struct active_hold_tap *hold_tap, enum decision_moment event_type) {
|
||||||
if (hold_tap->status != STATUS_UNDECIDED) {
|
if (hold_tap->status != STATUS_UNDECIDED) {
|
||||||
return;
|
return;
|
||||||
|
@ -322,24 +357,7 @@ static void decide_hold_tap(struct active_hold_tap *hold_tap, enum decision_mome
|
||||||
LOG_DBG("%d decided %s (%s event %d)", hold_tap->position, status_str(hold_tap->status),
|
LOG_DBG("%d decided %s (%s event %d)", hold_tap->position, status_str(hold_tap->status),
|
||||||
flavor_str(hold_tap->config->flavor), event_type);
|
flavor_str(hold_tap->config->flavor), event_type);
|
||||||
undecided_hold_tap = NULL;
|
undecided_hold_tap = NULL;
|
||||||
|
press_binding(hold_tap);
|
||||||
struct zmk_behavior_binding_event event = {
|
|
||||||
.position = hold_tap->position,
|
|
||||||
.timestamp = hold_tap->timestamp,
|
|
||||||
};
|
|
||||||
|
|
||||||
struct zmk_behavior_binding binding;
|
|
||||||
if (hold_tap->status & STATUS_HOLD) {
|
|
||||||
binding.behavior_dev = hold_tap->config->hold_behavior_dev;
|
|
||||||
binding.param1 = hold_tap->param_hold;
|
|
||||||
binding.param2 = 0;
|
|
||||||
} else {
|
|
||||||
binding.behavior_dev = hold_tap->config->tap_behavior_dev;
|
|
||||||
binding.param1 = hold_tap->param_tap;
|
|
||||||
binding.param2 = 0;
|
|
||||||
store_last_tapped(hold_tap);
|
|
||||||
}
|
|
||||||
behavior_keymap_binding_pressed(&binding, event);
|
|
||||||
release_captured_events();
|
release_captured_events();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -395,25 +413,7 @@ static int on_hold_tap_binding_released(struct zmk_behavior_binding *binding,
|
||||||
}
|
}
|
||||||
|
|
||||||
decide_hold_tap(hold_tap, HT_KEY_UP);
|
decide_hold_tap(hold_tap, HT_KEY_UP);
|
||||||
|
release_binding(hold_tap);
|
||||||
// todo: set up the binding and data items inside of the
|
|
||||||
// active_hhold_tap->config->behaviors->tap.behavior_dev;old_tap struct
|
|
||||||
struct zmk_behavior_binding_event sub_behavior_data = {
|
|
||||||
.position = hold_tap->position,
|
|
||||||
.timestamp = hold_tap->timestamp,
|
|
||||||
};
|
|
||||||
|
|
||||||
struct zmk_behavior_binding sub_behavior_binding;
|
|
||||||
if (hold_tap->status & STATUS_HOLD) {
|
|
||||||
sub_behavior_binding.behavior_dev = hold_tap->config->hold_behavior_dev;
|
|
||||||
sub_behavior_binding.param1 = hold_tap->param_hold;
|
|
||||||
sub_behavior_binding.param2 = 0;
|
|
||||||
} else {
|
|
||||||
sub_behavior_binding.behavior_dev = hold_tap->config->tap_behavior_dev;
|
|
||||||
sub_behavior_binding.param1 = hold_tap->param_tap;
|
|
||||||
sub_behavior_binding.param2 = 0;
|
|
||||||
}
|
|
||||||
behavior_keymap_binding_released(&sub_behavior_binding, sub_behavior_data);
|
|
||||||
|
|
||||||
if (work_cancel_result == -EINPROGRESS) {
|
if (work_cancel_result == -EINPROGRESS) {
|
||||||
// let the timer handler clean up
|
// let the timer handler clean up
|
||||||
|
|
Loading…
Reference in a new issue