Behavior: Lock: Make persistence configurable
Persistence of a custom lock is disabled by default, but it can now be enabled in the dts keyboard config similar to this: ``` deadlock: deadlock { compatible = "zmk,behavior-custom-lock"; label = "dead-key-toggle"; #binding-cells = <0>; persistence = "enabled"; } ``` Currently the options are `disabled`, `enabled` and `per-profile`, where the latter doesn't do anything different to `enabled` as of right now. Signed-off-by: Sophie Tyalie <dev@flowerpot.me>
This commit is contained in:
parent
aa1cc023f6
commit
cac33f493a
2 changed files with 33 additions and 4 deletions
|
@ -7,6 +7,16 @@ compatible: "zmk,behavior-custom-lock"
|
||||||
|
|
||||||
include: zero_param.yaml
|
include: zero_param.yaml
|
||||||
|
|
||||||
|
properties:
|
||||||
|
persistence:
|
||||||
|
type: string
|
||||||
|
default: "disabled"
|
||||||
|
required: false
|
||||||
|
enum:
|
||||||
|
- "disabled"
|
||||||
|
- "enabled"
|
||||||
|
- "per-profile"
|
||||||
|
|
||||||
child-binding:
|
child-binding:
|
||||||
description: Key definitions for lock variable
|
description: Key definitions for lock variable
|
||||||
|
|
||||||
|
|
|
@ -26,6 +26,10 @@ struct behavior_custom_lock_key_config {
|
||||||
char *locked_behavior_dev;
|
char *locked_behavior_dev;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct behavior_custom_lock_var_config {
|
||||||
|
uint8_t persistence;
|
||||||
|
};
|
||||||
|
|
||||||
struct behavior_custom_lock_var_data {
|
struct behavior_custom_lock_var_data {
|
||||||
bool active;
|
bool active;
|
||||||
};
|
};
|
||||||
|
@ -88,8 +92,15 @@ static int lock_settings_load(const char *name, size_t len, settings_read_cb rea
|
||||||
}
|
}
|
||||||
|
|
||||||
struct behavior_custom_lock_var_data* data = dev->data;
|
struct behavior_custom_lock_var_data* data = dev->data;
|
||||||
|
const struct behavior_custom_lock_var_config *config = dev->config;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
|
if (config->persistence == 0) {
|
||||||
|
LOG_WRN("key %s is not marked as persistent (%d), deleting", name, config->persistence);
|
||||||
|
lock_delete_state(name);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (len != sizeof(bool)) {
|
if (len != sizeof(bool)) {
|
||||||
LOG_DBG("something is of with size %d", len);
|
LOG_DBG("something is of with size %d", len);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -182,9 +193,13 @@ static int on_keymap_var_binding_pressed(struct zmk_behavior_binding *binding,
|
||||||
struct zmk_behavior_binding_event event) {
|
struct zmk_behavior_binding_event event) {
|
||||||
const struct device *dev = device_get_binding(binding->behavior_dev);
|
const struct device *dev = device_get_binding(binding->behavior_dev);
|
||||||
struct behavior_custom_lock_var_data* data = dev->data;
|
struct behavior_custom_lock_var_data* data = dev->data;
|
||||||
|
const struct behavior_custom_lock_var_config* config = dev->config;
|
||||||
|
|
||||||
data->active = !data->active;
|
data->active = !data->active;
|
||||||
lock_save_state(dev->name, data->active);
|
|
||||||
|
if (config->persistence != 0) {
|
||||||
|
lock_save_state(dev->name, data->active);
|
||||||
|
}
|
||||||
|
|
||||||
return ZMK_BEHAVIOR_OPAQUE;
|
return ZMK_BEHAVIOR_OPAQUE;
|
||||||
}
|
}
|
||||||
|
@ -217,9 +232,13 @@ static const struct behavior_driver_api behavior_lock_var_driver_api = {
|
||||||
#define CL_INST(id) \
|
#define CL_INST(id) \
|
||||||
DT_INST_FOREACH_CHILD(id, CL_CHILD) \
|
DT_INST_FOREACH_CHILD(id, CL_CHILD) \
|
||||||
static struct behavior_custom_lock_var_data behavior_lock_var_data_##id = { .active = false }; \
|
static struct behavior_custom_lock_var_data behavior_lock_var_data_##id = { .active = false }; \
|
||||||
\
|
static struct behavior_custom_lock_var_config behavior_lock_var_config_##id = { \
|
||||||
DEVICE_DT_INST_DEFINE(id, &behavior_lock_var_init, NULL, &behavior_lock_var_data_##id, \
|
.persistence = DT_INST_ENUM_IDX(id, persistence), \
|
||||||
NULL, APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_lock_var_driver_api);
|
};\
|
||||||
|
\
|
||||||
|
DEVICE_DT_INST_DEFINE(id, &behavior_lock_var_init, NULL, \
|
||||||
|
&behavior_lock_var_data_##id, &behavior_lock_var_config_##id, \
|
||||||
|
APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_lock_var_driver_api);
|
||||||
|
|
||||||
|
|
||||||
DT_INST_FOREACH_STATUS_OKAY(CL_INST)
|
DT_INST_FOREACH_STATUS_OKAY(CL_INST)
|
||||||
|
|
Loading…
Add table
Reference in a new issue