initial implementation for modifiers

https://github.com/zmkfirmware/zmk/issues/86
This commit is contained in:
Okke Formsma 2020-09-02 22:30:09 +02:00 committed by Pete Johanson
parent a9e729b427
commit 4f258efbf1
77 changed files with 597 additions and 229 deletions

View file

@ -3,7 +3,6 @@
* *
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
*/ */
#pragma once #pragma once
#define USAGE_KEYPAD 0x07 #define USAGE_KEYPAD 0x07
@ -144,11 +143,24 @@
#define M_VOLU 0xE9 #define M_VOLU 0xE9
#define M_VOLD 0xEA #define M_VOLD 0xEA
#define MOD_LCTL (1 << 0x00) #define MOD_LCTL 0x01
#define MOD_LSFT (1 << 0x01) #define MOD_LSFT 0x02
#define MOD_LALT (1 << 0x02) #define MOD_LALT 0x04
#define MOD_LGUI (1 << 0x03) #define MOD_LGUI 0x08
#define MOD_RCTL (1 << 0x04) #define MOD_RCTL 0x10
#define MOD_RSFT (1 << 0x05) #define MOD_RSFT 0x20
#define MOD_RALT (1 << 0x06) #define MOD_RALT 0x40
#define MOD_RGUI (1 << 0x07) #define MOD_RGUI 0x80
#define SELECT_MODS(keycode) (keycode >> 24)
#define STRIP_MODS(keycode) (keycode & ~(0xFF << 24))
#define APPLY_MODS(mods, keycode) (mods << 24 | keycode)
#define LC(keycode) APPLY_MODS(MOD_LCTL, keycode)
#define LS(keycode) APPLY_MODS(MOD_LSFT, keycode)
#define LA(keycode) APPLY_MODS(MOD_LALT, keycode)
#define LG(keycode) APPLY_MODS(MOD_LGUI, keycode)
#define RC(keycode) APPLY_MODS(MOD_RCTL, keycode)
#define RS(keycode) APPLY_MODS(MOD_RSFT, keycode)
#define RA(keycode) APPLY_MODS(MOD_RALT, keycode)
#define RG(keycode) APPLY_MODS(MOD_RGUI, keycode)

View file

@ -7,22 +7,24 @@
#pragma once #pragma once
#include <zephyr.h> #include <zephyr.h>
#include <dt-bindings/zmk/keys.h>
#include <zmk/event-manager.h> #include <zmk/event-manager.h>
struct keycode_state_changed { struct keycode_state_changed {
struct zmk_event_header header; struct zmk_event_header header;
u8_t usage_page; u8_t usage_page;
u32_t keycode; u32_t keycode;
u8_t implicit_modifiers;
bool state; bool state;
}; };
ZMK_EVENT_DECLARE(keycode_state_changed); ZMK_EVENT_DECLARE(keycode_state_changed);
inline struct keycode_state_changed *create_keycode_state_changed(u8_t usage_page, u32_t keycode, static inline struct keycode_state_changed *create_keycode_state_changed(u8_t usage_page, u32_t keycode, bool state) {
bool state) {
struct keycode_state_changed *ev = new_keycode_state_changed(); struct keycode_state_changed *ev = new_keycode_state_changed();
ev->usage_page = usage_page; ev->usage_page = usage_page;
ev->keycode = keycode; ev->keycode = STRIP_MODS(keycode);
ev->implicit_modifiers = SELECT_MODS(keycode);
ev->state = state; ev->state = state;
return ev; return ev;
} }

View file

@ -164,8 +164,8 @@ struct zmk_hid_consumer_report {
int zmk_hid_register_mod(zmk_mod modifier); int zmk_hid_register_mod(zmk_mod modifier);
int zmk_hid_unregister_mod(zmk_mod modifier); int zmk_hid_unregister_mod(zmk_mod modifier);
int zmk_hid_register_mods(zmk_mod_flags modifiers); int zmk_hid_implicit_modifiers_press(zmk_mod_flags implicit_modifiers);
int zmk_hid_unregister_mods(zmk_mod_flags modifiers); int zmk_hid_implicit_modifiers_release();
int zmk_hid_keypad_press(zmk_key key); int zmk_hid_keypad_press(zmk_key key);
int zmk_hid_keypad_release(zmk_key key); int zmk_hid_keypad_release(zmk_key key);
void zmk_hid_keypad_clear(); void zmk_hid_keypad_clear();

View file

@ -8,6 +8,7 @@
#include <device.h> #include <device.h>
#include <drivers/behavior.h> #include <drivers/behavior.h>
#include <dt-bindings/zmk/keys.h>
#include <logging/log.h> #include <logging/log.h>
#include <zmk/behavior.h> #include <zmk/behavior.h>
#include <zmk/matrix.h> #include <zmk/matrix.h>
@ -16,7 +17,6 @@
#include <zmk/events/position-state-changed.h> #include <zmk/events/position-state-changed.h>
#include <zmk/events/keycode-state-changed.h> #include <zmk/events/keycode-state-changed.h>
#include <zmk/events/modifiers-state-changed.h> #include <zmk/events/modifiers-state-changed.h>
#include <zmk/hid.h>
#include <zmk/behavior.h> #include <zmk/behavior.h>
LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);
@ -427,7 +427,7 @@ static int position_state_changed_listener(const struct zmk_event_header *eh) {
return ZMK_EV_EVENT_CAPTURED; return ZMK_EV_EVENT_CAPTURED;
} }
static bool is_mod(struct keycode_state_changed *ev) { static inline bool only_mods(struct keycode_state_changed *ev) {
return ev->usage_page == USAGE_KEYPAD && ev->keycode >= LCTL && ev->keycode <= RGUI; return ev->usage_page == USAGE_KEYPAD && ev->keycode >= LCTL && ev->keycode <= RGUI;
} }
@ -440,7 +440,7 @@ static int keycode_state_changed_listener(const struct zmk_event_header *eh) {
return 0; return 0;
} }
if (!is_mod(ev)) { if (!only_mods(ev)) {
// LOG_DBG("0x%02X bubble (not a mod)", ev->keycode); // LOG_DBG("0x%02X bubble (not a mod)", ev->keycode);
return 0; return 0;
} }

View file

@ -8,29 +8,44 @@
LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);
#include <zmk/hid.h> #include <zmk/hid.h>
#include <dt-bindings/zmk/keys.h>
static struct zmk_hid_keypad_report kp_report = { static struct zmk_hid_keypad_report kp_report = {
.report_id = 1, .body = {.modifiers = 0, ._reserved = 0, .keys = {0}}}; .report_id = 1, .body = {.modifiers = 0, ._reserved = 0, .keys = {0}}};
static struct zmk_hid_consumer_report consumer_report = {.report_id = 2, .body = {.keys = {0}}}; static struct zmk_hid_consumer_report consumer_report = {.report_id = 2, .body = {.keys = {0}}};
#define _TOGGLE_MOD(mod, state) \ // Keep track of how often a modifier was pressed.
if (modifier > MOD_RGUI) { \ // Only release the modifier if the count is 0.
return -EINVAL; \ static int explicit_modifier_counts[8] = {0, 0, 0, 0, 0, 0, 0, 0};
} \ static zmk_mod_flags explicit_modifiers = 0;
WRITE_BIT(kp_report.body.modifiers, mod, state); \
return 0;
int zmk_hid_register_mod(zmk_mod modifier) { _TOGGLE_MOD(modifier, true); } #define SET_MODIFIERS(mods) \
int zmk_hid_unregister_mod(zmk_mod modifier) { _TOGGLE_MOD(modifier, false); } { \
kp_report.body.modifiers = mods; \
LOG_DBG("Modifiers set to 0x%02X", kp_report.body.modifiers); \
}
int zmk_hid_register_mods(zmk_mod_flags modifiers) { int zmk_hid_register_mod(zmk_mod modifier) {
kp_report.body.modifiers |= modifiers; explicit_modifier_counts[modifier]++;
LOG_DBG("Modifier %d count %d", modifier, explicit_modifier_counts[modifier]);
WRITE_BIT(explicit_modifiers, modifier, true);
SET_MODIFIERS(explicit_modifiers);
return 0; return 0;
} }
int zmk_hid_unregister_mods(zmk_mod_flags modifiers) { int zmk_hid_unregister_mod(zmk_mod modifier) {
kp_report.body.modifiers &= ~modifiers; if (explicit_modifier_counts[modifier] <= 0) {
LOG_ERR("Tried to unregister modifier %d too often", modifier);
return -EINVAL;
}
explicit_modifier_counts[modifier]--;
LOG_DBG("Modifier %d count: %d", modifier, explicit_modifier_counts[modifier]);
if (explicit_modifier_counts[modifier] == 0) {
LOG_DBG("Modifier %d released", modifier);
WRITE_BIT(explicit_modifiers, modifier, false);
}
SET_MODIFIERS(explicit_modifiers);
return 0; return 0;
} }
@ -52,6 +67,16 @@ int zmk_hid_unregister_mods(zmk_mod_flags modifiers) {
break; \ break; \
} }
int zmk_hid_implicit_modifiers_press(zmk_mod_flags implicit_modifiers) {
SET_MODIFIERS(explicit_modifiers | implicit_modifiers);
return 0;
}
int zmk_hid_implicit_modifiers_release() {
SET_MODIFIERS(explicit_modifiers);
return 0;
}
int zmk_hid_keypad_press(zmk_key code) { int zmk_hid_keypad_press(zmk_key code) {
if (code >= LCTL && code <= RGUI) { if (code >= LCTL && code <= RGUI) {
return zmk_hid_register_mod(code - LCTL); return zmk_hid_register_mod(code - LCTL);

View file

@ -15,10 +15,11 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);
#include <zmk/hid.h> #include <zmk/hid.h>
#include <zmk/endpoints.h> #include <zmk/endpoints.h>
static int hid_listener_keycode_pressed(u8_t usage_page, u32_t keycode) { static int hid_listener_keycode_pressed(u8_t usage_page, u32_t keycode,
zmk_mod_flags implicit_modifiers) {
int err; int err;
LOG_DBG("usage_page 0x%02X keycode 0x%02X", usage_page, keycode); LOG_DBG("usage_page 0x%02X keycode 0x%02X mods 0x%02X", usage_page, keycode,
implicit_modifiers);
switch (usage_page) { switch (usage_page) {
case USAGE_KEYPAD: case USAGE_KEYPAD:
err = zmk_hid_keypad_press(keycode); err = zmk_hid_keypad_press(keycode);
@ -35,14 +36,15 @@ static int hid_listener_keycode_pressed(u8_t usage_page, u32_t keycode) {
} }
break; break;
} }
zmk_hid_implicit_modifiers_press(implicit_modifiers);
return zmk_endpoints_send_report(usage_page); return zmk_endpoints_send_report(usage_page);
} }
static int hid_listener_keycode_released(u8_t usage_page, u32_t keycode) { static int hid_listener_keycode_released(u8_t usage_page, u32_t keycode,
zmk_mod_flags implicit_modifiers) {
int err; int err;
LOG_DBG("usage_page 0x%02X keycode 0x%02X", usage_page, keycode); LOG_DBG("usage_page 0x%02X keycode 0x%02X mods 0x%02X", usage_page, keycode,
implicit_modifiers);
switch (usage_page) { switch (usage_page) {
case USAGE_KEYPAD: case USAGE_KEYPAD:
err = zmk_hid_keypad_release(keycode); err = zmk_hid_keypad_release(keycode);
@ -57,39 +59,23 @@ static int hid_listener_keycode_released(u8_t usage_page, u32_t keycode) {
LOG_ERR("Unable to release keycode"); LOG_ERR("Unable to release keycode");
return err; return err;
} }
break;
} }
// There is a minor issue with this code.
// If LC(A) is pressed, then LS(B), then LC(A) is released, the shift for B will be released
// prematurely. This causes if LS(B) to repeat like Bbbbbbbb when pressed for a long time.
// Solving this would require keeping track of which key's implicit modifiers are currently
// active and only releasing modifiers at that time.
zmk_hid_implicit_modifiers_release();
return zmk_endpoints_send_report(usage_page); return zmk_endpoints_send_report(usage_page);
} }
static int hid_listener_modifiers_pressed(zmk_mod_flags modifiers) {
LOG_DBG("modifiers %d", modifiers);
zmk_hid_register_mods(modifiers);
return zmk_endpoints_send_report(USAGE_KEYPAD);
}
static int hid_listener_modifiers_released(zmk_mod_flags modifiers) {
LOG_DBG("modifiers %d", modifiers);
zmk_hid_unregister_mods(modifiers);
return zmk_endpoints_send_report(USAGE_KEYPAD);
}
int hid_listener(const struct zmk_event_header *eh) { int hid_listener(const struct zmk_event_header *eh) {
if (is_keycode_state_changed(eh)) { if (is_keycode_state_changed(eh)) {
const struct keycode_state_changed *ev = cast_keycode_state_changed(eh); const struct keycode_state_changed *ev = cast_keycode_state_changed(eh);
if (ev->state) { if (ev->state) {
hid_listener_keycode_pressed(ev->usage_page, ev->keycode); hid_listener_keycode_pressed(ev->usage_page, ev->keycode, ev->implicit_modifiers);
} else { } else {
hid_listener_keycode_released(ev->usage_page, ev->keycode); hid_listener_keycode_released(ev->usage_page, ev->keycode, ev->implicit_modifiers);
}
} else if (is_modifiers_state_changed(eh)) {
const struct modifiers_state_changed *ev = cast_modifiers_state_changed(eh);
if (ev->state) {
hid_listener_modifiers_pressed(ev->modifiers);
} else {
hid_listener_modifiers_released(ev->modifiers);
} }
} }
return 0; return 0;
@ -97,4 +83,3 @@ int hid_listener(const struct zmk_event_header *eh) {
ZMK_LISTENER(hid_listener, hid_listener); ZMK_LISTENER(hid_listener, hid_listener);
ZMK_SUBSCRIPTION(hid_listener, keycode_state_changed); ZMK_SUBSCRIPTION(hid_listener, keycode_state_changed);
ZMK_SUBSCRIPTION(hid_listener, modifiers_state_changed);

View file

@ -11,7 +11,6 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);
#include <zmk/matrix.h> #include <zmk/matrix.h>
#include <zmk/sensors.h> #include <zmk/sensors.h>
#include <zmk/keymap.h> #include <zmk/keymap.h>
#include <dt-bindings/zmk/matrix-transform.h>
#include <drivers/behavior.h> #include <drivers/behavior.h>
#include <zmk/behavior.h> #include <zmk/behavior.h>

View file

@ -1,5 +1,5 @@
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
ht_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 mods 0x00
kp_released: usage_page 0x07 keycode 0x09 kp_released: usage_page 0x07 keycode 0x09 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

View file

@ -1,5 +1,5 @@
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
ht_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 mods 0x00
kp_released: usage_page 0x07 keycode 0xe1 kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

View file

@ -1,7 +1,7 @@
kp_pressed: usage_page 0x07 keycode 0xe4 kp_pressed: usage_page 0x07 keycode 0xe4 mods 0x00
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
ht_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 mods 0x00
kp_released: usage_page 0x07 keycode 0xe4 kp_released: usage_page 0x07 keycode 0xe4 mods 0x00
kp_released: usage_page 0x07 keycode 0x09 kp_released: usage_page 0x07 keycode 0x09 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

View file

@ -1,7 +1,7 @@
kp_pressed: usage_page 0x07 keycode 0xe4 kp_pressed: usage_page 0x07 keycode 0xe4 mods 0x00
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
ht_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 mods 0x00
kp_released: usage_page 0x07 keycode 0xe4 kp_released: usage_page 0x07 keycode 0xe4 mods 0x00
kp_released: usage_page 0x07 keycode 0xe1 kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

View file

@ -1,7 +1,7 @@
kp_pressed: usage_page 0x07 keycode 0x07 kp_pressed: usage_page 0x07 keycode 0x07 mods 0x00
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
kp_released: usage_page 0x07 keycode 0x07 kp_released: usage_page 0x07 keycode 0x07 mods 0x00
ht_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 mods 0x00
kp_released: usage_page 0x07 keycode 0x09 kp_released: usage_page 0x07 keycode 0x09 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

View file

@ -1,7 +1,7 @@
kp_pressed: usage_page 0x07 keycode 0x07 kp_pressed: usage_page 0x07 keycode 0x07 mods 0x00
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
kp_released: usage_page 0x07 keycode 0x07 kp_released: usage_page 0x07 keycode 0x07 mods 0x00
ht_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 mods 0x00
kp_released: usage_page 0x07 keycode 0xe1 kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

View file

@ -1,10 +1,10 @@
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
ht_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 mods 0x00
ht_binding_pressed: 1 new undecided hold_tap ht_binding_pressed: 1 new undecided hold_tap
ht_decide: 1 decided tap (balanced event 0) ht_decide: 1 decided tap (balanced event 0)
kp_pressed: usage_page 0x07 keycode 0x0d kp_pressed: usage_page 0x07 keycode 0x0d mods 0x00
kp_released: usage_page 0x07 keycode 0x0d kp_released: usage_page 0x07 keycode 0x0d mods 0x00
ht_binding_released: 1 cleaning up hold-tap ht_binding_released: 1 cleaning up hold-tap
kp_released: usage_page 0x07 keycode 0xe1 kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

View file

@ -1,7 +1,7 @@
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
ht_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 mods 0x00
kp_pressed: usage_page 0x07 keycode 0x07 kp_pressed: usage_page 0x07 keycode 0x07 mods 0x00
kp_released: usage_page 0x07 keycode 0x07 kp_released: usage_page 0x07 keycode 0x07 mods 0x00
kp_released: usage_page 0x07 keycode 0xe1 kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

View file

@ -1,7 +1,7 @@
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
ht_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 mods 0x00
kp_pressed: usage_page 0x07 keycode 0x07 kp_pressed: usage_page 0x07 keycode 0x07 mods 0x00
kp_released: usage_page 0x07 keycode 0x07 kp_released: usage_page 0x07 keycode 0x07 mods 0x00
kp_released: usage_page 0x07 keycode 0xe1 kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

View file

@ -1,7 +1,7 @@
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
ht_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 mods 0x00
kp_pressed: usage_page 0x07 keycode 0x07 kp_pressed: usage_page 0x07 keycode 0x07 mods 0x00
kp_released: usage_page 0x07 keycode 0x07 kp_released: usage_page 0x07 keycode 0x07 mods 0x00
kp_released: usage_page 0x07 keycode 0xe1 kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

View file

@ -1,7 +1,7 @@
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
ht_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 mods 0x00
kp_pressed: usage_page 0x07 keycode 0x07 kp_pressed: usage_page 0x07 keycode 0x07 mods 0x00
kp_released: usage_page 0x07 keycode 0x09 kp_released: usage_page 0x07 keycode 0x09 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap
kp_released: usage_page 0x07 keycode 0x07 kp_released: usage_page 0x07 keycode 0x07 mods 0x00

View file

@ -1,20 +1,20 @@
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
ht_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 mods 0x00
ht_binding_pressed: 1 new undecided hold_tap ht_binding_pressed: 1 new undecided hold_tap
ht_decide: 1 decided hold (balanced event 3) ht_decide: 1 decided hold (balanced event 3)
kp_pressed: usage_page 0x07 keycode 0xe0 kp_pressed: usage_page 0x07 keycode 0xe0 mods 0x00
ht_binding_pressed: 2 new undecided hold_tap ht_binding_pressed: 2 new undecided hold_tap
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap
ht_decide: 2 decided hold (balanced event 3) ht_decide: 2 decided hold (balanced event 3)
kp_pressed: usage_page 0x07 keycode 0xe3 kp_pressed: usage_page 0x07 keycode 0xe3 mods 0x00
ht_binding_pressed: 3 new undecided hold_tap ht_binding_pressed: 3 new undecided hold_tap
ht_binding_released: 1 cleaning up hold-tap ht_binding_released: 1 cleaning up hold-tap
ht_decide: 3 decided hold (balanced event 3) ht_decide: 3 decided hold (balanced event 3)
kp_pressed: usage_page 0x07 keycode 0xe2 kp_pressed: usage_page 0x07 keycode 0xe2 mods 0x00
kp_released: usage_page 0x07 keycode 0xe1 kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
kp_released: usage_page 0x07 keycode 0xe0 kp_released: usage_page 0x07 keycode 0xe0 mods 0x00
kp_released: usage_page 0x07 keycode 0xe3 kp_released: usage_page 0x07 keycode 0xe3 mods 0x00
ht_binding_released: 2 cleaning up hold-tap ht_binding_released: 2 cleaning up hold-tap
kp_released: usage_page 0x07 keycode 0xe2 kp_released: usage_page 0x07 keycode 0xe2 mods 0x00
ht_binding_released: 3 cleaning up hold-tap ht_binding_released: 3 cleaning up hold-tap

View file

@ -1,5 +1,5 @@
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
ht_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 mods 0x00
kp_released: usage_page 0x07 keycode 0x09 kp_released: usage_page 0x07 keycode 0x09 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

View file

@ -1,5 +1,5 @@
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
ht_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 mods 0x00
kp_released: usage_page 0x07 keycode 0xe1 kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

View file

@ -1,7 +1,7 @@
kp_pressed: usage_page 0x07 keycode 0xe4 kp_pressed: usage_page 0x07 keycode 0xe4 mods 0x00
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
ht_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 mods 0x00
kp_released: usage_page 0x07 keycode 0xe4 kp_released: usage_page 0x07 keycode 0xe4 mods 0x00
kp_released: usage_page 0x07 keycode 0x09 kp_released: usage_page 0x07 keycode 0x09 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

View file

@ -1,7 +1,7 @@
kp_pressed: usage_page 0x07 keycode 0xe4 kp_pressed: usage_page 0x07 keycode 0xe4 mods 0x00
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
ht_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 mods 0x00
kp_released: usage_page 0x07 keycode 0xe4 kp_released: usage_page 0x07 keycode 0xe4 mods 0x00
kp_released: usage_page 0x07 keycode 0xe1 kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

View file

@ -1,7 +1,7 @@
kp_pressed: usage_page 0x07 keycode 0x07 kp_pressed: usage_page 0x07 keycode 0x07 mods 0x00
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
kp_released: usage_page 0x07 keycode 0x07 kp_released: usage_page 0x07 keycode 0x07 mods 0x00
ht_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 mods 0x00
kp_released: usage_page 0x07 keycode 0x09 kp_released: usage_page 0x07 keycode 0x09 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

View file

@ -1,7 +1,7 @@
kp_pressed: usage_page 0x07 keycode 0x07 kp_pressed: usage_page 0x07 keycode 0x07 mods 0x00
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
kp_released: usage_page 0x07 keycode 0x07 kp_released: usage_page 0x07 keycode 0x07 mods 0x00
ht_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 mods 0x00
kp_released: usage_page 0x07 keycode 0xe1 kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

View file

@ -1,10 +1,10 @@
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
ht_decide: 0 decided hold (hold-preferred event 1) ht_decide: 0 decided hold (hold-preferred event 1)
kp_pressed: usage_page 0x07 keycode 0xe1 kp_pressed: usage_page 0x07 keycode 0xe1 mods 0x00
ht_binding_pressed: 1 new undecided hold_tap ht_binding_pressed: 1 new undecided hold_tap
ht_decide: 1 decided tap (hold-preferred event 0) ht_decide: 1 decided tap (hold-preferred event 0)
kp_pressed: usage_page 0x07 keycode 0x0d kp_pressed: usage_page 0x07 keycode 0x0d mods 0x00
kp_released: usage_page 0x07 keycode 0x0d kp_released: usage_page 0x07 keycode 0x0d mods 0x00
ht_binding_released: 1 cleaning up hold-tap ht_binding_released: 1 cleaning up hold-tap
kp_released: usage_page 0x07 keycode 0xe1 kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

View file

@ -1,7 +1,7 @@
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
ht_decide: 0 decided hold (hold-preferred event 1) ht_decide: 0 decided hold (hold-preferred event 1)
kp_pressed: usage_page 0x07 keycode 0xe1 kp_pressed: usage_page 0x07 keycode 0xe1 mods 0x00
kp_pressed: usage_page 0x07 keycode 0x07 kp_pressed: usage_page 0x07 keycode 0x07 mods 0x00
kp_released: usage_page 0x07 keycode 0x07 kp_released: usage_page 0x07 keycode 0x07 mods 0x00
kp_released: usage_page 0x07 keycode 0xe1 kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

View file

@ -1,7 +1,7 @@
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
ht_decide: 0 decided hold (hold-preferred event 1) ht_decide: 0 decided hold (hold-preferred event 1)
kp_pressed: usage_page 0x07 keycode 0xe1 kp_pressed: usage_page 0x07 keycode 0xe1 mods 0x00
kp_pressed: usage_page 0x07 keycode 0x07 kp_pressed: usage_page 0x07 keycode 0x07 mods 0x00
kp_released: usage_page 0x07 keycode 0x07 kp_released: usage_page 0x07 keycode 0x07 mods 0x00
kp_released: usage_page 0x07 keycode 0xe1 kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

View file

@ -1,7 +1,7 @@
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
ht_decide: 0 decided hold (hold-preferred event 1) ht_decide: 0 decided hold (hold-preferred event 1)
kp_pressed: usage_page 0x07 keycode 0xe1 kp_pressed: usage_page 0x07 keycode 0xe1 mods 0x00
kp_pressed: usage_page 0x07 keycode 0x07 kp_pressed: usage_page 0x07 keycode 0x07 mods 0x00
kp_released: usage_page 0x07 keycode 0x07 kp_released: usage_page 0x07 keycode 0x07 mods 0x00
kp_released: usage_page 0x07 keycode 0xe1 kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

View file

@ -1,7 +1,7 @@
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
ht_decide: 0 decided hold (hold-preferred event 1) ht_decide: 0 decided hold (hold-preferred event 1)
kp_pressed: usage_page 0x07 keycode 0xe1 kp_pressed: usage_page 0x07 keycode 0xe1 mods 0x00
kp_pressed: usage_page 0x07 keycode 0x07 kp_pressed: usage_page 0x07 keycode 0x07 mods 0x00
kp_released: usage_page 0x07 keycode 0xe1 kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap
kp_released: usage_page 0x07 keycode 0x07 kp_released: usage_page 0x07 keycode 0x07 mods 0x00

View file

@ -1,5 +1,5 @@
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
ht_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 mods 0x00
kp_released: usage_page 0x07 keycode 0x09 kp_released: usage_page 0x07 keycode 0x09 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

View file

@ -1,5 +1,5 @@
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
ht_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 mods 0x00
kp_released: usage_page 0x07 keycode 0xe1 kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

View file

@ -1,7 +1,7 @@
kp_pressed: usage_page 0x07 keycode 0xe4 kp_pressed: usage_page 0x07 keycode 0xe4 mods 0x00
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
ht_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 mods 0x00
kp_released: usage_page 0x07 keycode 0xe4 kp_released: usage_page 0x07 keycode 0xe4 mods 0x00
kp_released: usage_page 0x07 keycode 0x09 kp_released: usage_page 0x07 keycode 0x09 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

View file

@ -1,7 +1,7 @@
kp_pressed: usage_page 0x07 keycode 0xe4 kp_pressed: usage_page 0x07 keycode 0xe4 mods 0x00
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
ht_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 mods 0x00
kp_released: usage_page 0x07 keycode 0xe4 kp_released: usage_page 0x07 keycode 0xe4 mods 0x00
kp_released: usage_page 0x07 keycode 0xe1 kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

View file

@ -1,7 +1,7 @@
kp_pressed: usage_page 0x07 keycode 0x07 kp_pressed: usage_page 0x07 keycode 0x07 mods 0x00
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
kp_released: usage_page 0x07 keycode 0x07 kp_released: usage_page 0x07 keycode 0x07 mods 0x00
ht_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 mods 0x00
kp_released: usage_page 0x07 keycode 0x09 kp_released: usage_page 0x07 keycode 0x09 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

View file

@ -1,7 +1,7 @@
kp_pressed: usage_page 0x07 keycode 0x07 kp_pressed: usage_page 0x07 keycode 0x07 mods 0x00
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
kp_released: usage_page 0x07 keycode 0x07 kp_released: usage_page 0x07 keycode 0x07 mods 0x00
ht_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 mods 0x00
kp_released: usage_page 0x07 keycode 0xe1 kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

View file

@ -1,10 +1,10 @@
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
ht_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 mods 0x00
ht_binding_pressed: 1 new undecided hold_tap ht_binding_pressed: 1 new undecided hold_tap
ht_decide: 1 decided tap (tap-preferred event 0) ht_decide: 1 decided tap (tap-preferred event 0)
kp_pressed: usage_page 0x07 keycode 0x0d kp_pressed: usage_page 0x07 keycode 0x0d mods 0x00
kp_released: usage_page 0x07 keycode 0x0d kp_released: usage_page 0x07 keycode 0x0d mods 0x00
ht_binding_released: 1 cleaning up hold-tap ht_binding_released: 1 cleaning up hold-tap
kp_released: usage_page 0x07 keycode 0xe1 kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

View file

@ -1,7 +1,7 @@
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
ht_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 mods 0x00
kp_pressed: usage_page 0x07 keycode 0x07 kp_pressed: usage_page 0x07 keycode 0x07 mods 0x00
kp_released: usage_page 0x07 keycode 0x07 kp_released: usage_page 0x07 keycode 0x07 mods 0x00
kp_released: usage_page 0x07 keycode 0xe1 kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

View file

@ -1,7 +1,7 @@
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
ht_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 mods 0x00
kp_pressed: usage_page 0x07 keycode 0x07 kp_pressed: usage_page 0x07 keycode 0x07 mods 0x00
kp_released: usage_page 0x07 keycode 0x07 kp_released: usage_page 0x07 keycode 0x07 mods 0x00
kp_released: usage_page 0x07 keycode 0xe1 kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

View file

@ -1,7 +1,7 @@
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
ht_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 mods 0x00
kp_pressed: usage_page 0x07 keycode 0x07 kp_pressed: usage_page 0x07 keycode 0x07 mods 0x00
kp_released: usage_page 0x07 keycode 0x07 kp_released: usage_page 0x07 keycode 0x07 mods 0x00
kp_released: usage_page 0x07 keycode 0x09 kp_released: usage_page 0x07 keycode 0x09 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

View file

@ -1,7 +1,7 @@
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
ht_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 mods 0x00
kp_pressed: usage_page 0x07 keycode 0x07 kp_pressed: usage_page 0x07 keycode 0x07 mods 0x00
kp_released: usage_page 0x07 keycode 0x09 kp_released: usage_page 0x07 keycode 0x09 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap
kp_released: usage_page 0x07 keycode 0x07 kp_released: usage_page 0x07 keycode 0x07 mods 0x00

View file

@ -9,20 +9,8 @@
default_layer { default_layer {
bindings = < bindings = <
&kp B &mo 1 &kp B &none
&kp D &kp G>; &cp M_NEXT &none>;
};
lower_layer {
bindings = <
&cp M_NEXT &trans
&kp L &kp J>;
};
raise_layer {
bindings = <
&kp W &kp U
&kp X &kp M>;
}; };
}; };
}; };

View file

@ -1,2 +1,2 @@
pressed: usage_page 0x0c keycode 0xb5 pressed: usage_page 0x0c keycode 0xb5 mods 0x00
released: usage_page 0x0c keycode 0xb5 pressed: usage_page 0x0c keycode 0xb5 mods 0x00

View file

@ -1,5 +1,5 @@
#include "../behavior_keymap.dtsi" #include "../behavior_keymap.dtsi"
&kscan { &kscan {
events = <ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10)>; events = <ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_PRESS(1,0,10)>;
}; };

View file

@ -1,2 +1,2 @@
pressed: usage_page 0x0c keycode 0xb5 pressed: usage_page 0x07 keycode 0x05 mods 0x00
released: usage_page 0x0c keycode 0xb5 released: usage_page 0x07 keycode 0x05 mods 0x00

View file

@ -1,8 +1,5 @@
#include <dt-bindings/zmk/keys.h>
#include <behaviors.dtsi>
#include <dt-bindings/zmk/kscan-mock.h>
#include "../behavior_keymap.dtsi" #include "../behavior_keymap.dtsi"
&kscan { &kscan {
events = <ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10)>; events = <ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10)>;
}; };

View file

@ -0,0 +1,4 @@
s/.*hid_listener_keycode_//p
s/.*hid_register_mod/reg/p
s/.*hid_unregister_mod/unreg/p
s/.*zmk_hid_.*Modifiers set to /mods: Modifiers set to /p

View file

@ -0,0 +1,17 @@
pressed: usage_page 0x07 keycode 0xe0 mods 0x00
reg: Modifier 0 count 1
reg: Modifiers set to 0x01
mods: Modifiers set to 0x01
pressed: usage_page 0x07 keycode 0xe0 mods 0x00
reg: Modifier 0 count 2
reg: Modifiers set to 0x01
mods: Modifiers set to 0x01
released: usage_page 0x07 keycode 0xe0 mods 0x00
unreg: Modifier 0 count: 1
unreg: Modifiers set to 0x01
mods: Modifiers set to 0x01
released: usage_page 0x07 keycode 0xe0 mods 0x00
unreg: Modifier 0 count: 0
unreg: Modifier 0 released
unreg: Modifiers set to 0x00
mods: Modifiers set to 0x00

View file

@ -0,0 +1,27 @@
#include <dt-bindings/zmk/keys.h>
#include <behaviors.dtsi>
#include <dt-bindings/zmk/kscan-mock.h>
&kscan {
events = <
ZMK_MOCK_PRESS(0,0,10)
ZMK_MOCK_PRESS(0,1,10)
ZMK_MOCK_RELEASE(0,0,10)
ZMK_MOCK_RELEASE(0,1,10)
>;
};
/ {
keymap {
compatible = "zmk,keymap";
label ="Default keymap";
default_layer {
bindings = <
&kp LCTL &kp LCTL
&kp LSFT &none
>;
};
};
};

View file

@ -0,0 +1,4 @@
s/.*hid_listener_keycode_//p
s/.*hid_register_mod/reg/p
s/.*hid_unregister_mod/unreg/p
s/.*zmk_hid_.*Modifiers set to /mods: Modifiers set to /p

View file

@ -0,0 +1,9 @@
pressed: usage_page 0x07 keycode 0xe0 mods 0x00
reg: Modifier 0 count 1
reg: Modifiers set to 0x01
mods: Modifiers set to 0x01
released: usage_page 0x07 keycode 0xe0 mods 0x00
unreg: Modifier 0 count: 0
unreg: Modifier 0 released
unreg: Modifiers set to 0x00
mods: Modifiers set to 0x00

View file

@ -0,0 +1,25 @@
#include <dt-bindings/zmk/keys.h>
#include <behaviors.dtsi>
#include <dt-bindings/zmk/kscan-mock.h>
&kscan {
events = <
ZMK_MOCK_PRESS(0,0,10)
ZMK_MOCK_RELEASE(0,0,10)
>;
};
/ {
keymap {
compatible = "zmk,keymap";
label ="Default keymap";
default_layer {
bindings = <
&kp LCTL &kp LCTL
&kp LSFT &none
>;
};
};
};

View file

@ -0,0 +1,4 @@
s/.*hid_listener_keycode_//p
s/.*hid_register_mod/reg/p
s/.*hid_unregister_mod/unreg/p
s/.*zmk_hid_.*Modifiers set to /mods: Modifiers set to /p

