From 973973aab56d0de9d219c88c1d8cd471fcab02fb Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Mon, 1 Jul 2024 12:12:12 -0600 Subject: [PATCH] feat: Add `&studio_unlock` behavior. * New behavior allows unlocking the keyboard to allow ZMK Studio to make changes. --- app/CMakeLists.txt | 1 + app/Kconfig.behaviors | 5 +++ app/dts/behaviors.dtsi | 1 + app/dts/behaviors/studio_unlock.dtsi | 17 +++++++ .../behaviors/zmk,behavior-studio-unlock.yaml | 8 ++++ app/src/behaviors/behavior_studio_unlock.c | 45 +++++++++++++++++++ 6 files changed, 77 insertions(+) create mode 100644 app/dts/behaviors/studio_unlock.dtsi create mode 100644 app/dts/bindings/behaviors/zmk,behavior-studio-unlock.yaml create mode 100644 app/src/behaviors/behavior_studio_unlock.c diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index 2db294969bc9..458c96063787 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -64,6 +64,7 @@ if ((NOT CONFIG_ZMK_SPLIT) OR CONFIG_ZMK_SPLIT_ROLE_CENTRAL) target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_SENSOR_ROTATE_VAR app PRIVATE src/behaviors/behavior_sensor_rotate_var.c) target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_SENSOR_ROTATE_COMMON app PRIVATE src/behaviors/behavior_sensor_rotate_common.c) target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_MOUSE_KEY_PRESS app PRIVATE src/behaviors/behavior_mouse_key_press.c) + target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_STUDIO_UNLOCK app PRIVATE src/behaviors/behavior_studio_unlock.c) target_sources(app PRIVATE src/combo.c) target_sources(app PRIVATE src/behaviors/behavior_tap_dance.c) target_sources(app PRIVATE src/behavior_queue.c) diff --git a/app/Kconfig.behaviors b/app/Kconfig.behaviors index d3f4537ec225..ccecc424f7a1 100644 --- a/app/Kconfig.behaviors +++ b/app/Kconfig.behaviors @@ -71,6 +71,11 @@ config ZMK_BEHAVIOR_SENSOR_ROTATE_VAR depends on DT_HAS_ZMK_BEHAVIOR_SENSOR_ROTATE_VAR_ENABLED select ZMK_BEHAVIOR_SENSOR_ROTATE_COMMON +config ZMK_BEHAVIOR_STUDIO_UNLOCK + bool + default y + depends on DT_HAS_ZMK_BEHAVIOR_STUDIO_UNLOCK_ENABLED && ZMK_STUDIO + config ZMK_BEHAVIOR_MACRO bool default y diff --git a/app/dts/behaviors.dtsi b/app/dts/behaviors.dtsi index fde75271891f..fcb4a63d4502 100644 --- a/app/dts/behaviors.dtsi +++ b/app/dts/behaviors.dtsi @@ -21,3 +21,4 @@ #include #include #include +#include diff --git a/app/dts/behaviors/studio_unlock.dtsi b/app/dts/behaviors/studio_unlock.dtsi new file mode 100644 index 000000000000..4959b864f1d0 --- /dev/null +++ b/app/dts/behaviors/studio_unlock.dtsi @@ -0,0 +1,17 @@ +/* + * Copyright (c) 2020 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +/ { + behaviors { + studio_unlock: studio_unlock { + compatible = "zmk,behavior-studio-unlock"; + #binding-cells = <0>; + display-name = "Studio Unlock"; + }; + }; + +}; + diff --git a/app/dts/bindings/behaviors/zmk,behavior-studio-unlock.yaml b/app/dts/bindings/behaviors/zmk,behavior-studio-unlock.yaml new file mode 100644 index 000000000000..390a02540d76 --- /dev/null +++ b/app/dts/bindings/behaviors/zmk,behavior-studio-unlock.yaml @@ -0,0 +1,8 @@ +# Copyright (c) 2020 The ZMK Contributors +# SPDX-License-Identifier: MIT + +description: Studio Unlock Behavior + +compatible: "zmk,behavior-studio-unlock" + +include: zero_param.yaml diff --git a/app/src/behaviors/behavior_studio_unlock.c b/app/src/behaviors/behavior_studio_unlock.c new file mode 100644 index 000000000000..dc9e2aec17e7 --- /dev/null +++ b/app/src/behaviors/behavior_studio_unlock.c @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2020 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#define DT_DRV_COMPAT zmk_behavior_studio_unlock + +#include +#include +#include + +#include +#include + +LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); + +#if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) + +static int behavior_studio_unlock_init(const struct device *dev) { return 0; }; + +static int on_keymap_binding_pressed(struct zmk_behavior_binding *binding, + struct zmk_behavior_binding_event event) { + zmk_studio_core_unlock(); + + return ZMK_BEHAVIOR_OPAQUE; +} + +static int on_keymap_binding_released(struct zmk_behavior_binding *binding, + struct zmk_behavior_binding_event event) { + return ZMK_BEHAVIOR_OPAQUE; +} + +static const struct behavior_driver_api behavior_studio_unlock_driver_api = { + .binding_pressed = on_keymap_binding_pressed, + .binding_released = on_keymap_binding_released, +#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) + .get_parameter_metadata = zmk_behavior_get_empty_param_metadata, +#endif // IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) +}; + +BEHAVIOR_DT_INST_DEFINE(0, behavior_studio_unlock_init, NULL, NULL, NULL, POST_KERNEL, + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_studio_unlock_driver_api); + +#endif /* DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) */