mirror of
https://github.com/zmkfirmware/zmk.git
synced 2026-03-19 20:45:18 -05:00
Compare commits
31 Commits
v0.3.0
...
dependabot
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d7dddad51a | ||
|
|
4ec69cb7e6 | ||
|
|
61de01abb0 | ||
|
|
c44343509a | ||
|
|
540bf2c32b | ||
|
|
df3db57c4c | ||
|
|
197d104fc9 | ||
|
|
522971f41d | ||
|
|
d28f73bcfa | ||
|
|
d5ba120d79 | ||
|
|
8d06a9b713 | ||
|
|
9a8fdd66ea | ||
|
|
0b5a103c18 | ||
|
|
f09e551929 | ||
|
|
ee69b9e3c7 | ||
|
|
5144de677d | ||
|
|
5225952f96 | ||
|
|
9fcce45cb5 | ||
|
|
62007e500b | ||
|
|
ccf20a1f5c | ||
|
|
c7fae18ae1 | ||
|
|
61da930ed5 | ||
|
|
3609ac6fc8 | ||
|
|
45700887ba | ||
|
|
a8a392807e | ||
|
|
f3233c1b60 | ||
|
|
919bce7962 | ||
|
|
cc19ff7c5b | ||
|
|
90363719a2 | ||
|
|
e57bf5af37 | ||
|
|
9aaf87c6d2 |
4
.github/workflows/release-please.yml
vendored
4
.github/workflows/release-please.yml
vendored
@@ -69,10 +69,10 @@ jobs:
|
||||
exit 1
|
||||
fi
|
||||
|
||||
git config user.name github-actions[bot]
|
||||
git config user.email 41898282+github-actions[bot]@users.noreply.github.com
|
||||
git clone "https://x-access-token:$ZMK_RELEASE_PLEASE_TOKEN@github.com/zmkfirmware/unified-zmk-config-template.git"
|
||||
cd unified-zmk-config-template
|
||||
git config user.name github-actions[bot]
|
||||
git config user.email 41898282+github-actions[bot]@users.noreply.github.com
|
||||
sed -i 's/^\(\s*\)revision: .*/\1revision: '"$VERSION"'/' config/west.yml
|
||||
sed -i 's|uses: zmkfirmware/zmk/.github/workflows/build-user-config.yml@.*|uses: zmkfirmware/zmk/.github/workflows/build-user-config.yml@'"$VERSION"'|' .github/workflows/build.yml
|
||||
git add .
|
||||
|
||||
3
.github/workflows/stale.yml
vendored
3
.github/workflows/stale.yml
vendored
@@ -7,7 +7,7 @@ jobs:
|
||||
stale:
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- uses: actions/stale@v9.1.0
|
||||
- uses: actions/stale@v10.1.0
|
||||
with:
|
||||
days-before-pr-stale: 300 # ~10 months
|
||||
stale-pr-label: "stale"
|
||||
@@ -22,6 +22,7 @@ jobs:
|
||||
This PR was closed because it had no activity for over 10 months.
|
||||
Feel free to give a status update or re-open when it has been
|
||||
rebased and is ready for review (again).
|
||||
days-before-issue-stale: 1000 # ~3 years
|
||||
days-before-issue-close: -1
|
||||
ascending: true # Process older PRs first
|
||||
operations-per-run: 30 # Default value, listed here again to make it explicit
|
||||
|
||||
12
app/boards/nrf52840dongle_nrf52840.conf
Normal file
12
app/boards/nrf52840dongle_nrf52840.conf
Normal file
@@ -0,0 +1,12 @@
|
||||
# Copyright (c) 2025 The ZMK Contributors
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
CONFIG_ZMK_BLE=y
|
||||
CONFIG_ZMK_USB=y
|
||||
|
||||
CONFIG_MPU_ALLOW_FLASH_WRITE=y
|
||||
CONFIG_NVS=y
|
||||
CONFIG_SETTINGS_NVS=y
|
||||
CONFIG_FLASH=y
|
||||
CONFIG_FLASH_PAGE_LAYOUT=y
|
||||
CONFIG_FLASH_MAP=y
|
||||
@@ -3,3 +3,10 @@ CONFIG_SERIAL=n
|
||||
CONFIG_UART_CONSOLE=n
|
||||
CONFIG_UART_INTERRUPT_DRIVEN=n
|
||||
CONFIG_ZMK_USB=y
|
||||
|
||||
CONFIG_MPU_ALLOW_FLASH_WRITE=y
|
||||
CONFIG_NVS=y
|
||||
CONFIG_SETTINGS_NVS=y
|
||||
CONFIG_FLASH=y
|
||||
CONFIG_FLASH_PAGE_LAYOUT=y
|
||||
CONFIG_FLASH_MAP=y
|
||||
15
app/boards/rpi_pico.overlay
Normal file
15
app/boards/rpi_pico.overlay
Normal file
@@ -0,0 +1,15 @@
|
||||
|
||||
&uart0 { status = "disabled"; };
|
||||
|
||||
&code_partition {
|
||||
reg = <0x100 (DT_SIZE_M(2) - 0x100 - DT_SIZE_K(512))>;
|
||||
};
|
||||
|
||||
&flash0 {
|
||||
partitions {
|
||||
storage_partition: partition@180000 {
|
||||
reg = <0x180000 DT_SIZE_K(512)>;
|
||||
read-only;
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -14,6 +14,7 @@
|
||||
|
||||
// This is a sample keymap intended to be replaced with your own
|
||||
base_layer {
|
||||
display-name = "Base Layer";
|
||||
bindings = <
|
||||
&kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P
|
||||
&kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
compatible = "zmk,keymap";
|
||||
|
||||
default_layer {
|
||||
display-name = "Default Layer";
|
||||
bindings = <
|
||||
&kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp MINUS
|
||||
&kp TAB &kp A &kp S &kp D &kp F &kp G &kp BSPC &kp H &kp J &kp K &kp L &kp SEMI &kp RSHFT
|
||||
@@ -29,6 +30,7 @@
|
||||
>;
|
||||
};
|
||||
lower_layer {
|
||||
display-name = "Lower Layer";
|
||||
bindings = <
|
||||
&trans &none &none &none &none &none &none &kp EQUAL &kp PLUS &kp STAR &kp PRCNT &trans
|
||||
&trans &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &trans &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &trans
|
||||
@@ -38,6 +40,7 @@
|
||||
>;
|
||||
};
|
||||
raise_layer {
|
||||
display-name = "Raise Layer";
|
||||
bindings = <
|
||||
&trans &kp BSLH &kp EXCL &kp AMPS &kp PIPE &none &none &kp EQUAL &kp PLUS &kp STAR &kp PRCNT &trans
|
||||
&trans &kp HASH &kp GRAVE &kp DQT &kp SQT &kp TILDE &trans &kp LEFT &kp DOWN &kp UP &kp RIGHT &kp DLLR &trans
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
compatible = "zmk,keymap";
|
||||
|
||||
default_layer {
|
||||
display-name = "Default Layer";
|
||||
// | Esc | Vol Up | Esc | F1 | F2 | F3 | F4 | F5 | F6 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | Del |
|
||||
// | Home | Vol Dn | ` | 1 | 2 | 3 | 4 | 5 | 6 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | Bk Spc |
|
||||
// | End | Tab | Tab | Q | W | E | R | T | Y | T | Y | U | I | O | P | [ | ] | \ |
|
||||
@@ -36,6 +37,7 @@
|
||||
};
|
||||
|
||||
lower_layer {
|
||||
display-name = "Lower Layer";
|
||||
// | | | | | | | | | | | | | | | | | | |
|
||||
// | | | | | | | | | | | | | | | | | | |
|
||||
// | | | | | | | | | | | | | | | | | | |
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
compatible = "zmk,keymap";
|
||||
|
||||
default_layer {
|
||||
display-name = "Default Layer";
|
||||
|
||||
bindings = <
|
||||
&tog 1 &kp C_PREV &kp C_PP &kp C_NEXT
|
||||
@@ -23,6 +24,7 @@
|
||||
};
|
||||
|
||||
num_layer {
|
||||
display-name = "Num Layer";
|
||||
bindings = <
|
||||
&trans &kp N7 &kp N8 &kp N9
|
||||
&trans &kp N4 &kp N5 &kp N6
|
||||
@@ -31,6 +33,7 @@
|
||||
};
|
||||
|
||||
lower_layer {
|
||||
display-name = "Lower Layer";
|
||||
bindings = <
|
||||
&bt BT_CLR &none &sys_reset &bootloader
|
||||
&trans &bt BT_SEL 3 &bt BT_SEL 4 &none
|
||||
@@ -39,6 +42,7 @@
|
||||
};
|
||||
|
||||
raise_layer {
|
||||
display-name = "Raise Layer";
|
||||
bindings = <
|
||||
&kp 0x68 &kp 0x69 &kp 0x6A &kp 0x6B
|
||||
&kp 0x6C &kp 0x6D &kp 0x6E &kp 0x6F
|
||||
@@ -46,4 +50,4 @@
|
||||
>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
compatible = "zmk,keymap";
|
||||
|
||||
default_layer {
|
||||
display-name = "Default Layer";
|
||||
// ------------------------------------------------------------------------------------------
|
||||
// | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | BSPC |
|
||||
// | TAB | Q | W | E | R | T | Y | U | I | O | P | \ |
|
||||
@@ -33,6 +34,7 @@
|
||||
};
|
||||
|
||||
lower_layer {
|
||||
display-name = "Lower Layer";
|
||||
// -------------------------------------------------------------------------------------------
|
||||
// | ESC | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 |
|
||||
// | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | DEL |
|
||||
@@ -49,6 +51,7 @@
|
||||
};
|
||||
|
||||
raise_layer {
|
||||
display-name = "Raise Layer";
|
||||
// ------------------------------------------------------------------------------------------
|
||||
// | ESC | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 |
|
||||
// | ~ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | DEL |
|
||||
@@ -65,6 +68,7 @@
|
||||
};
|
||||
|
||||
adjust_layer {
|
||||
display-name = "Adjust Layer";
|
||||
// ------------------------------------------------------------------------------------------
|
||||
// |tog(4)| F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 |
|
||||
// | | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA |LALT(PRTSN)|
|
||||
@@ -81,6 +85,7 @@
|
||||
};
|
||||
|
||||
flock_layer {
|
||||
display-name = "Flock Layer";
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// |tog(4) | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | |
|
||||
// |out tog|BT_SEL 0|BT_SEL 1|BT_SEL 2|BT_SEL 3|BT_SEL 4|BT_PRV|BT_NXT|BT_CLR| | | |
|
||||
@@ -96,4 +101,4 @@
|
||||
>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
compatible = "zmk,keymap";
|
||||
|
||||
default_layer {
|
||||
display-name = "Default Layer";
|
||||
|
||||
bindings = <
|
||||
&kp ESC &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC
|
||||
@@ -26,6 +27,7 @@
|
||||
};
|
||||
|
||||
function_layer {
|
||||
display-name = "Function Layer";
|
||||
|
||||
bindings = <
|
||||
&bootloader &out OUT_TOG &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &trans
|
||||
|
||||
@@ -75,6 +75,7 @@
|
||||
compatible = "zmk,keymap";
|
||||
|
||||
MAIN_layer {
|
||||
display-name = "Main Layer";
|
||||
bindings = <
|
||||
&kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O
|
||||
&kp Q &kp A &kp S &kp D < SYM F &kp G &kp H < SYM J &kp K &kp L &kp SQT &kp P
|
||||
@@ -84,6 +85,7 @@
|
||||
};
|
||||
|
||||
SYM_layer {
|
||||
display-name = "Sym Layer";
|
||||
bindings = <
|
||||
&kp N7 &kp N8 &kp N9 &kp STAR &kp DLLR &kp LBRC &kp RBRC &kp HASH
|
||||
&kp AMPS &kp EXCL &kp N1 &kp N2 &kp N3 &kp EQUAL &kp LT &kp LPAR &kp RPAR &kp GT &kp PIPE &none
|
||||
@@ -93,6 +95,7 @@
|
||||
};
|
||||
|
||||
NAV_layer {
|
||||
display-name = "Nav Layer";
|
||||
bindings = <
|
||||
&kp C_VOL_DN &kp C_VOL_UP &kp C_NEXT &kp C_PP &none &kp F7 &kp F8 &kp F9
|
||||
&kp C_PREV &kp LEFT &kp DOWN &kp UP &kp RIGHT &kp LC(TAB) &kp PSCRN &kp F1 &kp F2 &kp F3 &kp F10 &kp F12
|
||||
@@ -102,6 +105,7 @@
|
||||
};
|
||||
|
||||
BT_layer {
|
||||
display-name = "BT Layer";
|
||||
bindings = <
|
||||
&none &none &none &none &none &none &none &none
|
||||
&none &none &none &none &none &none &none &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &none
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
compatible = "zmk,keymap";
|
||||
|
||||
default_layer {
|
||||
display-name = "Default Layer";
|
||||
bindings = <
|
||||
&kp N9 &kp N8
|
||||
&kp N7 &kp N6
|
||||
@@ -22,4 +23,4 @@
|
||||
>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
compatible = "zmk,keymap";
|
||||
|
||||
default_layer {
|
||||
display-name = "Default Layer";
|
||||
bindings = <
|
||||
&kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSPC
|
||||
&kp TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT
|
||||
@@ -26,6 +27,7 @@
|
||||
};
|
||||
|
||||
num_mods {
|
||||
display-name = "Num Mods";
|
||||
bindings = <
|
||||
&kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp DEL
|
||||
&kp TAB &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp MINUS &kp PG_UP &kp LBKT &kp RBKT &kp BSLH
|
||||
@@ -35,6 +37,7 @@
|
||||
};
|
||||
|
||||
bt_control {
|
||||
display-name = "Bt Control";
|
||||
bindings = <
|
||||
&bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans &trans &trans &trans &trans &trans
|
||||
&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans
|
||||
@@ -43,4 +46,4 @@
|
||||
>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
compatible = "zmk,keymap";
|
||||
|
||||
default_layer {
|
||||
display-name = "Default Layer";
|
||||
// -----------------------------------------------------------------------------------------
|
||||
// | TAB | Q | W | E | R | T | | Y | U | I | O | P | BSPC |
|
||||
// | CTRL | A | S | D | F | G | | H | J | K | L | ; | ' |
|
||||
@@ -26,6 +27,7 @@
|
||||
>;
|
||||
};
|
||||
lower_layer {
|
||||
display-name = "Lower Layer";
|
||||
// -----------------------------------------------------------------------------------------
|
||||
// | TAB | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | BSPC |
|
||||
// | BTCLR| BT1 | BT2 | BT3 | BT4 | BT5 | | LFT | DWN | UP | RGT | | |
|
||||
@@ -40,6 +42,7 @@
|
||||
};
|
||||
|
||||
raise_layer {
|
||||
display-name = "Raise Layer";
|
||||
// -----------------------------------------------------------------------------------------
|
||||
// | TAB | ! | @ | # | $ | % | | ^ | & | * | ( | ) | BSPC |
|
||||
// | CTRL | | | | | | | - | = | [ | ] | \ | ` |
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
keymap {
|
||||
compatible = "zmk,keymap";
|
||||
default_layer {
|
||||
display-name = "Default Layer";
|
||||
bindings = <
|
||||
//╭──────────┬──────────┬──────────┬──────────┬──────────╮ ╭──────────┬──────────┬──────────┬──────────┬──────────╮
|
||||
//│ Q │ W │ E │ R │ T │ │ Y │ U │ I │ O │ P │
|
||||
@@ -50,6 +51,7 @@
|
||||
};
|
||||
|
||||
right_layer {
|
||||
display-name = "Right Layer";
|
||||
bindings = <
|
||||
//╭──────────┬──────────┬──────────┬──────────┬──────────╮ ╭──────────┬──────────┬──────────┬──────────┬──────────╮
|
||||
//│ INSERT │ 1 │ 2 │ 3 │ │ │ HOME │ PAGE DN │ PAGE UP │ END │ : │
|
||||
@@ -67,6 +69,7 @@
|
||||
};
|
||||
|
||||
left_layer {
|
||||
display-name = "Left Layer";
|
||||
bindings = <
|
||||
//╭──────────┬──────────┬──────────┬──────────┬──────────╮ ╭──────────┬──────────┬──────────┬──────────┬──────────╮
|
||||
//│ │ [ │ { │ } │ │ │ ^ │ ( │ ) │ ] │ ~ │
|
||||
@@ -84,6 +87,7 @@
|
||||
};
|
||||
|
||||
tri_layer {
|
||||
display-name = "Tri Layer";
|
||||
bindings = <
|
||||
//╭──────────┬──────────┬──────────┬──────────┬──────────╮ ╭──────────┬──────────┬──────────┬──────────┬──────────╮
|
||||
//│ RESET │ │ │ │PROFILE 0 │ │ │ │ │ │ RESET │
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
compatible = "zmk,keymap";
|
||||
|
||||
default_layer {
|
||||
display-name = "Default Layer";
|
||||
// -----------------------------------------------------------------------------------------
|
||||
// | TAB | Q | W | E | R | T | Y | U | I | O | P | BSPC |
|
||||
// | ESC | A | S | D | F | G | H | J | K | L | ; | ' |
|
||||
@@ -29,6 +30,7 @@
|
||||
};
|
||||
|
||||
lower {
|
||||
display-name = "Lower";
|
||||
bindings = <
|
||||
&kp LS(GRAVE) &kp LS(N1) &kp LS(N2) &kp LS(N3) &kp LS(N4) &kp LS(N5) &kp LS(N6) &kp LS(N7) &kp LS(N8) &kp LS(N9) &kp LS(N0) &kp DEL
|
||||
&kp DEL &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp UNDER &kp PLUS &kp LBRC &kp RBRC &kp PIPE
|
||||
@@ -40,6 +42,7 @@
|
||||
};
|
||||
|
||||
raise {
|
||||
display-name = "Raise";
|
||||
bindings = <
|
||||
&kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSPC
|
||||
&kp DEL &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH
|
||||
@@ -51,6 +54,7 @@
|
||||
};
|
||||
|
||||
control {
|
||||
display-name = "Control";
|
||||
bindings = <
|
||||
&sys_reset &bootloader &bt BT_CLR &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &trans &trans
|
||||
&bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &trans &trans &trans &trans &trans &trans &trans &trans &trans
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
compatible = "zmk,keymap";
|
||||
|
||||
default {
|
||||
display-name = "Default";
|
||||
// --------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
// Q | W | E | R | T | | Y | U | I | O | P |
|
||||
// A | S | D | F | G | | H | J | K | L | ; |
|
||||
@@ -27,6 +28,7 @@
|
||||
>;
|
||||
};
|
||||
numbers {
|
||||
display-name = "Numbers";
|
||||
// --------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
// 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 |
|
||||
// TAB | BT_PRV | BT_NXT | VOL-| VOL+| | < | v | ∧ | > | ' |
|
||||
@@ -40,6 +42,7 @@
|
||||
>;
|
||||
};
|
||||
symbols {
|
||||
display-name = "Symbols";
|
||||
// --------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
// ESC | F1 | F2 | F3 | F4 | | OUT_USB | OUT_BLE | | = | - |
|
||||
// CAPS| F5 | F6 | F7 | F8 | | [ | ] | | ` | \ |
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
compatible = "zmk,keymap";
|
||||
|
||||
default_layer {
|
||||
display-name = "Default Layer";
|
||||
bindings = <
|
||||
< ADJT ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp DEL
|
||||
&mt LCTRL TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT
|
||||
@@ -27,6 +28,7 @@
|
||||
};
|
||||
|
||||
lower {
|
||||
display-name = "Lower";
|
||||
bindings = <
|
||||
&kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp C_PLAY_PAUSE
|
||||
&trans &trans &trans &trans &trans &trans &kp LEFT &kp DOWN &kp UP &kp RIGHT &trans &trans
|
||||
@@ -35,6 +37,7 @@
|
||||
>;
|
||||
};
|
||||
raise {
|
||||
display-name = "Raise";
|
||||
bindings = <
|
||||
&kp TILDE &trans &trans &trans &trans &trans &trans &trans &trans &kp MINUS &kp EQUAL &kp C_PLAY_PAUSE
|
||||
&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp BSLH
|
||||
@@ -44,6 +47,7 @@
|
||||
};
|
||||
|
||||
adjust {
|
||||
display-name = "Adjust";
|
||||
bindings = <
|
||||
&trans &bt BT_NXT &bt BT_PRV &trans &trans &bt BT_CLR &trans &trans &trans &trans &trans &trans
|
||||
&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans
|
||||
@@ -52,4 +56,4 @@
|
||||
>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
compatible = "zmk,keymap";
|
||||
|
||||
default_layer {
|
||||
display-name = "Default Layer";
|
||||
/* QWERTY
|
||||
* .----------------------------------------------------------------------------------------------------------------------.
|
||||
* | ` | 1 | 2 | 3 | 4 | 5 | [ | | ] | 6 | 7 | 8 | 9 | 0 | PScr |
|
||||
@@ -40,6 +41,7 @@
|
||||
>;
|
||||
};
|
||||
lower_layer {
|
||||
display-name = "Lower Layer";
|
||||
/* .----------------------------------------------------------------------------------------------------------------------.
|
||||
* | F11 | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F12 |
|
||||
* |------+------+------+------+------+------+------+--------------------+------+------+------+------+------+------+------|
|
||||
@@ -61,6 +63,7 @@
|
||||
>;
|
||||
};
|
||||
raise_layer {
|
||||
display-name = "Raise Layer";
|
||||
/* .----------------------------------------------------------------------------------------------------------------------.
|
||||
* | | BT 0 | BT 1 | BT 2 | BT 3 | | BTCL | | | | | | | | |
|
||||
* |------+------+------+------+------+------+------+--------------------+------+------+------+------+------+------+------|
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
compatible = "zmk,keymap";
|
||||
|
||||
default_layer {
|
||||
display-name = "Default Layer";
|
||||
bindings = <
|
||||
&kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6
|
||||
&kp TAB &kp Q &kp W &kp E &kp R &kp T &kp N7
|
||||
@@ -34,6 +35,7 @@
|
||||
};
|
||||
|
||||
arrow_layer {
|
||||
display-name = "Arrow Layer";
|
||||
bindings = <
|
||||
&bt BT_SEL 0 &bt BT_SEL 1 &trans &trans &trans &out OUT_USB &out OUT_BLE
|
||||
&trans &trans &kp UP &trans &rgb_ug RGB_TOG &rgb_ug RGB_HUI &rgb_ug RGB_HUD
|
||||
@@ -44,6 +46,7 @@
|
||||
};
|
||||
|
||||
function_layer {
|
||||
display-name = "Function Layer";
|
||||
bindings = <
|
||||
&trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6
|
||||
&trans &kp P &kp O &kp I &kp U &kp Y &kp F7
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
compatible = "zmk,keymap";
|
||||
|
||||
default_layer {
|
||||
display-name = "Default Layer";
|
||||
bindings = <
|
||||
&kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6
|
||||
&kp TAB &kp Q &kp W &kp E &kp R &kp T &kp N7
|
||||
@@ -34,6 +35,7 @@
|
||||
};
|
||||
|
||||
arrow_layer {
|
||||
display-name = "Arrow Layer";
|
||||
bindings = <
|
||||
&bt BT_SEL 0 &bt BT_SEL 1 &trans &trans &trans &out OUT_USB &out OUT_BLE
|
||||
&trans &trans &kp UP &trans &rgb_ug RGB_TOG &rgb_ug RGB_HUI &rgb_ug RGB_HUD
|
||||
@@ -44,6 +46,7 @@
|
||||
};
|
||||
|
||||
function_layer {
|
||||
display-name = "Function Layer";
|
||||
bindings = <
|
||||
&trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6
|
||||
&trans &kp P &kp O &kp I &kp U &kp Y &kp F7
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
// ------------------------------------------- -----------------------------------------------
|
||||
|
||||
default_layer {
|
||||
display-name = "Default Layer";
|
||||
bindings = <
|
||||
&kp ESC &kp Q &kp W &kp E &kp R &kp T /**/ &kp Y &kp U &kp I &kp O &kp P &none &kp BACKSPACE
|
||||
&kp TAB &kp A &kp S &kp D &kp F &kp G /**/ &kp H &kp J &kp K &kp L &kp SQT &kp ENTER
|
||||
@@ -37,6 +38,7 @@
|
||||
// ------------------------------------------- -----------------------------------------------
|
||||
|
||||
symbols_layer {
|
||||
display-name = "Symbols Layer";
|
||||
bindings = <
|
||||
&kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 /**/ &kp N7 &kp N8 &kp N9 &kp N0 &kp PSCRN &none &kp DEL
|
||||
&kp GRAVE &none &kp LEFT &kp UP &kp RIGHT &kp C_VOL_UP /**/ &kp LBKT &kp RBKT &kp MINUS &kp EQUAL &kp SEMI &kp BACKSLASH
|
||||
@@ -53,6 +55,7 @@
|
||||
// ------------------------------------------- -----------------------------------------------
|
||||
|
||||
fn_layer {
|
||||
display-name = "Fn Layer";
|
||||
bindings = <
|
||||
&kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 /**/ &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &none &kp F12
|
||||
&kp CAPS &none &kp HOME &kp PG_UP &kp END &none /**/ &none &none &none &none &none &none
|
||||
|
||||
@@ -25,6 +25,7 @@ As such, those are in use within the default layer at this time.*/
|
||||
compatible = "zmk,keymap";
|
||||
|
||||
default_layer {
|
||||
display-name = "Default Layer";
|
||||
// ---------------------------------------------------------------------------------------------------------------------------------
|
||||
// | GRAVE | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | DEL |
|
||||
// | TAB | Q | W | E | R | T | | Y | U | I | O | P | BSPC |
|
||||
@@ -40,6 +41,7 @@ As such, those are in use within the default layer at this time.*/
|
||||
>;
|
||||
};
|
||||
lower_layer {
|
||||
display-name = "Lower Layer";
|
||||
// ---------------------------------------------------------------------------------------------------------------------------------
|
||||
// | | | | | | | | | | | | | |
|
||||
// | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | |
|
||||
@@ -55,6 +57,7 @@ As such, those are in use within the default layer at this time.*/
|
||||
>;
|
||||
};
|
||||
raise_layer {
|
||||
display-name = "Raise Layer";
|
||||
// ---------------------------------------------------------------------------------------------------------------------------------
|
||||
// | | | | | | | | | | | | | |
|
||||
// | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | DEL |
|
||||
@@ -70,6 +73,7 @@ As such, those are in use within the default layer at this time.*/
|
||||
>;
|
||||
};
|
||||
adjust_layer {
|
||||
display-name = "Adjust Layer";
|
||||
// ---------------------------------------------------------------------------------------------------------------------------------
|
||||
// | ` | ! | @ | # | $ | % | | ^ | & | * | ( | ) | EP TOG |
|
||||
// | BT CLR | BT SEL0 | BT SEL1 | BT SEL2 | BGT SEL3 | BT SEL4 | | RGB EFF+ | RGB HUE+ | RGB SAT+ | RGB SPD+ | RGB BRI+ | RGB TOG |
|
||||
@@ -85,4 +89,4 @@ As such, those are in use within the default layer at this time.*/
|
||||
>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
@@ -56,6 +56,7 @@
|
||||
compatible = "zmk,keymap";
|
||||
|
||||
default_layer {
|
||||
display-name = "Default Layer";
|
||||
bindings = <
|
||||
&kp Q &kp W &kp E &kp R &kp T &kp H &kp U &kp I &kp O &kp P
|
||||
&hm LGUI A &hm LALT S &hm LCTRL D &hm LSHFT F &kp G &kp N &hm RSHFT J &hm RCTRL K &hm LALT L &hm RGUI SQT
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
compatible = "zmk,keymap";
|
||||
|
||||
default_layer {
|
||||
display-name = "Default Layer";
|
||||
// ------------------------------------------------------------------------------------------------------------
|
||||
// | ESC | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ` |
|
||||
// | TAB | Q | W | E | R | T | | Y | U | I | O | P | - |
|
||||
@@ -29,6 +30,7 @@
|
||||
};
|
||||
|
||||
lower_layer {
|
||||
display-name = "Lower Layer";
|
||||
// ------------------------------------------------------------------------------------------------------------
|
||||
// | BTCLR | BT1 | BT2 | BT3 | BT4 | BT5 | | | | | | | |
|
||||
// | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 |
|
||||
@@ -45,6 +47,7 @@
|
||||
};
|
||||
|
||||
raise_layer {
|
||||
display-name = "Raise Layer";
|
||||
// ------------------------------------------------------------------------------------------------------------
|
||||
// | | | | | | | | | | | | | |
|
||||
// | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | |
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
compatible = "zmk,keymap";
|
||||
|
||||
default_layer {
|
||||
display-name = "Default Layer";
|
||||
bindings = <
|
||||
&kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS
|
||||
&kp LGUI &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &mt RGUI RBKT
|
||||
@@ -23,6 +24,7 @@
|
||||
};
|
||||
|
||||
lower_layer {
|
||||
display-name = "Lower Layer";
|
||||
bindings = <
|
||||
&kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp EQUAL
|
||||
&kp F11 &kp TAB &bt BT_CLR &kp HOME &sys_reset &kp PG_UP &kp C_VOL_UP &kp C_VOL_UP &kp PG_UP &studio_unlock &kp HOME &kp INS &kp DEL &kp F12
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
compatible = "zmk,keymap";
|
||||
|
||||
default_layer {
|
||||
display-name = "Default Layer";
|
||||
|
||||
bindings = <
|
||||
&trans &kp EQUAL &kp KP_SLASH &kp KP_MULTIPLY &kp KP_MINUS
|
||||
@@ -26,6 +27,7 @@
|
||||
};
|
||||
|
||||
num_layer {
|
||||
display-name = "Num Layer";
|
||||
bindings = <
|
||||
&trans &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2
|
||||
&trans &kp HOME &trans &kp PAGE_UP &trans
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
compatible = "zmk,keymap";
|
||||
|
||||
default_layer {
|
||||
display-name = "Default Layer";
|
||||
// ---------------------------------------------------------------------------------------------------------------------------------
|
||||
// | ESC | Q | W | E | R | T | | Y | U | I | O | P | \ |
|
||||
// | TAB | A | S | D | F | G | | H | J | K | L | ; | ' |
|
||||
@@ -28,6 +29,7 @@
|
||||
sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>;
|
||||
};
|
||||
function_layer {
|
||||
display-name = "Function Layer";
|
||||
// ---------------------------------------------------------------------------------------------------------------------------------
|
||||
// | | |BT_CLR|BTSEL0|BTSEL1|BTSEL2| | | | | | | |
|
||||
// | | | |BTSEL3|BTSEL4| | | | | | | | |
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
compatible = "zmk,keymap";
|
||||
|
||||
default_layer {
|
||||
display-name = "Default Layer";
|
||||
// ---------------------------------------------------------------------------------------------------------------------------------
|
||||
// | ESC | Q | W | E | R | T | | Y | U | I | O | P | \ |
|
||||
// | TAB | A | S | D | F | G | | H | J | K | L | ; | ' |
|
||||
@@ -28,6 +29,7 @@
|
||||
sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>;
|
||||
};
|
||||
function_layer {
|
||||
display-name = "Function Layer";
|
||||
// ---------------------------------------------------------------------------------------------------------------------------------
|
||||
// | | |BT_CLR|BTSEL0|BTSEL1|BTSEL2| | | | | | | |
|
||||
// | | | |BTSEL3|BTSEL4| | | | | | | | |
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
compatible = "zmk,keymap";
|
||||
|
||||
default_layer {
|
||||
display-name = "Default Layer";
|
||||
// ---------------------------------------------------------------------------------------------------------------------------------
|
||||
// | ESC | Q | W | E | R | T | | Y | U | I | O | P | \ |
|
||||
// | TAB | A | S | D | F | G | | H | J | K | L | ; | ' |
|
||||
@@ -36,6 +37,7 @@
|
||||
sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>;
|
||||
};
|
||||
function_layer {
|
||||
display-name = "Function Layer";
|
||||
// ---------------------------------------------------------------------------------------------------------------------------------
|
||||
// | | |BT_CLR|BTSEL0|BTSEL1|BTSEL2| | | | | | | |
|
||||
// | | | |BTSEL3|BTSEL4| | | | | | | | |
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
compatible = "zmk,keymap";
|
||||
|
||||
default_layer {
|
||||
display-name = "Default Layer";
|
||||
// ------------------------------------------------------------------------------------------------------------
|
||||
// | ESC | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ` |
|
||||
// | TAB | Q | W | E | R | T | | Y | U | I | O | P | - |
|
||||
@@ -32,6 +33,7 @@
|
||||
};
|
||||
|
||||
lower_layer {
|
||||
display-name = "Lower Layer";
|
||||
// ------------------------------------------------------------------------------------------------------------
|
||||
// | BTCLR | BT1 | BT2 | BT3 | BT4 | BT5 | | | | | | | |
|
||||
// | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 |
|
||||
@@ -50,6 +52,7 @@
|
||||
};
|
||||
|
||||
raise_layer {
|
||||
display-name = "Raise Layer";
|
||||
// ------------------------------------------------------------------------------------------------------------
|
||||
// | | | | | | | | | | | | | |
|
||||
// | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | |
|
||||
|
||||
@@ -45,6 +45,7 @@
|
||||
compatible = "zmk,keymap";
|
||||
|
||||
default_layer {
|
||||
display-name = "Default Layer";
|
||||
// ------------------------------------------------------------------------------------------------------------
|
||||
// 0| ESC | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | = | 11
|
||||
// 12| TAB | Q | W | E | R | T | | Y | U | I | O | P | [ | 23
|
||||
@@ -63,6 +64,7 @@
|
||||
};
|
||||
|
||||
lower_layer {
|
||||
display-name = "Lower Layer";
|
||||
// ------------------------------------------------------------------------------------------------------------
|
||||
// | ` | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | F11 |
|
||||
// | | ! | HOME| ^ | END | % | | VOL^ | PGUP | INS | ^ | PSCR | - |
|
||||
@@ -81,6 +83,7 @@
|
||||
};
|
||||
|
||||
raise_layer {
|
||||
display-name = "Raise Layer";
|
||||
// ------------------------------------------------------------------------------------------------------------
|
||||
// |BTCLR| BT1 | BT2 | BT3 | BT4 | BT5 | |OUTTOG|OUTUSB| OUTBT | | RESET | FLASH |
|
||||
// | | INS | PSCR | GUI | RESET | | | PGUP | | ^ | | | |
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
compatible = "zmk,keymap";
|
||||
|
||||
default_layer {
|
||||
display-name = "Default Layer";
|
||||
// ------------------------------------------------------------------------------------------
|
||||
// | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BSPC |
|
||||
// | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ |
|
||||
@@ -30,6 +31,7 @@
|
||||
};
|
||||
|
||||
fn_layer {
|
||||
display-name = "Fn Layer";
|
||||
bindings = <
|
||||
&kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &bootloader
|
||||
&trans &bt BT_CLR &none &none &none &none &none &none &none &none &none &none &none &sys_reset
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
compatible = "zmk,keymap";
|
||||
|
||||
default_layer {
|
||||
display-name = "Default Layer";
|
||||
// -----------------------------------------------------------------------------------------
|
||||
// | Q | W | E | R | T | | Y | U | I | O | P |
|
||||
// | A | S | D | F | G | | H | J | K | L | ; |
|
||||
@@ -26,6 +27,7 @@
|
||||
>;
|
||||
};
|
||||
nav_layer {
|
||||
display-name = "Nav Layer";
|
||||
// -----------------------------------------------------------------------------------------
|
||||
// |BTCLR| | ESC | ~ | | | TAB | HOME | UP | END | DEL |
|
||||
// | BT1 | GUI | ALT | CTRL | NUM | | / | LEFT | DOWN | RGT | BSPC |
|
||||
@@ -40,6 +42,7 @@
|
||||
};
|
||||
|
||||
sym_layer {
|
||||
display-name = "Sym Layer";
|
||||
// -----------------------------------------------------------------------------------------
|
||||
// | ! | @ | # | $ | % | | ^ | & | * | ( | ) |
|
||||
// | | | | | | | - | = | { | } | "|" |
|
||||
@@ -56,6 +59,7 @@
|
||||
// This layer is unreachable until "tri layer state" is sorted out.
|
||||
// Leaving it here for completeness.
|
||||
num_layer {
|
||||
display-name = "Num Layer";
|
||||
// -----------------------------------------------------------------------------------------
|
||||
// | | | | | | | A | 7 | 8 | 9 | D |
|
||||
// | | | | | | | B | 4 | 5 | 6 | E |
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
compatible = "zmk,keymap";
|
||||
|
||||
default_layer {
|
||||
display-name = "Default Layer";
|
||||
// ----------------------------------------------------------------------------------------------------------
|
||||
// | ESC | 1 | 2 | 3 | 4 | 5 |-------|-------| 6 | 7 | 8 | 9 | 0 | BSPC |
|
||||
// | TAB | Q | W | E | R | T |-------|-------| Y | U | I | O | P | \ |
|
||||
@@ -33,6 +34,7 @@
|
||||
};
|
||||
|
||||
lower {
|
||||
display-name = "Lower";
|
||||
// ----------------------------------------------------------------------------------------------------------
|
||||
// | ESC | F2 | F3 | F4 | F5 | F6 |-------|-------| F7 | F8 | F9 | F10 | F11 | F12 |
|
||||
// | ~ | ! | @ | # | $ | % |-------|-------| ^ | & | * | ( | ) | DEL |
|
||||
@@ -49,6 +51,7 @@
|
||||
};
|
||||
|
||||
raise {
|
||||
display-name = "Raise";
|
||||
// ----------------------------------------------------------------------------------------------------------
|
||||
// | ESC | F2 | F3 | F4 | F5 | F6 |-------|-------| F7 | F8 | F9 | F10 | F11 | F12 |
|
||||
// | ~ | 1 | 2 | 3 | 4 | 5 |-------|-------| 6 | 7 | 8 | 9 | 0 | DEL |
|
||||
@@ -65,6 +68,7 @@
|
||||
};
|
||||
|
||||
adjust {
|
||||
display-name = "Adjust";
|
||||
// ----------------------------------------------------------------------------------------------------------
|
||||
// |tog(4)| F2 | F3 | F4 | F5 | F6 |------|------| F7 | F8 | F9 | F10 | F11 | F12 |
|
||||
// | | NA | NA | NA | NA | NA |------|------| NA | NA | NA | NA | NA |LALT(PRTSN)|
|
||||
@@ -81,6 +85,7 @@
|
||||
};
|
||||
|
||||
flock {
|
||||
display-name = "Flock";
|
||||
// ----------------------------------------------------------------------------------------------------------
|
||||
// |tog(4) | F2 | F3 | F4 | F5 | F6 |-------|-------| F7 | F8 | F9 | F10 | F11 | |
|
||||
// |out tog|BT_SEL 0|BT_SEL 1|BT_SEL 2|BT_SEL 3|BT_SEL 4|-------|-------|BT_PRV|BT_NXT|BT_CLR| | | |
|
||||
@@ -96,4 +101,4 @@
|
||||
>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
@@ -75,6 +75,7 @@
|
||||
compatible = "zmk,keymap";
|
||||
|
||||
MAIN_layer {
|
||||
display-name = "Main Layer";
|
||||
bindings = <
|
||||
&kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O
|
||||
&kp Q &kp A &kp S &kp D < SYM F &kp G &kp H < SYM J &kp K &kp L &kp SQT &kp P
|
||||
@@ -84,6 +85,7 @@
|
||||
};
|
||||
|
||||
SYM_layer {
|
||||
display-name = "Sym Layer";
|
||||
bindings = <
|
||||
&kp N7 &kp N8 &kp N9 &kp STAR &kp DLLR &kp LBRC &kp RBRC &kp HASH
|
||||
&kp AMPS &kp EXCL &kp N1 &kp N2 &kp N3 &kp EQUAL &kp LT &kp LPAR &kp RPAR &kp GT &kp PIPE &none
|
||||
@@ -93,6 +95,7 @@
|
||||
};
|
||||
|
||||
NAV_layer {
|
||||
display-name = "Nav Layer";
|
||||
bindings = <
|
||||
&kp C_VOL_DN &kp C_VOL_UP &kp C_NEXT &kp C_PP &none &kp F7 &kp F8 &kp F9
|
||||
&kp C_PREV &kp LEFT &kp DOWN &kp UP &kp RIGHT &kp LC(TAB) &kp PSCRN &kp F1 &kp F2 &kp F3 &kp F10 &kp F12
|
||||
@@ -102,6 +105,7 @@
|
||||
};
|
||||
|
||||
BT_layer {
|
||||
display-name = "BT Layer";
|
||||
bindings = <
|
||||
&none &none &none &none &none &none &none &none
|
||||
&none &none &none &none &none &none &none &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &none
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
compatible = "zmk,keymap";
|
||||
|
||||
default_layer {
|
||||
display-name = "Default Layer";
|
||||
bindings = <
|
||||
&kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSPC
|
||||
&kp TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SQT &kp SEMI
|
||||
@@ -28,6 +29,7 @@
|
||||
};
|
||||
|
||||
lower_layer {
|
||||
display-name = "Lower Layer";
|
||||
bindings = <
|
||||
&kp TILDE &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp STAR &kp LPAR &kp RPAR &kp BSPC
|
||||
&trans &trans &trans &trans &trans &trans &trans &trans &kp UNDER &kp PLUS &trans &trans
|
||||
@@ -37,6 +39,7 @@
|
||||
};
|
||||
|
||||
raise_layer {
|
||||
display-name = "Raise Layer";
|
||||
bindings = <
|
||||
&kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSPC
|
||||
&trans &trans &trans &trans &trans &trans &trans &trans &kp MINUS &kp EQUAL &trans &kp BSLH
|
||||
@@ -46,6 +49,7 @@
|
||||
};
|
||||
|
||||
function_layer {
|
||||
display-name = "Function Layer";
|
||||
bindings = <
|
||||
&bootloader &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &trans
|
||||
&trans &trans &trans &trans &trans &trans &trans &trans &kp MINUS &kp F11 &kp F12 &trans
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
compatible = "zmk,keymap";
|
||||
|
||||
default_layer {
|
||||
display-name = "Default Layer";
|
||||
bindings = <
|
||||
&kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P
|
||||
&hm LGUI A &hm LALT S &hm LCTRL D &hm LSHFT F &kp G &kp H &hm RSHFT J &hm RCTRL K &hm RALT L &hm RGUI RET
|
||||
@@ -37,6 +38,7 @@
|
||||
>;
|
||||
};
|
||||
num_sym {
|
||||
display-name = "Num Sym";
|
||||
bindings = <
|
||||
&kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0
|
||||
&trans &trans &trans &trans &trans &trans &trans &trans &kp EQUAL &kp MINUS
|
||||
@@ -46,6 +48,7 @@
|
||||
};
|
||||
|
||||
nav {
|
||||
display-name = "Nav";
|
||||
bindings = <
|
||||
&bt BT_CLR &bt BT_NXT &bt BT_PRV &none &none &none &none &kp UP &none &kp BSPC
|
||||
&trans &trans &trans &trans &none &none &kp LEFT &kp DOWN &kp RIGHT &none
|
||||
@@ -54,4 +57,4 @@
|
||||
>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
// ------------------------------------------- ------------------------------------------------------
|
||||
|
||||
default_layer {
|
||||
display-name = "Default Layer";
|
||||
bindings = <
|
||||
&kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 /**/ &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC &kp GRAVE
|
||||
&kp TAB &kp Q &kp W &kp E &kp R &kp T /**/ &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH &kp HOME
|
||||
@@ -39,6 +40,7 @@
|
||||
// ------------------------------------------- ------------------------------------------------------
|
||||
|
||||
fn_layer {
|
||||
display-name = "Fn Layer";
|
||||
bindings = <
|
||||
&bt BT_CLR &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 /**/ &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &trans &bt BT_CLR
|
||||
&trans &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &trans &trans /**/ &trans &trans &trans &trans &trans &trans &trans &trans &trans
|
||||
|
||||
87
app/boards/shields/redox/redox-layouts.dtsi
Normal file
87
app/boards/shields/redox/redox-layouts.dtsi
Normal file
@@ -0,0 +1,87 @@
|
||||
/*
|
||||
* Copyright (c) 2025 The ZMK Contributors
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*/
|
||||
|
||||
#include <physical_layouts.dtsi>
|
||||
|
||||
/ {
|
||||
redox_physical_layout: redox_physical_layout {
|
||||
compatible = "zmk,physical-layout";
|
||||
display-name = "Default";
|
||||
|
||||
keys // w h x y rot rx ry
|
||||
= <&key_physical_attrs 100 100 0 35 0 0 0>
|
||||
, <&key_physical_attrs 100 100 100 35 0 0 0>
|
||||
, <&key_physical_attrs 100 100 200 15 0 0 0>
|
||||
, <&key_physical_attrs 100 100 300 0 0 0 0>
|
||||
, <&key_physical_attrs 100 100 400 15 0 0 0>
|
||||
, <&key_physical_attrs 100 100 500 35 0 0 0>
|
||||
, <&key_physical_attrs 100 100 1100 35 0 0 0>
|
||||
, <&key_physical_attrs 100 100 1200 15 0 0 0>
|
||||
, <&key_physical_attrs 100 100 1300 0 0 0 0>
|
||||
, <&key_physical_attrs 100 100 1400 15 0 0 0>
|
||||
, <&key_physical_attrs 100 100 1500 35 0 0 0>
|
||||
, <&key_physical_attrs 100 100 1600 35 0 0 0>
|
||||
, <&key_physical_attrs 100 100 0 135 0 0 0>
|
||||
, <&key_physical_attrs 100 100 100 135 0 0 0>
|
||||
, <&key_physical_attrs 100 100 200 115 0 0 0>
|
||||
, <&key_physical_attrs 100 100 300 100 0 0 0>
|
||||
, <&key_physical_attrs 100 100 400 115 0 0 0>
|
||||
, <&key_physical_attrs 100 100 500 135 0 0 0>
|
||||
, <&key_physical_attrs 100 100 600 85 0 0 0>
|
||||
, <&key_physical_attrs 100 100 1000 85 0 0 0>
|
||||
, <&key_physical_attrs 100 100 1100 135 0 0 0>
|
||||
, <&key_physical_attrs 100 100 1200 115 0 0 0>
|
||||
, <&key_physical_attrs 100 100 1300 100 0 0 0>
|
||||
, <&key_physical_attrs 100 100 1400 115 0 0 0>
|
||||
, <&key_physical_attrs 100 100 1500 135 0 0 0>
|
||||
, <&key_physical_attrs 100 100 1600 135 0 0 0>
|
||||
, <&key_physical_attrs 100 100 0 235 0 0 0>
|
||||
, <&key_physical_attrs 100 100 100 235 0 0 0>
|
||||
, <&key_physical_attrs 100 100 200 215 0 0 0>
|
||||
, <&key_physical_attrs 100 100 300 200 0 0 0>
|
||||
, <&key_physical_attrs 100 100 400 215 0 0 0>
|
||||
, <&key_physical_attrs 100 100 500 235 0 0 0>
|
||||
, <&key_physical_attrs 100 100 600 205 0 0 0>
|
||||
, <&key_physical_attrs 100 100 1000 205 0 0 0>
|
||||
, <&key_physical_attrs 100 100 1100 235 0 0 0>
|
||||
, <&key_physical_attrs 100 100 1200 215 0 0 0>
|
||||
, <&key_physical_attrs 100 100 1300 200 0 0 0>
|
||||
, <&key_physical_attrs 100 100 1400 215 0 0 0>
|
||||
, <&key_physical_attrs 100 100 1500 235 0 0 0>
|
||||
, <&key_physical_attrs 100 100 1600 235 0 0 0>
|
||||
, <&key_physical_attrs 100 100 0 335 0 0 0>
|
||||
, <&key_physical_attrs 100 100 100 335 0 0 0>
|
||||
, <&key_physical_attrs 100 100 200 315 0 0 0>
|
||||
, <&key_physical_attrs 100 100 300 300 0 0 0>
|
||||
, <&key_physical_attrs 100 100 400 315 0 0 0>
|
||||
, <&key_physical_attrs 100 100 500 335 0 0 0>
|
||||
, <&key_physical_attrs 100 100 600 335 3000 550 435>
|
||||
, <&key_physical_attrs 100 100 700 335 3000 550 435>
|
||||
, <&key_physical_attrs 100 100 900 335 (-3000) 1150 435>
|
||||
, <&key_physical_attrs 100 100 1000 335 (-3000) 1150 435>
|
||||
, <&key_physical_attrs 100 100 1100 335 0 0 0>
|
||||
, <&key_physical_attrs 100 100 1200 315 0 0 0>
|
||||
, <&key_physical_attrs 100 100 1300 300 0 0 0>
|
||||
, <&key_physical_attrs 100 100 1400 315 0 0 0>
|
||||
, <&key_physical_attrs 100 100 1500 335 0 0 0>
|
||||
, <&key_physical_attrs 100 100 1600 335 0 0 0>
|
||||
, <&key_physical_attrs 100 100 0 435 0 0 0>
|
||||
, <&key_physical_attrs 100 100 100 435 0 0 0>
|
||||
, <&key_physical_attrs 100 100 200 415 0 0 0>
|
||||
, <&key_physical_attrs 100 100 300 400 0 0 0>
|
||||
, <&key_physical_attrs 100 100 450 435 1000 450 435>
|
||||
, <&key_physical_attrs 100 100 600 435 3000 550 435>
|
||||
, <&key_physical_attrs 100 100 700 435 3000 550 435>
|
||||
, <&key_physical_attrs 100 100 900 435 (-3000) 1150 435>
|
||||
, <&key_physical_attrs 100 100 1000 435 (-3000) 1150 435>
|
||||
, <&key_physical_attrs 100 100 1150 435 (-1000) 1250 435>
|
||||
, <&key_physical_attrs 100 100 1300 400 0 0 0>
|
||||
, <&key_physical_attrs 100 100 1400 415 0 0 0>
|
||||
, <&key_physical_attrs 100 100 1500 435 0 0 0>
|
||||
, <&key_physical_attrs 100 100 1600 435 0 0 0>
|
||||
;
|
||||
};
|
||||
};
|
||||
@@ -5,11 +5,17 @@
|
||||
*/
|
||||
|
||||
#include <dt-bindings/zmk/matrix_transform.h>
|
||||
#include "redox-layouts.dtsi"
|
||||
|
||||
|
||||
&redox_physical_layout {
|
||||
transform = <&default_transform>;
|
||||
};
|
||||
|
||||
/ {
|
||||
chosen {
|
||||
zmk,kscan = &kscan0;
|
||||
zmk,matrix-transform = &default_transform;
|
||||
zmk,physical-layout = &redox_physical_layout;
|
||||
};
|
||||
|
||||
default_transform: keymap_transform_0 {
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
compatible = "zmk,keymap" ;
|
||||
|
||||
default_layer {
|
||||
display-name = "Default Layer";
|
||||
// --------------------------------------------------------------------------------------------------------------------------------
|
||||
// | ESC | 1 | 2 | 3 | 4 | 5 | --- | 6 | 7 | 8 | 9 | 0 | BSPC |
|
||||
// | TAB | Q | W | E | R | T | ( | --- | ) | Y | U | I | O | P | - |
|
||||
@@ -32,6 +33,7 @@
|
||||
};
|
||||
|
||||
lower_layer {
|
||||
display-name = "Lower Layer";
|
||||
// --------------------------------------------------------------------------------------------------------------------------
|
||||
// | ESC | 1 | 2 | 3 | 4 | 5 | --- | 6 | 7 | 8 | 9 | 0 | DEL |
|
||||
// | ESC | 1 | 2 | 3 | 4 | 5 | ( | --- | ) | 6 | 7 | 8 | 9 | 0 | DEL |
|
||||
@@ -48,6 +50,7 @@
|
||||
};
|
||||
|
||||
raise_layer {
|
||||
display-name = "Raise Layer";
|
||||
// ----------------------------------------------------------------------------------------------------------------------------
|
||||
// | ESC | 1 | 2 | 3 | 4 | 5 | --- | 6 | 7 | 8 | 9 | 0 | DEL |
|
||||
// | ESC | ! | @ | # | $ | % | ( | --- | ) | ^ | & | * | ( | ) | DEL |
|
||||
@@ -64,6 +67,7 @@
|
||||
};
|
||||
|
||||
adjust_layer {
|
||||
display-name = "Adjust Layer";
|
||||
// -----------------------------------------------------------------------------------------
|
||||
// | F1 | F2 | F3 | F4 | F5 | F6 | --- | F7 | F8 | F9 | F10 | F11 | F12 |
|
||||
// | TAB | | | | | | BOOTL | --- | ) | BT1 | BT2 | BT3 | BT4 | BT5 | OUTPUT TGL |
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
compatible = "zmk,keymap";
|
||||
|
||||
default_layer {
|
||||
display-name = "Default Layer";
|
||||
// -------------------------------------------------------------------------------------
|
||||
// | TAB | Q | W | E | R | T | | Y | U | I | O | P | BSPC |
|
||||
// | CTRL | A | S | D | F | G | | H | J | K | L | ; | ' |
|
||||
@@ -28,6 +29,7 @@
|
||||
};
|
||||
|
||||
lower_layer {
|
||||
display-name = "Lower Layer";
|
||||
// ------------------------------------------------------------------------------------
|
||||
// | | ! | @ | # | $ | % | | ^ | & | * | ( | ) | DEL |
|
||||
// | | _ | + | { | } | "|" | | LFT | DWN | UP | RGT | ` | ~ |
|
||||
@@ -42,6 +44,7 @@
|
||||
};
|
||||
|
||||
raise_layer {
|
||||
display-name = "Raise Layer";
|
||||
// ----------------------------------------------------------------------------
|
||||
// | | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | DEL |
|
||||
// | | - | = | [ | ] | \ | | F1 | F2 | F3 | F4 | F5 | F6 |
|
||||
@@ -56,6 +59,7 @@
|
||||
};
|
||||
|
||||
adjust_layer {
|
||||
display-name = "Adjust Layer";
|
||||
// -----------------------------------------------------------------------------------------
|
||||
// | RGB BRI+ | RGB SAT+ | RGB HUE+ | RGB ANI+ | | RGB TOG | | BT1 | BT2 | BT3 | BT4 | BT5 | BT CLR |
|
||||
// | RGB BRI- | RGB SAT- | RGB HUE- | RGB ANI- | | | | | | | | | |
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
compatible = "zmk,keymap";
|
||||
|
||||
default_layer {
|
||||
display-name = "Default Layer";
|
||||
// ----------------------------------------------------------------------------------------
|
||||
// | | | ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | DEL |
|
||||
// | TAB | Q | W | E | R | T | Y | U | I | O | P | BSPC |
|
||||
@@ -39,6 +40,7 @@
|
||||
};
|
||||
|
||||
lower_layer {
|
||||
display-name = "Lower Layer";
|
||||
// --------------------------------------------------------------------------------------------
|
||||
// | | | | F9 | F10 | F11 | F12 | INS | PAU | SCR | PSCR | |
|
||||
// | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | |
|
||||
@@ -56,6 +58,7 @@
|
||||
};
|
||||
|
||||
raise_layer {
|
||||
display-name = "Raise Layer";
|
||||
// --------------------------------------------------------------------------------------
|
||||
// | | | | F9 | F10 | F11 | F12 | MUTE | VOL+ | VOL- | PLAY | |
|
||||
// | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | |
|
||||
@@ -73,6 +76,7 @@
|
||||
};
|
||||
|
||||
adjust_layer {
|
||||
display-name = "Adjust Layer";
|
||||
// ------------------------------------------------------------------------------------------------------------------------
|
||||
// | | | BT CLR | BT1 | BT2 | BT3 | BT4 | BT5 | | | | BT CLR |
|
||||
// | RGB BRI+ | RGB SAT+ | RGB HUE+ | RGB ANI+ | | RGB TOG | | | | | | |
|
||||
@@ -90,6 +94,7 @@
|
||||
};
|
||||
|
||||
nav_layer {
|
||||
display-name = "Nav Layer";
|
||||
// ------------------------------------------------------------------------------------------------------------------------
|
||||
// | | | ESC | | | | | | | | | DEL |
|
||||
// | TAB | | UP | | | | | | | | | BSPC |
|
||||
@@ -106,4 +111,4 @@
|
||||
>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
compatible = "zmk,keymap";
|
||||
|
||||
default_layer {
|
||||
display-name = "Default Layer";
|
||||
// -------------------
|
||||
// | 7 | 8 | 9 |
|
||||
// | 4 | 5 | 6 |
|
||||
@@ -28,6 +29,7 @@
|
||||
};
|
||||
|
||||
nav_layer {
|
||||
display-name = "Nav Layer";
|
||||
// -----------------------
|
||||
// | BTNXT | HOME | PGUP |
|
||||
// | BTPRV | END | PGDN |
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
compatible = "zmk,keymap";
|
||||
|
||||
default_layer {
|
||||
display-name = "Default Layer";
|
||||
// --------------------------
|
||||
// | 7 | 8 | 9 |
|
||||
// | 4 | 5 | 6 |
|
||||
@@ -30,6 +31,7 @@
|
||||
};
|
||||
|
||||
nav_layer {
|
||||
display-name = "Nav Layer";
|
||||
// --------------------------
|
||||
// | BT_CLR | HOME | PGUP |
|
||||
// | _ | END | PGDN |
|
||||
@@ -46,4 +48,4 @@
|
||||
sensor-bindings = <&inc_dec_kp A B>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
compatible = "zmk,keymap";
|
||||
|
||||
default_layer {
|
||||
display-name = "Default Layer";
|
||||
// -----------------------------------------------------------------------------------------
|
||||
// | TAB | Q | W | E | R | T | | Y | U | I | O | P | BSPC |
|
||||
// | CTRL | A | S | D | F | G | | H | J | K | L | ; | ' |
|
||||
@@ -26,6 +27,7 @@
|
||||
>;
|
||||
};
|
||||
lower_layer {
|
||||
display-name = "Lower Layer";
|
||||
// -----------------------------------------------------------------------------------------
|
||||
// | TAB | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | BSPC |
|
||||
// | BTCLR| BT1 | BT2 | BT3 | BT4 | BT5 | | LFT | DWN | UP | RGT | | |
|
||||
@@ -40,6 +42,7 @@
|
||||
};
|
||||
|
||||
raise_layer {
|
||||
display-name = "Raise Layer";
|
||||
// -----------------------------------------------------------------------------------------
|
||||
// | TAB | ! | @ | # | $ | % | | ^ | & | * | ( | ) | BSPC |
|
||||
// | CTRL | | | | | | | - | = | [ | ] | \ | ` |
|
||||
|
||||
@@ -33,6 +33,7 @@ As such, those are in use within the default layer at this time.*/
|
||||
compatible = "zmk,keymap";
|
||||
|
||||
default_layer {
|
||||
display-name = "Default Layer";
|
||||
// ---------------------------------------------------------------------------------------------------------------------------------
|
||||
// | GRAVE | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | DEL |
|
||||
// | TAB | Q | W | E | R | T | | Y | U | I | O | P | BSPC |
|
||||
@@ -48,6 +49,7 @@ As such, those are in use within the default layer at this time.*/
|
||||
>;
|
||||
};
|
||||
lower_layer {
|
||||
display-name = "Lower Layer";
|
||||
// ---------------------------------------------------------------------------------------------------------------------------------
|
||||
// | | | | | | | | | | | | | |
|
||||
// | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | |
|
||||
@@ -63,6 +65,7 @@ As such, those are in use within the default layer at this time.*/
|
||||
>;
|
||||
};
|
||||
raise_layer {
|
||||
display-name = "Raise Layer";
|
||||
// ---------------------------------------------------------------------------------------------------------------------------------
|
||||
// | | | | | | | | | | | | | |
|
||||
// | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | DEL |
|
||||
@@ -78,6 +81,7 @@ As such, those are in use within the default layer at this time.*/
|
||||
>;
|
||||
};
|
||||
adjust_layer {
|
||||
display-name = "Adjust Layer";
|
||||
// ---------------------------------------------------------------------------------------------------------------------------------
|
||||
// | ` | ! | @ | # | $ | % | | ^ | & | * | ( | ) | EP TOG |
|
||||
// | BT CLR | BT SEL0 | BT SEL1 | BT SEL2 | BGT SEL3 | BT SEL4 | | RGB EFF+ | RGB HUE+ | RGB SAT+ | RGB SPD+ | RGB BRI+ | RGB TOG |
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
compatible = "zmk,keymap";
|
||||
|
||||
default_layer {
|
||||
display-name = "Default Layer";
|
||||
// ------------------------------------------------------------------------------------------------------------
|
||||
// | ESC | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ` |
|
||||
// | TAB | Q | W | E | R | T | | Y | U | I | O | P | - |
|
||||
@@ -32,6 +33,7 @@
|
||||
};
|
||||
|
||||
lower_layer {
|
||||
display-name = "Lower Layer";
|
||||
// ------------------------------------------------------------------------------------------------------------
|
||||
// | BTCLR | BT1 | BT2 | BT3 | BT4 | BT5 | | | | | | | |
|
||||
// | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 |
|
||||
@@ -50,6 +52,7 @@
|
||||
};
|
||||
|
||||
raise_layer {
|
||||
display-name = "Raise Layer";
|
||||
// ------------------------------------------------------------------------------------------------------------
|
||||
// | | | | | | | | | | | | | |
|
||||
// | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | |
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
compatible = "zmk,keymap";
|
||||
|
||||
default_layer {
|
||||
display-name = "Default Layer";
|
||||
// ------------------------------------------------------------------------------------------------------------
|
||||
// | ESC | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ` |
|
||||
// | TAB | Q | W | E | R | T | | Y | U | I | O | P | - |
|
||||
@@ -40,6 +41,7 @@
|
||||
};
|
||||
|
||||
lower_layer {
|
||||
display-name = "Lower Layer";
|
||||
// ------------------------------------------------------------------------------------------------------------
|
||||
// | BTCLR | BT1 | BT2 | BT3 | BT4 | BT5 | | | | | | | |
|
||||
// | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 |
|
||||
@@ -58,6 +60,7 @@
|
||||
};
|
||||
|
||||
raise_layer {
|
||||
display-name = "Raise Layer";
|
||||
// ------------------------------------------------------------------------------------------------------------
|
||||
// | | | | | | | | | | | | | |
|
||||
// | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | |
|
||||
|
||||
@@ -63,6 +63,7 @@
|
||||
compatible = "zmk,keymap";
|
||||
|
||||
default_layer {
|
||||
display-name = "Default Layer";
|
||||
bindings = <
|
||||
&kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P
|
||||
&kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SQT
|
||||
@@ -72,6 +73,7 @@
|
||||
};
|
||||
|
||||
left_layer {
|
||||
display-name = "Left Layer";
|
||||
bindings = <
|
||||
&kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0
|
||||
&kp TAB &kp LC(S) &kp DQT &kp PIPE2 &kp HASH &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp DEL
|
||||
@@ -81,6 +83,7 @@
|
||||
};
|
||||
|
||||
right_layer {
|
||||
display-name = "Right Layer";
|
||||
bindings = <
|
||||
&kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp KP_MULTIPLY &kp LPAR &kp RPAR
|
||||
&kp HASH &kp QMARK &kp FSLH &kp COLON &kp SEMI &kp MINUS &kp KP_EQUAL &kp LBRC &kp RBRC &kp BSPC
|
||||
@@ -90,6 +93,7 @@
|
||||
};
|
||||
|
||||
tri_layer {
|
||||
display-name = "Tri Layer";
|
||||
bindings = <
|
||||
&kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &trans &trans &trans &trans &trans
|
||||
&kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &trans &kp PG_UP &kp K_VOL_UP &kp K_MUTE &trans
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
compatible = "zmk,keymap";
|
||||
|
||||
default_layer {
|
||||
display-name = "Default Layer";
|
||||
// ------------------------------------------------------------------------------------------------------------
|
||||
// | ESC | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | - |
|
||||
// | TAB | Q | W | E | R | T | | Y | U | I | O | P | \ |
|
||||
|
||||
@@ -58,4 +58,4 @@ PIN_MACRO(pin21, <&kp N2 &kp N1>)
|
||||
&pin21>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
12
app/boards/shields/tester_rpi_pico/Kconfig.defconfig
Normal file
12
app/boards/shields/tester_rpi_pico/Kconfig.defconfig
Normal file
@@ -0,0 +1,12 @@
|
||||
if SHIELD_TESTER_RPI_PICO
|
||||
|
||||
config ZMK_KEYBOARD_NAME
|
||||
default "ZMK Tester"
|
||||
|
||||
config ZMK_BLE
|
||||
def_bool n
|
||||
|
||||
config SETTINGS
|
||||
def_bool n
|
||||
|
||||
endif
|
||||
2
app/boards/shields/tester_rpi_pico/Kconfig.shield
Normal file
2
app/boards/shields/tester_rpi_pico/Kconfig.shield
Normal file
@@ -0,0 +1,2 @@
|
||||
config SHIELD_TESTER_RPI_PICO
|
||||
def_bool $(shields_list_contains,tester_rpi_pico)
|
||||
@@ -0,0 +1,95 @@
|
||||
/*
|
||||
* Copyright (c) 2025 The ZMK Contributors
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*/
|
||||
|
||||
#include <physical_layouts.dtsi>
|
||||
|
||||
/ {
|
||||
tester_position_map {
|
||||
compatible = "zmk,physical-layout-position-map";
|
||||
complete;
|
||||
|
||||
pinout_map: pinout_positions {
|
||||
physical-layout = <&physical_layout0>;
|
||||
positions = <0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25>;
|
||||
};
|
||||
inline_map: single_row_positions {
|
||||
physical-layout = <&physical_layout1>;
|
||||
positions = <0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25>;
|
||||
};
|
||||
};
|
||||
|
||||
physical_layout0: physical_layout_0 {
|
||||
compatible = "zmk,physical-layout";
|
||||
display-name = "Rpi Pico Pinout";
|
||||
|
||||
kscan = <&kscan0>;
|
||||
transform = <&matrix_transform0>;
|
||||
|
||||
keys // w h x y rot rx ry
|
||||
= <&key_physical_attrs 100 100 0 0 0 0 0>
|
||||
, <&key_physical_attrs 100 100 0 100 0 0 0>
|
||||
, <&key_physical_attrs 100 100 0 300 0 0 0>
|
||||
, <&key_physical_attrs 100 100 0 400 0 0 0>
|
||||
, <&key_physical_attrs 100 100 0 500 0 0 0>
|
||||
, <&key_physical_attrs 100 100 0 600 0 0 0>
|
||||
, <&key_physical_attrs 100 100 0 800 0 0 0>
|
||||
, <&key_physical_attrs 100 100 0 900 0 0 0>
|
||||
, <&key_physical_attrs 100 100 0 1000 0 0 0>
|
||||
, <&key_physical_attrs 100 100 0 1100 0 0 0>
|
||||
, <&key_physical_attrs 100 100 0 1300 0 0 0>
|
||||
, <&key_physical_attrs 100 100 0 1400 0 0 0>
|
||||
, <&key_physical_attrs 100 100 0 1500 0 0 0>
|
||||
, <&key_physical_attrs 100 100 0 1600 0 0 0>
|
||||
, <&key_physical_attrs 100 100 0 1800 0 0 0>
|
||||
, <&key_physical_attrs 100 100 0 1900 0 0 0>
|
||||
, <&key_physical_attrs 100 100 600 1900 0 0 0>
|
||||
, <&key_physical_attrs 100 100 600 1800 0 0 0>
|
||||
, <&key_physical_attrs 100 100 600 1600 0 0 0>
|
||||
, <&key_physical_attrs 100 100 600 1500 0 0 0>
|
||||
, <&key_physical_attrs 100 100 600 1400 0 0 0>
|
||||
, <&key_physical_attrs 100 100 600 1300 0 0 0>
|
||||
, <&key_physical_attrs 100 100 600 1100 0 0 0>
|
||||
, <&key_physical_attrs 100 100 600 900 0 0 0>
|
||||
, <&key_physical_attrs 100 100 600 800 0 0 0>
|
||||
, <&key_physical_attrs 100 100 600 600 0 0 0>
|
||||
;
|
||||
};
|
||||
|
||||
physical_layout1: physical_layout_1 {
|
||||
compatible = "zmk,physical-layout";
|
||||
display-name = "Single Row";
|
||||
|
||||
// Single row of eighteen "keys", in ascending "Arduino" order.
|
||||
keys // w h x y rot rx ry
|
||||
= <&key_physical_attrs 100 100 0 0 0 0 0>
|
||||
, <&key_physical_attrs 100 100 100 0 0 0 0>
|
||||
, <&key_physical_attrs 100 100 200 0 0 0 0>
|
||||
, <&key_physical_attrs 100 100 300 0 0 0 0>
|
||||
, <&key_physical_attrs 100 100 400 0 0 0 0>
|
||||
, <&key_physical_attrs 100 100 500 0 0 0 0>
|
||||
, <&key_physical_attrs 100 100 600 0 0 0 0>
|
||||
, <&key_physical_attrs 100 100 700 0 0 0 0>
|
||||
, <&key_physical_attrs 100 100 800 0 0 0 0>
|
||||
, <&key_physical_attrs 100 100 900 0 0 0 0>
|
||||
, <&key_physical_attrs 100 100 1000 0 0 0 0>
|
||||
, <&key_physical_attrs 100 100 1100 0 0 0 0>
|
||||
, <&key_physical_attrs 100 100 1200 0 0 0 0>
|
||||
, <&key_physical_attrs 100 100 1300 0 0 0 0>
|
||||
, <&key_physical_attrs 100 100 1400 0 0 0 0>
|
||||
, <&key_physical_attrs 100 100 1500 0 0 0 0>
|
||||
, <&key_physical_attrs 100 100 1600 0 0 0 0>
|
||||
, <&key_physical_attrs 100 100 1700 0 0 0 0>
|
||||
, <&key_physical_attrs 100 100 1800 0 0 0 0>
|
||||
, <&key_physical_attrs 100 100 1900 0 0 0 0>
|
||||
, <&key_physical_attrs 100 100 2000 0 0 0 0>
|
||||
, <&key_physical_attrs 100 100 2100 0 0 0 0>
|
||||
, <&key_physical_attrs 100 100 2200 0 0 0 0>
|
||||
, <&key_physical_attrs 100 100 2300 0 0 0 0>
|
||||
, <&key_physical_attrs 100 100 2400 0 0 0 0>
|
||||
, <&key_physical_attrs 100 100 2500 0 0 0 0>
|
||||
;
|
||||
};
|
||||
};
|
||||
77
app/boards/shields/tester_rpi_pico/tester_rpi_pico.keymap
Normal file
77
app/boards/shields/tester_rpi_pico/tester_rpi_pico.keymap
Normal file
@@ -0,0 +1,77 @@
|
||||
#include <behaviors.dtsi>
|
||||
#include <dt-bindings/zmk/keys.h>
|
||||
|
||||
#define PIN_MACRO(name, pin) \
|
||||
/ { \
|
||||
macros { \
|
||||
name: name { \
|
||||
compatible = "zmk,behavior-macro"; \
|
||||
wait-ms = <5>; \
|
||||
tap-ms = <5>; \
|
||||
#binding-cells = <0>; \
|
||||
bindings = <&kp P &kp I &kp N &kp SPACE>, pin, <&kp ENTER>; \
|
||||
}; \
|
||||
}; \
|
||||
};
|
||||
|
||||
PIN_MACRO(pin0, <&kp N0>)
|
||||
PIN_MACRO(pin1, <&kp N1>)
|
||||
PIN_MACRO(pin2, <&kp N2>)
|
||||
PIN_MACRO(pin3, <&kp N3>)
|
||||
PIN_MACRO(pin4, <&kp N4>)
|
||||
PIN_MACRO(pin5, <&kp N5>)
|
||||
PIN_MACRO(pin6, <&kp N6>)
|
||||
PIN_MACRO(pin7, <&kp N7>)
|
||||
PIN_MACRO(pin8, <&kp N8>)
|
||||
PIN_MACRO(pin9, <&kp N9>)
|
||||
PIN_MACRO(pin10, <&kp N1 &kp N0>)
|
||||
PIN_MACRO(pin11, <&kp N1 &kp N1>)
|
||||
PIN_MACRO(pin12, <&kp N1 &kp N2>)
|
||||
PIN_MACRO(pin13, <&kp N1 &kp N3>)
|
||||
PIN_MACRO(pin14, <&kp N1 &kp N4>)
|
||||
PIN_MACRO(pin15, <&kp N1 &kp N5>)
|
||||
PIN_MACRO(pin16, <&kp N1 &kp N6>)
|
||||
PIN_MACRO(pin17, <&kp N1 &kp N7>)
|
||||
PIN_MACRO(pin18, <&kp N1 &kp N8>)
|
||||
PIN_MACRO(pin19, <&kp N1 &kp N9>)
|
||||
PIN_MACRO(pin20, <&kp N2 &kp N0>)
|
||||
PIN_MACRO(pin21, <&kp N2 &kp N1>)
|
||||
PIN_MACRO(pin22, <&kp N2 &kp N2>)
|
||||
PIN_MACRO(pin26, <&kp N2 &kp N6>)
|
||||
PIN_MACRO(pin27, <&kp N2 &kp N7>)
|
||||
PIN_MACRO(pin28, <&kp N2 &kp N8>)
|
||||
|
||||
/ {
|
||||
keymap {
|
||||
compatible = "zmk,keymap";
|
||||
|
||||
default_layer {
|
||||
bindings = <&pin0
|
||||
&pin1
|
||||
&pin2
|
||||
&pin3
|
||||
&pin4
|
||||
&pin5
|
||||
&pin6
|
||||
&pin7
|
||||
&pin8
|
||||
&pin9
|
||||
&pin10
|
||||
&pin11
|
||||
&pin12
|
||||
&pin13
|
||||
&pin14
|
||||
&pin15
|
||||
&pin16
|
||||
&pin17
|
||||
&pin18
|
||||
&pin19
|
||||
&pin20
|
||||
&pin21
|
||||
&pin22
|
||||
&pin26
|
||||
&pin27
|
||||
&pin28>;
|
||||
};
|
||||
};
|
||||
};
|
||||
63
app/boards/shields/tester_rpi_pico/tester_rpi_pico.overlay
Normal file
63
app/boards/shields/tester_rpi_pico/tester_rpi_pico.overlay
Normal file
@@ -0,0 +1,63 @@
|
||||
#include <dt-bindings/zmk/matrix_transform.h>
|
||||
#include "tester_rpi_pico-layouts.dtsi"
|
||||
|
||||
&physical_layout0 {
|
||||
transform = <&transform0>;
|
||||
};
|
||||
|
||||
&physical_layout1 {
|
||||
transform = <&transform0>;
|
||||
};
|
||||
|
||||
/ {
|
||||
chosen {
|
||||
zmk,kscan = &kscan0;
|
||||
zmk,physical-layout = &physical_layout0;
|
||||
};
|
||||
|
||||
kscan0: kscan {
|
||||
compatible = "zmk,kscan-gpio-direct";
|
||||
wakeup-source;
|
||||
debounce-press-ms = <10>;
|
||||
debounce-release-ms = <10>;
|
||||
input-gpios
|
||||
= <&pico_header 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
|
||||
, <&pico_header 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
|
||||
, <&pico_header 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
|
||||
, <&pico_header 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
|
||||
, <&pico_header 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
|
||||
, <&pico_header 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
|
||||
, <&pico_header 6 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
|
||||
, <&pico_header 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
|
||||
, <&pico_header 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
|
||||
, <&pico_header 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
|
||||
, <&pico_header 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
|
||||
, <&pico_header 11 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
|
||||
, <&pico_header 12 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
|
||||
, <&pico_header 13 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
|
||||
, <&pico_header 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
|
||||
, <&pico_header 15 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
|
||||
, <&pico_header 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
|
||||
, <&pico_header 17 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
|
||||
, <&pico_header 18 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
|
||||
, <&pico_header 19 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
|
||||
, <&pico_header 20 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
|
||||
, <&pico_header 21 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
|
||||
, <&pico_header 22 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
|
||||
, <&pico_header 26 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
|
||||
, <&pico_header 27 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
|
||||
, <&pico_header 28 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
|
||||
;
|
||||
};
|
||||
|
||||
transform0: keymap_transform {
|
||||
compatible = "zmk,matrix-transform";
|
||||
columns = <26>;
|
||||
rows = <1>;
|
||||
map = <
|
||||
RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9)
|
||||
RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) RC(0,15) RC(0,16) RC(0,17) RC(0,18) RC(0,19)
|
||||
RC(0,20) RC(0,21) RC(0,22) RC(0,23) RC(0,24) RC(0,25)
|
||||
>;
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,6 @@
|
||||
file_format: "1"
|
||||
id: tester_rpi_pico
|
||||
name: TesterRpiPico
|
||||
type: shield
|
||||
url: https://zmk.dev/docs/troubleshooting/hardware-issues
|
||||
requires: [rpi_pico]
|
||||
@@ -44,4 +44,4 @@ PIN_MACRO(pin10, <&kp N1 &kp N0>)
|
||||
&pin10>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
compatible = "zmk,keymap";
|
||||
|
||||
default_layer {
|
||||
display-name = "Default Layer";
|
||||
bindings = <
|
||||
&kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp SEMI &kp BSPC
|
||||
&ht CAPS TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp APOS &kp RET
|
||||
@@ -32,6 +33,7 @@
|
||||
};
|
||||
|
||||
function_layer {
|
||||
display-name = "Function Layer";
|
||||
bindings = <
|
||||
&kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp DEL
|
||||
&none &kp HOME &kp PG_UP &trans &trans &trans &kp LBKT &kp RBKT &kp EQUAL &kp BSLH &kp FSLH &trans
|
||||
@@ -41,6 +43,7 @@
|
||||
};
|
||||
|
||||
other_layer {
|
||||
display-name = "Other Layer";
|
||||
bindings = <
|
||||
&kp PRINTSCREEN &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12
|
||||
&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans
|
||||
|
||||
@@ -44,6 +44,7 @@
|
||||
compatible = "zmk,keymap";
|
||||
|
||||
default_layer {
|
||||
display-name = "Default Layer";
|
||||
bindings = <
|
||||
&kp KP_NUMLOCK &kp KP_ASTERISK &kp KP_MINUS
|
||||
&kp KP_NUMBER_7 &kp KP_NUMBER_8 &kp KP_NUMBER_9 &kp KP_PLUS
|
||||
@@ -56,6 +57,7 @@
|
||||
};
|
||||
|
||||
func_layer {
|
||||
display-name = "Func Layer";
|
||||
bindings = <
|
||||
&none &sys_reset &bootloader
|
||||
&out OUT_TOG &out OUT_USB &out OUT_BLE &none
|
||||
|
||||
@@ -13,10 +13,11 @@
|
||||
compatible = "zmk,keymap";
|
||||
|
||||
default_layer {
|
||||
display-name = "Default Layer";
|
||||
bindings = <
|
||||
&kp X
|
||||
&kp Z
|
||||
>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
compatible = "zmk,keymap";
|
||||
|
||||
default_layer {
|
||||
display-name = "Default Layer";
|
||||
/* QWERTY
|
||||
*
|
||||
* ,----------------------------------. ,----------------------------------.
|
||||
@@ -42,6 +43,7 @@
|
||||
};
|
||||
|
||||
navnum_layer {
|
||||
display-name = "Navnum Layer";
|
||||
/* NAVNUM
|
||||
*
|
||||
* ,----------------------------------. ,----------------------------------.
|
||||
@@ -71,6 +73,7 @@
|
||||
};
|
||||
|
||||
symbol_layer {
|
||||
display-name = "Symbol Layer";
|
||||
/* SYM
|
||||
*
|
||||
* ,----------------------------------. ,----------------------------------.
|
||||
@@ -100,6 +103,7 @@
|
||||
};
|
||||
|
||||
function_layer {
|
||||
display-name = "Function Layer";
|
||||
/* FUNC
|
||||
*
|
||||
* ,----------------------------------. ,----------------------------------.
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
compatible = "zmk,keymap";
|
||||
|
||||
default_layer {
|
||||
display-name = "Default Layer";
|
||||
bindings = <
|
||||
&kp A &bl BL_TOG
|
||||
&rgb_ug RGB_EFF &bt BT_CLR
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
compatible = "zmk,keymap";
|
||||
|
||||
default_layer {
|
||||
display-name = "Default Layer";
|
||||
bindings = <
|
||||
&kp A &bl BL_TOG
|
||||
&rgb_ug RGB_EFF &bt BT_CLR
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
compatible = "zmk,keymap";
|
||||
|
||||
default_layer {
|
||||
display-name = "Default Layer";
|
||||
// ------------------------------------------------------------------------------------------------------------
|
||||
// | ESC | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | BKSPC |
|
||||
// | TAB | Q | W | E | R | T | [ | | ] | Y | U | I | O | P | \ |
|
||||
@@ -31,6 +32,7 @@
|
||||
};
|
||||
|
||||
lower_layer {
|
||||
display-name = "Lower Layer";
|
||||
// ------------------------------------------------------------------------------------------------------------
|
||||
// | | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | F11 |
|
||||
// | N.LC | 7 | 8 | 9 |PRTSC | SCRLK| | | | PAUSE| | 7 | 8 | 9 | F12 |
|
||||
@@ -49,6 +51,7 @@
|
||||
};
|
||||
|
||||
raise_layer {
|
||||
display-name = "Raise Layer";
|
||||
// ------------------------------------------------------------------------------------------------------------
|
||||
// |BTCLR | BT1 | BT2 | BT3 | BT4 | BT5 | | | | | | | RESET |
|
||||
// | | | | | | | | | | | | | | |BLOADER|
|
||||
|
||||
@@ -7,13 +7,20 @@
|
||||
#pragma once
|
||||
|
||||
#include <zmk/events/position_state_changed.h>
|
||||
#include <zephyr/sys/util.h>
|
||||
#include <zephyr/devicetree.h>
|
||||
|
||||
#define ZMK_KEYMAP_LAYERS_FOREACH(_fn) \
|
||||
COND_CODE_1(IS_ENABLED(CONFIG_ZMK_STUDIO), (DT_FOREACH_CHILD(DT_INST(0, zmk_keymap), _fn)), \
|
||||
(DT_FOREACH_CHILD_STATUS_OKAY(DT_INST(0, zmk_keymap), _fn)))
|
||||
|
||||
#define ZMK_KEYMAP_LAYERS_FOREACH_SEP(_fn, _sep) \
|
||||
COND_CODE_1(IS_ENABLED(CONFIG_ZMK_STUDIO), \
|
||||
(DT_FOREACH_CHILD_SEP(DT_INST(0, zmk_keymap), _fn, _sep)), \
|
||||
(DT_FOREACH_CHILD_STATUS_OKAY_SEP(DT_INST(0, zmk_keymap), _fn, _sep)))
|
||||
|
||||
#define ZMK_LAYER_CHILD_LEN_PLUS_ONE(node) 1 +
|
||||
#define ZMK_KEYMAP_LAYERS_LEN \
|
||||
(COND_CODE_1( \
|
||||
IS_ENABLED(CONFIG_ZMK_STUDIO), \
|
||||
(DT_FOREACH_CHILD(DT_INST(0, zmk_keymap), ZMK_LAYER_CHILD_LEN_PLUS_ONE)), \
|
||||
(DT_FOREACH_CHILD_STATUS_OKAY(DT_INST(0, zmk_keymap), ZMK_LAYER_CHILD_LEN_PLUS_ONE))) 0)
|
||||
#define ZMK_KEYMAP_LAYERS_LEN (ZMK_KEYMAP_LAYERS_FOREACH(ZMK_LAYER_CHILD_LEN_PLUS_ONE) 0)
|
||||
|
||||
/**
|
||||
* @brief A layer ID is a stable identifier to refer to a layer, regardless of ordering.
|
||||
|
||||
@@ -74,12 +74,7 @@ static uint8_t keymap_layer_orders[ZMK_KEYMAP_LAYERS_LEN];
|
||||
|
||||
#define KEYMAP_VAR(_name, _opts, no_init) \
|
||||
static _opts struct zmk_behavior_binding _name[ZMK_KEYMAP_LAYERS_LEN][ZMK_KEYMAP_LEN] = { \
|
||||
COND_CODE_0( \
|
||||
no_init, \
|
||||
(COND_CODE_1(IS_ENABLED(CONFIG_ZMK_STUDIO), \
|
||||
(DT_INST_FOREACH_CHILD_SEP(0, TRANSFORMED_LAYER, (, ))), \
|
||||
(DT_INST_FOREACH_CHILD_STATUS_OKAY_SEP(0, TRANSFORMED_LAYER, (, ))))), \
|
||||
(0))};
|
||||
COND_CODE_0(no_init, (ZMK_KEYMAP_LAYERS_FOREACH_SEP(TRANSFORMED_LAYER, (, ))), (0))};
|
||||
|
||||
KEYMAP_VAR(zmk_keymap, COND_CODE_1(IS_ENABLED(CONFIG_ZMK_KEYMAP_SETTINGS_STORAGE), (), (const)),
|
||||
IS_ENABLED(CONFIG_ZMK_STUDIO))
|
||||
@@ -89,14 +84,14 @@ KEYMAP_VAR(zmk_keymap, COND_CODE_1(IS_ENABLED(CONFIG_ZMK_KEYMAP_SETTINGS_STORAGE
|
||||
KEYMAP_VAR(zmk_stock_keymap, const, 0)
|
||||
|
||||
static char zmk_keymap_layer_names[ZMK_KEYMAP_LAYERS_LEN][CONFIG_ZMK_KEYMAP_LAYER_NAME_MAX_LEN] = {
|
||||
DT_INST_FOREACH_CHILD_SEP(0, LAYER_NAME, (, ))};
|
||||
ZMK_KEYMAP_LAYERS_FOREACH_SEP(LAYER_NAME, (, ))};
|
||||
|
||||
static uint32_t changed_layer_names = 0;
|
||||
|
||||
#else
|
||||
|
||||
static const char *zmk_keymap_layer_names[ZMK_KEYMAP_LAYERS_LEN] = {
|
||||
DT_INST_FOREACH_CHILD_SEP(0, LAYER_NAME, (, ))};
|
||||
ZMK_KEYMAP_LAYERS_FOREACH_SEP(LAYER_NAME, (, ))};
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -104,7 +104,7 @@ Note that documentation is still lacking for utilizing more than one peripheral
|
||||
|
||||
[petejohanson] contributed a fix to release held keys on peripheral disconnect [#1340](https://github.com/zmkfirmware/zmk/pull/1340), which makes scenarios where a split disconnects unexpectedly less painful.
|
||||
|
||||
[petejohanson] also improved [the `settings_reset` shield](/docs/troubleshooting/connection-issues#split-keyboard-halves-unable-to-pair) by making it clear bonds more reliably, and allow it to build for all boards in [#1879](https://github.com/zmkfirmware/zmk/pull/1879).
|
||||
[petejohanson] also improved [the `settings_reset` shield](/docs/troubleshooting/connection-issues#split-keyboard-parts-unable-to-pair) by making it clear bonds more reliably, and allow it to build for all boards in [#1879](https://github.com/zmkfirmware/zmk/pull/1879).
|
||||
|
||||
[petejohanson] and [xudongzheng] contributed additional split connectivity improvements, via using directed advertising in [#1913](https://github.com/zmkfirmware/zmk/pull/1913) and improving the robustness of central scanning in [#1912](https://github.com/zmkfirmware/zmk/pull/1912).
|
||||
|
||||
|
||||
@@ -78,7 +78,9 @@ CONFIG_EC11=y
|
||||
CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y
|
||||
```
|
||||
|
||||
The list of available settings is determined by various files in ZMK whose names start with `Kconfig`. Files ending with `_defconfig` use the same syntax, but are intended for setting configuration specific to the hardware which users typically won't need to change. Note that options are _not_ prefixed with `CONFIG_` in these files.
|
||||
Files ending with `_defconfig` use the same syntax as `.conf` files. They set the default configuration for the hardware, which is then overridden by anything in a `.conf` file.
|
||||
|
||||
The list of available settings is determined by various files in ZMK whose names start with `Kconfig`. Note that options are _not_ prefixed with `CONFIG_` in these files.
|
||||
|
||||
See [Zephyr's Kconfig documentation](https://docs.zephyrproject.org/3.5.0/build/kconfig/index.html) for more details on Kconfig files.
|
||||
|
||||
@@ -110,7 +112,9 @@ Example: `CONFIG_FOO="foo"`
|
||||
|
||||
## Devicetree Files
|
||||
|
||||
Various Devicetree files are combined to build a tree that describes the hardware for a keyboard. They are also used to define keymaps.
|
||||
Various Devicetree files are combined to build a tree that describes the hardware for a keyboard. They are also used to define keymaps. A full primer on Devicetree can be found in the [Devicetree Overview page](../development/devicetree.md) -- a shorter summary of some of the points can be found below.
|
||||
|
||||
### Devicetree Overview
|
||||
|
||||
Devicetree files use various file extensions. These indicate the purpose of the file, but they have no effect on how the file is processed. Common file extensions for Devicetree files include:
|
||||
|
||||
@@ -184,88 +188,3 @@ If the node you want to edit doesn't have a label, you can also write a new tree
|
||||
};
|
||||
};
|
||||
```
|
||||
|
||||
### Devicetree Property Types
|
||||
|
||||
These are some of the property types you will see most often when working with ZMK. [Zephyr's Devicetree bindings documentation](https://docs.zephyrproject.org/3.5.0/build/dts/bindings.html) provides more detailed information and a full list of types.
|
||||
|
||||
#### bool
|
||||
|
||||
True or false. To set the property to true, list it with no value. To set it to false, do not list it.
|
||||
|
||||
Example: `property;`
|
||||
|
||||
If a property has already been set to true and you need to override it to false, use the following command to delete the existing property:
|
||||
|
||||
```dts
|
||||
/delete-property/ the-property-name;
|
||||
```
|
||||
|
||||
#### int
|
||||
|
||||
A single integer surrounded by angle brackets. Also supports mathematical expressions.
|
||||
|
||||
Example: `property = <42>;`
|
||||
|
||||
#### string
|
||||
|
||||
Text surrounded by double quotes.
|
||||
|
||||
Example: `property = "foo";`
|
||||
|
||||
#### array
|
||||
|
||||
A list of integers surrounded by angle brackets and separated with spaces. Mathematical expressions can be used but must be surrounded by parenthesis.
|
||||
|
||||
Example: `property = <1 2 3 4>;`
|
||||
|
||||
Values can also be split into multiple blocks, e.g. `property = <1 2>, <3 4>;`
|
||||
|
||||
#### phandle
|
||||
|
||||
A single node reference surrounded by angle brackets.
|
||||
|
||||
Example: `property = <&label>`
|
||||
|
||||
#### phandles
|
||||
|
||||
A list of node references surrounded by angle brackets.
|
||||
|
||||
Example: `property = <&label1 &label2 &label3>`
|
||||
|
||||
#### phandle array
|
||||
|
||||
A list of node references and possibly numbers to associate with the node. Mathematical expressions can be used but must be surrounded by parenthesis.
|
||||
|
||||
Example: `property = <&none &mo 1>;`
|
||||
|
||||
Values can also be split into multiple blocks, e.g. `property = <&none>, <&mo 1>;`
|
||||
|
||||
See the documentation for "phandle-array" in [Zephyr's Devicetree bindings documentation](https://docs.zephyrproject.org/3.5.0/build/dts/bindings.html)
|
||||
for more details on how parameters are associated with nodes.
|
||||
|
||||
#### GPIO array
|
||||
|
||||
This is just a phandle array. The documentation lists this as a different type to make it clear which properties expect an array of GPIOs.
|
||||
|
||||
Each item in the array should be a label for a GPIO node (the names of which differ between hardware platforms) followed by an index and configuration flags. See [Zephyr's GPIO documentation](https://docs.zephyrproject.org/3.5.0/hardware/peripherals/gpio.html) for a full list of flags.
|
||||
|
||||
Example:
|
||||
|
||||
```dts
|
||||
some-gpios =
|
||||
<&gpio0 0 GPIO_ACTIVE_HIGH>,
|
||||
<&gpio0 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
|
||||
;
|
||||
```
|
||||
|
||||
#### path
|
||||
|
||||
A path to a node, either as a node reference or as a string.
|
||||
|
||||
Examples:
|
||||
|
||||
```dts
|
||||
property = &label;
|
||||
property = "/path/to/some/node";
|
||||
```
|
||||
|
||||
@@ -316,7 +316,7 @@ One possible way to do this is a 3x4 matrix where the direct GPIO keys are shift
|
||||
compatible = "zmk,kscan-gpio-direct";
|
||||
// define 2 direct GPIOs here...
|
||||
};
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
## Mock Driver
|
||||
|
||||
55
docs/docs/config/settings.md
Normal file
55
docs/docs/config/settings.md
Normal file
@@ -0,0 +1,55 @@
|
||||
---
|
||||
title: Persistent Settings
|
||||
sidebar_label: Settings
|
||||
---
|
||||
|
||||
ZMK uses [Zephyr's settings subsystem](https://docs.zephyrproject.org/3.5.0/services/settings/index.html) to store certain runtime settings in the "storage" partition of the controller's flash memory.
|
||||
These settings will be saved after certain events and loaded on boot.
|
||||
For instance, bond information for [paired Bluetooth hosts](../features/bluetooth.md) are stored in this partition so that users do not need to pair to each device again after the controller loses power.
|
||||
|
||||
Persisted settings are **not** cleared by flashing regular ZMK firmware: this is by design, since modifications like keymap changes should not cause users to lose their Bluetooth pairings.
|
||||
They can only be cleared by setting a special Kconfig symbol or flashing a special firmware build as documented below.
|
||||
|
||||
Below is a non-comprehensive list of ZMK features that utilize persisted settings.
|
||||
|
||||
- [Bluetooth](../features/bluetooth.md): Stores pairing keys and MAC addresses associated with hosts, BT profile selected through the [keymap behavior](../keymaps/behaviors/bluetooth.md)[^1]
|
||||
- [Split keyboards](../features/split-keyboards.md): Stores pairing keys and MAC addresses for wireless connection between parts
|
||||
- [Output selection](../keymaps/behaviors/outputs.md): Stores last selected preferred endpoint changed through the keymap behavior[^1]
|
||||
- [ZMK Studio](../features/studio.md): Stores any runtime keymap modifications and selected physical layouts after they are saved to the keyboard
|
||||
- [Lighting](../features/lighting.md): Stores current brightness/color/effects for [underglow](../keymaps/behaviors/underglow.md) and [backlight](../keymaps/behaviors/backlight.md) features after being changed through their keymap behaviors[^1]
|
||||
- [Power management](../keymaps/behaviors/power.md): Stores the state of the external power toggle as changed through the keymap behavior[^1]
|
||||
|
||||
[^1]: These are not saved immediately, but after `CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE` milliseconds in order to reduce potential wear on the flash memory.
|
||||
|
||||
## Kconfig
|
||||
|
||||
See [Configuration Overview](index.md) for instructions on how to change these settings.
|
||||
|
||||
Definition file: [zmk/app/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/Kconfig)
|
||||
|
||||
| Config | Type | Description | Default |
|
||||
| ------------------------------------ | ---- | ----------------------------------------------------------------------------- | ------- |
|
||||
| `CONFIG_ZMK_SETTINGS_RESET_ON_START` | bool | Clears all persistent settings from the keyboard at startup | n |
|
||||
| `CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE` | int | Milliseconds to wait after a setting change before writing it to flash memory | 60000 |
|
||||
|
||||
## Clearing Persisted Settings
|
||||
|
||||
While regular ZMK builds will not cause any settings to be cleared upon flashing, flashing a build with `CONFIG_ZMK_SETTINGS_RESET_ON_START` enabled as documented above will cause the firmware to run a special procedure when the controller starts that clears the settings partition.
|
||||
|
||||
For end users, it is recommended to use a special [shield](../development/hardware-integration/index.mdx#boards--shields) named `settings_reset` to build a new firmware file, then flash that firmware.
|
||||
See example for building firmware using this shield in the [troubleshooting docs](../troubleshooting/connection-issues.mdx#building-a-reset-firmware).
|
||||
|
||||
In both cases, regular, non-reset firmware will need to be flashed afterwards for normal operation.
|
||||
|
||||
:::warning
|
||||
|
||||
Since pairing information between split keyboards are also cleared with this process, you will need to clear settings on all parts of a split keyboard.
|
||||
Please follow the full procedure described in [troubleshooting](../troubleshooting/connection-issues.mdx#split-keyboard-parts-unable-to-pair) so that the parts can pair correctly after clearing.
|
||||
|
||||
:::
|
||||
|
||||
:::tip
|
||||
|
||||
[ZMK Studio](../features/studio.md)-specific settings can be easily cleared using the "Restore Stock Settings" button in the header of the Studio client.
|
||||
|
||||
:::
|
||||
@@ -13,13 +13,18 @@ Definition file: [zmk/app/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/
|
||||
|
||||
### General
|
||||
|
||||
| Config | Type | Description | Default |
|
||||
| ------------------------------------ | ------ | ----------------------------------------------------------------------------- | ------- |
|
||||
| `CONFIG_ZMK_KEYBOARD_NAME` | string | The name of the keyboard (max 16 characters) | |
|
||||
| `CONFIG_ZMK_SETTINGS_RESET_ON_START` | bool | Clears all persistent settings from the keyboard at startup | n |
|
||||
| `CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE` | int | Milliseconds to wait after a setting change before writing it to flash memory | 60000 |
|
||||
| `CONFIG_ZMK_WPM` | bool | Enable calculating words per minute | n |
|
||||
| `CONFIG_HEAP_MEM_POOL_SIZE` | int | Size of the heap memory pool | 8192 |
|
||||
| Config | Type | Description | Default |
|
||||
| --------------------------- | ------ | -------------------------------------------- | ------- |
|
||||
| `CONFIG_ZMK_KEYBOARD_NAME` | string | The name of the keyboard (max 16 characters) | |
|
||||
| `CONFIG_ZMK_WPM` | bool | Enable calculating words per minute | n |
|
||||
| `CONFIG_HEAP_MEM_POOL_SIZE` | int | Size of the heap memory pool | 8192 |
|
||||
|
||||
:::info
|
||||
|
||||
Because ZMK enables [the Zephyr setting](https://docs.zephyrproject.org/3.5.0/kconfig.html#CONFIG_BT_DEVICE_NAME_DYNAMIC) that allows for runtime modification of the device BT name,
|
||||
changing `CONFIG_ZMK_KEYBOARD_NAME` requires [clearing the stored settings](./settings.md#clearing-persisted-settings) on the controller in order to take effect.
|
||||
|
||||
:::
|
||||
|
||||
### HID
|
||||
|
||||
|
||||
@@ -50,7 +50,7 @@ It is also possible to build firmware locally on your computer by following the
|
||||
For normal keyboards, follow the same flashing instructions as before to flash your updated firmware.
|
||||
|
||||
For [split keyboards](features/split-keyboards.md#building-and-flashing-firmware), only the central (left) side will need to be reflashed if you are just updating your keymap.
|
||||
More troubleshooting information for split keyboards can be found [here](troubleshooting/connection-issues.mdx#split-keyboard-halves-unable-to-pair).
|
||||
More troubleshooting information for split keyboards can be found [here](troubleshooting/connection-issues.mdx#split-keyboard-parts-unable-to-pair).
|
||||
|
||||
## Building Additional Keyboards
|
||||
|
||||
|
||||
322
docs/docs/development/devicetree.md
Normal file
322
docs/docs/development/devicetree.md
Normal file
@@ -0,0 +1,322 @@
|
||||
---
|
||||
title: Devicetree Overview
|
||||
sidebar_label: Devicetree Overview
|
||||
---
|
||||
|
||||
ZMK makes heavy usage of a type of [tree data structure](<https://en.wikipedia.org/wiki/Tree_(abstract_data_type)>) known as _devicetree_.
|
||||
Devicetree is a _declarative_ way of describing almost everything about a Zephyr device, from the definition of keymaps and configuration of behaviors all the way to the internal storage partitions and architecture of the board's MCU.
|
||||
|
||||
This page is an introduction to devicetree for ZMK users and designers.
|
||||
For further reading, refer to the [devicetree spec](https://github.com/devicetree-org/devicetree-specification/releases) and [Zephyr's documentation](https://docs.zephyrproject.org/latest/build/dts/index.html#devicetree-guide).
|
||||
|
||||
## Running Example
|
||||
|
||||
The following segment taken from a keymap will be used as a running example:
|
||||
|
||||
```dts
|
||||
#include <dt-bindings/zmk/keys.h>
|
||||
#include <behaviors.dtsi>
|
||||
|
||||
/ {
|
||||
behaviors {
|
||||
spc_ul: space_underscore {
|
||||
compatible = "zmk,behavior-mod-morph";
|
||||
#binding-cells = <0>;
|
||||
bindings = <&kp SPACE>, <&kp UNDERSCORE>;
|
||||
mods = <(MOD_LSFT|MOD_RSFT)>;
|
||||
};
|
||||
};
|
||||
keymap {
|
||||
compatible = "zmk,keymap";
|
||||
default_layer {
|
||||
bindings = <&spc_ul &kp Z &kp M &kp K>;
|
||||
};
|
||||
};
|
||||
};
|
||||
```
|
||||
|
||||
It may be helpful to open this page twice and leave one copy open at this example.
|
||||
Note also that Devicetree uses C-style comments, i.e. `// ...` for line comments and `/* ... */` for block comments.
|
||||
|
||||
## Structure
|
||||
|
||||
A devicetree node has the general structure (parts within `[]` being optional)
|
||||
|
||||
```dts
|
||||
[label:] name {
|
||||
[properties]
|
||||
[child nodes]
|
||||
};
|
||||
```
|
||||
|
||||
The root node of the devicetree always has the name `/`, i.e. is written as
|
||||
|
||||
```dts
|
||||
/ {
|
||||
[child nodes]
|
||||
};
|
||||
```
|
||||
|
||||
It is also the _only_ node which has the `/` character as a name. See the devicetree spec for permitted characters for node names.
|
||||
|
||||
After various preprocessing steps, all contents of the devicetree will be found within/under the root node.
|
||||
If one node is found within another node, we say that the first node is a _child node_ of the second one. Similarly, one can also refer to a _grandchild node_, etc.
|
||||
|
||||
In the running example, `behaviors` and `keymap` are child nodes of the root node. `space_underscore` and `default_layer` are child nodes of `behaviors` and `keymap` respectively, making them both grandchild nodes of the root node.
|
||||
|
||||
### Properties
|
||||
|
||||
What properties a node may have varies drastically. Of the standard properties, there are two which are of particularly relevant to users and designers: `compatible` and `status`. Additional standard properties may be found in the [devicetree spec](https://github.com/devicetree-org/devicetree-specification/releases).
|
||||
|
||||
#### Property types
|
||||
|
||||
These are some of the property types you will see most often when working with ZMK. [Zephyr's Devicetree bindings documentation](https://docs.zephyrproject.org/3.5.0/build/dts/bindings.html) provides more detailed information and a full list of types.
|
||||
|
||||
##### bool
|
||||
|
||||
True or false. To set the property to true, list it with no value. To set it to false, do not list it.
|
||||
|
||||
Example: `property;`
|
||||
|
||||
If a property has already been set to true and you need to override it to false, use the following command to delete the existing property:
|
||||
|
||||
```dts
|
||||
/delete-property/ the-property-name;
|
||||
```
|
||||
|
||||
##### int
|
||||
|
||||
A single integer surrounded by angle brackets. Also supports mathematical expressions.
|
||||
|
||||
Example: `property = <42>;`
|
||||
|
||||
##### string
|
||||
|
||||
Text surrounded by double quotes.
|
||||
|
||||
Example: `property = "foo";`
|
||||
|
||||
##### array
|
||||
|
||||
A list of integers surrounded by angle brackets and separated with spaces. Mathematical expressions can be used but must be surrounded by parenthesis.
|
||||
|
||||
Example: `property = <1 2 3 4>;`
|
||||
|
||||
Values can also be split into multiple blocks, e.g. `property = <1 2>, <3 4>;`
|
||||
|
||||
##### phandle
|
||||
|
||||
A single node reference surrounded by angle brackets. Phandles will be explained in more detail in a [later section](#labels-and-phandles).
|
||||
|
||||
Example: `property = <&label>`
|
||||
|
||||
##### phandles
|
||||
|
||||
A list of node references surrounded by angle brackets. Phandles will be explained in more detail in a [later section](#labels-and-phandles).
|
||||
|
||||
Example: `property = <&label1 &label2 &label3>`
|
||||
|
||||
##### phandle array
|
||||
|
||||
A list of node references and possibly numbers to associate with the node. Mathematical expressions can be used but must be surrounded by parenthesis. Phandles will be explained in more detail in a [later section](#labels-and-phandles).
|
||||
|
||||
Example: `property = <&none &mo 1>;`
|
||||
|
||||
Values can also be split into multiple blocks, e.g. `property = <&none>, <&mo 1>;`
|
||||
|
||||
See the documentation for "phandle-array" in [Zephyr's Devicetree bindings documentation](https://docs.zephyrproject.org/3.5.0/build/dts/bindings.html)
|
||||
for more details on how parameters are associated with nodes.
|
||||
|
||||
##### GPIO array
|
||||
|
||||
This is just a phandle array. The documentation lists this as a different type to make it clear which properties expect an array of GPIOs.
|
||||
|
||||
Each item in the array should be a label for a GPIO node (the names of which differ between hardware platforms) followed by an index and configuration flags. See [Zephyr's GPIO documentation](https://docs.zephyrproject.org/3.5.0/hardware/peripherals/gpio.html) for a full list of flags. Phandles and labels will be explained in more detail in a [later section](#labels-and-phandles).
|
||||
|
||||
Example:
|
||||
|
||||
```dts
|
||||
some-gpios =
|
||||
<&gpio0 0 GPIO_ACTIVE_HIGH>,
|
||||
<&gpio0 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
|
||||
;
|
||||
```
|
||||
|
||||
##### path
|
||||
|
||||
A path to a node, either as a node reference or as a string. This will be explained in more detail in a [later section](#labels-and-phandles).
|
||||
|
||||
Examples:
|
||||
|
||||
```dts
|
||||
property = &label;
|
||||
property = "/path/to/some/node";
|
||||
```
|
||||
|
||||
#### Compatible
|
||||
|
||||
The most important property that a node has is generally the `compatible` property. This property is used to map code to nodes. There are some special cases, such as the node named `chosen`, where the node name is used rather than a `compatible` property.
|
||||
|
||||
In the running example, `space_underscore` has the property `compatible = "zmk,behavior-mod-morph";`. The [ZMK's mod-morph behavior code](https://github.com/zmkfirmware/zmk/blob/main/app/src/behaviors/behavior_mod_morph.c#L7) acts on all nodes with `compatible` set to this value. The [ZMK keymap code](https://github.com/zmkfirmware/zmk/blob/main/app/src/keymap.c#L29) acts similarly for `compatible = "zmk,keymap";`.
|
||||
|
||||
The `compatible` property is also used to identify what additional properties a node may have. Any properties which are not one of the standard properties must be listed in a "devicetree bindings" file. These files will sometimes also include some additional information on the usage of the node.
|
||||
|
||||
ZMK keeps all of its devicetree bindings under the [`app/dts/bindings` directory](https://github.com/zmkfirmware/zmk/tree/main/app/dts/bindings).
|
||||
|
||||
The bindings file for `compatible = "zmk,behavior-mod-morph";` is [`app/dts/bindings/behaviors/zmk,behavior-mod-morph.yaml`](https://github.com/zmkfirmware/zmk/blob/main/app/dts/bindings/behaviors/zmk%2Cbehavior-mod-morph.yaml).
|
||||
|
||||
```dts title="zmk,behavior-mod-morph.yaml"
|
||||
# Copyright (c) 2020 The ZMK Contributors
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
description: Mod Morph Behavior
|
||||
|
||||
compatible: "zmk,behavior-mod-morph"
|
||||
|
||||
include: zero_param.yaml
|
||||
|
||||
properties:
|
||||
bindings:
|
||||
type: phandle-array
|
||||
required: true
|
||||
mods:
|
||||
type: int
|
||||
required: true
|
||||
keep-mods:
|
||||
type: int
|
||||
required: false
|
||||
```
|
||||
|
||||
The properties the node can have are listed under `properties`. Some additional properties are imported from [zero_param.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/dts/bindings/behaviors/zero_param.yaml). Bindings files are **the authority** on node properties, with our [documentation of said properties](https://zmk.dev/docs/config/behaviors#devicetree-7) sometimes omitting things like the `#binding-cells` property (imported from the previously mentioned file, describing the number of parameters that the behavior accepts). A full description of the bindings file syntax can be found in [Zephyr's documentation](https://docs.zephyrproject.org/3.5.0/build/dts/bindings-syntax.html).
|
||||
|
||||
Note that binding files can also specify properties for children, like the [`zmk,keymap.yaml` bindings file](https://github.com/zmkfirmware/zmk/blob/main/app/dts/bindings/zmk%2Ckeymap.yaml) specifying properties for layers in the keymap.
|
||||
|
||||
#### Status
|
||||
|
||||
The `status` property simply describes the status of a node. For ZMK users and designers, there are only two relevant values that this could be set to:
|
||||
|
||||
- `status = "disabled";` The node is disabled. Code should not take effect or make use of the node, but it can still be referenced by other parts of the devicetree.
|
||||
- `status = "okay";` The default setting when not explicitly stated. The node is treated as "active". This property is generally only explicitly stated when overwriting a `status = "disabled";`.
|
||||
|
||||
How this property is used in practice will become more clear after the [devicetree preprocessing](#devicetree-preprocessing) section later on.
|
||||
|
||||
### Labels and Phandles
|
||||
|
||||
In addition to _names_, nodes can also have _labels_. For the ZMK user/designer, labels are arguably more important than node names. Whereas node names are used within code to access individual nodes, labels are used to reference other nodes from within devicetree itself. Such a reference is called a _phandle_, and can be thought of as similar to a pointer in C.
|
||||
|
||||
In the running example, `spc_ul` is the label given to the node `space_underscore`. The `bindings` property of the `default_layer` node is a "phandle-array" - an array of references to other nodes[^1]. Its first element is `&spc_ul` - a phandle to the node with label `spc_ul`, i.e. `space_underscore`. `&kp` is another example of a phandle. It points to a node [defined as below](https://github.com/zmkfirmware/zmk/blob/main/app/dts/behaviors/key_press.dtsi):
|
||||
|
||||
```dts
|
||||
/ {
|
||||
behaviors {
|
||||
kp: key_press {
|
||||
compatible = "zmk,behavior-key-press";
|
||||
#binding-cells = <1>;
|
||||
display-name = "Key Press";
|
||||
};
|
||||
};
|
||||
};
|
||||
```
|
||||
|
||||
This node is imported from a different file -- imports will be discussed later on. The `&kp` phandles found in the running example also show the concept of _parameters_ being passed to phandles. In this case, `Z`, `M`, and `K` are passed as parameters.
|
||||
|
||||
When ZMK needs to trigger a behavior found at a location in the keymap's `binding` property, it uses the phandle to identify the behavior node which needs to be called. It then executes the code determined by the `compatible` property of said node, passing in parameters while doing so[^2]. Depending on the behavior, another behavior phandle may need to be triggered, in which case the same process is used to identify the node and thus the parts of code which need to be executed.
|
||||
|
||||
Essentially, each layer in a keymap consists of an array of phandles pointing to various behaviors (alongside parameters) that were defined elsewhere. If you do not need to define the behavior node yourself, that just means ZMK has already defined it for you.
|
||||
|
||||
[^1]: A phandle array by definition also includes metadata, i.e. parameters. Strictly speaking, a list of phandles without metadata has type `phandles` rather than `phandle-array`. A property with a single phandle has type `phandle`.
|
||||
|
||||
[^2]: The number of parameters passed to the behavior code (and skipped over to find the next behavior phandle) is determined by the `#binding-cells` property mentioned above.
|
||||
|
||||
## Devicetree Preprocessing
|
||||
|
||||
Much of the complexity in `dts` files comes from preprocessing. The resulting devicetree after all preprocessing has finished [can be inspected](../troubleshooting/building-issues.md#devicetree-related-issues) for both GitHub Actions and local builds. For reasons that will make more sense later, your keymap and most of your customisations will be found near the bottom of the file.
|
||||
|
||||
Preprocessing comes from two sources:
|
||||
|
||||
1. The [C preprocessor](https://gcc.gnu.org/onlinedocs/cpp/) can be used within Devicetree Source (`dts`) files.
|
||||
2. Devicetree has its own system for merging together, overwriting, and even deleting nodes and properties.
|
||||
|
||||
### C Preprocessor
|
||||
|
||||
An introduction to the C preprocessor is beyond the scope of this page. There are plenty of resources online for the unfamiliar reader to refer to.
|
||||
|
||||
However, some specific methods of how the C preprocessor is used in ZMK's devicetree files can be useful, to better understand how everything fits together.
|
||||
|
||||
The C preprocessor is used to import some nodes and other preprocessor definitions from other files. The lines
|
||||
|
||||
```dts
|
||||
#include <dt-bindings/zmk/keys.h>
|
||||
#include <behaviors.dtsi>
|
||||
```
|
||||
|
||||
which are found at the top of the running example import the default behavior node definitions for ZMK, along with a list of preprocessor definitions. The parameters `Z`, `M`, and `K` (passed to the `&kp` phandle in the running example) are actually C preprocessor defines. For example, during preprocessing references to `Z` get turned into the number `0x07001D`, which is the number that gets passed to the ZMK host device (e.g. your computer) for it to then re-interpret as the letter "z".
|
||||
|
||||
The C preprocessor often gets leveraged by ZMK power users to reduce repetition in their keymap files. An example of this is the [macro-behavior convenience macro](../keymaps/behaviors/macros.md#convenience-c-macro). ZMK designers will also come across the `RC` macro used for matrix transformations, and make use of convenience defines such as `GPIO_ACTIVE_HIGH`.
|
||||
|
||||
### Devicetree Processing
|
||||
|
||||
A devicetree is almost always constructed from multiple files. These files are generally speaking:
|
||||
|
||||
- `.dtsi` files, which exist exclusively to be included via the C preprocessor (their contents get "pasted" at the location of the `#include` command) and are not used by the build sytem otherwise.
|
||||
- A `.dts` file, which forms the "base" of the devicetree. A single one of these is always present when a devicetree is constructed. For ZMK, the `.dts` file contains the sections of the devicetree describing the [_board_](hardware-integration/index.mdx#what-is-a-board). This includes importing a number of `.dtsi` files describing the specific SoC that the board uses.
|
||||
- Any number of `.overlay` files. These files can come from various sources, such as [shields](hardware-integration/index.mdx#what-is-a-shield) or [snippets](https://docs.zephyrproject.org/3.5.0/build/snippets/index.html). An overlay is applied to a `.dts` file by appending its contents to the end of the `.dts` file, i.e. it is placed at the bottom of the file. Multiple overlays are applied by doing so repeatedly in a particular order. Without going into the details of the exact order in which overlays are applied, it is enough to know that if you specify e.g. `shield: corne_left nice_view_adapter nice_view` in your `build.yaml`, then the overlays are applied left to right.
|
||||
- A single `.keymap` file. This file being included is ZMK-specific, and is treated as the "final" `.overlay` file, appended after all other overlays.
|
||||
|
||||
#### Merging and overwriting nodes
|
||||
|
||||
When a node appears multiple times in the devicetree (after the files are imported and merged together), it gets merged into a single node as a preprocessing step. For example:
|
||||
|
||||
```dts
|
||||
/ {
|
||||
mn_ex: my_example_node {
|
||||
property1 = <0>;
|
||||
property2 = <2>;
|
||||
};
|
||||
};
|
||||
|
||||
/ {
|
||||
my_example_node {
|
||||
property2 = <1>;
|
||||
property3 = <4>;
|
||||
};
|
||||
|
||||
example2 {
|
||||
property;
|
||||
};
|
||||
};
|
||||
```
|
||||
|
||||
The second appearance of `my_example_node` has priority, thus its `property2` value will overwrite the first appearance. The two root nodes also get merged in the process. The resulting tree after processing would be
|
||||
|
||||
```dts
|
||||
/ {
|
||||
mn_ex: my_example_node {
|
||||
property1 = <0>;
|
||||
property2 = <1>;
|
||||
property3 = <4>;
|
||||
};
|
||||
|
||||
example2 {
|
||||
property;
|
||||
};
|
||||
};
|
||||
```
|
||||
|
||||
Labels do not get overwritten; a node can have multiple labels. Phandles can also be used to overwrite or add properties:
|
||||
|
||||
```dts
|
||||
&mn_ex {
|
||||
property4 = <2>;
|
||||
};
|
||||
```
|
||||
|
||||
The phandle approach is the recommended one, as one does not need to know the exact names of all the parent nodes with this approach. Crucially, when using phandles to overwrite or add properties, **the phandle must not be located within the root node**. It is instead placed outside of the tree entirely.
|
||||
|
||||
#### Special devicetree directives
|
||||
|
||||
Devicetree has some special directives that affect the tree. Relevant ones are:
|
||||
|
||||
- Nodes can be deleted with the /delete-node/ directive: `/delete-node/ &node_label;` outside of the root node.
|
||||
- Properties can be deleted with the /delete-property/ directive: `/delete-property/ node-property;` inside the relevant node.
|
||||
- `/omit-if-no-ref/` causes a node to be omitted from the resulting devicetree if there are no references/phandles to the node: `/omit-if-no-ref/ &node_label;`
|
||||
180
docs/docs/development/events.md
Normal file
180
docs/docs/development/events.md
Normal file
@@ -0,0 +1,180 @@
|
||||
---
|
||||
title: ZMK Events
|
||||
sidebar_label: ZMK Events
|
||||
---
|
||||
|
||||
ZMK makes use of events to decouple individual components such as behaviors and peripherals from the core functionality. For this purpose, ZMK has implemented its own event manager. This page is a (brief) overview of the functionality and methods exposed by the event manager, documenting its API. Its purpose is to aid module developers and contributors, such as for the development of [new behaviors](./new-behavior.mdx) or [new features](./module-creation.md). There is no value in reading this page as an end-user.
|
||||
|
||||
To see what events exist and what data they contain, it is best to view the corresponding [event header files](https://github.com/zmkfirmware/zmk/tree/main/app/include/zmk/events) directly. Including the event_manager header via `#include <zmk/event_manager.h>` is required for any interaction with the event system.
|
||||
|
||||
## Generic Events
|
||||
|
||||
The generic event type is `struct zmk_event_t`. This struct looks like this:
|
||||
|
||||
```c
|
||||
typedef struct {
|
||||
const struct zmk_event_type *event;
|
||||
uint8_t last_listener_index;
|
||||
} zmk_event_t;
|
||||
```
|
||||
|
||||
In memory, the struct for a specific raised event `struct zmk_specific_thing_happened_event` **always** consists of a `zmk_event_t` struct **followed immediately afterwards** by the struct containing the data for the actual event.
|
||||
|
||||
```c
|
||||
struct zmk_specific_thing_happened_event {
|
||||
zmk_event_t header;
|
||||
struct zmk_specific_thing_happened data;
|
||||
};
|
||||
```
|
||||
|
||||
The contents of `header.event` allows us to identify which type a particular event actually is, so that we may safely access its data in `data`. This is handled by the following function, which allows us to obtain the underlying data from a generic event:
|
||||
|
||||
```c
|
||||
struct zmk_specific_thing_happened *as_specific_thing_happened(const zmk_event_t *eh);
|
||||
```
|
||||
|
||||
This method takes in a pointer to a `zmk_event_t` (which is actually a pointer to a specific event, such as `zmk_specific_thing_happened_event`), and will return the underlying `zmk_specific_thing_happened` data struct if the `zmk_event_t` header indicates that the generic event pointer is indeed a pointer to a `zmk_specific_thing_happened_event`. If the type of the event does not match the function, then the function will return `NULL`. By convention, `zmk_event_t` pointer arguments are named `eh`, short for "event header".
|
||||
|
||||
This method will exist for every type of event, so for `zmk_layer_state_changed` we have `as_zmk_layer_state_changed`, etc. It is generated by a macro as part of the event declaration.
|
||||
|
||||
## Subscribing To Events
|
||||
|
||||
### Subscription and Listener
|
||||
|
||||
To subscribe to any events, you will first need to inform the event manager that you wish to add a new listener.
|
||||
This is done by calling the `ZMK_LISTENER` macro:
|
||||
|
||||
```c
|
||||
ZMK_LISTENER(combo, behavior_combo_listener);
|
||||
```
|
||||
|
||||
This macro takes two parameters:
|
||||
|
||||
1. (`combo` in the example) This gives a name to the listener, for the event manager to refer back to it.
|
||||
2. (`behavior_combo_listener` in the example) This is a [callback](<https://en.wikipedia.org/wiki/Callback_(computer_programming)>) that will be called whenever **any** event that the listener subscribes to occurs (if it is not handled by another listener with a higher priority). By convention, the callback should have the suffix `_listener`.
|
||||
|
||||
Once you have a listener set up, you can subscribe to individual events by calling the `ZMK_SUBSCRIPTION` macro:
|
||||
|
||||
```c
|
||||
ZMK_SUBSCRIPTION(combo, zmk_keycode_state_changed);
|
||||
```
|
||||
|
||||
The first parameter is the name of the listener created with `ZMK_LISTENER`, while the second is the name of the _struct_ that defines the event's data, which was declared in the corresponding header file. By convention the header file for an event will be named `specific_thing_happened`, with the struct named `zmk_specific_thing_happened`.
|
||||
|
||||
Of course, you will also need to import the corresponding event header at the top of your file.
|
||||
|
||||
### Listener Callback
|
||||
|
||||
The listener will be passed a raised `zmk_event_t` pointer (as described previously) as an argument, and should have `int` as its return type.
|
||||
|
||||
The listener should return one of three values (which are of type `int`) back to the event manager:
|
||||
|
||||
- `ZMK_EV_EVENT_BUBBLE`: Keep propagating the event `struct` to the next listener.
|
||||
- `ZMK_EV_EVENT_HANDLED`: Stop propagating the event `struct` to the next listener. The event manager still owns the `struct`'s memory, so it will be `free`d automatically. Do **not** free the memory in this function.
|
||||
- `ZMK_EV_EVENT_CAPTURED`: Stop propagating the event `struct` to the next listener. The event `struct`'s memory is now owned by your code, so the event manager will not free the event `struct` memory. Make sure your code will release or free the event at some point in the future. (Use the `ZMK_EVENT_*` macros described [below](#raising-events).)
|
||||
|
||||
If an error occurs during the listener call, it should return a negative value indicating the appropriate error code.
|
||||
|
||||
As mentioned previously, the same callback will be called when any event that is subscribed to occurs. To obtain the underlying event from the generic event passed to the listener, the previously described `as_zmk_specific_thing_happened` function should be used:
|
||||
|
||||
```c
|
||||
int behavior_hold_tap_listener(const zmk_event_t *eh) {
|
||||
if (as_zmk_position_state_changed(eh) != NULL) {
|
||||
// it is a position_state_changed event, handle it with my_position_state_handler
|
||||
return my_position_state_handler(eh);
|
||||
} else if (as_zmk_keycode_state_changed(eh) != NULL) {
|
||||
// it is a keycode_state_changed event, handle it with my_keycode_state_handler
|
||||
return my_keycode_state_handler(eh);
|
||||
}
|
||||
return ZMK_EV_EVENT_BUBBLE;
|
||||
}
|
||||
```
|
||||
|
||||
The priority of the listeners is determined by the order in which the linker links the files. Within ZMK, this is the order of the corresponding files in `CMakeLists.txt`. External modules targeting `app` are linked prior to any files within ZMK itself, making them the highest priority. It is thus the module maintainer's responsibility to both ensure that their module does not cause issues by being first in the listener queue. For example, [hold-tap](../keymaps/behaviors/hold-tap.mdx) is the first listener to `position_state_changed`, and may behave inconsistently if a behavior defined in a module listens to `position_state_changed` and invokes a `hold-tap` (e.g. by calling `zmk_behavior_invoke_event` with a `hold-tap` as the binding).
|
||||
|
||||
In addition, because modules listen to the events first, they should _never_ capture/handle an event defined in ZMK without releasing it later. Unless it is unavoidable, it is recommended to bubble events whenever possible.
|
||||
|
||||
When considering multiple modules, priority is determined by the order in which the modules are present in the user's `west.yml`. Hence there should be no order dependencies between modules, only within a module.
|
||||
|
||||
## Raising Events
|
||||
|
||||
There are several different ways to raise events, with slight differences between them.
|
||||
|
||||
- `int raise_zmk_specific_thing_happened(struct zmk_specific_thing_happened event)`: This function will take an event data structure, add a header to it, and then start handling the event with the first registered event listener.
|
||||
|
||||
The following macros can also be used for advanced use cases. These will each take in an event `ev` which already consists of the header & data combination, i.e. `ev` has the type `struct zmk_specific_thing_happened_event`.
|
||||
|
||||
- `ZMK_EVENT_RAISE(ev)`: Start handling this event (`ev`) with the first registered event listener.
|
||||
- `ZMK_EVENT_RAISE_AFTER(ev, mod)`: Start handling this event (`ev`) after the event is captured by the named [event listener](#subscription-and-listener) (`mod`). The named event listener will be skipped as well.
|
||||
- `ZMK_EVENT_RAISE_AT(ev, mod)`: Start handling this event (`ev`) at the named [event listener](#subscription-and-listener) (`mod`). The named event listener is the first handler to be invoked.
|
||||
- `ZMK_EVENT_RELEASE(ev)`: Continue handling this event (`ev`) at the next registered event listener.
|
||||
- `ZMK_EVENT_FREE(ev)`: Free the memory associated with the event (`ev`).
|
||||
|
||||
Optionally, some events may also declare an extra function similar to `raise_zmk_specific_thing_happened` named `raise_specific_thing_happened`. This function will take in some or all of the components of the `zmk_specific_thing_happened` struct, and then create the struct (perhaps with some additional data obtained from elsewhere) before calling `raise_zmk_specific_thing_happened`. For example:
|
||||
|
||||
```c
|
||||
static inline int raise_layer_state_changed(uint8_t layer, bool state) {
|
||||
return raise_zmk_layer_state_changed(
|
||||
(struct zmk_layer_state_changed){
|
||||
.layer = layer,
|
||||
.state = state,
|
||||
.timestamp = k_uptime_get()
|
||||
}
|
||||
);
|
||||
}
|
||||
```
|
||||
|
||||
## Creating New Events
|
||||
|
||||
### Header File
|
||||
|
||||
Your event's header file should have four things:
|
||||
|
||||
- A copyright comment
|
||||
- Any required header includes (along with `#pragma once`)
|
||||
- The event's data struct
|
||||
- The macro `ZMK_EVENT_DECLARE`, called with the name of your event's data struct.
|
||||
|
||||
For example:
|
||||
|
||||
```c
|
||||
/*
|
||||
- Copyright (c) 2021 The ZMK Contributors
|
||||
-
|
||||
- SPDX-License-Identifier: MIT
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <zephyr/kernel.h>
|
||||
|
||||
#include <zmk/endpoints_types.h>
|
||||
#include <zmk/event_manager.h>
|
||||
|
||||
struct zmk_endpoint_changed {
|
||||
struct zmk_endpoint_instance endpoint;
|
||||
};
|
||||
|
||||
ZMK_EVENT_DECLARE(zmk_endpoint_changed);
|
||||
```
|
||||
|
||||
### Code File
|
||||
|
||||
Your event's code file merely needs three things:
|
||||
|
||||
- A copyright comment
|
||||
- Any required header files (including that of your event)
|
||||
- The macro `ZMK_EVENT_IMPL`, called with the name of your event's data struct.
|
||||
|
||||
```c
|
||||
/*
|
||||
* Copyright (c) 2021 The ZMK Contributors
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*/
|
||||
|
||||
#include <zephyr/kernel.h>
|
||||
#include <zmk/events/endpoint_changed.h>
|
||||
|
||||
ZMK_EVENT_IMPL(zmk_endpoint_changed);
|
||||
```
|
||||
@@ -166,7 +166,7 @@ Finally, we will list the `wakeup_scan` device in an additional configuration se
|
||||
Here are the properties for the node:
|
||||
|
||||
- The `compatible` property for the node must be `zmk,soft-off-wakeup-sources`.
|
||||
- The `wakeup-sources` property is a [phandle array](../../config/index.md#devicetree-property-types) pointing to all the devices that should be enabled during the shutdown process to be sure they can later wake the keyboard.
|
||||
- The `wakeup-sources` property is a [phandle array](../devicetree.md#property-types) pointing to all the devices that should be enabled during the shutdown process to be sure they can later wake the keyboard.
|
||||
|
||||
:::tip
|
||||
If you add your kscan to the `wakeup-sources` array, then your keyboard will wake upon pressing any key in your kscan. Essentially, this causes `&soft_off` to behave like a behavior that puts the keyboard in deep sleep. If you choose to do so, then you can omit everything aside from the `soft_off_wakers` node.
|
||||
|
||||
@@ -99,14 +99,14 @@ command. These are invoked whenever a new build system is generated. To add
|
||||
permanent arguments, set the `build.cmake-args` configuration option.
|
||||
|
||||
```sh
|
||||
west config build.cmake-args -- -DSHIELD=kyra_left
|
||||
west config build.cmake-args -- -DSHIELD=kyria_left
|
||||
```
|
||||
|
||||
Multiple arguments are added by assigning a string to the configuration option:
|
||||
|
||||
```sh
|
||||
west config build.cmake-args \
|
||||
-- "-DSHIELD=kyra_left -DZMK_CONFIG=/absolute/path/to/zmk-config"
|
||||
-- "-DSHIELD=kyria_left -DZMK_CONFIG=/absolute/path/to/zmk-config"
|
||||
```
|
||||
|
||||
### Pristine Building
|
||||
|
||||
@@ -203,10 +203,10 @@ west zephyr-export
|
||||
pip install -r zephyr/scripts/requirements-base.txt
|
||||
```
|
||||
|
||||
If you are going to build firmware with [ZMK Studio](../../../features/studio.md), also install `requirements-extra.txt` dependencies:
|
||||
If you are going to build firmware with [ZMK Studio](../../../features/studio.md), also install `requirements-extras.txt` dependencies:
|
||||
|
||||
```sh
|
||||
pip install -r zephyr/scripts/requirements-extra.txt
|
||||
pip install -r zephyr/scripts/requirements-extras.txt
|
||||
```
|
||||
|
||||
</TabItem>
|
||||
@@ -301,10 +301,10 @@ west zephyr-export
|
||||
pip3 install --user -r zephyr/scripts/requirements-base.txt
|
||||
```
|
||||
|
||||
If you are going to build firmware with [ZMK Studio](../../../features/studio.md), also install `requirements-extra.txt` dependencies:
|
||||
If you are going to build firmware with [ZMK Studio](../../../features/studio.md), also install `requirements-extras.txt` dependencies:
|
||||
|
||||
```sh
|
||||
pip3 install -r zephyr/scripts/requirements-extra.txt
|
||||
pip3 install -r zephyr/scripts/requirements-extras.txt
|
||||
```
|
||||
|
||||
</TabItem>
|
||||
@@ -317,10 +317,10 @@ pip3 install -r zephyr/scripts/requirements-extra.txt
|
||||
pip install -r zephyr/scripts/requirements-base.txt
|
||||
```
|
||||
|
||||
If you are going to build firmware with [ZMK Studio](../../../features/studio.md), also install `requirements-extra.txt` dependencies:
|
||||
If you are going to build firmware with [ZMK Studio](../../../features/studio.md), also install `requirements-extras.txt` dependencies:
|
||||
|
||||
```sh
|
||||
pip install -r zephyr/scripts/requirements-extra.txt
|
||||
pip install -r zephyr/scripts/requirements-extras.txt
|
||||
```
|
||||
|
||||
</TabItem>
|
||||
@@ -332,10 +332,10 @@ pip install -r zephyr/scripts/requirements-extra.txt
|
||||
pip3 install -r zephyr/scripts/requirements-base.txt
|
||||
```
|
||||
|
||||
If you are going to build firmware with [ZMK Studio](../../../features/studio.md), also install `requirements-extra.txt` dependencies:
|
||||
If you are going to build firmware with [ZMK Studio](../../../features/studio.md), also install `requirements-extras.txt` dependencies:
|
||||
|
||||
```sh
|
||||
pip3 install -r zephyr/scripts/requirements-extra.txt
|
||||
pip3 install -r zephyr/scripts/requirements-extras.txt
|
||||
```
|
||||
|
||||
</TabItem>
|
||||
|
||||
@@ -215,7 +215,7 @@ Including `zmk/event_manager.h` is required for the following dependencies to fu
|
||||
- `zmk/events/keycode_state_changed.h`: Keycode events' state (on/off), usage page, keycode value, modifiers, and timestamps
|
||||
- `zmk/events/modifiers_state_changed.h`: Modifier events' state (on/off) and modifier value
|
||||
|
||||
Events can be used similarly to hardware interrupts, through the use of [listeners](#listeners-and-subscriptions).
|
||||
Events can be used similarly to hardware interrupts. See [Events](events.md) for more information on using events.
|
||||
|
||||
###### Listeners and subscriptions
|
||||
|
||||
@@ -223,31 +223,13 @@ The condensed form of lines 192-225 of the tap-dance driver, shown below, does a
|
||||
|
||||
```c title="app/src/behaviors/behavior_tap_dance.c (Lines 192-197, 225)"
|
||||
static int tap_dance_position_state_changed_listener(const zmk_event_t *eh);
|
||||
|
||||
ZMK_LISTENER(behavior_tap_dance, tap_dance_position_state_changed_listener);
|
||||
ZMK_SUBSCRIPTION(behavior_tap_dance, zmk_position_state_changed);
|
||||
|
||||
static int tap_dance_position_state_changed_listener(const zmk_event_t *eh){
|
||||
// Do stuff...
|
||||
}
|
||||
```
|
||||
|
||||
Listeners, defined by the `ZMK_LISTENER(mod, cb)` function, take in a listener name (`mod`) and a callback function (`cb`) as their parameters. On the other hand subscriptions are defined by the `ZMK_SUBSCRIPTION(mod, ev_type)`, and determine what kind of event (`ev_type`) should invoke the callback function from the listener. In the tap-dance example, this listener executes code depending on a `zmk_position_state_changed` event, or simply, a change in key position. Other types of ZMK events can be found as the name of the `struct` inside each of the files located at `app/include/zmk/events/<Event Type>.h`. All control paths in a listener should `return` one of the [`ZMK_EV_EVENT_*` values](#return-values), which are shown below.
|
||||
|
||||
###### `return` values:
|
||||
|
||||
- `ZMK_EV_EVENT_BUBBLE`: Keep propagating the event `struct` to the next listener.
|
||||
- `ZMK_EV_EVENT_HANDLED`: Stop propagating the event `struct` to the next listener. The event manager still owns the `struct`'s memory, so it will be `free`d automatically. Do **not** free the memory in this function.
|
||||
- `ZMK_EV_EVENT_CAPTURED`: Stop propagating the event `struct` to the next listener. The event `struct`'s memory is now owned by your code, so the event manager will not free the event `struct` memory. Make sure your code will release or free the event at some point in the future. (Use the [`ZMK_EVENT_*` macros](#macros) described below.)
|
||||
|
||||
###### Macros:
|
||||
|
||||
- `ZMK_EVENT_RAISE(ev)`: Start handling this event (`ev`) with the first registered event listener.
|
||||
- `ZMK_EVENT_RAISE_AFTER(ev, mod)`: Start handling this event (`ev`) after the event is captured by the named [event listener](#listeners-and-subscriptions) (`mod`). The named event listener will be skipped as well.
|
||||
- `ZMK_EVENT_RAISE_AT(ev, mod)`: Start handling this event (`ev`) at the named [event listener](#listeners-and-subscriptions) (`mod`). The named event listener is the first handler to be invoked.
|
||||
- `ZMK_EVENT_RELEASE(ev)`: Continue handling this event (`ev`) at the next registered event listener.
|
||||
- `ZMK_EVENT_FREE(ev)`: Free the memory associated with the event (`ev`).
|
||||
|
||||
#### `BEHAVIOR_DT_INST_DEFINE`
|
||||
|
||||
`BEHAVIOR_DT_INST_DEFINE` is a special ZMK macro. It forwards all the parameters to Zephyr's `DEVICE_DT_INST_DEFINE` macro to define the driver instance, then it adds the driver to a list of ZMK behaviors so they can be found by `zmk_behavior_get_binding()`.
|
||||
|
||||
@@ -68,7 +68,7 @@ sudo tio /dev/ttyACM0
|
||||
</TabItem>
|
||||
<TabItem value="win">
|
||||
|
||||
On Windows, you can use [PuTTY](https://www.putty.org/). Once installed, use Device Manager to figure out which COM port your controller is communicating on (listed under 'Ports (COM & LPT)') and specify that as the 'Serial line' in PuTTY.
|
||||
On Windows, you can use [PuTTY](https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html). Once installed, use Device Manager to figure out which COM port your controller is communicating on (listed under 'Ports (COM & LPT)') and specify that as the 'Serial line' in PuTTY.
|
||||
|
||||

|
||||
|
||||
@@ -86,7 +86,13 @@ You can connect to the device with [tio](https://tio.github.io/) (can be install
|
||||
sudo tio /dev/tty.usbmodem14401
|
||||
```
|
||||
|
||||
You should see tio printing `Disconnected` or `Connected` when you disconnect or reconnect the USB cable.
|
||||
Alternatively, `cu` should be preinstalled (see `man cu` for usage instructions):
|
||||
|
||||
```sh
|
||||
sudo cu -l /dev/tty.usbmodem14401
|
||||
```
|
||||
|
||||
You should see the console printing `Disconnected` or `Connected` when you disconnect or reconnect the USB cable.
|
||||
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
@@ -87,7 +87,7 @@ Similar to how [bluetooth profiles](bluetooth.md) are managed between the keyboa
|
||||
|
||||
In practice, this means that your split keyboard parts will automatically pair and work the first time they are all on at the same time.
|
||||
However, if this process somehow went wrong or you used controllers in a different split keyboard configuration before, you will need to explicitly clear the stored bond information so that the parts can pair properly.
|
||||
For this, please follow [the specified procedure](../troubleshooting/connection-issues.mdx#split-keyboard-halves-unable-to-pair) in the troubleshooting section.
|
||||
For this, please follow [the specified procedure](../troubleshooting/connection-issues.mdx#split-keyboard-parts-unable-to-pair) in the troubleshooting section.
|
||||
|
||||
:::warning
|
||||
If the central keyboard part is either advertising for a pairing or waiting for disconnected peripherals, it will consume more power and drain batteries faster.
|
||||
|
||||
2
docs/docs/keymaps/_footnotes/macos-editing.mdx
Normal file
2
docs/docs/keymaps/_footnotes/macos-editing.mdx
Normal file
@@ -0,0 +1,2 @@
|
||||
On macOS, `K_CUT`, `K_COPY`, and `K_PASTE` are recognized as key presses,
|
||||
but do nothing by default.
|
||||
2
docs/docs/keymaps/_footnotes/macos-undo-redo.mdx
Normal file
2
docs/docs/keymaps/_footnotes/macos-undo-redo.mdx
Normal file
@@ -0,0 +1,2 @@
|
||||
On macOS, `K_UNDO` and `K_REDO` are recognized as key presses,
|
||||
but do nothing by default.
|
||||
@@ -37,7 +37,7 @@ Here is a table describing the action for each define:
|
||||
- Parameter #2: Only applies to `BL_SET`and is the brightness value
|
||||
|
||||
:::note[Backlight settings persistence]
|
||||
The backlight settings that are changed via the `&bl` behavior will be saved to flash storage and hence persist across restarts and firmware flashes.
|
||||
The backlight settings that are changed via the `&bl` behavior will be [saved to flash storage](../../config/settings.md) and hence persist across restarts and firmware flashes.
|
||||
They will also override the start values set by [`CONFIG_ZMK_BACKLIGHT_*_START` settings](../../config/lighting.md#kconfig-1).
|
||||
However the settings will only be saved after [`CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE`](../../config/system.md#general) milliseconds in order to reduce potential wear on the flash memory.
|
||||
:::
|
||||
|
||||
@@ -48,7 +48,7 @@ Here is a table describing the command for each define:
|
||||
| `BT_DISC` | Disconnect from the 0-indexed profile by number, if it's currently connected and inactive; must include a number as an argument in the keymap to work correctly, e.g. `BT_DISC 0`. |
|
||||
|
||||
:::note[Selected profile persistence]
|
||||
The profile that is selected by the `BT_SEL`/`BT_PRV`/`BT_NXT` actions will be saved to flash storage and hence persist across restarts and firmware flashes.
|
||||
The profile that is selected by the `BT_SEL`/`BT_PRV`/`BT_NXT` actions will be [saved to flash storage](../../config/settings.md) and hence persist across restarts and firmware flashes.
|
||||
However it will only be saved after [`CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE`](../../config/system.md#general) milliseconds in order to reduce potential wear on the flash memory.
|
||||
:::
|
||||
|
||||
|
||||
@@ -66,7 +66,7 @@ By default, layer-tap is configured with the ["tap-preferred" `flavor`](#interru
|
||||
Example:
|
||||
|
||||
```dts
|
||||
< 3 SPACE
|
||||
< 1 A
|
||||
```
|
||||
|
||||
### Configuration
|
||||
@@ -146,7 +146,7 @@ You'll then be able to use your new behavior with `&my_mt`.
|
||||
The most popular form of home-row mods is known as "timeless home-row mods", configured to minimize the dependency on timing.
|
||||
Timeless home-row mods define both a "left hand" and a "right hand" behavior.
|
||||
|
||||
Below is an example of a left hand behavior:
|
||||
Below is an example of configuration to achieve this:
|
||||
|
||||
```dts
|
||||
/ {
|
||||
@@ -185,7 +185,7 @@ Below is a brief overview of the options set.
|
||||
This interrupt flavor is primarily used to decide between hold and tap, rather than using [tapping-term-ms](#tapping-term-ms).
|
||||
This matches how modifiers are used a majority of the time (hold shift, tap a key, release shift).
|
||||
- [`require-prior-idle-ms`](#require-prior-idle-ms) is set to 125ms to resolve to taps immediately when typing at speed, which helps eliminate typing delay.
|
||||
- [Positional hold taps](#positional-hold-tap-and-hold-trigger-key-positions) with [`hold-trigger-on-release`] are used to avoid accidental hold resolutions when typing sequences of letters all with the same hand.
|
||||
- [Positional hold taps](#positional-hold-tap-and-hold-trigger-key-positions) with [`hold-trigger-on-release`](#hold-trigger-on-release) are used to avoid accidental hold resolutions when typing sequences of letters all with the same hand.
|
||||
- [`tapping-term-ms`](#tapping-term-ms) is set to a higher value of 280ms, but not unreasonably high, so that same hand modifiers can still be used with intention.
|
||||
- [`quick-tap-ms`](#quick-tap-ms) is set to 175ms, for the event where a tapped key may wish to be held down.
|
||||
|
||||
@@ -415,7 +415,7 @@ the hold-tap. For home-row mods, this is not always ideal, because it prevents c
|
||||
</details>
|
||||
#### `hold-trigger-on-release`
|
||||
|
||||
If set, instead of the keys listed in `hold-trigger-key-positions` producing a tap when _pressed_ before `tapping-term-ms` expires, they instead produce a tap when _released_ before `tapping-term-ms` expires.
|
||||
If set, instead of the keys **not** listed in `hold-trigger-key-positions` producing a tap when _pressed_ before `tapping-term-ms` expires, they instead produce a tap when _released_ before `tapping-term-ms` expires.
|
||||
|
||||
```dts
|
||||
&mt {
|
||||
|
||||
@@ -45,7 +45,7 @@ The output selection behavior changes the preferred output on press.
|
||||
- Parameter #1: Command, e.g. `OUT_BLE`
|
||||
|
||||
:::note[Output selection persistence]
|
||||
The endpoint that is selected by the `&out` behavior will be saved to flash storage and hence persist across restarts and firmware flashes.
|
||||
The endpoint that is selected by the `&out` behavior will be [saved to flash storage](../../config/settings.md) and hence persist across restarts and firmware flashes.
|
||||
However it will only be saved after [`CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE`](../../config/system.md#general) milliseconds in order to reduce potential wear on the flash memory.
|
||||
:::
|
||||
|
||||
|
||||
@@ -44,7 +44,7 @@ Here is a table describing the command for each define:
|
||||
- Parameter#1: Command, e.g `EP_ON`
|
||||
|
||||
:::note[External power state persistence]
|
||||
The on/off state that is set by the `&ext_power` behavior will be saved to flash storage and hence persist across restarts and firmware flashes.
|
||||
The on/off state that is set by the `&ext_power` behavior will be [saved to flash storage](../../config/settings.md) and hence persist across restarts and firmware flashes.
|
||||
However it will only be saved after [`CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE`](../../config/system.md#general) milliseconds in order to reduce potential wear on the flash memory.
|
||||
:::
|
||||
|
||||
|
||||
@@ -56,7 +56,7 @@ Value Limits:
|
||||
:::
|
||||
|
||||
:::note[RGB settings persistence]
|
||||
The RGB settings that are changed via the `&rgb_ug` behavior will be saved to flash storage and hence persist across restarts and firmware flashes.
|
||||
The RGB settings that are changed via the `&rgb_ug` behavior will be [saved to flash storage](../../config/settings.md) and hence persist across restarts and firmware flashes.
|
||||
They will also override the start values set by [`CONFIG_ZMK_RGB_*_START` settings](../../config/lighting.md#kconfig).
|
||||
However the settings will only be saved after [`CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE`](../../config/system.md#general) milliseconds in order to reduce potential wear on the flash memory.
|
||||
:::
|
||||
|
||||
@@ -8,14 +8,15 @@ description: Troubleshooting wireless connection issues of ZMK devices.
|
||||
[USB logging](../development/usb-logging.mdx) can be very helpful for diagnosing issues with ZMK. However, when connected to USB your ZMK device will output to USB by default. To troubleshoot wireless connection issues using logging, you will need to [change the preferred output endpoint](../keymaps/behaviors/outputs.md).
|
||||
:::
|
||||
|
||||
## Split Keyboard Halves Unable to Pair
|
||||
## Split Keyboard Parts Unable to Pair
|
||||
|
||||
[Split keyboard](../features/split-keyboards.md) halves will automatically pair with one another, but there are some cases where this breaks, and the pairing needs to be reset, for example:
|
||||
[Split keyboard](../features/split-keyboards.md) parts will automatically pair with one another, but there are some cases where this breaks and the pairing needs to be reset, for example:
|
||||
|
||||
- Switching which halves are the central/peripheral.
|
||||
- Replacing the controller for one of the halves.
|
||||
- Changing which part is the central.
|
||||
- Replacing the controller for one of the parts.
|
||||
|
||||
These issues can be resolved by flashing a settings reset firmware to both controllers.
|
||||
These issues can be resolved by flashing a settings reset firmware to both controllers to clear the stored pairing information.
|
||||
See [persistent settings documentation](../config/settings.md) for more information.
|
||||
|
||||
:::warning
|
||||
|
||||
@@ -45,16 +46,16 @@ If you use a [local development environment](../development/local-toolchain/setu
|
||||
|
||||
### Reset Split Keyboard Procedure
|
||||
|
||||
Perform the following steps to reset **_both_** halves of your split keyboard:
|
||||
Perform the following steps to reset **_all_** parts of your split keyboard:
|
||||
|
||||
1. Put each half of the split keyboard into bootloader mode.
|
||||
1. Flash one of the halves of the split with the settings reset firmware.
|
||||
1. Repeat step 2 with the other half of the split keyboard.
|
||||
1. Flash the actual image for each half of the split keyboard (e.g `my_board_left.uf2` to the left half, `my_board_right.uf2` to the right half).
|
||||
1. Put each part of the split keyboard into bootloader mode.
|
||||
1. Flash one of the parts of the split with the settings reset firmware.
|
||||
1. Repeat step 2 with the other parts of the split keyboard.
|
||||
1. Flash the actual image for each part of the split keyboard (e.g `my_board_left.uf2` to the left half, `my_board_right.uf2` to the right half).
|
||||
|
||||
After completing these steps, pair the halves of the split keyboard together by resetting them at the same time. Most commonly, this is done by grounding the reset pins for each of your keyboard's microcontrollers or pressing the reset buttons at the same time.
|
||||
If the central and a peripheral has not paired after completing these steps, it can help to reset the central and the peripheral at around the same time. Most commonly, this is done by grounding the reset pins for each of your keyboard's microcontrollers or pressing the reset buttons, or turning both off then on with a power switch.
|
||||
|
||||
Once this is done, you can remove/forget the keyboard on each host device and pair it again.
|
||||
Once this is done, you should remove/forget the keyboard on any paired host device and pair it again, since the pairing information for them will also have been cleared from the keyboard.
|
||||
|
||||
:::info
|
||||
|
||||
|
||||
@@ -232,7 +232,7 @@ Please refer to [the pairing section in the split keyboards documentation](featu
|
||||
:::note
|
||||
|
||||
If you have issues connecting the halves, make sure that both sides are getting powered properly through USB or batteries, then follow the
|
||||
[recommended troubleshooting procedure](troubleshooting/connection-issues.mdx#split-keyboard-halves-unable-to-pair). This is typically necessary if you
|
||||
[recommended troubleshooting procedure](troubleshooting/connection-issues.mdx#split-keyboard-parts-unable-to-pair). This is typically necessary if you
|
||||
swapped firmware sides between controllers, like flashing left side firmware to the same controller after flashing the right, or vice versa.
|
||||
|
||||
:::
|
||||
|
||||
3286
docs/package-lock.json
generated
3286
docs/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -15,9 +15,9 @@
|
||||
"typecheck": "tsc"
|
||||
},
|
||||
"dependencies": {
|
||||
"@docusaurus/core": "^3.8.0",
|
||||
"@docusaurus/preset-classic": "^3.8.0",
|
||||
"@docusaurus/theme-mermaid": "^3.8.0",
|
||||
"@docusaurus/core": "^3.9.1",
|
||||
"@docusaurus/preset-classic": "^3.9.1",
|
||||
"@docusaurus/theme-mermaid": "^3.9.1",
|
||||
"@fortawesome/fontawesome-svg-core": "^6.7.1",
|
||||
"@fortawesome/free-solid-svg-icons": "^6.7.1",
|
||||
"@fortawesome/react-fontawesome": "^0.2.0",
|
||||
|
||||
@@ -130,6 +130,7 @@ module.exports = {
|
||||
"config/layout",
|
||||
"config/kscan",
|
||||
"config/power",
|
||||
"config/settings",
|
||||
"config/split",
|
||||
"config/system",
|
||||
"config/studio",
|
||||
@@ -208,8 +209,10 @@ module.exports = {
|
||||
},
|
||||
"development/module-creation",
|
||||
"development/usb-logging",
|
||||
"development/devicetree",
|
||||
"development/studio-rpc-protocol",
|
||||
"development/new-behavior",
|
||||
"development/events",
|
||||
],
|
||||
},
|
||||
],
|
||||
|
||||
@@ -7,13 +7,17 @@
|
||||
import example from "@site/docs/keymaps/_footnotes/example.mdx";
|
||||
import iosApplication from "@site/docs/keymaps/_footnotes/ios-application.mdx";
|
||||
import iosPower from "@site/docs/keymaps/_footnotes/ios-power.mdx";
|
||||
import macosEditing from "@site/docs/keymaps/_footnotes/macos-editing.mdx";
|
||||
import macosPower from "@site/docs/keymaps/_footnotes/macos-power.mdx";
|
||||
import macosUndoRedo from "@site/docs/keymaps/_footnotes/macos-undo-redo.mdx";
|
||||
import globe from "@site/docs/keymaps/_footnotes/globe.mdx";
|
||||
|
||||
export default {
|
||||
example,
|
||||
iosApplication,
|
||||
iosPower,
|
||||
macosEditing,
|
||||
macosPower,
|
||||
macosUndoRedo,
|
||||
globe,
|
||||
};
|
||||
|
||||
@@ -3092,10 +3092,12 @@ export default [
|
||||
windows: false,
|
||||
linux: true,
|
||||
android: false,
|
||||
macos: null,
|
||||
macos: true,
|
||||
ios: null,
|
||||
},
|
||||
footnotes: {},
|
||||
footnotes: {
|
||||
macos: ["macosEditing"],
|
||||
},
|
||||
},
|
||||
{
|
||||
names: ["K_UNDO"],
|
||||
@@ -3113,10 +3115,12 @@ export default [
|
||||
windows: false,
|
||||
linux: true,
|
||||
android: false,
|
||||
macos: null,
|
||||
macos: true,
|
||||
ios: null,
|
||||
},
|
||||
footnotes: {},
|
||||
footnotes: {
|
||||
macos: ["macosEditing"],
|
||||
},
|
||||
},
|
||||
{
|
||||
names: ["K_CUT"],
|
||||
@@ -3134,10 +3138,12 @@ export default [
|
||||
windows: false,
|
||||
linux: true,
|
||||
android: false,
|
||||
macos: null,
|
||||
macos: true,
|
||||
ios: null,
|
||||
},
|
||||
footnotes: {},
|
||||
footnotes: {
|
||||
macos: ["macosEditing"],
|
||||
},
|
||||
},
|
||||
{
|
||||
names: ["K_COPY"],
|
||||
@@ -3155,10 +3161,12 @@ export default [
|
||||
windows: false,
|
||||
linux: true,
|
||||
android: false,
|
||||
macos: null,
|
||||
macos: true,
|
||||
ios: null,
|
||||
},
|
||||
footnotes: {},
|
||||
footnotes: {
|
||||
macos: ["macosEditing"],
|
||||
},
|
||||
},
|
||||
{
|
||||
names: ["K_PASTE"],
|
||||
@@ -3176,10 +3184,12 @@ export default [
|
||||
windows: false,
|
||||
linux: true,
|
||||
android: false,
|
||||
macos: null,
|
||||
macos: true,
|
||||
ios: null,
|
||||
},
|
||||
footnotes: {},
|
||||
footnotes: {
|
||||
macos: ["macosEditing"],
|
||||
},
|
||||
},
|
||||
{
|
||||
names: ["K_FIND"],
|
||||
@@ -3239,7 +3249,7 @@ export default [
|
||||
windows: false,
|
||||
linux: true,
|
||||
android: true,
|
||||
macos: false,
|
||||
macos: true,
|
||||
ios: null,
|
||||
},
|
||||
footnotes: {},
|
||||
@@ -3260,7 +3270,7 @@ export default [
|
||||
windows: false,
|
||||
linux: true,
|
||||
android: true,
|
||||
macos: false,
|
||||
macos: true,
|
||||
ios: null,
|
||||
},
|
||||
footnotes: {},
|
||||
@@ -7146,7 +7156,7 @@ export default [
|
||||
windows: false,
|
||||
linux: true,
|
||||
android: false,
|
||||
macos: null,
|
||||
macos: false,
|
||||
ios: null,
|
||||
},
|
||||
footnotes: {},
|
||||
@@ -7167,7 +7177,7 @@ export default [
|
||||
windows: false,
|
||||
linux: true,
|
||||
android: false,
|
||||
macos: null,
|
||||
macos: false,
|
||||
ios: null,
|
||||
},
|
||||
footnotes: {},
|
||||
@@ -7188,7 +7198,7 @@ export default [
|
||||
windows: false,
|
||||
linux: true,
|
||||
android: false,
|
||||
macos: null,
|
||||
macos: false,
|
||||
ios: null,
|
||||
},
|
||||
footnotes: {},
|
||||
@@ -7209,7 +7219,7 @@ export default [
|
||||
windows: false,
|
||||
linux: true,
|
||||
android: false,
|
||||
macos: null,
|
||||
macos: false,
|
||||
ios: null,
|
||||
},
|
||||
footnotes: {},
|
||||
@@ -7629,7 +7639,7 @@ export default [
|
||||
windows: false,
|
||||
linux: true,
|
||||
android: false,
|
||||
macos: null,
|
||||
macos: false,
|
||||
ios: null,
|
||||
},
|
||||
footnotes: {},
|
||||
@@ -7755,7 +7765,7 @@ export default [
|
||||
windows: null,
|
||||
linux: true,
|
||||
android: null,
|
||||
macos: null,
|
||||
macos: false,
|
||||
ios: null,
|
||||
},
|
||||
footnotes: {},
|
||||
@@ -7776,7 +7786,7 @@ export default [
|
||||
windows: null,
|
||||
linux: true,
|
||||
android: null,
|
||||
macos: null,
|
||||
macos: false,
|
||||
ios: null,
|
||||
},
|
||||
footnotes: {},
|
||||
@@ -7797,7 +7807,7 @@ export default [
|
||||
windows: null,
|
||||
linux: true,
|
||||
android: null,
|
||||
macos: null,
|
||||
macos: false,
|
||||
ios: null,
|
||||
},
|
||||
footnotes: {},
|
||||
@@ -7818,7 +7828,7 @@ export default [
|
||||
windows: null,
|
||||
linux: true,
|
||||
android: null,
|
||||
macos: null,
|
||||
macos: false,
|
||||
ios: null,
|
||||
},
|
||||
footnotes: {},
|
||||
@@ -7839,7 +7849,7 @@ export default [
|
||||
windows: null,
|
||||
linux: true,
|
||||
android: null,
|
||||
macos: null,
|
||||
macos: false,
|
||||
ios: null,
|
||||
},
|
||||
footnotes: {},
|
||||
@@ -7860,7 +7870,7 @@ export default [
|
||||
windows: null,
|
||||
linux: true,
|
||||
android: null,
|
||||
macos: null,
|
||||
macos: false,
|
||||
ios: null,
|
||||
},
|
||||
footnotes: {},
|
||||
|
||||
Reference in New Issue
Block a user