rename
This commit is contained in:
parent
ec8c8634ae
commit
425066b0d2
164 changed files with 559 additions and 476 deletions
|
@ -35,7 +35,7 @@ target_sources(app PRIVATE src/events/modifiers_state_changed.c)
|
||||||
target_sources(app PRIVATE src/events/sensor_event.c)
|
target_sources(app PRIVATE src/events/sensor_event.c)
|
||||||
target_sources(app PRIVATE src/behaviors/behavior_key_press.c)
|
target_sources(app PRIVATE src/behaviors/behavior_key_press.c)
|
||||||
target_sources(app PRIVATE src/behaviors/behavior_reset.c)
|
target_sources(app PRIVATE src/behaviors/behavior_reset.c)
|
||||||
target_sources(app PRIVATE src/behaviors/behavior_tap_hold.c)
|
target_sources(app PRIVATE src/behaviors/behavior_hold_tap.c)
|
||||||
target_sources(app PRIVATE src/behaviors/behavior_momentary_layer.c)
|
target_sources(app PRIVATE src/behaviors/behavior_momentary_layer.c)
|
||||||
target_sources(app PRIVATE src/behaviors/behavior_toggle_layer.c)
|
target_sources(app PRIVATE src/behaviors/behavior_toggle_layer.c)
|
||||||
target_sources(app PRIVATE src/behaviors/behavior_transparent.c)
|
target_sources(app PRIVATE src/behaviors/behavior_transparent.c)
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/ {
|
/ {
|
||||||
behaviors {
|
behaviors {
|
||||||
ht: behavior_homerow_mod {
|
ht: behavior_homerow_mod {
|
||||||
compatible = "zmk,behavior-tap-hold";
|
compatible = "zmk,behavior-hold-tap";
|
||||||
label = "homerow_mod";
|
label = "homerow_mod";
|
||||||
#binding-cells = <2>;
|
#binding-cells = <2>;
|
||||||
flavor = "balanced";
|
flavor = "balanced";
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/ {
|
/ {
|
||||||
behaviors {
|
behaviors {
|
||||||
lt: behavior_layer_tap {
|
lt: behavior_layer_tap {
|
||||||
compatible = "zmk,behavior-tap-hold";
|
compatible = "zmk,behavior-hold-tap";
|
||||||
label = "LAYER_TAP";
|
label = "LAYER_TAP";
|
||||||
#binding-cells = <2>;
|
#binding-cells = <2>;
|
||||||
flavor = "tap-preferred";
|
flavor = "tap-preferred";
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/ {
|
/ {
|
||||||
behaviors {
|
behaviors {
|
||||||
mt: behavior_mod_tap {
|
mt: behavior_mod_tap {
|
||||||
compatible = "zmk,behavior-tap-hold";
|
compatible = "zmk,behavior-hold-tap";
|
||||||
label = "MOD_TAP";
|
label = "MOD_TAP";
|
||||||
#binding-cells = <2>;
|
#binding-cells = <2>;
|
||||||
flavor = "hold-preferred";
|
flavor = "hold-preferred";
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
description: Hold or Tap behavior
|
description: Hold or Tap behavior
|
||||||
|
|
||||||
compatible: "zmk,behavior-tap-hold"
|
compatible: "zmk,behavior-hold-tap"
|
||||||
|
|
||||||
include: two_param.yaml
|
include: two_param.yaml
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
* SPDX-License-Identifier: MIT
|
* SPDX-License-Identifier: MIT
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define DT_DRV_COMPAT zmk_behavior_tap_hold
|
#define DT_DRV_COMPAT zmk_behavior_hold_tap
|
||||||
|
|
||||||
#include <device.h>
|
#include <device.h>
|
||||||
#include <drivers/behavior.h>
|
#include <drivers/behavior.h>
|
||||||
|
@ -24,51 +24,51 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);
|
||||||
#if DT_NODE_EXISTS(DT_DRV_INST(0))
|
#if DT_NODE_EXISTS(DT_DRV_INST(0))
|
||||||
|
|
||||||
/************************************************************ DATA SETUP */
|
/************************************************************ DATA SETUP */
|
||||||
#define ZMK_BHV_TAP_HOLD_MAX_HELD 10
|
#define ZMK_BHV_HOLD_TAP_MAX_HELD 10
|
||||||
#define ZMK_BHV_TAP_HOLD_MAX_CAPTURED_EVENTS 40
|
#define ZMK_BHV_HOLD_TAP_MAX_CAPTURED_EVENTS 40
|
||||||
|
|
||||||
// increase if you have keyboard with more keys.
|
// increase if you have keyboard with more keys.
|
||||||
#define ZMK_BHV_TAP_HOLD_POSITION_NOT_USED 9999
|
#define ZMK_BHV_HOLD_TAP_POSITION_NOT_USED 9999
|
||||||
|
|
||||||
struct behavior_tap_hold_behaviors {
|
struct behavior_hold_tap_behaviors {
|
||||||
struct zmk_behavior_binding tap;
|
struct zmk_behavior_binding tap;
|
||||||
struct zmk_behavior_binding hold;
|
struct zmk_behavior_binding hold;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef k_timeout_t (*timer_func)();
|
typedef k_timeout_t (*timer_func)();
|
||||||
|
|
||||||
struct behavior_tap_hold_config {
|
struct behavior_hold_tap_config {
|
||||||
timer_func tapping_term_ms;
|
timer_func tapping_term_ms;
|
||||||
struct behavior_tap_hold_behaviors *behaviors;
|
struct behavior_hold_tap_behaviors *behaviors;
|
||||||
char *flavor;
|
char *flavor;
|
||||||
};
|
};
|
||||||
|
|
||||||
// this data is specific for each tap-hold
|
// this data is specific for each hold-tap
|
||||||
struct active_tap_hold {
|
struct active_hold_tap {
|
||||||
s32_t position;
|
s32_t position;
|
||||||
u32_t param_hold;
|
u32_t param_hold;
|
||||||
u32_t param_tap;
|
u32_t param_tap;
|
||||||
bool is_decided;
|
bool is_decided;
|
||||||
bool is_hold;
|
bool is_hold;
|
||||||
const struct behavior_tap_hold_config *config;
|
const struct behavior_hold_tap_config *config;
|
||||||
struct k_delayed_work work;
|
struct k_delayed_work work;
|
||||||
bool work_is_cancelled;
|
bool work_is_cancelled;
|
||||||
};
|
};
|
||||||
|
|
||||||
// The undecided tap hold is the tap hold that needs to be decided before
|
// The undecided hold tap is the hold tap that needs to be decided before
|
||||||
// other keypress events can be released. While the undecided_tap chold is
|
// other keypress events can be released. While the undecided_hold_tap is
|
||||||
// not NULL, most events are captured in captured_events.
|
// not NULL, most events are captured in captured_events.
|
||||||
// After the tap_hold is decided, it will stay in the active_tap_holds until
|
// After the hold_tap is decided, it will stay in the active_hold_taps until
|
||||||
// its key-up has been processed and the delayed work is cleaned up.
|
// its key-up has been processed and the delayed work is cleaned up.
|
||||||
struct active_tap_hold *undecided_tap_hold = NULL;
|
struct active_hold_tap *undecided_hold_tap = NULL;
|
||||||
struct active_tap_hold active_tap_holds[ZMK_BHV_TAP_HOLD_MAX_HELD] = {};
|
struct active_hold_tap active_hold_taps[ZMK_BHV_HOLD_TAP_MAX_HELD] = {};
|
||||||
// We capture most position_state_changed events and some modifiers_state_changed events.
|
// We capture most position_state_changed events and some modifiers_state_changed events.
|
||||||
const struct zmk_event_header *captured_events[ZMK_BHV_TAP_HOLD_MAX_CAPTURED_EVENTS] = {};
|
const struct zmk_event_header *captured_events[ZMK_BHV_HOLD_TAP_MAX_CAPTURED_EVENTS] = {};
|
||||||
|
|
||||||
/************************************************************ CAPTURED POSITION HELPER FUNCTIONS */
|
/************************************************************ CAPTURED POSITION HELPER FUNCTIONS */
|
||||||
static int capture_event(const struct zmk_event_header *event)
|
static int capture_event(const struct zmk_event_header *event)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < ZMK_BHV_TAP_HOLD_MAX_CAPTURED_EVENTS; i++) {
|
for (int i = 0; i < ZMK_BHV_HOLD_TAP_MAX_CAPTURED_EVENTS; i++) {
|
||||||
if (captured_events[i] == NULL) {
|
if (captured_events[i] == NULL) {
|
||||||
captured_events[i] = event;
|
captured_events[i] = event;
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -80,7 +80,7 @@ static int capture_event(const struct zmk_event_header *event)
|
||||||
static struct position_state_changed *find_captured_keydown_event(u32_t position)
|
static struct position_state_changed *find_captured_keydown_event(u32_t position)
|
||||||
{
|
{
|
||||||
struct position_state_changed *last_match = NULL;
|
struct position_state_changed *last_match = NULL;
|
||||||
for (int i = 0; i < ZMK_BHV_TAP_HOLD_MAX_CAPTURED_EVENTS; i++) {
|
for (int i = 0; i < ZMK_BHV_HOLD_TAP_MAX_CAPTURED_EVENTS; i++) {
|
||||||
const struct zmk_event_header *eh = captured_events[i];
|
const struct zmk_event_header *eh = captured_events[i];
|
||||||
if (eh == NULL) {
|
if (eh == NULL) {
|
||||||
return last_match;
|
return last_match;
|
||||||
|
@ -98,7 +98,7 @@ static struct position_state_changed *find_captured_keydown_event(u32_t position
|
||||||
|
|
||||||
static void release_captured_events()
|
static void release_captured_events()
|
||||||
{
|
{
|
||||||
if (undecided_tap_hold != NULL) {
|
if (undecided_hold_tap != NULL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -106,34 +106,34 @@ static void release_captured_events()
|
||||||
//
|
//
|
||||||
// Events for different mod-tap instances are separated by a NULL pointer.
|
// Events for different mod-tap instances are separated by a NULL pointer.
|
||||||
//
|
//
|
||||||
// The first event popped will never be catched by the next active tap-hold
|
// The first event popped will never be catched by the next active hold-tap
|
||||||
// because to start capturing a mod-tap-key-down event must first completely
|
// because to start capturing a mod-tap-key-down event must first completely
|
||||||
// go through the events queue.
|
// go through the events queue.
|
||||||
//
|
//
|
||||||
// Example of this release process;
|
// Example of this release process;
|
||||||
// [mt2_down, k1_down, k1_up, mt2_up, null, ...]
|
// [mt2_down, k1_down, k1_up, mt2_up, null, ...]
|
||||||
// ^
|
// ^
|
||||||
// mt2_down position event isn't captured because no tap-hold is active.
|
// mt2_down position event isn't captured because no hold-tap is active.
|
||||||
// mt2_down behavior event is handled, now we have an undecided tap-hold
|
// mt2_down behavior event is handled, now we have an undecided hold-tap
|
||||||
// [null, k1_down, k1_up, mt2_up, null, ...]
|
// [null, k1_down, k1_up, mt2_up, null, ...]
|
||||||
// ^
|
// ^
|
||||||
// k1_down is captured by the mt2 mod-tap
|
// k1_down is captured by the mt2 mod-tap
|
||||||
// !note that searches for find_captured_keydown_event by the mt2 behavior will stop at the first null encountered
|
// !note that searches for find_captured_keydown_event by the mt2 behavior will stop at the first null encountered
|
||||||
// [mt1_down, null, k1_up, mt2_up, null, ...]
|
// [mt1_down, null, k1_up, mt2_up, null, ...]
|
||||||
// ^
|
// ^
|
||||||
// k1_up event is captured by the new tap-hold:
|
// k1_up event is captured by the new hold-tap:
|
||||||
// [k1_down, k1_up, null, mt2_up, null, ...]
|
// [k1_down, k1_up, null, mt2_up, null, ...]
|
||||||
// ^
|
// ^
|
||||||
// mt2_up event is not captured but causes release of mt2 behavior
|
// mt2_up event is not captured but causes release of mt2 behavior
|
||||||
// [k1_down, k1_up, null, null, null, ...]
|
// [k1_down, k1_up, null, null, null, ...]
|
||||||
// now mt2 will start releasing it's own captured positions.
|
// now mt2 will start releasing it's own captured positions.
|
||||||
for (int i = 0; i < ZMK_BHV_TAP_HOLD_MAX_CAPTURED_EVENTS; i++) {
|
for (int i = 0; i < ZMK_BHV_HOLD_TAP_MAX_CAPTURED_EVENTS; i++) {
|
||||||
const struct zmk_event_header *captured_event = captured_events[i];
|
const struct zmk_event_header *captured_event = captured_events[i];
|
||||||
if (captured_event == NULL) {
|
if (captured_event == NULL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
captured_events[i] = NULL;
|
captured_events[i] = NULL;
|
||||||
if (undecided_tap_hold != NULL) {
|
if (undecided_hold_tap != NULL) {
|
||||||
k_msleep(10);
|
k_msleep(10);
|
||||||
}
|
}
|
||||||
if (is_position_state_changed(captured_event)) {
|
if (is_position_state_changed(captured_event)) {
|
||||||
|
@ -150,161 +150,161 @@ static void release_captured_events()
|
||||||
|
|
||||||
/************************************************************ ACTIVE TAP HOLD HELPER FUNCTIONS */
|
/************************************************************ ACTIVE TAP HOLD HELPER FUNCTIONS */
|
||||||
|
|
||||||
static struct active_tap_hold *find_tap_hold(u32_t position)
|
static struct active_hold_tap *find_hold_tap(u32_t position)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < ZMK_BHV_TAP_HOLD_MAX_HELD; i++) {
|
for (int i = 0; i < ZMK_BHV_HOLD_TAP_MAX_HELD; i++) {
|
||||||
if (active_tap_holds[i].position == position) {
|
if (active_hold_taps[i].position == position) {
|
||||||
return &active_tap_holds[i];
|
return &active_hold_taps[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct active_tap_hold *store_tap_hold(u32_t position, u32_t param_hold, u32_t param_tap, const struct behavior_tap_hold_config *config)
|
static struct active_hold_tap *store_hold_tap(u32_t position, u32_t param_hold, u32_t param_tap, const struct behavior_hold_tap_config *config)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < ZMK_BHV_TAP_HOLD_MAX_HELD; i++) {
|
for (int i = 0; i < ZMK_BHV_HOLD_TAP_MAX_HELD; i++) {
|
||||||
if (active_tap_holds[i].position != ZMK_BHV_TAP_HOLD_POSITION_NOT_USED) {
|
if (active_hold_taps[i].position != ZMK_BHV_HOLD_TAP_POSITION_NOT_USED) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
active_tap_holds[i].position = position;
|
active_hold_taps[i].position = position;
|
||||||
active_tap_holds[i].is_decided = false;
|
active_hold_taps[i].is_decided = false;
|
||||||
active_tap_holds[i].is_hold = false;
|
active_hold_taps[i].is_hold = false;
|
||||||
active_tap_holds[i].config = config;
|
active_hold_taps[i].config = config;
|
||||||
active_tap_holds[i].param_hold = param_hold;
|
active_hold_taps[i].param_hold = param_hold;
|
||||||
active_tap_holds[i].param_tap = param_tap;
|
active_hold_taps[i].param_tap = param_tap;
|
||||||
return &active_tap_holds[i];
|
return &active_hold_taps[i];
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void clear_tap_hold(struct active_tap_hold *tap_hold)
|
static void clear_hold_tap(struct active_hold_tap *hold_tap)
|
||||||
{
|
{
|
||||||
tap_hold->position = ZMK_BHV_TAP_HOLD_POSITION_NOT_USED;
|
hold_tap->position = ZMK_BHV_HOLD_TAP_POSITION_NOT_USED;
|
||||||
tap_hold->is_decided = false;
|
hold_tap->is_decided = false;
|
||||||
tap_hold->is_hold = false;
|
hold_tap->is_hold = false;
|
||||||
tap_hold->work_is_cancelled = false;
|
hold_tap->work_is_cancelled = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
enum decision_moment {
|
enum decision_moment {
|
||||||
TH_KEY_UP = 0,
|
HT_KEY_UP = 0,
|
||||||
TH_OTHER_KEY_DOWN = 1,
|
HT_OTHER_KEY_DOWN = 1,
|
||||||
TH_OTHER_KEY_UP = 2,
|
HT_OTHER_KEY_UP = 2,
|
||||||
TH_TIMER_EVENT = 3,
|
HT_TIMER_EVENT = 3,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void decide_balanced(struct active_tap_hold *tap_hold, enum decision_moment event)
|
static void decide_balanced(struct active_hold_tap *hold_tap, enum decision_moment event)
|
||||||
{
|
{
|
||||||
switch (event) {
|
switch (event) {
|
||||||
case TH_KEY_UP:
|
case HT_KEY_UP:
|
||||||
tap_hold->is_hold = 0;
|
hold_tap->is_hold = 0;
|
||||||
tap_hold->is_decided = true;
|
hold_tap->is_decided = true;
|
||||||
break;
|
break;
|
||||||
case TH_OTHER_KEY_UP:
|
case HT_OTHER_KEY_UP:
|
||||||
tap_hold->is_hold = 1;
|
hold_tap->is_hold = 1;
|
||||||
tap_hold->is_decided = true;
|
hold_tap->is_decided = true;
|
||||||
break;
|
break;
|
||||||
case TH_TIMER_EVENT:
|
case HT_TIMER_EVENT:
|
||||||
tap_hold->is_hold = 1;
|
hold_tap->is_hold = 1;
|
||||||
tap_hold->is_decided = true;
|
hold_tap->is_decided = true;
|
||||||
break;
|
break;
|
||||||
default: return;
|
default: return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void decide_tap_preferred(struct active_tap_hold *tap_hold, enum decision_moment event)
|
static void decide_tap_preferred(struct active_hold_tap *hold_tap, enum decision_moment event)
|
||||||
{
|
{
|
||||||
switch (event) {
|
switch (event) {
|
||||||
case TH_KEY_UP:
|
case HT_KEY_UP:
|
||||||
tap_hold->is_hold = 0;
|
hold_tap->is_hold = 0;
|
||||||
tap_hold->is_decided = true;
|
hold_tap->is_decided = true;
|
||||||
break;
|
break;
|
||||||
case TH_TIMER_EVENT:
|
case HT_TIMER_EVENT:
|
||||||
tap_hold->is_hold = 1;
|
hold_tap->is_hold = 1;
|
||||||
tap_hold->is_decided = true;
|
hold_tap->is_decided = true;
|
||||||
break;
|
break;
|
||||||
default: return;
|
default: return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void decide_hold_preferred(struct active_tap_hold *tap_hold, enum decision_moment event)
|
static void decide_hold_preferred(struct active_hold_tap *hold_tap, enum decision_moment event)
|
||||||
{
|
{
|
||||||
switch (event) {
|
switch (event) {
|
||||||
case TH_KEY_UP:
|
case HT_KEY_UP:
|
||||||
tap_hold->is_hold = 0;
|
hold_tap->is_hold = 0;
|
||||||
tap_hold->is_decided = true;
|
hold_tap->is_decided = true;
|
||||||
break;
|
break;
|
||||||
case TH_OTHER_KEY_DOWN:
|
case HT_OTHER_KEY_DOWN:
|
||||||
tap_hold->is_hold = 1;
|
hold_tap->is_hold = 1;
|
||||||
tap_hold->is_decided = true;
|
hold_tap->is_decided = true;
|
||||||
break;
|
break;
|
||||||
case TH_TIMER_EVENT:
|
case HT_TIMER_EVENT:
|
||||||
tap_hold->is_hold = 1;
|
hold_tap->is_hold = 1;
|
||||||
tap_hold->is_decided = true;
|
hold_tap->is_decided = true;
|
||||||
break;
|
break;
|
||||||
default: return;
|
default: return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void decide_tap_hold(struct active_tap_hold *tap_hold, enum decision_moment event)
|
static void decide_hold_tap(struct active_hold_tap *hold_tap, enum decision_moment event)
|
||||||
{
|
{
|
||||||
if (tap_hold->is_decided) {
|
if (hold_tap->is_decided) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tap_hold != undecided_tap_hold) {
|
if (hold_tap != undecided_hold_tap) {
|
||||||
LOG_DBG("ERROR found undecided tap hold that is not the active tap hold");
|
LOG_DBG("ERROR found undecided tap hold that is not the active tap hold");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *flavor = tap_hold->config->flavor;
|
char *flavor = hold_tap->config->flavor;
|
||||||
if (strcmp(flavor, "balanced") == 0) {
|
if (strcmp(flavor, "balanced") == 0) {
|
||||||
decide_balanced(tap_hold, event);
|
decide_balanced(hold_tap, event);
|
||||||
} else if (strcmp(flavor, "tap-preferred") == 0) {
|
} else if (strcmp(flavor, "tap-preferred") == 0) {
|
||||||
decide_tap_preferred(tap_hold, event);
|
decide_tap_preferred(hold_tap, event);
|
||||||
} else if (strcmp(flavor, "hold-preferred") == 0) {
|
} else if (strcmp(flavor, "hold-preferred") == 0) {
|
||||||
decide_hold_preferred(tap_hold, event);
|
decide_hold_preferred(hold_tap, event);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!tap_hold->is_decided) {
|
if (!hold_tap->is_decided) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_DBG("%d decided %s (%s event %d)", tap_hold->position, tap_hold->is_hold ? "hold" : "tap", flavor, event);
|
LOG_DBG("%d decided %s (%s event %d)", hold_tap->position, hold_tap->is_hold ? "hold" : "tap", flavor, event);
|
||||||
undecided_tap_hold = NULL;
|
undecided_hold_tap = NULL;
|
||||||
|
|
||||||
struct zmk_behavior_binding *behavior;
|
struct zmk_behavior_binding *behavior;
|
||||||
if (tap_hold->is_hold) {
|
if (hold_tap->is_hold) {
|
||||||
behavior = &tap_hold->config->behaviors->hold;
|
behavior = &hold_tap->config->behaviors->hold;
|
||||||
struct device *behavior_device = device_get_binding(behavior->behavior_dev);
|
struct device *behavior_device = device_get_binding(behavior->behavior_dev);
|
||||||
behavior_keymap_binding_pressed(behavior_device, tap_hold->position, tap_hold->param_hold, 0);
|
behavior_keymap_binding_pressed(behavior_device, hold_tap->position, hold_tap->param_hold, 0);
|
||||||
} else {
|
} else {
|
||||||
behavior = &tap_hold->config->behaviors->tap;
|
behavior = &hold_tap->config->behaviors->tap;
|
||||||
struct device *behavior_device = device_get_binding(behavior->behavior_dev);
|
struct device *behavior_device = device_get_binding(behavior->behavior_dev);
|
||||||
behavior_keymap_binding_pressed(behavior_device, tap_hold->position, tap_hold->param_tap, 0);
|
behavior_keymap_binding_pressed(behavior_device, hold_tap->position, hold_tap->param_tap, 0);
|
||||||
}
|
}
|
||||||
release_captured_events();
|
release_captured_events();
|
||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************ tap_hold_binding and key handlers */
|
/************************************************************ hold_tap_binding and key handlers */
|
||||||
static int on_tap_hold_binding_pressed(struct device *dev, u32_t position, u32_t param_hold, u32_t param_tap)
|
static int on_hold_tap_binding_pressed(struct device *dev, u32_t position, u32_t param_hold, u32_t param_tap)
|
||||||
{
|
{
|
||||||
const struct behavior_tap_hold_config *cfg = dev->config_info;
|
const struct behavior_hold_tap_config *cfg = dev->config_info;
|
||||||
|
|
||||||
if (undecided_tap_hold != NULL) {
|
if (undecided_hold_tap != NULL) {
|
||||||
LOG_DBG("ERROR another tap-hold behavior is undecided.");
|
LOG_DBG("ERROR another hold-tap behavior is undecided.");
|
||||||
// if this happens, make sure the behavior events occur AFTER other position events.
|
// if this happens, make sure the behavior events occur AFTER other position events.
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct active_tap_hold *tap_hold = store_tap_hold(position, param_hold, param_tap, cfg);
|
struct active_hold_tap *hold_tap = store_hold_tap(position, param_hold, param_tap, cfg);
|
||||||
if (tap_hold == NULL) {
|
if (hold_tap == NULL) {
|
||||||
LOG_ERR("unable to store tap-hold info, did you press more than %d tap-holds?", ZMK_BHV_TAP_HOLD_MAX_HELD);
|
LOG_ERR("unable to store hold-tap info, did you press more than %d hold-taps?", ZMK_BHV_HOLD_TAP_MAX_HELD);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_DBG("%d new undecided tap_hold", position);
|
LOG_DBG("%d new undecided hold_tap", position);
|
||||||
undecided_tap_hold = tap_hold;
|
undecided_hold_tap = hold_tap;
|
||||||
k_delayed_work_submit(&tap_hold->work, cfg->tapping_term_ms());
|
k_delayed_work_submit(&hold_tap->work, cfg->tapping_term_ms());
|
||||||
|
|
||||||
// todo: once we get timing info for keypresses, start the timer relative to the original keypress
|
// todo: once we get timing info for keypresses, start the timer relative to the original keypress
|
||||||
// don't forget to simulate a timer-event before the event after that time was handled.
|
// don't forget to simulate a timer-event before the event after that time was handled.
|
||||||
|
@ -312,46 +312,46 @@ static int on_tap_hold_binding_pressed(struct device *dev, u32_t position, u32_t
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int on_tap_hold_binding_released(struct device *dev, u32_t position, u32_t _, u32_t __)
|
static int on_hold_tap_binding_released(struct device *dev, u32_t position, u32_t _, u32_t __)
|
||||||
{
|
{
|
||||||
struct active_tap_hold *tap_hold = find_tap_hold(position);
|
struct active_hold_tap *hold_tap = find_hold_tap(position);
|
||||||
|
|
||||||
if (tap_hold == NULL) {
|
if (hold_tap == NULL) {
|
||||||
LOG_ERR("ACTIVE_TAP_HOLD_CLEANED_UP_TOO_EARLY");
|
LOG_ERR("ACTIVE_HOLD_TAP_CLEANED_UP_TOO_EARLY");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int work_cancel_result = k_delayed_work_cancel(&tap_hold->work);
|
int work_cancel_result = k_delayed_work_cancel(&hold_tap->work);
|
||||||
decide_tap_hold(tap_hold, TH_KEY_UP);
|
decide_hold_tap(hold_tap, HT_KEY_UP);
|
||||||
|
|
||||||
struct zmk_behavior_binding *behavior;
|
struct zmk_behavior_binding *behavior;
|
||||||
if (tap_hold->is_hold) {
|
if (hold_tap->is_hold) {
|
||||||
behavior = &tap_hold->config->behaviors->hold;
|
behavior = &hold_tap->config->behaviors->hold;
|
||||||
struct device *behavior_device = device_get_binding(behavior->behavior_dev);
|
struct device *behavior_device = device_get_binding(behavior->behavior_dev);
|
||||||
behavior_keymap_binding_released(behavior_device, tap_hold->position, tap_hold->param_hold, 0);
|
behavior_keymap_binding_released(behavior_device, hold_tap->position, hold_tap->param_hold, 0);
|
||||||
} else {
|
} else {
|
||||||
behavior = &tap_hold->config->behaviors->tap;
|
behavior = &hold_tap->config->behaviors->tap;
|
||||||
struct device *behavior_device = device_get_binding(behavior->behavior_dev);
|
struct device *behavior_device = device_get_binding(behavior->behavior_dev);
|
||||||
behavior_keymap_binding_released(behavior_device, tap_hold->position, tap_hold->param_tap, 0);
|
behavior_keymap_binding_released(behavior_device, hold_tap->position, hold_tap->param_tap, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (work_cancel_result == -EINPROGRESS) {
|
if (work_cancel_result == -EINPROGRESS) {
|
||||||
// let the timer handler clean up
|
// let the timer handler clean up
|
||||||
// if we'd clear now, the timer may call back for an uninitialized active_tap_hold.
|
// if we'd clear now, the timer may call back for an uninitialized active_hold_tap.
|
||||||
LOG_DBG("%d tap-hold timer work in event queue", position);
|
LOG_DBG("%d hold-tap timer work in event queue", position);
|
||||||
tap_hold->work_is_cancelled = true;
|
hold_tap->work_is_cancelled = true;
|
||||||
} else {
|
} else {
|
||||||
LOG_DBG("%d cleaning up tap-hold", position);
|
LOG_DBG("%d cleaning up hold-tap", position);
|
||||||
clear_tap_hold(tap_hold);
|
clear_hold_tap(hold_tap);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct behavior_driver_api behavior_tap_hold_driver_api = {
|
static const struct behavior_driver_api behavior_hold_tap_driver_api = {
|
||||||
.binding_pressed = on_tap_hold_binding_pressed,
|
.binding_pressed = on_hold_tap_binding_pressed,
|
||||||
.binding_released = on_tap_hold_binding_released,
|
.binding_released = on_hold_tap_binding_released,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -359,17 +359,17 @@ static int position_state_changed_listener(const struct zmk_event_header *eh)
|
||||||
{
|
{
|
||||||
struct position_state_changed *ev = cast_position_state_changed(eh);
|
struct position_state_changed *ev = cast_position_state_changed(eh);
|
||||||
|
|
||||||
if (undecided_tap_hold == NULL) {
|
if (undecided_hold_tap == NULL) {
|
||||||
LOG_DBG("%d bubble (no undecided tap_hold active)", ev->position);
|
LOG_DBG("%d bubble (no undecided hold_tap active)", ev->position);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (undecided_tap_hold->position == ev->position) {
|
if (undecided_hold_tap->position == ev->position) {
|
||||||
if (ev->state) { // keydown
|
if (ev->state) { // keydown
|
||||||
LOG_ERR("tap-hold listener should be called before before most other listeners!");
|
LOG_ERR("hold-tap listener should be called before before most other listeners!");
|
||||||
return 0;
|
return 0;
|
||||||
} else { // keyup
|
} else { // keyup
|
||||||
LOG_DBG("%d bubble undecided tap-hold keyrelease event", undecided_tap_hold->position);
|
LOG_DBG("%d bubble undecided hold-tap keyrelease event", undecided_hold_tap->position);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -377,13 +377,13 @@ static int position_state_changed_listener(const struct zmk_event_header *eh)
|
||||||
if (!ev->state && find_captured_keydown_event(ev->position) == NULL) {
|
if (!ev->state && find_captured_keydown_event(ev->position) == NULL) {
|
||||||
// no keydown event has been captured, let it bubble.
|
// no keydown event has been captured, let it bubble.
|
||||||
// we'll catch modifiers later in modifier_state_changed_listener
|
// we'll catch modifiers later in modifier_state_changed_listener
|
||||||
LOG_DBG("%d bubbling %d %s event", undecided_tap_hold->position, ev->position, ev->state ? "down" : "up");
|
LOG_DBG("%d bubbling %d %s event", undecided_hold_tap->position, ev->position, ev->state ? "down" : "up");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_DBG("%d capturing %d %s event", undecided_tap_hold->position, ev->position, ev->state ? "down" : "up");
|
LOG_DBG("%d capturing %d %s event", undecided_hold_tap->position, ev->position, ev->state ? "down" : "up");
|
||||||
capture_event(eh);
|
capture_event(eh);
|
||||||
decide_tap_hold(undecided_tap_hold, ev->state ? TH_OTHER_KEY_DOWN : TH_OTHER_KEY_UP);
|
decide_hold_tap(undecided_hold_tap, ev->state ? HT_OTHER_KEY_DOWN : HT_OTHER_KEY_UP);
|
||||||
return ZMK_EV_EVENT_CAPTURED;
|
return ZMK_EV_EVENT_CAPTURED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -397,8 +397,8 @@ static int keycode_state_changed_listener(const struct zmk_event_header *eh)
|
||||||
// we want to catch layer-up events too... how?
|
// we want to catch layer-up events too... how?
|
||||||
struct keycode_state_changed *ev = cast_keycode_state_changed(eh);
|
struct keycode_state_changed *ev = cast_keycode_state_changed(eh);
|
||||||
|
|
||||||
if (undecided_tap_hold == NULL) {
|
if (undecided_hold_tap == NULL) {
|
||||||
// LOG_DBG("0x%02X bubble (no undecided tap_hold active)", ev->keycode);
|
// LOG_DBG("0x%02X bubble (no undecided hold_tap active)", ev->keycode);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -408,14 +408,14 @@ static int keycode_state_changed_listener(const struct zmk_event_header *eh)
|
||||||
}
|
}
|
||||||
|
|
||||||
// only key-up events will bubble through position_state_changed_listener
|
// only key-up events will bubble through position_state_changed_listener
|
||||||
// if a undecided_tap_hold is active.
|
// if a undecided_hold_tap is active.
|
||||||
LOG_DBG("%d capturing 0x%02X %s event", undecided_tap_hold->position, ev->keycode, ev->state ? "down" : "up");
|
LOG_DBG("%d capturing 0x%02X %s event", undecided_hold_tap->position, ev->keycode, ev->state ? "down" : "up");
|
||||||
capture_event(eh);
|
capture_event(eh);
|
||||||
return ZMK_EV_EVENT_CAPTURED;
|
return ZMK_EV_EVENT_CAPTURED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int behavior_tap_hold_listener(const struct zmk_event_header *eh)
|
int behavior_hold_tap_listener(const struct zmk_event_header *eh)
|
||||||
{
|
{
|
||||||
if (is_position_state_changed(eh)) {
|
if (is_position_state_changed(eh)) {
|
||||||
return position_state_changed_listener(eh);
|
return position_state_changed_listener(eh);
|
||||||
|
@ -425,39 +425,39 @@ int behavior_tap_hold_listener(const struct zmk_event_header *eh)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ZMK_LISTENER(behavior_tap_hold, behavior_tap_hold_listener);
|
ZMK_LISTENER(behavior_hold_tap, behavior_hold_tap_listener);
|
||||||
ZMK_SUBSCRIPTION(behavior_tap_hold, position_state_changed);
|
ZMK_SUBSCRIPTION(behavior_hold_tap, position_state_changed);
|
||||||
// this should be modifiers_state_changed, but unfrotunately that's not implemented yet.
|
// this should be modifiers_state_changed, but unfrotunately that's not implemented yet.
|
||||||
ZMK_SUBSCRIPTION(behavior_tap_hold, keycode_state_changed);
|
ZMK_SUBSCRIPTION(behavior_hold_tap, keycode_state_changed);
|
||||||
|
|
||||||
/************************************************************ TIMER FUNCTIONS */
|
/************************************************************ TIMER FUNCTIONS */
|
||||||
void behavior_tap_hold_timer_work_handler(struct k_work *item)
|
void behavior_hold_tap_timer_work_handler(struct k_work *item)
|
||||||
{
|
{
|
||||||
struct active_tap_hold *tap_hold = CONTAINER_OF(item, struct active_tap_hold, work);
|
struct active_hold_tap *hold_tap = CONTAINER_OF(item, struct active_hold_tap, work);
|
||||||
|
|
||||||
if (tap_hold->work_is_cancelled) {
|
if (hold_tap->work_is_cancelled) {
|
||||||
clear_tap_hold(tap_hold);
|
clear_hold_tap(hold_tap);
|
||||||
} else {
|
} else {
|
||||||
decide_tap_hold(tap_hold, TH_TIMER_EVENT);
|
decide_hold_tap(hold_tap, HT_TIMER_EVENT);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int behavior_tap_hold_init(struct device *dev)
|
static int behavior_hold_tap_init(struct device *dev)
|
||||||
{
|
{
|
||||||
static bool init_first_run = true;
|
static bool init_first_run = true;
|
||||||
|
|
||||||
if (init_first_run) {
|
if (init_first_run) {
|
||||||
for (int i = 0; i < ZMK_BHV_TAP_HOLD_MAX_HELD; i++) {
|
for (int i = 0; i < ZMK_BHV_HOLD_TAP_MAX_HELD; i++) {
|
||||||
k_delayed_work_init(&active_tap_holds[i].work, behavior_tap_hold_timer_work_handler);
|
k_delayed_work_init(&active_hold_taps[i].work, behavior_hold_tap_timer_work_handler);
|
||||||
active_tap_holds[i].position = ZMK_BHV_TAP_HOLD_POSITION_NOT_USED;
|
active_hold_taps[i].position = ZMK_BHV_HOLD_TAP_POSITION_NOT_USED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
init_first_run = false;
|
init_first_run = false;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct behavior_tap_hold_data {};
|
struct behavior_hold_tap_data {};
|
||||||
static struct behavior_tap_hold_data behavior_tap_hold_data;
|
static struct behavior_hold_tap_data behavior_hold_tap_data;
|
||||||
|
|
||||||
/************************************************************ NODE CONFIG */
|
/************************************************************ NODE CONFIG */
|
||||||
#define _TRANSFORM_ENTRY(idx, node) \
|
#define _TRANSFORM_ENTRY(idx, node) \
|
||||||
|
@ -468,22 +468,22 @@ static struct behavior_tap_hold_data behavior_tap_hold_data;
|
||||||
},
|
},
|
||||||
|
|
||||||
#define KP_INST(n) \
|
#define KP_INST(n) \
|
||||||
static k_timeout_t behavior_tap_hold_config_##n##_gettime() { return K_MSEC(DT_INST_PROP(n, tapping_term_ms)); } \
|
static k_timeout_t behavior_hold_tap_config_##n##_gettime() { return K_MSEC(DT_INST_PROP(n, tapping_term_ms)); } \
|
||||||
static struct behavior_tap_hold_behaviors behavior_tap_hold_behaviors_##n = { \
|
static struct behavior_hold_tap_behaviors behavior_hold_tap_behaviors_##n = { \
|
||||||
.hold = _TRANSFORM_ENTRY(0, n) \
|
.hold = _TRANSFORM_ENTRY(0, n) \
|
||||||
.tap = _TRANSFORM_ENTRY(1, n) \
|
.tap = _TRANSFORM_ENTRY(1, n) \
|
||||||
}; \
|
}; \
|
||||||
static struct behavior_tap_hold_config behavior_tap_hold_config_##n = { \
|
static struct behavior_hold_tap_config behavior_hold_tap_config_##n = { \
|
||||||
.behaviors = &behavior_tap_hold_behaviors_##n, \
|
.behaviors = &behavior_hold_tap_behaviors_##n, \
|
||||||
.tapping_term_ms = &behavior_tap_hold_config_##n##_gettime, \
|
.tapping_term_ms = &behavior_hold_tap_config_##n##_gettime, \
|
||||||
.flavor = DT_INST_PROP(n, flavor), \
|
.flavor = DT_INST_PROP(n, flavor), \
|
||||||
}; \
|
}; \
|
||||||
DEVICE_AND_API_INIT( \
|
DEVICE_AND_API_INIT( \
|
||||||
behavior_tap_hold_##n, DT_INST_LABEL(n), behavior_tap_hold_init, \
|
behavior_hold_tap_##n, DT_INST_LABEL(n), behavior_hold_tap_init, \
|
||||||
&behavior_tap_hold_data, \
|
&behavior_hold_tap_data, \
|
||||||
&behavior_tap_hold_config_##n, \
|
&behavior_hold_tap_config_##n, \
|
||||||
APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, \
|
APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, \
|
||||||
&behavior_tap_hold_driver_api);
|
&behavior_hold_tap_driver_api);
|
||||||
|
|
||||||
DT_INST_FOREACH_STATUS_OKAY(KP_INST)
|
DT_INST_FOREACH_STATUS_OKAY(KP_INST)
|
||||||
|
|
4
app/tests/hold-tap/balanced/1/events.patterns
Normal file
4
app/tests/hold-tap/balanced/1/events.patterns
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
s/.*hid_listener_keycode/kp/p
|
||||||
|
s/.*mo_keymap_binding/mo/p
|
||||||
|
s/.*on_hold_tap_binding/ht_binding/p
|
||||||
|
s/.*decide_hold_tap/ht_decide/p
|
5
app/tests/hold-tap/balanced/1/keycode_events.snapshot
Normal file
5
app/tests/hold-tap/balanced/1/keycode_events.snapshot
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
ht_binding_pressed: 0 new undecided hold_tap
|
||||||
|
ht_decide: 0 decided tap (balanced event 0)
|
||||||
|
kp_pressed: usage_page 0x07 keycode 0x09
|
||||||
|
kp_released: usage_page 0x07 keycode 0x09
|
||||||
|
ht_binding_released: 0 cleaning up hold-tap
|
4
app/tests/hold-tap/balanced/2/events.patterns
Normal file
4
app/tests/hold-tap/balanced/2/events.patterns
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
s/.*hid_listener_keycode/kp/p
|
||||||
|
s/.*mo_keymap_binding/mo/p
|
||||||
|
s/.*on_hold_tap_binding/ht_binding/p
|
||||||
|
s/.*decide_hold_tap/ht_decide/p
|
5
app/tests/hold-tap/balanced/2/keycode_events.snapshot
Normal file
5
app/tests/hold-tap/balanced/2/keycode_events.snapshot
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
ht_binding_pressed: 0 new undecided hold_tap
|
||||||
|
ht_decide: 0 decided hold (balanced event 3)
|
||||||
|
kp_pressed: usage_page 0x07 keycode 0xe1
|
||||||
|
kp_released: usage_page 0x07 keycode 0xe1
|
||||||
|
ht_binding_released: 0 cleaning up hold-tap
|
4
app/tests/hold-tap/balanced/3a/events.patterns
Normal file
4
app/tests/hold-tap/balanced/3a/events.patterns
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
s/.*hid_listener_keycode/kp/p
|
||||||
|
s/.*mo_keymap_binding/mo/p
|
||||||
|
s/.*on_hold_tap_binding/ht_binding/p
|
||||||
|
s/.*decide_hold_tap/ht_decide/p
|
|
@ -1,7 +1,7 @@
|
||||||
kp_pressed: usage_page 0x07 keycode 0xe4
|
kp_pressed: usage_page 0x07 keycode 0xe4
|
||||||
th_binding_pressed: 0 new undecided tap_hold
|
ht_binding_pressed: 0 new undecided hold_tap
|
||||||
kp_released: usage_page 0x07 keycode 0xe4
|
kp_released: usage_page 0x07 keycode 0xe4
|
||||||
th_decide: 0 decided tap (balanced event 0)
|
ht_decide: 0 decided tap (balanced event 0)
|
||||||
kp_pressed: usage_page 0x07 keycode 0x09
|
kp_pressed: usage_page 0x07 keycode 0x09
|
||||||
kp_released: usage_page 0x07 keycode 0x09
|
kp_released: usage_page 0x07 keycode 0x09
|
||||||
th_binding_released: 0 cleaning up tap-hold
|
ht_binding_released: 0 cleaning up hold-tap
|
4
app/tests/hold-tap/balanced/3b/events.patterns
Normal file
4
app/tests/hold-tap/balanced/3b/events.patterns
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
s/.*hid_listener_keycode/kp/p
|
||||||
|
s/.*mo_keymap_binding/mo/p
|
||||||
|
s/.*on_hold_tap_binding/ht_binding/p
|
||||||
|
s/.*decide_hold_tap/ht_decide/p
|
|
@ -1,7 +1,7 @@
|
||||||
kp_pressed: usage_page 0x07 keycode 0xe4
|
kp_pressed: usage_page 0x07 keycode 0xe4
|
||||||
th_binding_pressed: 0 new undecided tap_hold
|
ht_binding_pressed: 0 new undecided hold_tap
|
||||||
th_decide: 0 decided hold (balanced event 3)
|
ht_decide: 0 decided hold (balanced event 3)
|
||||||
kp_pressed: usage_page 0x07 keycode 0xe1
|
kp_pressed: usage_page 0x07 keycode 0xe1
|
||||||
kp_released: usage_page 0x07 keycode 0xe4
|
kp_released: usage_page 0x07 keycode 0xe4
|
||||||
kp_released: usage_page 0x07 keycode 0xe1
|
kp_released: usage_page 0x07 keycode 0xe1
|
||||||
th_binding_released: 0 cleaning up tap-hold
|
ht_binding_released: 0 cleaning up hold-tap
|
4
app/tests/hold-tap/balanced/3c/events.patterns
Normal file
4
app/tests/hold-tap/balanced/3c/events.patterns
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
s/.*hid_listener_keycode/kp/p
|
||||||
|
s/.*mo_keymap_binding/mo/p
|
||||||
|
s/.*on_hold_tap_binding/ht_binding/p
|
||||||
|
s/.*decide_hold_tap/ht_decide/p
|
|
@ -1,7 +1,7 @@
|
||||||
kp_pressed: usage_page 0x07 keycode 0x07
|
kp_pressed: usage_page 0x07 keycode 0x07
|
||||||
th_binding_pressed: 0 new undecided tap_hold
|
ht_binding_pressed: 0 new undecided hold_tap
|
||||||
kp_released: usage_page 0x07 keycode 0x07
|
kp_released: usage_page 0x07 keycode 0x07
|
||||||
th_decide: 0 decided tap (balanced event 0)
|
ht_decide: 0 decided tap (balanced event 0)
|
||||||
kp_pressed: usage_page 0x07 keycode 0x09
|
kp_pressed: usage_page 0x07 keycode 0x09
|
||||||
kp_released: usage_page 0x07 keycode 0x09
|
kp_released: usage_page 0x07 keycode 0x09
|
||||||
th_binding_released: 0 cleaning up tap-hold
|
ht_binding_released: 0 cleaning up hold-tap
|
4
app/tests/hold-tap/balanced/3d/events.patterns
Normal file
4
app/tests/hold-tap/balanced/3d/events.patterns
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
s/.*hid_listener_keycode/kp/p
|
||||||
|
s/.*mo_keymap_binding/mo/p
|
||||||
|
s/.*on_hold_tap_binding/ht_binding/p
|
||||||
|
s/.*decide_hold_tap/ht_decide/p
|
|
@ -1,7 +1,7 @@
|
||||||
th_binding_pressed: 0 new undecided tap_hold
|
|
||||||
th_decide: 0 decided hold (balanced event 3)
|
|
||||||
kp_pressed: usage_page 0x07 keycode 0xe1
|
|
||||||
kp_pressed: usage_page 0x07 keycode 0x07
|
kp_pressed: usage_page 0x07 keycode 0x07
|
||||||
|
ht_binding_pressed: 0 new undecided hold_tap
|
||||||
kp_released: usage_page 0x07 keycode 0x07
|
kp_released: usage_page 0x07 keycode 0x07
|
||||||
|
ht_decide: 0 decided hold (balanced event 3)
|
||||||
|
kp_pressed: usage_page 0x07 keycode 0xe1
|
||||||
kp_released: usage_page 0x07 keycode 0xe1
|
kp_released: usage_page 0x07 keycode 0xe1
|
||||||
th_binding_released: 0 cleaning up tap-hold
|
ht_binding_released: 0 cleaning up hold-tap
|
4
app/tests/hold-tap/balanced/4a-nested/events.patterns
Normal file
4
app/tests/hold-tap/balanced/4a-nested/events.patterns
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
s/.*hid_listener_keycode/kp/p
|
||||||
|
s/.*mo_keymap_binding/mo/p
|
||||||
|
s/.*on_hold_tap_binding/ht_binding/p
|
||||||
|
s/.*decide_hold_tap/ht_decide/p
|
|
@ -0,0 +1,10 @@
|
||||||
|
ht_binding_pressed: 0 new undecided hold_tap
|
||||||
|
ht_decide: 0 decided hold (balanced event 3)
|
||||||
|
kp_pressed: usage_page 0x07 keycode 0xe1
|
||||||
|
ht_binding_pressed: 1 new undecided hold_tap
|
||||||
|
ht_decide: 1 decided tap (balanced event 0)
|
||||||
|
kp_pressed: usage_page 0x07 keycode 0x0d
|
||||||
|
kp_released: usage_page 0x07 keycode 0x0d
|
||||||
|
ht_binding_released: 1 cleaning up hold-tap
|
||||||
|
kp_released: usage_page 0x07 keycode 0xe1
|
||||||
|
ht_binding_released: 0 cleaning up hold-tap
|
4
app/tests/hold-tap/balanced/4a/events.patterns
Normal file
4
app/tests/hold-tap/balanced/4a/events.patterns
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
s/.*hid_listener_keycode/kp/p
|
||||||
|
s/.*mo_keymap_binding/mo/p
|
||||||
|
s/.*on_hold_tap_binding/ht_binding/p
|
||||||
|
s/.*decide_hold_tap/ht_decide/p
|
|
@ -1,7 +1,7 @@
|
||||||
th_binding_pressed: 0 new undecided tap_hold
|
ht_binding_pressed: 0 new undecided hold_tap
|
||||||
th_decide: 0 decided hold (balanced event 2)
|
ht_decide: 0 decided hold (balanced event 3)
|
||||||
kp_pressed: usage_page 0x07 keycode 0xe1
|
kp_pressed: usage_page 0x07 keycode 0xe1
|
||||||
kp_pressed: usage_page 0x07 keycode 0x07
|
kp_pressed: usage_page 0x07 keycode 0x07
|
||||||
kp_released: usage_page 0x07 keycode 0x07
|
kp_released: usage_page 0x07 keycode 0x07
|
||||||
kp_released: usage_page 0x07 keycode 0xe1
|
kp_released: usage_page 0x07 keycode 0xe1
|
||||||
th_binding_released: 0 cleaning up tap-hold
|
ht_binding_released: 0 cleaning up hold-tap
|
4
app/tests/hold-tap/balanced/4b/events.patterns
Normal file
4
app/tests/hold-tap/balanced/4b/events.patterns
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
s/.*hid_listener_keycode/kp/p
|
||||||
|
s/.*mo_keymap_binding/mo/p
|
||||||
|
s/.*on_hold_tap_binding/ht_binding/p
|
||||||
|
s/.*decide_hold_tap/ht_decide/p
|
|
@ -1,7 +1,7 @@
|
||||||
kp_pressed: usage_page 0x07 keycode 0x07
|
ht_binding_pressed: 0 new undecided hold_tap
|
||||||
th_binding_pressed: 0 new undecided tap_hold
|
ht_decide: 0 decided hold (balanced event 2)
|
||||||
kp_released: usage_page 0x07 keycode 0x07
|
|
||||||
th_decide: 0 decided hold (balanced event 3)
|
|
||||||
kp_pressed: usage_page 0x07 keycode 0xe1
|
kp_pressed: usage_page 0x07 keycode 0xe1
|
||||||
|
kp_pressed: usage_page 0x07 keycode 0x07
|
||||||
|
kp_released: usage_page 0x07 keycode 0x07
|
||||||
kp_released: usage_page 0x07 keycode 0xe1
|
kp_released: usage_page 0x07 keycode 0xe1
|
||||||
th_binding_released: 0 cleaning up tap-hold
|
ht_binding_released: 0 cleaning up hold-tap
|
4
app/tests/hold-tap/balanced/4c/events.patterns
Normal file
4
app/tests/hold-tap/balanced/4c/events.patterns
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
s/.*hid_listener_keycode/kp/p
|
||||||
|
s/.*mo_keymap_binding/mo/p
|
||||||
|
s/.*on_hold_tap_binding/ht_binding/p
|
||||||
|
s/.*decide_hold_tap/ht_decide/p
|
|
@ -1,7 +1,7 @@
|
||||||
th_binding_pressed: 0 new undecided tap_hold
|
ht_binding_pressed: 0 new undecided hold_tap
|
||||||
th_decide: 0 decided hold (balanced event 2)
|
ht_decide: 0 decided hold (balanced event 2)
|
||||||
kp_pressed: usage_page 0x07 keycode 0xe1
|
kp_pressed: usage_page 0x07 keycode 0xe1
|
||||||
kp_pressed: usage_page 0x07 keycode 0x07
|
kp_pressed: usage_page 0x07 keycode 0x07
|
||||||
kp_released: usage_page 0x07 keycode 0x07
|
kp_released: usage_page 0x07 keycode 0x07
|
||||||
kp_released: usage_page 0x07 keycode 0xe1
|
kp_released: usage_page 0x07 keycode 0xe1
|
||||||
th_binding_released: 0 cleaning up tap-hold
|
ht_binding_released: 0 cleaning up hold-tap
|
4
app/tests/hold-tap/balanced/4d/events.patterns
Normal file
4
app/tests/hold-tap/balanced/4d/events.patterns
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
s/.*hid_listener_keycode/kp/p
|
||||||
|
s/.*mo_keymap_binding/mo/p
|
||||||
|
s/.*on_hold_tap_binding/ht_binding/p
|
||||||
|
s/.*decide_hold_tap/ht_decide/p
|
|
@ -1,7 +1,7 @@
|
||||||
th_binding_pressed: 0 new undecided tap_hold
|
ht_binding_pressed: 0 new undecided hold_tap
|
||||||
th_decide: 0 decided tap (balanced event 0)
|
ht_decide: 0 decided tap (balanced event 0)
|
||||||
kp_pressed: usage_page 0x07 keycode 0x09
|
kp_pressed: usage_page 0x07 keycode 0x09
|
||||||
kp_pressed: usage_page 0x07 keycode 0x07
|
kp_pressed: usage_page 0x07 keycode 0x07
|
||||||
kp_released: usage_page 0x07 keycode 0x09
|
kp_released: usage_page 0x07 keycode 0x09
|
||||||
th_binding_released: 0 cleaning up tap-hold
|
ht_binding_released: 0 cleaning up hold-tap
|
||||||
kp_released: usage_page 0x07 keycode 0x07
|
kp_released: usage_page 0x07 keycode 0x07
|
27
app/tests/hold-tap/balanced/behavior_keymap.dtsi
Normal file
27
app/tests/hold-tap/balanced/behavior_keymap.dtsi
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
#include <dt-bindings/zmk/keys.h>
|
||||||
|
#include <behaviors.dtsi>
|
||||||
|
#include <dt-bindings/zmk/kscan-mock.h>
|
||||||
|
|
||||||
|
/ {
|
||||||
|
behaviors {
|
||||||
|
ht_bal: behavior_hold_tap_balanced {
|
||||||
|
compatible = "zmk,behavior-hold-tap";
|
||||||
|
label = "HOLD_TAP_BALANCED";
|
||||||
|
#binding-cells = <2>;
|
||||||
|
flavor = "balanced";
|
||||||
|
tapping_term_ms = <300>;
|
||||||
|
bindings = <&kp>, <&kp>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
keymap {
|
||||||
|
compatible = "zmk,keymap";
|
||||||
|
label ="Default keymap";
|
||||||
|
|
||||||
|
default_layer {
|
||||||
|
bindings = <
|
||||||
|
&ht_bal LSFT F &ht_bal LCTL J
|
||||||
|
&kp D &kp RCTL>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
4
app/tests/hold-tap/hold-preferred/1/events.patterns
Normal file
4
app/tests/hold-tap/hold-preferred/1/events.patterns
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
s/.*hid_listener_keycode/kp/p
|
||||||
|
s/.*mo_keymap_binding/mo/p
|
||||||
|
s/.*on_hold_tap_binding/ht_binding/p
|
||||||
|
s/.*decide_hold_tap/ht_decide/p
|
|
@ -0,0 +1,5 @@
|
||||||
|
ht_binding_pressed: 0 new undecided hold_tap
|
||||||
|
ht_decide: 0 decided tap (hold-preferred event 0)
|
||||||
|
kp_pressed: usage_page 0x07 keycode 0x09
|
||||||
|
kp_released: usage_page 0x07 keycode 0x09
|
||||||
|
ht_binding_released: 0 cleaning up hold-tap
|
4
app/tests/hold-tap/hold-preferred/2/events.patterns
Normal file
4
app/tests/hold-tap/hold-preferred/2/events.patterns
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
s/.*hid_listener_keycode/kp/p
|
||||||
|
s/.*mo_keymap_binding/mo/p
|
||||||
|
s/.*on_hold_tap_binding/ht_binding/p
|
||||||
|
s/.*decide_hold_tap/ht_decide/p
|
|
@ -0,0 +1,5 @@
|
||||||
|
ht_binding_pressed: 0 new undecided hold_tap
|
||||||
|
ht_decide: 0 decided hold (hold-preferred event 3)
|
||||||
|
kp_pressed: usage_page 0x07 keycode 0xe1
|
||||||
|
kp_released: usage_page 0x07 keycode 0xe1
|
||||||
|
ht_binding_released: 0 cleaning up hold-tap
|
4
app/tests/hold-tap/hold-preferred/3a/events.patterns
Normal file
4
app/tests/hold-tap/hold-preferred/3a/events.patterns
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
s/.*hid_listener_keycode/kp/p
|
||||||
|
s/.*mo_keymap_binding/mo/p
|
||||||
|
s/.*on_hold_tap_binding/ht_binding/p
|
||||||
|
s/.*decide_hold_tap/ht_decide/p
|
|
@ -1,7 +1,7 @@
|
||||||
kp_pressed: usage_page 0x07 keycode 0xe4
|
kp_pressed: usage_page 0x07 keycode 0xe4
|
||||||
th_binding_pressed: 0 new undecided tap_hold
|
ht_binding_pressed: 0 new undecided hold_tap
|
||||||
th_decide: 0 decided tap (hold-preferred event 0)
|
ht_decide: 0 decided tap (hold-preferred event 0)
|
||||||
kp_pressed: usage_page 0x07 keycode 0x09
|
kp_pressed: usage_page 0x07 keycode 0x09
|
||||||
kp_released: usage_page 0x07 keycode 0xe4
|
kp_released: usage_page 0x07 keycode 0xe4
|
||||||
kp_released: usage_page 0x07 keycode 0x09
|
kp_released: usage_page 0x07 keycode 0x09
|
||||||
th_binding_released: 0 cleaning up tap-hold
|
ht_binding_released: 0 cleaning up hold-tap
|
4
app/tests/hold-tap/hold-preferred/3b/events.patterns
Normal file
4
app/tests/hold-tap/hold-preferred/3b/events.patterns
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
s/.*hid_listener_keycode/kp/p
|
||||||
|
s/.*mo_keymap_binding/mo/p
|
||||||
|
s/.*on_hold_tap_binding/ht_binding/p
|
||||||
|
s/.*decide_hold_tap/ht_decide/p
|
|
@ -1,7 +1,7 @@
|
||||||
kp_pressed: usage_page 0x07 keycode 0xe4
|
kp_pressed: usage_page 0x07 keycode 0xe4
|
||||||
th_binding_pressed: 0 new undecided tap_hold
|
ht_binding_pressed: 0 new undecided hold_tap
|
||||||
th_decide: 0 decided hold (hold-preferred event 3)
|
ht_decide: 0 decided hold (hold-preferred event 3)
|
||||||
kp_pressed: usage_page 0x07 keycode 0xe1
|
kp_pressed: usage_page 0x07 keycode 0xe1
|
||||||
kp_released: usage_page 0x07 keycode 0xe4
|
kp_released: usage_page 0x07 keycode 0xe4
|
||||||
kp_released: usage_page 0x07 keycode 0xe1
|
kp_released: usage_page 0x07 keycode 0xe1
|
||||||
th_binding_released: 0 cleaning up tap-hold
|
ht_binding_released: 0 cleaning up hold-tap
|
4
app/tests/hold-tap/hold-preferred/3c/events.patterns
Normal file
4
app/tests/hold-tap/hold-preferred/3c/events.patterns
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
s/.*hid_listener_keycode/kp/p
|
||||||
|
s/.*mo_keymap_binding/mo/p
|
||||||
|
s/.*on_hold_tap_binding/ht_binding/p
|
||||||
|
s/.*decide_hold_tap/ht_decide/p
|
|
@ -1,7 +1,7 @@
|
||||||
kp_pressed: usage_page 0x07 keycode 0x07
|
kp_pressed: usage_page 0x07 keycode 0x07
|
||||||
th_binding_pressed: 0 new undecided tap_hold
|
ht_binding_pressed: 0 new undecided hold_tap
|
||||||
kp_released: usage_page 0x07 keycode 0x07
|
kp_released: usage_page 0x07 keycode 0x07
|
||||||
th_decide: 0 decided tap (hold-preferred event 0)
|
ht_decide: 0 decided tap (hold-preferred event 0)
|
||||||
kp_pressed: usage_page 0x07 keycode 0x09
|
kp_pressed: usage_page 0x07 keycode 0x09
|
||||||
kp_released: usage_page 0x07 keycode 0x09
|
kp_released: usage_page 0x07 keycode 0x09
|
||||||
th_binding_released: 0 cleaning up tap-hold
|
ht_binding_released: 0 cleaning up hold-tap
|
4
app/tests/hold-tap/hold-preferred/3d/events.patterns
Normal file
4
app/tests/hold-tap/hold-preferred/3d/events.patterns
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
s/.*hid_listener_keycode/kp/p
|
||||||
|
s/.*mo_keymap_binding/mo/p
|
||||||
|
s/.*on_hold_tap_binding/ht_binding/p
|
||||||
|
s/.*decide_hold_tap/ht_decide/p
|
|
@ -0,0 +1,7 @@
|
||||||
|
kp_pressed: usage_page 0x07 keycode 0x07
|
||||||
|
ht_binding_pressed: 0 new undecided hold_tap
|
||||||
|
kp_released: usage_page 0x07 keycode 0x07
|
||||||
|
ht_decide: 0 decided hold (hold-preferred event 3)
|
||||||
|
kp_pressed: usage_page 0x07 keycode 0xe1
|
||||||
|
kp_released: usage_page 0x07 keycode 0xe1
|
||||||
|
ht_binding_released: 0 cleaning up hold-tap
|
|
@ -0,0 +1,4 @@
|
||||||
|
s/.*hid_listener_keycode/kp/p
|
||||||
|
s/.*mo_keymap_binding/mo/p
|
||||||
|
s/.*on_hold_tap_binding/ht_binding/p
|
||||||
|
s/.*decide_hold_tap/ht_decide/p
|
|
@ -0,0 +1,10 @@
|
||||||
|
ht_binding_pressed: 0 new undecided hold_tap
|
||||||
|
ht_decide: 0 decided hold (hold-preferred event 1)
|
||||||
|
kp_pressed: usage_page 0x07 keycode 0xe1
|
||||||
|
ht_binding_pressed: 1 new undecided hold_tap
|
||||||
|
ht_decide: 1 decided tap (hold-preferred event 0)
|
||||||
|
kp_pressed: usage_page 0x07 keycode 0x0d
|
||||||
|
kp_released: usage_page 0x07 keycode 0x0d
|
||||||
|
ht_binding_released: 1 cleaning up hold-tap
|
||||||
|
kp_released: usage_page 0x07 keycode 0xe1
|
||||||
|
ht_binding_released: 0 cleaning up hold-tap
|
4
app/tests/hold-tap/hold-preferred/4a/events.patterns
Normal file
4
app/tests/hold-tap/hold-preferred/4a/events.patterns
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
s/.*hid_listener_keycode/kp/p
|
||||||
|
s/.*mo_keymap_binding/mo/p
|
||||||
|
s/.*on_hold_tap_binding/ht_binding/p
|
||||||
|
s/.*decide_hold_tap/ht_decide/p
|
|
@ -0,0 +1,7 @@
|
||||||
|
ht_binding_pressed: 0 new undecided hold_tap
|
||||||
|
ht_decide: 0 decided hold (hold-preferred event 1)
|
||||||
|
kp_pressed: usage_page 0x07 keycode 0xe1
|
||||||
|
kp_pressed: usage_page 0x07 keycode 0x07
|
||||||
|
kp_released: usage_page 0x07 keycode 0x07
|
||||||
|
kp_released: usage_page 0x07 keycode 0xe1
|
||||||
|
ht_binding_released: 0 cleaning up hold-tap
|
4
app/tests/hold-tap/hold-preferred/4b/events.patterns
Normal file
4
app/tests/hold-tap/hold-preferred/4b/events.patterns
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
s/.*hid_listener_keycode/kp/p
|
||||||
|
s/.*mo_keymap_binding/mo/p
|
||||||
|
s/.*on_hold_tap_binding/ht_binding/p
|
||||||
|
s/.*decide_hold_tap/ht_decide/p
|
|
@ -0,0 +1,7 @@
|
||||||
|
ht_binding_pressed: 0 new undecided hold_tap
|
||||||
|
ht_decide: 0 decided hold (hold-preferred event 1)
|
||||||
|
kp_pressed: usage_page 0x07 keycode 0xe1
|
||||||
|
kp_pressed: usage_page 0x07 keycode 0x07
|
||||||
|
kp_released: usage_page 0x07 keycode 0x07
|
||||||
|
kp_released: usage_page 0x07 keycode 0xe1
|
||||||
|
ht_binding_released: 0 cleaning up hold-tap
|
4
app/tests/hold-tap/hold-preferred/4c/events.patterns
Normal file
4
app/tests/hold-tap/hold-preferred/4c/events.patterns
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
s/.*hid_listener_keycode/kp/p
|
||||||
|
s/.*mo_keymap_binding/mo/p
|
||||||
|
s/.*on_hold_tap_binding/ht_binding/p
|
||||||
|
s/.*decide_hold_tap/ht_decide/p
|
|
@ -0,0 +1,7 @@
|
||||||
|
ht_binding_pressed: 0 new undecided hold_tap
|
||||||
|
ht_decide: 0 decided hold (hold-preferred event 1)
|
||||||
|
kp_pressed: usage_page 0x07 keycode 0xe1
|
||||||
|
kp_pressed: usage_page 0x07 keycode 0x07
|
||||||
|
kp_released: usage_page 0x07 keycode 0x07
|
||||||
|
kp_released: usage_page 0x07 keycode 0xe1
|
||||||
|
ht_binding_released: 0 cleaning up hold-tap
|
4
app/tests/hold-tap/hold-preferred/4d/events.patterns
Normal file
4
app/tests/hold-tap/hold-preferred/4d/events.patterns
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
s/.*hid_listener_keycode/kp/p
|
||||||
|
s/.*mo_keymap_binding/mo/p
|
||||||
|
s/.*on_hold_tap_binding/ht_binding/p
|
||||||
|
s/.*decide_hold_tap/ht_decide/p
|
|
@ -0,0 +1,7 @@
|
||||||
|
ht_binding_pressed: 0 new undecided hold_tap
|
||||||
|
ht_decide: 0 decided hold (hold-preferred event 1)
|
||||||
|
kp_pressed: usage_page 0x07 keycode 0xe1
|
||||||
|
kp_pressed: usage_page 0x07 keycode 0x07
|
||||||
|
kp_released: usage_page 0x07 keycode 0xe1
|
||||||
|
ht_binding_released: 0 cleaning up hold-tap
|
||||||
|
kp_released: usage_page 0x07 keycode 0x07
|
29
app/tests/hold-tap/hold-preferred/behavior_keymap.dtsi
Normal file
29
app/tests/hold-tap/hold-preferred/behavior_keymap.dtsi
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
#include <dt-bindings/zmk/keys.h>
|
||||||
|
#include <behaviors.dtsi>
|
||||||
|
#include <dt-bindings/zmk/kscan-mock.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/ {
|
||||||
|
behaviors {
|
||||||
|
ht_hold: behavior_hold_hold_tap {
|
||||||
|
compatible = "zmk,behavior-hold-tap";
|
||||||
|
label = "hold_hold_tap";
|
||||||
|
#binding-cells = <2>;
|
||||||
|
flavor = "hold-preferred";
|
||||||
|
tapping_term_ms = <300>;
|
||||||
|
bindings = <&kp>, <&kp>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
keymap {
|
||||||
|
compatible = "zmk,keymap";
|
||||||
|
label ="Default keymap";
|
||||||
|
|
||||||
|
default_layer {
|
||||||
|
bindings = <
|
||||||
|
&ht_hold LSFT F &ht_hold LCTL J
|
||||||
|
&kp D &kp RCTL>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
4
app/tests/hold-tap/tap-preferred/1/events.patterns
Normal file
4
app/tests/hold-tap/tap-preferred/1/events.patterns
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
s/.*hid_listener_keycode/kp/p
|
||||||
|
s/.*mo_keymap_binding/mo/p
|
||||||
|
s/.*on_hold_tap_binding/ht_binding/p
|
||||||
|
s/.*decide_hold_tap/ht_decide/p
|
|
@ -0,0 +1,5 @@
|
||||||
|
ht_binding_pressed: 0 new undecided hold_tap
|
||||||
|
ht_decide: 0 decided tap (tap-preferred event 0)
|
||||||
|
kp_pressed: usage_page 0x07 keycode 0x09
|
||||||
|
kp_released: usage_page 0x07 keycode 0x09
|
||||||
|
ht_binding_released: 0 cleaning up hold-tap
|
4
app/tests/hold-tap/tap-preferred/2/events.patterns
Normal file
4
app/tests/hold-tap/tap-preferred/2/events.patterns
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
s/.*hid_listener_keycode/kp/p
|
||||||
|
s/.*mo_keymap_binding/mo/p
|
||||||
|
s/.*on_hold_tap_binding/ht_binding/p
|
||||||
|
s/.*decide_hold_tap/ht_decide/p
|
|
@ -0,0 +1,5 @@
|
||||||
|
ht_binding_pressed: 0 new undecided hold_tap
|
||||||
|
ht_decide: 0 decided hold (tap-preferred event 3)
|
||||||
|
kp_pressed: usage_page 0x07 keycode 0xe1
|
||||||
|
kp_released: usage_page 0x07 keycode 0xe1
|
||||||
|
ht_binding_released: 0 cleaning up hold-tap
|
4
app/tests/hold-tap/tap-preferred/3a/events.patterns
Normal file
4
app/tests/hold-tap/tap-preferred/3a/events.patterns
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
s/.*hid_listener_keycode/kp/p
|
||||||
|
s/.*mo_keymap_binding/mo/p
|
||||||
|
s/.*on_hold_tap_binding/ht_binding/p
|
||||||
|
s/.*decide_hold_tap/ht_decide/p
|
|
@ -1,7 +1,7 @@
|
||||||
kp_pressed: usage_page 0x07 keycode 0xe4
|
kp_pressed: usage_page 0x07 keycode 0xe4
|
||||||
th_binding_pressed: 0 new undecided tap_hold
|
ht_binding_pressed: 0 new undecided hold_tap
|
||||||
th_decide: 0 decided tap (tap-preferred event 0)
|
ht_decide: 0 decided tap (tap-preferred event 0)
|
||||||
kp_pressed: usage_page 0x07 keycode 0x09
|
kp_pressed: usage_page 0x07 keycode 0x09
|
||||||
kp_released: usage_page 0x07 keycode 0xe4
|
kp_released: usage_page 0x07 keycode 0xe4
|
||||||
kp_released: usage_page 0x07 keycode 0x09
|
kp_released: usage_page 0x07 keycode 0x09
|
||||||
th_binding_released: 0 cleaning up tap-hold
|
ht_binding_released: 0 cleaning up hold-tap
|
4
app/tests/hold-tap/tap-preferred/3b/events.patterns
Normal file
4
app/tests/hold-tap/tap-preferred/3b/events.patterns
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
s/.*hid_listener_keycode/kp/p
|
||||||
|
s/.*mo_keymap_binding/mo/p
|
||||||
|
s/.*on_hold_tap_binding/ht_binding/p
|
||||||
|
s/.*decide_hold_tap/ht_decide/p
|
|
@ -1,7 +1,7 @@
|
||||||
kp_pressed: usage_page 0x07 keycode 0xe4
|
kp_pressed: usage_page 0x07 keycode 0xe4
|
||||||
th_binding_pressed: 0 new undecided tap_hold
|
ht_binding_pressed: 0 new undecided hold_tap
|
||||||
th_decide: 0 decided hold (tap-preferred event 3)
|
ht_decide: 0 decided hold (tap-preferred event 3)
|
||||||
kp_pressed: usage_page 0x07 keycode 0xe1
|
kp_pressed: usage_page 0x07 keycode 0xe1
|
||||||
kp_released: usage_page 0x07 keycode 0xe4
|
kp_released: usage_page 0x07 keycode 0xe4
|
||||||
kp_released: usage_page 0x07 keycode 0xe1
|
kp_released: usage_page 0x07 keycode 0xe1
|
||||||
th_binding_released: 0 cleaning up tap-hold
|
ht_binding_released: 0 cleaning up hold-tap
|
4
app/tests/hold-tap/tap-preferred/3c/events.patterns
Normal file
4
app/tests/hold-tap/tap-preferred/3c/events.patterns
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
s/.*hid_listener_keycode/kp/p
|
||||||
|
s/.*mo_keymap_binding/mo/p
|
||||||
|
s/.*on_hold_tap_binding/ht_binding/p
|
||||||
|
s/.*decide_hold_tap/ht_decide/p
|
|
@ -1,7 +1,7 @@
|
||||||
th_binding_pressed: 0 new undecided tap_hold
|
|
||||||
th_decide: 0 decided tap (tap-preferred event 0)
|
|
||||||
kp_pressed: usage_page 0x07 keycode 0x09
|
|
||||||
kp_pressed: usage_page 0x07 keycode 0x07
|
kp_pressed: usage_page 0x07 keycode 0x07
|
||||||
|
ht_binding_pressed: 0 new undecided hold_tap
|
||||||
kp_released: usage_page 0x07 keycode 0x07
|
kp_released: usage_page 0x07 keycode 0x07
|
||||||
|
ht_decide: 0 decided tap (tap-preferred event 0)
|
||||||
|
kp_pressed: usage_page 0x07 keycode 0x09
|
||||||
kp_released: usage_page 0x07 keycode 0x09
|
kp_released: usage_page 0x07 keycode 0x09
|
||||||
th_binding_released: 0 cleaning up tap-hold
|
ht_binding_released: 0 cleaning up hold-tap
|
4
app/tests/hold-tap/tap-preferred/3d/events.patterns
Normal file
4
app/tests/hold-tap/tap-preferred/3d/events.patterns
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
s/.*hid_listener_keycode/kp/p
|
||||||
|
s/.*mo_keymap_binding/mo/p
|
||||||
|
s/.*on_hold_tap_binding/ht_binding/p
|
||||||
|
s/.*decide_hold_tap/ht_decide/p
|
|
@ -0,0 +1,7 @@
|
||||||
|
kp_pressed: usage_page 0x07 keycode 0x07
|
||||||
|
ht_binding_pressed: 0 new undecided hold_tap
|
||||||
|
kp_released: usage_page 0x07 keycode 0x07
|
||||||
|
ht_decide: 0 decided hold (tap-preferred event 3)
|
||||||
|
kp_pressed: usage_page 0x07 keycode 0xe1
|
||||||
|
kp_released: usage_page 0x07 keycode 0xe1
|
||||||
|
ht_binding_released: 0 cleaning up hold-tap
|
|
@ -0,0 +1,4 @@
|
||||||
|
s/.*hid_listener_keycode/kp/p
|
||||||
|
s/.*mo_keymap_binding/mo/p
|
||||||
|
s/.*on_hold_tap_binding/ht_binding/p
|
||||||
|
s/.*decide_hold_tap/ht_decide/p
|
|
@ -0,0 +1,10 @@
|
||||||
|
ht_binding_pressed: 0 new undecided hold_tap
|
||||||
|
ht_decide: 0 decided hold (tap-preferred event 3)
|
||||||
|
kp_pressed: usage_page 0x07 keycode 0xe1
|
||||||
|
ht_binding_pressed: 1 new undecided hold_tap
|
||||||
|
ht_decide: 1 decided tap (tap-preferred event 0)
|
||||||
|
kp_pressed: usage_page 0x07 keycode 0x0d
|
||||||
|
kp_released: usage_page 0x07 keycode 0x0d
|
||||||
|
ht_binding_released: 1 cleaning up hold-tap
|
||||||
|
kp_released: usage_page 0x07 keycode 0xe1
|
||||||
|
ht_binding_released: 0 cleaning up hold-tap
|
4
app/tests/hold-tap/tap-preferred/4a/events.patterns
Normal file
4
app/tests/hold-tap/tap-preferred/4a/events.patterns
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
s/.*hid_listener_keycode/kp/p
|
||||||
|
s/.*mo_keymap_binding/mo/p
|
||||||
|
s/.*on_hold_tap_binding/ht_binding/p
|
||||||
|
s/.*decide_hold_tap/ht_decide/p
|
|
@ -0,0 +1,7 @@
|
||||||
|
ht_binding_pressed: 0 new undecided hold_tap
|
||||||
|
ht_decide: 0 decided hold (tap-preferred event 3)
|
||||||
|
kp_pressed: usage_page 0x07 keycode 0xe1
|
||||||
|
kp_pressed: usage_page 0x07 keycode 0x07
|
||||||
|
kp_released: usage_page 0x07 keycode 0x07
|
||||||
|
kp_released: usage_page 0x07 keycode 0xe1
|
||||||
|
ht_binding_released: 0 cleaning up hold-tap
|
4
app/tests/hold-tap/tap-preferred/4b/events.patterns
Normal file
4
app/tests/hold-tap/tap-preferred/4b/events.patterns
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
s/.*hid_listener_keycode/kp/p
|
||||||
|
s/.*mo_keymap_binding/mo/p
|
||||||
|
s/.*on_hold_tap_binding/ht_binding/p
|
||||||
|
s/.*decide_hold_tap/ht_decide/p
|
|
@ -0,0 +1,7 @@
|
||||||
|
ht_binding_pressed: 0 new undecided hold_tap
|
||||||
|
ht_decide: 0 decided hold (tap-preferred event 3)
|
||||||
|
kp_pressed: usage_page 0x07 keycode 0xe1
|
||||||
|
kp_pressed: usage_page 0x07 keycode 0x07
|
||||||
|
kp_released: usage_page 0x07 keycode 0x07
|
||||||
|
kp_released: usage_page 0x07 keycode 0xe1
|
||||||
|
ht_binding_released: 0 cleaning up hold-tap
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue