diff --git a/app/include/zmk/events/keycode_state_changed.h b/app/include/zmk/events/keycode_state_changed.h index 60ffcfc8..ba9a31a5 100644 --- a/app/include/zmk/events/keycode_state_changed.h +++ b/app/include/zmk/events/keycode_state_changed.h @@ -11,35 +11,34 @@ #include struct zmk_keycode_state_changed { - uint16_t usage_page; - uint32_t keycode; - uint8_t implicit_modifiers; - uint8_t explicit_modifiers; - bool state; int64_t timestamp; + zmk_key_t keycode; + uint16_t usage_page; + zmk_mod_flags_t implicit_modifiers; + zmk_mod_flags_t explicit_modifiers; + bool state; }; ZMK_EVENT_DECLARE(zmk_keycode_state_changed); static inline struct zmk_keycode_state_changed zmk_keycode_state_changed_from_encoded(uint32_t encoded, bool pressed, int64_t timestamp) { - uint16_t page = ZMK_HID_USAGE_PAGE(encoded); - uint16_t id = ZMK_HID_USAGE_ID(encoded); - uint8_t implicit_modifiers = 0x00; - uint8_t explicit_modifiers = 0x00; + struct zmk_key_param key = ZMK_KEY_PARAM_DECODE(encoded); + zmk_mod_flags_t implicit_modifiers = 0x00; + zmk_mod_flags_t explicit_modifiers = 0x00; - if (!page) { - page = HID_USAGE_KEY; + if (!key.page) { + key.page = HID_USAGE_KEY; } - if (is_mod(page, id)) { - explicit_modifiers = SELECT_MODS(encoded); + if (is_mod(key.page, key.id)) { + explicit_modifiers = key.modifiers; } else { - implicit_modifiers = SELECT_MODS(encoded); + implicit_modifiers = key.modifiers; } - return (struct zmk_keycode_state_changed){.usage_page = page, - .keycode = id, + return (struct zmk_keycode_state_changed){.usage_page = key.page, + .keycode = key.id, .implicit_modifiers = implicit_modifiers, .explicit_modifiers = explicit_modifiers, .state = pressed, diff --git a/app/include/zmk/keys.h b/app/include/zmk/keys.h index fa6e7cfe..adfa70be 100644 --- a/app/include/zmk/keys.h +++ b/app/include/zmk/keys.h @@ -20,6 +20,24 @@ struct zmk_key_event { bool pressed; }; +/** + * Key data from a devicetree key code parameter. + */ +struct zmk_key_param { + zmk_mod_flags_t modifiers; + uint8_t page; + uint16_t id; +}; + +/** + * Decode a uint32_t devicetree key code parameter to a struct zmk_key_param. + */ +#define ZMK_KEY_PARAM_DECODE(param) \ + (struct zmk_key_param) { \ + .modifiers = SELECT_MODS(param), .page = ZMK_HID_USAGE_PAGE(param), \ + .id = ZMK_HID_USAGE_ID(param), \ + } + static inline bool is_mod(uint8_t usage_page, uint32_t keycode) { return (keycode >= HID_USAGE_KEY_KEYBOARD_LEFTCONTROL && keycode <= HID_USAGE_KEY_KEYBOARD_RIGHT_GUI && usage_page == HID_USAGE_KEY); diff --git a/app/src/behaviors/behavior_caps_word.c b/app/src/behaviors/behavior_caps_word.c index c5e1d7f3..59d3e19e 100644 --- a/app/src/behaviors/behavior_caps_word.c +++ b/app/src/behaviors/behavior_caps_word.c @@ -22,16 +22,10 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); -struct caps_word_continue_item { - uint32_t id; - uint16_t page; - uint8_t implicit_modifiers; -}; - struct behavior_caps_word_config { zmk_mod_flags_t mods; uint16_t continuations_count; - struct caps_word_continue_item continuations[]; + struct zmk_key_param continuations[]; }; struct behavior_caps_word_data { @@ -88,14 +82,13 @@ static bool caps_word_is_caps_includelist(const struct behavior_caps_word_config uint16_t usage_page, uint8_t usage_id, uint8_t implicit_modifiers) { for (int i = 0; i < config->continuations_count; i++) { - const struct caps_word_continue_item *continuation = &config->continuations[i]; + const struct zmk_key_param *continuation = &config->continuations[i]; LOG_DBG("Comparing with 0x%02X - 0x%02X (with implicit mods: 0x%02X)", continuation->page, - continuation->id, continuation->implicit_modifiers); + continuation->id, continuation->modifiers); if (continuation->page == usage_page && continuation->id == usage_id && - (continuation->implicit_modifiers & - (implicit_modifiers | zmk_hid_get_explicit_mods())) == - continuation->implicit_modifiers) { + (continuation->modifiers & (implicit_modifiers | zmk_hid_get_explicit_mods())) == + continuation->modifiers) { LOG_DBG("Continuing capsword, found included usage: 0x%02X - 0x%02X", usage_page, usage_id); return true; @@ -173,13 +166,7 @@ static int behavior_caps_word_init(const struct device *dev) { return 0; } #define CAPS_WORD_LABEL(i, _n) DT_INST_LABEL(i) -#define PARSE_CONTINUATION(i) \ - { \ - .page = ZMK_HID_USAGE_PAGE(i), .id = ZMK_HID_USAGE_ID(i), \ - .implicit_modifiers = SELECT_MODS(i) \ - } - -#define CONTINUATION_ITEM(i, n) PARSE_CONTINUATION(DT_INST_PROP_BY_IDX(n, continue_list, i)) +#define CONTINUATION_ITEM(i, n) ZMK_KEY_PARAM_DECODE(DT_INST_PROP_BY_IDX(n, continue_list, i)) #define KP_INST(n) \ static struct behavior_caps_word_data behavior_caps_word_data_##n = {.active = false}; \