diff --git a/docs/keyd.scdoc b/docs/keyd.scdoc index f8ffb4b..507f130 100644 --- a/docs/keyd.scdoc +++ b/docs/keyd.scdoc @@ -610,7 +610,7 @@ A key may optionally be bound to an _action_ which accepts zero or more argument Set the current layout. *clear()* - Clear any active layers (the active layout is preserved). + Clear any toggled or oneshot layers. *toggle()* Permanently toggle the state of the given layer. diff --git a/src/keyboard.c b/src/keyboard.c index 7ec1a9d..5b06a16 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -397,21 +397,18 @@ static void clear_oneshot(struct keyboard *kbd) static void clear(struct keyboard *kbd) { size_t i; + clear_oneshot(kbd); for (i = 1; i < kbd->config.nr_layers; i++) { struct layer *layer = &kbd->config.layers[i]; if (layer->type != LT_LAYOUT) { - if (kbd->layer_state[i].active && kbd->layer_observer) - kbd->layer_observer(kbd, kbd->config.layers[i].name, 0); - - memset(&kbd->layer_state[i], 0, sizeof kbd->layer_state[0]); + if (kbd->layer_state[i].toggled) { + kbd->layer_state[i].toggled = 0; + deactivate_layer(kbd, i); + } } } - /* Neutralize upstroke for active keys. */ - memset(kbd->cache, 0, sizeof(kbd->cache)); - - kbd->oneshot_latch = 0; kbd->active_macro = NULL; reset_keystate(kbd);