From 4e6d593a87972fe108b11515c2dae29b2e234756 Mon Sep 17 00:00:00 2001 From: elpekenin Date: Sat, 23 Mar 2024 12:28:00 +0100 Subject: [PATCH] feat: default layer setter --- app/include/zmk/keymap.h | 1 + app/src/keymap.c | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/app/include/zmk/keymap.h b/app/include/zmk/keymap.h index 0d7dbaf3..c8a1da63 100644 --- a/app/include/zmk/keymap.h +++ b/app/include/zmk/keymap.h @@ -15,6 +15,7 @@ typedef uint32_t zmk_keymap_layers_state_t; uint8_t zmk_keymap_layer_default(void); +int zmk_keymap_layer_set_default(uint8_t layer); zmk_keymap_layers_state_t zmk_keymap_layer_state(void); bool zmk_keymap_layer_active(uint8_t layer); uint8_t zmk_keymap_highest_layer_active(void); diff --git a/app/src/keymap.c b/app/src/keymap.c index 94bd1204..d430aef3 100644 --- a/app/src/keymap.c +++ b/app/src/keymap.c @@ -108,6 +108,29 @@ static inline int set_layer_state(uint8_t layer, bool state) { uint8_t zmk_keymap_layer_default(void) { return _zmk_keymap_layer_default; } +int zmk_keymap_layer_set_default(uint8_t layer) { + int ret = 0; + uint8_t prev_default = _zmk_keymap_layer_default; + + ret = set_layer_state(layer, true); + if (ret < 0) { + LOG_WRN("Could not turn on the new default layer, bailing out."); + return ret; + } + + _zmk_keymap_layer_default = layer; + ret = set_layer_state(prev_default, false); + if (ret < 0) { + LOG_WRN("Could not disable current default layer, undoing changes."); + _zmk_keymap_layer_default = prev_default; + set_layer_state(layer, false); + return ret; + } + + LOG_DBG("default_layer_changed: %d", layer); + return 0; +} + zmk_keymap_layers_state_t zmk_keymap_layer_state(void) { return _zmk_keymap_layer_state; } bool zmk_keymap_layer_active_with_state(uint8_t layer, zmk_keymap_layers_state_t state_to_test) {