View file

@ -0,0 +1,18 @@
pressed: usage_page 0x07 keycode 0xe0 mods 0x00
reg: Modifier 0 count 1
reg: Modifiers set to 0x01
mods: Modifiers set to 0x01
pressed: usage_page 0x07 keycode 0xe1 mods 0x00
reg: Modifier 1 count 1
reg: Modifiers set to 0x03
mods: Modifiers set to 0x03
released: usage_page 0x07 keycode 0xe0 mods 0x00
unreg: Modifier 0 count: 0
unreg: Modifier 0 released
unreg: Modifiers set to 0x02
mods: Modifiers set to 0x02
released: usage_page 0x07 keycode 0xe1 mods 0x00
unreg: Modifier 1 count: 0
unreg: Modifier 1 released
unreg: Modifiers set to 0x00
mods: Modifiers set to 0x00

View file

@ -0,0 +1,27 @@
#include <dt-bindings/zmk/keys.h>
#include <behaviors.dtsi>
#include <dt-bindings/zmk/kscan-mock.h>
&kscan {
events = <
ZMK_MOCK_PRESS(0,0,10)
ZMK_MOCK_PRESS(1,0,10)
ZMK_MOCK_RELEASE(0,0,10)
ZMK_MOCK_RELEASE(1,0,10)
>;
};
/ {
keymap {
compatible = "zmk,keymap";
label ="Default keymap";
default_layer {
bindings = <
&kp LCTL &kp LCTL
&kp LSFT &none
>;
};
};
};

