Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature: Layer toggle #98

Merged
merged 5 commits into from Aug 18, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions app/CMakeLists.txt
Expand Up @@ -38,6 +38,7 @@ target_sources(app PRIVATE src/behaviors/behavior_key_press.c)
target_sources(app PRIVATE src/behaviors/behavior_reset.c)
target_sources(app PRIVATE src/behaviors/behavior_mod_tap.c)
target_sources(app PRIVATE src/behaviors/behavior_momentary_layer.c)
target_sources(app PRIVATE src/behaviors/behavior_toggle_layer.c)
target_sources(app PRIVATE src/behaviors/behavior_transparent.c)
target_sources(app PRIVATE src/behaviors/behavior_sensor_rotate_key_press.c)
target_sources_ifdef(CONFIG_ZMK_RGB_UNDERGLOW app PRIVATE src/behaviors/behavior_rgb_underglow.c)
Expand Down
1 change: 1 addition & 0 deletions app/dts/behaviors.dtsi
Expand Up @@ -2,6 +2,7 @@
#include <behaviors/transparent.dtsi>
#include <behaviors/mod_tap.dtsi>
#include <behaviors/momentary_layer.dtsi>
#include <behaviors/toggle_layer.dtsi>
#include <behaviors/reset.dtsi>
#include <behaviors/sensor_rotate_key_press.dtsi>
#include <behaviors/rgb_underglow.dtsi>
15 changes: 15 additions & 0 deletions app/dts/behaviors/toggle_layer.dtsi
@@ -0,0 +1,15 @@
/*
* Copyright (c) 2020 Cody McGinnis <brainwart@gmail.com>
*
* SPDX-License-Identifier: MIT
*/

/ {
behaviors {
tog: behavior_toggle_layer {
compatible = "zmk,behavior-toggle-layer";
label = "TOGGLE_LAYER";
#binding-cells = <1>;
};
};
};
8 changes: 8 additions & 0 deletions app/dts/bindings/behaviors/zmk,behavior-toggle-layer.yaml
@@ -0,0 +1,8 @@
# Copyright (c) 2020, Cody McGinnis <brainwart@gmail.com>
# SPDX-License-Identifier: MIT

description: Toggle Layer

compatible: "zmk,behavior-toggle-layer"

include: one_param.yaml
2 changes: 2 additions & 0 deletions app/include/zmk/keymap.h
@@ -1,6 +1,8 @@
#pragma once

bool zmk_keymap_layer_active(u8_t layer);
int zmk_keymap_layer_activate(u8_t layer);
int zmk_keymap_layer_deactivate(u8_t layer);
int zmk_keymap_layer_toggle(u8_t layer);

int zmk_keymap_position_state_changed(u32_t position, bool pressed);
49 changes: 49 additions & 0 deletions app/src/behaviors/behavior_toggle_layer.c
@@ -0,0 +1,49 @@
/*
* Copyright (c) 2020 Cody McGinnis <brainwart@gmail.com>
*
* SPDX-License-Identifier: MIT
*/

#define DT_DRV_COMPAT zmk_behavior_toggle_layer

#include <device.h>
#include <drivers/behavior.h>
#include <logging/log.h>

#include <zmk/keymap.h>

LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);

struct behavior_tog_config { };
struct behavior_tog_data { };

static int behavior_tog_init(struct device *dev)
{
return 0;
};


static int tog_keymap_binding_pressed(struct device *dev, u32_t position, u32_t layer, u32_t _)
{
return zmk_keymap_layer_toggle(layer);
}

static int tog_keymap_binding_released(struct device *dev, u32_t position, u32_t layer, u32_t _)
petejohanson marked this conversation as resolved.
Show resolved Hide resolved
{
return 0;
}

static const struct behavior_driver_api behavior_tog_driver_api = {
.binding_pressed = tog_keymap_binding_pressed,
.binding_released = tog_keymap_binding_released,
};

static const struct behavior_tog_config behavior_tog_config = {};

static struct behavior_tog_data behavior_tog_data;

DEVICE_AND_API_INIT(behavior_tog, DT_INST_LABEL(0), behavior_tog_init,
&behavior_tog_data,
&behavior_tog_config,
APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT,
&behavior_tog_driver_api);
15 changes: 15 additions & 0 deletions app/src/keymap.c
Expand Up @@ -76,6 +76,11 @@ static struct zmk_behavior_binding zmk_sensor_keymap[ZMK_KEYMAP_LAYERS_LEN][ZMK_
WRITE_BIT(zmk_keymap_layer_state, layer, state); \
return 0;

bool zmk_keymap_layer_active(u8_t layer)
{
return (zmk_keymap_layer_state & (BIT(layer))) == (BIT(layer));
};

int zmk_keymap_layer_activate(u8_t layer)
{
SET_LAYER_STATE(layer, true);
Expand All @@ -86,6 +91,16 @@ int zmk_keymap_layer_deactivate(u8_t layer)
SET_LAYER_STATE(layer, false);
};

int zmk_keymap_layer_toggle(u8_t layer)
{
if (zmk_keymap_layer_active(layer))
petejohanson marked this conversation as resolved.
Show resolved Hide resolved
{
return zmk_keymap_layer_deactivate(layer);
}

return zmk_keymap_layer_activate(layer);
};

bool is_active_position(u32_t position, u8_t layer)
{
return (zmk_keymap_layer_state & BIT(layer)) == BIT(layer)
Expand Down
51 changes: 51 additions & 0 deletions docs/docs/behavior/layers.md
Expand Up @@ -39,3 +39,54 @@ Example:
```
&mo LOWER
```

## Toggle Layer

The "toggle layer" behavior allows you to enable a layer until the layer is manually disabled.

### Behavior Binding

- Reference: `&tog`
- Parameter: The layer number to enable/disable, e.g. `1`

Example:

```
&tog LOWER
```

"Toggle layer" for a :
```
#define DEFAULT 0
#define NAVI 1

#define NONE 0

/ {
keymap {
compatible = "zmk,keymap";

default_layer {
bindings = <
&tog NAVI &kp KDIV &kp KMLT &kp KMIN
&kp NUM_7 &kp NUM_8 &kp NUM_9 &kp KPLS
&kp NUM_4 &kp NUM_5 &kp NUM_6 &kp KPLS
&kp NUM_1 &kp NUM_2 &kp NUM_3 &kp RET
&kp NUM_0 &kp NUM_0 &kp DOT &kp RET
>;
};

nav_layer {
bindings = <
&tog NAVI &kp KDIV &kp KMLT &kp KMIN
&kp HOME &kp UARW &kp PGUP &kp KPLS
&kp LARW &none &kp RARW &kp KPLS
&kp END &kp DARW &kp PGDN &kp RET
&kp INS &kp INS &kp DEL &kp RET
>;
};
};
};
```

It is possible to use "toggle layer" to have keys that raise and lower the layers as well.