View file

@ -0,0 +1,4 @@
s/.*hid_listener_keycode_//p
s/.*hid_register_mod/reg/p
s/.*hid_unregister_mod/unreg/p
s/.*zmk_hid_.*Modifiers set to /mods: Modifiers set to /p

View file

@ -0,0 +1,18 @@
pressed: usage_page 0x07 keycode 0xe0 mods 0x00
reg: Modifier 0 count 1
reg: Modifiers set to 0x01
mods: Modifiers set to 0x01
pressed: usage_page 0x07 keycode 0xe1 mods 0x00
reg: Modifier 1 count 1
reg: Modifiers set to 0x03
mods: Modifiers set to 0x03
released: usage_page 0x07 keycode 0xe1 mods 0x00
unreg: Modifier 1 count: 0
unreg: Modifier 1 released
unreg: Modifiers set to 0x01
mods: Modifiers set to 0x01
released: usage_page 0x07 keycode 0xe0 mods 0x00
unreg: Modifier 0 count: 0
unreg: Modifier 0 released
unreg: Modifiers set to 0x00
mods: Modifiers set to 0x00

View file

@ -0,0 +1,28 @@
#include <dt-bindings/zmk/keys.h>
#include <behaviors.dtsi>
#include <dt-bindings/zmk/kscan-mock.h>
&kscan {
events = <
ZMK_MOCK_PRESS(0,0,10)
ZMK_MOCK_PRESS(1,0,10)
ZMK_MOCK_RELEASE(1,0,10)
ZMK_MOCK_RELEASE(0,0,10)
>;
};
/ {
keymap {
compatible = "zmk,keymap";
label ="Default keymap";
default_layer {
bindings = <
&kp LCTL &kp LCTL
&kp LSFT &none
>;
};
};
};

View file

@ -0,0 +1,4 @@
s/.*hid_listener_keycode_//p
s/.*hid_register_mod/reg/p
s/.*hid_unregister_mod/unreg/p
s/.*zmk_hid_.*Modifiers set to /mods: Modifiers set to /p

View file

@ -0,0 +1,8 @@
pressed: usage_page 0x07 keycode 0x05 mods 0x02
mods: Modifiers set to 0x02
pressed: usage_page 0x07 keycode 0x04 mods 0x01
mods: Modifiers set to 0x01
released: usage_page 0x07 keycode 0x05 mods 0x02
mods: Modifiers set to 0x01
released: usage_page 0x07 keycode 0x04 mods 0x01
mods: Modifiers set to 0x00

View file

@ -0,0 +1,27 @@
#include <dt-bindings/zmk/keys.h>
#include <behaviors.dtsi>
#include <dt-bindings/zmk/kscan-mock.h>
&kscan {
events = <
ZMK_MOCK_PRESS(0,1,10)
ZMK_MOCK_PRESS(0,0,10)
ZMK_MOCK_RELEASE(0,1,10)
ZMK_MOCK_RELEASE(0,0,10)
>;
};
/ {
keymap {
compatible = "zmk,keymap";
label ="Default keymap";
default_layer {
bindings = <
&kp LC(A) &kp LS(B)
&kp LCTL &none
>;
};
};
};

View file

@ -0,0 +1,9 @@
This test fails because the hid_listener_keycode_released function
releases implicit modifiers always, even if they were not set by the
key that's going up. Also see the comment in that function:
If LC(A) is pressed, then LS(B), then LC(A) is released, the shift for B will be released
prematurely. This causes if LS(B) to repeat like Bbbbbbbb when pressed for a long time.
Solving this would require keeping track of which key's implicit modifiers are currently
active and only releasing modifiers at that time.

View file

@ -0,0 +1,4 @@
s/.*hid_listener_keycode_//p
s/.*hid_register_mod/reg/p
s/.*hid_unregister_mod/unreg/p
s/.*zmk_hid_.*Modifiers set to /mods: Modifiers set to /p

View file

@ -0,0 +1,8 @@
pressed: usage_page 0x07 keycode 0x04 mods 0x01
mods: Modifiers set to 0x01
pressed: usage_page 0x07 keycode 0x05 mods 0x02
mods: Modifiers set to 0x02
released: usage_page 0x07 keycode 0x05 mods 0x02
mods: Modifiers set to 0x00
released: usage_page 0x07 keycode 0x04 mods 0x01
mods: Modifiers set to 0x00

View file

@ -0,0 +1,27 @@
#include <dt-bindings/zmk/keys.h>
#include <behaviors.dtsi>
#include <dt-bindings/zmk/kscan-mock.h>
&kscan {
events = <
ZMK_MOCK_PRESS(0,0,10)
ZMK_MOCK_PRESS(0,1,10)
ZMK_MOCK_RELEASE(0,1,10)
ZMK_MOCK_RELEASE(0,0,10)
>;
};
/ {
keymap {
compatible = "zmk,keymap";
label ="Default keymap";
default_layer {
bindings = <
&kp LC(A) &kp LS(B)
&none &none
>;
};
};
};

View file

@ -0,0 +1,4 @@
s/.*hid_listener_keycode_//p
s/.*hid_register_mod/reg/p
s/.*hid_unregister_mod/unreg/p
s/.*zmk_hid_.*Modifiers set to /mods: Modifiers set to /p

View file

@ -0,0 +1,13 @@
pressed: usage_page 0x07 keycode 0xe0 mods 0x00
reg: Modifier 0 count 1
reg: Modifiers set to 0x01
mods: Modifiers set to 0x01
pressed: usage_page 0x07 keycode 0x05 mods 0x02
mods: Modifiers set to 0x03
released: usage_page 0x07 keycode 0xe0 mods 0x00
unreg: Modifier 0 count: 0
unreg: Modifier 0 released
unreg: Modifiers set to 0x00
mods: Modifiers set to 0x00
released: usage_page 0x07 keycode 0x05 mods 0x02
mods: Modifiers set to 0x00

View file

@ -0,0 +1,27 @@
#include <dt-bindings/zmk/keys.h>
#include <behaviors.dtsi>
#include <dt-bindings/zmk/kscan-mock.h>
&kscan {
events = <
ZMK_MOCK_PRESS(1,0,10)
ZMK_MOCK_PRESS(0,1,10)
ZMK_MOCK_RELEASE(1,0,10)
ZMK_MOCK_RELEASE(0,1,10)
>;
};
/ {
keymap {
compatible = "zmk,keymap";
label ="Default keymap";
default_layer {
bindings = <
&kp LC(A) &kp LS(B)
&kp LCTL &none
>;
};
};
};

View file

@ -0,0 +1,4 @@
s/.*hid_listener_keycode_//p
s/.*hid_register_mod/reg/p
s/.*hid_unregister_mod/unreg/p
s/.*zmk_hid_.*Modifiers set to /mods: Modifiers set to /p

View file

@ -0,0 +1,13 @@
pressed: usage_page 0x07 keycode 0xe0 mods 0x00
reg: Modifier 0 count 1
reg: Modifiers set to 0x01
mods: Modifiers set to 0x01
pressed: usage_page 0x07 keycode 0x05 mods 0x02
mods: Modifiers set to 0x03
released: usage_page 0x07 keycode 0x05 mods 0x02
mods: Modifiers set to 0x01
released: usage_page 0x07 keycode 0xe0 mods 0x00
unreg: Modifier 0 count: 0
unreg: Modifier 0 released
unreg: Modifiers set to 0x00
mods: Modifiers set to 0x00

View file

@ -0,0 +1,27 @@
#include <dt-bindings/zmk/keys.h>
#include <behaviors.dtsi>
#include <dt-bindings/zmk/kscan-mock.h>
&kscan {
events = <
ZMK_MOCK_PRESS(1,0,10)
ZMK_MOCK_PRESS(0,1,10)
ZMK_MOCK_RELEASE(0,1,10)
ZMK_MOCK_RELEASE(1,0,10)
>;
};
/ {
keymap {
compatible = "zmk,keymap";
label ="Default keymap";
default_layer {
bindings = <
&kp LC(A) &kp LS(B)
&kp LCTL &none
>;
};
};
};

View file

@ -1,4 +1,4 @@
kp_pressed: usage_page 0x07 keycode 0x05 kp_pressed: usage_page 0x07 keycode 0x05 mods 0x00
mo_pressed: position 1 layer 1 mo_pressed: position 1 layer 1
kp_released: usage_page 0x07 keycode 0x05 kp_released: usage_page 0x07 keycode 0x05 mods 0x00
mo_released: position 1 layer 1 mo_released: position 1 layer 1

View file

@ -1,4 +1,4 @@
mo_pressed: position 1 layer 1 mo_pressed: position 1 layer 1
kp_pressed: usage_page 0x0c keycode 0xb5 kp_pressed: usage_page 0x0c keycode 0xb5 mods 0x00
kp_released: usage_page 0x0c keycode 0xb5 kp_released: usage_page 0x0c keycode 0xb5 mods 0x00
mo_released: position 1 layer 1 mo_released: position 1 layer 1

View file

@ -1,6 +1,6 @@
kp_pressed: usage_page 0x07 keycode 0x05 kp_pressed: usage_page 0x07 keycode 0x05 mods 0x00
tog_pressed: position 1 layer 1 tog_pressed: position 1 layer 1
kp_released: usage_page 0x07 keycode 0x05 kp_released: usage_page 0x07 keycode 0x05 mods 0x00
tog_released: position 1 layer 1 tog_released: position 1 layer 1
kp_pressed: usage_page 0x0c keycode 0xb5 kp_pressed: usage_page 0x0c keycode 0xb5 mods 0x00
kp_released: usage_page 0x0c keycode 0xb5 kp_released: usage_page 0x0c keycode 0xb5 mods 0x00

View file

@ -1,4 +1,4 @@
tog_pressed: position 1 layer 1 tog_pressed: position 1 layer 1
tog_released: position 1 layer 1 tog_released: position 1 layer 1
kp_pressed: usage_page 0x0c keycode 0xb5 kp_pressed: usage_page 0x0c keycode 0xb5 mods 0x00
kp_released: usage_page 0x0c keycode 0xb5 kp_released: usage_page 0x0c keycode 0xb5 mods 0x00

View file

@ -1,2 +1,2 @@
kp_pressed: usage_page 0x07 keycode 0x04 kp_pressed: usage_page 0x07 keycode 0x04 mods 0x00
kp_released: usage_page 0x07 keycode 0x04 kp_released: usage_page 0x07 keycode 0x04 mods 0x00

View file

@ -68,7 +68,7 @@ In this case, the `A` is actually a define for the raw HID keycode, to make keym
For example of a binding that uses two parameters, you can see how "mod-tap" (`mt`) is bound: For example of a binding that uses two parameters, you can see how "mod-tap" (`mt`) is bound:
``` ```
&mt MOD_LSFT D &mt LSFT D
``` ```
Here, the first parameter is the set of modifiers that should be used for the "hold" behavior, and the second Here, the first parameter is the set of modifiers that should be used for the "hold" behavior, and the second
@ -92,7 +92,7 @@ The top two lines of most keymaps should include:
The first defines the nodes for all the available behaviors in ZMK, which will be referenced in the behavior bindings. This is how bindings like `&kp` can reference the key press behavior defined with an anchor name of `kp`. The first defines the nodes for all the available behaviors in ZMK, which will be referenced in the behavior bindings. This is how bindings like `&kp` can reference the key press behavior defined with an anchor name of `kp`.
The second include brings in the defines for all the keycodes (e.g. `A`, `NUM_1`, `M_PLAY`) and the modifiers (e.g. `MOD_LSFT`) used for various behavior bindings. The second include brings in the defines for all the keycodes (e.g. `A`, `NUM_1`, `M_PLAY`) and the modifiers (e.g. `LSFT`) used for various behavior bindings.
### Root devicetree Node ### Root devicetree Node