Compare commits
560 commits
add-layout
...
master
Author | SHA1 | Date | |
---|---|---|---|
![]() |
2beeafc215 | ||
![]() |
9e103614f8 | ||
![]() |
e413f5090f | ||
![]() |
177e461d90 | ||
![]() |
b42191a2dd | ||
![]() |
36636205dd | ||
![]() |
89e39b9858 | ||
![]() |
4ae2b4f371 | ||
![]() |
6e55870a82 | ||
![]() |
e15d9ca4b3 | ||
![]() |
5354ec5791 | ||
![]() |
235d18f360 | ||
![]() |
de5fd5d4e2 | ||
![]() |
f5b02fbc11 | ||
![]() |
611460c9db | ||
![]() |
1ac255fd1c | ||
![]() |
664c0bc4c3 | ||
![]() |
6626084cb8 | ||
![]() |
bb27c69675 | ||
![]() |
03a53e29af | ||
![]() |
096696d86d | ||
![]() |
7f9ceef3dd | ||
![]() |
7ecdb57414 | ||
![]() |
dcdd037276 | ||
![]() |
8ae01715d6 | ||
![]() |
f4aa8ae845 | ||
![]() |
0516cf5ed8 | ||
![]() |
802a199bbd | ||
![]() |
1a54ecf246 | ||
![]() |
319844407c | ||
![]() |
e57226d9a2 | ||
![]() |
21d1bc1550 | ||
![]() |
1646000c9b | ||
![]() |
824ad46e5d | ||
![]() |
0d477bf570 | ||
![]() |
2e3664d2c0 | ||
![]() |
fad44ae10c | ||
![]() |
8525ab03de | ||
![]() |
faf77f1651 | ||
![]() |
2b8aeed02b | ||
![]() |
9e2d8999bf | ||
![]() |
c8a39b69a0 | ||
![]() |
41b1bb4aef | ||
![]() |
75a037d2f0 | ||
![]() |
3703699757 | ||
![]() |
c97a798af7 | ||
![]() |
dd871d0105 | ||
![]() |
ba5c707327 | ||
![]() |
8b7c351e56 | ||
![]() |
196285c59c | ||
![]() |
f3b974f216 | ||
![]() |
243c21568a | ||
![]() |
955809bd5a | ||
![]() |
fa24b0fcce | ||
![]() |
4f0a0f32f2 | ||
![]() |
24895c46f3 | ||
![]() |
190e0eff23 | ||
![]() |
28720c4d34 | ||
![]() |
919e2a4f5c | ||
![]() |
f686ad9e63 | ||
![]() |
a4ef1ae736 | ||
![]() |
81355045cc | ||
![]() |
bcd06f03a5 | ||
![]() |
02517bd806 | ||
![]() |
6b25bfb0ff | ||
![]() |
0f948fe039 | ||
![]() |
fffa553c25 | ||
![]() |
e73b3c08a0 | ||
![]() |
fa35be5135 | ||
![]() |
0b6a460b7f | ||
![]() |
15e45b1d4b | ||
![]() |
40d0de39b7 | ||
![]() |
05ff5443b1 | ||
![]() |
e553cf7214 | ||
![]() |
cd95294a25 | ||
![]() |
8c108efb0d | ||
![]() |
b4f0314b35 | ||
![]() |
59c3612590 | ||
![]() |
55e4a1c7dc | ||
![]() |
e0b037c2cd | ||
![]() |
070dea4a9c | ||
![]() |
f4171412a6 | ||
![]() |
7f42a5bc03 | ||
![]() |
3e7ce54902 | ||
![]() |
88c094908b | ||
![]() |
c045c3e00c | ||
![]() |
6b1a376aee | ||
![]() |
02525f683e | ||
![]() |
5a57d2115b | ||
![]() |
660d248549 | ||
![]() |
1bc3494494 | ||
![]() |
33a12ca0b6 | ||
![]() |
084ed078d6 | ||
![]() |
32204095e5 | ||
![]() |
b76bf29d25 | ||
![]() |
396fb4dde7 | ||
![]() |
4836fcf831 | ||
![]() |
1becbaefbe | ||
![]() |
e3c613c79c | ||
![]() |
04fbcdc68d | ||
![]() |
55909141ef | ||
![]() |
cd6e065f6e | ||
![]() |
bb2b7ce7e4 | ||
![]() |
2fbc222bb0 | ||
![]() |
a1469abc8d | ||
![]() |
ab1332bb6c | ||
![]() |
ac991405d0 | ||
![]() |
842c840145 | ||
![]() |
614b631ee2 | ||
![]() |
5611a40064 | ||
![]() |
11c8b2841e | ||
![]() |
0c0d038a40 | ||
![]() |
5f31d5cc80 | ||
![]() |
dbe30a1b6f | ||
![]() |
a992e32bd5 | ||
![]() |
cf5ce64b1b | ||
![]() |
12caf0be4e | ||
![]() |
bb9dd05c6a | ||
![]() |
59f607b963 | ||
![]() |
60ac859852 | ||
![]() |
4fb3cf0712 | ||
![]() |
e98c41c02f | ||
![]() |
45091b0473 | ||
![]() |
3cf328c644 | ||
![]() |
c26449e64f | ||
![]() |
7fa65aa877 | ||
![]() |
4e2191ce20 | ||
![]() |
3de04e0386 | ||
![]() |
2e648d7e48 | ||
![]() |
1fd0139b91 | ||
![]() |
3478ae5795 | ||
![]() |
01354fffb4 | ||
![]() |
92c4f0095d | ||
![]() |
ac8b914a11 | ||
![]() |
de598ac8f0 | ||
![]() |
142952cac8 | ||
![]() |
a07360e0f1 | ||
![]() |
1fc7066713 | ||
![]() |
ca425971d5 | ||
![]() |
dffa59dca5 | ||
![]() |
3319474c5c | ||
![]() |
802e2f54c6 | ||
![]() |
12d70ab1a4 | ||
![]() |
4ae24004b7 | ||
![]() |
8244659b44 | ||
![]() |
0bd02952ea | ||
![]() |
5ea7283159 | ||
![]() |
acedfc3fcb | ||
![]() |
e5466df800 | ||
![]() |
ce1801aeda | ||
![]() |
11cb5cf347 | ||
![]() |
24d896ca06 | ||
![]() |
da2e897f55 | ||
![]() |
07684bcc99 | ||
![]() |
847bef3177 | ||
![]() |
c6a93b5a56 | ||
![]() |
8cd71917ce | ||
![]() |
7a2cd0fa96 | ||
![]() |
83818d1d6f | ||
![]() |
960c4969a5 | ||
![]() |
73e2ef486a | ||
![]() |
b5f8f4d6a2 | ||
![]() |
0c4124c1c0 | ||
![]() |
9f04023d35 | ||
![]() |
43e3831df9 | ||
![]() |
ebfa3cdd5c | ||
![]() |
c7cb7ba976 | ||
![]() |
ec324af22e | ||
![]() |
2c54ff3e63 | ||
![]() |
402b5ba6d7 | ||
![]() |
53f1f3b6d7 | ||
![]() |
b779c5f567 | ||
![]() |
a1cb822861 | ||
![]() |
a4aabea511 | ||
![]() |
c8763c9fdb | ||
![]() |
edf34315af | ||
![]() |
ce8b8414d9 | ||
![]() |
7e68cfc6fa | ||
![]() |
5c39722ab9 | ||
![]() |
ea85ace4a9 | ||
![]() |
88453acc6a | ||
![]() |
988d81581d | ||
![]() |
800bc78d26 | ||
![]() |
b43fc33be3 | ||
![]() |
d33aa82c51 | ||
![]() |
576325e2f4 | ||
![]() |
642c169bc3 | ||
![]() |
7641359240 | ||
![]() |
944a206d1f | ||
![]() |
e83b709169 | ||
![]() |
00f07ec343 | ||
![]() |
80612c8ec0 | ||
![]() |
32b9d33bbb | ||
![]() |
9208fb5adb | ||
![]() |
af141d1a5c | ||
![]() |
8d8dcb089e | ||
![]() |
a7bf8e64a5 | ||
![]() |
d0611b0468 | ||
![]() |
1388daa0cc | ||
![]() |
d99eb01ee4 | ||
![]() |
e17878ad15 | ||
![]() |
ba72094b69 | ||
![]() |
0d7d75d3d5 | ||
![]() |
daf6968947 | ||
![]() |
e27dd0f26f | ||
![]() |
6624671a60 | ||
![]() |
f549b30760 | ||
![]() |
6b8670fe8f | ||
![]() |
dc26e99dd5 | ||
![]() |
a0f40d9410 | ||
![]() |
4dc846f21c | ||
![]() |
575abc48a3 | ||
![]() |
4643681888 | ||
![]() |
0ec96ddd52 | ||
![]() |
35019fe136 | ||
![]() |
2645751ce1 | ||
![]() |
f35f4ee933 | ||
![]() |
ca84b57042 | ||
![]() |
06610c3da6 | ||
![]() |
ca635876ce | ||
![]() |
5f222a3e02 | ||
![]() |
bca0aca8c5 | ||
![]() |
f94c8fd766 | ||
![]() |
73ec19f0cb | ||
![]() |
a7ac6e4e68 | ||
![]() |
0da4c26d9c | ||
![]() |
9e775b8e9d | ||
![]() |
30c0036db1 | ||
![]() |
4d3726050e | ||
![]() |
625d62efdf | ||
![]() |
0f1dcc0592 | ||
![]() |
da166d4d8b | ||
![]() |
3cd2924985 | ||
![]() |
bc42a7ea89 | ||
![]() |
7adb4dc6fb | ||
![]() |
49d13595f6 | ||
![]() |
a8fb9e1462 | ||
![]() |
d0cfb938ef | ||
![]() |
0682cf9242 | ||
![]() |
94a9099c38 | ||
![]() |
cbe48b67df | ||
![]() |
5a6595357d | ||
![]() |
d61798169d | ||
![]() |
25fb4a498a | ||
![]() |
b9e4d22765 | ||
![]() |
6f3b494a4d | ||
![]() |
bc110b1533 | ||
![]() |
d4120b1def | ||
![]() |
ce9713c47d | ||
![]() |
183b093698 | ||
![]() |
64fe4aff31 | ||
![]() |
a02ed6a36d | ||
![]() |
c130b08f8e | ||
![]() |
a3c39bde0e | ||
![]() |
1a6a9a7c77 | ||
![]() |
86c22a15ab | ||
![]() |
558b074c93 | ||
![]() |
ce2f7d86be | ||
![]() |
2d37e80ac9 | ||
![]() |
82873684a1 | ||
![]() |
07cfce4c18 | ||
![]() |
e94f660e73 | ||
![]() |
21116c6776 | ||
![]() |
4c5e5e9d0d | ||
![]() |
38825610a5 | ||
![]() |
6a947fa534 | ||
![]() |
2b00b846dc | ||
![]() |
c9d62ddc78 | ||
![]() |
d603fb0913 | ||
![]() |
f4dfa218ff | ||
![]() |
b84ab51343 | ||
![]() |
f6dbb56a10 | ||
![]() |
894b9c458d | ||
![]() |
ad20f8287a | ||
![]() |
9f44488bb1 | ||
![]() |
0be239b45c | ||
![]() |
a958276a76 | ||
![]() |
54dbde68e1 | ||
![]() |
7fd12c2b98 | ||
![]() |
add459f0ac | ||
![]() |
3a8c76fae5 | ||
![]() |
ea238d5a8a | ||
![]() |
14ef6c9830 | ||
![]() |
96882c6a67 | ||
![]() |
fd1d4d71aa | ||
![]() |
c5232ba699 | ||
![]() |
61479c4bf2 | ||
![]() |
e7c5695a0c | ||
![]() |
f820a186d4 | ||
![]() |
3484f0a0df | ||
![]() |
40a446a0ec | ||
![]() |
46829663aa | ||
![]() |
d6850bab3f | ||
![]() |
386a5019a8 | ||
![]() |
80b16f688c | ||
![]() |
271efeb8bc | ||
![]() |
40fafad6bc | ||
![]() |
95223aa872 | ||
![]() |
e6dcdf2d65 | ||
![]() |
c6446aeaf9 | ||
![]() |
4f257711e0 | ||
![]() |
65aef7be95 | ||
![]() |
27b115151f | ||
![]() |
8ae5d34c0d | ||
![]() |
fab39d49e6 | ||
![]() |
25af20bef4 | ||
![]() |
c4e7a58848 | ||
![]() |
3306d78bbd | ||
![]() |
84f9b6dd3e | ||
![]() |
808c4d4e38 | ||
![]() |
67934546ea | ||
![]() |
21c1fd5e5b | ||
![]() |
30daeaf09f | ||
![]() |
21f7c915df | ||
![]() |
a70288bc4a | ||
![]() |
7cc18f2b11 | ||
![]() |
6e1d3d6d07 | ||
![]() |
3c6a691126 | ||
94b7179a17 | |||
![]() |
12f9f34fc8 | ||
![]() |
0302171fac | ||
![]() |
fcfe0e8a95 | ||
![]() |
4d3a9ce13a | ||
![]() |
f0a5db96c8 | ||
![]() |
a0a999976f | ||
![]() |
c2979e309f | ||
![]() |
40f08b47ae | ||
![]() |
b2ee1612fa | ||
![]() |
a052adb659 | ||
![]() |
cc09f17111 | ||
![]() |
3968f5b370 | ||
![]() |
a585bd08a3 | ||
![]() |
c46cefa898 | ||
![]() |
cb6e1c1af5 | ||
![]() |
d0153368b8 | ||
![]() |
563eb6fdc9 | ||
![]() |
a076412b2b | ||
![]() |
6c10839e33 | ||
![]() |
37c581690c | ||
![]() |
abea50c26e | ||
![]() |
ac70b81d3f | ||
![]() |
acec6904d8 | ||
![]() |
107f9a4cb3 | ||
![]() |
655bf4008a | ||
![]() |
2f69eb5f8f | ||
![]() |
516fa90f99 | ||
![]() |
5151abc298 | ||
![]() |
0419cd2eed | ||
![]() |
cbfbd173d3 | ||
![]() |
a3a3af1184 | ||
![]() |
8606e78920 | ||
![]() |
88d1f61f10 | ||
![]() |
665a12b50e | ||
![]() |
e0e96c2a75 | ||
![]() |
53e61900fe | ||
![]() |
a4d86a63f2 | ||
![]() |
e62352e606 | ||
![]() |
6ee806f376 | ||
![]() |
312f42945d | ||
![]() |
40b9dada5c | ||
![]() |
a63fd7f01c | ||
![]() |
cdb865cf60 | ||
![]() |
c4aaab5fa3 | ||
![]() |
1efc82403b | ||
![]() |
63b095212b | ||
![]() |
63daf94ee6 | ||
![]() |
50967dbe7e | ||
![]() |
2f27b3dc78 | ||
![]() |
6d0e5728aa | ||
![]() |
c592e10590 | ||
![]() |
a5c77b5c45 | ||
![]() |
c00b0c5bc9 | ||
![]() |
164b7331c3 | ||
![]() |
132efa9076 | ||
![]() |
d035f02c08 | ||
![]() |
47e66c8a24 | ||
![]() |
ad2c0f3565 | ||
![]() |
110cc0923b | ||
![]() |
b69bf4b885 | ||
![]() |
3ab2b3b6e2 | ||
![]() |
8ca303168e | ||
![]() |
5e88647879 | ||
![]() |
8400fad3d8 | ||
![]() |
37e234252e | ||
![]() |
14c7164b01 | ||
![]() |
2699e2f7c8 | ||
![]() |
7fe168a8ed | ||
![]() |
273d8d6a1a | ||
![]() |
ff09b921f1 | ||
![]() |
fa98117a3e | ||
![]() |
ae01f1b63e | ||
![]() |
8bf01dd796 | ||
![]() |
0c14fc3a21 | ||
![]() |
db68fd88bd | ||
![]() |
7073ba3dbb | ||
![]() |
ea3a968510 | ||
![]() |
d7fb12164a | ||
![]() |
cfcb8488ed | ||
![]() |
9d799aff97 | ||
![]() |
76b5cef793 | ||
![]() |
08dcc8856f | ||
![]() |
8afa3f2f08 | ||
![]() |
c7904502e5 | ||
![]() |
544ddde113 | ||
![]() |
ee63d39058 | ||
![]() |
0747f887d6 | ||
![]() |
04c2dbd3df | ||
![]() |
ef29a46c87 | ||
![]() |
291d154d7b | ||
![]() |
e4f736e685 | ||
![]() |
5f711f04f1 | ||
![]() |
a2353df422 | ||
![]() |
0a049163f1 | ||
![]() |
a6e931400e | ||
![]() |
2dd2d4eb81 | ||
![]() |
6a9ccae18d | ||
![]() |
d908501478 | ||
![]() |
5650894c20 | ||
![]() |
acb2f34c5c | ||
![]() |
163b894b97 | ||
![]() |
68130cc8a5 | ||
![]() |
a98070f212 | ||
![]() |
207dc01d49 | ||
![]() |
1a30e2b32b | ||
![]() |
7431401116 | ||
![]() |
df8cdde782 | ||
![]() |
a573931fef | ||
![]() |
a6a0dc8039 | ||
![]() |
47575d4af1 | ||
![]() |
5c33ff8be4 | ||
![]() |
7a0dbe36f3 | ||
![]() |
d30cd87556 | ||
![]() |
58aea4b479 | ||
![]() |
cedd49c59b | ||
![]() |
a62f9a2ffd | ||
![]() |
3c40e14013 | ||
![]() |
ca737d4496 | ||
![]() |
d73c64e591 | ||
![]() |
92e660833f | ||
![]() |
6b368f4ab2 | ||
![]() |
1174d16b5a | ||
![]() |
7b83bb9d26 | ||
![]() |
7f1c236c75 | ||
![]() |
eb29f8befc | ||
![]() |
26f898c8a5 | ||
![]() |
62e98327d2 | ||
![]() |
15bfe6240c | ||
![]() |
35c6520560 | ||
![]() |
f9430e530b | ||
![]() |
9332439d5c | ||
![]() |
d90b6e4689 | ||
e275181dce | |||
![]() |
9d2b416fe1 | ||
![]() |
e7125d8004 | ||
90777cb064 | |||
648d963b26 | |||
7747a20612 | |||
![]() |
e28799d790 | ||
![]() |
c1565bebce | ||
![]() |
80c90a6952 | ||
3b8d1b5bf9 | |||
ba6cf1f5f3 | |||
![]() |
8247f9e114 | ||
![]() |
1cc42e8c6e | ||
![]() |
a336c04a6a | ||
![]() |
9339e3c35d | ||
![]() |
5eb60827d5 | ||
![]() |
a25df1ab7a | ||
![]() |
28700b0a23 | ||
![]() |
e6a08dbc64 | ||
![]() |
69f4d2a086 | ||
![]() |
43800d7934 | ||
![]() |
69faa4ff1a | ||
![]() |
b01db68476 | ||
![]() |
c23e64f551 | ||
![]() |
b603094995 | ||
![]() |
e016b9b4c5 | ||
![]() |
c53d02d511 | ||
![]() |
cf975e2bfa | ||
![]() |
8157b37438 | ||
![]() |
d5a0424987 | ||
![]() |
1e6eb5e35c | ||
![]() |
4d182ec117 | ||
![]() |
08c1c045f9 | ||
![]() |
efcd6187d1 | ||
![]() |
92534d8e3d | ||
![]() |
4d3d8887e7 | ||
![]() |
93de533580 | ||
![]() |
fc4d9c63fb | ||
![]() |
8037c7332c | ||
![]() |
1741901281 | ||
![]() |
38eb643a82 | ||
![]() |
b78bf7ec43 | ||
![]() |
a09f9bbb41 | ||
![]() |
c65dd3ba50 | ||
![]() |
d3585110a3 | ||
![]() |
1ed3878d15 | ||
![]() |
b4ece24c7d | ||
![]() |
5c1c4874d7 | ||
![]() |
32ea7025fb | ||
![]() |
5f0ffd2704 | ||
![]() |
24e2466de3 | ||
![]() |
2c6a37021c | ||
![]() |
10cdcbd057 | ||
![]() |
d3c9dff9d2 | ||
![]() |
0f3993b9a3 | ||
![]() |
8e6bfbfdc2 | ||
![]() |
be6ff3af2b | ||
![]() |
cb7608b9e2 | ||
![]() |
31631537d5 | ||
![]() |
77fb523fa5 | ||
![]() |
ad9efdaf0e | ||
![]() |
e1351b4f4b | ||
![]() |
76ac62c326 | ||
![]() |
56f4ba366e | ||
![]() |
0228806ae8 | ||
![]() |
1b5ae7aa71 | ||
![]() |
c7c91700b8 | ||
![]() |
af53c13d53 | ||
![]() |
86f8694580 | ||
![]() |
a683f10bff | ||
![]() |
68f67e23aa | ||
![]() |
001e190935 | ||
![]() |
e3000fabb7 | ||
![]() |
98291bc281 | ||
![]() |
55ea94832c | ||
![]() |
f4dc0c33cc | ||
![]() |
daf4746da7 | ||
![]() |
e64adcef7e | ||
![]() |
6992401770 | ||
![]() |
3d3f14044a | ||
![]() |
094933f002 | ||
![]() |
25da6bc359 | ||
![]() |
b6192ef8a0 | ||
![]() |
176aa00abb | ||
![]() |
fefb4180aa | ||
![]() |
0196298b10 | ||
![]() |
d44fe48a55 | ||
![]() |
6f2c032459 | ||
![]() |
2d5d3ac959 | ||
![]() |
7858f84366 | ||
![]() |
384e42cb23 | ||
![]() |
22849a59d4 | ||
![]() |
750a3f1e60 | ||
![]() |
777ae4fb8d | ||
![]() |
97870b27a1 | ||
![]() |
0c176f6123 | ||
![]() |
b3a1dc0658 | ||
![]() |
2bfc0e07d1 | ||
![]() |
b599c78548 | ||
![]() |
fa96609e0b | ||
![]() |
1d5de078c7 | ||
![]() |
aa9e48dae2 | ||
![]() |
df9bf9efa1 | ||
![]() |
5b827356bb | ||
![]() |
0ae7639f6c | ||
![]() |
50491c44ca | ||
![]() |
653d1a5e37 | ||
![]() |
b0ac5bcf91 | ||
![]() |
f8ba76a771 |
4302 changed files with 55689 additions and 16825 deletions
33
.clangd
33
.clangd
|
@ -1,4 +1,33 @@
|
||||||
CompileFlags:
|
CompileFlags:
|
||||||
Add: [-Wno-unknown-attributes, -Wno-maybe-uninitialized, -Wno-unknown-warning-option]
|
Add:
|
||||||
Remove: [-W*, -mmcu=*, -mcpu=*, -mfpu=*, -mfloat-abi=*, -mno-unaligned-access, -mno-thumb-interwork, -mcall-prologues]
|
[
|
||||||
|
-Wno-unknown-attributes,
|
||||||
|
-Wno-maybe-uninitialized,
|
||||||
|
-Wno-unknown-warning-option,
|
||||||
|
-Wno-pointer-to-int-cast,
|
||||||
|
-Wno-int-to-void-pointer-cast,
|
||||||
|
-DPROGMEM=,
|
||||||
|
]
|
||||||
|
Remove:
|
||||||
|
[
|
||||||
|
-W*,
|
||||||
|
-mmcu=*,
|
||||||
|
-mcpu=*,
|
||||||
|
-mfpu=*,
|
||||||
|
-mfloat-abi=*,
|
||||||
|
-mno-unaligned-access,
|
||||||
|
-mno-thumb-interwork,
|
||||||
|
-mcall-prologues,
|
||||||
|
-D__has_include*,
|
||||||
|
-mlra,
|
||||||
|
]
|
||||||
Compiler: clang
|
Compiler: clang
|
||||||
|
Diagnostics:
|
||||||
|
UnusedIncludes: None
|
||||||
|
Suppress:
|
||||||
|
[
|
||||||
|
asm_invalid_output_constraint,
|
||||||
|
asm_invalid_input_constraint,
|
||||||
|
invalid_asm_value_for_constraint,
|
||||||
|
anyx86_interrupt_attribute,
|
||||||
|
]
|
||||||
|
|
4
.github/labeler.yml
vendored
4
.github/labeler.yml
vendored
|
@ -54,3 +54,7 @@ dd:
|
||||||
- data/constants/**
|
- data/constants/**
|
||||||
- data/mappings/**
|
- data/mappings/**
|
||||||
- data/schemas/**
|
- data/schemas/**
|
||||||
|
community_module:
|
||||||
|
- changed-files:
|
||||||
|
- any-glob-to-any-file:
|
||||||
|
- modules/**
|
||||||
|
|
1
.github/workflows/auto_tag.yml
vendored
1
.github/workflows/auto_tag.yml
vendored
|
@ -15,6 +15,7 @@ on:
|
||||||
- quantum/**/*
|
- quantum/**/*
|
||||||
- tests/**/*
|
- tests/**/*
|
||||||
- tmk_core/**/*
|
- tmk_core/**/*
|
||||||
|
- lib/python/**/*
|
||||||
- util/**/*
|
- util/**/*
|
||||||
- Makefile
|
- Makefile
|
||||||
- '*.mk'
|
- '*.mk'
|
||||||
|
|
2
.github/workflows/docs.yml
vendored
2
.github/workflows/docs.yml
vendored
|
@ -56,7 +56,7 @@ jobs:
|
||||||
|
|
||||||
- name: Deploy
|
- name: Deploy
|
||||||
if: ${{ github.event_name == 'push' && github.repository == 'qmk/qmk_firmware' }}
|
if: ${{ github.event_name == 'push' && github.repository == 'qmk/qmk_firmware' }}
|
||||||
uses: JamesIves/github-pages-deploy-action@v4.7.2
|
uses: JamesIves/github-pages-deploy-action@v4.7.3
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
branch: gh-pages
|
branch: gh-pages
|
||||||
|
|
3
.github/workflows/format.yml
vendored
3
.github/workflows/format.yml
vendored
|
@ -10,6 +10,7 @@ on:
|
||||||
- 'lib/arm_atsam/**'
|
- 'lib/arm_atsam/**'
|
||||||
- 'lib/lib8tion/**'
|
- 'lib/lib8tion/**'
|
||||||
- 'lib/python/**'
|
- 'lib/python/**'
|
||||||
|
- 'modules/**'
|
||||||
- 'platforms/**'
|
- 'platforms/**'
|
||||||
- 'quantum/**'
|
- 'quantum/**'
|
||||||
- 'tests/**'
|
- 'tests/**'
|
||||||
|
@ -35,7 +36,7 @@ jobs:
|
||||||
|
|
||||||
- name: Get changed files
|
- name: Get changed files
|
||||||
id: file_changes
|
id: file_changes
|
||||||
uses: tj-actions/changed-files@v45
|
uses: tj-actions/changed-files@v46
|
||||||
with:
|
with:
|
||||||
use_rest_api: true
|
use_rest_api: true
|
||||||
|
|
||||||
|
|
2
.github/workflows/format_push.yml
vendored
2
.github/workflows/format_push.yml
vendored
|
@ -39,7 +39,7 @@ jobs:
|
||||||
qmk format-text -a
|
qmk format-text -a
|
||||||
git diff
|
git diff
|
||||||
|
|
||||||
- uses: rlespinasse/github-slug-action@v3.x
|
- uses: rlespinasse/github-slug-action@v5
|
||||||
|
|
||||||
- name: Become QMK Bot
|
- name: Become QMK Bot
|
||||||
run: |
|
run: |
|
||||||
|
|
2
.github/workflows/lint.yml
vendored
2
.github/workflows/lint.yml
vendored
|
@ -27,7 +27,7 @@ jobs:
|
||||||
|
|
||||||
- name: Get changed files
|
- name: Get changed files
|
||||||
id: file_changes
|
id: file_changes
|
||||||
uses: tj-actions/changed-files@v45
|
uses: tj-actions/changed-files@v46
|
||||||
with:
|
with:
|
||||||
use_rest_api: true
|
use_rest_api: true
|
||||||
|
|
||||||
|
|
2
.github/workflows/regen_push.yml
vendored
2
.github/workflows/regen_push.yml
vendored
|
@ -26,7 +26,7 @@ jobs:
|
||||||
util/regen.sh
|
util/regen.sh
|
||||||
git diff
|
git diff
|
||||||
|
|
||||||
- uses: rlespinasse/github-slug-action@v3.x
|
- uses: rlespinasse/github-slug-action@v5
|
||||||
|
|
||||||
- name: Become QMK Bot
|
- name: Become QMK Bot
|
||||||
run: |
|
run: |
|
||||||
|
|
2
.github/workflows/stale.yml
vendored
2
.github/workflows/stale.yml
vendored
|
@ -45,7 +45,7 @@ jobs:
|
||||||
stale-pr-label: stale
|
stale-pr-label: stale
|
||||||
days-before-pr-stale: 45
|
days-before-pr-stale: 45
|
||||||
days-before-pr-close: 30
|
days-before-pr-close: 30
|
||||||
exempt-pr-labels: bug,awaiting review,breaking_change,in progress,on hold
|
exempt-pr-labels: bug,awaiting review,breaking_change,in progress,on hold,needs-core-wireless,crippled-firmware
|
||||||
|
|
||||||
stale-pr-message: >
|
stale-pr-message: >
|
||||||
Thank you for your contribution!
|
Thank you for your contribution!
|
||||||
|
|
27
.vscode/settings.json
vendored
27
.vscode/settings.json
vendored
|
@ -10,6 +10,13 @@
|
||||||
"**/*.uf2": true
|
"**/*.uf2": true
|
||||||
},
|
},
|
||||||
"files.associations": {
|
"files.associations": {
|
||||||
|
// QMK Filetypes
|
||||||
|
"keyboard.json": "jsonc",
|
||||||
|
"info.json": "jsonc",
|
||||||
|
"keymap.json": "jsonc",
|
||||||
|
"qmk.json": "jsonc",
|
||||||
|
"qmk_module.json": "jsonc",
|
||||||
|
// Standard filetypes
|
||||||
"*.h": "c",
|
"*.h": "c",
|
||||||
"*.c": "c",
|
"*.c": "c",
|
||||||
"*.inc": "c",
|
"*.inc": "c",
|
||||||
|
@ -28,7 +35,23 @@
|
||||||
"[json]": {
|
"[json]": {
|
||||||
"editor.formatOnSave": false
|
"editor.formatOnSave": false
|
||||||
},
|
},
|
||||||
"clangd.arguments": [
|
"clangd.arguments": ["--header-insertion=never"],
|
||||||
"--header-insertion=never"
|
"json.schemas": [
|
||||||
|
{
|
||||||
|
"fileMatch": ["qmk.json"],
|
||||||
|
"url": "./data/schemas/user_repo_v1_1.jsonschema"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fileMatch": ["qmk_module.json"],
|
||||||
|
"url": "./data/schemas/community_module.jsonschema"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fileMatch": ["keyboard.json", "info.json"],
|
||||||
|
"url": "./data/schemas/keyboard.jsonschema"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fileMatch": ["keymap.json"],
|
||||||
|
"url": "./data/schemas/keymap.jsonschema"
|
||||||
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
37
Makefile
37
Makefile
|
@ -59,6 +59,7 @@ ifeq ($(ROOT_DIR),)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
include paths.mk
|
include paths.mk
|
||||||
|
include $(BUILDDEFS_PATH)/support.mk
|
||||||
|
|
||||||
TEST_OUTPUT_DIR := $(BUILD_DIR)/test
|
TEST_OUTPUT_DIR := $(BUILD_DIR)/test
|
||||||
ERROR_FILE := $(BUILD_DIR)/error_occurred
|
ERROR_FILE := $(BUILD_DIR)/error_occurred
|
||||||
|
@ -113,6 +114,29 @@ endef
|
||||||
# Make it easier to call TRY_TO_MATCH_RULE_FROM_LIST
|
# Make it easier to call TRY_TO_MATCH_RULE_FROM_LIST
|
||||||
TRY_TO_MATCH_RULE_FROM_LIST = $(eval $(call TRY_TO_MATCH_RULE_FROM_LIST_HELPER,$1))$(RULE_FOUND)
|
TRY_TO_MATCH_RULE_FROM_LIST = $(eval $(call TRY_TO_MATCH_RULE_FROM_LIST_HELPER,$1))$(RULE_FOUND)
|
||||||
|
|
||||||
|
# As TRY_TO_MATCH_RULE_FROM_LIST_HELPER, but with additional
|
||||||
|
# resolution of DEFAULT_FOLDER and keyboard_aliases.hjson for provided rule
|
||||||
|
define TRY_TO_MATCH_RULE_FROM_LIST_HELPER_KB
|
||||||
|
# Split on ":", padding with empty strings to avoid indexing issues
|
||||||
|
TOKEN1:=$$(shell python3 -c "import sys; print((sys.argv[1].split(':',1)+[''])[0])" $$(RULE))
|
||||||
|
TOKENr:=$$(shell python3 -c "import sys; print((sys.argv[1].split(':',1)+[''])[1])" $$(RULE))
|
||||||
|
|
||||||
|
TOKEN1:=$$(shell $(QMK_BIN) resolve-alias --allow-unknown $$(TOKEN1))
|
||||||
|
|
||||||
|
FOUNDx:=$$(shell echo $1 | tr " " "\n" | grep -Fx $$(TOKEN1))
|
||||||
|
ifneq ($$(FOUNDx),)
|
||||||
|
RULE := $$(TOKENr)
|
||||||
|
RULE_FOUND := true
|
||||||
|
MATCHED_ITEM := $$(TOKEN1)
|
||||||
|
else
|
||||||
|
RULE_FOUND := false
|
||||||
|
MATCHED_ITEM :=
|
||||||
|
endif
|
||||||
|
endef
|
||||||
|
|
||||||
|
# Make it easier to call TRY_TO_MATCH_RULE_FROM_LIST_KB
|
||||||
|
TRY_TO_MATCH_RULE_FROM_LIST_KB = $(eval $(call TRY_TO_MATCH_RULE_FROM_LIST_HELPER_KB,$1))$(RULE_FOUND)
|
||||||
|
|
||||||
define ALL_IN_LIST_LOOP
|
define ALL_IN_LIST_LOOP
|
||||||
OLD_RULE$1 := $$(RULE)
|
OLD_RULE$1 := $$(RULE)
|
||||||
$$(eval $$(call $1,$$(ITEM$1)))
|
$$(eval $$(call $1,$$(ITEM$1)))
|
||||||
|
@ -138,7 +162,7 @@ define PARSE_RULE
|
||||||
$$(eval $$(call PARSE_TEST))
|
$$(eval $$(call PARSE_TEST))
|
||||||
# If the rule starts with the name of a known keyboard, then continue
|
# If the rule starts with the name of a known keyboard, then continue
|
||||||
# the parsing from PARSE_KEYBOARD
|
# the parsing from PARSE_KEYBOARD
|
||||||
else ifeq ($$(call TRY_TO_MATCH_RULE_FROM_LIST,$$(shell $(QMK_BIN) list-keyboards --no-resolve-defaults)),true)
|
else ifeq ($$(call TRY_TO_MATCH_RULE_FROM_LIST_KB,$$(shell $(QMK_BIN) list-keyboards)),true)
|
||||||
KEYBOARD_RULE=$$(MATCHED_ITEM)
|
KEYBOARD_RULE=$$(MATCHED_ITEM)
|
||||||
$$(eval $$(call PARSE_KEYBOARD,$$(MATCHED_ITEM)))
|
$$(eval $$(call PARSE_KEYBOARD,$$(MATCHED_ITEM)))
|
||||||
else
|
else
|
||||||
|
@ -170,17 +194,6 @@ define PARSE_KEYBOARD
|
||||||
# include the correct makefile to determine the actual name of it
|
# include the correct makefile to determine the actual name of it
|
||||||
CURRENT_KB := $1
|
CURRENT_KB := $1
|
||||||
|
|
||||||
# KEYBOARD_FOLDERS := $$(subst /, , $(CURRENT_KB))
|
|
||||||
|
|
||||||
DEFAULT_FOLDER := $$(CURRENT_KB)
|
|
||||||
|
|
||||||
# We assume that every rules.mk will contain the full default value
|
|
||||||
$$(eval include $(ROOT_DIR)/keyboards/$$(CURRENT_KB)/rules.mk)
|
|
||||||
ifneq ($$(DEFAULT_FOLDER),$$(CURRENT_KB))
|
|
||||||
$$(eval include $(ROOT_DIR)/keyboards/$$(DEFAULT_FOLDER)/rules.mk)
|
|
||||||
endif
|
|
||||||
CURRENT_KB := $$(DEFAULT_FOLDER)
|
|
||||||
|
|
||||||
# 5/4/3/2/1
|
# 5/4/3/2/1
|
||||||
KEYBOARD_FOLDER_PATH_1 := $$(CURRENT_KB)
|
KEYBOARD_FOLDER_PATH_1 := $$(CURRENT_KB)
|
||||||
KEYBOARD_FOLDER_PATH_2 := $$(patsubst %/,%,$$(dir $$(KEYBOARD_FOLDER_PATH_1)))
|
KEYBOARD_FOLDER_PATH_2 := $$(patsubst %/,%,$$(dir $$(KEYBOARD_FOLDER_PATH_1)))
|
||||||
|
|
|
@ -25,8 +25,6 @@ $(TEST_OUTPUT)_SRC := \
|
||||||
tests/test_common/test_driver.cpp \
|
tests/test_common/test_driver.cpp \
|
||||||
tests/test_common/keyboard_report_util.cpp \
|
tests/test_common/keyboard_report_util.cpp \
|
||||||
tests/test_common/mouse_report_util.cpp \
|
tests/test_common/mouse_report_util.cpp \
|
||||||
tests/test_common/keycode_util.cpp \
|
|
||||||
tests/test_common/keycode_table.cpp \
|
|
||||||
tests/test_common/test_fixture.cpp \
|
tests/test_common/test_fixture.cpp \
|
||||||
tests/test_common/test_keymap_key.cpp \
|
tests/test_common/test_keymap_key.cpp \
|
||||||
tests/test_common/test_logger.cpp \
|
tests/test_common/test_logger.cpp \
|
||||||
|
|
|
@ -11,6 +11,7 @@ endif
|
||||||
.DEFAULT_GOAL := all
|
.DEFAULT_GOAL := all
|
||||||
|
|
||||||
include paths.mk
|
include paths.mk
|
||||||
|
include $(BUILDDEFS_PATH)/support.mk
|
||||||
include $(BUILDDEFS_PATH)/message.mk
|
include $(BUILDDEFS_PATH)/message.mk
|
||||||
|
|
||||||
# Helper to add defines with a 'QMK_' prefix
|
# Helper to add defines with a 'QMK_' prefix
|
||||||
|
@ -97,20 +98,44 @@ endif
|
||||||
|
|
||||||
|
|
||||||
# Pull in rules.mk files from all our subfolders
|
# Pull in rules.mk files from all our subfolders
|
||||||
ifneq ("$(wildcard $(KEYBOARD_PATH_5)/rules.mk)","")
|
-include $(KEYBOARD_PATH_5)/rules.mk
|
||||||
include $(KEYBOARD_PATH_5)/rules.mk
|
-include $(KEYBOARD_PATH_4)/rules.mk
|
||||||
|
-include $(KEYBOARD_PATH_3)/rules.mk
|
||||||
|
-include $(KEYBOARD_PATH_2)/rules.mk
|
||||||
|
-include $(KEYBOARD_PATH_1)/rules.mk
|
||||||
|
|
||||||
|
# Create dependencies on DD keyboard config - structure validated elsewhere
|
||||||
|
DD_CONFIG_FILES :=
|
||||||
|
ifneq ("$(wildcard $(KEYBOARD_PATH_1)/info.json)","")
|
||||||
|
DD_CONFIG_FILES += $(KEYBOARD_PATH_1)/info.json
|
||||||
endif
|
endif
|
||||||
ifneq ("$(wildcard $(KEYBOARD_PATH_4)/rules.mk)","")
|
ifneq ("$(wildcard $(KEYBOARD_PATH_2)/info.json)","")
|
||||||
include $(KEYBOARD_PATH_4)/rules.mk
|
DD_CONFIG_FILES += $(KEYBOARD_PATH_2)/info.json
|
||||||
endif
|
endif
|
||||||
ifneq ("$(wildcard $(KEYBOARD_PATH_3)/rules.mk)","")
|
ifneq ("$(wildcard $(KEYBOARD_PATH_3)/info.json)","")
|
||||||
include $(KEYBOARD_PATH_3)/rules.mk
|
DD_CONFIG_FILES += $(KEYBOARD_PATH_3)/info.json
|
||||||
endif
|
endif
|
||||||
ifneq ("$(wildcard $(KEYBOARD_PATH_2)/rules.mk)","")
|
ifneq ("$(wildcard $(KEYBOARD_PATH_4)/info.json)","")
|
||||||
include $(KEYBOARD_PATH_2)/rules.mk
|
DD_CONFIG_FILES += $(KEYBOARD_PATH_4)/info.json
|
||||||
endif
|
endif
|
||||||
ifneq ("$(wildcard $(KEYBOARD_PATH_1)/rules.mk)","")
|
ifneq ("$(wildcard $(KEYBOARD_PATH_5)/info.json)","")
|
||||||
include $(KEYBOARD_PATH_1)/rules.mk
|
DD_CONFIG_FILES += $(KEYBOARD_PATH_5)/info.json
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifneq ("$(wildcard $(KEYBOARD_PATH_1)/keyboard.json)","")
|
||||||
|
DD_CONFIG_FILES += $(KEYBOARD_PATH_1)/keyboard.json
|
||||||
|
endif
|
||||||
|
ifneq ("$(wildcard $(KEYBOARD_PATH_2)/keyboard.json)","")
|
||||||
|
DD_CONFIG_FILES += $(KEYBOARD_PATH_2)/keyboard.json
|
||||||
|
endif
|
||||||
|
ifneq ("$(wildcard $(KEYBOARD_PATH_3)/keyboard.json)","")
|
||||||
|
DD_CONFIG_FILES += $(KEYBOARD_PATH_3)/keyboard.json
|
||||||
|
endif
|
||||||
|
ifneq ("$(wildcard $(KEYBOARD_PATH_4)/keyboard.json)","")
|
||||||
|
DD_CONFIG_FILES += $(KEYBOARD_PATH_4)/keyboard.json
|
||||||
|
endif
|
||||||
|
ifneq ("$(wildcard $(KEYBOARD_PATH_5)/keyboard.json)","")
|
||||||
|
DD_CONFIG_FILES += $(KEYBOARD_PATH_5)/keyboard.json
|
||||||
endif
|
endif
|
||||||
|
|
||||||
MAIN_KEYMAP_PATH_1 := $(KEYBOARD_PATH_1)/keymaps/$(KEYMAP)
|
MAIN_KEYMAP_PATH_1 := $(KEYBOARD_PATH_1)/keymaps/$(KEYMAP)
|
||||||
|
@ -207,17 +232,17 @@ ifneq ("$(wildcard $(KEYMAP_JSON))", "")
|
||||||
include $(INFO_RULES_MK)
|
include $(INFO_RULES_MK)
|
||||||
|
|
||||||
# Add rules to generate the keymap files - indentation here is important
|
# Add rules to generate the keymap files - indentation here is important
|
||||||
$(INTERMEDIATE_OUTPUT)/src/keymap.c: $(KEYMAP_JSON)
|
$(INTERMEDIATE_OUTPUT)/src/keymap.c: $(KEYMAP_JSON) $(DD_CONFIG_FILES)
|
||||||
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
|
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
|
||||||
$(eval CMD=$(QMK_BIN) json2c --quiet --output $(KEYMAP_C) $(KEYMAP_JSON))
|
$(eval CMD=$(QMK_BIN) json2c --quiet --output $(KEYMAP_C) $(KEYMAP_JSON))
|
||||||
@$(BUILD_CMD)
|
@$(BUILD_CMD)
|
||||||
|
|
||||||
$(INTERMEDIATE_OUTPUT)/src/config.h: $(KEYMAP_JSON)
|
$(INTERMEDIATE_OUTPUT)/src/config.h: $(KEYMAP_JSON) $(DD_CONFIG_FILES)
|
||||||
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
|
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
|
||||||
$(eval CMD=$(QMK_BIN) generate-config-h --quiet --output $(KEYMAP_H) $(KEYMAP_JSON))
|
$(eval CMD=$(QMK_BIN) generate-config-h --quiet --output $(KEYMAP_H) $(KEYMAP_JSON))
|
||||||
@$(BUILD_CMD)
|
@$(BUILD_CMD)
|
||||||
|
|
||||||
$(INTERMEDIATE_OUTPUT)/src/keymap.h: $(KEYMAP_JSON)
|
$(INTERMEDIATE_OUTPUT)/src/keymap.h: $(KEYMAP_JSON) $(DD_CONFIG_FILES)
|
||||||
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
|
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
|
||||||
$(eval CMD=$(QMK_BIN) generate-keymap-h --quiet --output $(INTERMEDIATE_OUTPUT)/src/keymap.h $(KEYMAP_JSON))
|
$(eval CMD=$(QMK_BIN) generate-keymap-h --quiet --output $(INTERMEDIATE_OUTPUT)/src/keymap.h $(KEYMAP_JSON))
|
||||||
@$(BUILD_CMD)
|
@$(BUILD_CMD)
|
||||||
|
@ -226,6 +251,44 @@ generated-files: $(INTERMEDIATE_OUTPUT)/src/config.h $(INTERMEDIATE_OUTPUT)/src/
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
# Community modules
|
||||||
|
COMMUNITY_RULES_MK = $(shell $(QMK_BIN) generate-community-modules-rules-mk -kb $(KEYBOARD) --quiet --escape --output $(INTERMEDIATE_OUTPUT)/src/community_rules.mk $(KEYMAP_JSON))
|
||||||
|
include $(COMMUNITY_RULES_MK)
|
||||||
|
|
||||||
|
$(INTERMEDIATE_OUTPUT)/src/community_modules.h: $(KEYMAP_JSON) $(DD_CONFIG_FILES)
|
||||||
|
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
|
||||||
|
$(eval CMD=$(QMK_BIN) generate-community-modules-h -kb $(KEYBOARD) --quiet --output $(INTERMEDIATE_OUTPUT)/src/community_modules.h $(KEYMAP_JSON))
|
||||||
|
@$(BUILD_CMD)
|
||||||
|
|
||||||
|
$(INTERMEDIATE_OUTPUT)/src/community_modules.c: $(KEYMAP_JSON) $(DD_CONFIG_FILES)
|
||||||
|
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
|
||||||
|
$(eval CMD=$(QMK_BIN) generate-community-modules-c -kb $(KEYBOARD) --quiet --output $(INTERMEDIATE_OUTPUT)/src/community_modules.c $(KEYMAP_JSON))
|
||||||
|
@$(BUILD_CMD)
|
||||||
|
|
||||||
|
$(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.c: $(KEYMAP_JSON) $(DD_CONFIG_FILES)
|
||||||
|
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
|
||||||
|
$(eval CMD=$(QMK_BIN) generate-community-modules-introspection-c -kb $(KEYBOARD) --quiet --output $(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.c $(KEYMAP_JSON))
|
||||||
|
@$(BUILD_CMD)
|
||||||
|
|
||||||
|
$(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.h: $(KEYMAP_JSON) $(DD_CONFIG_FILES)
|
||||||
|
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
|
||||||
|
$(eval CMD=$(QMK_BIN) generate-community-modules-introspection-h -kb $(KEYBOARD) --quiet --output $(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.h $(KEYMAP_JSON))
|
||||||
|
@$(BUILD_CMD)
|
||||||
|
|
||||||
|
$(INTERMEDIATE_OUTPUT)/src/led_matrix_community_modules.inc: $(KEYMAP_JSON) $(DD_CONFIG_FILES)
|
||||||
|
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
|
||||||
|
$(eval CMD=$(QMK_BIN) generate-led-matrix-community-modules-inc -kb $(KEYBOARD) --quiet --output $(INTERMEDIATE_OUTPUT)/src/led_matrix_community_modules.inc $(KEYMAP_JSON))
|
||||||
|
@$(BUILD_CMD)
|
||||||
|
|
||||||
|
$(INTERMEDIATE_OUTPUT)/src/rgb_matrix_community_modules.inc: $(KEYMAP_JSON) $(DD_CONFIG_FILES)
|
||||||
|
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
|
||||||
|
$(eval CMD=$(QMK_BIN) generate-rgb-matrix-community-modules-inc -kb $(KEYBOARD) --quiet --output $(INTERMEDIATE_OUTPUT)/src/rgb_matrix_community_modules.inc $(KEYMAP_JSON))
|
||||||
|
@$(BUILD_CMD)
|
||||||
|
|
||||||
|
SRC += $(INTERMEDIATE_OUTPUT)/src/community_modules.c
|
||||||
|
|
||||||
|
generated-files: $(INTERMEDIATE_OUTPUT)/src/community_modules.h $(INTERMEDIATE_OUTPUT)/src/community_modules.c $(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.c $(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.h $(INTERMEDIATE_OUTPUT)/src/led_matrix_community_modules.inc $(INTERMEDIATE_OUTPUT)/src/rgb_matrix_community_modules.inc
|
||||||
|
|
||||||
include $(BUILDDEFS_PATH)/converters.mk
|
include $(BUILDDEFS_PATH)/converters.mk
|
||||||
|
|
||||||
# Generate the board's version.h file.
|
# Generate the board's version.h file.
|
||||||
|
@ -315,6 +378,14 @@ endif
|
||||||
|
|
||||||
# Find all of the config.h files and add them to our CONFIG_H define.
|
# Find all of the config.h files and add them to our CONFIG_H define.
|
||||||
CONFIG_H :=
|
CONFIG_H :=
|
||||||
|
|
||||||
|
define config_h_community_module_appender
|
||||||
|
ifneq ("$(wildcard $(1)/config.h)","")
|
||||||
|
CONFIG_H += $(1)/config.h
|
||||||
|
endif
|
||||||
|
endef
|
||||||
|
$(foreach module,$(COMMUNITY_MODULE_PATHS),$(eval $(call config_h_community_module_appender,$(module))))
|
||||||
|
|
||||||
ifneq ("$(wildcard $(KEYBOARD_PATH_5)/config.h)","")
|
ifneq ("$(wildcard $(KEYBOARD_PATH_5)/config.h)","")
|
||||||
CONFIG_H += $(KEYBOARD_PATH_5)/config.h
|
CONFIG_H += $(KEYBOARD_PATH_5)/config.h
|
||||||
endif
|
endif
|
||||||
|
@ -332,6 +403,14 @@ ifneq ("$(wildcard $(KEYBOARD_PATH_1)/config.h)","")
|
||||||
endif
|
endif
|
||||||
|
|
||||||
POST_CONFIG_H :=
|
POST_CONFIG_H :=
|
||||||
|
|
||||||
|
define post_config_h_community_module_appender
|
||||||
|
ifneq ("$(wildcard $(1)/post_config.h)","")
|
||||||
|
POST_CONFIG_H += $(1)/post_config.h
|
||||||
|
endif
|
||||||
|
endef
|
||||||
|
$(foreach module,$(COMMUNITY_MODULE_PATHS),$(eval $(call post_config_h_community_module_appender,$(module))))
|
||||||
|
|
||||||
ifneq ("$(wildcard $(KEYBOARD_PATH_1)/post_config.h)","")
|
ifneq ("$(wildcard $(KEYBOARD_PATH_1)/post_config.h)","")
|
||||||
POST_CONFIG_H += $(KEYBOARD_PATH_1)/post_config.h
|
POST_CONFIG_H += $(KEYBOARD_PATH_1)/post_config.h
|
||||||
endif
|
endif
|
||||||
|
@ -348,40 +427,6 @@ ifneq ("$(wildcard $(KEYBOARD_PATH_5)/post_config.h)","")
|
||||||
POST_CONFIG_H += $(KEYBOARD_PATH_5)/post_config.h
|
POST_CONFIG_H += $(KEYBOARD_PATH_5)/post_config.h
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# Create dependencies on DD keyboard config - structure validated elsewhere
|
|
||||||
DD_CONFIG_FILES :=
|
|
||||||
ifneq ("$(wildcard $(KEYBOARD_PATH_1)/info.json)","")
|
|
||||||
DD_CONFIG_FILES += $(KEYBOARD_PATH_1)/info.json
|
|
||||||
endif
|
|
||||||
ifneq ("$(wildcard $(KEYBOARD_PATH_2)/info.json)","")
|
|
||||||
DD_CONFIG_FILES += $(KEYBOARD_PATH_2)/info.json
|
|
||||||
endif
|
|
||||||
ifneq ("$(wildcard $(KEYBOARD_PATH_3)/info.json)","")
|
|
||||||
DD_CONFIG_FILES += $(KEYBOARD_PATH_3)/info.json
|
|
||||||
endif
|
|
||||||
ifneq ("$(wildcard $(KEYBOARD_PATH_4)/info.json)","")
|
|
||||||
DD_CONFIG_FILES += $(KEYBOARD_PATH_4)/info.json
|
|
||||||
endif
|
|
||||||
ifneq ("$(wildcard $(KEYBOARD_PATH_5)/info.json)","")
|
|
||||||
DD_CONFIG_FILES += $(KEYBOARD_PATH_5)/info.json
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifneq ("$(wildcard $(KEYBOARD_PATH_1)/keyboard.json)","")
|
|
||||||
DD_CONFIG_FILES += $(KEYBOARD_PATH_1)/keyboard.json
|
|
||||||
endif
|
|
||||||
ifneq ("$(wildcard $(KEYBOARD_PATH_2)/keyboard.json)","")
|
|
||||||
DD_CONFIG_FILES += $(KEYBOARD_PATH_2)/keyboard.json
|
|
||||||
endif
|
|
||||||
ifneq ("$(wildcard $(KEYBOARD_PATH_3)/keyboard.json)","")
|
|
||||||
DD_CONFIG_FILES += $(KEYBOARD_PATH_3)/keyboard.json
|
|
||||||
endif
|
|
||||||
ifneq ("$(wildcard $(KEYBOARD_PATH_4)/keyboard.json)","")
|
|
||||||
DD_CONFIG_FILES += $(KEYBOARD_PATH_4)/keyboard.json
|
|
||||||
endif
|
|
||||||
ifneq ("$(wildcard $(KEYBOARD_PATH_5)/keyboard.json)","")
|
|
||||||
DD_CONFIG_FILES += $(KEYBOARD_PATH_5)/keyboard.json
|
|
||||||
endif
|
|
||||||
|
|
||||||
CONFIG_H += $(INTERMEDIATE_OUTPUT)/src/info_config.h
|
CONFIG_H += $(INTERMEDIATE_OUTPUT)/src/info_config.h
|
||||||
KEYBOARD_SRC += $(INTERMEDIATE_OUTPUT)/src/default_keyboard.c
|
KEYBOARD_SRC += $(INTERMEDIATE_OUTPUT)/src/default_keyboard.c
|
||||||
|
|
||||||
|
@ -446,21 +491,18 @@ ifneq ("$(CONVERTER)","")
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# Pull in post_rules.mk files from all our subfolders
|
# Pull in post_rules.mk files from all our subfolders
|
||||||
ifneq ("$(wildcard $(KEYBOARD_PATH_1)/post_rules.mk)","")
|
-include $(KEYBOARD_PATH_1)/post_rules.mk
|
||||||
include $(KEYBOARD_PATH_1)/post_rules.mk
|
-include $(KEYBOARD_PATH_2)/post_rules.mk
|
||||||
endif
|
-include $(KEYBOARD_PATH_3)/post_rules.mk
|
||||||
ifneq ("$(wildcard $(KEYBOARD_PATH_2)/post_rules.mk)","")
|
-include $(KEYBOARD_PATH_4)/post_rules.mk
|
||||||
include $(KEYBOARD_PATH_2)/post_rules.mk
|
-include $(KEYBOARD_PATH_5)/post_rules.mk
|
||||||
endif
|
|
||||||
ifneq ("$(wildcard $(KEYBOARD_PATH_3)/post_rules.mk)","")
|
define post_rules_mk_community_module_includer
|
||||||
include $(KEYBOARD_PATH_3)/post_rules.mk
|
ifneq ("$(wildcard $(1)/post_rules.mk)","")
|
||||||
endif
|
include $(1)/post_rules.mk
|
||||||
ifneq ("$(wildcard $(KEYBOARD_PATH_4)/post_rules.mk)","")
|
|
||||||
include $(KEYBOARD_PATH_4)/post_rules.mk
|
|
||||||
endif
|
|
||||||
ifneq ("$(wildcard $(KEYBOARD_PATH_5)/post_rules.mk)","")
|
|
||||||
include $(KEYBOARD_PATH_5)/post_rules.mk
|
|
||||||
endif
|
endif
|
||||||
|
endef
|
||||||
|
$(foreach module,$(COMMUNITY_MODULE_PATHS),$(eval $(call post_rules_mk_community_module_includer,$(module))))
|
||||||
|
|
||||||
ifneq ("$(wildcard $(KEYMAP_PATH)/config.h)","")
|
ifneq ("$(wildcard $(KEYMAP_PATH)/config.h)","")
|
||||||
CONFIG_H += $(KEYMAP_PATH)/config.h
|
CONFIG_H += $(KEYMAP_PATH)/config.h
|
||||||
|
|
|
@ -7,6 +7,7 @@ endif
|
||||||
OPT = g
|
OPT = g
|
||||||
|
|
||||||
include paths.mk
|
include paths.mk
|
||||||
|
include $(BUILDDEFS_PATH)/support.mk
|
||||||
include $(BUILDDEFS_PATH)/message.mk
|
include $(BUILDDEFS_PATH)/message.mk
|
||||||
|
|
||||||
TARGET=test/$(TEST_OUTPUT)
|
TARGET=test/$(TEST_OUTPUT)
|
||||||
|
|
|
@ -30,6 +30,8 @@ QUANTUM_SRC += \
|
||||||
$(QUANTUM_DIR)/logging/sendchar.c \
|
$(QUANTUM_DIR)/logging/sendchar.c \
|
||||||
$(QUANTUM_DIR)/process_keycode/process_default_layer.c \
|
$(QUANTUM_DIR)/process_keycode/process_default_layer.c \
|
||||||
|
|
||||||
|
include $(QUANTUM_DIR)/nvm/rules.mk
|
||||||
|
|
||||||
VPATH += $(QUANTUM_DIR)/logging
|
VPATH += $(QUANTUM_DIR)/logging
|
||||||
# Fall back to lib/printf if there is no platform provided print
|
# Fall back to lib/printf if there is no platform provided print
|
||||||
ifeq ("$(wildcard $(PLATFORM_PATH)/$(PLATFORM_KEY)/printf.mk)","")
|
ifeq ("$(wildcard $(PLATFORM_PATH)/$(PLATFORM_KEY)/printf.mk)","")
|
||||||
|
@ -169,6 +171,7 @@ endif
|
||||||
|
|
||||||
VALID_EEPROM_DRIVER_TYPES := vendor custom transient i2c spi wear_leveling legacy_stm32_flash
|
VALID_EEPROM_DRIVER_TYPES := vendor custom transient i2c spi wear_leveling legacy_stm32_flash
|
||||||
EEPROM_DRIVER ?= vendor
|
EEPROM_DRIVER ?= vendor
|
||||||
|
ifneq ($(strip $(EEPROM_DRIVER)),none)
|
||||||
ifeq ($(filter $(EEPROM_DRIVER),$(VALID_EEPROM_DRIVER_TYPES)),)
|
ifeq ($(filter $(EEPROM_DRIVER),$(VALID_EEPROM_DRIVER_TYPES)),)
|
||||||
$(call CATASTROPHIC_ERROR,Invalid EEPROM_DRIVER,EEPROM_DRIVER="$(EEPROM_DRIVER)" is not a valid EEPROM driver)
|
$(call CATASTROPHIC_ERROR,Invalid EEPROM_DRIVER,EEPROM_DRIVER="$(EEPROM_DRIVER)" is not a valid EEPROM driver)
|
||||||
else
|
else
|
||||||
|
@ -216,7 +219,7 @@ else
|
||||||
COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/flash
|
COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/flash
|
||||||
COMMON_VPATH += $(DRIVER_PATH)/flash
|
COMMON_VPATH += $(DRIVER_PATH)/flash
|
||||||
SRC += eeprom_driver.c eeprom_legacy_emulated_flash.c legacy_flash_ops.c
|
SRC += eeprom_driver.c eeprom_legacy_emulated_flash.c legacy_flash_ops.c
|
||||||
else ifneq ($(filter $(MCU_SERIES),STM32F1xx STM32F3xx STM32F4xx STM32L4xx STM32G4xx WB32F3G71xx WB32FQ95xx AT32F415 GD32VF103),)
|
else ifneq ($(filter $(MCU_SERIES),STM32F1xx STM32F3xx STM32F4xx STM32L4xx STM32G0xx STM32G4xx WB32F3G71xx WB32FQ95xx AT32F415 GD32VF103),)
|
||||||
# Wear-leveling EEPROM implementation, backed by MCU flash
|
# Wear-leveling EEPROM implementation, backed by MCU flash
|
||||||
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_WEAR_LEVELING
|
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_WEAR_LEVELING
|
||||||
SRC += eeprom_driver.c eeprom_wear_leveling.c
|
SRC += eeprom_driver.c eeprom_wear_leveling.c
|
||||||
|
@ -246,6 +249,7 @@ else
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
VALID_WEAR_LEVELING_DRIVER_TYPES := custom embedded_flash spi_flash rp2040_flash legacy
|
VALID_WEAR_LEVELING_DRIVER_TYPES := custom embedded_flash spi_flash rp2040_flash legacy
|
||||||
WEAR_LEVELING_DRIVER ?= none
|
WEAR_LEVELING_DRIVER ?= none
|
||||||
|
@ -263,18 +267,14 @@ ifneq ($(strip $(WEAR_LEVELING_DRIVER)),none)
|
||||||
ifeq ($(strip $(WEAR_LEVELING_DRIVER)), embedded_flash)
|
ifeq ($(strip $(WEAR_LEVELING_DRIVER)), embedded_flash)
|
||||||
OPT_DEFS += -DHAL_USE_EFL
|
OPT_DEFS += -DHAL_USE_EFL
|
||||||
SRC += wear_leveling_efl.c
|
SRC += wear_leveling_efl.c
|
||||||
POST_CONFIG_H += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/wear_leveling/wear_leveling_efl_config.h
|
|
||||||
else ifeq ($(strip $(WEAR_LEVELING_DRIVER)), spi_flash)
|
else ifeq ($(strip $(WEAR_LEVELING_DRIVER)), spi_flash)
|
||||||
FLASH_DRIVER := spi
|
FLASH_DRIVER := spi
|
||||||
SRC += wear_leveling_flash_spi.c
|
SRC += wear_leveling_flash_spi.c
|
||||||
POST_CONFIG_H += $(DRIVER_PATH)/wear_leveling/wear_leveling_flash_spi_config.h
|
|
||||||
else ifeq ($(strip $(WEAR_LEVELING_DRIVER)), rp2040_flash)
|
else ifeq ($(strip $(WEAR_LEVELING_DRIVER)), rp2040_flash)
|
||||||
SRC += wear_leveling_rp2040_flash.c
|
SRC += wear_leveling_rp2040_flash.c
|
||||||
POST_CONFIG_H += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_PATH)/wear_leveling/wear_leveling_rp2040_flash_config.h
|
|
||||||
else ifeq ($(strip $(WEAR_LEVELING_DRIVER)), legacy)
|
else ifeq ($(strip $(WEAR_LEVELING_DRIVER)), legacy)
|
||||||
COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/flash
|
COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/flash
|
||||||
SRC += legacy_flash_ops.c wear_leveling_legacy.c
|
SRC += legacy_flash_ops.c wear_leveling_legacy.c
|
||||||
POST_CONFIG_H += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/wear_leveling/wear_leveling_legacy_config.h
|
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
@ -635,6 +635,15 @@ ifeq ($(strip $(VIA_ENABLE)), yes)
|
||||||
TRI_LAYER_ENABLE := yes
|
TRI_LAYER_ENABLE := yes
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(RAW_ENABLE)), yes)
|
||||||
|
OPT_DEFS += -DRAW_ENABLE
|
||||||
|
SRC += raw_hid.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(DYNAMIC_KEYMAP_ENABLE)), yes)
|
||||||
|
SEND_STRING_ENABLE := yes
|
||||||
|
endif
|
||||||
|
|
||||||
VALID_CUSTOM_MATRIX_TYPES:= yes lite no
|
VALID_CUSTOM_MATRIX_TYPES:= yes lite no
|
||||||
|
|
||||||
CUSTOM_MATRIX ?= no
|
CUSTOM_MATRIX ?= no
|
||||||
|
@ -713,6 +722,7 @@ ifeq ($(strip $(LIB8TION_ENABLE)), yes)
|
||||||
# ATmegaxxU2 does not have hardware MUL instruction - lib8tion must be told to use software multiplication routines
|
# ATmegaxxU2 does not have hardware MUL instruction - lib8tion must be told to use software multiplication routines
|
||||||
OPT_DEFS += -DLIB8_ATTINY
|
OPT_DEFS += -DLIB8_ATTINY
|
||||||
endif
|
endif
|
||||||
|
OPT_DEFS += -DFASTLED_SCALE8_FIXED=1 -DFASTLED_BLEND_FIXED=1
|
||||||
SRC += $(LIB_PATH)/lib8tion/lib8tion.c
|
SRC += $(LIB_PATH)/lib8tion/lib8tion.c
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
@ -884,19 +894,19 @@ ifeq ($(strip $(BLUETOOTH_ENABLE)), yes)
|
||||||
OPT_DEFS += -DBLUETOOTH_ENABLE
|
OPT_DEFS += -DBLUETOOTH_ENABLE
|
||||||
OPT_DEFS += -DBLUETOOTH_$(strip $(shell echo $(BLUETOOTH_DRIVER) | tr '[:lower:]' '[:upper:]'))
|
OPT_DEFS += -DBLUETOOTH_$(strip $(shell echo $(BLUETOOTH_DRIVER) | tr '[:lower:]' '[:upper:]'))
|
||||||
NO_USB_STARTUP_CHECK := yes
|
NO_USB_STARTUP_CHECK := yes
|
||||||
|
CONNECTION_ENABLE := yes
|
||||||
COMMON_VPATH += $(DRIVER_PATH)/bluetooth
|
COMMON_VPATH += $(DRIVER_PATH)/bluetooth
|
||||||
SRC += outputselect.c process_connection.c
|
SRC += $(DRIVER_PATH)/bluetooth/bluetooth.c
|
||||||
|
|
||||||
ifeq ($(strip $(BLUETOOTH_DRIVER)), bluefruit_le)
|
ifeq ($(strip $(BLUETOOTH_DRIVER)), bluefruit_le)
|
||||||
SPI_DRIVER_REQUIRED = yes
|
SPI_DRIVER_REQUIRED = yes
|
||||||
ANALOG_DRIVER_REQUIRED = yes
|
SRC += $(DRIVER_PATH)/bluetooth/bluetooth_drivers.c
|
||||||
SRC += $(DRIVER_PATH)/bluetooth/bluetooth.c
|
|
||||||
SRC += $(DRIVER_PATH)/bluetooth/bluefruit_le.cpp
|
SRC += $(DRIVER_PATH)/bluetooth/bluefruit_le.cpp
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(strip $(BLUETOOTH_DRIVER)), rn42)
|
ifeq ($(strip $(BLUETOOTH_DRIVER)), rn42)
|
||||||
UART_DRIVER_REQUIRED = yes
|
UART_DRIVER_REQUIRED = yes
|
||||||
SRC += $(DRIVER_PATH)/bluetooth/bluetooth.c
|
SRC += $(DRIVER_PATH)/bluetooth/bluetooth_drivers.c
|
||||||
SRC += $(DRIVER_PATH)/bluetooth/rn42.c
|
SRC += $(DRIVER_PATH)/bluetooth/rn42.c
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
@ -930,6 +940,28 @@ ifeq ($(strip $(DIP_SWITCH_ENABLE)), yes)
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
VALID_BATTERY_DRIVER_TYPES := adc custom vendor
|
||||||
|
|
||||||
|
BATTERY_DRIVER ?= adc
|
||||||
|
ifeq ($(strip $(BATTERY_DRIVER_REQUIRED)), yes)
|
||||||
|
ifeq ($(filter $(BATTERY_DRIVER),$(VALID_BATTERY_DRIVER_TYPES)),)
|
||||||
|
$(call CATASTROPHIC_ERROR,Invalid BATTERY_DRIVER,BATTERY_DRIVER="$(BATTERY_DRIVER)" is not a valid battery driver)
|
||||||
|
endif
|
||||||
|
|
||||||
|
OPT_DEFS += -DBATTERY_DRIVER
|
||||||
|
OPT_DEFS += -DBATTERY_$(strip $(shell echo $(BATTERY_DRIVER) | tr '[:lower:]' '[:upper:]'))
|
||||||
|
|
||||||
|
COMMON_VPATH += $(DRIVER_PATH)/battery
|
||||||
|
|
||||||
|
SRC += battery.c
|
||||||
|
SRC += battery_$(strip $(BATTERY_DRIVER)).c
|
||||||
|
|
||||||
|
# add extra deps
|
||||||
|
ifeq ($(strip $(BATTERY_DRIVER)), adc)
|
||||||
|
ANALOG_DRIVER_REQUIRED = yes
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
VALID_WS2812_DRIVER_TYPES := bitbang custom i2c pwm spi vendor
|
VALID_WS2812_DRIVER_TYPES := bitbang custom i2c pwm spi vendor
|
||||||
|
|
||||||
WS2812_DRIVER ?= bitbang
|
WS2812_DRIVER ?= bitbang
|
||||||
|
@ -940,6 +972,8 @@ ifeq ($(strip $(WS2812_DRIVER_REQUIRED)), yes)
|
||||||
|
|
||||||
OPT_DEFS += -DWS2812_$(strip $(shell echo $(WS2812_DRIVER) | tr '[:lower:]' '[:upper:]'))
|
OPT_DEFS += -DWS2812_$(strip $(shell echo $(WS2812_DRIVER) | tr '[:lower:]' '[:upper:]'))
|
||||||
|
|
||||||
|
COMMON_VPATH += $(DRIVER_PATH)/led
|
||||||
|
|
||||||
SRC += ws2812.c ws2812_$(strip $(WS2812_DRIVER)).c
|
SRC += ws2812.c ws2812_$(strip $(WS2812_DRIVER)).c
|
||||||
|
|
||||||
ifeq ($(strip $(PLATFORM)), CHIBIOS)
|
ifeq ($(strip $(PLATFORM)), CHIBIOS)
|
||||||
|
|
|
@ -168,7 +168,7 @@ MOVE_DEP = mv -f $(patsubst %.o,%.td,$@) $(patsubst %.o,%.d,$@)
|
||||||
|
|
||||||
# For a ChibiOS build, ensure that the board files have the hook overrides injected
|
# For a ChibiOS build, ensure that the board files have the hook overrides injected
|
||||||
define BOARDSRC_INJECT_HOOKS
|
define BOARDSRC_INJECT_HOOKS
|
||||||
$(INTERMEDIATE_OUTPUT)/$(patsubst %.c,%.o,$(patsubst ./%,%,$1)): INIT_HOOK_CFLAGS += -include $(TOP_DIR)/tmk_core/protocol/chibios/init_hooks.h
|
$(INTERMEDIATE_OUTPUT)/$(patsubst %.c,%.o,$(patsubst ./%,%,$1)): FILE_SPECIFIC_CFLAGS += -include $(TOP_DIR)/tmk_core/protocol/chibios/init_hooks.h
|
||||||
endef
|
endef
|
||||||
$(foreach LOBJ, $(BOARDSRC), $(eval $(call BOARDSRC_INJECT_HOOKS,$(LOBJ))))
|
$(foreach LOBJ, $(BOARDSRC), $(eval $(call BOARDSRC_INJECT_HOOKS,$(LOBJ))))
|
||||||
|
|
||||||
|
@ -289,10 +289,10 @@ $1/%.o : %.c $1/%.d $1/cflags.txt $1/compiler.txt | $(BEGIN)
|
||||||
ifneq ($$(VERBOSE_C_INCLUDE),)
|
ifneq ($$(VERBOSE_C_INCLUDE),)
|
||||||
$$(if $$(filter $$(notdir $$(VERBOSE_C_INCLUDE)),$$(notdir $$<)),$$(eval CC_EXEC += -H))
|
$$(if $$(filter $$(notdir $$(VERBOSE_C_INCLUDE)),$$(notdir $$<)),$$(eval CC_EXEC += -H))
|
||||||
endif
|
endif
|
||||||
$$(eval CMD := $$(CC_EXEC) -c $$($1_CFLAGS) $$(INIT_HOOK_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP))
|
$$(eval CMD := $$(CC_EXEC) -c $$($1_CFLAGS) $$(FILE_SPECIFIC_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP))
|
||||||
@$$(BUILD_CMD)
|
@$$(BUILD_CMD)
|
||||||
ifneq ($$(DUMP_C_MACROS),)
|
ifneq ($$(DUMP_C_MACROS),)
|
||||||
$$(eval CMD := $$(CC) -E -dM $$($1_CFLAGS) $$(INIT_HOOK_CFLAGS) $$(GENDEPFLAGS) $$<)
|
$$(eval CMD := $$(CC) -E -dM $$($1_CFLAGS) $$(FILE_SPECIFIC_CFLAGS) $$(GENDEPFLAGS) $$<)
|
||||||
@$$(if $$(filter $$(notdir $$(DUMP_C_MACROS)),$$(notdir $$<)),$$(BUILD_CMD))
|
@$$(if $$(filter $$(notdir $$(DUMP_C_MACROS)),$$(notdir $$<)),$$(BUILD_CMD))
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
@ -300,13 +300,13 @@ $1/%.o : %.c $1/%.d $1/cflags.txt $1/compiler.txt | $(BEGIN)
|
||||||
$1/%.o : %.cpp $1/%.d $1/cxxflags.txt $1/compiler.txt | $(BEGIN)
|
$1/%.o : %.cpp $1/%.d $1/cxxflags.txt $1/compiler.txt | $(BEGIN)
|
||||||
@mkdir -p $$(@D)
|
@mkdir -p $$(@D)
|
||||||
@$$(SILENT) || printf "$$(MSG_COMPILING_CXX) $$<" | $$(AWK_CMD)
|
@$$(SILENT) || printf "$$(MSG_COMPILING_CXX) $$<" | $$(AWK_CMD)
|
||||||
$$(eval CMD=$$(CC) -c $$($1_CXXFLAGS) $$(INIT_HOOK_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP))
|
$$(eval CMD=$$(CC) -c $$($1_CXXFLAGS) $$(FILE_SPECIFIC_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP))
|
||||||
@$$(BUILD_CMD)
|
@$$(BUILD_CMD)
|
||||||
|
|
||||||
$1/%.o : %.cc $1/%.d $1/cxxflags.txt $1/compiler.txt | $(BEGIN)
|
$1/%.o : %.cc $1/%.d $1/cxxflags.txt $1/compiler.txt | $(BEGIN)
|
||||||
@mkdir -p $$(@D)
|
@mkdir -p $$(@D)
|
||||||
@$$(SILENT) || printf "$$(MSG_COMPILING_CXX) $$<" | $$(AWK_CMD)
|
@$$(SILENT) || printf "$$(MSG_COMPILING_CXX) $$<" | $$(AWK_CMD)
|
||||||
$$(eval CMD=$$(CC) -c $$($1_CXXFLAGS) $$(INIT_HOOK_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP))
|
$$(eval CMD=$$(CC) -c $$($1_CXXFLAGS) $$(FILE_SPECIFIC_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP))
|
||||||
@$$(BUILD_CMD)
|
@$$(BUILD_CMD)
|
||||||
|
|
||||||
# Assemble: create object files from assembler source files.
|
# Assemble: create object files from assembler source files.
|
||||||
|
|
|
@ -1,10 +1,3 @@
|
||||||
# Note for new boards -- CTPC and CONVERT_TO_PROTON_C are deprecated terms
|
|
||||||
# and should not be replicated for new boards. These will be removed from
|
|
||||||
# documentation as well as existing keymaps in due course.
|
|
||||||
ifneq ($(findstring yes, $(CTPC)$(CONVERT_TO_PROTON_C)),)
|
|
||||||
$(call CATASTROPHIC_ERROR,The `CONVERT_TO_PROTON_C` and `CTPC` options are now deprecated. `CONVERT_TO=proton_c` should be used instead.)
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifneq (,$(filter $(MCU),atmega32u4))
|
ifneq (,$(filter $(MCU),atmega32u4))
|
||||||
# TODO: opt in rather than assume everything uses a pro micro
|
# TODO: opt in rather than assume everything uses a pro micro
|
||||||
PIN_COMPATIBLE ?= promicro
|
PIN_COMPATIBLE ?= promicro
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"license": "GPL-2.0-or-later",
|
"license": "GPL-2.0-or-later",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"vite": "^5.2.14",
|
"vite": "^5.4.19",
|
||||||
"vitepress": "^1.1.0",
|
"vitepress": "^1.1.0",
|
||||||
"vitepress-plugin-tabs": "^0.5.0",
|
"vitepress-plugin-tabs": "^0.5.0",
|
||||||
"vue": "^3.4.24"
|
"vue": "^3.4.24"
|
||||||
|
|
|
@ -178,205 +178,220 @@
|
||||||
"@docsearch/css" "3.6.0"
|
"@docsearch/css" "3.6.0"
|
||||||
algoliasearch "^4.19.1"
|
algoliasearch "^4.19.1"
|
||||||
|
|
||||||
"@esbuild/aix-ppc64@0.20.2":
|
"@esbuild/aix-ppc64@0.21.5":
|
||||||
version "0.20.2"
|
version "0.21.5"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz#a70f4ac11c6a1dfc18b8bbb13284155d933b9537"
|
resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f"
|
||||||
integrity sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==
|
integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==
|
||||||
|
|
||||||
"@esbuild/android-arm64@0.20.2":
|
"@esbuild/android-arm64@0.21.5":
|
||||||
version "0.20.2"
|
version "0.21.5"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz#db1c9202a5bc92ea04c7b6840f1bbe09ebf9e6b9"
|
resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052"
|
||||||
integrity sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==
|
integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==
|
||||||
|
|
||||||
"@esbuild/android-arm@0.20.2":
|
"@esbuild/android-arm@0.21.5":
|
||||||
version "0.20.2"
|
version "0.21.5"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.20.2.tgz#3b488c49aee9d491c2c8f98a909b785870d6e995"
|
resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28"
|
||||||
integrity sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==
|
integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==
|
||||||
|
|
||||||
"@esbuild/android-x64@0.20.2":
|
"@esbuild/android-x64@0.21.5":
|
||||||
version "0.20.2"
|
version "0.21.5"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.20.2.tgz#3b1628029e5576249d2b2d766696e50768449f98"
|
resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e"
|
||||||
integrity sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==
|
integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==
|
||||||
|
|
||||||
"@esbuild/darwin-arm64@0.20.2":
|
"@esbuild/darwin-arm64@0.21.5":
|
||||||
version "0.20.2"
|
version "0.21.5"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz#6e8517a045ddd86ae30c6608c8475ebc0c4000bb"
|
resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a"
|
||||||
integrity sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==
|
integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==
|
||||||
|
|
||||||
"@esbuild/darwin-x64@0.20.2":
|
"@esbuild/darwin-x64@0.21.5":
|
||||||
version "0.20.2"
|
version "0.21.5"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz#90ed098e1f9dd8a9381695b207e1cff45540a0d0"
|
resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22"
|
||||||
integrity sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==
|
integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==
|
||||||
|
|
||||||
"@esbuild/freebsd-arm64@0.20.2":
|
"@esbuild/freebsd-arm64@0.21.5":
|
||||||
version "0.20.2"
|
version "0.21.5"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz#d71502d1ee89a1130327e890364666c760a2a911"
|
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e"
|
||||||
integrity sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==
|
integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==
|
||||||
|
|
||||||
"@esbuild/freebsd-x64@0.20.2":
|
"@esbuild/freebsd-x64@0.21.5":
|
||||||
version "0.20.2"
|
version "0.21.5"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz#aa5ea58d9c1dd9af688b8b6f63ef0d3d60cea53c"
|
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261"
|
||||||
integrity sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==
|
integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==
|
||||||
|
|
||||||
"@esbuild/linux-arm64@0.20.2":
|
"@esbuild/linux-arm64@0.21.5":
|
||||||
version "0.20.2"
|
version "0.21.5"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz#055b63725df678379b0f6db9d0fa85463755b2e5"
|
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b"
|
||||||
integrity sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==
|
integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==
|
||||||
|
|
||||||
"@esbuild/linux-arm@0.20.2":
|
"@esbuild/linux-arm@0.21.5":
|
||||||
version "0.20.2"
|
version "0.21.5"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz#76b3b98cb1f87936fbc37f073efabad49dcd889c"
|
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9"
|
||||||
integrity sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==
|
integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==
|
||||||
|
|
||||||
"@esbuild/linux-ia32@0.20.2":
|
"@esbuild/linux-ia32@0.21.5":
|
||||||
version "0.20.2"
|
version "0.21.5"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz#c0e5e787c285264e5dfc7a79f04b8b4eefdad7fa"
|
resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2"
|
||||||
integrity sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==
|
integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==
|
||||||
|
|
||||||
"@esbuild/linux-loong64@0.20.2":
|
"@esbuild/linux-loong64@0.21.5":
|
||||||
version "0.20.2"
|
version "0.21.5"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz#a6184e62bd7cdc63e0c0448b83801001653219c5"
|
resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df"
|
||||||
integrity sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==
|
integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==
|
||||||
|
|
||||||
"@esbuild/linux-mips64el@0.20.2":
|
"@esbuild/linux-mips64el@0.21.5":
|
||||||
version "0.20.2"
|
version "0.21.5"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz#d08e39ce86f45ef8fc88549d29c62b8acf5649aa"
|
resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe"
|
||||||
integrity sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==
|
integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==
|
||||||
|
|
||||||
"@esbuild/linux-ppc64@0.20.2":
|
"@esbuild/linux-ppc64@0.21.5":
|
||||||
version "0.20.2"
|
version "0.21.5"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz#8d252f0b7756ffd6d1cbde5ea67ff8fd20437f20"
|
resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4"
|
||||||
integrity sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==
|
integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==
|
||||||
|
|
||||||
"@esbuild/linux-riscv64@0.20.2":
|
"@esbuild/linux-riscv64@0.21.5":
|
||||||
version "0.20.2"
|
version "0.21.5"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz#19f6dcdb14409dae607f66ca1181dd4e9db81300"
|
resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc"
|
||||||
integrity sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==
|
integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==
|
||||||
|
|
||||||
"@esbuild/linux-s390x@0.20.2":
|
"@esbuild/linux-s390x@0.21.5":
|
||||||
version "0.20.2"
|
version "0.21.5"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz#3c830c90f1a5d7dd1473d5595ea4ebb920988685"
|
resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de"
|
||||||
integrity sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==
|
integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==
|
||||||
|
|
||||||
"@esbuild/linux-x64@0.20.2":
|
"@esbuild/linux-x64@0.21.5":
|
||||||
version "0.20.2"
|
version "0.21.5"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz#86eca35203afc0d9de0694c64ec0ab0a378f6fff"
|
resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0"
|
||||||
integrity sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==
|
integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==
|
||||||
|
|
||||||
"@esbuild/netbsd-x64@0.20.2":
|
"@esbuild/netbsd-x64@0.21.5":
|
||||||
version "0.20.2"
|
version "0.21.5"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz#e771c8eb0e0f6e1877ffd4220036b98aed5915e6"
|
resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047"
|
||||||
integrity sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==
|
integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==
|
||||||
|
|
||||||
"@esbuild/openbsd-x64@0.20.2":
|
"@esbuild/openbsd-x64@0.21.5":
|
||||||
version "0.20.2"
|
version "0.21.5"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz#9a795ae4b4e37e674f0f4d716f3e226dd7c39baf"
|
resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70"
|
||||||
integrity sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==
|
integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==
|
||||||
|
|
||||||
"@esbuild/sunos-x64@0.20.2":
|
"@esbuild/sunos-x64@0.21.5":
|
||||||
version "0.20.2"
|
version "0.21.5"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz#7df23b61a497b8ac189def6e25a95673caedb03f"
|
resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b"
|
||||||
integrity sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==
|
integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==
|
||||||
|
|
||||||
"@esbuild/win32-arm64@0.20.2":
|
"@esbuild/win32-arm64@0.21.5":
|
||||||
version "0.20.2"
|
version "0.21.5"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz#f1ae5abf9ca052ae11c1bc806fb4c0f519bacf90"
|
resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d"
|
||||||
integrity sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==
|
integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==
|
||||||
|
|
||||||
"@esbuild/win32-ia32@0.20.2":
|
"@esbuild/win32-ia32@0.21.5":
|
||||||
version "0.20.2"
|
version "0.21.5"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz#241fe62c34d8e8461cd708277813e1d0ba55ce23"
|
resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b"
|
||||||
integrity sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==
|
integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==
|
||||||
|
|
||||||
"@esbuild/win32-x64@0.20.2":
|
"@esbuild/win32-x64@0.21.5":
|
||||||
version "0.20.2"
|
version "0.21.5"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz#9c907b21e30a52db959ba4f80bb01a0cc403d5cc"
|
resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c"
|
||||||
integrity sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==
|
integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==
|
||||||
|
|
||||||
"@jridgewell/sourcemap-codec@^1.4.15":
|
"@jridgewell/sourcemap-codec@^1.4.15":
|
||||||
version "1.4.15"
|
version "1.4.15"
|
||||||
resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32"
|
resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32"
|
||||||
integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
|
integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
|
||||||
|
|
||||||
"@rollup/rollup-android-arm-eabi@4.22.4":
|
"@rollup/rollup-android-arm-eabi@4.31.0":
|
||||||
version "4.22.4"
|
version "4.31.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.4.tgz#8b613b9725e8f9479d142970b106b6ae878610d5"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.31.0.tgz#d4dd60da0075a6ce9a6c76d71b8204f3e1822285"
|
||||||
integrity sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==
|
integrity sha512-9NrR4033uCbUBRgvLcBrJofa2KY9DzxL2UKZ1/4xA/mnTNyhZCWBuD8X3tPm1n4KxcgaraOYgrFKSgwjASfmlA==
|
||||||
|
|
||||||
"@rollup/rollup-android-arm64@4.22.4":
|
"@rollup/rollup-android-arm64@4.31.0":
|
||||||
version "4.22.4"
|
version "4.31.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.4.tgz#654ca1049189132ff602bfcf8df14c18da1f15fb"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.31.0.tgz#25c4d33259a7a2ccd2f52a5ffcc0bb3ab3f0729d"
|
||||||
integrity sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==
|
integrity sha512-iBbODqT86YBFHajxxF8ebj2hwKm1k8PTBQSojSt3d1FFt1gN+xf4CowE47iN0vOSdnd+5ierMHBbu/rHc7nq5g==
|
||||||
|
|
||||||
"@rollup/rollup-darwin-arm64@4.22.4":
|
"@rollup/rollup-darwin-arm64@4.31.0":
|
||||||
version "4.22.4"
|
version "4.31.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.4.tgz#6d241d099d1518ef0c2205d96b3fa52e0fe1954b"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.31.0.tgz#d137dff254b19163a6b52ac083a71cd055dae844"
|
||||||
integrity sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==
|
integrity sha512-WHIZfXgVBX30SWuTMhlHPXTyN20AXrLH4TEeH/D0Bolvx9PjgZnn4H677PlSGvU6MKNsjCQJYczkpvBbrBnG6g==
|
||||||
|
|
||||||
"@rollup/rollup-darwin-x64@4.22.4":
|
"@rollup/rollup-darwin-x64@4.31.0":
|
||||||
version "4.22.4"
|
version "4.31.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.4.tgz#42bd19d292a57ee11734c980c4650de26b457791"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.31.0.tgz#58ff20b5dacb797d3adca19f02a21c532f9d55bf"
|
||||||
integrity sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==
|
integrity sha512-hrWL7uQacTEF8gdrQAqcDy9xllQ0w0zuL1wk1HV8wKGSGbKPVjVUv/DEwT2+Asabf8Dh/As+IvfdU+H8hhzrQQ==
|
||||||
|
|
||||||
"@rollup/rollup-linux-arm-gnueabihf@4.22.4":
|
"@rollup/rollup-freebsd-arm64@4.31.0":
|
||||||
version "4.22.4"
|
version "4.31.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.4.tgz#f23555ee3d8fe941c5c5fd458cd22b65eb1c2232"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.31.0.tgz#96ce1a241c591ec3e068f4af765d94eddb24e60c"
|
||||||
integrity sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==
|
integrity sha512-S2oCsZ4hJviG1QjPY1h6sVJLBI6ekBeAEssYKad1soRFv3SocsQCzX6cwnk6fID6UQQACTjeIMB+hyYrFacRew==
|
||||||
|
|
||||||
"@rollup/rollup-linux-arm-musleabihf@4.22.4":
|
"@rollup/rollup-freebsd-x64@4.31.0":
|
||||||
version "4.22.4"
|
version "4.31.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.4.tgz#f3bbd1ae2420f5539d40ac1fde2b38da67779baa"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.31.0.tgz#e59e7ede505be41f0b4311b0b943f8eb44938467"
|
||||||
integrity sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==
|
integrity sha512-pCANqpynRS4Jirn4IKZH4tnm2+2CqCNLKD7gAdEjzdLGbH1iO0zouHz4mxqg0uEMpO030ejJ0aA6e1PJo2xrPA==
|
||||||
|
|
||||||
"@rollup/rollup-linux-arm64-gnu@4.22.4":
|
"@rollup/rollup-linux-arm-gnueabihf@4.31.0":
|
||||||
version "4.22.4"
|
version "4.31.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.4.tgz#7abe900120113e08a1f90afb84c7c28774054d15"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.31.0.tgz#e455ca6e4ff35bd46d62201c153352e717000a7b"
|
||||||
integrity sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==
|
integrity sha512-0O8ViX+QcBd3ZmGlcFTnYXZKGbFu09EhgD27tgTdGnkcYXLat4KIsBBQeKLR2xZDCXdIBAlWLkiXE1+rJpCxFw==
|
||||||
|
|
||||||
"@rollup/rollup-linux-arm64-musl@4.22.4":
|
"@rollup/rollup-linux-arm-musleabihf@4.31.0":
|
||||||
version "4.22.4"
|
version "4.31.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.4.tgz#9e655285c8175cd44f57d6a1e8e5dedfbba1d820"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.31.0.tgz#bc1a93d807d19e70b1e343a5bfea43723bcd6327"
|
||||||
integrity sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==
|
integrity sha512-w5IzG0wTVv7B0/SwDnMYmbr2uERQp999q8FMkKG1I+j8hpPX2BYFjWe69xbhbP6J9h2gId/7ogesl9hwblFwwg==
|
||||||
|
|
||||||
"@rollup/rollup-linux-powerpc64le-gnu@4.22.4":
|
"@rollup/rollup-linux-arm64-gnu@4.31.0":
|
||||||
version "4.22.4"
|
version "4.31.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.4.tgz#9a79ae6c9e9d8fe83d49e2712ecf4302db5bef5e"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.31.0.tgz#f38bf843f1dc3d5de680caf31084008846e3efae"
|
||||||
integrity sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==
|
integrity sha512-JyFFshbN5xwy6fulZ8B/8qOqENRmDdEkcIMF0Zz+RsfamEW+Zabl5jAb0IozP/8UKnJ7g2FtZZPEUIAlUSX8cA==
|
||||||
|
|
||||||
"@rollup/rollup-linux-riscv64-gnu@4.22.4":
|
"@rollup/rollup-linux-arm64-musl@4.31.0":
|
||||||
version "4.22.4"
|
version "4.31.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.4.tgz#67ac70eca4ace8e2942fabca95164e8874ab8128"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.31.0.tgz#b3987a96c18b7287129cf735be2dbf83e94d9d05"
|
||||||
integrity sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==
|
integrity sha512-kpQXQ0UPFeMPmPYksiBL9WS/BDiQEjRGMfklVIsA0Sng347H8W2iexch+IEwaR7OVSKtr2ZFxggt11zVIlZ25g==
|
||||||
|
|
||||||
"@rollup/rollup-linux-s390x-gnu@4.22.4":
|
"@rollup/rollup-linux-loongarch64-gnu@4.31.0":
|
||||||
version "4.22.4"
|
version "4.31.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.4.tgz#9f883a7440f51a22ed7f99e1d070bd84ea5005fc"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.31.0.tgz#0f0324044e71c4f02e9f49e7ec4e347b655b34ee"
|
||||||
integrity sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==
|
integrity sha512-pMlxLjt60iQTzt9iBb3jZphFIl55a70wexvo8p+vVFK+7ifTRookdoXX3bOsRdmfD+OKnMozKO6XM4zR0sHRrQ==
|
||||||
|
|
||||||
"@rollup/rollup-linux-x64-gnu@4.22.4":
|
"@rollup/rollup-linux-powerpc64le-gnu@4.31.0":
|
||||||
version "4.22.4"
|
version "4.31.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz#70116ae6c577fe367f58559e2cffb5641a1dd9d0"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.31.0.tgz#809479f27f1fd5b4eecd2aa732132ad952d454ba"
|
||||||
integrity sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==
|
integrity sha512-D7TXT7I/uKEuWiRkEFbed1UUYZwcJDU4vZQdPTcepK7ecPhzKOYk4Er2YR4uHKme4qDeIh6N3XrLfpuM7vzRWQ==
|
||||||
|
|
||||||
"@rollup/rollup-linux-x64-musl@4.22.4":
|
"@rollup/rollup-linux-riscv64-gnu@4.31.0":
|
||||||
version "4.22.4"
|
version "4.31.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.4.tgz#f473f88219feb07b0b98b53a7923be716d1d182f"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.31.0.tgz#7bc75c4f22db04d3c972f83431739cfa41c6a36e"
|
||||||
integrity sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==
|
integrity sha512-wal2Tc8O5lMBtoePLBYRKj2CImUCJ4UNGJlLwspx7QApYny7K1cUYlzQ/4IGQBLmm+y0RS7dwc3TDO/pmcneTw==
|
||||||
|
|
||||||
"@rollup/rollup-win32-arm64-msvc@4.22.4":
|
"@rollup/rollup-linux-s390x-gnu@4.31.0":
|
||||||
version "4.22.4"
|
version "4.31.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.4.tgz#4349482d17f5d1c58604d1c8900540d676f420e0"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.31.0.tgz#cfe8052345c55864d83ae343362cf1912480170e"
|
||||||
integrity sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==
|
integrity sha512-O1o5EUI0+RRMkK9wiTVpk2tyzXdXefHtRTIjBbmFREmNMy7pFeYXCFGbhKFwISA3UOExlo5GGUuuj3oMKdK6JQ==
|
||||||
|
|
||||||
"@rollup/rollup-win32-ia32-msvc@4.22.4":
|
"@rollup/rollup-linux-x64-gnu@4.31.0":
|
||||||
version "4.22.4"
|
version "4.31.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.4.tgz#a6fc39a15db618040ec3c2a24c1e26cb5f4d7422"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.31.0.tgz#c6b048f1e25f3fea5b4bd246232f4d07a159c5a0"
|
||||||
integrity sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==
|
integrity sha512-zSoHl356vKnNxwOWnLd60ixHNPRBglxpv2g7q0Cd3Pmr561gf0HiAcUBRL3S1vPqRC17Zo2CX/9cPkqTIiai1g==
|
||||||
|
|
||||||
"@rollup/rollup-win32-x64-msvc@4.22.4":
|
"@rollup/rollup-linux-x64-musl@4.31.0":
|
||||||
version "4.22.4"
|
version "4.31.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.4.tgz#3dd5d53e900df2a40841882c02e56f866c04d202"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.31.0.tgz#615273ac52d1a201f4de191cbd3389016a9d7d80"
|
||||||
integrity sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==
|
integrity sha512-ypB/HMtcSGhKUQNiFwqgdclWNRrAYDH8iMYH4etw/ZlGwiTVxBz2tDrGRrPlfZu6QjXwtd+C3Zib5pFqID97ZA==
|
||||||
|
|
||||||
|
"@rollup/rollup-win32-arm64-msvc@4.31.0":
|
||||||
|
version "4.31.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.31.0.tgz#32ed85810c1b831c648eca999d68f01255b30691"
|
||||||
|
integrity sha512-JuhN2xdI/m8Hr+aVO3vspO7OQfUFO6bKLIRTAy0U15vmWjnZDLrEgCZ2s6+scAYaQVpYSh9tZtRijApw9IXyMw==
|
||||||
|
|
||||||
|
"@rollup/rollup-win32-ia32-msvc@4.31.0":
|
||||||
|
version "4.31.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.31.0.tgz#d47effada68bcbfdccd30c4a788d42e4542ff4d3"
|
||||||
|
integrity sha512-U1xZZXYkvdf5MIWmftU8wrM5PPXzyaY1nGCI4KI4BFfoZxHamsIe+BtnPLIvvPykvQWlVbqUXdLa4aJUuilwLQ==
|
||||||
|
|
||||||
|
"@rollup/rollup-win32-x64-msvc@4.31.0":
|
||||||
|
version "4.31.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.31.0.tgz#7a2d89a82cf0388d60304964217dd7beac6de645"
|
||||||
|
integrity sha512-ul8rnCsUumNln5YWwz0ted2ZHFhzhRRnkpBZ+YRuHoRAlUji9KChpOUOndY7uykrPEPXVbHLlsdo6v5yXo/TXw==
|
||||||
|
|
||||||
"@shikijs/core@1.3.0", "@shikijs/core@^1.3.0":
|
"@shikijs/core@1.3.0", "@shikijs/core@^1.3.0":
|
||||||
version "1.3.0"
|
version "1.3.0"
|
||||||
|
@ -390,10 +405,10 @@
|
||||||
dependencies:
|
dependencies:
|
||||||
shiki "1.3.0"
|
shiki "1.3.0"
|
||||||
|
|
||||||
"@types/estree@1.0.5":
|
"@types/estree@1.0.6":
|
||||||
version "1.0.5"
|
version "1.0.6"
|
||||||
resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4"
|
resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50"
|
||||||
integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==
|
integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==
|
||||||
|
|
||||||
"@types/linkify-it@*":
|
"@types/linkify-it@*":
|
||||||
version "3.0.5"
|
version "3.0.5"
|
||||||
|
@ -589,34 +604,34 @@ entities@^4.5.0:
|
||||||
resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48"
|
resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48"
|
||||||
integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==
|
integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==
|
||||||
|
|
||||||
esbuild@^0.20.1:
|
esbuild@^0.21.3:
|
||||||
version "0.20.2"
|
version "0.21.5"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.20.2.tgz#9d6b2386561766ee6b5a55196c6d766d28c87ea1"
|
resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d"
|
||||||
integrity sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==
|
integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
"@esbuild/aix-ppc64" "0.20.2"
|
"@esbuild/aix-ppc64" "0.21.5"
|
||||||
"@esbuild/android-arm" "0.20.2"
|
"@esbuild/android-arm" "0.21.5"
|
||||||
"@esbuild/android-arm64" "0.20.2"
|
"@esbuild/android-arm64" "0.21.5"
|
||||||
"@esbuild/android-x64" "0.20.2"
|
"@esbuild/android-x64" "0.21.5"
|
||||||
"@esbuild/darwin-arm64" "0.20.2"
|
"@esbuild/darwin-arm64" "0.21.5"
|
||||||
"@esbuild/darwin-x64" "0.20.2"
|
"@esbuild/darwin-x64" "0.21.5"
|
||||||
"@esbuild/freebsd-arm64" "0.20.2"
|
"@esbuild/freebsd-arm64" "0.21.5"
|
||||||
"@esbuild/freebsd-x64" "0.20.2"
|
"@esbuild/freebsd-x64" "0.21.5"
|
||||||
"@esbuild/linux-arm" "0.20.2"
|
"@esbuild/linux-arm" "0.21.5"
|
||||||
"@esbuild/linux-arm64" "0.20.2"
|
"@esbuild/linux-arm64" "0.21.5"
|
||||||
"@esbuild/linux-ia32" "0.20.2"
|
"@esbuild/linux-ia32" "0.21.5"
|
||||||
"@esbuild/linux-loong64" "0.20.2"
|
"@esbuild/linux-loong64" "0.21.5"
|
||||||
"@esbuild/linux-mips64el" "0.20.2"
|
"@esbuild/linux-mips64el" "0.21.5"
|
||||||
"@esbuild/linux-ppc64" "0.20.2"
|
"@esbuild/linux-ppc64" "0.21.5"
|
||||||
"@esbuild/linux-riscv64" "0.20.2"
|
"@esbuild/linux-riscv64" "0.21.5"
|
||||||
"@esbuild/linux-s390x" "0.20.2"
|
"@esbuild/linux-s390x" "0.21.5"
|
||||||
"@esbuild/linux-x64" "0.20.2"
|
"@esbuild/linux-x64" "0.21.5"
|
||||||
"@esbuild/netbsd-x64" "0.20.2"
|
"@esbuild/netbsd-x64" "0.21.5"
|
||||||
"@esbuild/openbsd-x64" "0.20.2"
|
"@esbuild/openbsd-x64" "0.21.5"
|
||||||
"@esbuild/sunos-x64" "0.20.2"
|
"@esbuild/sunos-x64" "0.21.5"
|
||||||
"@esbuild/win32-arm64" "0.20.2"
|
"@esbuild/win32-arm64" "0.21.5"
|
||||||
"@esbuild/win32-ia32" "0.20.2"
|
"@esbuild/win32-ia32" "0.21.5"
|
||||||
"@esbuild/win32-x64" "0.20.2"
|
"@esbuild/win32-x64" "0.21.5"
|
||||||
|
|
||||||
estree-walker@^2.0.2:
|
estree-walker@^2.0.2:
|
||||||
version "2.0.2"
|
version "2.0.2"
|
||||||
|
@ -662,29 +677,29 @@ mitt@^3.0.1:
|
||||||
resolved "https://registry.yarnpkg.com/mitt/-/mitt-3.0.1.tgz#ea36cf0cc30403601ae074c8f77b7092cdab36d1"
|
resolved "https://registry.yarnpkg.com/mitt/-/mitt-3.0.1.tgz#ea36cf0cc30403601ae074c8f77b7092cdab36d1"
|
||||||
integrity sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==
|
integrity sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==
|
||||||
|
|
||||||
nanoid@^3.3.7:
|
nanoid@^3.3.8:
|
||||||
version "3.3.7"
|
version "3.3.8"
|
||||||
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8"
|
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf"
|
||||||
integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==
|
integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==
|
||||||
|
|
||||||
perfect-debounce@^1.0.0:
|
perfect-debounce@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/perfect-debounce/-/perfect-debounce-1.0.0.tgz#9c2e8bc30b169cc984a58b7d5b28049839591d2a"
|
resolved "https://registry.yarnpkg.com/perfect-debounce/-/perfect-debounce-1.0.0.tgz#9c2e8bc30b169cc984a58b7d5b28049839591d2a"
|
||||||
integrity sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==
|
integrity sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==
|
||||||
|
|
||||||
picocolors@^1.0.0:
|
picocolors@^1.1.1:
|
||||||
version "1.0.0"
|
version "1.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
|
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b"
|
||||||
integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
|
integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==
|
||||||
|
|
||||||
postcss@^8.4.38:
|
postcss@^8.4.38, postcss@^8.4.43:
|
||||||
version "8.4.38"
|
version "8.5.1"
|
||||||
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e"
|
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.1.tgz#e2272a1f8a807fafa413218245630b5db10a3214"
|
||||||
integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==
|
integrity sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
nanoid "^3.3.7"
|
nanoid "^3.3.8"
|
||||||
picocolors "^1.0.0"
|
picocolors "^1.1.1"
|
||||||
source-map-js "^1.2.0"
|
source-map-js "^1.2.1"
|
||||||
|
|
||||||
preact@^10.0.0:
|
preact@^10.0.0:
|
||||||
version "10.20.2"
|
version "10.20.2"
|
||||||
|
@ -696,29 +711,32 @@ rfdc@^1.3.1:
|
||||||
resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.1.tgz#2b6d4df52dffe8bb346992a10ea9451f24373a8f"
|
resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.1.tgz#2b6d4df52dffe8bb346992a10ea9451f24373a8f"
|
||||||
integrity sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==
|
integrity sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==
|
||||||
|
|
||||||
rollup@^4.13.0:
|
rollup@^4.20.0:
|
||||||
version "4.22.4"
|
version "4.31.0"
|
||||||
resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.22.4.tgz#4135a6446671cd2a2453e1ad42a45d5973ec3a0f"
|
resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.31.0.tgz#b84af969a0292cb047dce2c0ec5413a9457597a4"
|
||||||
integrity sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==
|
integrity sha512-9cCE8P4rZLx9+PjoyqHLs31V9a9Vpvfo4qNcs6JCiGWYhw2gijSetFbH6SSy1whnkgcefnUwr8sad7tgqsGvnw==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@types/estree" "1.0.5"
|
"@types/estree" "1.0.6"
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
"@rollup/rollup-android-arm-eabi" "4.22.4"
|
"@rollup/rollup-android-arm-eabi" "4.31.0"
|
||||||
"@rollup/rollup-android-arm64" "4.22.4"
|
"@rollup/rollup-android-arm64" "4.31.0"
|
||||||
"@rollup/rollup-darwin-arm64" "4.22.4"
|
"@rollup/rollup-darwin-arm64" "4.31.0"
|
||||||
"@rollup/rollup-darwin-x64" "4.22.4"
|
"@rollup/rollup-darwin-x64" "4.31.0"
|
||||||
"@rollup/rollup-linux-arm-gnueabihf" "4.22.4"
|
"@rollup/rollup-freebsd-arm64" "4.31.0"
|
||||||
"@rollup/rollup-linux-arm-musleabihf" "4.22.4"
|
"@rollup/rollup-freebsd-x64" "4.31.0"
|
||||||
"@rollup/rollup-linux-arm64-gnu" "4.22.4"
|
"@rollup/rollup-linux-arm-gnueabihf" "4.31.0"
|
||||||
"@rollup/rollup-linux-arm64-musl" "4.22.4"
|
"@rollup/rollup-linux-arm-musleabihf" "4.31.0"
|
||||||
"@rollup/rollup-linux-powerpc64le-gnu" "4.22.4"
|
"@rollup/rollup-linux-arm64-gnu" "4.31.0"
|
||||||
"@rollup/rollup-linux-riscv64-gnu" "4.22.4"
|
"@rollup/rollup-linux-arm64-musl" "4.31.0"
|
||||||
"@rollup/rollup-linux-s390x-gnu" "4.22.4"
|
"@rollup/rollup-linux-loongarch64-gnu" "4.31.0"
|
||||||
"@rollup/rollup-linux-x64-gnu" "4.22.4"
|
"@rollup/rollup-linux-powerpc64le-gnu" "4.31.0"
|
||||||
"@rollup/rollup-linux-x64-musl" "4.22.4"
|
"@rollup/rollup-linux-riscv64-gnu" "4.31.0"
|
||||||
"@rollup/rollup-win32-arm64-msvc" "4.22.4"
|
"@rollup/rollup-linux-s390x-gnu" "4.31.0"
|
||||||
"@rollup/rollup-win32-ia32-msvc" "4.22.4"
|
"@rollup/rollup-linux-x64-gnu" "4.31.0"
|
||||||
"@rollup/rollup-win32-x64-msvc" "4.22.4"
|
"@rollup/rollup-linux-x64-musl" "4.31.0"
|
||||||
|
"@rollup/rollup-win32-arm64-msvc" "4.31.0"
|
||||||
|
"@rollup/rollup-win32-ia32-msvc" "4.31.0"
|
||||||
|
"@rollup/rollup-win32-x64-msvc" "4.31.0"
|
||||||
fsevents "~2.3.2"
|
fsevents "~2.3.2"
|
||||||
|
|
||||||
shiki@1.3.0, shiki@^1.3.0:
|
shiki@1.3.0, shiki@^1.3.0:
|
||||||
|
@ -733,6 +751,11 @@ source-map-js@^1.2.0:
|
||||||
resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af"
|
resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af"
|
||||||
integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==
|
integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==
|
||||||
|
|
||||||
|
source-map-js@^1.2.1:
|
||||||
|
version "1.2.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46"
|
||||||
|
integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==
|
||||||
|
|
||||||
speakingurl@^14.0.1:
|
speakingurl@^14.0.1:
|
||||||
version "14.0.1"
|
version "14.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/speakingurl/-/speakingurl-14.0.1.tgz#f37ec8ddc4ab98e9600c1c9ec324a8c48d772a53"
|
resolved "https://registry.yarnpkg.com/speakingurl/-/speakingurl-14.0.1.tgz#f37ec8ddc4ab98e9600c1c9ec324a8c48d772a53"
|
||||||
|
@ -743,14 +766,14 @@ tabbable@^6.2.0:
|
||||||
resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97"
|
resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97"
|
||||||
integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==
|
integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==
|
||||||
|
|
||||||
vite@^5.2.14, vite@^5.2.9:
|
vite@^5.2.9, vite@^5.4.19:
|
||||||
version "5.2.14"
|
version "5.4.19"
|
||||||
resolved "https://registry.yarnpkg.com/vite/-/vite-5.2.14.tgz#fd5f60facf6b5f90ec7da6323c467a365d380c3d"
|
resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.19.tgz#20efd060410044b3ed555049418a5e7d1998f959"
|
||||||
integrity sha512-TFQLuwWLPms+NBNlh0D9LZQ+HXW471COABxw/9TEUBrjuHMo9BrYBPrN/SYAwIuVL+rLerycxiLT41t4f5MZpA==
|
integrity sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==
|
||||||
dependencies:
|
dependencies:
|
||||||
esbuild "^0.20.1"
|
esbuild "^0.21.3"
|
||||||
postcss "^8.4.38"
|
postcss "^8.4.43"
|
||||||
rollup "^4.13.0"
|
rollup "^4.20.0"
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
fsevents "~2.3.3"
|
fsevents "~2.3.3"
|
||||||
|
|
||||||
|
|
|
@ -25,6 +25,7 @@ GENERIC_FEATURES = \
|
||||||
CAPS_WORD \
|
CAPS_WORD \
|
||||||
COMBO \
|
COMBO \
|
||||||
COMMAND \
|
COMMAND \
|
||||||
|
CONNECTION \
|
||||||
CRC \
|
CRC \
|
||||||
DEFERRED_EXEC \
|
DEFERRED_EXEC \
|
||||||
DIGITIZER \
|
DIGITIZER \
|
||||||
|
@ -34,6 +35,7 @@ GENERIC_FEATURES = \
|
||||||
DYNAMIC_TAPPING_TERM \
|
DYNAMIC_TAPPING_TERM \
|
||||||
GRAVE_ESC \
|
GRAVE_ESC \
|
||||||
HAPTIC \
|
HAPTIC \
|
||||||
|
KEYCODE_STRING \
|
||||||
KEY_LOCK \
|
KEY_LOCK \
|
||||||
KEY_OVERRIDE \
|
KEY_OVERRIDE \
|
||||||
LAYER_LOCK \
|
LAYER_LOCK \
|
||||||
|
@ -60,6 +62,7 @@ define HANDLE_GENERIC_FEATURE
|
||||||
SRC += $$(wildcard $$(QUANTUM_DIR)/process_keycode/process_$2.c)
|
SRC += $$(wildcard $$(QUANTUM_DIR)/process_keycode/process_$2.c)
|
||||||
SRC += $$(wildcard $$(QUANTUM_DIR)/$2/$2.c)
|
SRC += $$(wildcard $$(QUANTUM_DIR)/$2/$2.c)
|
||||||
SRC += $$(wildcard $$(QUANTUM_DIR)/$2.c)
|
SRC += $$(wildcard $$(QUANTUM_DIR)/$2.c)
|
||||||
|
SRC += $$(wildcard $$(QUANTUM_DIR)/nvm/$$(NVM_DRIVER_LOWER)/nvm_$2.c)
|
||||||
VPATH += $$(wildcard $$(QUANTUM_DIR)/$2/)
|
VPATH += $$(wildcard $$(QUANTUM_DIR)/$2/)
|
||||||
OPT_DEFS += -D$1_ENABLE
|
OPT_DEFS += -D$1_ENABLE
|
||||||
endef
|
endef
|
||||||
|
|
11
builddefs/support.mk
Normal file
11
builddefs/support.mk
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
# Helper to determine if a compiler option is supported
|
||||||
|
# Args:
|
||||||
|
# $(1) = option to test, if successful will be output
|
||||||
|
# $(2) = option to use if $(1) is not supported
|
||||||
|
# $(3) = additional arguments to pass to the compiler during the test, but aren't contained in the output
|
||||||
|
cc-option = $(shell \
|
||||||
|
if { echo 'int main(){return 0;}' | $(CC) $(1) $(3) -o /dev/null -x c /dev/null >/dev/null 2>&1; }; \
|
||||||
|
then echo "$(1)"; else echo "$(2)"; fi)
|
||||||
|
|
||||||
|
# Helper to pass comma character to make functions (use with `$(,)` to pass in `$(call ...)` arguments)
|
||||||
|
, := ,
|
596
data/constants/keycodes/extras/keycodes_eurkey_0.0.1.hjson
Normal file
596
data/constants/keycodes/extras/keycodes_eurkey_0.0.1.hjson
Normal file
|
@ -0,0 +1,596 @@
|
||||||
|
{
|
||||||
|
"aliases": {
|
||||||
|
/*
|
||||||
|
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
|
||||||
|
* │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ │
|
||||||
|
* ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
|
||||||
|
* │ │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │ \ │
|
||||||
|
* ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤
|
||||||
|
* │ │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ │
|
||||||
|
* ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤
|
||||||
|
* │ │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ │
|
||||||
|
* ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
|
||||||
|
* │ │ │ │ │ │ │ │ │
|
||||||
|
* └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
|
||||||
|
*/
|
||||||
|
"KC_GRV": {
|
||||||
|
"key": "EU_GRV",
|
||||||
|
"label": "`",
|
||||||
|
}
|
||||||
|
"KC_1": {
|
||||||
|
"key": "EU_1",
|
||||||
|
"label": "1",
|
||||||
|
}
|
||||||
|
"KC_2": {
|
||||||
|
"key": "EU_2",
|
||||||
|
"label": "2",
|
||||||
|
}
|
||||||
|
"KC_3": {
|
||||||
|
"key": "EU_3",
|
||||||
|
"label": "3",
|
||||||
|
}
|
||||||
|
"KC_4": {
|
||||||
|
"key": "EU_4",
|
||||||
|
"label": "4",
|
||||||
|
}
|
||||||
|
"KC_5": {
|
||||||
|
"key": "EU_5",
|
||||||
|
"label": "5",
|
||||||
|
}
|
||||||
|
"KC_6": {
|
||||||
|
"key": "EU_6",
|
||||||
|
"label": "6",
|
||||||
|
}
|
||||||
|
"KC_7": {
|
||||||
|
"key": "EU_7",
|
||||||
|
"label": "7",
|
||||||
|
}
|
||||||
|
"KC_8": {
|
||||||
|
"key": "EU_8",
|
||||||
|
"label": "8",
|
||||||
|
}
|
||||||
|
"KC_9": {
|
||||||
|
"key": "EU_9",
|
||||||
|
"label": "9",
|
||||||
|
}
|
||||||
|
"KC_0": {
|
||||||
|
"key": "EU_0",
|
||||||
|
"label": "0",
|
||||||
|
}
|
||||||
|
"KC_MINS": {
|
||||||
|
"key": "EU_MINS",
|
||||||
|
"label": "-",
|
||||||
|
}
|
||||||
|
"KC_EQL": {
|
||||||
|
"key": "EU_EQL",
|
||||||
|
"label": "=",
|
||||||
|
}
|
||||||
|
"KC_Q": {
|
||||||
|
"key": "EU_Q",
|
||||||
|
"label": "Q",
|
||||||
|
}
|
||||||
|
"KC_W": {
|
||||||
|
"key": "EU_W",
|
||||||
|
"label": "W",
|
||||||
|
}
|
||||||
|
"KC_E": {
|
||||||
|
"key": "EU_E",
|
||||||
|
"label": "E",
|
||||||
|
}
|
||||||
|
"KC_R": {
|
||||||
|
"key": "EU_R",
|
||||||
|
"label": "R",
|
||||||
|
}
|
||||||
|
"KC_T": {
|
||||||
|
"key": "EU_T",
|
||||||
|
"label": "T",
|
||||||
|
}
|
||||||
|
"KC_Y": {
|
||||||
|
"key": "EU_Y",
|
||||||
|
"label": "Y",
|
||||||
|
}
|
||||||
|
"KC_U": {
|
||||||
|
"key": "EU_U",
|
||||||
|
"label": "U",
|
||||||
|
}
|
||||||
|
"KC_I": {
|
||||||
|
"key": "EU_I",
|
||||||
|
"label": "I",
|
||||||
|
}
|
||||||
|
"KC_O": {
|
||||||
|
"key": "EU_O",
|
||||||
|
"label": "O",
|
||||||
|
}
|
||||||
|
"KC_P": {
|
||||||
|
"key": "EU_P",
|
||||||
|
"label": "P",
|
||||||
|
}
|
||||||
|
"KC_LBRC": {
|
||||||
|
"key": "EU_LBRC",
|
||||||
|
"label": "[",
|
||||||
|
}
|
||||||
|
"KC_RBRC": {
|
||||||
|
"key": "EU_RBRC",
|
||||||
|
"label": "]",
|
||||||
|
}
|
||||||
|
"KC_BSLS": {
|
||||||
|
"key": "EU_BSLS",
|
||||||
|
"label": "\\",
|
||||||
|
}
|
||||||
|
"KC_A": {
|
||||||
|
"key": "EU_A",
|
||||||
|
"label": "A",
|
||||||
|
}
|
||||||
|
"KC_S": {
|
||||||
|
"key": "EU_S",
|
||||||
|
"label": "S",
|
||||||
|
}
|
||||||
|
"KC_D": {
|
||||||
|
"key": "EU_D",
|
||||||
|
"label": "D",
|
||||||
|
}
|
||||||
|
"KC_F": {
|
||||||
|
"key": "EU_F",
|
||||||
|
"label": "F",
|
||||||
|
}
|
||||||
|
"KC_G": {
|
||||||
|
"key": "EU_G",
|
||||||
|
"label": "G",
|
||||||
|
}
|
||||||
|
"KC_H": {
|
||||||
|
"key": "EU_H",
|
||||||
|
"label": "H",
|
||||||
|
}
|
||||||
|
"KC_J": {
|
||||||
|
"key": "EU_J",
|
||||||
|
"label": "J",
|
||||||
|
}
|
||||||
|
"KC_K": {
|
||||||
|
"key": "EU_K",
|
||||||
|
"label": "K",
|
||||||
|
}
|
||||||
|
"KC_L": {
|
||||||
|
"key": "EU_L",
|
||||||
|
"label": "L",
|
||||||
|
}
|
||||||
|
"KC_SCLN": {
|
||||||
|
"key": "EU_SCLN",
|
||||||
|
"label": ";",
|
||||||
|
}
|
||||||
|
"KC_QUOT": {
|
||||||
|
"key": "EU_QUOT",
|
||||||
|
"label": "'",
|
||||||
|
}
|
||||||
|
"KC_Z": {
|
||||||
|
"key": "EU_Z",
|
||||||
|
"label": "Z",
|
||||||
|
}
|
||||||
|
"KC_X": {
|
||||||
|
"key": "EU_X",
|
||||||
|
"label": "X",
|
||||||
|
}
|
||||||
|
"KC_C": {
|
||||||
|
"key": "EU_C",
|
||||||
|
"label": "C",
|
||||||
|
}
|
||||||
|
"KC_V": {
|
||||||
|
"key": "EU_V",
|
||||||
|
"label": "V",
|
||||||
|
}
|
||||||
|
"KC_B": {
|
||||||
|
"key": "EU_B",
|
||||||
|
"label": "B",
|
||||||
|
}
|
||||||
|
"KC_N": {
|
||||||
|
"key": "EU_N",
|
||||||
|
"label": "N",
|
||||||
|
}
|
||||||
|
"KC_M": {
|
||||||
|
"key": "EU_M",
|
||||||
|
"label": "M",
|
||||||
|
}
|
||||||
|
"KC_COMM": {
|
||||||
|
"key": "EU_COMM",
|
||||||
|
"label": ",",
|
||||||
|
}
|
||||||
|
"KC_DOT": {
|
||||||
|
"key": "EU_DOT",
|
||||||
|
"label": ".",
|
||||||
|
}
|
||||||
|
"KC_SLSH": {
|
||||||
|
"key": "EU_SLSH",
|
||||||
|
"label": "/",
|
||||||
|
}
|
||||||
|
/* Shifted symbols
|
||||||
|
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
|
||||||
|
* │ ~ │ ! │ @ │ # │ $ │ % │ ^ │ & │ * │ ( │ ) │ _ │ + │ │
|
||||||
|
* ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
|
||||||
|
* │ │ │ │ │ │ │ │ │ │ │ │ { │ } │ | │
|
||||||
|
* ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤
|
||||||
|
* │ │ │ │ │ │ │ │ │ │ │ : │ " │ │
|
||||||
|
* ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤
|
||||||
|
* │ │ │ │ │ │ │ │ │ < │ > │ ? │ │
|
||||||
|
* ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
|
||||||
|
* │ │ │ │ │ │ │ │ │
|
||||||
|
* └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
|
||||||
|
*/
|
||||||
|
"S(EU_GRV)": {
|
||||||
|
"key": "EU_TILD",
|
||||||
|
"label": "~",
|
||||||
|
}
|
||||||
|
"S(EU_1)": {
|
||||||
|
"key": "EU_EXLM",
|
||||||
|
"label": "!",
|
||||||
|
}
|
||||||
|
"S(EU_2)": {
|
||||||
|
"key": "EU_AT",
|
||||||
|
"label": "@",
|
||||||
|
}
|
||||||
|
"S(EU_3)": {
|
||||||
|
"key": "EU_HASH",
|
||||||
|
"label": "#",
|
||||||
|
}
|
||||||
|
"S(EU_4)": {
|
||||||
|
"key": "EU_DLR",
|
||||||
|
"label": "$",
|
||||||
|
}
|
||||||
|
"S(EU_5)": {
|
||||||
|
"key": "EU_PERC",
|
||||||
|
"label": "%",
|
||||||
|
}
|
||||||
|
"S(EU_6)": {
|
||||||
|
"key": "EU_CIRC",
|
||||||
|
"label": "^",
|
||||||
|
}
|
||||||
|
"S(EU_7)": {
|
||||||
|
"key": "EU_AMPR",
|
||||||
|
"label": "&",
|
||||||
|
}
|
||||||
|
"S(EU_8)": {
|
||||||
|
"key": "EU_ASTR",
|
||||||
|
"label": "*",
|
||||||
|
}
|
||||||
|
"S(EU_9)": {
|
||||||
|
"key": "EU_LPRN",
|
||||||
|
"label": "(",
|
||||||
|
}
|
||||||
|
"S(EU_0)": {
|
||||||
|
"key": "EU_RPRN",
|
||||||
|
"label": ")",
|
||||||
|
}
|
||||||
|
"S(EU_MINS)": {
|
||||||
|
"key": "EU_UNDS",
|
||||||
|
"label": "_",
|
||||||
|
}
|
||||||
|
"S(EU_EQL)": {
|
||||||
|
"key": "EU_PLUS",
|
||||||
|
"label": "+",
|
||||||
|
}
|
||||||
|
"S(EU_LBRC)": {
|
||||||
|
"key": "EU_LCBR",
|
||||||
|
"label": "{",
|
||||||
|
}
|
||||||
|
"S(EU_RBRC)": {
|
||||||
|
"key": "EU_RCBR",
|
||||||
|
"label": "}",
|
||||||
|
}
|
||||||
|
"S(EU_BSLS)": {
|
||||||
|
"key": "EU_PIPE",
|
||||||
|
"label": "|",
|
||||||
|
}
|
||||||
|
"S(EU_SCLN)": {
|
||||||
|
"key": "EU_COLN",
|
||||||
|
"label": ":",
|
||||||
|
}
|
||||||
|
"S(EU_QUOT)": {
|
||||||
|
"key": "EU_DQUO",
|
||||||
|
"label": "\"",
|
||||||
|
}
|
||||||
|
"S(EU_COMM)": {
|
||||||
|
"key": "EU_LABK",
|
||||||
|
"label": "<",
|
||||||
|
}
|
||||||
|
"S(EU_DOT)": {
|
||||||
|
"key": "EU_RABK",
|
||||||
|
"label": ">",
|
||||||
|
}
|
||||||
|
"S(EU_SLSH)": {
|
||||||
|
"key": "EU_QUES",
|
||||||
|
"label": "?",
|
||||||
|
}
|
||||||
|
/* AltGr symbols
|
||||||
|
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
|
||||||
|
* │ ` │ ¡ │ ª │ º │ £ │ € │ ^ │ ˚ │ „ │ “ │ ” │ – │ × │ │
|
||||||
|
* ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
|
||||||
|
* │ │ æ │ å │ ë │ ý │ þ │ ÿ │ ü │ ï │ ö │ œ │ « │ » │ ¬ │
|
||||||
|
* ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤
|
||||||
|
* │ │ ä │ ß │ ð │ è │ é │ ù │ ú │ ij │ ø │ ° │ ´ │ │
|
||||||
|
* ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤
|
||||||
|
* │ │ à │ á │ ç │ ì │ í │ ñ │ μ │ ò │ ó │ ¿ │ │
|
||||||
|
* ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
|
||||||
|
* │ │ │ │ │ │ │ │ │
|
||||||
|
* └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
|
||||||
|
*/
|
||||||
|
"ALGR(EU_GRV)": {
|
||||||
|
"key": "EU_DGRV",
|
||||||
|
"label": "` (dead)",
|
||||||
|
}
|
||||||
|
"ALGR(EU_1)": {
|
||||||
|
"key": "EU_IEXL",
|
||||||
|
"label": "¡",
|
||||||
|
}
|
||||||
|
"ALGR(EU_2)": {
|
||||||
|
"key": "EU_FORD",
|
||||||
|
"label": "ª",
|
||||||
|
}
|
||||||
|
"ALGR(EU_3)": {
|
||||||
|
"key": "EU_MORD",
|
||||||
|
"label": "º",
|
||||||
|
}
|
||||||
|
"ALGR(EU_4)": {
|
||||||
|
"key": "EU_PND",
|
||||||
|
"label": "£",
|
||||||
|
}
|
||||||
|
"ALGR(EU_5)": {
|
||||||
|
"key": "EU_EURO",
|
||||||
|
"label": "€",
|
||||||
|
}
|
||||||
|
"ALGR(EU_6)": {
|
||||||
|
"key": "EU_DCIR",
|
||||||
|
"label": "^ (dead)",
|
||||||
|
}
|
||||||
|
"ALGR(EU_7)": {
|
||||||
|
"key": "EU_RNGA",
|
||||||
|
"label": "˚ (dead)",
|
||||||
|
}
|
||||||
|
"ALGR(EU_8)": {
|
||||||
|
"key": "EU_DLQU",
|
||||||
|
"label": "„",
|
||||||
|
}
|
||||||
|
"ALGR(EU_9)": {
|
||||||
|
"key": "EU_LDQU",
|
||||||
|
"label": "“",
|
||||||
|
}
|
||||||
|
"ALGR(EU_0)": {
|
||||||
|
"key": "EU_RDQU",
|
||||||
|
"label": "”",
|
||||||
|
}
|
||||||
|
"ALGR(EU_MINS)": {
|
||||||
|
"key": "EU_NDSH",
|
||||||
|
"label": "–",
|
||||||
|
}
|
||||||
|
"ALGR(EU_EQL)": {
|
||||||
|
"key": "EU_MUL",
|
||||||
|
"label": "×",
|
||||||
|
}
|
||||||
|
"ALGR(EU_Q)": {
|
||||||
|
"key": "EU_AE",
|
||||||
|
"label": "æ",
|
||||||
|
}
|
||||||
|
"ALGR(EU_W)": {
|
||||||
|
"key": "EU_ARNG",
|
||||||
|
"label": "Å",
|
||||||
|
}
|
||||||
|
"ALGR(EU_E)": {
|
||||||
|
"key": "EU_EDIA",
|
||||||
|
"label": "Ë",
|
||||||
|
}
|
||||||
|
"ALGR(EU_R)": {
|
||||||
|
"key": "EU_YACU",
|
||||||
|
"label": "Ý",
|
||||||
|
}
|
||||||
|
"ALGR(EU_T)": {
|
||||||
|
"key": "EU_THRN",
|
||||||
|
"label": "Þ",
|
||||||
|
}
|
||||||
|
"ALGR(EU_Y)": {
|
||||||
|
"key": "EU_YDIA",
|
||||||
|
"label": "Ÿ",
|
||||||
|
}
|
||||||
|
"ALGR(EU_U)": {
|
||||||
|
"key": "EU_UDIA",
|
||||||
|
"label": "Ü",
|
||||||
|
}
|
||||||
|
"ALGR(EU_I)": {
|
||||||
|
"key": "EU_IDIA",
|
||||||
|
"label": "Ï",
|
||||||
|
}
|
||||||
|
"ALGR(EU_O)": {
|
||||||
|
"key": "EU_ODIA",
|
||||||
|
"label": "Ö",
|
||||||
|
}
|
||||||
|
"ALGR(EU_P)": {
|
||||||
|
"key": "EU_OE",
|
||||||
|
"label": "Œ",
|
||||||
|
}
|
||||||
|
"ALGR(EU_LBRC)": {
|
||||||
|
"key": "EU_LDAQ",
|
||||||
|
"label": "«",
|
||||||
|
}
|
||||||
|
"ALGR(EU_RBRC)": {
|
||||||
|
"key": "EU_RDAQ",
|
||||||
|
"label": "»",
|
||||||
|
}
|
||||||
|
"ALGR(EU_BSLS)": {
|
||||||
|
"key": "EU_NOT",
|
||||||
|
"label": "¬",
|
||||||
|
}
|
||||||
|
"ALGR(EU_A)": {
|
||||||
|
"key": "EU_ADIA",
|
||||||
|
"label": "Ä",
|
||||||
|
}
|
||||||
|
"ALGR(EU_S)": {
|
||||||
|
"key": "EU_SS",
|
||||||
|
"label": "ß",
|
||||||
|
}
|
||||||
|
"ALGR(EU_D)": {
|
||||||
|
"key": "EU_ETH",
|
||||||
|
"label": "Ð",
|
||||||
|
}
|
||||||
|
"ALGR(EU_F)": {
|
||||||
|
"key": "EU_EGRV",
|
||||||
|
"label": "È",
|
||||||
|
}
|
||||||
|
"ALGR(EU_G)": {
|
||||||
|
"key": "EU_EACU",
|
||||||
|
"label": "É",
|
||||||
|
}
|
||||||
|
"ALGR(EU_H)": {
|
||||||
|
"key": "EU_UGRV",
|
||||||
|
"label": "Ù",
|
||||||
|
}
|
||||||
|
"ALGR(EU_J)": {
|
||||||
|
"key": "EU_UACU",
|
||||||
|
"label": "Ú",
|
||||||
|
}
|
||||||
|
"ALGR(EU_K)": {
|
||||||
|
"key": "EU_IJ",
|
||||||
|
"label": "IJ",
|
||||||
|
}
|
||||||
|
"ALGR(EU_L)": {
|
||||||
|
"key": "EU_OSTR",
|
||||||
|
"label": "Ø",
|
||||||
|
}
|
||||||
|
"ALGR(EU_SCLN)": {
|
||||||
|
"key": "EU_DEG",
|
||||||
|
"label": "°",
|
||||||
|
}
|
||||||
|
"ALGR(EU_QUOT)": {
|
||||||
|
"key": "EU_ACUT",
|
||||||
|
"label": "´ (dead)",
|
||||||
|
}
|
||||||
|
"ALGR(EU_Z)": {
|
||||||
|
"key": "EU_AGRV",
|
||||||
|
"label": "À",
|
||||||
|
}
|
||||||
|
"ALGR(EU_X)": {
|
||||||
|
"key": "EU_AACU",
|
||||||
|
"label": "Á",
|
||||||
|
}
|
||||||
|
"ALGR(EU_C)": {
|
||||||
|
"key": "EU_CCED",
|
||||||
|
"label": "Ç",
|
||||||
|
}
|
||||||
|
"ALGR(EU_V)": {
|
||||||
|
"key": "EU_IGRV",
|
||||||
|
"label": "Ì",
|
||||||
|
}
|
||||||
|
"ALGR(EU_B)": {
|
||||||
|
"key": "EU_IACU",
|
||||||
|
"label": "Í",
|
||||||
|
}
|
||||||
|
"ALGR(EU_N)": {
|
||||||
|
"key": "EU_NTIL",
|
||||||
|
"label": "Ñ",
|
||||||
|
}
|
||||||
|
"ALGR(EU_M)": {
|
||||||
|
"key": "EU_DGRK",
|
||||||
|
"label": "μ (dead Greek key)",
|
||||||
|
}
|
||||||
|
"ALGR(EU_COMM)": {
|
||||||
|
"key": "EU_OGRV",
|
||||||
|
"label": "Ò",
|
||||||
|
}
|
||||||
|
"ALGR(EU_DOT)": {
|
||||||
|
"key": "EU_OACU",
|
||||||
|
"label": "Ó",
|
||||||
|
}
|
||||||
|
"ALGR(EU_SLSH)": {
|
||||||
|
"key": "EU_IQUE",
|
||||||
|
"label": "¿",
|
||||||
|
}
|
||||||
|
/* Shift+AltGr symbols
|
||||||
|
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
|
||||||
|
* │ ~ │ ¹ │ ² │ ³ │ ¥ │ ¢ │ ˇ │ ¯ │ ‚ │ ‘ │ ’ │ — │ ÷ │ │
|
||||||
|
* ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
|
||||||
|
* │ │ │ │ │ │ │ │ │ │ │ │ ‹ │ › │ ¦ │
|
||||||
|
* ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤
|
||||||
|
* │ │ │ § │ │ │ │ │ │ │ │ · │ ¨ │ │
|
||||||
|
* ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤
|
||||||
|
* │ │ │ │ │ │ │ │ │ │ │ … │ │
|
||||||
|
* ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
|
||||||
|
* │ │ │ │ │ │ │ │ │
|
||||||
|
* └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
|
||||||
|
*/
|
||||||
|
"ALGR(EU_TILD)": {
|
||||||
|
"key": "EU_DTIL",
|
||||||
|
"label": "~ (dead)",
|
||||||
|
}
|
||||||
|
"S(ALGR(EU_1))": {
|
||||||
|
"key": "EU_SUP1",
|
||||||
|
"label": "¹",
|
||||||
|
}
|
||||||
|
"S(ALGR(EU_2))": {
|
||||||
|
"key": "EU_SUP2",
|
||||||
|
"label": "²",
|
||||||
|
}
|
||||||
|
"S(ALGR(EU_3))": {
|
||||||
|
"key": "EU_SUP3",
|
||||||
|
"label": "³",
|
||||||
|
}
|
||||||
|
"ALGR(EU_DLR)": {
|
||||||
|
"key": "EU_YEN",
|
||||||
|
"label": "¥",
|
||||||
|
}
|
||||||
|
"S(EU_EURO)": {
|
||||||
|
"key": "EU_CENT",
|
||||||
|
"label": "¢",
|
||||||
|
}
|
||||||
|
"S(EU_DCIR)": {
|
||||||
|
"key": "EU_CARN",
|
||||||
|
"label": "ˇ (dead)",
|
||||||
|
}
|
||||||
|
"S(ALGR(EU_7))": {
|
||||||
|
"key": "EU_MACR",
|
||||||
|
"label": "¯ (dead)",
|
||||||
|
}
|
||||||
|
"S(EU_DLQU)": {
|
||||||
|
"key": "EU_SLQU",
|
||||||
|
"label": "‚",
|
||||||
|
}
|
||||||
|
"S(EU_LDQU)": {
|
||||||
|
"key": "EU_LSQU",
|
||||||
|
"label": "‘",
|
||||||
|
}
|
||||||
|
"S(EU_RDQU)": {
|
||||||
|
"key": "EU_RSQU",
|
||||||
|
"label": "’",
|
||||||
|
}
|
||||||
|
"S(EU_NDSH)": {
|
||||||
|
"key": "EU_MDSH",
|
||||||
|
"label": "—",
|
||||||
|
}
|
||||||
|
"S(EU_MUL)": {
|
||||||
|
"key": "EU_DIV",
|
||||||
|
"label": "÷",
|
||||||
|
}
|
||||||
|
"S(EU_LDAQ)": {
|
||||||
|
"key": "EU_LSAQ",
|
||||||
|
"label": "‹",
|
||||||
|
}
|
||||||
|
"S(EU_RDAQ)": {
|
||||||
|
"key": "EU_RSAQ",
|
||||||
|
"label": "›",
|
||||||
|
}
|
||||||
|
"S(ALGR(EU_BSLS))": {
|
||||||
|
"key": "EU_BRKP",
|
||||||
|
"label": "¦",
|
||||||
|
}
|
||||||
|
"S(ALGR(EU_S))": {
|
||||||
|
"key": "EU_SECT",
|
||||||
|
"label": "§",
|
||||||
|
}
|
||||||
|
"S(ALGR(EU_SCLN))": {
|
||||||
|
"key": "EU_MDDT",
|
||||||
|
"label": "·",
|
||||||
|
}
|
||||||
|
"ALGR(EU_DQUO)": {
|
||||||
|
"key": "EU_DIAE",
|
||||||
|
"label": "¨ (dead)",
|
||||||
|
}
|
||||||
|
"ALGR(EU_QUES)": {
|
||||||
|
"key": "EU_ELLP",
|
||||||
|
"label": "…",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -527,7 +527,7 @@
|
||||||
"key": "FA_PIPE",
|
"key": "FA_PIPE",
|
||||||
"label": "|",
|
"label": "|",
|
||||||
}
|
}
|
||||||
"ALGR(FA_RA)": {
|
"ALGR(FA_RE)": {
|
||||||
"key": "FA_SUBA",
|
"key": "FA_SUBA",
|
||||||
"label": "ٖ",
|
"label": "ٖ",
|
||||||
}
|
}
|
||||||
|
|
7
data/constants/keycodes/keycodes_0.0.7.hjson
Normal file
7
data/constants/keycodes/keycodes_0.0.7.hjson
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
{
|
||||||
|
"ranges": {
|
||||||
|
"0x77C0/0x003F": {
|
||||||
|
"define": "QK_COMMUNITY_MODULE"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
25
data/constants/module_hooks/0.1.0.hjson
Normal file
25
data/constants/module_hooks/0.1.0.hjson
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
{
|
||||||
|
keyboard_pre_init: {
|
||||||
|
ret_type: void
|
||||||
|
args: void
|
||||||
|
}
|
||||||
|
keyboard_post_init: {
|
||||||
|
ret_type: void
|
||||||
|
args: void
|
||||||
|
}
|
||||||
|
pre_process_record: {
|
||||||
|
ret_type: bool
|
||||||
|
args: uint16_t keycode, keyrecord_t *record
|
||||||
|
call_params: keycode, record
|
||||||
|
}
|
||||||
|
process_record: {
|
||||||
|
ret_type: bool
|
||||||
|
args: uint16_t keycode, keyrecord_t *record
|
||||||
|
call_params: keycode, record
|
||||||
|
}
|
||||||
|
post_process_record: {
|
||||||
|
ret_type: void
|
||||||
|
args: uint16_t keycode, keyrecord_t *record
|
||||||
|
call_params: keycode, record
|
||||||
|
}
|
||||||
|
}
|
26
data/constants/module_hooks/1.0.0.hjson
Normal file
26
data/constants/module_hooks/1.0.0.hjson
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
{
|
||||||
|
housekeeping_task: {
|
||||||
|
ret_type: void
|
||||||
|
args: void
|
||||||
|
}
|
||||||
|
suspend_power_down: {
|
||||||
|
ret_type: void
|
||||||
|
args: void
|
||||||
|
}
|
||||||
|
suspend_wakeup_init: {
|
||||||
|
ret_type: void
|
||||||
|
args: void
|
||||||
|
}
|
||||||
|
shutdown: {
|
||||||
|
ret_type: bool
|
||||||
|
args: bool jump_to_bootloader
|
||||||
|
call_params: jump_to_bootloader
|
||||||
|
}
|
||||||
|
process_detected_host_os: {
|
||||||
|
ret_type: bool
|
||||||
|
args: os_variant_t os
|
||||||
|
call_params: os
|
||||||
|
guard: defined(OS_DETECTION_ENABLE)
|
||||||
|
header: os_detection.h
|
||||||
|
}
|
||||||
|
}
|
55
data/constants/module_hooks/1.1.0.hjson
Normal file
55
data/constants/module_hooks/1.1.0.hjson
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
{
|
||||||
|
pointing_device_init: {
|
||||||
|
ret_type: void
|
||||||
|
args: void
|
||||||
|
guard: defined(POINTING_DEVICE_ENABLE)
|
||||||
|
}
|
||||||
|
pointing_device_task: {
|
||||||
|
ret_type: report_mouse_t
|
||||||
|
args: report_mouse_t mouse_report
|
||||||
|
call_params: mouse_report
|
||||||
|
guard: defined(POINTING_DEVICE_ENABLE)
|
||||||
|
header: report.h
|
||||||
|
}
|
||||||
|
rgb_matrix_indicators: {
|
||||||
|
ret_type: bool
|
||||||
|
args: void
|
||||||
|
guard: defined(RGB_MATRIX_ENABLE)
|
||||||
|
header: rgb_matrix.h
|
||||||
|
}
|
||||||
|
rgb_matrix_indicators_advanced: {
|
||||||
|
ret_type: bool
|
||||||
|
args: uint8_t led_min, uint8_t led_max
|
||||||
|
call_params: led_min, led_max
|
||||||
|
guard: defined(RGB_MATRIX_ENABLE)
|
||||||
|
header: rgb_matrix.h
|
||||||
|
}
|
||||||
|
led_matrix_indicators: {
|
||||||
|
ret_type: bool
|
||||||
|
args: void
|
||||||
|
guard: defined(LED_MATRIX_ENABLE)
|
||||||
|
header: led_matrix.h
|
||||||
|
}
|
||||||
|
led_matrix_indicators_advanced: {
|
||||||
|
ret_type: bool
|
||||||
|
args: uint8_t led_min, uint8_t led_max
|
||||||
|
call_params: led_min, led_max
|
||||||
|
guard: defined(LED_MATRIX_ENABLE)
|
||||||
|
header: led_matrix.h
|
||||||
|
}
|
||||||
|
default_layer_state_set: {
|
||||||
|
ret_type: layer_state_t
|
||||||
|
args: layer_state_t state
|
||||||
|
call_params: state
|
||||||
|
guard: !defined(NO_ACTION_LAYER)
|
||||||
|
header: action_layer.h
|
||||||
|
}
|
||||||
|
layer_state_set: {
|
||||||
|
ret_type: layer_state_t
|
||||||
|
args: layer_state_t state
|
||||||
|
call_params: state
|
||||||
|
guard: !defined(NO_ACTION_LAYER)
|
||||||
|
header: action_layer.h
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
3
data/constants/module_hooks/1.1.1.hjson
Normal file
3
data/constants/module_hooks/1.1.1.hjson
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
{
|
||||||
|
// This version exists to signify addition of LED/RGB effect support.
|
||||||
|
}
|
|
@ -64,6 +64,9 @@
|
||||||
"WEAR_LEVELING_BACKING_SIZE": {"info_key": "eeprom.wear_leveling.backing_size", "value_type": "int", "to_json": false},
|
"WEAR_LEVELING_BACKING_SIZE": {"info_key": "eeprom.wear_leveling.backing_size", "value_type": "int", "to_json": false},
|
||||||
"WEAR_LEVELING_LOGICAL_SIZE": {"info_key": "eeprom.wear_leveling.logical_size", "value_type": "int", "to_json": false},
|
"WEAR_LEVELING_LOGICAL_SIZE": {"info_key": "eeprom.wear_leveling.logical_size", "value_type": "int", "to_json": false},
|
||||||
|
|
||||||
|
// host
|
||||||
|
"NKRO_DEFAULT_ON": {"info_key": "host.default.nkro", "value_type": "bool"},
|
||||||
|
|
||||||
// Layer locking
|
// Layer locking
|
||||||
"LAYER_LOCK_IDLE_TIMEOUT": {"info_key": "layer_lock.timeout", "value_type": "int"},
|
"LAYER_LOCK_IDLE_TIMEOUT": {"info_key": "layer_lock.timeout", "value_type": "int"},
|
||||||
|
|
||||||
|
@ -200,6 +203,8 @@
|
||||||
"SPLIT_WPM_ENABLE": {"info_key": "split.transport.sync.wpm", "value_type": "flag"},
|
"SPLIT_WPM_ENABLE": {"info_key": "split.transport.sync.wpm", "value_type": "flag"},
|
||||||
|
|
||||||
// Tapping
|
// Tapping
|
||||||
|
"CHORDAL_HOLD": {"info_key": "tapping.chordal_hold", "value_type": "flag"},
|
||||||
|
"FLOW_TAP_TERM": {"info_key": "tapping.flow_tap_term", "value_type": "int"},
|
||||||
"HOLD_ON_OTHER_KEY_PRESS": {"info_key": "tapping.hold_on_other_key_press", "value_type": "flag"},
|
"HOLD_ON_OTHER_KEY_PRESS": {"info_key": "tapping.hold_on_other_key_press", "value_type": "flag"},
|
||||||
"HOLD_ON_OTHER_KEY_PRESS_PER_KEY": {"info_key": "tapping.hold_on_other_key_press_per_key", "value_type": "flag"},
|
"HOLD_ON_OTHER_KEY_PRESS_PER_KEY": {"info_key": "tapping.hold_on_other_key_press_per_key", "value_type": "flag"},
|
||||||
"PERMISSIVE_HOLD": {"info_key": "tapping.permissive_hold", "value_type": "flag"},
|
"PERMISSIVE_HOLD": {"info_key": "tapping.permissive_hold", "value_type": "flag"},
|
||||||
|
@ -213,7 +218,6 @@
|
||||||
"TAPPING_TOGGLE": {"info_key": "tapping.toggle", "value_type": "int"},
|
"TAPPING_TOGGLE": {"info_key": "tapping.toggle", "value_type": "int"},
|
||||||
|
|
||||||
// USB
|
// USB
|
||||||
"FORCE_NKRO": {"info_key": "usb.force_nkro", "value_type": "flag"},
|
|
||||||
"USB_MAX_POWER_CONSUMPTION": {"info_key": "usb.max_power", "value_type": "int"},
|
"USB_MAX_POWER_CONSUMPTION": {"info_key": "usb.max_power", "value_type": "int"},
|
||||||
"USB_POLLING_INTERVAL_MS": {"info_key": "usb.polling_interval", "value_type": "int"},
|
"USB_POLLING_INTERVAL_MS": {"info_key": "usb.polling_interval", "value_type": "int"},
|
||||||
"USB_SUSPEND_WAKEUP_DELAY": {"info_key": "usb.suspend_wakeup_delay", "value_type": "int"},
|
"USB_SUSPEND_WAKEUP_DELAY": {"info_key": "usb.suspend_wakeup_delay", "value_type": "int"},
|
||||||
|
@ -251,6 +255,7 @@
|
||||||
"PRODUCT": {"info_key": "keyboard_name", "warn_duplicate": false, "value_type": "str", "deprecated": true, "replace_with": "`keyboard_name` in info.json"},
|
"PRODUCT": {"info_key": "keyboard_name", "warn_duplicate": false, "value_type": "str", "deprecated": true, "replace_with": "`keyboard_name` in info.json"},
|
||||||
"PRODUCT_ID": {"info_key": "usb.pid", "value_type": "hex", "deprecated": true, "replace_with": "`usb.pid` in info.json"},
|
"PRODUCT_ID": {"info_key": "usb.pid", "value_type": "hex", "deprecated": true, "replace_with": "`usb.pid` in info.json"},
|
||||||
"VENDOR_ID": {"info_key": "usb.vid", "value_type": "hex", "deprecated": true, "replace_with": "`usb.vid` in info.json"},
|
"VENDOR_ID": {"info_key": "usb.vid", "value_type": "hex", "deprecated": true, "replace_with": "`usb.vid` in info.json"},
|
||||||
|
"FORCE_NKRO": {"info_key": "usb.force_nkro", "value_type": "flag", "deprecated": true, "replace_with": "`host.default.nkro` in info.json"},
|
||||||
|
|
||||||
// Items we want flagged in lint
|
// Items we want flagged in lint
|
||||||
"VIAL_KEYBOARD_UID": {"info_key": "_invalid.vial_uid", "invalid": true},
|
"VIAL_KEYBOARD_UID": {"info_key": "_invalid.vial_uid", "invalid": true},
|
||||||
|
|
74
data/mappings/info_defaults.hjson
Normal file
74
data/mappings/info_defaults.hjson
Normal file
|
@ -0,0 +1,74 @@
|
||||||
|
{
|
||||||
|
"bootmagic": {
|
||||||
|
"matrix": [0, 0]
|
||||||
|
},
|
||||||
|
"backlight": {
|
||||||
|
"default": {
|
||||||
|
"on": true
|
||||||
|
},
|
||||||
|
"breathing_period": 6,
|
||||||
|
"levels": 3,
|
||||||
|
"on_state": 1
|
||||||
|
},
|
||||||
|
"debounce": 5,
|
||||||
|
"features": {
|
||||||
|
"command": false,
|
||||||
|
"console": false
|
||||||
|
},
|
||||||
|
"indicators": {
|
||||||
|
"on_state": 1
|
||||||
|
},
|
||||||
|
"led_matrix": {
|
||||||
|
"default": {
|
||||||
|
"animation": "solid",
|
||||||
|
"on": true,
|
||||||
|
"val": 255,
|
||||||
|
"speed": 128
|
||||||
|
},
|
||||||
|
"led_flush_limit": 16,
|
||||||
|
"max_brightness": 255,
|
||||||
|
"sleep": false,
|
||||||
|
"speed_steps": 16,
|
||||||
|
"val_steps": 16
|
||||||
|
},
|
||||||
|
"rgblight": {
|
||||||
|
"default": {
|
||||||
|
"animation": "static_light",
|
||||||
|
"on": true,
|
||||||
|
"hue": 0,
|
||||||
|
"sat": 255,
|
||||||
|
"val": 255,
|
||||||
|
"speed": 0
|
||||||
|
},
|
||||||
|
"brightness_steps": 17,
|
||||||
|
"hue_steps": 8,
|
||||||
|
"max_brightness": 255,
|
||||||
|
"saturation_steps": 17,
|
||||||
|
"sleep": false
|
||||||
|
},
|
||||||
|
"rgb_matrix": {
|
||||||
|
"default": {
|
||||||
|
"animation": "cycle_left_right",
|
||||||
|
"on": true,
|
||||||
|
"hue": 0,
|
||||||
|
"sat": 255,
|
||||||
|
"val": 255,
|
||||||
|
"speed": 128
|
||||||
|
},
|
||||||
|
"hue_steps": 8,
|
||||||
|
"led_flush_limit": 16,
|
||||||
|
"max_brightness": 255,
|
||||||
|
"sat_steps": 16,
|
||||||
|
"sleep": false,
|
||||||
|
"speed_steps": 16,
|
||||||
|
"val_steps": 16
|
||||||
|
},
|
||||||
|
"split": {
|
||||||
|
"serial": {
|
||||||
|
"driver": "bitbang"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ws2812": {
|
||||||
|
"driver": "bitbang"
|
||||||
|
}
|
||||||
|
}
|
|
@ -53,7 +53,8 @@
|
||||||
"WS2812_DRIVER": {"info_key": "ws2812.driver"},
|
"WS2812_DRIVER": {"info_key": "ws2812.driver"},
|
||||||
|
|
||||||
// Items we want flagged in lint
|
// Items we want flagged in lint
|
||||||
"CTPC": {"info_key": "_deprecated.ctpc", "deprecated": true, "replace_with": "CONVERT_TO=proton_c"},
|
"DEFAULT_FOLDER": {"info_key": "_deprecated.default_folder", "deprecated": true},
|
||||||
"CONVERT_TO_PROTON_C": {"info_key": "_deprecated.ctpc", "deprecated": true, "replace_with": "CONVERT_TO=proton_c"},
|
"CTPC": {"info_key": "_invalid.ctpc", "invalid": true, "replace_with": "CONVERT_TO=proton_c"},
|
||||||
|
"CONVERT_TO_PROTON_C": {"info_key": "_invalid.ctpc", "invalid": true, "replace_with": "CONVERT_TO=proton_c"},
|
||||||
"VIAL_ENABLE": {"info_key": "_invalid.vial", "invalid": true}
|
"VIAL_ENABLE": {"info_key": "_invalid.vial", "invalid": true}
|
||||||
}
|
}
|
||||||
|
|
|
@ -140,9 +140,15 @@
|
||||||
"custommk/genesis": {
|
"custommk/genesis": {
|
||||||
"target": "custommk/genesis/rev1"
|
"target": "custommk/genesis/rev1"
|
||||||
},
|
},
|
||||||
|
"cxt_studio":{
|
||||||
|
"target":"cxt_studio/12e4"
|
||||||
|
},
|
||||||
"daisy": {
|
"daisy": {
|
||||||
"target": "ktec/daisy"
|
"target": "ktec/daisy"
|
||||||
},
|
},
|
||||||
|
"deemen17/de60": {
|
||||||
|
"target": "deemen17/de60/r1"
|
||||||
|
},
|
||||||
"dp3000": {
|
"dp3000": {
|
||||||
"target": "dp3000/rev1"
|
"target": "dp3000/rev1"
|
||||||
},
|
},
|
||||||
|
@ -194,6 +200,9 @@
|
||||||
"ergodone": {
|
"ergodone": {
|
||||||
"target": "ktec/ergodone"
|
"target": "ktec/ergodone"
|
||||||
},
|
},
|
||||||
|
"ergodox_stm32": {
|
||||||
|
"target": "handwired/ergodox_stm32"
|
||||||
|
},
|
||||||
"ergoinu": {
|
"ergoinu": {
|
||||||
"target": "dm9records/ergoinu"
|
"target": "dm9records/ergoinu"
|
||||||
},
|
},
|
||||||
|
@ -341,6 +350,9 @@
|
||||||
"keycapsss/plaid_pad": {
|
"keycapsss/plaid_pad": {
|
||||||
"target": "keycapsss/plaid_pad/rev1"
|
"target": "keycapsss/plaid_pad/rev1"
|
||||||
},
|
},
|
||||||
|
"keyten/kt60hs_t": {
|
||||||
|
"target": "keyten/kt60hs_t/v1"
|
||||||
|
},
|
||||||
"kira75": {
|
"kira75": {
|
||||||
"target": "kira/kira75"
|
"target": "kira/kira75"
|
||||||
},
|
},
|
||||||
|
@ -575,6 +587,9 @@
|
||||||
"ploopyco/trackball": {
|
"ploopyco/trackball": {
|
||||||
"target": "ploopyco/trackball/rev1_005"
|
"target": "ploopyco/trackball/rev1_005"
|
||||||
},
|
},
|
||||||
|
"plywrks/ply8x": {
|
||||||
|
"target": "plywrks/ply8x/solder"
|
||||||
|
},
|
||||||
"polilla": {
|
"polilla": {
|
||||||
"target": "polilla/rev1"
|
"target": "polilla/rev1"
|
||||||
},
|
},
|
||||||
|
@ -1027,7 +1042,7 @@
|
||||||
"target": "kprepublic/bm68hsrgb/rev1"
|
"target": "kprepublic/bm68hsrgb/rev1"
|
||||||
},
|
},
|
||||||
"late9/rev1": {
|
"late9/rev1": {
|
||||||
"target": "rookiebwoy/late9/rev1"
|
"target": "ivndbt/late9/rev1"
|
||||||
},
|
},
|
||||||
"latin17rgb": {
|
"latin17rgb": {
|
||||||
"target": "latincompass/latin17rgb"
|
"target": "latincompass/latin17rgb"
|
||||||
|
@ -1192,7 +1207,7 @@
|
||||||
"target": "spaceholdings/nebula68b"
|
"target": "spaceholdings/nebula68b"
|
||||||
},
|
},
|
||||||
"neopad/rev1": {
|
"neopad/rev1": {
|
||||||
"target": "rookiebwoy/neopad/rev1"
|
"target": "ivndbt/neopad/rev1"
|
||||||
},
|
},
|
||||||
"niu_mini": {
|
"niu_mini": {
|
||||||
"target": "kbdfans/niu_mini"
|
"target": "kbdfans/niu_mini"
|
||||||
|
@ -1515,6 +1530,9 @@
|
||||||
"ymd96": {
|
"ymd96": {
|
||||||
"target": "ymdk/ymd96"
|
"target": "ymdk/ymd96"
|
||||||
},
|
},
|
||||||
|
"ymdk/id75": {
|
||||||
|
"target": "ymdk/id75/f103"
|
||||||
|
},
|
||||||
"ymdk_np21": {
|
"ymdk_np21": {
|
||||||
"target": "ymdk/np21"
|
"target": "ymdk/np21"
|
||||||
},
|
},
|
||||||
|
@ -1552,5 +1570,693 @@
|
||||||
},
|
},
|
||||||
"dnworks/9973": {
|
"dnworks/9973": {
|
||||||
"target": "dnworks/tkl87"
|
"target": "dnworks/tkl87"
|
||||||
|
},
|
||||||
|
// DEFAULT_FOLDER removed during 2025 Q1 cycle
|
||||||
|
"0_sixty": {
|
||||||
|
"target": "0_sixty/base"
|
||||||
|
},
|
||||||
|
"0xcb/splaytoraid": {
|
||||||
|
"target": "0xcb/splaytoraid/rp2040_ce"
|
||||||
|
},
|
||||||
|
"1upkeyboards/pi40": {
|
||||||
|
"target": "1upkeyboards/pi40/mit_v1_0"
|
||||||
|
},
|
||||||
|
"1upkeyboards/pi50": {
|
||||||
|
"target": "1upkeyboards/pi50/grid"
|
||||||
|
},
|
||||||
|
"1upkeyboards/sweet16": {
|
||||||
|
"target": "1upkeyboards/sweet16/v1"
|
||||||
|
},
|
||||||
|
"25keys/aleth42": {
|
||||||
|
"target": "25keys/aleth42/rev1"
|
||||||
|
},
|
||||||
|
"25keys/zinc": {
|
||||||
|
"target": "25keys/zinc/rev1"
|
||||||
|
},
|
||||||
|
"40percentclub/i75": {
|
||||||
|
"target": "40percentclub/i75/promicro"
|
||||||
|
},
|
||||||
|
"40percentclub/polyandry": {
|
||||||
|
"target": "40percentclub/polyandry/promicro"
|
||||||
|
},
|
||||||
|
"8pack": {
|
||||||
|
"target": "8pack/rev12"
|
||||||
|
},
|
||||||
|
"adkb96": {
|
||||||
|
"target": "adkb96/rev1"
|
||||||
|
},
|
||||||
|
"adm42": {
|
||||||
|
"target": "adm42/rev4"
|
||||||
|
},
|
||||||
|
"aeboards/satellite": {
|
||||||
|
"target": "aeboards/satellite/rev1"
|
||||||
|
},
|
||||||
|
"atreus": {
|
||||||
|
"target": "atreus/astar"
|
||||||
|
},
|
||||||
|
"atreyu": {
|
||||||
|
"target": "atreyu/rev1"
|
||||||
|
},
|
||||||
|
"biacco42/ergo42": {
|
||||||
|
"target": "biacco42/ergo42/rev1"
|
||||||
|
},
|
||||||
|
"binepad/bn009": {
|
||||||
|
"target": "binepad/bn009/r2"
|
||||||
|
},
|
||||||
|
"binepad/bnr1": {
|
||||||
|
"target": "binepad/bnr1/v2"
|
||||||
|
},
|
||||||
|
"boston_meetup": {
|
||||||
|
"target": "boston_meetup/2019"
|
||||||
|
},
|
||||||
|
"bpiphany/frosty_flake": {
|
||||||
|
"target": "bpiphany/frosty_flake/20140521"
|
||||||
|
},
|
||||||
|
"buzzard": {
|
||||||
|
"target": "buzzard/rev1"
|
||||||
|
},
|
||||||
|
"cannonkeys/db60": {
|
||||||
|
"target": "cannonkeys/db60/rev2"
|
||||||
|
},
|
||||||
|
"clickety_split/leeloo": {
|
||||||
|
"target": "clickety_split/leeloo/rev3"
|
||||||
|
},
|
||||||
|
"converter/palm_usb": {
|
||||||
|
"target": "converter/palm_usb/stowaway"
|
||||||
|
},
|
||||||
|
"crkbd": {
|
||||||
|
"target": "crkbd/rev1"
|
||||||
|
},
|
||||||
|
"dailycraft/bat43": {
|
||||||
|
"target": "dailycraft/bat43/rev2"
|
||||||
|
},
|
||||||
|
"dailycraft/claw44": {
|
||||||
|
"target": "dailycraft/claw44/rev1"
|
||||||
|
},
|
||||||
|
"dailycraft/sandbox": {
|
||||||
|
"target": "dailycraft/sandbox/rev2"
|
||||||
|
},
|
||||||
|
"dailycraft/wings42": {
|
||||||
|
"target": "dailycraft/wings42/rev2"
|
||||||
|
},
|
||||||
|
"delikeeb/vanana": {
|
||||||
|
"target": "delikeeb/vanana/rev2"
|
||||||
|
},
|
||||||
|
"delikeeb/waaffle/rev3": {
|
||||||
|
"target": "delikeeb/waaffle/rev3/pro_micro"
|
||||||
|
},
|
||||||
|
"deltasplit75": {
|
||||||
|
"target": "deltasplit75/v2"
|
||||||
|
},
|
||||||
|
"drhigsby/ogurec": {
|
||||||
|
"target": "drhigsby/ogurec/left_pm"
|
||||||
|
},
|
||||||
|
"duck/octagon": {
|
||||||
|
"target": "duck/octagon/v2"
|
||||||
|
},
|
||||||
|
"duck/orion": {
|
||||||
|
"target": "duck/orion/v3"
|
||||||
|
},
|
||||||
|
"ducky/one2mini": {
|
||||||
|
"target": "ducky/one2mini/1861st"
|
||||||
|
},
|
||||||
|
"ducky/one2sf": {
|
||||||
|
"target": "ducky/one2sf/1967st"
|
||||||
|
},
|
||||||
|
"dumbpad": {
|
||||||
|
"target": "dumbpad/v0x"
|
||||||
|
},
|
||||||
|
"durgod/galaxy": {
|
||||||
|
"target": "durgod/dgk6x/galaxy"
|
||||||
|
},
|
||||||
|
"durgod/venus": {
|
||||||
|
"target": "durgod/dgk6x/venus"
|
||||||
|
},
|
||||||
|
"dztech/tofu/ii": {
|
||||||
|
"target": "dztech/tofu/ii/v1"
|
||||||
|
},
|
||||||
|
"dztech/tofu/jr": {
|
||||||
|
"target": "dztech/tofu/jr/v1"
|
||||||
|
},
|
||||||
|
"eco": {
|
||||||
|
"target": "eco/rev2"
|
||||||
|
},
|
||||||
|
"ergoslab": {
|
||||||
|
"target": "ergoslab/rev1"
|
||||||
|
},
|
||||||
|
"ergotravel": {
|
||||||
|
"target": "ergotravel/rev1"
|
||||||
|
},
|
||||||
|
"evyd13/atom47": {
|
||||||
|
"target": "evyd13/atom47/rev4"
|
||||||
|
},
|
||||||
|
"fortitude60": {
|
||||||
|
"target": "fortitude60/rev1"
|
||||||
|
},
|
||||||
|
"fruitykeeb/fruitbar/r1": {
|
||||||
|
"target": "fruitykeeb/fruitbar/r1/promicro"
|
||||||
|
},
|
||||||
|
"ghs/jem": {
|
||||||
|
"target": "ghs/jem/soldered"
|
||||||
|
},
|
||||||
|
"hadron": {
|
||||||
|
"target": "hadron/ver2"
|
||||||
|
},
|
||||||
|
"handwired/bento": {
|
||||||
|
"target": "handwired/bento/rev1"
|
||||||
|
},
|
||||||
|
"handwired/dactyl_manuform/6x6": {
|
||||||
|
"target": "handwired/dactyl_manuform/6x6/promicro"
|
||||||
|
},
|
||||||
|
"handwired/meck_tkl": {
|
||||||
|
"target": "handwired/meck_tkl/blackpill_f401"
|
||||||
|
},
|
||||||
|
"handwired/ms_sculpt_mobile": {
|
||||||
|
"target": "handwired/ms_sculpt_mobile/teensy2pp"
|
||||||
|
},
|
||||||
|
"handwired/onekey": {
|
||||||
|
"target": "handwired/onekey/promicro"
|
||||||
|
},
|
||||||
|
"handwired/pill60": {
|
||||||
|
"target": "handwired/pill60/bluepill"
|
||||||
|
},
|
||||||
|
"handwired/postageboard": {
|
||||||
|
"target": "handwired/postageboard/mini"
|
||||||
|
},
|
||||||
|
"handwired/qc60": {
|
||||||
|
"target": "handwired/qc60/proto"
|
||||||
|
},
|
||||||
|
"handwired/sono1": {
|
||||||
|
"target": "handwired/sono1/t2pp"
|
||||||
|
},
|
||||||
|
"handwired/splittest": {
|
||||||
|
"target": "handwired/splittest/promicro"
|
||||||
|
},
|
||||||
|
"handwired/stef9998/split_5x7": {
|
||||||
|
"target": "handwired/stef9998/split_5x7/rev1"
|
||||||
|
},
|
||||||
|
"handwired/symmetric70_proto/promicro": {
|
||||||
|
"target": "handwired/symmetric70_proto/promicro/base"
|
||||||
|
},
|
||||||
|
"handwired/symmetric70_proto/proton_c": {
|
||||||
|
"target": "handwired/symmetric70_proto/proton_c/base"
|
||||||
|
},
|
||||||
|
"handwired/unk": {
|
||||||
|
"target": "handwired/unk/rev1"
|
||||||
|
},
|
||||||
|
"handwired/xealous": {
|
||||||
|
"target": "handwired/xealous/rev1"
|
||||||
|
},
|
||||||
|
"hillside/46": {
|
||||||
|
"target": "hillside/46/0_1"
|
||||||
|
},
|
||||||
|
"hhkb/ansi": {
|
||||||
|
"target": "hhkb/ansi/32u4"
|
||||||
|
},
|
||||||
|
"hillside/48": {
|
||||||
|
"target": "hillside/48/0_1"
|
||||||
|
},
|
||||||
|
"hillside/52": {
|
||||||
|
"target": "hillside/52/0_1"
|
||||||
|
},
|
||||||
|
"ibnuda/squiggle": {
|
||||||
|
"target": "ibnuda/squiggle/rev1"
|
||||||
|
},
|
||||||
|
"idobao/id80/v1": {
|
||||||
|
"target": "idobao/id80/v2/ansi"
|
||||||
|
},
|
||||||
|
"idobao/id80/v3": {
|
||||||
|
"target": "idobao/id80/v3/ansi"
|
||||||
|
},
|
||||||
|
"inett_studio/sq80": {
|
||||||
|
"target": "inett_studio/sq80/hotswap_layout_i"
|
||||||
|
},
|
||||||
|
"input_club/infinity60": {
|
||||||
|
"target": "input_club/infinity60/led"
|
||||||
|
},
|
||||||
|
"jacky_studio/bear_65": {
|
||||||
|
"target": "jacky_studio/bear_65/rev1"
|
||||||
|
},
|
||||||
|
"jacky_studio/piggy60/rev1": {
|
||||||
|
"target": "jacky_studio/piggy60/rev1/solder"
|
||||||
|
},
|
||||||
|
"jadookb/jkb65": {
|
||||||
|
"target": "jadookb/jkb65/r1"
|
||||||
|
},
|
||||||
|
"jian": {
|
||||||
|
"target": "jian/rev2"
|
||||||
|
},
|
||||||
|
"jiran": {
|
||||||
|
"target": "jiran/rev1"
|
||||||
|
},
|
||||||
|
"jorne": {
|
||||||
|
"target": "jorne/rev1"
|
||||||
|
},
|
||||||
|
"junco": {
|
||||||
|
"target": "junco/rev1"
|
||||||
|
},
|
||||||
|
"kakunpc/angel17": {
|
||||||
|
"target": "kakunpc/angel17/rev1"
|
||||||
|
},
|
||||||
|
"kakunpc/angel64": {
|
||||||
|
"target": "kakunpc/angel64/rev1"
|
||||||
|
},
|
||||||
|
"kakunpc/business_card": {
|
||||||
|
"target": "kakunpc/business_card/beta"
|
||||||
|
},
|
||||||
|
"kakunpc/suihankey": {
|
||||||
|
"target": "kakunpc/suihankey/rev1"
|
||||||
|
},
|
||||||
|
"kakunpc/suihankey/split": {
|
||||||
|
"target": "kakunpc/suihankey/split/rev1"
|
||||||
|
},
|
||||||
|
"kapcave/paladinpad": {
|
||||||
|
"target": "kapcave/paladinpad/rev2"
|
||||||
|
},
|
||||||
|
"kapl": {
|
||||||
|
"target": "kapl/rev1"
|
||||||
|
},
|
||||||
|
"kbdfans/d45": {
|
||||||
|
"target": "kbdfans/d45/v2"
|
||||||
|
},
|
||||||
|
"kbdfans/kbd75": {
|
||||||
|
"target": "kbdfans/kbd75/rev1"
|
||||||
|
},
|
||||||
|
"keebio/bdn9": {
|
||||||
|
"target": "keebio/bdn9/rev1"
|
||||||
|
},
|
||||||
|
"keebio/convolution": {
|
||||||
|
"target": "keebio/convolution/rev1"
|
||||||
|
},
|
||||||
|
"keebio/foldkb": {
|
||||||
|
"target": "keebio/foldkb/rev1"
|
||||||
|
},
|
||||||
|
"keebio/kbo5000": {
|
||||||
|
"target": "keebio/kbo5000/rev1"
|
||||||
|
},
|
||||||
|
"keebio/levinson": {
|
||||||
|
"target": "keebio/levinson/rev2"
|
||||||
|
},
|
||||||
|
"keebio/quefrency": {
|
||||||
|
"target": "keebio/quefrency/rev1"
|
||||||
|
},
|
||||||
|
"keebio/rorschach": {
|
||||||
|
"target": "keebio/rorschach/rev1"
|
||||||
|
},
|
||||||
|
"keebio/sinc": {
|
||||||
|
"target": "keebio/sinc/rev1"
|
||||||
|
},
|
||||||
|
"keebio/viterbi": {
|
||||||
|
"target": "keebio/viterbi/rev2"
|
||||||
|
},
|
||||||
|
"keycapsss/kimiko": {
|
||||||
|
"target": "keycapsss/kimiko/rev2"
|
||||||
|
},
|
||||||
|
"keyhive/navi10": {
|
||||||
|
"target": "keyhive/navi10/rev3"
|
||||||
|
},
|
||||||
|
"keyhive/uno": {
|
||||||
|
"target": "keyhive/uno/rev1"
|
||||||
|
},
|
||||||
|
"kin80": {
|
||||||
|
"target": "kin80/blackpill401"
|
||||||
|
},
|
||||||
|
"kumaokobo/kudox_full": {
|
||||||
|
"target": "kumaokobo/kudox_full/rev1"
|
||||||
|
},
|
||||||
|
"kumaokobo/kudox_game": {
|
||||||
|
"target": "kumaokobo/kudox_game/rev2"
|
||||||
|
},
|
||||||
|
"kumaokobo/kudox": {
|
||||||
|
"target": "kumaokobo/kudox/rev3"
|
||||||
|
},
|
||||||
|
"kumaokobo/pico": {
|
||||||
|
"target": "kumaokobo/pico/65keys"
|
||||||
|
},
|
||||||
|
"lazydesigners/dimple": {
|
||||||
|
"target": "lazydesigners/dimple/staggered/rev1"
|
||||||
|
},
|
||||||
|
"lets_split": {
|
||||||
|
"target": "lets_split/rev2"
|
||||||
|
},
|
||||||
|
"lfkeyboards/lfk87": {
|
||||||
|
"target": "lfkeyboards/lfk78/revc"
|
||||||
|
},
|
||||||
|
"lily58": {
|
||||||
|
"target": "lily58/rev1"
|
||||||
|
},
|
||||||
|
"lime": {
|
||||||
|
"target": "lime/rev1"
|
||||||
|
},
|
||||||
|
"maple_computing/christmas_tree": {
|
||||||
|
"target": "maple_computing/christmas_tree/v2017"
|
||||||
|
},
|
||||||
|
"maple_computing/ivy": {
|
||||||
|
"target": "maple_computing/ivy/rev1"
|
||||||
|
},
|
||||||
|
"maple_computing/launchpad": {
|
||||||
|
"target": "maple_computing/launchpad/rev1"
|
||||||
|
},
|
||||||
|
"maple_computing/minidox": {
|
||||||
|
"target": "maple_computing/minidox/rev1"
|
||||||
|
},
|
||||||
|
"mariorion_v25": {
|
||||||
|
"target": "mariorion_v25/prod"
|
||||||
|
},
|
||||||
|
"marksard/rhymestone": {
|
||||||
|
"target": "marksard/rhymestone/rev1"
|
||||||
|
},
|
||||||
|
"marksard/treadstone32": {
|
||||||
|
"target": "marksard/treadstone32/rev1"
|
||||||
|
},
|
||||||
|
"marksard/treadstone48": {
|
||||||
|
"target": "marksard/treadstone48/rev1"
|
||||||
|
},
|
||||||
|
"maxipad": {
|
||||||
|
"target": "maxipad/promicro"
|
||||||
|
},
|
||||||
|
"mechkeys/mechmini": {
|
||||||
|
"target": "mechkeys/mechmini/v2"
|
||||||
|
},
|
||||||
|
"mechllama/g35": {
|
||||||
|
"target": "mechllama/g35/v2"
|
||||||
|
},
|
||||||
|
"mechlovin/adelais": {
|
||||||
|
"target": "mechlovin/adelais/standard_led/arm/rev2"
|
||||||
|
},
|
||||||
|
"mechlovin/adelais/standard_led/arm/rev4": {
|
||||||
|
"target": "mechlovin/adelais/standard_led/arm/rev4/stm32f303"
|
||||||
|
},
|
||||||
|
"mechlovin/adelais/standard_led/arm": {
|
||||||
|
"target": "mechlovin/adelais/standard_led/arm/rev2"
|
||||||
|
},
|
||||||
|
"mechlovin/adelais/standard_led/avr": {
|
||||||
|
"target": "mechlovin/adelais/standard_led/avr/rev1"
|
||||||
|
},
|
||||||
|
"mechlovin/hannah65/rev1": {
|
||||||
|
"target": "mechlovin/hannah65/rev1/haus"
|
||||||
|
},
|
||||||
|
"mechlovin/infinity87/rev1": {
|
||||||
|
"target": "mechlovin/infinity87/rev1/standard"
|
||||||
|
},
|
||||||
|
"mechlovin/infinity87": {
|
||||||
|
"target": "mechlovin/infinity87/rgb_rev1"
|
||||||
|
},
|
||||||
|
"mechlovin/mechlovin9": {
|
||||||
|
"target": "mechlovin/mechlovin9/rev1"
|
||||||
|
},
|
||||||
|
"mechlovin/olly/jf": {
|
||||||
|
"target": "mechlovin/olly/jf/rev1"
|
||||||
|
},
|
||||||
|
"mechlovin/zed1800": {
|
||||||
|
"target": "mechlovin/zed1800/saber"
|
||||||
|
},
|
||||||
|
"mechlovin/zed65/no_backlight": {
|
||||||
|
"target": "mechlovin/zed65/no_backlight/wearhaus66"
|
||||||
|
},
|
||||||
|
"mechlovin/zed65": {
|
||||||
|
"target": "mechlovin/zed65/no_backlight/wearhaus66"
|
||||||
|
},
|
||||||
|
"mechwild/bde": {
|
||||||
|
"target": "mechwild/bde/rev2"
|
||||||
|
},
|
||||||
|
"mechwild/mokulua": {
|
||||||
|
"target": "mechwild/mokulua/standard"
|
||||||
|
},
|
||||||
|
"mechwild/obe/f401": {
|
||||||
|
"target": "mechwild/obe/f401/base"
|
||||||
|
},
|
||||||
|
"mechwild/obe/f411": {
|
||||||
|
"target": "mechwild/obe/f411/base"
|
||||||
|
},
|
||||||
|
"mechwild/obe": {
|
||||||
|
"target": "mechwild/obe/f401/base"
|
||||||
|
},
|
||||||
|
"mechwild/waka60/f401": {
|
||||||
|
"target": "mechwild/waka60/f401/base"
|
||||||
|
},
|
||||||
|
"mechwild/waka60/f411": {
|
||||||
|
"target": "mechwild/waka60/f411/base"
|
||||||
|
},
|
||||||
|
"mechwild/waka60": {
|
||||||
|
"target": "mechwild/waka60/f401/base"
|
||||||
|
},
|
||||||
|
"murcielago": {
|
||||||
|
"target": "murcielago/rev1"
|
||||||
|
},
|
||||||
|
"nullbitsco/scramble": {
|
||||||
|
"target": "nullbitsco/scramble/v2"
|
||||||
|
},
|
||||||
|
"omkbd/ergodash": {
|
||||||
|
"target": "omkbd/ergodash/rev1"
|
||||||
|
},
|
||||||
|
"omkbd/runner3680": {
|
||||||
|
"target": "omkbd/runner3680/5x8"
|
||||||
|
},
|
||||||
|
"orthodox": {
|
||||||
|
"target": "orthodox/rev3"
|
||||||
|
},
|
||||||
|
"peej/rosaline": {
|
||||||
|
"target": "peej/rosaline/staggered"
|
||||||
|
},
|
||||||
|
"peej/tripel": {
|
||||||
|
"target": "peej/tripel/left"
|
||||||
|
},
|
||||||
|
"peranekofactory/tone": {
|
||||||
|
"target": "peranekofactory/tone/rev2"
|
||||||
|
},
|
||||||
|
"phase_studio/titan65": {
|
||||||
|
"target": "phase_studio/titan65/hotswap"
|
||||||
|
},
|
||||||
|
"pica40": {
|
||||||
|
"target": "pica40/rev2"
|
||||||
|
},
|
||||||
|
"pinky": {
|
||||||
|
"target": "pinky/3"
|
||||||
|
},
|
||||||
|
"ploopyco/madromys": {
|
||||||
|
"target": "ploopyco/madromys/rev1_001"
|
||||||
|
},
|
||||||
|
"ploopyco/trackball_mini": {
|
||||||
|
"target": "ploopyco/trackball_mini/rev1_001"
|
||||||
|
},
|
||||||
|
"ploopyco/trackball_nano": {
|
||||||
|
"target": "ploopyco/trackball_nano/rev1_001"
|
||||||
|
},
|
||||||
|
"ploopyco/trackball_thumb": {
|
||||||
|
"target": "ploopyco/trackball_thumb/rev1_001"
|
||||||
|
},
|
||||||
|
"primekb/meridian": {
|
||||||
|
"target": "primekb/meridian/ktr1010"
|
||||||
|
},
|
||||||
|
"primekb/prime_e": {
|
||||||
|
"target": "primekb/prime_e/std"
|
||||||
|
},
|
||||||
|
"program_yoink": {
|
||||||
|
"target": "program_yoink/staggered"
|
||||||
|
},
|
||||||
|
"projectcain/vault35": {
|
||||||
|
"target": "projectcain/vault35/atmega32u4"
|
||||||
|
},
|
||||||
|
"qpockets/space_space": {
|
||||||
|
"target": "qpockets/space_space/rev2"
|
||||||
|
},
|
||||||
|
"qwertyydox": {
|
||||||
|
"target": "qwertyydox/rev1"
|
||||||
|
},
|
||||||
|
"rate/pistachio": {
|
||||||
|
"target": "rate/pistachio/rev2"
|
||||||
|
},
|
||||||
|
"recompile_keys/choco60": {
|
||||||
|
"target": "recompile_keys/choco60/rev1"
|
||||||
|
},
|
||||||
|
"recompile_keys/nomu30": {
|
||||||
|
"target": "recompile_keys/nomu30/rev1"
|
||||||
|
},
|
||||||
|
"redox/rev1": {
|
||||||
|
"target": "redox/rev1/base"
|
||||||
|
},
|
||||||
|
"rgbkb/mun": {
|
||||||
|
"target": "rgbkb/mun/rev1"
|
||||||
|
},
|
||||||
|
"rgbkb/sol3": {
|
||||||
|
"target": "rgbkb/sol3/rev1"
|
||||||
|
},
|
||||||
|
"rgbkb/sol": {
|
||||||
|
"target": "rgbkb/sol/rev2"
|
||||||
|
},
|
||||||
|
"rgbkb/zen": {
|
||||||
|
"target": "rgbkb/zen/rev2"
|
||||||
|
},
|
||||||
|
"rgbkb/zygomorph": {
|
||||||
|
"target": "rgbkb/zygomorph/rev1"
|
||||||
|
},
|
||||||
|
"rmi_kb/herringbone": {
|
||||||
|
"target": "rmi_kb/herringbone/v1"
|
||||||
|
},
|
||||||
|
"rmi_kb/mona": {
|
||||||
|
"target": "rmi_kb/mona/v1_1"
|
||||||
|
},
|
||||||
|
"rmi_kb/tkl_ff": {
|
||||||
|
"target": "rmi_kb/tkl_ff/v1"
|
||||||
|
},
|
||||||
|
"rmi_kb/wete": {
|
||||||
|
"target": "rmi_kb/wete/v2"
|
||||||
|
},
|
||||||
|
"rookiebwoy/late9": {
|
||||||
|
"target": "ivndbt/late9/rev1"
|
||||||
|
},
|
||||||
|
"rookiebwoy/neopad": {
|
||||||
|
"target": "ivndbt/neopad/rev1"
|
||||||
|
},
|
||||||
|
"ivndbt/late9": {
|
||||||
|
"target": "ivndbt/late9/rev1"
|
||||||
|
},
|
||||||
|
"ivndbt/neopad": {
|
||||||
|
"target": "ivndbt/neopad/rev1"
|
||||||
|
},
|
||||||
|
"rura66": {
|
||||||
|
"target": "rura66/rev1"
|
||||||
|
},
|
||||||
|
"salicylic_acid3/7skb": {
|
||||||
|
"target": "salicylic_acid3/7skb/rev1"
|
||||||
|
},
|
||||||
|
"salicylic_acid3/getta25": {
|
||||||
|
"target": "salicylic_acid3/getta25/rev1"
|
||||||
|
},
|
||||||
|
"salicylic_acid3/jisplit89": {
|
||||||
|
"target": "salicylic_acid3/jisplit89/rev1"
|
||||||
|
},
|
||||||
|
"salicylic_acid3/naked48": {
|
||||||
|
"target": "salicylic_acid3/naked48/rev1"
|
||||||
|
},
|
||||||
|
"salicylic_acid3/naked60": {
|
||||||
|
"target": "salicylic_acid3/naked60/rev1"
|
||||||
|
},
|
||||||
|
"salicylic_acid3/naked64": {
|
||||||
|
"target": "salicylic_acid3/naked64/rev1"
|
||||||
|
},
|
||||||
|
"salicylic_acid3/setta21": {
|
||||||
|
"target": "salicylic_acid3/setta21/rev1"
|
||||||
|
},
|
||||||
|
"sawnsprojects/okayu": {
|
||||||
|
"target": "sawnsprojects/okayu/stm32f072"
|
||||||
|
},
|
||||||
|
"smoll/lefty": {
|
||||||
|
"target": "smoll/lefty/rev2"
|
||||||
|
},
|
||||||
|
"sofle": {
|
||||||
|
"target": "sofle/rev1"
|
||||||
|
},
|
||||||
|
"spaceholdings/nebula68b": {
|
||||||
|
"target": "spaceholdings/nebula68b/solder"
|
||||||
|
},
|
||||||
|
"spacetime": {
|
||||||
|
"target": "spacetime/rev1"
|
||||||
|
},
|
||||||
|
"splitkb/aurora/corne": {
|
||||||
|
"target": "splitkb/aurora/corne/rev1"
|
||||||
|
},
|
||||||
|
"splitkb/aurora/helix": {
|
||||||
|
"target": "splitkb/aurora/helix/rev1"
|
||||||
|
},
|
||||||
|
"splitkb/aurora/lily58": {
|
||||||
|
"target": "splitkb/aurora/lily58/rev1"
|
||||||
|
},
|
||||||
|
"splitkb/aurora/sofle_v2": {
|
||||||
|
"target": "splitkb/aurora/sofle_v2/rev1"
|
||||||
|
},
|
||||||
|
"splitkb/aurora/sweep": {
|
||||||
|
"target": "splitkb/aurora/sweep/rev1"
|
||||||
|
},
|
||||||
|
"splitkb/kyria": {
|
||||||
|
"target": "splitkb/kyria/rev3"
|
||||||
|
},
|
||||||
|
"splitkb/kyria/rev1": {
|
||||||
|
"target": "splitkb/kyria/rev1/base"
|
||||||
|
},
|
||||||
|
"splitkb/kyria/rev2": {
|
||||||
|
"target": "splitkb/kyria/rev2/base"
|
||||||
|
},
|
||||||
|
"splitty": {
|
||||||
|
"target": "splitty/rev1"
|
||||||
|
},
|
||||||
|
"studiokestra/galatea": {
|
||||||
|
"target": "studiokestra/galatea/rev1"
|
||||||
|
},
|
||||||
|
"takashiski/hecomi": {
|
||||||
|
"target": "takashiski/hecomi/alpha"
|
||||||
|
},
|
||||||
|
"takashiski/namecard2x4": {
|
||||||
|
"target": "takashiski/namecard2x4/rev2"
|
||||||
|
},
|
||||||
|
"teleport/native": {
|
||||||
|
"target": "teleport/native/iso"
|
||||||
|
},
|
||||||
|
"themadnoodle/noodlepad": {
|
||||||
|
"target": "themadnoodle/noodlepad/v1"
|
||||||
|
},
|
||||||
|
"tkw/grandiceps": {
|
||||||
|
"target": "tkw/grandiceps/rev1"
|
||||||
|
},
|
||||||
|
"tominabox1/le_chiffre": {
|
||||||
|
"target": "tominabox1/le_chiffre/rev1"
|
||||||
|
},
|
||||||
|
"tominabox1/littlefoot_lx": {
|
||||||
|
"target": "tominabox1/littlefoot_lx/rev1"
|
||||||
|
},
|
||||||
|
"tominabox1/underscore33": {
|
||||||
|
"target": "tominabox1/underscore33/rev1"
|
||||||
|
},
|
||||||
|
"trnthsn/e8ghty": {
|
||||||
|
"target": "trnthsn/e8ghty/stm32f103"
|
||||||
|
},
|
||||||
|
"trnthsn/s6xty5neor2": {
|
||||||
|
"target": "trnthsn/s6xty5neor2/stm32f103"
|
||||||
|
},
|
||||||
|
"tweetydabird/lotus58": {
|
||||||
|
"target": "tweetydabird/lotus58/promicro"
|
||||||
|
},
|
||||||
|
"unison": {
|
||||||
|
"target": "unison/v04"
|
||||||
|
},
|
||||||
|
"uzu42": {
|
||||||
|
"target": "uzu42/rev1"
|
||||||
|
},
|
||||||
|
"vitamins_included": {
|
||||||
|
"target": "vitamins_included/rev2"
|
||||||
|
},
|
||||||
|
"westm/westm68": {
|
||||||
|
"target": "westm/westm68/rev2"
|
||||||
|
},
|
||||||
|
"westm/westm9": {
|
||||||
|
"target": "westm/westm9/rev2"
|
||||||
|
},
|
||||||
|
"woodkeys/meira": {
|
||||||
|
"target": "woodkeys/meira/promicro"
|
||||||
|
},
|
||||||
|
"work_louder/loop": {
|
||||||
|
"target": "work_louder/loop/rev3"
|
||||||
|
},
|
||||||
|
"work_louder/work_board": {
|
||||||
|
"target": "work_louder/work_board/rev3"
|
||||||
|
},
|
||||||
|
"yanghu/unicorne": {
|
||||||
|
"target": "yanghu/unicorne/f411"
|
||||||
|
},
|
||||||
|
"yosino58": {
|
||||||
|
"target": "yosino58/rev1"
|
||||||
|
},
|
||||||
|
"ymdk/yd60mq": {
|
||||||
|
"target": "ymdk/yd60mq/12led"
|
||||||
|
},
|
||||||
|
"yushakobo/navpad/10": {
|
||||||
|
"target": "yushakobo/navpad/10/rev1"
|
||||||
|
},
|
||||||
|
"yynmt/acperience12": {
|
||||||
|
"target": "yynmt/acperience12/rev1"
|
||||||
|
},
|
||||||
|
"zsa/planck_ez": {
|
||||||
|
"target": "zsa/planck_ez/base"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"$id": "qmk.api.keyboard.v1",
|
"$id": "qmk.api.keyboard.v1",
|
||||||
"allOf": [
|
"allOf": [
|
||||||
{"$ref": "qmk.keyboard.v1"},
|
{"$ref": "./keyboard.jsonschema#"},
|
||||||
{
|
{
|
||||||
"properties": {
|
"properties": {
|
||||||
"keymaps": {
|
"keymaps": {
|
||||||
|
@ -10,8 +10,8 @@
|
||||||
"url": {"type": "string"}
|
"url": {"type": "string"}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"parse_errors": {"$ref": "qmk.definitions.v1#/string_array"},
|
"parse_errors": {"$ref": "./definitions.jsonschema#/string_array"},
|
||||||
"parse_warnings": {"$ref": "qmk.definitions.v1#/string_array"},
|
"parse_warnings": {"$ref": "./definitions.jsonschema#/string_array"},
|
||||||
"processor_type": {"type": "string"},
|
"processor_type": {"type": "string"},
|
||||||
"protocol": {"type": "string"},
|
"protocol": {"type": "string"},
|
||||||
"keyboard_folder": {"type": "string"},
|
"keyboard_folder": {"type": "string"},
|
||||||
|
|
18
data/schemas/community_module.jsonschema
Normal file
18
data/schemas/community_module.jsonschema
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
{
|
||||||
|
"$schema": "https://json-schema.org/draft/2020-12/schema#",
|
||||||
|
"$id": "qmk.community_module.v1",
|
||||||
|
"title": "Community Module Information",
|
||||||
|
"type": "object",
|
||||||
|
"required": ["module_name", "maintainer"],
|
||||||
|
"properties": {
|
||||||
|
"module_name": {"$ref": "./definitions.jsonschema#/text_identifier"},
|
||||||
|
"maintainer": {"$ref": "./definitions.jsonschema#/text_identifier"},
|
||||||
|
"license": {"type": "string"},
|
||||||
|
"url": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "uri"
|
||||||
|
},
|
||||||
|
"keycodes": {"$ref": "./definitions.jsonschema#/keycode_decl_array"},
|
||||||
|
"features": {"$ref": "./keyboard.jsonschema#/definitions/features_config"}
|
||||||
|
}
|
||||||
|
}
|
|
@ -17,9 +17,9 @@
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
"required": ["pin_a", "pin_b"],
|
"required": ["pin_a", "pin_b"],
|
||||||
"properties": {
|
"properties": {
|
||||||
"pin_a": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
"pin_a": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||||
"pin_b": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
"pin_b": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||||
"resolution": {"$ref": "qmk.definitions.v1#/unsigned_int"}
|
"resolution": {"$ref": "./definitions.jsonschema#/unsigned_int"}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -28,17 +28,22 @@
|
||||||
"dip_switch_config": {
|
"dip_switch_config": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"pins": {"$ref": "qmk.definitions.v1#/mcu_pin_array"}
|
"pins": {"$ref": "./definitions.jsonschema#/mcu_pin_array"}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"features_config": {
|
||||||
|
"$ref": "./definitions.jsonschema#/boolean_array",
|
||||||
|
"propertyNames": {"$ref": "./definitions.jsonschema#/snake_case"},
|
||||||
|
"not": {"required": ["lto"]}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"not": {"required": ["vendorId", "productId"]}, // reject via keys...
|
"not": {"required": ["vendorId", "productId"]}, // reject via keys...
|
||||||
"properties": {
|
"properties": {
|
||||||
"keyboard_name": {"$ref": "qmk.definitions.v1#/text_identifier"},
|
"keyboard_name": {"$ref": "./definitions.jsonschema#/text_identifier"},
|
||||||
"keyboard_folder": {"$ref": "qmk.definitions.v1#/keyboard"},
|
"keyboard_folder": {"$ref": "./definitions.jsonschema#/keyboard"},
|
||||||
"maintainer": {"$ref": "qmk.definitions.v1#/text_identifier"},
|
"maintainer": {"$ref": "./definitions.jsonschema#/text_identifier"},
|
||||||
"manufacturer": {"$ref": "qmk.definitions.v1#/text_identifier"},
|
"manufacturer": {"$ref": "./definitions.jsonschema#/text_identifier"},
|
||||||
"url": {
|
"url": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "uri"
|
"format": "uri"
|
||||||
|
@ -79,6 +84,7 @@
|
||||||
"STM32F407",
|
"STM32F407",
|
||||||
"STM32F411",
|
"STM32F411",
|
||||||
"STM32F446",
|
"STM32F446",
|
||||||
|
"STM32G0B1",
|
||||||
"STM32G431",
|
"STM32G431",
|
||||||
"STM32G474",
|
"STM32G474",
|
||||||
"STM32H723",
|
"STM32H723",
|
||||||
|
@ -113,8 +119,8 @@
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
"properties": {
|
"properties": {
|
||||||
"data_pin": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
"data_pin": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||||
"clock_pin": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
"clock_pin": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||||
"default_brightness": {
|
"default_brightness": {
|
||||||
"type": "integer",
|
"type": "integer",
|
||||||
"minimum": 0,
|
"minimum": 0,
|
||||||
|
@ -139,13 +145,13 @@
|
||||||
"enum": ["dac_additive", "dac_basic", "pwm_software", "pwm_hardware"]
|
"enum": ["dac_additive", "dac_basic", "pwm_software", "pwm_hardware"]
|
||||||
},
|
},
|
||||||
"macro_beep": {"type": "boolean"},
|
"macro_beep": {"type": "boolean"},
|
||||||
"pins": {"$ref": "qmk.definitions.v1#/mcu_pin_array"},
|
"pins": {"$ref": "./definitions.jsonschema#/mcu_pin_array"},
|
||||||
"power_control": {
|
"power_control": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
"properties": {
|
"properties": {
|
||||||
"on_state": {"$ref": "qmk.definitions.v1#/bit"},
|
"on_state": {"$ref": "./definitions.jsonschema#/bit"},
|
||||||
"pin": {"$ref": "qmk.definitions.v1#/mcu_pin"}
|
"pin": {"$ref": "./definitions.jsonschema#/mcu_pin"}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"voices": {"type": "boolean"}
|
"voices": {"type": "boolean"}
|
||||||
|
@ -165,20 +171,20 @@
|
||||||
"properties": {
|
"properties": {
|
||||||
"on": {"type": "boolean"},
|
"on": {"type": "boolean"},
|
||||||
"breathing": {"type": "boolean"},
|
"breathing": {"type": "boolean"},
|
||||||
"brightness": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
|
"brightness": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"breathing": {"type": "boolean"},
|
"breathing": {"type": "boolean"},
|
||||||
"breathing_period": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
"breathing_period": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
|
||||||
"levels": {
|
"levels": {
|
||||||
"type": "integer",
|
"type": "integer",
|
||||||
"minimum": 1,
|
"minimum": 1,
|
||||||
"maximum": 31
|
"maximum": 31
|
||||||
},
|
},
|
||||||
"max_brightness": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
"max_brightness": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
|
||||||
"pin": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
"pin": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||||
"pins": {"$ref": "qmk.definitions.v1#/mcu_pin_array"},
|
"pins": {"$ref": "./definitions.jsonschema#/mcu_pin_array"},
|
||||||
"on_state": {"$ref": "qmk.definitions.v1#/bit"},
|
"on_state": {"$ref": "./definitions.jsonschema#/bit"},
|
||||||
"as_caps_lock": {"type": "boolean"}
|
"as_caps_lock": {"type": "boolean"}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -263,7 +269,7 @@
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"enum": ["COL2ROW", "ROW2COL"]
|
"enum": ["COL2ROW", "ROW2COL"]
|
||||||
},
|
},
|
||||||
"debounce": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"debounce": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"caps_word": {
|
"caps_word": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
|
@ -271,20 +277,20 @@
|
||||||
"enabled": {"type": "boolean"},
|
"enabled": {"type": "boolean"},
|
||||||
"both_shifts_turns_on": {"type": "boolean"},
|
"both_shifts_turns_on": {"type": "boolean"},
|
||||||
"double_tap_shift_turns_on": {"type": "boolean"},
|
"double_tap_shift_turns_on": {"type": "boolean"},
|
||||||
"idle_timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"idle_timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"invert_on_shift": {"type": "boolean"}
|
"invert_on_shift": {"type": "boolean"}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"combo": {
|
"combo": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"count": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"count": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"term": {"$ref": "qmk.definitions.v1#/unsigned_int"}
|
"term": {"$ref": "./definitions.jsonschema#/unsigned_int"}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"community_layouts": {
|
"community_layouts": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {"$ref": "qmk.definitions.v1#/filename"}
|
"items": {"$ref": "./definitions.jsonschema#/filename"}
|
||||||
},
|
},
|
||||||
"dip_switch": {
|
"dip_switch": {
|
||||||
"$ref": "#/definitions/dip_switch_config",
|
"$ref": "#/definitions/dip_switch_config",
|
||||||
|
@ -314,10 +320,10 @@
|
||||||
"properties": {
|
"properties": {
|
||||||
"driver": {
|
"driver": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"enum": ["custom", "embedded_flash", "legacy", "rp2040_flash", "spi_flash"]
|
"enum": ["none", "custom", "embedded_flash", "legacy", "rp2040_flash", "spi_flash"]
|
||||||
},
|
},
|
||||||
"backing_size": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"backing_size": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"logical_size": {"$ref": "qmk.definitions.v1#/unsigned_int"}
|
"logical_size": {"$ref": "./definitions.jsonschema#/unsigned_int"}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -328,20 +334,16 @@
|
||||||
"enabled": {"type": "boolean"}
|
"enabled": {"type": "boolean"}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"features": {
|
"features": { "$ref": "#/definitions/features_config" },
|
||||||
"$ref": "qmk.definitions.v1#/boolean_array",
|
|
||||||
"propertyNames": {"$ref": "qmk.definitions.v1#/snake_case"},
|
|
||||||
"not": {"required": ["lto"]}
|
|
||||||
},
|
|
||||||
"indicators": {
|
"indicators": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"caps_lock": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
"caps_lock": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||||
"num_lock": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
"num_lock": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||||
"scroll_lock": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
"scroll_lock": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||||
"compose": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
"compose": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||||
"kana": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
"kana": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||||
"on_state": {"$ref": "qmk.definitions.v1#/bit"}
|
"on_state": {"$ref": "./definitions.jsonschema#/bit"}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"joystick": {
|
"joystick": {
|
||||||
|
@ -349,20 +351,20 @@
|
||||||
"properties": {
|
"properties": {
|
||||||
"enabled": {"type": "boolean"},
|
"enabled": {"type": "boolean"},
|
||||||
"driver": {"type": "string"},
|
"driver": {"type": "string"},
|
||||||
"button_count": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"button_count": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"axis_resolution": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"axis_resolution": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"axes": {
|
"axes": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"propertyNames": {"enum": ["x", "y", "z", "rx", "ry", "rz"]}
|
"propertyNames": {"enum": ["x", "y", "z", "rx", "ry", "rz"]},
|
||||||
"additionalProperties": {
|
"additionalProperties": {
|
||||||
"oneOf": [
|
"oneOf": [
|
||||||
{
|
{
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"input_pin": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
"input_pin": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||||
"low": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"low": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"rest": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"rest": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"high": {"$ref": "qmk.definitions.v1#/unsigned_int"}
|
"high": {"$ref": "./definitions.jsonschema#/unsigned_int"}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -374,20 +376,20 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"keycodes": {"$ref": "qmk.definitions.v1#/keycode_decl_array"},
|
"keycodes": {"$ref": "./definitions.jsonschema#/keycode_decl_array"},
|
||||||
"layer_lock": {
|
"layer_lock": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"}
|
"timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"layout_aliases": {
|
"layout_aliases": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": {"$ref": "qmk.definitions.v1#/layout_macro"}
|
"additionalProperties": {"$ref": "./definitions.jsonschema#/layout_macro"}
|
||||||
},
|
},
|
||||||
"layouts": {
|
"layouts": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"propertyNames": {"$ref": "qmk.definitions.v1#/layout_macro"},
|
"propertyNames": {"$ref": "./definitions.jsonschema#/layout_macro"},
|
||||||
"additionalProperties": {
|
"additionalProperties": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
|
@ -402,7 +404,7 @@
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
"required": ["x", "y"],
|
"required": ["x", "y"],
|
||||||
"properties": {
|
"properties": {
|
||||||
"encoder": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"encoder": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"label": {
|
"label": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"pattern": "^[^\\n]*$"
|
"pattern": "^[^\\n]*$"
|
||||||
|
@ -416,13 +418,17 @@
|
||||||
"minimum": 0
|
"minimum": 0
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"r": {"$ref": "qmk.definitions.v1#/signed_decimal"},
|
"r": {"$ref": "./definitions.jsonschema#/signed_decimal"},
|
||||||
"rx": {"$ref": "qmk.definitions.v1#/unsigned_decimal"},
|
"rx": {"$ref": "./definitions.jsonschema#/unsigned_decimal"},
|
||||||
"ry": {"$ref": "qmk.definitions.v1#/unsigned_decimal"},
|
"ry": {"$ref": "./definitions.jsonschema#/unsigned_decimal"},
|
||||||
"h": {"$ref": "qmk.definitions.v1#/key_unit"},
|
"h": {"$ref": "./definitions.jsonschema#/key_unit"},
|
||||||
"w": {"$ref": "qmk.definitions.v1#/key_unit"},
|
"w": {"$ref": "./definitions.jsonschema#/key_unit"},
|
||||||
"x": {"$ref": "qmk.definitions.v1#/key_unit"},
|
"x": {"$ref": "./definitions.jsonschema#/key_unit"},
|
||||||
"y": {"$ref": "qmk.definitions.v1#/key_unit"}
|
"y": {"$ref": "./definitions.jsonschema#/key_unit"},
|
||||||
|
"hand": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": ["L", "R", "*"]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -438,12 +444,24 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"host": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"default": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"nkro": {"type": "boolean"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"leader_key": {
|
"leader_key": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"timing": {"type": "boolean"},
|
"timing": {"type": "boolean"},
|
||||||
"strict_processing": {"type": "boolean"},
|
"strict_processing": {"type": "boolean"},
|
||||||
"timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"}
|
"timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"matrix_pins": {
|
"matrix_pins": {
|
||||||
|
@ -453,32 +471,38 @@
|
||||||
"custom": {"type": "boolean"},
|
"custom": {"type": "boolean"},
|
||||||
"custom_lite": {"type": "boolean"},
|
"custom_lite": {"type": "boolean"},
|
||||||
"ghost": {"type": "boolean"},
|
"ghost": {"type": "boolean"},
|
||||||
"input_pressed_state": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"input_pressed_state": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"io_delay": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"io_delay": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"direct": {
|
"direct": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {"$ref": "qmk.definitions.v1#/mcu_pin_array"}
|
"items": {"$ref": "./definitions.jsonschema#/mcu_pin_array"}
|
||||||
},
|
},
|
||||||
"cols": {"$ref": "qmk.definitions.v1#/mcu_pin_array"},
|
"cols": {"$ref": "./definitions.jsonschema#/mcu_pin_array"},
|
||||||
"rows": {"$ref": "qmk.definitions.v1#/mcu_pin_array"}
|
"rows": {"$ref": "./definitions.jsonschema#/mcu_pin_array"}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"modules": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"mouse_key": {
|
"mouse_key": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"enabled": {"type": "boolean"},
|
"enabled": {"type": "boolean"},
|
||||||
"delay": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
"delay": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
|
||||||
"interval": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
"interval": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
|
||||||
"max_speed": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
"max_speed": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
|
||||||
"time_to_max": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
"time_to_max": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
|
||||||
"wheel_delay": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
|
"wheel_delay": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"oneshot": {
|
"oneshot": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"tap_toggle": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"tap_toggle": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"}
|
"timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"led_matrix": {
|
"led_matrix": {
|
||||||
|
@ -486,7 +510,7 @@
|
||||||
"properties": {
|
"properties": {
|
||||||
"animations": {
|
"animations": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"propertyNames": {"$ref": "qmk.definitions.v1#/snake_case"},
|
"propertyNames": {"$ref": "./definitions.jsonschema#/snake_case"},
|
||||||
"additionalProperties": {"type": "boolean"}
|
"additionalProperties": {"type": "boolean"}
|
||||||
},
|
},
|
||||||
"default": {
|
"default": {
|
||||||
|
@ -495,8 +519,8 @@
|
||||||
"properties": {
|
"properties": {
|
||||||
"on": {"type": "boolean"},
|
"on": {"type": "boolean"},
|
||||||
"animation": {"type": "string"},
|
"animation": {"type": "string"},
|
||||||
"val": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
"val": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
|
||||||
"speed": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
|
"speed": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"driver": {
|
"driver": {
|
||||||
|
@ -522,27 +546,28 @@
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"minItems": 2,
|
"minItems": 2,
|
||||||
"maxItems": 2,
|
"maxItems": 2,
|
||||||
"items": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
|
"items": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}
|
||||||
},
|
},
|
||||||
"max_brightness": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
"max_brightness": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
|
||||||
"timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"val_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"val_steps": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"speed_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"speed_steps": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"led_flush_limit": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"led_flush_limit": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"led_process_limit": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"led_process_limit": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"react_on_keyup": {"type": "boolean"},
|
"react_on_keyup": {"type": "boolean"},
|
||||||
"sleep": {"type": "boolean"},
|
"sleep": {"type": "boolean"},
|
||||||
"split_count": {
|
"split_count": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"minItems": 2,
|
"minItems": 2,
|
||||||
"maxItems": 2,
|
"maxItems": 2,
|
||||||
"items": {"$ref": "qmk.definitions.v1#/unsigned_int"}
|
"items": {"$ref": "./definitions.jsonschema#/unsigned_int"}
|
||||||
},
|
},
|
||||||
"layout": {
|
"layout": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {
|
"items": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
|
"required": ["x", "y"],
|
||||||
"properties": {
|
"properties": {
|
||||||
"matrix": {
|
"matrix": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
|
@ -553,9 +578,9 @@
|
||||||
"minimum": 0
|
"minimum": 0
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"x": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"x": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"y": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"y": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"flags": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
|
"flags": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -566,7 +591,7 @@
|
||||||
"properties": {
|
"properties": {
|
||||||
"animations": {
|
"animations": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"propertyNames": {"$ref": "qmk.definitions.v1#/snake_case"},
|
"propertyNames": {"$ref": "./definitions.jsonschema#/snake_case"},
|
||||||
"additionalProperties": {"type": "boolean"}
|
"additionalProperties": {"type": "boolean"}
|
||||||
},
|
},
|
||||||
"default": {
|
"default": {
|
||||||
|
@ -575,10 +600,10 @@
|
||||||
"properties": {
|
"properties": {
|
||||||
"on": {"type": "boolean"},
|
"on": {"type": "boolean"},
|
||||||
"animation": {"type": "string"},
|
"animation": {"type": "string"},
|
||||||
"hue": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
"hue": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
|
||||||
"sat": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
"sat": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
|
||||||
"val": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
"val": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
|
||||||
"speed": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
|
"speed": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"driver": {
|
"driver": {
|
||||||
|
@ -606,29 +631,30 @@
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"minItems": 2,
|
"minItems": 2,
|
||||||
"maxItems": 2,
|
"maxItems": 2,
|
||||||
"items": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
|
"items": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}
|
||||||
},
|
},
|
||||||
"max_brightness": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
"max_brightness": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
|
||||||
"timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"hue_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"hue_steps": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"sat_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"sat_steps": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"val_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"val_steps": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"speed_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"speed_steps": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"led_flush_limit": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"led_flush_limit": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"led_process_limit": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"led_process_limit": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"react_on_keyup": {"type": "boolean"},
|
"react_on_keyup": {"type": "boolean"},
|
||||||
"sleep": {"type": "boolean"},
|
"sleep": {"type": "boolean"},
|
||||||
"split_count": {
|
"split_count": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"minItems": 2,
|
"minItems": 2,
|
||||||
"maxItems": 2,
|
"maxItems": 2,
|
||||||
"items": {"$ref": "qmk.definitions.v1#/unsigned_int"}
|
"items": {"$ref": "./definitions.jsonschema#/unsigned_int"}
|
||||||
},
|
},
|
||||||
"layout": {
|
"layout": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {
|
"items": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
|
"required": ["x", "y"],
|
||||||
"properties": {
|
"properties": {
|
||||||
"matrix": {
|
"matrix": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
|
@ -639,9 +665,9 @@
|
||||||
"minimum": 0
|
"minimum": 0
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"x": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"x": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"y": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"y": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"flags": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
|
"flags": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -653,27 +679,27 @@
|
||||||
"properties": {
|
"properties": {
|
||||||
"animations": {
|
"animations": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"propertyNames": {"$ref": "qmk.definitions.v1#/snake_case"},
|
"propertyNames": {"$ref": "./definitions.jsonschema#/snake_case"},
|
||||||
"additionalProperties": {"type": "boolean"}
|
"additionalProperties": {"type": "boolean"}
|
||||||
},
|
},
|
||||||
"brightness_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"brightness_steps": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"default": {
|
"default": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
"properties": {
|
"properties": {
|
||||||
"on": {"type": "boolean"},
|
"on": {"type": "boolean"},
|
||||||
"animation": {"type": "string"},
|
"animation": {"type": "string"},
|
||||||
"hue": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
"hue": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
|
||||||
"sat": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
"sat": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
|
||||||
"val": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
"val": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
|
||||||
"speed": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
|
"speed": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"driver": {
|
"driver": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"enum": ["apa102", "custom", "ws2812"]
|
"enum": ["apa102", "custom", "ws2812"]
|
||||||
},
|
},
|
||||||
"hue_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"hue_steps": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"layers": {
|
"layers": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
|
@ -688,29 +714,29 @@
|
||||||
"override_rgb": {"type": "boolean"}
|
"override_rgb": {"type": "boolean"}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"led_count": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"led_count": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"led_map": {
|
"led_map": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"minItems": 2,
|
"minItems": 2,
|
||||||
"items": {"$ref": "qmk.definitions.v1#/unsigned_int"}
|
"items": {"$ref": "./definitions.jsonschema#/unsigned_int"}
|
||||||
},
|
},
|
||||||
"max_brightness": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
"max_brightness": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
|
||||||
"pin": {
|
"pin": {
|
||||||
"$ref": "qmk.definitions.v1#/mcu_pin",
|
"$ref": "./definitions.jsonschema#/mcu_pin",
|
||||||
"$comment": "Deprecated: use ws2812.pin instead"
|
"$comment": "Deprecated: use ws2812.pin instead"
|
||||||
},
|
},
|
||||||
"rgbw": {
|
"rgbw": {
|
||||||
"type": "boolean",
|
"type": "boolean",
|
||||||
"$comment": "Deprecated: use ws2812.rgbw instead"
|
"$comment": "Deprecated: use ws2812.rgbw instead"
|
||||||
},
|
},
|
||||||
"saturation_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"saturation_steps": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"sleep": {"type": "boolean"},
|
"sleep": {"type": "boolean"},
|
||||||
"split": {"type": "boolean"},
|
"split": {"type": "boolean"},
|
||||||
"split_count": {
|
"split_count": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"minItems": 2,
|
"minItems": 2,
|
||||||
"maxItems": 2,
|
"maxItems": 2,
|
||||||
"items": {"$ref": "qmk.definitions.v1#/unsigned_int"}
|
"items": {"$ref": "./definitions.jsonschema#/unsigned_int"}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -719,8 +745,8 @@
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
"properties": {
|
"properties": {
|
||||||
"enabled": {"type": "boolean"},
|
"enabled": {"type": "boolean"},
|
||||||
"unlock_timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"unlock_timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"idle_timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"idle_timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"unlock_sequence": {
|
"unlock_sequence": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"minItems": 1,
|
"minItems": 1,
|
||||||
|
@ -754,8 +780,8 @@
|
||||||
"properties": {
|
"properties": {
|
||||||
"enabled": {"type": "boolean"},
|
"enabled": {"type": "boolean"},
|
||||||
"mouse_enabled": {"type": "boolean"},
|
"mouse_enabled": {"type": "boolean"},
|
||||||
"clock_pin": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
"clock_pin": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||||
"data_pin": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
"data_pin": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||||
"driver": {
|
"driver": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"enum": ["busywait", "interrupt", "usart", "vendor"]
|
"enum": ["busywait", "interrupt", "usart", "vendor"]
|
||||||
|
@ -792,11 +818,11 @@
|
||||||
"properties": {
|
"properties": {
|
||||||
"direct": {
|
"direct": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {"$ref": "qmk.definitions.v1#/mcu_pin_array"}
|
"items": {"$ref": "./definitions.jsonschema#/mcu_pin_array"}
|
||||||
},
|
},
|
||||||
"cols": {"$ref": "qmk.definitions.v1#/mcu_pin_array"},
|
"cols": {"$ref": "./definitions.jsonschema#/mcu_pin_array"},
|
||||||
"rows": {"$ref": "qmk.definitions.v1#/mcu_pin_array"},
|
"rows": {"$ref": "./definitions.jsonschema#/mcu_pin_array"},
|
||||||
"unused": {"$ref": "qmk.definitions.v1#/mcu_pin_array"}
|
"unused": {"$ref": "./definitions.jsonschema#/mcu_pin_array"}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -823,16 +849,16 @@
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
"properties": {
|
"properties": {
|
||||||
"pin": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
"pin": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||||
"matrix_grid": {
|
"matrix_grid": {
|
||||||
"$ref": "qmk.definitions.v1#/mcu_pin_array",
|
"$ref": "./definitions.jsonschema#/mcu_pin_array",
|
||||||
"minItems": 2,
|
"minItems": 2,
|
||||||
"maxItems": 2
|
"maxItems": 2
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"soft_serial_pin": {
|
"soft_serial_pin": {
|
||||||
"$ref": "qmk.definitions.v1#/mcu_pin",
|
"$ref": "./definitions.jsonschema#/mcu_pin",
|
||||||
"$comment": "Deprecated: use split.serial.pin instead"
|
"$comment": "Deprecated: use split.serial.pin instead"
|
||||||
},
|
},
|
||||||
"soft_serial_speed": {
|
"soft_serial_speed": {
|
||||||
|
@ -848,7 +874,7 @@
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"enum": ["bitbang", "usart", "vendor"]
|
"enum": ["bitbang", "usart", "vendor"]
|
||||||
},
|
},
|
||||||
"pin": {"$ref": "qmk.definitions.v1#/mcu_pin"}
|
"pin": {"$ref": "./definitions.jsonschema#/mcu_pin"}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"transport": {
|
"transport": {
|
||||||
|
@ -876,7 +902,7 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"watchdog": {"type": "boolean"},
|
"watchdog": {"type": "boolean"},
|
||||||
"watchdog_timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"watchdog_timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"sync_matrix_state": {
|
"sync_matrix_state": {
|
||||||
"type": "boolean",
|
"type": "boolean",
|
||||||
"$comment": "Deprecated: use sync.matrix_state instead"
|
"$comment": "Deprecated: use sync.matrix_state instead"
|
||||||
|
@ -892,8 +918,8 @@
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
"properties": {
|
"properties": {
|
||||||
"enabled": {"type": "boolean"},
|
"enabled": {"type": "boolean"},
|
||||||
"polling_interval": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"polling_interval": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"}
|
"timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"main": {
|
"main": {
|
||||||
|
@ -903,7 +929,7 @@
|
||||||
},
|
},
|
||||||
"matrix_grid": {
|
"matrix_grid": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
"items": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||||
"$comment": "Deprecated: use split.handedness.matrix_grid instead"
|
"$comment": "Deprecated: use split.handedness.matrix_grid instead"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -915,6 +941,7 @@
|
||||||
"tapping": {
|
"tapping": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
|
"chordal_hold": {"type": "boolean"},
|
||||||
"force_hold": {"type": "boolean"},
|
"force_hold": {"type": "boolean"},
|
||||||
"force_hold_per_key": {"type": "boolean"},
|
"force_hold_per_key": {"type": "boolean"},
|
||||||
"ignore_mod_tap_interrupt": {"type": "boolean"},
|
"ignore_mod_tap_interrupt": {"type": "boolean"},
|
||||||
|
@ -924,9 +951,9 @@
|
||||||
"permissive_hold_per_key": {"type": "boolean"},
|
"permissive_hold_per_key": {"type": "boolean"},
|
||||||
"retro": {"type": "boolean"},
|
"retro": {"type": "boolean"},
|
||||||
"retro_per_key": {"type": "boolean"},
|
"retro_per_key": {"type": "boolean"},
|
||||||
"term": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"term": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"term_per_key": {"type": "boolean"},
|
"term_per_key": {"type": "boolean"},
|
||||||
"toggle": {"$ref": "qmk.definitions.v1#/unsigned_int"}
|
"toggle": {"$ref": "./definitions.jsonschema#/unsigned_int"}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"usb": {
|
"usb": {
|
||||||
|
@ -934,16 +961,20 @@
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
"properties": {
|
"properties": {
|
||||||
"device_ver": {
|
"device_ver": {
|
||||||
"$ref": "qmk.definitions.v1#/hex_number_4d",
|
"$ref": "./definitions.jsonschema#/hex_number_4d",
|
||||||
"$comment": "Deprecated: use device_version instead"
|
"$comment": "Deprecated: use device_version instead"
|
||||||
},
|
},
|
||||||
"device_version": {"$ref": "qmk.definitions.v1#/bcd_version"},
|
"device_version": {"$ref": "./definitions.jsonschema#/bcd_version"},
|
||||||
"force_nkro": {"type": "boolean"},
|
"force_nkro": {
|
||||||
"pid": {"$ref": "qmk.definitions.v1#/hex_number_4d"},
|
"type": "boolean",
|
||||||
"vid": {"$ref": "qmk.definitions.v1#/hex_number_4d"},
|
"$comment": "Deprecated: use host.default.nkro instead"
|
||||||
"max_power": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
|
||||||
|
},
|
||||||
|
"pid": {"$ref": "./definitions.jsonschema#/hex_number_4d"},
|
||||||
|
"vid": {"$ref": "./definitions.jsonschema#/hex_number_4d"},
|
||||||
|
"max_power": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"no_startup_check": {"type": "boolean"},
|
"no_startup_check": {"type": "boolean"},
|
||||||
"polling_interval": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
"polling_interval": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
|
||||||
"shared_endpoint": {
|
"shared_endpoint": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
|
@ -952,7 +983,7 @@
|
||||||
"mouse": {"type": "boolean"}
|
"mouse": {"type": "boolean"}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"suspend_wakeup_delay": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"suspend_wakeup_delay": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"wait_for_enumeration": {"type": "boolean"}
|
"wait_for_enumeration": {"type": "boolean"}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -960,9 +991,9 @@
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
"properties": {
|
"properties": {
|
||||||
"keys_per_scan": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
"keys_per_scan": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
|
||||||
"tap_keycode_delay": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"tap_keycode_delay": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"tap_capslock_delay": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"tap_capslock_delay": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"locking": {
|
"locking": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
|
@ -977,10 +1008,10 @@
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
"properties": {
|
"properties": {
|
||||||
"esc_output": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
"esc_output": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||||
"esc_input": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
"esc_input": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||||
"led": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
"led": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||||
"speaker": {"$ref": "qmk.definitions.v1#/mcu_pin"}
|
"speaker": {"$ref": "./definitions.jsonschema#/mcu_pin"}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"ws2812": {
|
"ws2812": {
|
||||||
|
@ -991,10 +1022,10 @@
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"enum": ["bitbang", "custom", "i2c", "pwm", "spi", "vendor"]
|
"enum": ["bitbang", "custom", "i2c", "pwm", "spi", "vendor"]
|
||||||
},
|
},
|
||||||
"pin": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
"pin": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||||
"rgbw": {"type": "boolean"},
|
"rgbw": {"type": "boolean"},
|
||||||
"i2c_address": {"$ref": "qmk.definitions.v1#/hex_number_2d"},
|
"i2c_address": {"$ref": "./definitions.jsonschema#/hex_number_2d"},
|
||||||
"i2c_timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"}
|
"i2c_timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,10 +30,10 @@
|
||||||
"keycodes": {
|
"keycodes": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"propertyNames": {
|
"propertyNames": {
|
||||||
"$ref": "qmk.definitions.v1#/hex_number_4d"
|
"$ref": "./definitions.jsonschema#/hex_number_4d"
|
||||||
},
|
},
|
||||||
"additionalProperties": {
|
"additionalProperties": {
|
||||||
"type": "object", // use 'qmk.definitions.v1#/keycode_decl' when problem keycodes are removed
|
"type": "object", // use './definitions.jsonschema#/keycode_decl' when problem keycodes are removed
|
||||||
"required": [
|
"required": [
|
||||||
"key"
|
"key"
|
||||||
],
|
],
|
||||||
|
|
|
@ -10,10 +10,10 @@
|
||||||
"minLength": 1,
|
"minLength": 1,
|
||||||
"pattern": "^[a-z][0-9a-z_]*$"
|
"pattern": "^[a-z][0-9a-z_]*$"
|
||||||
},
|
},
|
||||||
"host_language": {"$ref": "qmk.definitions.v1#/text_identifier"},
|
"host_language": {"$ref": "./definitions.jsonschema#/text_identifier"},
|
||||||
"keyboard": {"$ref": "qmk.definitions.v1#/text_identifier"},
|
"keyboard": {"$ref": "./definitions.jsonschema#/text_identifier"},
|
||||||
"keymap": {"$ref": "qmk.definitions.v1#/text_identifier"},
|
"keymap": {"$ref": "./definitions.jsonschema#/text_identifier"},
|
||||||
"layout": {"$ref": "qmk.definitions.v1#/layout_macro"},
|
"layout": {"$ref": "./definitions.jsonschema#/layout_macro"},
|
||||||
"layers": {
|
"layers": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {
|
"items": {
|
||||||
|
@ -55,11 +55,11 @@
|
||||||
"keycodes": {
|
"keycodes": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {
|
"items": {
|
||||||
"$ref": "qmk.definitions.v1#/text_identifier"
|
"$ref": "./definitions.jsonschema#/text_identifier"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"duration": {
|
"duration": {
|
||||||
"$ref": "qmk.definitions.v1#/unsigned_int"
|
"$ref": "./definitions.jsonschema#/unsigned_int"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -67,10 +67,16 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"keycodes": {"$ref": "qmk.definitions.v1#/keycode_decl_array"},
|
"keycodes": {"$ref": "./definitions.jsonschema#/keycode_decl_array"},
|
||||||
"config": {"$ref": "qmk.keyboard.v1"},
|
"config": {"$ref": "./keyboard.jsonschema#"},
|
||||||
"notes": {
|
"notes": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
|
},
|
||||||
|
"modules": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
],
|
],
|
||||||
"properties": {
|
"properties": {
|
||||||
"userspace_version": {
|
"userspace_version": {
|
||||||
"type": "string",
|
"type": "string"
|
||||||
},
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,10 +6,10 @@
|
||||||
"definitions": {
|
"definitions": {
|
||||||
"build_target": {
|
"build_target": {
|
||||||
"oneOf": [
|
"oneOf": [
|
||||||
{"$ref": "qmk.definitions.v1#/keyboard_keymap_tuple"},
|
{"$ref": "./definitions.jsonschema#/keyboard_keymap_tuple"},
|
||||||
{"$ref": "qmk.definitions.v1#/json_file_path"}
|
{"$ref": "./definitions.jsonschema#/json_file_path"}
|
||||||
]
|
]
|
||||||
},
|
}
|
||||||
},
|
},
|
||||||
"required": [
|
"required": [
|
||||||
"userspace_version",
|
"userspace_version",
|
||||||
|
|
|
@ -6,11 +6,11 @@
|
||||||
"definitions": {
|
"definitions": {
|
||||||
"build_target": {
|
"build_target": {
|
||||||
"oneOf": [
|
"oneOf": [
|
||||||
{"$ref": "qmk.definitions.v1#/keyboard_keymap_tuple"},
|
{"$ref": "./definitions.jsonschema#/keyboard_keymap_tuple"},
|
||||||
{"$ref": "qmk.definitions.v1#/keyboard_keymap_env"},
|
{"$ref": "./definitions.jsonschema#/keyboard_keymap_env"},
|
||||||
{"$ref": "qmk.definitions.v1#/json_file_path"}
|
{"$ref": "./definitions.jsonschema#/json_file_path"}
|
||||||
]
|
]
|
||||||
},
|
}
|
||||||
},
|
},
|
||||||
"required": [
|
"required": [
|
||||||
"userspace_version",
|
"userspace_version",
|
||||||
|
|
|
@ -14,8 +14,6 @@
|
||||||
},
|
},
|
||||||
"features": {
|
"features": {
|
||||||
"bootmagic": true,
|
"bootmagic": true,
|
||||||
"command": false,
|
|
||||||
"console": false,
|
|
||||||
"extrakey": true,
|
"extrakey": true,
|
||||||
"mousekey": true,
|
"mousekey": true,
|
||||||
"nkro": true
|
"nkro": true
|
||||||
|
|
135
docs/ChangeLog/20250223.md
Normal file
135
docs/ChangeLog/20250223.md
Normal file
|
@ -0,0 +1,135 @@
|
||||||
|
# QMK Breaking Changes - 2025 February 23 Changelog
|
||||||
|
|
||||||
|
## Notable Features
|
||||||
|
|
||||||
|
### Community Modules ([#24848](https://github.com/qmk/qmk_firmware/pull/24848))
|
||||||
|
|
||||||
|
Community Modules are a feature within QMK which allows code to be implemented by third parties, making it available for other people to import into their own builds.
|
||||||
|
|
||||||
|
These modules can provide implementations which override or enhance normal QMK processing; initialization, key processing, suspend, and shutdown are some of the provided hooks which modules may currently implement.
|
||||||
|
|
||||||
|
See the [Community Modules documentation](../features/community_modules) for more information, including the full list of available hooks.
|
||||||
|
|
||||||
|
First-class support for [External Userspace](../newbs_external_userspace) is included out of the box, so there's even more reason to take the plunge and convert your keymap builds to a userspace repository!
|
||||||
|
|
||||||
|
::: tip
|
||||||
|
An example with a new keycode and some debugging information in the QMK repository [lives here](https://github.com/qmk/qmk_firmware/tree/master/modules/qmk/hello_world), and a community module port of [getreuer's SOCD Cleaner](https://getreuer.info/posts/keyboards/socd-cleaner/) can be found in [tzarc's modules repo](https://github.com/tzarc/qmk_modules).
|
||||||
|
:::
|
||||||
|
|
||||||
|
### Chordal Hold ([#24560](https://github.com/qmk/qmk_firmware/pull/24560))
|
||||||
|
|
||||||
|
Chordal Hold implements, by default, an "opposite hands" rule. Suppose a tap-hold key is pressed and then, before the tapping term, another key is pressed. With Chordal Hold, the tap-hold key is settled as tapped if the two keys are on the same hand.
|
||||||
|
|
||||||
|
Chordal Hold may be useful to avoid accidental modifier activation with mod-taps, particularly in rolled keypresses when using home row mods.
|
||||||
|
|
||||||
|
See the [Chordal Hold documentation](../tap_hold#chordal-hold) for more information.
|
||||||
|
|
||||||
|
## Changes Requiring User Action
|
||||||
|
|
||||||
|
### Updated Keyboard Codebases
|
||||||
|
|
||||||
|
| Old Keyboard Name | New Keyboard Name |
|
||||||
|
|-------------------------|-----------------------------|
|
||||||
|
| cxt_studio | cxt_studio/12e4 |
|
||||||
|
| ergodox_stm32 | handwired/ergodox_stm32 |
|
||||||
|
| ploopyco/mouse | ploopyco/mouse/rev1_002 |
|
||||||
|
| ploopyco/trackball/rev1 | ploopyco/trackball/rev1_004 |
|
||||||
|
| ymdk/id75 | ymdk/id75/f103 |
|
||||||
|
|
||||||
|
## Deprecation Notices
|
||||||
|
|
||||||
|
In line with the [notice period](../support_deprecation_policy#how-much-advance-notice-will-be-given), deprecation notices for larger items are listed here.
|
||||||
|
|
||||||
|
### DEFAULT_FOLDER removal ([#24836](https://github.com/qmk/qmk_firmware/pull/24836))
|
||||||
|
|
||||||
|
`DEFAULT_FOLDER` was originally introduced to work around limitations within the build system.
|
||||||
|
Parent folders containing common configuration would create invalid build targets.
|
||||||
|
|
||||||
|
With the introduction of [`keyboard.json`](./20240526#keyboard-json) as a configuration file, the build system now has a consistent method to detect build targets.
|
||||||
|
The `DEFAULT_FOLDER` functionality is now redundant and the intent is for `rules.mk` to become pure configuration.
|
||||||
|
|
||||||
|
Backwards compatibility of build targets has been maintained where possible.
|
||||||
|
|
||||||
|
## Full changelist
|
||||||
|
|
||||||
|
Core:
|
||||||
|
* Chaining OSL and MO ([#23065](https://github.com/qmk/qmk_firmware/pull/23065))
|
||||||
|
* Add extra keymap for EurKEY layout ([#24241](https://github.com/qmk/qmk_firmware/pull/24241))
|
||||||
|
* Add leader_add_user callback ([#24266](https://github.com/qmk/qmk_firmware/pull/24266))
|
||||||
|
* always return audio pin to 0 on ARM ([#24503](https://github.com/qmk/qmk_firmware/pull/24503))
|
||||||
|
* Update Starlight matrix effects ([#24521](https://github.com/qmk/qmk_firmware/pull/24521))
|
||||||
|
* Refactor Hue Breathing matrix effect with runner ([#24525](https://github.com/qmk/qmk_firmware/pull/24525))
|
||||||
|
* Ensure timer_read() is safe to call from interrupt handlers on ARM ([#24529](https://github.com/qmk/qmk_firmware/pull/24529))
|
||||||
|
* Update Raindrops effect to respect LED range limits ([#24531](https://github.com/qmk/qmk_firmware/pull/24531))
|
||||||
|
* Add Chordal Hold, an "opposite hands rule" tap-hold option similar to Achordion, Bilateral Combinations. ([#24560](https://github.com/qmk/qmk_firmware/pull/24560))
|
||||||
|
* Azoteq - improve I2C behaviour while polling. ([#24611](https://github.com/qmk/qmk_firmware/pull/24611))
|
||||||
|
* macOS install: remove bad ARM toolchains ([#24637](https://github.com/qmk/qmk_firmware/pull/24637))
|
||||||
|
* small refactoring of TIMER_DIFF ([#24678](https://github.com/qmk/qmk_firmware/pull/24678))
|
||||||
|
* Subscript alef correction ([#24707](https://github.com/qmk/qmk_firmware/pull/24707))
|
||||||
|
* Created SH1107 driver for quantum painter ([#24724](https://github.com/qmk/qmk_firmware/pull/24724))
|
||||||
|
* [CI] Regenerate Files ([#24772](https://github.com/qmk/qmk_firmware/pull/24772))
|
||||||
|
* Patch up issue for inverted complementary output on Backlight ([#24794](https://github.com/qmk/qmk_firmware/pull/24794))
|
||||||
|
* Patch up issue when compile with APA102 driver ([#24800](https://github.com/qmk/qmk_firmware/pull/24800))
|
||||||
|
* Consolidate send_string implementations. ([#24817](https://github.com/qmk/qmk_firmware/pull/24817))
|
||||||
|
* Consolidate timer_elapsed implementations ([#24830](https://github.com/qmk/qmk_firmware/pull/24830))
|
||||||
|
* `i2c_master`: remove deprecated functions ([#24832](https://github.com/qmk/qmk_firmware/pull/24832))
|
||||||
|
* Resolve keyboard_aliases when processing keyboard make targets ([#24834](https://github.com/qmk/qmk_firmware/pull/24834))
|
||||||
|
* LED drivers: remove deprecated defines ([#24837](https://github.com/qmk/qmk_firmware/pull/24837))
|
||||||
|
* `ferris/0_1`: update I2C API usage ([#24839](https://github.com/qmk/qmk_firmware/pull/24839))
|
||||||
|
* Unify i2c_master headers ([#24846](https://github.com/qmk/qmk_firmware/pull/24846))
|
||||||
|
* Community modules ([#24848](https://github.com/qmk/qmk_firmware/pull/24848))
|
||||||
|
* Relocate base WS2812 code ([#24850](https://github.com/qmk/qmk_firmware/pull/24850))
|
||||||
|
* Unify UART headers ([#24855](https://github.com/qmk/qmk_firmware/pull/24855))
|
||||||
|
* Unify spi_master headers ([#24857](https://github.com/qmk/qmk_firmware/pull/24857))
|
||||||
|
* Invoke `process_record_via` after `_user`/`_kb` have a chance to handle it. ([#24879](https://github.com/qmk/qmk_firmware/pull/24879))
|
||||||
|
|
||||||
|
CLI:
|
||||||
|
* Extend lint to reject 'blank' files ([#23994](https://github.com/qmk/qmk_firmware/pull/23994))
|
||||||
|
* `qmk docs`: restore `--port` and `--browser` arguments ([#24623](https://github.com/qmk/qmk_firmware/pull/24623))
|
||||||
|
* Update via2json layout macro searching ([#24640](https://github.com/qmk/qmk_firmware/pull/24640))
|
||||||
|
* Change `new-keymap` keymap name prompt ([#24701](https://github.com/qmk/qmk_firmware/pull/24701))
|
||||||
|
* default_keyboard.h generation tweaks ([#24715](https://github.com/qmk/qmk_firmware/pull/24715))
|
||||||
|
* Ensure `qmk flash` rejects invalid files for uf2 compatible bootloaders ([#24802](https://github.com/qmk/qmk_firmware/pull/24802))
|
||||||
|
* Reject readme dummy content ([#24913](https://github.com/qmk/qmk_firmware/pull/24913))
|
||||||
|
|
||||||
|
Submodule updates:
|
||||||
|
* chibios: usb_main: remove OTG sof workaround ([#24259](https://github.com/qmk/qmk_firmware/pull/24259))
|
||||||
|
* Update ChibiOS to latest stable branch. ([#24651](https://github.com/qmk/qmk_firmware/pull/24651))
|
||||||
|
* Update ChibiOS `stable_21.11.x`. ([#24714](https://github.com/qmk/qmk_firmware/pull/24714))
|
||||||
|
* Update ChibiOS-Contrib. ([#24803](https://github.com/qmk/qmk_firmware/pull/24803))
|
||||||
|
|
||||||
|
Keyboards:
|
||||||
|
* refactor: move ymdk/id75 to revision ([#24590](https://github.com/qmk/qmk_firmware/pull/24590))
|
||||||
|
* skyloong/gk61: Remove overriding of core keycode behaviour ([#24655](https://github.com/qmk/qmk_firmware/pull/24655))
|
||||||
|
* moky/moky88: Remove use of deprecated defines ([#24656](https://github.com/qmk/qmk_firmware/pull/24656))
|
||||||
|
* Updating Promenade keyboard (Missing keys in matrix, other minor changes to keymap) ([#24705](https://github.com/qmk/qmk_firmware/pull/24705))
|
||||||
|
* Moving cxt_studio keyboard to own folder ([#24748](https://github.com/qmk/qmk_firmware/pull/24748))
|
||||||
|
* Add CXT Studio 12E3 keyboard ([#24749](https://github.com/qmk/qmk_firmware/pull/24749))
|
||||||
|
* Add Silakka54 keyboard ([#24757](https://github.com/qmk/qmk_firmware/pull/24757))
|
||||||
|
* Add more layout for skiller_sgk50_s4 ([#24784](https://github.com/qmk/qmk_firmware/pull/24784))
|
||||||
|
* Add watchdog service to RGBKB Sol 3 ([#24786](https://github.com/qmk/qmk_firmware/pull/24786))
|
||||||
|
* Migrate some DEFAULT_FOLDER to keyboard_aliases.hjson ([#24835](https://github.com/qmk/qmk_firmware/pull/24835))
|
||||||
|
* Remove DEFAULT_FOLDER where keyboard aliases already exists ([#24838](https://github.com/qmk/qmk_firmware/pull/24838))
|
||||||
|
* Migrate some DEFAULT_FOLDER to keyboard_aliases.hjson ([#24845](https://github.com/qmk/qmk_firmware/pull/24845))
|
||||||
|
* Update for 'A-JAZZ AKC084' ('A-JAZZ AKP846') ([#24868](https://github.com/qmk/qmk_firmware/pull/24868))
|
||||||
|
* handwired/xealous - Remove DEFAULT_FOLDER ([#24877](https://github.com/qmk/qmk_firmware/pull/24877))
|
||||||
|
* Updates to Ploopy Classic, Mouse, and Thumb for RP2040 hardware upgrade ([#24880](https://github.com/qmk/qmk_firmware/pull/24880))
|
||||||
|
* Move Ergodox STM32 to handwired folder ([#24903](https://github.com/qmk/qmk_firmware/pull/24903))
|
||||||
|
* Remove readme dummy content ([#24912](https://github.com/qmk/qmk_firmware/pull/24912))
|
||||||
|
* Migrate some DEFAULT_FOLDER to keyboard_aliases.hjson ([#24915](https://github.com/qmk/qmk_firmware/pull/24915))
|
||||||
|
* Migrate some DEFAULT_FOLDER to keyboard_aliases.hjson ([#24938](https://github.com/qmk/qmk_firmware/pull/24938))
|
||||||
|
|
||||||
|
Keyboard fixes:
|
||||||
|
* Fix up CI with `DEFAULT_FOLDER`. ([#24842](https://github.com/qmk/qmk_firmware/pull/24842))
|
||||||
|
* rgbkb/pan - Remove invalid build target ([#24844](https://github.com/qmk/qmk_firmware/pull/24844))
|
||||||
|
|
||||||
|
Others:
|
||||||
|
* Formally deprecate DEFAULT_FOLDER ([#24836](https://github.com/qmk/qmk_firmware/pull/24836))
|
||||||
|
* Correct I2C API reference ([#24840](https://github.com/qmk/qmk_firmware/pull/24840))
|
||||||
|
|
||||||
|
Bugs:
|
||||||
|
* Retro Tapping Re-Write; Key Roll Fix ([#23641](https://github.com/qmk/qmk_firmware/pull/23641))
|
||||||
|
* Fix Quantum Painter compiliation issues with heavy optimization ([#24667](https://github.com/qmk/qmk_firmware/pull/24667))
|
||||||
|
* Bugfix and update for AT32F415 ([#24807](https://github.com/qmk/qmk_firmware/pull/24807))
|
||||||
|
* Fix for Chordal Hold: stuck mods when mod-taps are pressed in a stuttered sequence. ([#24878](https://github.com/qmk/qmk_firmware/pull/24878))
|
||||||
|
* fix EEPROM driver for STM32L0/1 cat.1 devices ([#24928](https://github.com/qmk/qmk_firmware/pull/24928))
|
299
docs/ChangeLog/20250525.md
Normal file
299
docs/ChangeLog/20250525.md
Normal file
|
@ -0,0 +1,299 @@
|
||||||
|
# QMK Breaking Changes - 2025 May 25 Changelog
|
||||||
|
|
||||||
|
## Notable Features
|
||||||
|
|
||||||
|
### Flow Tap ([#25125](https://github.com/qmk/qmk_firmware/pull/25125))
|
||||||
|
|
||||||
|
Adds Flow Tap as a core tap-hold option to disable HRMs during fast typing, aka Global Quick Tap, Require Prior Idle.
|
||||||
|
|
||||||
|
Flow Tap modifies mod-tap MT and layer-tap LT keys such that when pressed within a short timeout of the preceding key, the tapping behavior is triggered. It basically disables the hold behavior during fast typing, creating a "flow of taps." It also helps to reduce the input lag of tap-hold keys during fast typing, since the tapped behavior is sent immediately.
|
||||||
|
|
||||||
|
See the [Flow Tap documentation](../tap_hold#flow-tap) for more information.
|
||||||
|
|
||||||
|
### Community Modules `1.1.1` ([#25050](https://github.com/qmk/qmk_firmware/pull/25050), [#25187](https://github.com/qmk/qmk_firmware/pull/25187))
|
||||||
|
|
||||||
|
Version `1.1.1` introduces support for module defined RGB matrix effects and indicator callbacks, as well as pointing and layer state callbacks.
|
||||||
|
|
||||||
|
See the [Community Modules documentation](../features/community_modules) for more information, including the full list of available hooks.
|
||||||
|
|
||||||
|
## Changes Requiring User Action
|
||||||
|
|
||||||
|
### Updated Keyboard Codebases
|
||||||
|
|
||||||
|
| Old Keyboard Name | New Keyboard Name |
|
||||||
|
|------------------------|----------------------|
|
||||||
|
| chew | chew/split |
|
||||||
|
| deemen17/de60fs | deemen17/de60/r1 |
|
||||||
|
| keyten/kt60hs_t | keyten/kt60hs_t/v1 |
|
||||||
|
| plywrks/ply8x | plywrks/ply8x/solder |
|
||||||
|
| rookiebwoy/late9/rev1 | ivndbt/late9/rev1 |
|
||||||
|
| rookiebwoy/neopad/rev1 | ivndbt/neopad/rev1 |
|
||||||
|
|
||||||
|
## Deprecation Notices
|
||||||
|
|
||||||
|
In line with the [notice period](../support_deprecation_policy#how-much-advance-notice-will-be-given), deprecation notices for larger items are listed here.
|
||||||
|
|
||||||
|
### Deprecation of `qmk generate-compilation-database` ([#25237](https://github.com/qmk/qmk_firmware/pull/25237))
|
||||||
|
|
||||||
|
This command has been deprecated as it cannot take into account configurables such as [converters](/feature_converters) or environment variables normally specified on the command line; please use the `--compiledb` flag with `qmk compile` instead.
|
||||||
|
|
||||||
|
### Deprecation of `usb.force_nkro`/`FORCE_NKRO` ([#25262](https://github.com/qmk/qmk_firmware/pull/25262))
|
||||||
|
|
||||||
|
Unpicking the assumption that only USB can do NKRO, forcing of NKRO on every boot has been deprecated. As this setting persists, it produces unnecessary user confusion when the various NKRO keycodes (for example `NK_TOGG`) do not behave as expected.
|
||||||
|
|
||||||
|
The new defaults can be configured in the following ways:
|
||||||
|
|
||||||
|
:::::tabs
|
||||||
|
|
||||||
|
==== keyboard.json
|
||||||
|
|
||||||
|
```json [keyboard.json]
|
||||||
|
{
|
||||||
|
"host": { // [!code focus]
|
||||||
|
"default": { // [!code focus]
|
||||||
|
"nkro": true // [!code focus]
|
||||||
|
} // [!code focus]
|
||||||
|
} // [!code focus]
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
==== keymap.json
|
||||||
|
|
||||||
|
```json [keymap.json]
|
||||||
|
{
|
||||||
|
"config": {
|
||||||
|
"host": { // [!code focus]
|
||||||
|
"default": { // [!code focus]
|
||||||
|
"nkro": true // [!code focus]
|
||||||
|
} // [!code focus]
|
||||||
|
} // [!code focus]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
==== config.h
|
||||||
|
|
||||||
|
```c [config.h]
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#define NKRO_DEFAULT_ON true // [!code focus]
|
||||||
|
```
|
||||||
|
|
||||||
|
:::::
|
||||||
|
|
||||||
|
The deprecated options will be removed in a future breaking changes cycle.
|
||||||
|
|
||||||
|
### `CTPC`/`CONVERT_TO_PROTON_C` removal ([#25111](https://github.com/qmk/qmk_firmware/pull/25111))
|
||||||
|
|
||||||
|
Deprecated build options `CTPC` and `CONVERT_TO_PROTON_C` have been removed. Users should of these should migrate to `CONVERT_TO=proton_c`.
|
||||||
|
|
||||||
|
see the [Converters Feature](../feature_converters) documentation for more information.
|
||||||
|
|
||||||
|
### `DEFAULT_FOLDER` removal ([#23281](https://github.com/qmk/qmk_firmware/pull/23281))
|
||||||
|
|
||||||
|
`DEFAULT_FOLDER` was originally introduced to work around limitations within the build system.
|
||||||
|
Parent folders containing common configuration would create invalid build targets.
|
||||||
|
|
||||||
|
With the introduction of [`keyboard.json`](./20240526#keyboard-json) as a configuration file, the build system now has a consistent method to detect build targets.
|
||||||
|
The `DEFAULT_FOLDER` functionality is now redundant and the intent is for `rules.mk` to become pure configuration.
|
||||||
|
|
||||||
|
Backwards compatibility of build targets has been maintained where possible.
|
||||||
|
|
||||||
|
### Converter `Pin Compatible` updates ([#20330](https://github.com/qmk/qmk_firmware/pull/20330))
|
||||||
|
|
||||||
|
Converter support will be further limited to only function if a keyboard declares that is is compatible.
|
||||||
|
|
||||||
|
This can be configured in the following ways:
|
||||||
|
|
||||||
|
:::::tabs
|
||||||
|
|
||||||
|
==== keyboard.json
|
||||||
|
|
||||||
|
```json [keyboard.json]
|
||||||
|
{
|
||||||
|
"development_board": "promicro", // [!code focus]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
==== rules.mk
|
||||||
|
|
||||||
|
```make [rules.mk]
|
||||||
|
PIN_COMPATIBLE = promicro
|
||||||
|
```
|
||||||
|
|
||||||
|
:::::
|
||||||
|
|
||||||
|
see the [Converters Feature](../feature_converters) documentation for more information.
|
||||||
|
|
||||||
|
### Deprecation of `encoder_update_{kb|user}`
|
||||||
|
|
||||||
|
These callbacks are now considered end-of-life and will be removed over the next breaking changes cycle, ending August 2025. PRs containing these callbacks will be asked to change to use [encoder mapping](/features/encoders#encoder-map).
|
||||||
|
|
||||||
|
`ENCODER_MAP_ENABLE` will subsequently be changed to "default-on" when encoders are enabled, and future breaking changes cycles will remove this flag entirely.
|
||||||
|
|
||||||
|
To migrate usage of `encoder_update_user` to encoder map you'll need to handle all of the following changes in your `keymap.c`:
|
||||||
|
|
||||||
|
:::::tabs
|
||||||
|
|
||||||
|
=== 1. Add keycode definitions
|
||||||
|
|
||||||
|
Define new keycodes:
|
||||||
|
|
||||||
|
```c
|
||||||
|
enum {
|
||||||
|
MY_ENCODER_LEFT = QK_USER, // [!code focus]
|
||||||
|
MY_ENCODER_RIGHT, // [!code focus]
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
=== 2. Add encoder mapping
|
||||||
|
|
||||||
|
Add the keycodes to a new encoder map (optionally with transparent layers above, if you want identical functionality of layer-independence):
|
||||||
|
|
||||||
|
```c
|
||||||
|
#if defined(ENCODER_MAP_ENABLE)
|
||||||
|
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
|
||||||
|
[0] = { ENCODER_CCW_CW(MY_ENCODER_LEFT, MY_ENCODER_RIGHT) }, // [!code focus]
|
||||||
|
[1] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS) }, // [!code focus]
|
||||||
|
[2] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS) }, // [!code focus]
|
||||||
|
[3] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS) }, // [!code focus]
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
```
|
||||||
|
|
||||||
|
=== 3. Add keycode processing
|
||||||
|
|
||||||
|
Handle the new keycodes within `process_record_user`, much like any other keycode in your keymap:
|
||||||
|
|
||||||
|
```c
|
||||||
|
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||||
|
switch (keycode) {
|
||||||
|
case MY_ENCODER_LEFT: // [!code focus]
|
||||||
|
if (record->event.pressed) { // [!code focus]
|
||||||
|
// Add the same code you had in your `encoder_update_user` for the left-rotation code // [!code focus]
|
||||||
|
} // [!code focus]
|
||||||
|
return false; // Skip all further processing of this keycode // [!code focus]
|
||||||
|
case MY_ENCODER_RIGHT: // [!code focus]
|
||||||
|
if (record->event.pressed) { // [!code focus]
|
||||||
|
// Add the same code you had in your `encoder_update_user` for the right-rotation code // [!code focus]
|
||||||
|
} // [!code focus]
|
||||||
|
return false; // Skip all further processing of this keycode // [!code focus]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
=== 4. Remove old code
|
||||||
|
|
||||||
|
Remove your implementation of `encoder_update_user` from your `keymap.c`.
|
||||||
|
|
||||||
|
::::::
|
||||||
|
|
||||||
|
If your board has multiple encoders, each encoder will need its own pair of keycodes defined as per above.
|
||||||
|
|
||||||
|
## Full changelist
|
||||||
|
|
||||||
|
Core:
|
||||||
|
* Non-volatile memory data repository pattern ([#24356](https://github.com/qmk/qmk_firmware/pull/24356))
|
||||||
|
* High resolution scrolling (without feature report parsing) ([#24423](https://github.com/qmk/qmk_firmware/pull/24423))
|
||||||
|
* Implement battery level interface ([#24666](https://github.com/qmk/qmk_firmware/pull/24666))
|
||||||
|
* get_keycode_string(): function to format keycodes as strings, for more readable debug logging. ([#24787](https://github.com/qmk/qmk_firmware/pull/24787))
|
||||||
|
* [Cleanup] Handling of optional `*.mk` files ([#24952](https://github.com/qmk/qmk_firmware/pull/24952))
|
||||||
|
* Add EOL to non-keyboard files ([#24990](https://github.com/qmk/qmk_firmware/pull/24990))
|
||||||
|
* use `keycode_string` in unit tests ([#25042](https://github.com/qmk/qmk_firmware/pull/25042))
|
||||||
|
* Add additional hooks for Community modules ([#25050](https://github.com/qmk/qmk_firmware/pull/25050))
|
||||||
|
* Remove `CTPC`/`CONVERT_TO_PROTON_C` options ([#25111](https://github.com/qmk/qmk_firmware/pull/25111))
|
||||||
|
* Flow Tap tap-hold option to disable HRMs during fast typing (aka Global Quick Tap, Require Prior Idle). ([#25125](https://github.com/qmk/qmk_firmware/pull/25125))
|
||||||
|
* Remove `bluefruit_le_read_battery_voltage` function ([#25129](https://github.com/qmk/qmk_firmware/pull/25129))
|
||||||
|
* Avoid duplication in generated community modules `rules.mk` ([#25135](https://github.com/qmk/qmk_firmware/pull/25135))
|
||||||
|
* [chore]: move and rename mouse/scroll min/max defines ([#25141](https://github.com/qmk/qmk_firmware/pull/25141))
|
||||||
|
* Ignore the Layer Lock key in Repeat Key and Caps Word. ([#25171](https://github.com/qmk/qmk_firmware/pull/25171))
|
||||||
|
* Allow for disabling EEPROM subsystem entirely. ([#25173](https://github.com/qmk/qmk_firmware/pull/25173))
|
||||||
|
* Implement connection keycode logic ([#25176](https://github.com/qmk/qmk_firmware/pull/25176))
|
||||||
|
* Align ChibiOS `USB_WAIT_FOR_ENUMERATION` implementation ([#25184](https://github.com/qmk/qmk_firmware/pull/25184))
|
||||||
|
* Enable community modules to define LED matrix and RGB matrix effects. ([#25187](https://github.com/qmk/qmk_firmware/pull/25187))
|
||||||
|
* Bind Bluetooth driver to `host_driver_t` ([#25199](https://github.com/qmk/qmk_firmware/pull/25199))
|
||||||
|
* Enhance Flow Tap to work better for rolls over multiple tap-hold keys. ([#25200](https://github.com/qmk/qmk_firmware/pull/25200))
|
||||||
|
* Remove force disable of NKRO when Bluetooth enabled ([#25201](https://github.com/qmk/qmk_firmware/pull/25201))
|
||||||
|
* [New Feature/Core] New RGB Matrix Animation "Starlight Smooth" ([#25203](https://github.com/qmk/qmk_firmware/pull/25203))
|
||||||
|
* Add battery changed callbacks ([#25207](https://github.com/qmk/qmk_firmware/pull/25207))
|
||||||
|
* Generate versions to keycode headers ([#25219](https://github.com/qmk/qmk_firmware/pull/25219))
|
||||||
|
* Add raw_hid support to host driver ([#25255](https://github.com/qmk/qmk_firmware/pull/25255))
|
||||||
|
* Deprecate `usb.force_nkro`/`FORCE_NKRO` ([#25262](https://github.com/qmk/qmk_firmware/pull/25262))
|
||||||
|
* [Chore] use {rgblight,rgb_matrix}_hsv_to_rgb overrides ([#25271](https://github.com/qmk/qmk_firmware/pull/25271))
|
||||||
|
* Remove outdated `nix` support due to bit-rot. ([#25280](https://github.com/qmk/qmk_firmware/pull/25280))
|
||||||
|
|
||||||
|
CLI:
|
||||||
|
* Align to latest CLI dependencies ([#24553](https://github.com/qmk/qmk_firmware/pull/24553))
|
||||||
|
* Exclude external userspace from lint checking ([#24680](https://github.com/qmk/qmk_firmware/pull/24680))
|
||||||
|
* [Modules] Provide access to current path in `rules.mk`. ([#25061](https://github.com/qmk/qmk_firmware/pull/25061))
|
||||||
|
* Add "license" field to Community Module JSON schema. ([#25085](https://github.com/qmk/qmk_firmware/pull/25085))
|
||||||
|
* Prompt for converter when creating new keymap ([#25116](https://github.com/qmk/qmk_firmware/pull/25116))
|
||||||
|
* Extend lint checks to reject duplication of defaults ([#25149](https://github.com/qmk/qmk_firmware/pull/25149))
|
||||||
|
* Add lint warning for empty url ([#25182](https://github.com/qmk/qmk_firmware/pull/25182))
|
||||||
|
* Deprecate `qmk generate-compilation-database`. ([#25237](https://github.com/qmk/qmk_firmware/pull/25237))
|
||||||
|
* Use relative paths for schemas, instead of $id. Enables VScode validation. ([#25251](https://github.com/qmk/qmk_firmware/pull/25251))
|
||||||
|
|
||||||
|
Submodule updates:
|
||||||
|
* STM32G0x1 support ([#24301](https://github.com/qmk/qmk_firmware/pull/24301))
|
||||||
|
* Update develop branch to Pico SDK 1.5.1 ([#25178](https://github.com/qmk/qmk_firmware/pull/25178))
|
||||||
|
* Add `compiler_support.h` ([#25274](https://github.com/qmk/qmk_firmware/pull/25274))
|
||||||
|
|
||||||
|
Keyboards:
|
||||||
|
* add 75_(ansi|iso) Community Layouts to mechlovin/olly/octagon ([#22459](https://github.com/qmk/qmk_firmware/pull/22459))
|
||||||
|
* Add the plywrks ply8x hotswap variant. ([#23558](https://github.com/qmk/qmk_firmware/pull/23558))
|
||||||
|
* Add Community Layout support to daskeyboard4 ([#23884](https://github.com/qmk/qmk_firmware/pull/23884))
|
||||||
|
* New standard layout for Savage65 (65_ansi_blocker_tsangan_split_bs) ([#24690](https://github.com/qmk/qmk_firmware/pull/24690))
|
||||||
|
* Add Icebreaker keyboard ([#24723](https://github.com/qmk/qmk_firmware/pull/24723))
|
||||||
|
* Update Tractyl Manuform and add F405 (weact) variant ([#24764](https://github.com/qmk/qmk_firmware/pull/24764))
|
||||||
|
* Chew folders ([#24785](https://github.com/qmk/qmk_firmware/pull/24785))
|
||||||
|
* modelh: add prerequisites for via support ([#24932](https://github.com/qmk/qmk_firmware/pull/24932))
|
||||||
|
* Only configure `STM32_HSECLK` within `board.h` ([#25001](https://github.com/qmk/qmk_firmware/pull/25001))
|
||||||
|
* Allow LVGL onekey keymap to be able compile for other board ([#25005](https://github.com/qmk/qmk_firmware/pull/25005))
|
||||||
|
* Remove Sofle `rgb_default` keymap & tidy readme's ([#25010](https://github.com/qmk/qmk_firmware/pull/25010))
|
||||||
|
* Migrate remaining `split.soft_serial_pin` to `split.serial.pin` ([#25046](https://github.com/qmk/qmk_firmware/pull/25046))
|
||||||
|
* Update keymap for keycult 1800 ([#25070](https://github.com/qmk/qmk_firmware/pull/25070))
|
||||||
|
* Add kt60HS-T v2 PCB ([#25080](https://github.com/qmk/qmk_firmware/pull/25080))
|
||||||
|
* Refactor Deemen17 Works DE60 ([#25088](https://github.com/qmk/qmk_firmware/pull/25088))
|
||||||
|
* Rookiebwoy to ivndbt ([#25142](https://github.com/qmk/qmk_firmware/pull/25142))
|
||||||
|
* Remove duplication of RGB Matrix defaults ([#25146](https://github.com/qmk/qmk_firmware/pull/25146))
|
||||||
|
* ymdk/id75/rp2040 ([#25157](https://github.com/qmk/qmk_firmware/pull/25157))
|
||||||
|
* Remove duplication of RGBLight defaults ([#25169](https://github.com/qmk/qmk_firmware/pull/25169))
|
||||||
|
* Remove empty `url` fields ([#25181](https://github.com/qmk/qmk_firmware/pull/25181))
|
||||||
|
* Remove more duplication of defaults ([#25189](https://github.com/qmk/qmk_firmware/pull/25189))
|
||||||
|
* Remove `"console":false` from keyboards ([#25190](https://github.com/qmk/qmk_firmware/pull/25190))
|
||||||
|
* Remove `"command":false` from keyboards ([#25193](https://github.com/qmk/qmk_firmware/pull/25193))
|
||||||
|
* Remove redundant keyboard headers ([#25208](https://github.com/qmk/qmk_firmware/pull/25208))
|
||||||
|
* Add debounce to duplicated defaults check ([#25246](https://github.com/qmk/qmk_firmware/pull/25246))
|
||||||
|
* Remove duplicate of SPI default config from keyboards ([#25266](https://github.com/qmk/qmk_firmware/pull/25266))
|
||||||
|
* Resolve miscellaneous keyboard lint warnings ([#25268](https://github.com/qmk/qmk_firmware/pull/25268))
|
||||||
|
* Configure boards to use development_board - 0-9 ([#25287](https://github.com/qmk/qmk_firmware/pull/25287))
|
||||||
|
* Configure boards to use development_board - UVWXYZ ([#25288](https://github.com/qmk/qmk_firmware/pull/25288))
|
||||||
|
* Configure boards to use development_board - S ([#25293](https://github.com/qmk/qmk_firmware/pull/25293))
|
||||||
|
* Configure boards to use development_board - T ([#25294](https://github.com/qmk/qmk_firmware/pull/25294))
|
||||||
|
|
||||||
|
Keyboard fixes:
|
||||||
|
* Fix `boardsource/beiwagon` RGB Matrix coordinates ([#25018](https://github.com/qmk/qmk_firmware/pull/25018))
|
||||||
|
* amptrics/0422 - Prevent OOB in `update_leds_for_layer` ([#25209](https://github.com/qmk/qmk_firmware/pull/25209))
|
||||||
|
* salicylic_acid3/getta25 - Fix oled keymap ([#25295](https://github.com/qmk/qmk_firmware/pull/25295))
|
||||||
|
|
||||||
|
Others:
|
||||||
|
* Require 'x'/'y' properties for LED/RGB Matrix layout ([#24997](https://github.com/qmk/qmk_firmware/pull/24997))
|
||||||
|
* Align `new-keyboard` template to current standards ([#25191](https://github.com/qmk/qmk_firmware/pull/25191))
|
||||||
|
|
||||||
|
Bugs:
|
||||||
|
* Fix OS_DETECTION_KEYBOARD_RESET ([#25015](https://github.com/qmk/qmk_firmware/pull/25015))
|
||||||
|
* Fix outdated GPIO control function usage ([#25060](https://github.com/qmk/qmk_firmware/pull/25060))
|
||||||
|
* Cater for use of `__errno_r()` in ChibiOS syscalls.c with newer picolibc revisions ([#25121](https://github.com/qmk/qmk_firmware/pull/25121))
|
||||||
|
* Fixup eeconfig lighting reset. ([#25166](https://github.com/qmk/qmk_firmware/pull/25166))
|
||||||
|
* Fix for Flow Tap: fix handling of distinct taps and timer updates. ([#25175](https://github.com/qmk/qmk_firmware/pull/25175))
|
||||||
|
* Minimise force-included files ([#25194](https://github.com/qmk/qmk_firmware/pull/25194))
|
||||||
|
* Ensure `qmk_userspace_paths` maintains detected order ([#25204](https://github.com/qmk/qmk_firmware/pull/25204))
|
||||||
|
* Resolve alias for `qmk new-keymap` keyboard prompts ([#25210](https://github.com/qmk/qmk_firmware/pull/25210))
|
||||||
|
* gcc15 AVR compilation fixes ([#25238](https://github.com/qmk/qmk_firmware/pull/25238))
|
||||||
|
* Fix typos introduced by PR #25050 ([#25250](https://github.com/qmk/qmk_firmware/pull/25250))
|
||||||
|
* Fix Wear Leveling compilation ([#25254](https://github.com/qmk/qmk_firmware/pull/25254))
|
||||||
|
* Remove more USB only branches from NKRO handling ([#25263](https://github.com/qmk/qmk_firmware/pull/25263))
|
||||||
|
* [Fix] lib8tion: enable fixed scale8 and blend functions ([#25272](https://github.com/qmk/qmk_firmware/pull/25272))
|
||||||
|
* Fix tap_hold code blocks ([#25298](https://github.com/qmk/qmk_firmware/pull/25298))
|
|
@ -60,6 +60,7 @@
|
||||||
"items": [
|
"items": [
|
||||||
{ "text": "Customizing Functionality", "link": "/custom_quantum_functions" },
|
{ "text": "Customizing Functionality", "link": "/custom_quantum_functions" },
|
||||||
{ "text": "Driver Installation with Zadig", "link": "/driver_installation_zadig" },
|
{ "text": "Driver Installation with Zadig", "link": "/driver_installation_zadig" },
|
||||||
|
{ "text": "Community Modules", "link": "/features/community_modules" },
|
||||||
{ "text": "Keymap Overview", "link": "/keymap" },
|
{ "text": "Keymap Overview", "link": "/keymap" },
|
||||||
{
|
{
|
||||||
"text": "Development Environments",
|
"text": "Development Environments",
|
||||||
|
@ -206,7 +207,7 @@
|
||||||
{ "text": "My Pull Request Was Flagged", "link": "/breaking_changes_instructions" },
|
{ "text": "My Pull Request Was Flagged", "link": "/breaking_changes_instructions" },
|
||||||
{
|
{
|
||||||
"text": "Most Recent ChangeLog",
|
"text": "Most Recent ChangeLog",
|
||||||
"link": "/ChangeLog/20241124"
|
"link": "/ChangeLog/20250525"
|
||||||
},
|
},
|
||||||
{ "text": "Past Breaking Changes", "link": "/breaking_changes_history" },
|
{ "text": "Past Breaking Changes", "link": "/breaking_changes_history" },
|
||||||
{ "text": "Deprecation Policy", "link": "/support_deprecation_policy" }
|
{ "text": "Deprecation Policy", "link": "/support_deprecation_policy" }
|
||||||
|
@ -226,6 +227,7 @@
|
||||||
{ "text": "ADC Driver", "link": "/drivers/adc" },
|
{ "text": "ADC Driver", "link": "/drivers/adc" },
|
||||||
{ "text": "APA102 Driver", "link": "/drivers/apa102" },
|
{ "text": "APA102 Driver", "link": "/drivers/apa102" },
|
||||||
{ "text": "Audio Driver", "link": "/drivers/audio" },
|
{ "text": "Audio Driver", "link": "/drivers/audio" },
|
||||||
|
{ "text": "Battery Driver", "link": "/drivers/battery" },
|
||||||
{ "text": "EEPROM Driver", "link": "/drivers/eeprom" },
|
{ "text": "EEPROM Driver", "link": "/drivers/eeprom" },
|
||||||
{ "text": "Flash Driver", "link": "/drivers/flash" },
|
{ "text": "Flash Driver", "link": "/drivers/flash" },
|
||||||
{ "text": "I2C Driver", "link": "/drivers/i2c" },
|
{ "text": "I2C Driver", "link": "/drivers/i2c" },
|
||||||
|
|
|
@ -10,25 +10,25 @@ Practically, this means QMK merges the `develop` branch into the `master` branch
|
||||||
|
|
||||||
## What has been included in past Breaking Changes?
|
## What has been included in past Breaking Changes?
|
||||||
|
|
||||||
|
* [2025 May 25](ChangeLog/20250525)
|
||||||
|
* [2025 Feb 23](ChangeLog/20250223)
|
||||||
* [2024 Nov 24](ChangeLog/20241124)
|
* [2024 Nov 24](ChangeLog/20241124)
|
||||||
* [2024 Aug 25](ChangeLog/20240825)
|
|
||||||
* [2024 May 26](ChangeLog/20240526)
|
|
||||||
* [Older Breaking Changes](breaking_changes_history)
|
* [Older Breaking Changes](breaking_changes_history)
|
||||||
|
|
||||||
## When is the next Breaking Change?
|
## When is the next Breaking Change?
|
||||||
|
|
||||||
The next Breaking Change is scheduled for February 23, 2025.
|
The next Breaking Change is scheduled for Aug 31, 2025.
|
||||||
|
|
||||||
### Important Dates
|
### Important Dates
|
||||||
|
|
||||||
* 2024 Nov 24 - `develop` is tagged with a new release version. Each push to `master` is subsequently merged to `develop` by GitHub actions.
|
* 2025 May 25 - `develop` is tagged with a new release version. Each push to `master` is subsequently merged to `develop` by GitHub actions.
|
||||||
* 2025 Jan 26 - `develop` closed to new PRs.
|
* 2025 Aug 3 - `develop` closed to new PRs.
|
||||||
* 2025 Jan 26 - Call for testers.
|
* 2025 Aug 3 - Call for testers.
|
||||||
* 2025 Feb 9 - Last day for merges -- after this point `develop` is locked for testing and accepts only bugfixes
|
* 2025 Aug 17 - Last day for merges -- after this point `develop` is locked for testing and accepts only bugfixes
|
||||||
* 2025 Feb 16 - `develop` is locked, only critical bugfix PRs merged.
|
* 2025 Aug 24 - `develop` is locked, only critical bugfix PRs merged.
|
||||||
* 2024 Nov 21 - `master` is locked, no PRs merged.
|
* 2025 Aug 29 - `master` is locked, no PRs merged.
|
||||||
* 2025 Feb 23 - Merge `develop` to `master`.
|
* 2025 Aug 31 - Merge `develop` to `master`.
|
||||||
* 2025 Feb 23 - `master` is unlocked. PRs can be merged again.
|
* 2025 Aug 31 - `master` is unlocked. PRs can be merged again.
|
||||||
|
|
||||||
## What changes will be included?
|
## What changes will be included?
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
This page links to all previous changelogs from the QMK Breaking Changes process.
|
This page links to all previous changelogs from the QMK Breaking Changes process.
|
||||||
|
|
||||||
|
* [2025 May 25](ChangeLog/20250525) - version 0.29.0
|
||||||
|
* [2025 Feb 23](ChangeLog/20250223) - version 0.28.0
|
||||||
* [2024 Nov 24](ChangeLog/20241124) - version 0.27.0
|
* [2024 Nov 24](ChangeLog/20241124) - version 0.27.0
|
||||||
* [2024 Aug 25](ChangeLog/20240825) - version 0.26.0
|
* [2024 Aug 25](ChangeLog/20240825) - version 0.26.0
|
||||||
* [2024 May 26](ChangeLog/20240526) - version 0.25.0
|
* [2024 May 26](ChangeLog/20240526) - version 0.25.0
|
||||||
|
|
16
docs/cli.md
16
docs/cli.md
|
@ -6,7 +6,7 @@ The QMK CLI (command line interface) makes building and working with QMK keyboar
|
||||||
|
|
||||||
### Requirements {#requirements}
|
### Requirements {#requirements}
|
||||||
|
|
||||||
QMK requires Python 3.7 or greater. We try to keep the number of requirements small but you will also need to install the packages listed in [`requirements.txt`](https://github.com/qmk/qmk_firmware/blob/master/requirements.txt). These are installed automatically when you install the QMK CLI.
|
QMK requires Python 3.9 or greater. We try to keep the number of requirements small but you will also need to install the packages listed in [`requirements.txt`](https://github.com/qmk/qmk_firmware/blob/master/requirements.txt). These are installed automatically when you install the QMK CLI.
|
||||||
|
|
||||||
### Install Using Homebrew (macOS, some Linux) {#install-using-homebrew}
|
### Install Using Homebrew (macOS, some Linux) {#install-using-homebrew}
|
||||||
|
|
||||||
|
@ -18,9 +18,21 @@ export QMK_HOME='~/qmk_firmware' # Optional, set the location for `qmk_firmware`
|
||||||
qmk setup # This will clone `qmk/qmk_firmware` and optionally set up your build environment
|
qmk setup # This will clone `qmk/qmk_firmware` and optionally set up your build environment
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Install Using uv {#install-using-uv}
|
||||||
|
|
||||||
|
If you have installed [uv](https://docs.astral.sh/uv/), the QMK CLI can be installed and managed as a uv tool:
|
||||||
|
|
||||||
|
```
|
||||||
|
uv tool install qmk
|
||||||
|
export QMK_HOME='~/qmk_firmware' # Optional, set the location for `qmk_firmware`
|
||||||
|
qmk setup # This will clone `qmk/qmk_firmware` and optionally set up your build environment
|
||||||
|
```
|
||||||
|
|
||||||
|
This installation can be updated via `uv tool upgrade qmk`. See [Upgrading tools](https://docs.astral.sh/uv/guides/tools/#upgrading-tools) for more information.
|
||||||
|
|
||||||
### Install Using pip {#install-using-easy_install-or-pip}
|
### Install Using pip {#install-using-easy_install-or-pip}
|
||||||
|
|
||||||
If your system is not listed above you can install QMK manually. First ensure that you have Python 3.7 (or later) installed and have installed pip. Then install QMK with this command:
|
If your system is not listed above you can install QMK manually. First ensure that you have Python 3.9 (or later) installed and have installed pip. Then install QMK with this command:
|
||||||
|
|
||||||
```
|
```
|
||||||
python3 -m pip install qmk
|
python3 -m pip install qmk
|
||||||
|
|
|
@ -17,7 +17,7 @@ qmk compile [-c] <configuratorExport.json>
|
||||||
**Usage for Keymaps**:
|
**Usage for Keymaps**:
|
||||||
|
|
||||||
```
|
```
|
||||||
qmk compile [-c] [-e <var>=<value>] [-j <num_jobs>] -kb <keyboard_name> -km <keymap_name>
|
qmk compile [-c] [-e <var>=<value>] [-j <num_jobs>] [--compiledb] -kb <keyboard_name> -km <keymap_name>
|
||||||
```
|
```
|
||||||
|
|
||||||
**Usage in Keyboard Directory**:
|
**Usage in Keyboard Directory**:
|
||||||
|
@ -84,6 +84,25 @@ The `num_jobs` argument determines the maximum number of jobs that can be used.
|
||||||
qmk compile -j 0 -kb <keyboard_name>
|
qmk compile -j 0 -kb <keyboard_name>
|
||||||
```
|
```
|
||||||
|
|
||||||
|
**Compilation Database**:
|
||||||
|
|
||||||
|
Creates a `compile_commands.json` file.
|
||||||
|
|
||||||
|
Does your IDE/editor use a language server but doesn't _quite_ find all the necessary include files? Do you hate red squigglies? Do you wish your editor could figure out `#include QMK_KEYBOARD_H`? You might need a [compilation database](https://clang.llvm.org/docs/JSONCompilationDatabase.html)! Compiling using this argument can create this for you.
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
|
||||||
|
```
|
||||||
|
$ cd ~/qmk_firmware/keyboards/gh60/satan/keymaps/colemak
|
||||||
|
$ qmk compile --compiledb
|
||||||
|
Ψ Making clean
|
||||||
|
Ψ Gathering build instructions from make ........
|
||||||
|
Ψ Found 63 compile commands
|
||||||
|
Ψ Writing build database to /Users/you/src/qmk_firmware/compile_commands.json
|
||||||
|
Ψ Compiling keymap with make ........
|
||||||
|
... build log continues ...
|
||||||
|
```
|
||||||
|
|
||||||
## `qmk flash`
|
## `qmk flash`
|
||||||
|
|
||||||
This command is similar to `qmk compile`, but can also target a bootloader. The bootloader is optional, and is set to `:flash` by default. To specify a different bootloader, use `-bl <bootloader>`. Visit the [Flashing Firmware](flashing) guide for more details of the available bootloaders.
|
This command is similar to `qmk compile`, but can also target a bootloader. The bootloader is optional, and is set to `:flash` by default. To specify a different bootloader, use `-bl <bootloader>`. Visit the [Flashing Firmware](flashing) guide for more details of the available bootloaders.
|
||||||
|
@ -694,52 +713,28 @@ qmk format-c
|
||||||
qmk format-c -b branch_name
|
qmk format-c -b branch_name
|
||||||
```
|
```
|
||||||
|
|
||||||
## `qmk generate-compilation-database`
|
|
||||||
|
|
||||||
**Usage**:
|
|
||||||
|
|
||||||
```
|
|
||||||
qmk generate-compilation-database [-kb KEYBOARD] [-km KEYMAP]
|
|
||||||
```
|
|
||||||
|
|
||||||
Creates a `compile_commands.json` file.
|
|
||||||
|
|
||||||
Does your IDE/editor use a language server but doesn't _quite_ find all the necessary include files? Do you hate red squigglies? Do you wish your editor could figure out `#include QMK_KEYBOARD_H`? You might need a [compilation database](https://clang.llvm.org/docs/JSONCompilationDatabase.html)! The qmk tool can build this for you.
|
|
||||||
|
|
||||||
This command needs to know which keyboard and keymap to build. It uses the same configuration options as the `qmk compile` command: arguments, current directory, and config files.
|
|
||||||
|
|
||||||
**Example:**
|
|
||||||
|
|
||||||
```
|
|
||||||
$ cd ~/qmk_firmware/keyboards/gh60/satan/keymaps/colemak
|
|
||||||
$ qmk generate-compilation-database
|
|
||||||
Ψ Making clean
|
|
||||||
Ψ Gathering build instructions from make -n gh60/satan:colemak
|
|
||||||
Ψ Found 50 compile commands
|
|
||||||
Ψ Writing build database to /Users/you/src/qmk_firmware/compile_commands.json
|
|
||||||
```
|
|
||||||
|
|
||||||
Now open your dev environment and live a squiggly-free life.
|
|
||||||
|
|
||||||
## `qmk docs`
|
## `qmk docs`
|
||||||
|
|
||||||
This command starts a local HTTP server which you can use for browsing or improving the docs. Default port is 5173.
|
This command starts a local HTTP server which you can use for browsing or improving the docs, and provides live reload capability whilst editing. Default port is 8936.
|
||||||
|
Use the `-b`/`--browser` flag to automatically open the local webserver in your default browser.
|
||||||
|
|
||||||
This command requires `node` and `yarn` to be installed as prerequisites, and provides live reload capability whilst editing.
|
Requires `node` and `yarn` to be installed as prerequisites.
|
||||||
|
|
||||||
**Usage**:
|
**Usage**:
|
||||||
|
|
||||||
```
|
```
|
||||||
usage: qmk docs [-h]
|
usage: qmk docs [-h] [-b] [-p PORT]
|
||||||
|
|
||||||
options:
|
options:
|
||||||
-h, --help show this help message and exit
|
-h, --help show this help message and exit
|
||||||
|
-b, --browser Open the docs in the default browser.
|
||||||
|
-p, --port PORT Port number to use.
|
||||||
```
|
```
|
||||||
|
|
||||||
## `qmk generate-docs`
|
## `qmk generate-docs`
|
||||||
|
|
||||||
This command allows you to generate QMK documentation locally. It can be uses for general browsing or improving the docs.
|
This command generates QMK documentation for production.
|
||||||
Use the `-s`/`--serve` flag to also serve the static site once built. Default port is 4173.
|
Use the `-s`/`--serve` flag to also serve the static site on port 4173 once built. Note that this does not provide live reloading; use `qmk docs` instead for development purposes.
|
||||||
|
|
||||||
This command requires `node` and `yarn` to be installed as prerequisites, and requires the operating system to support symlinks.
|
This command requires `node` and `yarn` to be installed as prerequisites, and requires the operating system to support symlinks.
|
||||||
|
|
||||||
|
@ -882,3 +877,13 @@ Run single test:
|
||||||
```
|
```
|
||||||
qmk test-c --test basic
|
qmk test-c --test basic
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## `qmk generate-compilation-database`
|
||||||
|
|
||||||
|
**Usage**:
|
||||||
|
|
||||||
|
```
|
||||||
|
qmk generate-compilation-database [-kb KEYBOARD] [-km KEYMAP]
|
||||||
|
```
|
||||||
|
|
||||||
|
This command has been deprecated as it cannot take into account configurables such as [converters](/feature_converters) or environment variables normally specified on the command line; please use the `--compiledb` flag with `qmk compile` instead.
|
||||||
|
|
|
@ -44,7 +44,7 @@ def hello(cli):
|
||||||
|
|
||||||
First we import the `cli` object from `milc`. This is how we interact with the user and control the script's behavior. We use `@cli.argument()` to define a command line flag, `--name`. This also creates a configuration variable named `hello.name` (and the corresponding `user.name`) which the user can set so they don't have to specify the argument. The `cli.subcommand()` decorator designates this function as a subcommand. The name of the subcommand will be taken from the name of the function.
|
First we import the `cli` object from `milc`. This is how we interact with the user and control the script's behavior. We use `@cli.argument()` to define a command line flag, `--name`. This also creates a configuration variable named `hello.name` (and the corresponding `user.name`) which the user can set so they don't have to specify the argument. The `cli.subcommand()` decorator designates this function as a subcommand. The name of the subcommand will be taken from the name of the function.
|
||||||
|
|
||||||
Once inside our function we find a typical "Hello, World!" program. We use `cli.log` to access the underlying [Logger Object](https://docs.python.org/3.7/library/logging.html#logger-objects), whose behavior is user controllable. We also access the value for name supplied by the user as `cli.config.hello.name`. The value for `cli.config.hello.name` will be determined by looking at the `--name` argument supplied by the user, if not provided it will use the value in the `qmk.ini` config file, and if neither of those is provided it will fall back to the default supplied in the `cli.argument()` decorator.
|
Once inside our function we find a typical "Hello, World!" program. We use `cli.log` to access the underlying [Logger Object](https://docs.python.org/3.9/library/logging.html#logger-objects), whose behavior is user controllable. We also access the value for name supplied by the user as `cli.config.hello.name`. The value for `cli.config.hello.name` will be determined by looking at the `--name` argument supplied by the user, if not provided it will use the value in the `qmk.ini` config file, and if neither of those is provided it will fall back to the default supplied in the `cli.argument()` decorator.
|
||||||
|
|
||||||
# User Interaction
|
# User Interaction
|
||||||
|
|
||||||
|
@ -56,13 +56,13 @@ There are two main methods for outputting text in a subcommand- `cli.log` and `c
|
||||||
|
|
||||||
You can use special tokens to colorize your text, to make it easier to understand the output of your program. See [Colorizing Text](#colorizing-text) below.
|
You can use special tokens to colorize your text, to make it easier to understand the output of your program. See [Colorizing Text](#colorizing-text) below.
|
||||||
|
|
||||||
Both of these methods support built-in string formatting using python's [printf style string format operations](https://docs.python.org/3.7/library/stdtypes.html#old-string-formatting). You can use tokens such as `%s` and `%d` within your text strings then pass the values as arguments. See our Hello, World program above for an example.
|
Both of these methods support built-in string formatting using python's [printf style string format operations](https://docs.python.org/3.9/library/stdtypes.html#old-string-formatting). You can use tokens such as `%s` and `%d` within your text strings then pass the values as arguments. See our Hello, World program above for an example.
|
||||||
|
|
||||||
You should never use the format operator (`%`) directly, always pass values as arguments.
|
You should never use the format operator (`%`) directly, always pass values as arguments.
|
||||||
|
|
||||||
### Logging (`cli.log`)
|
### Logging (`cli.log`)
|
||||||
|
|
||||||
The `cli.log` object gives you access to a [Logger Object](https://docs.python.org/3.7/library/logging.html#logger-objects). We have configured our log output to show the user a nice emoji for each log level (or the log level name if their terminal does not support unicode.) This way the user can tell at a glance which messages are most important when something goes wrong.
|
The `cli.log` object gives you access to a [Logger Object](https://docs.python.org/3.9/library/logging.html#logger-objects). We have configured our log output to show the user a nice emoji for each log level (or the log level name if their terminal does not support unicode.) This way the user can tell at a glance which messages are most important when something goes wrong.
|
||||||
|
|
||||||
The default log level is `INFO`. If the user runs `qmk -v <subcommand>` the default log level will be set to `DEBUG`.
|
The default log level is `INFO`. If the user runs `qmk -v <subcommand>` the default log level will be set to `DEBUG`.
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
Most of our style follows PEP8 with some local modifications to make things less nit-picky.
|
Most of our style follows PEP8 with some local modifications to make things less nit-picky.
|
||||||
|
|
||||||
* We target Python 3.7 for compatibility with all supported platforms.
|
* We target Python 3.9 for compatibility with all supported platforms.
|
||||||
* We indent using four (4) spaces (soft tabs)
|
* We indent using four (4) spaces (soft tabs)
|
||||||
* We encourage liberal use of comments
|
* We encourage liberal use of comments
|
||||||
* Think of them as a story describing the feature
|
* Think of them as a story describing the feature
|
||||||
|
@ -317,7 +317,7 @@ At the time of this writing our tests are not very comprehensive. Looking at the
|
||||||
|
|
||||||
## Integration Tests
|
## Integration Tests
|
||||||
|
|
||||||
Integration tests can be found in `lib/python/qmk/tests/test_cli_commands.py`. This is where CLI commands are actually run and their overall behavior is verified. We use [`subprocess`](https://docs.python.org/3.7/library/subprocess.html#module-subprocess) to launch each CLI command and a combination of checking output and returncode to determine if the right thing happened.
|
Integration tests can be found in `lib/python/qmk/tests/test_cli_commands.py`. This is where CLI commands are actually run and their overall behavior is verified. We use [`subprocess`](https://docs.python.org/3.9/library/subprocess.html#module-subprocess) to launch each CLI command and a combination of checking output and returncode to determine if the right thing happened.
|
||||||
|
|
||||||
## Unit Tests
|
## Unit Tests
|
||||||
|
|
||||||
|
|
|
@ -140,8 +140,6 @@ If you define these options you will enable the associated feature, which may in
|
||||||
|
|
||||||
* `#define ENABLE_COMPILE_KEYCODE`
|
* `#define ENABLE_COMPILE_KEYCODE`
|
||||||
* Enables the `QK_MAKE` keycode
|
* Enables the `QK_MAKE` keycode
|
||||||
* `#define FORCE_NKRO`
|
|
||||||
* NKRO by default requires to be turned on, this forces it on during keyboard startup regardless of EEPROM setting. NKRO can still be turned off but will be turned on again if the keyboard reboots.
|
|
||||||
* `#define STRICT_LAYER_RELEASE`
|
* `#define STRICT_LAYER_RELEASE`
|
||||||
* force a key release to be evaluated using the current layer stack instead of remembering which layer it came from (used for advanced cases)
|
* force a key release to be evaluated using the current layer stack instead of remembering which layer it came from (used for advanced cases)
|
||||||
|
|
||||||
|
@ -401,6 +399,7 @@ This is a [make](https://www.gnu.org/software/make/manual/make.html) file that i
|
||||||
* `atmel-dfu`
|
* `atmel-dfu`
|
||||||
* `lufa-dfu`
|
* `lufa-dfu`
|
||||||
* `qmk-dfu`
|
* `qmk-dfu`
|
||||||
|
* `qmk-hid`
|
||||||
* `halfkay`
|
* `halfkay`
|
||||||
* `caterina`
|
* `caterina`
|
||||||
* `bootloadhid`
|
* `bootloadhid`
|
||||||
|
|
|
@ -106,10 +106,10 @@ enum my_keycodes {
|
||||||
Before opening a pull request, you can preview your changes if you have set up the development environment by running this command from the `qmk_firmware/` folder:
|
Before opening a pull request, you can preview your changes if you have set up the development environment by running this command from the `qmk_firmware/` folder:
|
||||||
|
|
||||||
```
|
```
|
||||||
qmk docs
|
qmk docs -b
|
||||||
```
|
```
|
||||||
|
|
||||||
and navigating to `http://localhost:5173/`.
|
Which should automatically open your browser; otherwise, navigate to `http://localhost:8936/`.
|
||||||
|
|
||||||
## Keyboards
|
## Keyboards
|
||||||
|
|
||||||
|
|
|
@ -9,12 +9,19 @@ This page does not assume any special knowledge about QMK, but reading [Understa
|
||||||
We have structured QMK as a hierarchy:
|
We have structured QMK as a hierarchy:
|
||||||
|
|
||||||
* Core (`_quantum`)
|
* Core (`_quantum`)
|
||||||
|
* Community Module (`_<module>`)
|
||||||
|
* Community Module -> Keyboard/Revision (`_<module>_kb`)
|
||||||
|
* Community Module -> Keymap (`_<module>_user`)
|
||||||
* Keyboard/Revision (`_kb`)
|
* Keyboard/Revision (`_kb`)
|
||||||
* Keymap (`_user`)
|
* Keymap (`_user`)
|
||||||
|
|
||||||
Each of the functions described below can be defined with a `_kb()` suffix or a `_user()` suffix. We intend for you to use the `_kb()` suffix at the Keyboard/Revision level, while the `_user()` suffix should be used at the Keymap level.
|
Each of the functions described below can be defined with a `_kb()` suffix or a `_user()` suffix. We intend for you to use the `_kb()` suffix at the Keyboard/Revision level, while the `_user()` suffix should be used at the Keymap level.
|
||||||
|
|
||||||
When defining functions at the Keyboard/Revision level it is important that your `_kb()` implementation call `_user()` before executing anything else- otherwise the keymap level function will never be called.
|
When defining functions at the Keyboard/Revision level it is important that your `_kb()` implementation call `_user()` at an appropriate location, otherwise the keymap level function will never be called.
|
||||||
|
|
||||||
|
Functions at the `_<module>_xxx()` level are intended to allow keyboards or keymaps to override or enhance the processing associated with a [community module](/features/community_modules).
|
||||||
|
|
||||||
|
When defining module overrides such as `process_record_<module>()`, the same pattern should be used; the module must invoke `process_record_<module>_kb()` as appropriate.
|
||||||
|
|
||||||
# Custom Keycodes
|
# Custom Keycodes
|
||||||
|
|
||||||
|
@ -99,7 +106,7 @@ These are the three main initialization functions, listed in the order that they
|
||||||
* `keyboard_post_init_*` - Happens at the end of the firmware's startup process. This is where you'd want to put "customization" code, for the most part.
|
* `keyboard_post_init_*` - Happens at the end of the firmware's startup process. This is where you'd want to put "customization" code, for the most part.
|
||||||
|
|
||||||
::: warning
|
::: warning
|
||||||
For most people, the `keyboard_post_init_user` function is what you want to call. For instance, this is where you want to set up things for RGB Underglow.
|
For most people, the `keyboard_post_init_user` function is what you want to implement. For instance, this is where you want to set up things for RGB Underglow.
|
||||||
:::
|
:::
|
||||||
|
|
||||||
## Keyboard Pre Initialization code
|
## Keyboard Pre Initialization code
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
SPI 18x12 LED matrix driver by Awinic. Supports a maximum of four drivers, each controlling up to 216 single-color LEDs, or 72 RGB LEDs.
|
SPI 18x12 LED matrix driver by Awinic. Supports a maximum of four drivers, each controlling up to 216 single-color LEDs, or 72 RGB LEDs.
|
||||||
|
|
||||||
[AW20216S Datasheet](https://doc.awinic.com/doc/20230609wm/b6a9c70b-e1bd-495b-925f-bcbed3fc2620.pdf)
|
[AW20216S Datasheet](https://doc.awinic.com/doc/202412/a055779b-49c0-4d09-8f04-73029f44b72b.pdf)
|
||||||
|
|
||||||
## Usage {#usage}
|
## Usage {#usage}
|
||||||
|
|
||||||
|
|
73
docs/drivers/battery.md
Normal file
73
docs/drivers/battery.md
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
# Battery Driver
|
||||||
|
|
||||||
|
This driver provides support for sampling battery level.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
To use this driver, add the following to your `rules.mk`:
|
||||||
|
|
||||||
|
```make
|
||||||
|
BATTERY_DRIVER_REQUIRED = yes
|
||||||
|
```
|
||||||
|
|
||||||
|
## Basic Configuration {#basic-configuration}
|
||||||
|
|
||||||
|
Add the following to your `config.h`:
|
||||||
|
|
||||||
|
|Define |Default |Description |
|
||||||
|
|--------------------------|--------|--------------------------------------------------|
|
||||||
|
|`BATTERY_SAMPLE_INTERVAL` |`30000` |The time between battery samples in milliseconds. |
|
||||||
|
|
||||||
|
## Driver Configuration {#driver-configuration}
|
||||||
|
|
||||||
|
Driver selection can be configured in `rules.mk` as `BATTERY_DRIVER`. Valid values are `adc` (default), `vendor`, or `custom`. See below for information on individual drivers.
|
||||||
|
|
||||||
|
### ADC Driver {#adc-driver}
|
||||||
|
|
||||||
|
This is the default battery driver. The default configuration assumes the battery is connected to a ADC capable pin through a voltage divider.
|
||||||
|
|
||||||
|
```make
|
||||||
|
BATTERY_DRIVER = adc
|
||||||
|
```
|
||||||
|
|
||||||
|
The following `#define`s apply only to the `adc` driver:
|
||||||
|
|
||||||
|
|Define |Default |Description |
|
||||||
|
|-----------------------------|--------------|--------------------------------------------------------------|
|
||||||
|
|`BATTERY_PIN` |*Not defined* |The GPIO pin connected to the voltage divider. |
|
||||||
|
|`BATTERY_REF_VOLTAGE_MV` |`3300` |The ADC reverence voltage, in millivolts. |
|
||||||
|
|`BATTERY_VOLTAGE_DIVIDER_R1` |`100` |The voltage divider resistance, in kOhm. Set to 0 to disable. |
|
||||||
|
|`BATTERY_VOLTAGE_DIVIDER_R2` |`100` |The voltage divider resistance, in kOhm. Set to 0 to disable. |
|
||||||
|
|`BATTERY_ADC_RESOLUTION` |`10` |The ADC resolution configured for the ADC Driver. |
|
||||||
|
|
||||||
|
## Functions
|
||||||
|
|
||||||
|
### `uint8_t battery_get_percent(void)` {#api-battery-get-percent}
|
||||||
|
|
||||||
|
Sample battery level.
|
||||||
|
|
||||||
|
#### Return Value {#api-battery-get-percent-return}
|
||||||
|
|
||||||
|
The battery percentage, in the range 0-100.
|
||||||
|
|
||||||
|
## Callbacks
|
||||||
|
|
||||||
|
### `void battery_percent_changed_user(uint8_t level)` {#api-battery-percent-changed-user}
|
||||||
|
|
||||||
|
User hook called when battery level changed.
|
||||||
|
|
||||||
|
### Arguments {#api-battery-percent-changed-user-arguments}
|
||||||
|
|
||||||
|
- `uint8_t level`
|
||||||
|
The battery percentage, in the range 0-100.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `void battery_percent_changed_kb(uint8_t level)` {#api-battery-percent-changed-kb}
|
||||||
|
|
||||||
|
Keyboard hook called when battery level changed.
|
||||||
|
|
||||||
|
### Arguments {#api-battery-percent-changed-kb-arguments}
|
||||||
|
|
||||||
|
- `uint8_t level`
|
||||||
|
The battery percentage, in the range 0-100.
|
|
@ -16,17 +16,22 @@ You can then call the I2C API by including `i2c_master.h` in your code.
|
||||||
|
|
||||||
## I2C Addressing {#note-on-i2c-addresses}
|
## I2C Addressing {#note-on-i2c-addresses}
|
||||||
|
|
||||||
All of the addresses expected by this driver should be pushed to the upper 7 bits of the address byte. Setting
|
I2C addresses listed on datasheets and the internet are usually represented as a 7-bit value. The eighth bit (the least significant bit) controls whether the operation is a read or a write.
|
||||||
the lower bit (indicating read/write) will be done by the respective functions. Almost all I2C addresses listed
|
|
||||||
on datasheets and the internet will be represented as 7 bits occupying the lower 7 bits and will need to be
|
|
||||||
shifted to the left (more significant) by one bit. This is easy to do via the bitwise shift operator `<< 1`.
|
|
||||||
|
|
||||||
You can either do this on each call to the functions below, or once in your definition of the address. For example, if your device has an address of `0x18`:
|
All of the address parameters expected by the driver API should therefore be pushed to the upper 7 bits of the address byte; the driver will take care of setting the read/write bit as appropriate.
|
||||||
|
|
||||||
|
This is easy to do via the bitwise left shift operator. For example, if your device has an address of `0x18` you might create a define for convenience:
|
||||||
|
|
||||||
```c
|
```c
|
||||||
#define MY_I2C_ADDRESS (0x18 << 1)
|
#define MY_I2C_ADDRESS (0x18 << 1)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Or, you can shift the address ahead of time:
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define MY_I2C_ADDRESS 0x30
|
||||||
|
```
|
||||||
|
|
||||||
See https://www.robot-electronics.co.uk/i2c-tutorial for more information about I2C addressing and other technical details.
|
See https://www.robot-electronics.co.uk/i2c-tutorial for more information about I2C addressing and other technical details.
|
||||||
|
|
||||||
## AVR Configuration {#avr-configuration}
|
## AVR Configuration {#avr-configuration}
|
||||||
|
@ -40,7 +45,7 @@ The following defines can be used to configure the I2C master driver:
|
||||||
No further setup is required - just connect the `SDA` and `SCL` pins of your I2C devices to the matching pins on the MCU:
|
No further setup is required - just connect the `SDA` and `SCL` pins of your I2C devices to the matching pins on the MCU:
|
||||||
|
|
||||||
|MCU |`SCL`|`SDA`|
|
|MCU |`SCL`|`SDA`|
|
||||||
|------------------|-----|-----|
|
|-------------|-----|-----|
|
||||||
|ATmega16/32U4|`D0` |`D1` |
|
|ATmega16/32U4|`D0` |`D1` |
|
||||||
|AT90USB64/128|`D0` |`D1` |
|
|AT90USB64/128|`D0` |`D1` |
|
||||||
|ATmega32A |`C0` |`C1` |
|
|ATmega32A |`C0` |`C1` |
|
||||||
|
@ -52,7 +57,7 @@ The ATmega16/32U2 does not possess I2C functionality, and so cannot use this dri
|
||||||
|
|
||||||
## ChibiOS/ARM Configuration {#arm-configuration}
|
## ChibiOS/ARM Configuration {#arm-configuration}
|
||||||
|
|
||||||
You'll need to determine which pins can be used for I2C -- a an example, STM32 parts generally have multiple I2C peripherals, labeled I2C1, I2C2, I2C3 etc.
|
You'll need to determine which pins can be used for I2C -- as an example, STM32 parts generally have multiple I2C peripherals, labeled I2C1, I2C2, I2C3 etc.
|
||||||
|
|
||||||
To enable I2C, modify your board's `halconf.h` to enable I2C, then modify your board's `mcuconf.h` to enable the peripheral you've chosen:
|
To enable I2C, modify your board's `halconf.h` to enable I2C, then modify your board's `mcuconf.h` to enable the peripheral you've chosen:
|
||||||
|
|
||||||
|
@ -83,15 +88,19 @@ To enable I2C, modify your board's `halconf.h` to enable I2C, then modify your b
|
||||||
|
|
||||||
Configuration-wise, you'll need to set up the peripheral as per your MCU's datasheet -- the defaults match the pins for a Proton-C, i.e. STM32F303.
|
Configuration-wise, you'll need to set up the peripheral as per your MCU's datasheet -- the defaults match the pins for a Proton-C, i.e. STM32F303.
|
||||||
|
|
||||||
|`config.h` Overrride |Description |Default|
|
|`config.h` Override|Description |Default|
|
||||||
|------------------------|--------------------------------------------------------------|-------|
|
|-------------------|-------------------------------------------------------------|-------|
|
||||||
|`I2C_DRIVER` |I2C peripheral to use - I2C1 -> `I2CD1`, I2C2 -> `I2CD2` etc.|`I2CD1`|
|
|`I2C_DRIVER` |I2C peripheral to use - I2C1 -> `I2CD1`, I2C2 -> `I2CD2` etc.|`I2CD1`|
|
||||||
|`I2C1_SCL_PIN` |The pin definition for SCL |`B6` |
|
|`I2C1_SCL_PIN` |The pin to use for SCL |`B6` |
|
||||||
|`I2C1_SCL_PAL_MODE`|The alternate function mode for SCL |`4` |
|
|`I2C1_SCL_PAL_MODE`|The alternate function mode for SCL |`4` |
|
||||||
|`I2C1_SDA_PIN` |The pin definition for SDA |`B7` |
|
|`I2C1_SDA_PIN` |The pin to use for SDA |`B7` |
|
||||||
|`I2C1_SDA_PAL_MODE`|The alternate function mode for SDA |`4` |
|
|`I2C1_SDA_PAL_MODE`|The alternate function mode for SDA |`4` |
|
||||||
|
|
||||||
The following configuration values depend on the specific MCU in use.
|
::: tip
|
||||||
|
Currently only a single I2C peripheral is supported, therefore the `I2C1_*` defines are used for configuration regardless of the selected peripheral.
|
||||||
|
:::
|
||||||
|
|
||||||
|
The following configuration values are dependent on the ChibiOS I2C LLD, which is dictated by the microcontroller.
|
||||||
|
|
||||||
### I2Cv1 {#arm-configuration-i2cv1}
|
### I2Cv1 {#arm-configuration-i2cv1}
|
||||||
|
|
||||||
|
@ -147,7 +156,7 @@ void i2c_init(void) {
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### `i2c_status_t i2c_transmit(uint8_t address, uint8_t *data, uint16_t length, uint16_t timeout)` {#api-i2c-transmit}
|
### `i2c_status_t i2c_transmit(uint8_t address, const uint8_t* data, uint16_t length, uint16_t timeout)` {#api-i2c-transmit}
|
||||||
|
|
||||||
Send multiple bytes to the selected I2C device.
|
Send multiple bytes to the selected I2C device.
|
||||||
|
|
||||||
|
@ -155,7 +164,7 @@ Send multiple bytes to the selected I2C device.
|
||||||
|
|
||||||
- `uint8_t address`
|
- `uint8_t address`
|
||||||
The 7-bit I2C address of the device.
|
The 7-bit I2C address of the device.
|
||||||
- `uint8_t *data`
|
- `const uint8_t* data`
|
||||||
A pointer to the data to transmit.
|
A pointer to the data to transmit.
|
||||||
- `uint16_t length`
|
- `uint16_t length`
|
||||||
The number of bytes to write. Take care not to overrun the length of `data`.
|
The number of bytes to write. Take care not to overrun the length of `data`.
|
||||||
|
@ -168,6 +177,29 @@ Send multiple bytes to the selected I2C device.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
### `i2c_status_t i2c_transmit_P(uint8_t address, const uint8_t* data, uint16_t length, uint16_t timeout)` {#api-i2c-transmit-p}
|
||||||
|
|
||||||
|
Send multiple bytes from PROGMEM to the selected I2C device.
|
||||||
|
|
||||||
|
On ARM devices, this function is simply an alias for `i2c_transmit(address, data, length, timeout)`.
|
||||||
|
|
||||||
|
#### Arguments {#api-i2c-transmit-p-arguments}
|
||||||
|
|
||||||
|
- `uint8_t address`
|
||||||
|
The 7-bit I2C address of the device.
|
||||||
|
- `const uint8_t* data`
|
||||||
|
A pointer to the data to transmit.
|
||||||
|
- `uint16_t length`
|
||||||
|
The number of bytes to write. Take care not to overrun the length of `data`.
|
||||||
|
- `uint16_t timeout`
|
||||||
|
The time in milliseconds to wait for a response from the target device.
|
||||||
|
|
||||||
|
#### Return Value {#api-i2c-transmit-p-return}
|
||||||
|
|
||||||
|
`I2C_STATUS_TIMEOUT` if the timeout period elapses, `I2C_STATUS_ERROR` if some other error occurs, otherwise `I2C_STATUS_SUCCESS`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
### `i2c_status_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout)` {#api-i2c-receive}
|
### `i2c_status_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout)` {#api-i2c-receive}
|
||||||
|
|
||||||
Receive multiple bytes from the selected I2C device.
|
Receive multiple bytes from the selected I2C device.
|
||||||
|
@ -177,7 +209,7 @@ Receive multiple bytes from the selected I2C device.
|
||||||
- `uint8_t address`
|
- `uint8_t address`
|
||||||
The 7-bit I2C address of the device.
|
The 7-bit I2C address of the device.
|
||||||
- `uint8_t* data`
|
- `uint8_t* data`
|
||||||
A pointer to the buffer to read into.
|
A pointer to a buffer to read into.
|
||||||
- `uint16_t length`
|
- `uint16_t length`
|
||||||
The number of bytes to read. Take care not to overrun the length of `data`.
|
The number of bytes to read. Take care not to overrun the length of `data`.
|
||||||
- `uint16_t timeout`
|
- `uint16_t timeout`
|
||||||
|
@ -189,9 +221,9 @@ Receive multiple bytes from the selected I2C device.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### `i2c_status_t i2c_write_register(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout)` {#api-i2c-write-register}
|
### `i2c_status_t i2c_write_register(uint8_t devaddr, uint8_t regaddr, const uint8_t* data, uint16_t length, uint16_t timeout)` {#api-i2c-write-register}
|
||||||
|
|
||||||
Writes to a register with an 8-bit address on the I2C device.
|
Write to a register with an 8-bit address on the I2C device.
|
||||||
|
|
||||||
#### Arguments {#api-i2c-write-register-arguments}
|
#### Arguments {#api-i2c-write-register-arguments}
|
||||||
|
|
||||||
|
@ -199,7 +231,7 @@ Writes to a register with an 8-bit address on the I2C device.
|
||||||
The 7-bit I2C address of the device.
|
The 7-bit I2C address of the device.
|
||||||
- `uint8_t regaddr`
|
- `uint8_t regaddr`
|
||||||
The register address to write to.
|
The register address to write to.
|
||||||
- `uint8_t *data`
|
- `const uint8_t* data`
|
||||||
A pointer to the data to transmit.
|
A pointer to the data to transmit.
|
||||||
- `uint16_t length`
|
- `uint16_t length`
|
||||||
The number of bytes to write. Take care not to overrun the length of `data`.
|
The number of bytes to write. Take care not to overrun the length of `data`.
|
||||||
|
@ -212,9 +244,9 @@ Writes to a register with an 8-bit address on the I2C device.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### `i2c_status_t i2c_write_register16(uint8_t devaddr, uint16_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout)` {#api-i2c-write-register16}
|
### `i2c_status_t i2c_write_register16(uint8_t devaddr, uint16_t regaddr, const uint8_t* data, uint16_t length, uint16_t timeout)` {#api-i2c-write-register16}
|
||||||
|
|
||||||
Writes to a register with a 16-bit address (big endian) on the I2C device.
|
Write to a register with a 16-bit address (big endian) on the I2C device.
|
||||||
|
|
||||||
#### Arguments {#api-i2c-write-register16-arguments}
|
#### Arguments {#api-i2c-write-register16-arguments}
|
||||||
|
|
||||||
|
@ -222,7 +254,7 @@ Writes to a register with a 16-bit address (big endian) on the I2C device.
|
||||||
The 7-bit I2C address of the device.
|
The 7-bit I2C address of the device.
|
||||||
- `uint16_t regaddr`
|
- `uint16_t regaddr`
|
||||||
The register address to write to.
|
The register address to write to.
|
||||||
- `uint8_t *data`
|
- `const uint8_t* data`
|
||||||
A pointer to the data to transmit.
|
A pointer to the data to transmit.
|
||||||
- `uint16_t length`
|
- `uint16_t length`
|
||||||
The number of bytes to write. Take care not to overrun the length of `data`.
|
The number of bytes to write. Take care not to overrun the length of `data`.
|
||||||
|
@ -237,7 +269,7 @@ Writes to a register with a 16-bit address (big endian) on the I2C device.
|
||||||
|
|
||||||
### `i2c_status_t i2c_read_register(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout)` {#api-i2c-read-register}
|
### `i2c_status_t i2c_read_register(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout)` {#api-i2c-read-register}
|
||||||
|
|
||||||
Reads from a register with an 8-bit address on the I2C device.
|
Read from a register with an 8-bit address on the I2C device.
|
||||||
|
|
||||||
#### Arguments {#api-i2c-read-register-arguments}
|
#### Arguments {#api-i2c-read-register-arguments}
|
||||||
|
|
||||||
|
@ -245,6 +277,8 @@ Reads from a register with an 8-bit address on the I2C device.
|
||||||
The 7-bit I2C address of the device.
|
The 7-bit I2C address of the device.
|
||||||
- `uint8_t regaddr`
|
- `uint8_t regaddr`
|
||||||
The register address to read from.
|
The register address to read from.
|
||||||
|
- `uint8_t data`
|
||||||
|
A pointer to a buffer to read into.
|
||||||
- `uint16_t length`
|
- `uint16_t length`
|
||||||
The number of bytes to read. Take care not to overrun the length of `data`.
|
The number of bytes to read. Take care not to overrun the length of `data`.
|
||||||
- `uint16_t timeout`
|
- `uint16_t timeout`
|
||||||
|
@ -258,7 +292,7 @@ Reads from a register with an 8-bit address on the I2C device.
|
||||||
|
|
||||||
### `i2c_status_t i2c_read_register16(uint8_t devaddr, uint16_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout)` {#api-i2c-read-register16}
|
### `i2c_status_t i2c_read_register16(uint8_t devaddr, uint16_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout)` {#api-i2c-read-register16}
|
||||||
|
|
||||||
Reads from a register with a 16-bit address (big endian) on the I2C device.
|
Read from a register with a 16-bit address (big endian) on the I2C device.
|
||||||
|
|
||||||
#### Arguments {#api-i2c-read-register16-arguments}
|
#### Arguments {#api-i2c-read-register16-arguments}
|
||||||
|
|
||||||
|
@ -266,6 +300,8 @@ Reads from a register with a 16-bit address (big endian) on the I2C device.
|
||||||
The 7-bit I2C address of the device.
|
The 7-bit I2C address of the device.
|
||||||
- `uint16_t regaddr`
|
- `uint16_t regaddr`
|
||||||
The register address to read from.
|
The register address to read from.
|
||||||
|
- `uint8_t* data`
|
||||||
|
A pointer to a buffer to read into.
|
||||||
- `uint16_t length`
|
- `uint16_t length`
|
||||||
The number of bytes to read. Take care not to overrun the length of `data`.
|
The number of bytes to read. Take care not to overrun the length of `data`.
|
||||||
- `uint16_t timeout`
|
- `uint16_t timeout`
|
||||||
|
@ -279,19 +315,19 @@ Reads from a register with a 16-bit address (big endian) on the I2C device.
|
||||||
|
|
||||||
### `i2c_status_t i2c_ping_address(uint8_t address, uint16_t timeout)` {#api-i2c-ping-address}
|
### `i2c_status_t i2c_ping_address(uint8_t address, uint16_t timeout)` {#api-i2c-ping-address}
|
||||||
|
|
||||||
Pings the I2C bus for a specific address.
|
Ping the I2C bus for a specific address.
|
||||||
|
|
||||||
On ChibiOS a "best effort" attempt is made by reading a single byte from register 0 at the requested address. This should generally work except for I2C devices that do not not respond to a register 0 read request, which will result in a false negative result (unsucessful response to ping attempt).
|
On ChibiOS a "best effort" attempt is made by reading a single byte from register 0 at the given address. This should generally work except for I2C devices that do not not respond to a register 0 read request, which will result in a false negative result (unsuccessful response to ping attempt).
|
||||||
|
|
||||||
This function is weakly defined, meaning it can be overridden if necessary for your particular use case:
|
This function is weakly defined, meaning it can be overridden if necessary for your particular use case.
|
||||||
|
|
||||||
#### Arguments
|
#### Arguments {#api-i2c-ping-address-arguments}
|
||||||
|
|
||||||
- `uint8_t address`
|
- `uint8_t address`
|
||||||
The 7-bit I2C address of the device (ie. without the read/write bit - this will be set automatically).
|
The 7-bit I2C address of the device.
|
||||||
- `uint16_t timeout`
|
- `uint16_t timeout`
|
||||||
The time in milliseconds to wait for a response from the target device.
|
The time in milliseconds to wait for a response from the target device.
|
||||||
|
|
||||||
#### Return Value
|
#### Return Value {#api-i2c-ping-address-return}
|
||||||
|
|
||||||
`I2C_STATUS_TIMEOUT` if the timeout period elapses, `I2C_STATUS_ERROR` if some other error occurs, otherwise `I2C_STATUS_SUCCESS`.
|
`I2C_STATUS_TIMEOUT` if the timeout period elapses, `I2C_STATUS_ERROR` if some other error occurs, otherwise `I2C_STATUS_SUCCESS`.
|
||||||
|
|
|
@ -39,8 +39,6 @@ To enable SPI, modify your board's `halconf.h` to enable SPI, then modify your b
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#define HAL_USE_SPI TRUE // [!code focus]
|
#define HAL_USE_SPI TRUE // [!code focus]
|
||||||
#define SPI_USE_WAIT TRUE // [!code focus]
|
|
||||||
#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD // [!code focus]
|
|
||||||
|
|
||||||
#include_next <halconf.h>
|
#include_next <halconf.h>
|
||||||
```
|
```
|
||||||
|
@ -88,7 +86,7 @@ Start an SPI transaction.
|
||||||
#### Arguments {#api-spi-start-arguments}
|
#### Arguments {#api-spi-start-arguments}
|
||||||
|
|
||||||
- `pin_t slavePin`
|
- `pin_t slavePin`
|
||||||
The QMK pin to assert as the slave select pin, eg. `B4`.
|
The GPIO pin connected to the desired device's `SS` line.
|
||||||
- `bool lsbFirst`
|
- `bool lsbFirst`
|
||||||
Determines the endianness of the transmission. If `true`, the least significant bit of each byte is sent first.
|
Determines the endianness of the transmission. If `true`, the least significant bit of each byte is sent first.
|
||||||
- `uint8_t mode`
|
- `uint8_t mode`
|
||||||
|
@ -106,7 +104,7 @@ Start an SPI transaction.
|
||||||
|
|
||||||
#### Return Value {#api-spi-start-return}
|
#### Return Value {#api-spi-start-return}
|
||||||
|
|
||||||
`false` if the supplied parameters are invalid or the SPI peripheral is already in use, or `true`.
|
`true` if the operation was successful, otherwise `false` if the supplied parameters are invalid or the SPI peripheral is already in use.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
@ -131,7 +129,7 @@ Read a byte from the selected SPI device.
|
||||||
|
|
||||||
#### Return Value {#api-spi-read-return}
|
#### Return Value {#api-spi-read-return}
|
||||||
|
|
||||||
`SPI_STATUS_TIMEOUT` if the timeout period elapses, or the byte read from the device.
|
`SPI_STATUS_TIMEOUT` if the timeout period elapses, otherwise the byte read from the device.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
@ -159,7 +157,7 @@ Receive multiple bytes from the selected SPI device.
|
||||||
#### Arguments {#api-spi-receive-arguments}
|
#### Arguments {#api-spi-receive-arguments}
|
||||||
|
|
||||||
- `uint8_t *data`
|
- `uint8_t *data`
|
||||||
A pointer to the buffer to read into.
|
A pointer to a buffer to read into.
|
||||||
- `uint16_t length`
|
- `uint16_t length`
|
||||||
The number of bytes to read. Take care not to overrun the length of `data`.
|
The number of bytes to read. Take care not to overrun the length of `data`.
|
||||||
|
|
||||||
|
|
|
@ -45,17 +45,17 @@ To enable UART, modify your board's `mcuconf.h` to enable the peripheral you've
|
||||||
|
|
||||||
Configuration-wise, you'll need to set up the peripheral as per your MCU's datasheet -- the defaults match the pins for a Proton-C, i.e. STM32F303.
|
Configuration-wise, you'll need to set up the peripheral as per your MCU's datasheet -- the defaults match the pins for a Proton-C, i.e. STM32F303.
|
||||||
|
|
||||||
| `config.h` override | Description | Default Value |
|
|`config.h` Override|Description |Default|
|
||||||
| --------------------------- | --------------------------------------------------------------- | ------------- |
|
|-------------------|---------------------------------------------------------------|-------|
|
||||||
| `#define UART_DRIVER` | USART peripheral to use - USART1 -> `SD1`, USART2 -> `SD2` etc. | `SD1` |
|
|`UART_DRIVER` |USART peripheral to use - USART1 -> `SD1`, USART2 -> `SD2` etc.|`SD1` |
|
||||||
| `#define UART_TX_PIN` | The pin to use for TX | `A9` |
|
|`UART_TX_PIN` |The pin to use for TX |`A9` |
|
||||||
| `#define UART_TX_PAL_MODE` | The alternate function mode for TX | `7` |
|
|`UART_TX_PAL_MODE` |The alternate function mode for TX |`7` |
|
||||||
| `#define UART_RX_PIN` | The pin to use for RX | `A10` |
|
|`UART_RX_PIN` |The pin to use for RX |`A10` |
|
||||||
| `#define UART_RX_PAL_MODE` | The alternate function mode for RX | `7` |
|
|`UART_RX_PAL_MODE` |The alternate function mode for RX |`7` |
|
||||||
| `#define UART_CTS_PIN` | The pin to use for CTS | `A11` |
|
|`UART_CTS_PIN` |The pin to use for CTS |`A11` |
|
||||||
| `#define UART_CTS_PAL_MODE` | The alternate function mode for CTS | `7` |
|
|`UART_CTS_PAL_MODE`|The alternate function mode for CTS |`7` |
|
||||||
| `#define UART_RTS_PIN` | The pin to use for RTS | `A12` |
|
|`UART_RTS_PIN` |The pin to use for RTS |`A12` |
|
||||||
| `#define UART_RTS_PAL_MODE` | The alternate function mode for RTS | `7` |
|
|`UART_RTS_PAL_MODE`|The alternate function mode for RTS |`7` |
|
||||||
|
|
||||||
## API {#api}
|
## API {#api}
|
||||||
|
|
||||||
|
@ -111,7 +111,7 @@ Receive multiple bytes.
|
||||||
#### Arguments {#api-uart-receive-arguments}
|
#### Arguments {#api-uart-receive-arguments}
|
||||||
|
|
||||||
- `uint8_t *data`
|
- `uint8_t *data`
|
||||||
A pointer to the buffer to read into.
|
A pointer to a buffer to read into.
|
||||||
- `uint16_t length`
|
- `uint16_t length`
|
||||||
The number of bytes to read. Take care not to overrun the length of `data`.
|
The number of bytes to read. Take care not to overrun the length of `data`.
|
||||||
|
|
||||||
|
@ -123,4 +123,4 @@ Return whether the receive buffer contains data. Call this function to determine
|
||||||
|
|
||||||
#### Return Value {#api-uart-available-return}
|
#### Return Value {#api-uart-available-return}
|
||||||
|
|
||||||
`true` if the receive buffer length is non-zero.
|
`true` if there is data available to read.
|
||||||
|
|
|
@ -77,6 +77,17 @@ KL: kc: 172, col: 2, row: 0, pressed: 1, time: 16303, int: 0, count: 0
|
||||||
KL: kc: 172, col: 2, row: 0, pressed: 0, time: 16411, int: 0, count: 0
|
KL: kc: 172, col: 2, row: 0, pressed: 0, time: 16411, int: 0, count: 0
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Which keycode is this keypress?
|
||||||
|
|
||||||
|
Keycodes are logged in the example above as numerical codes, which may be difficult to interpret. For more readable logging, add `KEYCODE_STRING_ENABLE = yes` in your `rules.mk` and use `get_keycode_string(kc)`. For example:
|
||||||
|
|
||||||
|
```c
|
||||||
|
uprintf("kc: %s\n", get_keycode_string(keycode));
|
||||||
|
```
|
||||||
|
|
||||||
|
This logs the keycode as a human-readable string like "`LT(2,KC_D)`" rather than a numerical code like "`0x4207`." See the [Keycode String](unit_testing#keycode-string) section of the Unit Testing page for more information.
|
||||||
|
|
||||||
|
|
||||||
### How long did it take to scan for a keypress?
|
### How long did it take to scan for a keypress?
|
||||||
|
|
||||||
When testing performance issues, it can be useful to know the frequency at which the switch matrix is being scanned. To enable logging for this scenario, add the following code to your keymaps `config.h`
|
When testing performance issues, it can be useful to know the frequency at which the switch matrix is being scanned. To enable logging for this scenario, add the following code to your keymaps `config.h`
|
||||||
|
|
|
@ -3,28 +3,39 @@
|
||||||
These allow you to combine a modifier with a keycode. When pressed, the keydown event for the modifier, then `kc` will be sent. On release, the keyup event for `kc`, then the modifier will be sent.
|
These allow you to combine a modifier with a keycode. When pressed, the keydown event for the modifier, then `kc` will be sent. On release, the keyup event for `kc`, then the modifier will be sent.
|
||||||
|
|
||||||
|Key |Aliases |Description |
|
|Key |Aliases |Description |
|
||||||
|----------|----------------------------------|------------------------------------------------------|
|
|----------|----------------------------------|-------------------------------------------------------------------------------|
|
||||||
|`LCTL(kc)`|`C(kc)` |Hold Left Control and press `kc` |
|
|`LCTL(kc)`|`C(kc)` |Hold Left Control and press `kc` |
|
||||||
|`LSFT(kc)`|`S(kc)` |Hold Left Shift and press `kc` |
|
|`LSFT(kc)`|`S(kc)` |Hold Left Shift and press `kc` |
|
||||||
|`LALT(kc)`|`A(kc)`, `LOPT(kc)` |Hold Left Alt and press `kc` |
|
|`LALT(kc)`|`A(kc)`, `LOPT(kc)` |Hold Left Alt and press `kc` |
|
||||||
|`LGUI(kc)`|`G(kc)`, `LCMD(kc)`, `LWIN(kc)` |Hold Left GUI and press `kc` |
|
|`LGUI(kc)`|`G(kc)`, `LCMD(kc)`, `LWIN(kc)` |Hold Left GUI and press `kc` |
|
||||||
|
|`LCS(kc)` | |Hold Left Control and Left Shift and press `kc` |
|
||||||
|
|`LCA(kc)` | |Hold Left Control and Left Alt and press `kc` |
|
||||||
|
|`LCG(kc)` | |Hold Left Control and Left GUI and press `kc` |
|
||||||
|
|`LSA(kc)` | |Hold Left Shift and Left Alt and press `kc` |
|
||||||
|
|`LSG(kc)` |`SGUI(kc)`, `SCMD(kc)`, `SWIN(kc)`|Hold Left Shift and Left GUI and press `kc` |
|
||||||
|
|`LAG(kc)` | |Hold Left Alt and Left GUI and press `kc` |
|
||||||
|
|`LCSG(kc)`| |Hold Left Control, Left Shift and Left GUI and press `kc` |
|
||||||
|
|`LCAG(kc)`| |Hold Left Control, Left Alt and Left GUI and press `kc` |
|
||||||
|
|`LSAG(kc)`| |Hold Left Shift, Left Alt and Left GUI and press `kc` |
|
||||||
|`RCTL(kc)`| |Hold Right Control and press `kc` |
|
|`RCTL(kc)`| |Hold Right Control and press `kc` |
|
||||||
|`RSFT(kc)`| |Hold Right Shift and press `kc` |
|
|`RSFT(kc)`| |Hold Right Shift and press `kc` |
|
||||||
|`RALT(kc)`|`ROPT(kc)`, `ALGR(kc)` |Hold Right Alt and press `kc` |
|
|`RALT(kc)`|`ROPT(kc)`, `ALGR(kc)` |Hold Right Alt and press `kc` |
|
||||||
|`RGUI(kc)`|`RCMD(kc)`, `RWIN(kc)` |Hold Right GUI and press `kc` |
|
|`RGUI(kc)`|`RCMD(kc)`, `RWIN(kc)` |Hold Right GUI and press `kc` |
|
||||||
|`LSG(kc)` |`SGUI(kc)`, `SCMD(kc)`, `SWIN(kc)`|Hold Left Shift and GUI and press `kc` |
|
|`RCA(kc)` | |Hold Right Control and Right Alt and press `kc` |
|
||||||
|`LAG(kc)` | |Hold Left Alt and Left GUI and press `kc` |
|
|`RCS(kc)` | |Hold Right Control and Right Shift and press `kc` |
|
||||||
|
|`RCG(kc)` | |Hold Right Control and Right GUI and press `kc` |
|
||||||
|
|`RSA(kc)` |`SAGR(kc)` |Hold Right Shift and Right Alt and press `kc` |
|
||||||
|`RSG(kc)` | |Hold Right Shift and Right GUI and press `kc` |
|
|`RSG(kc)` | |Hold Right Shift and Right GUI and press `kc` |
|
||||||
|`RAG(kc)` | |Hold Right Alt and Right GUI and press `kc` |
|
|`RAG(kc)` | |Hold Right Alt and Right GUI and press `kc` |
|
||||||
|`LCA(kc)` | |Hold Left Control and Alt and press `kc` |
|
|`RCSG(kc)`| |Hold Right Control, Right Shift and Right GUI and press `kc` |
|
||||||
|`LSA(kc)` | |Hold Left Shift and Left Alt and press `kc` |
|
|`RCAG(kc)`| |Hold Right Control, Right Alt and Right GUI and press `kc` |
|
||||||
|`RSA(kc)` |`SAGR(kc)` |Hold Right Shift and Right Alt (AltGr) and press `kc` |
|
|`RSAG(kc)`| |Hold Right Shift, Right Alt and Right GUI and press `kc` |
|
||||||
|`RCS(kc)` | |Hold Right Control and Right Shift and press `kc` |
|
|`MEH(kc)` | |Hold Left Control, Left Shift and Left Alt and press `kc` |
|
||||||
|`LCAG(kc)`| |Hold Left Control, Alt and GUI and press `kc` |
|
|`HYPR(kc)`| |Hold Left Control, Left Shift, Left Alt and Left GUI and press `kc`<sup>1</sup>|
|
||||||
|`MEH(kc)` | |Hold Left Control, Shift and Alt and press `kc` |
|
|
||||||
|`HYPR(kc)`| |Hold Left Control, Shift, Alt and GUI and press `kc` |
|
|
||||||
|
|
||||||
You can also chain them, for example `LCTL(LALT(KC_DEL))` or `C(A(KC_DEL))` makes a key that sends Control+Alt+Delete with a single keypress.
|
<sup>1. More information on the Hyper key can be found on [this blog post by Brett Terpstra](https://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/).</sup>
|
||||||
|
|
||||||
|
You can also chain them, for example `LCTL(LALT(KC_DEL))`, `C(A(KC_DEL))`, or `LCA(KC_DEL)` all make a key that sends Control+Alt+Delete with a single keypress.
|
||||||
|
|
||||||
# Checking Modifier State {#checking-modifier-state}
|
# Checking Modifier State {#checking-modifier-state}
|
||||||
|
|
||||||
|
|
|
@ -119,7 +119,7 @@ This is ideal for when you want ensure everything compiles successfully when pre
|
||||||
## Examples
|
## Examples
|
||||||
|
|
||||||
For a brief example, checkout [`/users/_example/`](https://github.com/qmk/qmk_firmware/tree/master/users/_example).
|
For a brief example, checkout [`/users/_example/`](https://github.com/qmk/qmk_firmware/tree/master/users/_example).
|
||||||
For a more complicated example, checkout [`/users/drashna/`](https://github.com/qmk/qmk_firmware/tree/master/users/drashna)'s userspace.
|
For more complicated examples, checkout the [`awesome-qmk` colletion](https://github.com/qmk/awesome-qmk).
|
||||||
|
|
||||||
|
|
||||||
### Customized Functions
|
### Customized Functions
|
||||||
|
|
164
docs/features/community_modules.md
Normal file
164
docs/features/community_modules.md
Normal file
|
@ -0,0 +1,164 @@
|
||||||
|
# Community Modules
|
||||||
|
|
||||||
|
Community Modules are a feature within QMK which allows code to be implemented by third parties, making it available for other people to import into their own builds.
|
||||||
|
|
||||||
|
These modules can provide implementations which override or enhance normal QMK processing; initialization, key processing, suspend, and shutdown are some of the provided hooks which modules may implement.
|
||||||
|
|
||||||
|
## Adding a Community Module to your build
|
||||||
|
|
||||||
|
Community Modules have first-class support for [External Userspace](/newbs_external_userspace), and QMK strongly recommends using External Userspace for hosting keymaps and Community Modules together.
|
||||||
|
|
||||||
|
Modules must live in either of two locations:
|
||||||
|
|
||||||
|
* `<QMK_USERSPACE>/modules/`
|
||||||
|
* `<QMK_FIRMWARE>/modules/`
|
||||||
|
|
||||||
|
A basic module is provided within QMK itself -- `qmk/hello_world` -- which prints out a notification over [HID console](/faq_debug) after 10 seconds, and adds a new keycode, `COMMUNITY_MODULE_HELLO` (aliased to `CM_HELO`) which types `Hello there.` to the active application when the corresponding key is pressed.
|
||||||
|
|
||||||
|
To add this module to your build, in your keymap's directory create a `keymap.json` with the following content:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"modules": [
|
||||||
|
"qmk/hello_world"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
If you already have a `keymap.json`, you'll need to manually merge the `modules` section into your keymap.
|
||||||
|
|
||||||
|
::: warning
|
||||||
|
Community Modules are not supported by QMK Configurator. If you wish to use Community Modules, you must build your own firmware.
|
||||||
|
:::
|
||||||
|
|
||||||
|
## Adding a Community Module to your External Userspace
|
||||||
|
|
||||||
|
Module authors are encouraged to provide a git repository on GitHub which may be imported into a user's external userspace. If a user wishes to import a module repository, they can do the following:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cd /path/to/your/external/userspace
|
||||||
|
mkdir -p modules
|
||||||
|
# Replace the following {user} and {repo} with the author's community module repository
|
||||||
|
git submodule add https://github.com/{user}/{repo}.git modules/{user}
|
||||||
|
git submodule update --init --recursive
|
||||||
|
```
|
||||||
|
|
||||||
|
This will ensure the copy of the module is made in your userspace.
|
||||||
|
|
||||||
|
Add a new entry into your `keymap.json` with the desired modules, replacing `{user}` and `{module_name}` as appropriate:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"modules": [
|
||||||
|
"qmk/hello_world",
|
||||||
|
"{user}/{module_name}"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
::: info
|
||||||
|
The module listed in `keymap.json` is the relative path within the `modules/` directory. So long as the module is present _somewhere_ under `modules/`, then the `keymap.json` can refer to that path.
|
||||||
|
:::
|
||||||
|
|
||||||
|
## Writing a QMK Community Module
|
||||||
|
|
||||||
|
As stated earlier, Community Module authors are strongly encouraged to provide their modules through git, allowing users to leverage submodules to import functionality.
|
||||||
|
|
||||||
|
### `qmk_module.json`
|
||||||
|
|
||||||
|
A Community Module is denoted by a `qmk_module.json` file such as the following:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"module_name": "Hello World",
|
||||||
|
"maintainer": "QMK Maintainers",
|
||||||
|
"license": "GPL-2.0-or-later",
|
||||||
|
"features": {
|
||||||
|
"deferred_exec": true
|
||||||
|
},
|
||||||
|
"keycodes": [
|
||||||
|
{
|
||||||
|
"key": "COMMUNITY_MODULE_HELLO",
|
||||||
|
"aliases": ["CM_HELO"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
At minimum, the module must provide the `module_name` and `maintainer` fields.
|
||||||
|
|
||||||
|
The `license` field is encouraged to indicate the terms for using and sharing the module. It is recommended to use a [SPDX license identifier](https://spdx.org/licenses/) like "`Apache-2.0`" or "`GPL-2.0-or-later`" if possible.
|
||||||
|
|
||||||
|
The `url` field may specify a URL to more information about the module.
|
||||||
|
|
||||||
|
The use of `features` matches the definition normally provided within `keyboard.json` and `info.json`, allowing a module to signal to the build system that it has its own dependencies. In the example above, it enables the _deferred executor_ feature whenever the above module is used in a build.
|
||||||
|
|
||||||
|
The `keycodes` array allows a module to provide new keycodes (as well as corresponding aliases) to a keymap.
|
||||||
|
|
||||||
|
### `rules.mk` / `post_rules.mk`
|
||||||
|
|
||||||
|
These two files follows standard QMK build system logic, allowing for `Makefile`-style customisation as if it were present in the keyboard or keymap.
|
||||||
|
|
||||||
|
### `<module>.c`
|
||||||
|
|
||||||
|
This file will be automatically added to the build if the filename matches the directory name. For example, the `qmk/hello_world` module contains a `hello_world.c` file, which is automatically added to the build.
|
||||||
|
|
||||||
|
::: info
|
||||||
|
Other files intended to be included must use the normal method of `SRC += my_file.c` inside `rules.mk`.
|
||||||
|
:::
|
||||||
|
|
||||||
|
::: tip
|
||||||
|
This file should use `ASSERT_COMMUNITY_MODULES_MIN_API_VERSION(1,0,0);` to enforce a minimum version of the API that it requires, ensuring the Community Module is built with a compatible version of QMK. The list of APIs and corresponding version is given at the bottom of this document. Note the use of commas instead of periods.
|
||||||
|
:::
|
||||||
|
|
||||||
|
### `introspection.c` / `introspection.h`
|
||||||
|
|
||||||
|
These two files hook into the keymap introspection logic -- the header is prepended before the user keymap, and the C source file is appended after the user keymap.
|
||||||
|
|
||||||
|
The header may provide definitions which are useful to the user's `keymap.c`.
|
||||||
|
|
||||||
|
The source file may provide functions which allow access to information specified in the user's `keymap.c`.
|
||||||
|
|
||||||
|
::: warning
|
||||||
|
Introspection is a relatively advanced topic within QMK, and existing patterns should be followed. If you need help please [open an issue](https://github.com/qmk/qmk_firmware/issues/new) or [chat with us on Discord](https://discord.gg/qmk).
|
||||||
|
:::
|
||||||
|
|
||||||
|
### `led_matrix_module.inc`
|
||||||
|
|
||||||
|
This file defines LED matrix effects in the same form as used with `led_matrix_kb.inc` and `led_matrix_user.inc` (see [Custom LED Matrix Effects](led_matrix#custom-led-matrix-effects)). Effect mode names are prepended with `LED_MATRIX_COMMUNITY_MODULE_`.
|
||||||
|
|
||||||
|
### `rgb_matrix_module.inc`
|
||||||
|
|
||||||
|
This file defines RGB matrix effects in the same form as used with `rgb_matrix_kb.inc` and `rgb_matrix_user.inc` (see [Custom RGB Matrix Effects](rgb_matrix#custom-rgb-matrix-effects)). Effect mode names are prepended with `RGB_MATRIX_COMMUNITY_MODULE_`.
|
||||||
|
|
||||||
|
### Compatible APIs
|
||||||
|
|
||||||
|
Community Modules may provide specializations for the following APIs:
|
||||||
|
|
||||||
|
| Base API | API Format | Example (`hello_world` module) | API Version |
|
||||||
|
|----------------------------------|-------------------------------------------|---------------------------------------------|-------------|
|
||||||
|
| `keyboard_pre_init` | `keyboard_pre_init_<module>` | `keyboard_pre_init_hello_world` | `0.1.0` |
|
||||||
|
| `keyboard_post_init` | `keyboard_post_init_<module>` | `keyboard_post_init_hello_world` | `0.1.0` |
|
||||||
|
| `pre_process_record` | `pre_process_record_<module>` | `pre_process_record_hello_world` | `0.1.0` |
|
||||||
|
| `process_record` | `process_record_<module>` | `process_record_hello_world` | `0.1.0` |
|
||||||
|
| `post_process_record` | `post_process_record_<module>` | `post_process_record_hello_world` | `0.1.0` |
|
||||||
|
| `housekeeping_task` | `housekeeping_task_<module>` | `housekeeping_task_hello_world` | `1.0.0` |
|
||||||
|
| `suspend_power_down` | `suspend_power_down_<module>` | `suspend_power_down_hello_world` | `1.0.0` |
|
||||||
|
| `suspend_wakeup_init` | `suspend_wakeup_init_<module>` | `suspend_wakeup_init_hello_world` | `1.0.0` |
|
||||||
|
| `shutdown` | `shutdown_<module>` | `shutdown_hello_world` | `1.0.0` |
|
||||||
|
| `process_detected_host_os` | `process_detected_host_os_<module>` | `process_detected_host_os_hello_world` | `1.0.0` |
|
||||||
|
| `default_layer_state_set` | `default_layer_state_set_<module>` | `default_layer_state_set_hello_world` | `1.1.0` |
|
||||||
|
| `layer_state_set` | `layer_state_set_<module>` | `layer_state_set_hello_world` | `1.1.0` |
|
||||||
|
| `led_matrix_indicators` | `led_matrix_indicators_<module>` | `led_matrix_indicators_hello_world` | `1.1.0` |
|
||||||
|
| `led_matrix_indicators_advanced` | `led_matrix_indicators_advanced_<module>` | `led_matrix_indicators_advanced_hello_world` | `1.1.0` |
|
||||||
|
| `rgb_matrix_indicators` | `rgb_matrix_indicators_<module>` | `rgb_matrix_indicators_hello_world` | `1.1.0` |
|
||||||
|
| `rgb_matrix_indicators_advanced` | `rgb_matrix_indicators_advanced_<module>` | `rgb_matrix_indicators_advanced_hello_world` | `1.1.0` |
|
||||||
|
| `pointing_device_init` | `pointing_device_init_<module>` | `pointing_device_init_hello_world` | `1.1.0` |
|
||||||
|
| `pointing_device_task` | `pointing_device_task_<module>` | `pointing_device_task_hello_world` | `1.1.0` |
|
||||||
|
|
||||||
|
|
||||||
|
::: info
|
||||||
|
An unspecified API is disregarded if a Community Module does not provide a specialization for it.
|
||||||
|
:::
|
||||||
|
|
||||||
|
Each API has an equivalent `_<module>_kb()` and `_<module>_user()` hook, as per the normal QMK [`_quantum`, `_kb`, and `_user` functions](/custom_quantum_functions#a-word-on-core-vs-keyboards-vs-keymap).
|
|
@ -135,11 +135,11 @@ bool momentary_layer(bool key_down, void *layer) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const key_override_t fn_override = {.trigger_mods = MOD_BIT(KC_RGUI) | MOD_BIT(KC_RCTL), //
|
const key_override_t fn_override = {.trigger_mods = MOD_BIT(KC_RGUI) | MOD_BIT(KC_RALT), //
|
||||||
.layers = ~(1 << LAYER_FN), //
|
.layers = ~(1 << LAYER_FN), //
|
||||||
.suppressed_mods = MOD_BIT(KC_RGUI) | MOD_BIT(KC_RCTL), //
|
.suppressed_mods = MOD_BIT(KC_RGUI) | MOD_BIT(KC_RALT), //
|
||||||
.options = ko_option_no_unregister_on_other_key_down, //
|
.options = ko_option_no_unregister_on_other_key_down, //
|
||||||
.negative_mod_mask = (uint8_t) ~(MOD_BIT(KC_RGUI) | MOD_BIT(KC_RCTL)), //
|
.negative_mod_mask = (uint8_t) ~(MOD_BIT(KC_RGUI) | MOD_BIT(KC_RALT)), //
|
||||||
.custom_action = momentary_layer, //
|
.custom_action = momentary_layer, //
|
||||||
.context = (void *)LAYER_FN, //
|
.context = (void *)LAYER_FN, //
|
||||||
.trigger = KC_NO, //
|
.trigger = KC_NO, //
|
||||||
|
|
|
@ -154,6 +154,21 @@ User callback, invoked when the leader sequence ends.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
### `bool leader_add_user(uint16_t keycode)` {#api-leader-add-user}
|
||||||
|
|
||||||
|
User callback, invoked when a keycode is added to the leader sequence.
|
||||||
|
|
||||||
|
#### Arguments {#api-leader-add-user-arguments}
|
||||||
|
|
||||||
|
- `uint16_t keycode`
|
||||||
|
The keycode to added to the leader sequence.
|
||||||
|
|
||||||
|
#### Return Value {#api-leader-add-user-return}
|
||||||
|
|
||||||
|
`true` to finish the key sequence, `false` to continue.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
### `void leader_start(void)` {#api-leader-start}
|
### `void leader_start(void)` {#api-leader-start}
|
||||||
|
|
||||||
Begin the leader sequence, resetting the buffer and timer.
|
Begin the leader sequence, resetting the buffer and timer.
|
||||||
|
|
|
@ -227,6 +227,8 @@ For inspiration and examples, check out the built-in effects under `quantum/led_
|
||||||
#define LED_MATRIX_DEFAULT_MODE LED_MATRIX_SOLID // Sets the default mode, if none has been set
|
#define LED_MATRIX_DEFAULT_MODE LED_MATRIX_SOLID // Sets the default mode, if none has been set
|
||||||
#define LED_MATRIX_DEFAULT_VAL LED_MATRIX_MAXIMUM_BRIGHTNESS // Sets the default brightness value, if none has been set
|
#define LED_MATRIX_DEFAULT_VAL LED_MATRIX_MAXIMUM_BRIGHTNESS // Sets the default brightness value, if none has been set
|
||||||
#define LED_MATRIX_DEFAULT_SPD 127 // Sets the default animation speed, if none has been set
|
#define LED_MATRIX_DEFAULT_SPD 127 // Sets the default animation speed, if none has been set
|
||||||
|
#define LED_MATRIX_VAL_STEP 8 // The value by which to increment the brightness per adjustment action
|
||||||
|
#define LED_MATRIX_SPD_STEP 16 // The value by which to increment the animation speed per adjustment action
|
||||||
#define LED_MATRIX_DEFAULT_FLAGS LED_FLAG_ALL // Sets the default LED flags, if none has been set
|
#define LED_MATRIX_DEFAULT_FLAGS LED_FLAG_ALL // Sets the default LED flags, if none has been set
|
||||||
#define LED_MATRIX_SPLIT { X, Y } // (Optional) For split keyboards, the number of LEDs connected on each half. X = left, Y = Right.
|
#define LED_MATRIX_SPLIT { X, Y } // (Optional) For split keyboards, the number of LEDs connected on each half. X = left, Y = Right.
|
||||||
// If reactive effects are enabled, you also will want to enable SPLIT_TRANSPORT_MIRROR
|
// If reactive effects are enabled, you also will want to enable SPLIT_TRANSPORT_MIRROR
|
||||||
|
|
|
@ -419,6 +419,32 @@ The `POINTING_DEVICE_CS_PIN`, `POINTING_DEVICE_SDIO_PIN`, and `POINTING_DEVICE_S
|
||||||
Any pointing device with a lift/contact status can integrate inertial cursor feature into its driver, controlled by `POINTING_DEVICE_GESTURES_CURSOR_GLIDE_ENABLE`. e.g. PMW3360 can use Lift_Stat from Motion register. Note that `POINTING_DEVICE_MOTION_PIN` cannot be used with this feature; continuous polling of `get_report()` is needed to generate glide reports.
|
Any pointing device with a lift/contact status can integrate inertial cursor feature into its driver, controlled by `POINTING_DEVICE_GESTURES_CURSOR_GLIDE_ENABLE`. e.g. PMW3360 can use Lift_Stat from Motion register. Note that `POINTING_DEVICE_MOTION_PIN` cannot be used with this feature; continuous polling of `get_report()` is needed to generate glide reports.
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
## High Resolution Scrolling
|
||||||
|
|
||||||
|
| Setting | Description | Default |
|
||||||
|
| ---------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | ------------- |
|
||||||
|
| `POINTING_DEVICE_HIRES_SCROLL_ENABLE` | (Optional) Enables high resolution scrolling. | _not defined_ |
|
||||||
|
| `POINTING_DEVICE_HIRES_SCROLL_MULTIPLIER`| (Optional) Resolution mutiplier value used by high resolution scrolling. Must be between 1 and 127, inclusive. | `120` |
|
||||||
|
| `POINTING_DEVICE_HIRES_SCROLL_EXPONENT` | (Optional) Resolution exponent value used by high resolution scrolling. Must be between 0 and 127, inclusive. | `0` |
|
||||||
|
|
||||||
|
The `POINTING_DEVICE_HIRES_SCROLL_ENABLE` setting enables smooth and continuous scrolling when using trackballs or high-end encoders as mouse wheels (as opposed to the typical stepped behavior of most mouse wheels).
|
||||||
|
This works by adding a resolution multiplier to the HID descriptor for mouse wheel reports, causing the host computer to interpret each wheel tick sent by the keyboard as a fraction of a normal wheel tick.
|
||||||
|
The resolution multiplier is set to `1 / (POINTING_DEVICE_HIRES_SCROLL_MULTIPLIER * (10 ^ POINTING_DEVICE_HIRES_SCROLL_EXPONENT))`, which is `1 / 120` by default.
|
||||||
|
If even smoother scrolling than provided by this default value is desired, first try using `#define POINTING_DEVICE_HIRES_SCROLL_EXPONENT 1` which will result in a multiplier of `1 / 1200`.
|
||||||
|
|
||||||
|
The function `pointing_device_get_hires_scroll_resolution()` can be called to get the pre-computed resolution multiplier value as a `uint16_t`.
|
||||||
|
|
||||||
|
::: warning
|
||||||
|
High resolution scrolling usually results in larger and/or more frequent mouse reports. This can result in overflow errors and overloading of the host computer's input buffer.
|
||||||
|
To deal with these issues, define `WHEEL_EXTENDED_REPORT` and throttle the rate at which mouse reports are sent.
|
||||||
|
:::
|
||||||
|
|
||||||
|
::: warning
|
||||||
|
Many programs, especially those that implement their own smoothing for scrolling, don't work well when they receive simultaneous vertical and horizontal wheel inputs (e.g. from high resolution drag-scroll using a trackball).
|
||||||
|
These programs typically implement their smoothing in a way that assumes the user will only scroll in one axis at a time, resulting in slow or jittery motion when trying to scroll at an angle.
|
||||||
|
This can be addressed by snapping scrolling to one axis at a time.
|
||||||
|
:::
|
||||||
|
|
||||||
## Split Keyboard Configuration
|
## Split Keyboard Configuration
|
||||||
|
|
||||||
The following configuration options are only available when using `SPLIT_POINTING_ENABLE` see [data sync options](split_keyboard#data-sync-options). The rotation and invert `*_RIGHT` options are only used with `POINTING_DEVICE_COMBINED`. If using `POINTING_DEVICE_LEFT` or `POINTING_DEVICE_RIGHT` use the common configuration above to configure your pointing device.
|
The following configuration options are only available when using `SPLIT_POINTING_ENABLE` see [data sync options](split_keyboard#data-sync-options). The rotation and invert `*_RIGHT` options are only used with `POINTING_DEVICE_COMBINED`. If using `POINTING_DEVICE_LEFT` or `POINTING_DEVICE_RIGHT` use the common configuration above to configure your pointing device.
|
||||||
|
|
|
@ -23,8 +23,11 @@ MODULE 5+ --------+--+--------- PWR CONTROLLER
|
||||||
CLK ------+------------ PIN
|
CLK ------+------------ PIN
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Driver Configuration {#driver-configuration}
|
||||||
|
|
||||||
## Busywait Version {#busywait-version}
|
Driver selection can be configured in `rules.mk` as `PS2_DRIVER`, or in `info.json` as `ps2.driver`. Valid values are `busywait` (default), `interrupt`, `usart`, or `vendor`. See below for information on individual drivers.
|
||||||
|
|
||||||
|
### Busywait Driver {#busywait-driver}
|
||||||
|
|
||||||
Note: This is not recommended, you may encounter jerky movement or unsent inputs. Please use interrupt or USART version if possible.
|
Note: This is not recommended, you may encounter jerky movement or unsent inputs. Please use interrupt or USART version if possible.
|
||||||
|
|
||||||
|
@ -45,7 +48,7 @@ In your keyboard config.h:
|
||||||
#endif
|
#endif
|
||||||
```
|
```
|
||||||
|
|
||||||
### Interrupt Version (AVR/ATMega32u4) {#interrupt-version-avr}
|
### Interrupt Driver (AVR/ATMega32u4) {#interrupt-driver-avr}
|
||||||
|
|
||||||
The following example uses D2 for clock and D5 for data. You can use any INT or PCINT pin for clock, and any pin for data.
|
The following example uses D2 for clock and D5 for data. You can use any INT or PCINT pin for clock, and any pin for data.
|
||||||
|
|
||||||
|
@ -78,7 +81,7 @@ In your keyboard config.h:
|
||||||
#endif
|
#endif
|
||||||
```
|
```
|
||||||
|
|
||||||
### Interrupt Version (ARM chibios) {#interrupt-version-chibios}
|
### Interrupt Driver (ARM chibios) {#interrupt-driver-chibios}
|
||||||
|
|
||||||
Pretty much any two pins can be used for the (software) interrupt variant on ARM cores. The example below uses A8 for clock, and A9 for data.
|
Pretty much any two pins can be used for the (software) interrupt variant on ARM cores. The example below uses A8 for clock, and A9 for data.
|
||||||
|
|
||||||
|
@ -107,7 +110,7 @@ And in the ChibiOS specific `halconf.h`:
|
||||||
#include_next <halconf.h>
|
#include_next <halconf.h>
|
||||||
```
|
```
|
||||||
|
|
||||||
### USART Version {#usart-version}
|
### USART Driver {#usart-driver}
|
||||||
|
|
||||||
To use USART on the ATMega32u4, you have to use PD5 for clock and PD2 for data. If one of those are unavailable, you need to use interrupt version.
|
To use USART on the ATMega32u4, you have to use PD5 for clock and PD2 for data. If one of those are unavailable, you need to use interrupt version.
|
||||||
|
|
||||||
|
@ -159,7 +162,7 @@ In your keyboard config.h:
|
||||||
#endif
|
#endif
|
||||||
```
|
```
|
||||||
|
|
||||||
### RP2040 PIO Version {#rp2040-pio-version}
|
### RP2040 PIO Driver {#rp2040-pio-driver}
|
||||||
|
|
||||||
The `PIO` subsystem is a Raspberry Pi RP2040 specific implementation, using the integrated PIO peripheral and is therefore only available on this MCU.
|
The `PIO` subsystem is a Raspberry Pi RP2040 specific implementation, using the integrated PIO peripheral and is therefore only available on this MCU.
|
||||||
|
|
||||||
|
|
|
@ -150,6 +150,7 @@ enum rgb_matrix_effects {
|
||||||
RGB_MATRIX_SOLID_SPLASH, // Hue & value pulse away from a single key hit then fades value out
|
RGB_MATRIX_SOLID_SPLASH, // Hue & value pulse away from a single key hit then fades value out
|
||||||
RGB_MATRIX_SOLID_MULTISPLASH, // Hue & value pulse away from multiple key hits then fades value out
|
RGB_MATRIX_SOLID_MULTISPLASH, // Hue & value pulse away from multiple key hits then fades value out
|
||||||
RGB_MATRIX_STARLIGHT, // LEDs turn on and off at random at varying brightness, maintaining user set color
|
RGB_MATRIX_STARLIGHT, // LEDs turn on and off at random at varying brightness, maintaining user set color
|
||||||
|
RGB_MATRIX_STARLIGHT_SMOOTH, // LEDs slowly increase and decrease in brightness randomly
|
||||||
RGB_MATRIX_STARLIGHT_DUAL_HUE, // LEDs turn on and off at random at varying brightness, modifies user set hue by +- 30
|
RGB_MATRIX_STARLIGHT_DUAL_HUE, // LEDs turn on and off at random at varying brightness, modifies user set hue by +- 30
|
||||||
RGB_MATRIX_STARLIGHT_DUAL_SAT, // LEDs turn on and off at random at varying brightness, modifies user set saturation by +- 30
|
RGB_MATRIX_STARLIGHT_DUAL_SAT, // LEDs turn on and off at random at varying brightness, modifies user set saturation by +- 30
|
||||||
RGB_MATRIX_RIVERFLOW, // Modification to breathing animation, offset's animation depending on key location to simulate a river flowing
|
RGB_MATRIX_RIVERFLOW, // Modification to breathing animation, offset's animation depending on key location to simulate a river flowing
|
||||||
|
@ -193,6 +194,7 @@ You can enable a single effect by defining `ENABLE_[EFFECT_NAME]` in your `confi
|
||||||
|`#define ENABLE_RGB_MATRIX_PIXEL_FLOW` |Enables `RGB_MATRIX_PIXEL_FLOW` |
|
|`#define ENABLE_RGB_MATRIX_PIXEL_FLOW` |Enables `RGB_MATRIX_PIXEL_FLOW` |
|
||||||
|`#define ENABLE_RGB_MATRIX_PIXEL_RAIN` |Enables `RGB_MATRIX_PIXEL_RAIN` |
|
|`#define ENABLE_RGB_MATRIX_PIXEL_RAIN` |Enables `RGB_MATRIX_PIXEL_RAIN` |
|
||||||
|`#define ENABLE_RGB_MATRIX_STARLIGHT` |Enables `RGB_MATRIX_STARLIGHT` |
|
|`#define ENABLE_RGB_MATRIX_STARLIGHT` |Enables `RGB_MATRIX_STARLIGHT` |
|
||||||
|
|`#define ENABLE_RGB_MATRIX_STARLIGHT_SMOOTH` |Enables `RGB_MATRIX_STARLIGHT_SMOOTH` |
|
||||||
|`#define ENABLE_RGB_MATRIX_STARLIGHT_DUAL_HUE` |Enables `RGB_MATRIX_STARLIGHT_DUAL_HUE` |
|
|`#define ENABLE_RGB_MATRIX_STARLIGHT_DUAL_HUE` |Enables `RGB_MATRIX_STARLIGHT_DUAL_HUE` |
|
||||||
|`#define ENABLE_RGB_MATRIX_STARLIGHT_DUAL_SAT` |Enables `RGB_MATRIX_STARLIGHT_DUAL_SAT` |
|
|`#define ENABLE_RGB_MATRIX_STARLIGHT_DUAL_SAT` |Enables `RGB_MATRIX_STARLIGHT_DUAL_SAT` |
|
||||||
|`#define ENABLE_RGB_MATRIX_RIVERFLOW` |Enables `RGB_MATRIX_RIVERFLOW` |
|
|`#define ENABLE_RGB_MATRIX_RIVERFLOW` |Enables `RGB_MATRIX_RIVERFLOW` |
|
||||||
|
@ -378,6 +380,10 @@ These are defined in [`color.h`](https://github.com/qmk/qmk_firmware/blob/master
|
||||||
#define RGB_MATRIX_DEFAULT_SAT 255 // Sets the default saturation value, if none has been set
|
#define RGB_MATRIX_DEFAULT_SAT 255 // Sets the default saturation value, if none has been set
|
||||||
#define RGB_MATRIX_DEFAULT_VAL RGB_MATRIX_MAXIMUM_BRIGHTNESS // Sets the default brightness value, if none has been set
|
#define RGB_MATRIX_DEFAULT_VAL RGB_MATRIX_MAXIMUM_BRIGHTNESS // Sets the default brightness value, if none has been set
|
||||||
#define RGB_MATRIX_DEFAULT_SPD 127 // Sets the default animation speed, if none has been set
|
#define RGB_MATRIX_DEFAULT_SPD 127 // Sets the default animation speed, if none has been set
|
||||||
|
#define RGB_MATRIX_HUE_STEP 8 // The value by which to increment the hue per adjustment action
|
||||||
|
#define RGB_MATRIX_SAT_STEP 16 // The value by which to increment the saturation per adjustment action
|
||||||
|
#define RGB_MATRIX_VAL_STEP 16 // The value by which to increment the brightness per adjustment action
|
||||||
|
#define RGB_MATRIX_SPD_STEP 16 // The value by which to increment the animation speed per adjustment action
|
||||||
#define RGB_MATRIX_DEFAULT_FLAGS LED_FLAG_ALL // Sets the default LED flags, if none has been set
|
#define RGB_MATRIX_DEFAULT_FLAGS LED_FLAG_ALL // Sets the default LED flags, if none has been set
|
||||||
#define RGB_MATRIX_SPLIT { X, Y } // (Optional) For split keyboards, the number of LEDs connected on each half. X = left, Y = Right.
|
#define RGB_MATRIX_SPLIT { X, Y } // (Optional) For split keyboards, the number of LEDs connected on each half. X = left, Y = Right.
|
||||||
// If reactive effects are enabled, you also will want to enable SPLIT_TRANSPORT_MIRROR
|
// If reactive effects are enabled, you also will want to enable SPLIT_TRANSPORT_MIRROR
|
||||||
|
@ -480,7 +486,7 @@ This example sets the modifiers to be a specific color based on the layer state.
|
||||||
bool rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
|
bool rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
|
||||||
hsv_t hsv = {0, 255, 255};
|
hsv_t hsv = {0, 255, 255};
|
||||||
|
|
||||||
if (layer_state_is(layer_state, 2)) {
|
if (get_highest_layer(layer_state|default_layer_state) == 2) {
|
||||||
hsv = (hsv_t){130, 255, 255};
|
hsv = (hsv_t){130, 255, 255};
|
||||||
} else {
|
} else {
|
||||||
hsv = (hsv_t){30, 255, 255};
|
hsv = (hsv_t){30, 255, 255};
|
||||||
|
|
|
@ -97,9 +97,9 @@ Your RGB lighting can be configured by placing these `#define`s in your `config.
|
||||||
|
|
||||||
|Define |Default |Description |
|
|Define |Default |Description |
|
||||||
|---------------------------|----------------------------|---------------------------------------------------------------------------------------------------------------------------|
|
|---------------------------|----------------------------|---------------------------------------------------------------------------------------------------------------------------|
|
||||||
|`RGBLIGHT_HUE_STEP` |`8` |The number of steps to cycle through the hue by |
|
|`RGBLIGHT_HUE_STEP` |`8` |The value by which to increment the hue per adjustment action |
|
||||||
|`RGBLIGHT_SAT_STEP` |`17` |The number of steps to increment the saturation by |
|
|`RGBLIGHT_SAT_STEP` |`17` |The value by which to increment the saturation per adjustment action |
|
||||||
|`RGBLIGHT_VAL_STEP` |`17` |The number of steps to increment the brightness by |
|
|`RGBLIGHT_VAL_STEP` |`17` |The value by which to increment the brightness per adjustment action |
|
||||||
|`RGBLIGHT_LIMIT_VAL` |`255` |The maximum brightness level |
|
|`RGBLIGHT_LIMIT_VAL` |`255` |The maximum brightness level |
|
||||||
|`RGBLIGHT_SLEEP` |*Not defined* |If defined, the RGB lighting will be switched off when the host goes to sleep |
|
|`RGBLIGHT_SLEEP` |*Not defined* |If defined, the RGB lighting will be switched off when the host goes to sleep |
|
||||||
|`RGBLIGHT_SPLIT` |*Not defined* |If defined, synchronization functionality for split keyboards is added |
|
|`RGBLIGHT_SPLIT` |*Not defined* |If defined, synchronization functionality for split keyboards is added |
|
||||||
|
|
|
@ -444,7 +444,7 @@ This setting implies that `RGBLIGHT_SPLIT` is enabled, and will forcibly enable
|
||||||
#define SPLIT_USB_DETECT
|
#define SPLIT_USB_DETECT
|
||||||
```
|
```
|
||||||
|
|
||||||
Enabling this option changes the startup behavior to listen for an active USB communication to delegate which part is master and which is slave. With this option enabled and theres's USB communication, then that half assumes it is the master, otherwise it assumes it is the slave.
|
Enabling this option changes the startup behavior to listen for an active USB communication to delegate which part is master and which is slave. With this option enabled and active USB communication, then that half assumes it is the master, otherwise it assumes it is the slave.
|
||||||
|
|
||||||
Without this option, the master is the half that can detect voltage on the physical USB connection (VBUS detection).
|
Without this option, the master is the half that can detect voltage on the physical USB connection (VBUS detection).
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,7 @@ The [Open Steno Project](https://www.openstenoproject.org/) has built an open-so
|
||||||
|
|
||||||
Plover can work with any standard QWERTY keyboard, although it is more efficient if the keyboard supports NKRO (n-key rollover) to allow Plover to see all the pressed keys at once. An example keymap for Plover can be found in `planck/keymaps/default`. Switching to the `PLOVER` layer adjusts the position of the keyboard to support the number bar.
|
Plover can work with any standard QWERTY keyboard, although it is more efficient if the keyboard supports NKRO (n-key rollover) to allow Plover to see all the pressed keys at once. An example keymap for Plover can be found in `planck/keymaps/default`. Switching to the `PLOVER` layer adjusts the position of the keyboard to support the number bar.
|
||||||
|
|
||||||
To enable NKRO, add `NKRO_ENABLE = yes` in your `rules.mk` and make sure to press `NK_ON` to turn it on because `NKRO_ENABLE = yes` merely adds the possibility of switching to NKRO mode but it doesn't automatically switch to it. If you want to automatically switch, add `#define FORCE_NKRO` in your `config.h`.
|
To enable NKRO, add `NKRO_ENABLE = yes` in your `rules.mk` and make sure to press `NK_ON` to turn it on because `NKRO_ENABLE = yes` merely adds the possibility of switching to NKRO mode but it doesn't automatically switch to it. If you want to automatically switch, add `#define NKRO_DEFAULT_ON true` in your `config.h`.
|
||||||
|
|
||||||
You may also need to adjust your layout, either in QMK or in Plover, if you have anything other than a standard layout. You may also want to purchase some steno-friendly keycaps to make it easier to hit multiple keys.
|
You may also need to adjust your layout, either in QMK or in Plover, if you have anything other than a standard layout. You may also want to purchase some steno-friendly keycaps to make it easier to hit multiple keys.
|
||||||
|
|
||||||
|
|
|
@ -170,20 +170,6 @@ typedef struct {
|
||||||
uint16_t held;
|
uint16_t held;
|
||||||
} tap_dance_tap_hold_t;
|
} tap_dance_tap_hold_t;
|
||||||
|
|
||||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
|
||||||
tap_dance_action_t *action;
|
|
||||||
|
|
||||||
switch (keycode) {
|
|
||||||
case TD(CT_CLN): // list all tap dance keycodes with tap-hold configurations
|
|
||||||
action = &tap_dance_actions[QK_TAP_DANCE_GET_INDEX(keycode)];
|
|
||||||
if (!record->event.pressed && action->state.count && !action->state.finished) {
|
|
||||||
tap_dance_tap_hold_t *tap_hold = (tap_dance_tap_hold_t *)action->user_data;
|
|
||||||
tap_code16(tap_hold->tap);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void tap_dance_tap_hold_finished(tap_dance_state_t *state, void *user_data) {
|
void tap_dance_tap_hold_finished(tap_dance_state_t *state, void *user_data) {
|
||||||
tap_dance_tap_hold_t *tap_hold = (tap_dance_tap_hold_t *)user_data;
|
tap_dance_tap_hold_t *tap_hold = (tap_dance_tap_hold_t *)user_data;
|
||||||
|
|
||||||
|
@ -212,11 +198,28 @@ void tap_dance_tap_hold_reset(tap_dance_state_t *state, void *user_data) {
|
||||||
}
|
}
|
||||||
|
|
||||||
#define ACTION_TAP_DANCE_TAP_HOLD(tap, hold) \
|
#define ACTION_TAP_DANCE_TAP_HOLD(tap, hold) \
|
||||||
{ .fn = {NULL, tap_dance_tap_hold_finished, tap_dance_tap_hold_reset}, .user_data = (void *)&((tap_dance_tap_hold_t){tap, hold, 0}), }
|
{ \
|
||||||
|
.fn = {NULL, tap_dance_tap_hold_finished, tap_dance_tap_hold_reset}, \
|
||||||
|
.user_data = (void *)&((tap_dance_tap_hold_t){tap, hold, 0}), \
|
||||||
|
}
|
||||||
|
|
||||||
tap_dance_action_t tap_dance_actions[] = {
|
tap_dance_action_t tap_dance_actions[] = {
|
||||||
[CT_CLN] = ACTION_TAP_DANCE_TAP_HOLD(KC_COLN, KC_SCLN),
|
[CT_CLN] = ACTION_TAP_DANCE_TAP_HOLD(KC_COLN, KC_SCLN),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||||
|
tap_dance_action_t *action;
|
||||||
|
|
||||||
|
switch (keycode) {
|
||||||
|
case TD(CT_CLN): // list all tap dance keycodes with tap-hold configurations
|
||||||
|
action = &tap_dance_actions[QK_TAP_DANCE_GET_INDEX(keycode)];
|
||||||
|
if (!record->event.pressed && action->state.count && !action->state.finished) {
|
||||||
|
tap_dance_tap_hold_t *tap_hold = (tap_dance_tap_hold_t *)action->user_data;
|
||||||
|
tap_code16(tap_hold->tap);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Example 4: 'Quad Function Tap-Dance' {#example-4}
|
#### Example 4: 'Quad Function Tap-Dance' {#example-4}
|
||||||
|
|
|
@ -50,6 +50,13 @@ By default docker or podman are automatically detected and docker is preferred o
|
||||||
RUNTIME="podman" util/docker_build.sh keyboard:keymap:target
|
RUNTIME="podman" util/docker_build.sh keyboard:keymap:target
|
||||||
```
|
```
|
||||||
|
|
||||||
|
If flashing is not required, it's possible to run the container as unprivileged (on Linux), and without docker-machine (on Windows/macOS):
|
||||||
|
|
||||||
|
```
|
||||||
|
SKIP_FLASHING_SUPPORT=1 util/docker_build.sh keyboard:keymap:target
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
## FAQ
|
## FAQ
|
||||||
|
|
||||||
### Why can't I flash on Windows/macOS
|
### Why can't I flash on Windows/macOS
|
||||||
|
|
|
@ -231,7 +231,7 @@ Once you have confirmed that the keyboard is working, if you have used a seperat
|
||||||
|
|
||||||
If you found this fullfilling you could experiment by adding additional features such as [in switch LEDs](https://geekhack.org/index.php?topic=94258.0), [in switch RGB](https://www.reddit.com/r/MechanicalKeyboards/comments/5s1l5u/photoskeyboard_science_i_made_a_handwired_rgb/), [RGB underglow](https://medium.com/@DavidNZ/hand-wired-custom-keyboard-cdd14429c7b3#.7a1ovebsk) or even an [OLED display!](https://www.reddit.com/r/olkb/comments/5zy7og/adding_ssd1306_oled_display_to_your_build/)
|
If you found this fullfilling you could experiment by adding additional features such as [in switch LEDs](https://geekhack.org/index.php?topic=94258.0), [in switch RGB](https://www.reddit.com/r/MechanicalKeyboards/comments/5s1l5u/photoskeyboard_science_i_made_a_handwired_rgb/), [RGB underglow](https://medium.com/@DavidNZ/hand-wired-custom-keyboard-cdd14429c7b3#.7a1ovebsk) or even an [OLED display!](https://www.reddit.com/r/olkb/comments/5zy7og/adding_ssd1306_oled_display_to_your_build/)
|
||||||
|
|
||||||
There are a lot of possibilities inside the firmware - explore [docs.qmk.fm](https://docs.qmk.fm) for a full feature list, and dive into the different keyboards to see how people use all of them. You can always stop by [the OLKB subreddit](https://reddit.com/r/olkb) or [QMK Discord](https://discord.gg/qmk) for help!
|
There are a lot of possibilities inside the firmware - explore [the documentation](/) for a full feature list, and dive into the different keyboards to see how people use all of them. You can always stop by [the OLKB subreddit](https://reddit.com/r/olkb) or [QMK Discord](https://discord.gg/qmk) for help!
|
||||||
|
|
||||||
## Links to Other Guides
|
## Links to Other Guides
|
||||||
|
|
||||||
|
|
|
@ -176,11 +176,11 @@ See also: [Basic Keycodes](keycodes_basic)
|
||||||
|`KC_LEFT_CTRL` |`KC_LCTL` |Left Control |✔ |✔ |✔ |
|
|`KC_LEFT_CTRL` |`KC_LCTL` |Left Control |✔ |✔ |✔ |
|
||||||
|`KC_LEFT_SHIFT` |`KC_LSFT` |Left Shift |✔ |✔ |✔ |
|
|`KC_LEFT_SHIFT` |`KC_LSFT` |Left Shift |✔ |✔ |✔ |
|
||||||
|`KC_LEFT_ALT` |`KC_LALT`, `KC_LOPT` |Left Alt (Option) |✔ |✔ |✔ |
|
|`KC_LEFT_ALT` |`KC_LALT`, `KC_LOPT` |Left Alt (Option) |✔ |✔ |✔ |
|
||||||
|`KC_LEFT_GUI` |`KC_LGUI`, `KC_LCMD`, `KC_LWIN`|Left GUI (Windows/Command/Meta key) |✔ |✔ |✔ |
|
|`KC_LEFT_GUI` |`KC_LGUI`, `KC_LCMD`, `KC_LWIN`|Left GUI (Windows/Command/Super key) |✔ |✔ |✔ |
|
||||||
|`KC_RIGHT_CTRL` |`KC_RCTL` |Right Control |✔ |✔ |✔ |
|
|`KC_RIGHT_CTRL` |`KC_RCTL` |Right Control |✔ |✔ |✔ |
|
||||||
|`KC_RIGHT_SHIFT` |`KC_RSFT` |Right Shift |✔ |✔ |✔ |
|
|`KC_RIGHT_SHIFT` |`KC_RSFT` |Right Shift |✔ |✔ |✔ |
|
||||||
|`KC_RIGHT_ALT` |`KC_RALT`, `KC_ROPT`, `KC_ALGR`|Right Alt (Option/AltGr) |✔ |✔ |✔ |
|
|`KC_RIGHT_ALT` |`KC_RALT`, `KC_ROPT`, `KC_ALGR`|Right Alt (Option/AltGr) |✔ |✔ |✔ |
|
||||||
|`KC_RIGHT_GUI` |`KC_RGUI`, `KC_RCMD`, `KC_RWIN`|Right GUI (Windows/Command/Meta key) |✔ |✔ |✔ |
|
|`KC_RIGHT_GUI` |`KC_RGUI`, `KC_RCMD`, `KC_RWIN`|Right GUI (Windows/Command/Super key) |✔ |✔ |✔ |
|
||||||
|`KC_SYSTEM_POWER` |`KC_PWR` |System Power Down |✔ |✔<sup>3</sup>|✔ |
|
|`KC_SYSTEM_POWER` |`KC_PWR` |System Power Down |✔ |✔<sup>3</sup>|✔ |
|
||||||
|`KC_SYSTEM_SLEEP` |`KC_SLEP` |System Sleep |✔ |✔<sup>3</sup>|✔ |
|
|`KC_SYSTEM_SLEEP` |`KC_SLEP` |System Sleep |✔ |✔<sup>3</sup>|✔ |
|
||||||
|`KC_SYSTEM_WAKE` |`KC_WAKE` |System Wake | |✔<sup>3</sup>|✔ |
|
|`KC_SYSTEM_WAKE` |`KC_WAKE` |System Wake | |✔<sup>3</sup>|✔ |
|
||||||
|
@ -659,57 +659,73 @@ See also: [Mouse Keys](features/mouse_keys)
|
||||||
See also: [Modifier Keys](feature_advanced_keycodes#modifier-keys)
|
See also: [Modifier Keys](feature_advanced_keycodes#modifier-keys)
|
||||||
|
|
||||||
|Key |Aliases |Description |
|
|Key |Aliases |Description |
|
||||||
|----------|----------------------------------|------------------------------------------------------|
|
|----------|----------------------------------|-------------------------------------------------------------------|
|
||||||
|`LCTL(kc)`|`C(kc)` |Hold Left Control and press `kc` |
|
|`LCTL(kc)`|`C(kc)` |Hold Left Control and press `kc` |
|
||||||
|`LSFT(kc)`|`S(kc)` |Hold Left Shift and press `kc` |
|
|`LSFT(kc)`|`S(kc)` |Hold Left Shift and press `kc` |
|
||||||
|`LALT(kc)`|`A(kc)`, `LOPT(kc)` |Hold Left Alt and press `kc` |
|
|`LALT(kc)`|`A(kc)`, `LOPT(kc)` |Hold Left Alt and press `kc` |
|
||||||
|`LGUI(kc)`|`G(kc)`, `LCMD(kc)`, `LWIN(kc)` |Hold Left GUI and press `kc` |
|
|`LGUI(kc)`|`G(kc)`, `LCMD(kc)`, `LWIN(kc)` |Hold Left GUI and press `kc` |
|
||||||
|`RCTL(kc)`| |Hold Right Control and press `kc` |
|
|`LCS(kc)` | |Hold Left Control and Left Shift and press `kc` |
|
||||||
|`RSFT(kc)`| |Hold Right Shift and press `kc` |
|
|`LCA(kc)` | |Hold Left Control and Left Alt and press `kc` |
|
||||||
|`RALT(kc)`|`ROPT(kc)`, `ALGR(kc)` |Hold Right Alt (AltGr) and press `kc` |
|
|`LCG(kc)` | |Hold Left Control and Left GUI and press `kc` |
|
||||||
|`RGUI(kc)`|`RCMD(kc)`, `RWIN(kc)` |Hold Right GUI and press `kc` |
|
|`LSA(kc)` | |Hold Left Shift and Left Alt and press `kc` |
|
||||||
|`LSG(kc)` |`SGUI(kc)`, `SCMD(kc)`, `SWIN(kc)`|Hold Left Shift and Left GUI and press `kc` |
|
|`LSG(kc)` |`SGUI(kc)`, `SCMD(kc)`, `SWIN(kc)`|Hold Left Shift and Left GUI and press `kc` |
|
||||||
|`LAG(kc)` | |Hold Left Alt and Left GUI and press `kc` |
|
|`LAG(kc)` | |Hold Left Alt and Left GUI and press `kc` |
|
||||||
|
|`LCSG(kc)`| |Hold Left Control, Left Shift and Left GUI and press `kc` |
|
||||||
|
|`LCAG(kc)`| |Hold Left Control, Left Alt and Left GUI and press `kc` |
|
||||||
|
|`LSAG(kc)`| |Hold Left Shift, Left Alt and Left GUI and press `kc` |
|
||||||
|
|`RCTL(kc)`| |Hold Right Control and press `kc` |
|
||||||
|
|`RSFT(kc)`| |Hold Right Shift and press `kc` |
|
||||||
|
|`RALT(kc)`|`ROPT(kc)`, `ALGR(kc)` |Hold Right Alt and press `kc` |
|
||||||
|
|`RGUI(kc)`|`RCMD(kc)`, `RWIN(kc)` |Hold Right GUI and press `kc` |
|
||||||
|
|`RCS(kc)` | |Hold Right Control and Right Shift and press `kc` |
|
||||||
|
|`RCA(kc)` | |Hold Right Control and Right Alt and press `kc` |
|
||||||
|
|`RCG(kc)` | |Hold Right Control and Right GUI and press `kc` |
|
||||||
|
|`RSA(kc)` |`SAGR(kc)` |Hold Right Shift and Right Alt and press `kc` |
|
||||||
|`RSG(kc)` | |Hold Right Shift and Right GUI and press `kc` |
|
|`RSG(kc)` | |Hold Right Shift and Right GUI and press `kc` |
|
||||||
|`RAG(kc)` | |Hold Right Alt and Right GUI and press `kc` |
|
|`RAG(kc)` | |Hold Right Alt and Right GUI and press `kc` |
|
||||||
|`LCA(kc)` | |Hold Left Control and Alt and press `kc` |
|
|`RCSG(kc)`| |Hold Right Control, Right Shift and Right GUI and press `kc` |
|
||||||
|`LSA(kc)` | |Hold Left Shift and Left Alt and press `kc` |
|
|`RCAG(kc)`| |Hold Right Control, Right Alt and Right GUI and press `kc` |
|
||||||
|`RSA(kc)` |`SAGR(kc)` |Hold Right Shift and Right Alt (AltGr) and press `kc` |
|
|`RSAG(kc)`| |Hold Right Shift, Right Alt and Right GUI and press `kc` |
|
||||||
|`RCS(kc)` | |Hold Right Control and Right Shift and press `kc` |
|
|`MEH(kc)` | |Hold Left Control, Left Shift and Left Alt and press `kc` |
|
||||||
|`LCAG(kc)`| |Hold Left Control, Alt and GUI and press `kc` |
|
|`HYPR(kc)`| |Hold Left Control, Left Shift, Left Alt and Left GUI and press `kc`|
|
||||||
|`MEH(kc)` | |Hold Left Control, Shift and Alt and press `kc` |
|
|`KC_MEH` | |Left Control, Left Shift and Left Alt |
|
||||||
|`HYPR(kc)`| |Hold Left Control, Shift, Alt and GUI and press `kc` |
|
|`KC_HYPR` | |Left Control, Left Shift, Left Alt and Left GUI |
|
||||||
|`KC_MEH` | |Left Control, Shift and Alt |
|
|
||||||
|`KC_HYPR` | |Left Control, Shift, Alt and GUI |
|
|
||||||
|
|
||||||
## Mod-Tap Keys {#mod-tap-keys}
|
## Mod-Tap Keys {#mod-tap-keys}
|
||||||
|
|
||||||
See also: [Mod-Tap](mod_tap)
|
See also: [Mod-Tap](mod_tap)
|
||||||
|
|
||||||
|Key |Aliases |Description |
|
|Key |Aliases |Description |
|
||||||
|-------------|-----------------------------------------------------------------|--------------------------------------------------------------|
|
|-------------|-----------------------------------------------------------------|---------------------------------------------------------------------------|
|
||||||
|`MT(mod, kc)`| |`mod` when held, `kc` when tapped |
|
|`MT(mod, kc)`| |`mod` when held, `kc` when tapped |
|
||||||
|`LCTL_T(kc)` |`CTL_T(kc)` |Left Control when held, `kc` when tapped |
|
|`LCTL_T(kc)` |`CTL_T(kc)` |Left Control when held, `kc` when tapped |
|
||||||
|`LSFT_T(kc)` |`SFT_T(kc)` |Left Shift when held, `kc` when tapped |
|
|`LSFT_T(kc)` |`SFT_T(kc)` |Left Shift when held, `kc` when tapped |
|
||||||
|`LALT_T(kc)` |`LOPT_T(kc)`, `ALT_T(kc)`, `OPT_T(kc)` |Left Alt when held, `kc` when tapped |
|
|`LALT_T(kc)` |`ALT_T(kc)`, `LOPT_T(kc)`, `OPT_T(kc)` |Left Alt when held, `kc` when tapped |
|
||||||
|`LGUI_T(kc)` |`LCMD_T(kc)`, `LWIN_T(kc)`, `GUI_T(kc)`, `CMD_T(kc)`, `WIN_T(kc)`|Left GUI when held, `kc` when tapped |
|
|`LGUI_T(kc)` |`GUI_T(kc)`, `LCMD_T(kc)`, `LWIN_T(kc)`, `CMD_T(kc)`, `WIN_T(kc)`|Left GUI when held, `kc` when tapped |
|
||||||
|
|`LCS_T(kc)` | |Left Control and Left Shift when held, `kc` when tapped |
|
||||||
|
|`LCA_T(kc)` | |Left Control and Left Alt when held, `kc` when tapped |
|
||||||
|
|`LCG_T(kc)` | |Left Control and Left GUI when held, `kc` when tapped |
|
||||||
|
|`LSA_T(kc)` | |Left Shift and Left Alt when held, `kc` when tapped |
|
||||||
|
|`LSG_T(kc)` |`SGUI_T(kc)`, `SCMD_T(kc)`, `SWIN_T(kc)` |Left Shift and Left GUI when held, `kc` when tapped |
|
||||||
|
|`LAG_T(kc)` | |Left Alt and Left GUI when held, `kc` when tapped |
|
||||||
|
|`LCSG_T(kc)` | |Left Control, Left Shift and Left GUI when held, `kc` when tapped |
|
||||||
|
|`LCAG_T(kc)` | |Left Control, Left Alt and Left GUI when held, `kc` when tapped |
|
||||||
|
|`LSAG_T(kc)` | |Left Shift, Left Alt and Left GUI when held, `kc` when tapped |
|
||||||
|`RCTL_T(kc)` | |Right Control when held, `kc` when tapped |
|
|`RCTL_T(kc)` | |Right Control when held, `kc` when tapped |
|
||||||
|`RSFT_T(kc)` | |Right Shift when held, `kc` when tapped |
|
|`RSFT_T(kc)` | |Right Shift when held, `kc` when tapped |
|
||||||
|`RALT_T(kc)` |`ROPT_T(kc)`, `ALGR_T(kc)` |Right Alt (AltGr) when held, `kc` when tapped |
|
|`RALT_T(kc)` |`ROPT_T(kc)`, `ALGR_T(kc)` |Right Alt when held, `kc` when tapped |
|
||||||
|`RGUI_T(kc)` |`RCMD_T(kc)`, `RWIN_T(kc)` |Right GUI when held, `kc` when tapped |
|
|`RGUI_T(kc)` |`RCMD_T(kc)`, `RWIN_T(kc)` |Right GUI when held, `kc` when tapped |
|
||||||
|`LSG_T(kc)` |`SGUI_T(kc)`, `SCMD_T(kc)`, `SWIN_T(kc)` |Left Shift and GUI when held, `kc` when tapped |
|
|
||||||
|`LAG_T(kc)` | |Left Alt and GUI when held, `kc` when tapped |
|
|
||||||
|`RSG_T(kc)` | |Right Shift and GUI when held, `kc` when tapped |
|
|
||||||
|`RAG_T(kc)` | |Right Alt and GUI when held, `kc` when tapped |
|
|
||||||
|`LCA_T(kc)` | |Left Control and Alt when held, `kc` when tapped |
|
|
||||||
|`LSA_T(kc)` | |Left Shift and Left Alt when held, `kc` when tapped |
|
|
||||||
|`RSA_T(kc)` |`SAGR_T(kc)` |Right Shift and Right Alt (AltGr) when held, `kc` when tapped |
|
|
||||||
|`RCS_T(kc)` | |Right Control and Right Shift when held, `kc` when tapped |
|
|`RCS_T(kc)` | |Right Control and Right Shift when held, `kc` when tapped |
|
||||||
|`LCAG_T(kc)` | |Left Control, Alt and GUI when held, `kc` when tapped |
|
|`RCA_T(kc)` | |Right Control and Right Alt when held, `kc` when tapped |
|
||||||
|`RCAG_T(kc)` | |Right Control, Alt and GUI when held, `kc` when tapped |
|
|`RCG_T(kc)` | |Right Control and Right GUI when held, `kc` when tapped |
|
||||||
|`C_S_T(kc)` | |Left Control and Shift when held, `kc` when tapped |
|
|`RSA_T(kc)` |`SAGR_T(kc)` |Right Shift and Right Alt when held, `kc` when tapped |
|
||||||
|`MEH_T(kc)` | |Left Control, Shift and Alt when held, `kc` when tapped |
|
|`RSG_T(kc)` | |Right Shift and Right GUI when held, `kc` when tapped |
|
||||||
|`HYPR_T(kc)` |`ALL_T(kc)` |Left Control, Shift, Alt and GUI when held, `kc` when tapped - more info [here](https://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/)|
|
|`RAG_T(kc)` | |Right Alt and Right GUI when held, `kc` when tapped |
|
||||||
|
|`RCSG_T(kc)` | |Right Control, Right Shift and Right GUI when held, `kc` when tapped |
|
||||||
|
|`RCAG_T(kc)` | |Right Control, Right Alt and Right GUI when held, `kc` when tapped |
|
||||||
|
|`RSAG_T(kc)` | |Right Shift, Right Alt and Right GUI when held, `kc` when tapped |
|
||||||
|
|`MEH_T(kc)` | |Left Control, Left Shift and Left Alt when held, `kc` when tapped |
|
||||||
|
|`HYPR_T(kc)` |`ALL_T(kc)` |Left Control, Left Shift, Left Alt and Left GUI when held, `kc` when tapped|
|
||||||
|
|
||||||
## Tapping Term Keys {#tapping-term-keys}
|
## Tapping Term Keys {#tapping-term-keys}
|
||||||
|
|
||||||
|
|
|
@ -109,15 +109,15 @@ The basic set of keycodes are based on the [HID Keyboard/Keypad Usage Page (0x07
|
||||||
## Modifiers
|
## Modifiers
|
||||||
|
|
||||||
|Key |Aliases |Description |
|
|Key |Aliases |Description |
|
||||||
|----------------|-------------------------------|------------------------------------|
|
|----------------|-------------------------------|-------------------------------------|
|
||||||
|`KC_LEFT_CTRL` |`KC_LCTL` |Left Control |
|
|`KC_LEFT_CTRL` |`KC_LCTL` |Left Control |
|
||||||
|`KC_LEFT_SHIFT` |`KC_LSFT` |Left Shift |
|
|`KC_LEFT_SHIFT` |`KC_LSFT` |Left Shift |
|
||||||
|`KC_LEFT_ALT` |`KC_LALT`, `KC_LOPT` |Left Alt (Option) |
|
|`KC_LEFT_ALT` |`KC_LALT`, `KC_LOPT` |Left Alt (Option) |
|
||||||
|`KC_LEFT_GUI` |`KC_LGUI`, `KC_LCMD`, `KC_LWIN`|Left GUI (Windows/Command/Meta key) |
|
|`KC_LEFT_GUI` |`KC_LGUI`, `KC_LCMD`, `KC_LWIN`|Left GUI (Windows/Command/Super key) |
|
||||||
|`KC_RIGHT_CTRL` |`KC_RCTL` |Right Control |
|
|`KC_RIGHT_CTRL` |`KC_RCTL` |Right Control |
|
||||||
|`KC_RIGHT_SHIFT`|`KC_RSFT` |Right Shift |
|
|`KC_RIGHT_SHIFT`|`KC_RSFT` |Right Shift |
|
||||||
|`KC_RIGHT_ALT` |`KC_RALT`, `KC_ROPT`, `KC_ALGR`|Right Alt (Option/AltGr) |
|
|`KC_RIGHT_ALT` |`KC_RALT`, `KC_ROPT`, `KC_ALGR`|Right Alt (Option/AltGr) |
|
||||||
|`KC_RIGHT_GUI` |`KC_RGUI`, `KC_RCMD`, `KC_RWIN`|Right GUI (Windows/Command/Meta key)|
|
|`KC_RIGHT_GUI` |`KC_RGUI`, `KC_RCMD`, `KC_RWIN`|Right GUI (Windows/Command/Super key)|
|
||||||
|
|
||||||
## International
|
## International
|
||||||
|
|
||||||
|
|
|
@ -19,30 +19,39 @@ If you own a board from one of the following vendors already, consider asking th
|
||||||
|
|
||||||
| Vendor | Reason |
|
| Vendor | Reason |
|
||||||
|------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
|------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
|
| Ajazz | Selling tri-mode boards based on QMK without sources. |
|
||||||
|
| Alpaca / Apos | Selling wireless boards with "open" source code, but linking against closed-source wireless libraries. Crippled source code already unknowingly merged to QMK. |
|
||||||
|
| Attack Shark | Selling tri-mode boards based on QMK without sources. (Clones of Ajazz?) |
|
||||||
| BBB Keyboard | Selling tri-mode boards based on QMK without sources, attempted upstreaming crippled firmware without wireless. |
|
| BBB Keyboard | Selling tri-mode boards based on QMK without sources, attempted upstreaming crippled firmware without wireless. |
|
||||||
| Chillkey | |
|
| Chosfox | Selling L75 wired/wireless boards based on QMK without sources, just `via.json` provided. Raised on discord over multiple weeks without response. |
|
||||||
| CIDOO | Selling wired boards based on QMK without sources, just `via.json` provided. |
|
| CIDOO | Selling wired boards based on QMK without sources, just `via.json` provided. |
|
||||||
|
| ColorReco | Selling tri-mode boards based on QMK without sources. |
|
||||||
|
| CrossDIY | Selling wired boards based on QMK without sources. |
|
||||||
| Darmoshark | Selling wired boards based on QMK without sources, just `via.json` provided. |
|
| Darmoshark | Selling wired boards based on QMK without sources, just `via.json` provided. |
|
||||||
| Epomaker | Lots of historical keyboards with `via.json` but no corresponding sources. Wireless code for a small handful provided, pending core cleanup for QMK upstreaming. Most other boards have source nowhere to be seen. |
|
| Epomaker | Lots of historical keyboards with `via.json` but no corresponding sources. Wireless code for a small handful provided, pending core cleanup for QMK upstreaming. Most other boards have source nowhere to be seen. |
|
||||||
| Ergokbd (IFKB) | At least their crkbd clone ships with QMK+Vial, seemingly refuses to disclose sources despite multiple customers requesting them. |
|
| Ergokbd (IFKB) | At least their crkbd clone ships with QMK+Vial, seemingly refuses to disclose sources despite multiple customers requesting them. |
|
||||||
| iLovBee | Official 30-day copyright source code request issued Sep 11 2024 due to deception on PR, no response received. Ambiguity on PRs -- marketing says wireless, PR author said wired-only, then included wireless code anyway. Seemingly intentionally deceptive. |
|
| iLovBee | Official 30-day copyright source code request issued Sep 11 2024 due to deception on PR, no response received. Ambiguity on PRs -- marketing says wireless, PR author said wired-only, then included wireless code anyway. Seemingly intentionally deceptive. |
|
||||||
| KiiBOOM | Seems to use the same OEM as Epomaker, same problems. |
|
| KiiBOOM | Seems to use the same OEM as Epomaker, same problems. |
|
||||||
|
| kprepublic | Makes no attempt to release source code, all boards in QMK are reverse-engineered, created, and supported by the community. New board variants magically appear without telling customers they're incompatible with existing QMK versions, in some cases bricking boards or requiring ISP flashing. |
|
||||||
| Luminkey | Selling tri-mode boards based on QMK without sources, just `via.json` provided. |
|
| Luminkey | Selling tri-mode boards based on QMK without sources, just `via.json` provided. |
|
||||||
| Meletrix | Selling tri-mode boards based on QMK without sources, just `via.json` provided. |
|
| Meletrix | Selling tri-mode boards based on QMK without sources, just `via.json` provided. |
|
||||||
| mmd / Smartmmd / i-game.tech | Ambiguity on PRs -- marketing says wireless, PR author said wired-only, then included wireless code anyway. Seemingly intentionally deceptive. |
|
| mmd / Smartmmd / i-game.tech | Ambiguity on PRs -- marketing says wireless, PR author said wired-only, then included wireless code anyway. Seemingly intentionally deceptive. |
|
||||||
| MyKeyClub | Community-supported JRIS75, vendor was contacted by community members and refused to cooperate. |
|
| MyKeyClub | Community-supported JRIS75, vendor was contacted by community members and refused to cooperate. |
|
||||||
| owlab | Selling wired based on QMK without sources, just `via.json` provided. Ambiguous as to whether or not wireless firmware is based on QMK, given that their configuration tool looks very similar to VIA. |
|
| owlab | Selling wired based on QMK without sources, just `via.json` provided. Ambiguous as to whether or not wireless firmware is based on QMK, given that their configuration tool looks very similar to VIA. |
|
||||||
|
| pressplayid | Selling wired and tri-mode boards based on QMK without sources, just `via.json` provided |
|
||||||
| qwertykeys | Selling wired and tri-mode boards based on QMK without sources, just `via.json` provided. |
|
| qwertykeys | Selling wired and tri-mode boards based on QMK without sources, just `via.json` provided. |
|
||||||
| Redragon | Selling tri-mode boards based on QMK without sources, attempted upstreaming crippled firmware without wireless. |
|
| Redragon | Selling tri-mode boards based on QMK without sources, attempted upstreaming crippled firmware without wireless. |
|
||||||
|
| Riccks | Selling tri-mode boards based on QMK without sources. |
|
||||||
| Royal Kludge | PRs for fake boards in order to attain VIA compatibility identified. Lots of other keyboards with `via.json` but no corresponding sources, attempted upstreaming crippled firmware without wireless. Wireless code for some provided, pending core cleanup for QMK upstreaming. PRs including different manufacturer names as well. |
|
| Royal Kludge | PRs for fake boards in order to attain VIA compatibility identified. Lots of other keyboards with `via.json` but no corresponding sources, attempted upstreaming crippled firmware without wireless. Wireless code for some provided, pending core cleanup for QMK upstreaming. PRs including different manufacturer names as well. |
|
||||||
| Shenzhen Hangsheng | PR submissions with crippled firmware, debating with maintainers about wireless despite marketing material clearly stating tri-mode. |
|
| Shenzhen Hangsheng | PR submissions with crippled firmware, debating with maintainers about wireless despite marketing material clearly stating tri-mode. |
|
||||||
| Shortcut Studio | Selling tri-mode boards based on QMK without sources, just `via.json` provided. |
|
|
||||||
| Tacworks | Selling tri-mode boards based on QMK, crippled firmware already merged into QMK without wireless without QMK team realising. |
|
| Tacworks | Selling tri-mode boards based on QMK, crippled firmware already merged into QMK without wireless without QMK team realising. |
|
||||||
| TKD / Vertex | Selling tri-mode boards based on QMK without sources, attempted upstreaming crippled firmware without wireless. |
|
| TKD / Vertex | Selling tri-mode boards based on QMK without sources, attempted upstreaming crippled firmware without wireless. |
|
||||||
| WOBKEY | Selling tri-mode boards based on QMK without sources, attempted upstreaming crippled firmware without wireless. |
|
| WOBKEY | Selling tri-mode boards based on QMK without sources, attempted upstreaming crippled firmware without wireless. |
|
||||||
| Weikav | Selling tri-mode boards based on QMK without sources, just `via.json` provided. |
|
| Weikav | Selling tri-mode boards based on QMK without sources, just `via.json` provided. |
|
||||||
| Womier | Selling tri-mode boards based on QMK without sources, attempted upstreaming crippled firmware without wireless. |
|
| Womier | Selling tri-mode boards based on QMK without sources, attempted upstreaming crippled firmware without wireless. |
|
||||||
| Wuque Studio | Selling wired and tri-mode boards based on QMK without sources, just `via.json` provided. |
|
| Wuque Studio | Selling wired and tri-mode boards based on QMK without sources, just `via.json` provided. |
|
||||||
|
| XVX | Ambiguity on PRs -- marketing says wireless, PR author said wired-only. Seemingly intentionally deceptive. |
|
||||||
|
| Yunzii | Selling tri-mode boards based on QMK without sources, just `via.json` provided. Refuses to release sources due to proprietary wireless driver, in direct violation of the GPL. |
|
||||||
| Zuoya | Selling tri-mode boards based on QMK without sources, just `via.json` provided. |
|
| Zuoya | Selling tri-mode boards based on QMK without sources, just `via.json` provided. |
|
||||||
|
|
||||||
::: danger Violations
|
::: danger Violations
|
||||||
|
@ -77,7 +86,7 @@ Reusing the `VID` and `PID` for multiple boards (such as for two variants, wired
|
||||||
|
|
||||||
If there is sufficient ambiguity about a board, supporting evidence will need to be presented to the QMK team. This may include impartial third parties who can demonstrate a board's existence and can confirm its feature set, such as well-known content producers; popular review sites or notable video creators may be leveraged. If such evidence is unavailable, as a last resort the vendor may be required to ship a fully functional board in full retail packaging to QMK maintainers for verification. Engineering samples will not be accepted, as one-off boards have been deceptively used in the past.
|
If there is sufficient ambiguity about a board, supporting evidence will need to be presented to the QMK team. This may include impartial third parties who can demonstrate a board's existence and can confirm its feature set, such as well-known content producers; popular review sites or notable video creators may be leveraged. If such evidence is unavailable, as a last resort the vendor may be required to ship a fully functional board in full retail packaging to QMK maintainers for verification. Engineering samples will not be accepted, as one-off boards have been deceptively used in the past.
|
||||||
|
|
||||||
PRs submitted to upstream QMK should not expect an instant merge just because source code has been provided -- code from OEMs has historically been of a quality lower than QMK standards, so as per the [PR checklist](https://docs.qmk.fm/pr_checklist) submitters should make the changes as small as possible and be prepared to change their implementation.
|
PRs submitted to upstream QMK should not expect an instant merge just because source code has been provided -- code from OEMs has historically been of a quality lower than QMK standards, so as per the [PR checklist](pr_checklist) submitters should make the changes as small as possible and be prepared to change their implementation.
|
||||||
|
|
||||||
## Detection
|
## Detection
|
||||||
|
|
||||||
|
|
|
@ -9,11 +9,11 @@ The modifiers (`mod`) argument to the `MT()` macro are prefixed with `MOD_`, not
|
||||||
|`MOD_LCTL`|Left Control |
|
|`MOD_LCTL`|Left Control |
|
||||||
|`MOD_LSFT`|Left Shift |
|
|`MOD_LSFT`|Left Shift |
|
||||||
|`MOD_LALT`|Left Alt |
|
|`MOD_LALT`|Left Alt |
|
||||||
|`MOD_LGUI`|Left GUI (Windows/Command/Meta key) |
|
|`MOD_LGUI`|Left GUI (Windows/Command/Super key) |
|
||||||
|`MOD_RCTL`|Right Control |
|
|`MOD_RCTL`|Right Control |
|
||||||
|`MOD_RSFT`|Right Shift |
|
|`MOD_RSFT`|Right Shift |
|
||||||
|`MOD_RALT`|Right Alt (AltGr) |
|
|`MOD_RALT`|Right Alt (AltGr) |
|
||||||
|`MOD_RGUI`|Right GUI (Windows/Command/Meta key) |
|
|`MOD_RGUI`|Right GUI (Windows/Command/Super key) |
|
||||||
|`MOD_HYPR`|Hyper (Left Control, Shift, Alt and GUI)|
|
|`MOD_HYPR`|Hyper (Left Control, Shift, Alt and GUI)|
|
||||||
|`MOD_MEH` |Meh (Left Control, Shift, and Alt) |
|
|`MOD_MEH` |Meh (Left Control, Shift, and Alt) |
|
||||||
|
|
||||||
|
@ -28,28 +28,37 @@ This key would activate Left Control and Left Shift when held, and send Escape w
|
||||||
For convenience, QMK includes some Mod-Tap shortcuts to make common combinations more compact in your keymap:
|
For convenience, QMK includes some Mod-Tap shortcuts to make common combinations more compact in your keymap:
|
||||||
|
|
||||||
|Key |Aliases |Description |
|
|Key |Aliases |Description |
|
||||||
|------------|-----------------------------------------------------------------|--------------------------------------------------------------|
|
|------------|-----------------------------------------------------------------|---------------------------------------------------------------------------------------|
|
||||||
|`LCTL_T(kc)`|`CTL_T(kc)` |Left Control when held, `kc` when tapped |
|
|`LCTL_T(kc)`|`CTL_T(kc)` |Left Control when held, `kc` when tapped |
|
||||||
|`LSFT_T(kc)`|`SFT_T(kc)` |Left Shift when held, `kc` when tapped |
|
|`LSFT_T(kc)`|`SFT_T(kc)` |Left Shift when held, `kc` when tapped |
|
||||||
|`LALT_T(kc)`|`LOPT_T(kc)`, `ALT_T(kc)`, `OPT_T(kc)` |Left Alt when held, `kc` when tapped |
|
|`LALT_T(kc)`|`ALT_T(kc)`, `LOPT_T(kc)`, `OPT_T(kc)` |Left Alt when held, `kc` when tapped |
|
||||||
|`LGUI_T(kc)`|`LCMD_T(kc)`, `LWIN_T(kc)`, `GUI_T(kc)`, `CMD_T(kc)`, `WIN_T(kc)`|Left GUI when held, `kc` when tapped |
|
|`LGUI_T(kc)`|`GUI_T(kc)`, `LCMD_T(kc)`, `LWIN_T(kc)`, `CMD_T(kc)`, `WIN_T(kc)`|Left GUI when held, `kc` when tapped |
|
||||||
|
|`LCS_T(kc)` | |Left Control and Left Shift when held, `kc` when tapped |
|
||||||
|
|`LCA_T(kc)` | |Left Control and Left Alt when held, `kc` when tapped |
|
||||||
|
|`LCG_T(kc)` | |Left Control and Left GUI when held, `kc` when tapped |
|
||||||
|
|`LSA_T(kc)` | |Left Shift and Left Alt when held, `kc` when tapped |
|
||||||
|
|`LSG_T(kc)` |`SGUI_T(kc)`, `SCMD_T(kc)`, `SWIN_T(kc)` |Left Shift and Left GUI when held, `kc` when tapped |
|
||||||
|
|`LAG_T(kc)` | |Left Alt and Left GUI when held, `kc` when tapped |
|
||||||
|
|`LCSG_T(kc)`| |Left Control, Left Shift and Left GUI when held, `kc` when tapped |
|
||||||
|
|`LCAG_T(kc)`| |Left Control, Left Alt and Left GUI when held, `kc` when tapped |
|
||||||
|
|`LSAG_T(kc)`| |Left Shift, Left Alt and Left GUI when held, `kc` when tapped |
|
||||||
|`RCTL_T(kc)`| |Right Control when held, `kc` when tapped |
|
|`RCTL_T(kc)`| |Right Control when held, `kc` when tapped |
|
||||||
|`RSFT_T(kc)`| |Right Shift when held, `kc` when tapped |
|
|`RSFT_T(kc)`| |Right Shift when held, `kc` when tapped |
|
||||||
|`RALT_T(kc)`|`ROPT_T(kc)`, `ALGR_T(kc)` |Right Alt when held, `kc` when tapped |
|
|`RALT_T(kc)`|`ROPT_T(kc)`, `ALGR_T(kc)` |Right Alt when held, `kc` when tapped |
|
||||||
|`RGUI_T(kc)`|`RCMD_T(kc)`, `RWIN_T(kc)` |Right GUI when held, `kc` when tapped |
|
|`RGUI_T(kc)`|`RCMD_T(kc)`, `RWIN_T(kc)` |Right GUI when held, `kc` when tapped |
|
||||||
|`LSG_T(kc)` |`SGUI_T(kc)`, `SCMD_T(kc)`, `SWIN_T(kc)` |Left Shift and GUI when held, `kc` when tapped |
|
|
||||||
|`LAG_T(kc)` | |Left Alt and GUI when held, `kc` when tapped |
|
|
||||||
|`RSG_T(kc)` | |Right Shift and GUI when held, `kc` when tapped |
|
|
||||||
|`RAG_T(kc)` | |Right Alt and GUI when held, `kc` when tapped |
|
|
||||||
|`LCA_T(kc)` | |Left Control and Alt when held, `kc` when tapped |
|
|
||||||
|`LSA_T(kc)` | |Left Shift and Alt when held, `kc` when tapped |
|
|
||||||
|`RSA_T(kc)` |`SAGR_T(kc)` |Right Shift and Right Alt (AltGr) when held, `kc` when tapped |
|
|
||||||
|`RCS_T(kc)` | |Right Control and Right Shift when held, `kc` when tapped |
|
|`RCS_T(kc)` | |Right Control and Right Shift when held, `kc` when tapped |
|
||||||
|`LCAG_T(kc)`| |Left Control, Alt and GUI when held, `kc` when tapped |
|
|`RCA_T(kc)` | |Right Control and Right Alt when held, `kc` when tapped |
|
||||||
|`RCAG_T(kc)`| |Right Control, Alt and GUI when held, `kc` when tapped |
|
|`RCG_T(kc)` | |Right Control and Right GUI when held, `kc` when tapped |
|
||||||
|`C_S_T(kc)` | |Left Control and Shift when held, `kc` when tapped |
|
|`RSA_T(kc)` |`SAGR_T(kc)` |Right Shift and Right Alt when held, `kc` when tapped |
|
||||||
|`MEH_T(kc)` | |Left Control, Shift and Alt when held, `kc` when tapped |
|
|`RSG_T(kc)` | |Right Shift and Right GUI when held, `kc` when tapped |
|
||||||
|`HYPR_T(kc)`|`ALL_T(kc)` |Left Control, Shift, Alt and GUI when held, `kc` when tapped - more info [here](https://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/)|
|
|`RAG_T(kc)` | |Right Alt and Right GUI when held, `kc` when tapped |
|
||||||
|
|`RCSG_T(kc)`| |Right Control, Right Shift and Right GUI when held, `kc` when tapped |
|
||||||
|
|`RCAG_T(kc)`| |Right Control, Right Alt and Right GUI when held, `kc` when tapped |
|
||||||
|
|`RSAG_T(kc)`| |Right Shift, Right Alt and Right GUI when held, `kc` when tapped |
|
||||||
|
|`MEH_T(kc)` | |Left Control, Left Shift and Left Alt when held, `kc` when tapped |
|
||||||
|
|`HYPR_T(kc)`|`ALL_T(kc)` |Left Control, Left Shift, Left Alt and Left GUI when held, `kc` when tapped<sup>1</sup>|
|
||||||
|
|
||||||
|
<sup>1. More information on the Hyper key can be found on [this blog post by Brett Terpstra](https://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/).</sup>
|
||||||
|
|
||||||
## Caveats
|
## Caveats
|
||||||
|
|
||||||
|
|
|
@ -101,6 +101,12 @@ Install the QMK CLI by running:
|
||||||
python3 -m pip install --user qmk
|
python3 -m pip install --user qmk
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Alternatively, install the QMK CLI as a [uv](https://docs.astral.sh/uv/) managed tool, kept isolated in a virtual environment (requires uv to be installed):
|
||||||
|
|
||||||
|
```sh
|
||||||
|
uv tool install qmk
|
||||||
|
```
|
||||||
|
|
||||||
#### Community Packages
|
#### Community Packages
|
||||||
|
|
||||||
These packages are maintained by community members, so may not be up to date or completely functional. If you encounter problems, please report them to their respective maintainers.
|
These packages are maintained by community members, so may not be up to date or completely functional. If you encounter problems, please report them to their respective maintainers.
|
||||||
|
|
|
@ -112,7 +112,7 @@ Restart once you've installed any extensions.
|
||||||
|
|
||||||
Using the [standard `compile_commands.json` database](https://clang.llvm.org/docs/JSONCompilationDatabase.html), we can get the VS code _clangd_ extension to use the correct includes and defines used for your keyboard and keymap.
|
Using the [standard `compile_commands.json` database](https://clang.llvm.org/docs/JSONCompilationDatabase.html), we can get the VS code _clangd_ extension to use the correct includes and defines used for your keyboard and keymap.
|
||||||
|
|
||||||
1. Run `qmk generate-compilation-database -kb <keyboard> -km <keymap>` to generate the `compile_commands.json`.
|
1. Run `qmk compile -kb <keyboard> -km <keymap> --compiledb` to generate the `compile_commands.json`.
|
||||||
1. Inside VS code, press <kbd><kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd></kbd> (macOS: <kbd><kbd>Command</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd></kbd>) to open the command palette.
|
1. Inside VS code, press <kbd><kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd></kbd> (macOS: <kbd><kbd>Command</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd></kbd>) to open the command palette.
|
||||||
1. Start typing `clangd: Download Language Server` and select it when it appears. Note that this only needs to be done once on clangd extension installation, if it didn't already ask to do so.
|
1. Start typing `clangd: Download Language Server` and select it when it appears. Note that this only needs to be done once on clangd extension installation, if it didn't already ask to do so.
|
||||||
1. Inside VS code, press <kbd><kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd></kbd> (macOS: <kbd><kbd>Command</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd></kbd>) to open the command palette.
|
1. Inside VS code, press <kbd><kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd></kbd> (macOS: <kbd><kbd>Command</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd></kbd>) to open the command palette.
|
||||||
|
|
|
@ -127,7 +127,8 @@ https://github.com/qmk/qmk_firmware/pulls?q=is%3Apr+is%3Aclosed+label%3Akeyboard
|
||||||
- empty `xxxx_xxxx_kb()`, `xxxx_xxxx_user()`, or other weak-defined default implemented functions removed
|
- empty `xxxx_xxxx_kb()`, `xxxx_xxxx_user()`, or other weak-defined default implemented functions removed
|
||||||
- commented-out functions removed too
|
- commented-out functions removed too
|
||||||
- `matrix_init_board()` etc. migrated to `keyboard_pre_init_kb()`, see: [keyboard_pre_init*](custom_quantum_functions#keyboard_pre_init_-function-documentation)
|
- `matrix_init_board()` etc. migrated to `keyboard_pre_init_kb()`, see: [keyboard_pre_init*](custom_quantum_functions#keyboard_pre_init_-function-documentation)
|
||||||
- prefer `CUSTOM_MATRIX = lite` if custom matrix used, allows for standard debounce, see [custom matrix 'lite'](custom_matrix#lite)
|
- when configuring custom matrix, the 'lite' variant (`CUSTOM_MATRIX = lite`) must be used where possible, as this allows for standard debounce. See [custom matrix 'lite'](custom_matrix#lite)
|
||||||
|
- justification for full custom matrix (`CUSTOM_MATRIX = yes`) must be provided when used
|
||||||
- prefer LED indicator [Configuration Options](features/led_indicators#configuration-options) to custom `led_update_*()` implementations where possible
|
- prefer LED indicator [Configuration Options](features/led_indicators#configuration-options) to custom `led_update_*()` implementations where possible
|
||||||
- hardware that's enabled at the keyboard level and requires configuration such as OLED displays or encoders should have basic functionality implemented here
|
- hardware that's enabled at the keyboard level and requires configuration such as OLED displays or encoders should have basic functionality implemented here
|
||||||
- `<keyboard>.h`
|
- `<keyboard>.h`
|
||||||
|
|
|
@ -884,7 +884,7 @@ static painter_image_handle_t my_image;
|
||||||
void keyboard_post_init_kb(void) {
|
void keyboard_post_init_kb(void) {
|
||||||
my_image = qp_load_image_mem(gfx_my_image);
|
my_image = qp_load_image_mem(gfx_my_image);
|
||||||
if (my_image != NULL) {
|
if (my_image != NULL) {
|
||||||
qp_drawimage(display, (239 - my_image->width), (319 - my_image->height), my_image);
|
qp_drawimage(display, (240 - my_image->width), (320 - my_image->height), my_image);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
@ -909,7 +909,7 @@ static deferred_token my_anim;
|
||||||
void keyboard_post_init_kb(void) {
|
void keyboard_post_init_kb(void) {
|
||||||
my_image = qp_load_image_mem(gfx_my_image);
|
my_image = qp_load_image_mem(gfx_my_image);
|
||||||
if (my_image != NULL) {
|
if (my_image != NULL) {
|
||||||
my_anim = qp_animate(display, (239 - my_image->width), (319 - my_image->height), my_image);
|
my_anim = qp_animate(display, (240 - my_image->width), (320 - my_image->height), my_image);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
@ -1001,7 +1001,7 @@ void keyboard_post_init_kb(void) {
|
||||||
if (my_font != NULL) {
|
if (my_font != NULL) {
|
||||||
static const char *text = "Hello from QMK!";
|
static const char *text = "Hello from QMK!";
|
||||||
int16_t width = qp_textwidth(my_font, text);
|
int16_t width = qp_textwidth(my_font, text);
|
||||||
qp_drawtext(display, (239 - width), (319 - my_font->line_height), my_font, text);
|
qp_drawtext(display, (240 - width), (320 - my_font->line_height), my_font, text);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
|
@ -44,7 +44,7 @@ typedef struct __attribute__((packed)) qff_font_descriptor_v1_t {
|
||||||
uint8_t compression_scheme; // compression scheme, see below.
|
uint8_t compression_scheme; // compression scheme, see below.
|
||||||
uint8_t transparency_index; // palette index used for transparent pixels (not yet implemented)
|
uint8_t transparency_index; // palette index used for transparent pixels (not yet implemented)
|
||||||
} qff_font_descriptor_v1_t;
|
} qff_font_descriptor_v1_t;
|
||||||
// _Static_assert(sizeof(qff_font_descriptor_v1_t) == (sizeof(qgf_block_header_v1_t) + 20), "qff_font_descriptor_v1_t must be 25 bytes in v1 of QFF");
|
// STATIC_ASSERT(sizeof(qff_font_descriptor_v1_t) == (sizeof(qgf_block_header_v1_t) + 20), "qff_font_descriptor_v1_t must be 25 bytes in v1 of QFF");
|
||||||
```
|
```
|
||||||
|
|
||||||
The values for `format`, `flags`, `compression_scheme`, and `transparency_index` match [QGF's frame descriptor block](quantum_painter_qgf#qgf-frame-descriptor), with the exception that the `delta` flag is ignored by QFF.
|
The values for `format`, `flags`, `compression_scheme`, and `transparency_index` match [QGF's frame descriptor block](quantum_painter_qgf#qgf-frame-descriptor), with the exception that the `delta` flag is ignored by QFF.
|
||||||
|
@ -66,7 +66,7 @@ typedef struct __attribute__((packed)) qff_ascii_glyph_table_v1_t {
|
||||||
qgf_block_header_v1_t header; // = { .type_id = 0x01, .neg_type_id = (~0x01), .length = 285 }
|
qgf_block_header_v1_t header; // = { .type_id = 0x01, .neg_type_id = (~0x01), .length = 285 }
|
||||||
uint24_t glyph[95]; // 95 glyphs, 0x20..0x7E, see bits/masks above for values
|
uint24_t glyph[95]; // 95 glyphs, 0x20..0x7E, see bits/masks above for values
|
||||||
} qff_ascii_glyph_table_v1_t;
|
} qff_ascii_glyph_table_v1_t;
|
||||||
// _Static_assert(sizeof(qff_ascii_glyph_table_v1_t) == (sizeof(qgf_block_header_v1_t) + 285), "qff_ascii_glyph_table_v1_t must be 290 bytes in v1 of QFF");
|
// STATIC_ASSERT(sizeof(qff_ascii_glyph_table_v1_t) == (sizeof(qgf_block_header_v1_t) + 285), "qff_ascii_glyph_table_v1_t must be 290 bytes in v1 of QFF");
|
||||||
```
|
```
|
||||||
|
|
||||||
## Unicode glyph table {#qff-unicode-table}
|
## Unicode glyph table {#qff-unicode-table}
|
||||||
|
|
|
@ -32,7 +32,7 @@ typedef struct __attribute__((packed)) qgf_block_header_v1_t {
|
||||||
uint8_t neg_type_id; // Negated type ID, used for detecting parsing errors
|
uint8_t neg_type_id; // Negated type ID, used for detecting parsing errors
|
||||||
uint24_t length; // 24-bit blob length, allowing for block sizes of a maximum of 16MB
|
uint24_t length; // 24-bit blob length, allowing for block sizes of a maximum of 16MB
|
||||||
} qgf_block_header_v1_t;
|
} qgf_block_header_v1_t;
|
||||||
// _Static_assert(sizeof(qgf_block_header_v1_t) == 5, "qgf_block_header_v1_t must be 5 bytes in v1 of QGF");
|
// STATIC_ASSERT(sizeof(qgf_block_header_v1_t) == 5, "qgf_block_header_v1_t must be 5 bytes in v1 of QGF");
|
||||||
```
|
```
|
||||||
The _length_ describes the number of octets in the data following the block header -- a block header may specify a _length_ of `0` if no blob is specified.
|
The _length_ describes the number of octets in the data following the block header -- a block header may specify a _length_ of `0` if no blob is specified.
|
||||||
|
|
||||||
|
@ -56,7 +56,7 @@ typedef struct __attribute__((packed)) qgf_graphics_descriptor_v1_t {
|
||||||
uint16_t image_height; // in pixels
|
uint16_t image_height; // in pixels
|
||||||
uint16_t frame_count; // minimum of 1
|
uint16_t frame_count; // minimum of 1
|
||||||
} qgf_graphics_descriptor_v1_t;
|
} qgf_graphics_descriptor_v1_t;
|
||||||
// _Static_assert(sizeof(qgf_graphics_descriptor_v1_t) == (sizeof(qgf_block_header_v1_t) + 18), "qgf_graphics_descriptor_v1_t must be 23 bytes in v1 of QGF");
|
// STATIC_ASSERT(sizeof(qgf_graphics_descriptor_v1_t) == (sizeof(qgf_block_header_v1_t) + 18), "qgf_graphics_descriptor_v1_t must be 23 bytes in v1 of QGF");
|
||||||
```
|
```
|
||||||
|
|
||||||
## Frame offset block {#qgf-frame-offset-descriptor}
|
## Frame offset block {#qgf-frame-offset-descriptor}
|
||||||
|
@ -95,7 +95,7 @@ typedef struct __attribute__((packed)) qgf_frame_v1_t {
|
||||||
uint8_t transparency_index; // palette index used for transparent pixels (not yet implemented)
|
uint8_t transparency_index; // palette index used for transparent pixels (not yet implemented)
|
||||||
uint16_t delay; // frame delay time for animations (in units of milliseconds)
|
uint16_t delay; // frame delay time for animations (in units of milliseconds)
|
||||||
} qgf_frame_v1_t;
|
} qgf_frame_v1_t;
|
||||||
// _Static_assert(sizeof(qgf_frame_v1_t) == (sizeof(qgf_block_header_v1_t) + 6), "qgf_frame_v1_t must be 11 bytes in v1 of QGF");
|
// STATIC_ASSERT(sizeof(qgf_frame_v1_t) == (sizeof(qgf_block_header_v1_t) + 6), "qgf_frame_v1_t must be 11 bytes in v1 of QGF");
|
||||||
```
|
```
|
||||||
|
|
||||||
If this frame is grayscale, the _frame descriptor block_ (or _frame delta block_ if flags denote a delta frame) is immediately followed by this frame's corresponding _frame data block_.
|
If this frame is grayscale, the _frame descriptor block_ (or _frame delta block_ if flags denote a delta frame) is immediately followed by this frame's corresponding _frame data block_.
|
||||||
|
@ -160,7 +160,7 @@ typedef struct __attribute__((packed)) qgf_delta_v1_t {
|
||||||
uint16_t right; // The right pixel location to to draw the delta image
|
uint16_t right; // The right pixel location to to draw the delta image
|
||||||
uint16_t bottom; // The bottom pixel location to to draw the delta image
|
uint16_t bottom; // The bottom pixel location to to draw the delta image
|
||||||
} qgf_delta_v1_t;
|
} qgf_delta_v1_t;
|
||||||
// _Static_assert(sizeof(qgf_delta_v1_t) == 13, "qgf_delta_v1_t must be 13 bytes in v1 of QGF");
|
// STATIC_ASSERT(sizeof(qgf_delta_v1_t) == 13, "qgf_delta_v1_t must be 13 bytes in v1 of QGF");
|
||||||
```
|
```
|
||||||
|
|
||||||
## Frame data block {#qgf-frame-data-descriptor}
|
## Frame data block {#qgf-frame-data-descriptor}
|
||||||
|
|
|
@ -74,6 +74,8 @@ You can create `info.json` files at every level under `qmk_firmware/keyboards/<k
|
||||||
* The delay between keydown and keyup for tap events in milliseconds.
|
* The delay between keydown and keyup for tap events in milliseconds.
|
||||||
* Default: `0` (no delay)
|
* Default: `0` (no delay)
|
||||||
* `tapping`
|
* `tapping`
|
||||||
|
* `chordal_hold` <Badge type="info">Boolean</Badge>
|
||||||
|
* Default: `false`
|
||||||
* `hold_on_other_key_press` <Badge type="info">Boolean</Badge>
|
* `hold_on_other_key_press` <Badge type="info">Boolean</Badge>
|
||||||
* Default: `false`
|
* Default: `false`
|
||||||
* `hold_on_other_key_press_per_key` <Badge type="info">Boolean</Badge>
|
* `hold_on_other_key_press_per_key` <Badge type="info">Boolean</Badge>
|
||||||
|
@ -272,6 +274,14 @@ Configures the [Encoder](features/encoders) feature.
|
||||||
* The number of edge transitions on both pins required to register an input.
|
* The number of edge transitions on both pins required to register an input.
|
||||||
* Default: `4`
|
* Default: `4`
|
||||||
|
|
||||||
|
## Host {#host}
|
||||||
|
|
||||||
|
* `host`
|
||||||
|
* `default`
|
||||||
|
* `nkro` <Badge type="info">Boolean</Badge>
|
||||||
|
* The default nkro state.
|
||||||
|
* Default: `false`
|
||||||
|
|
||||||
## Indicators {#indicators}
|
## Indicators {#indicators}
|
||||||
|
|
||||||
Configures the [LED Indicators](features/led_indicators) feature.
|
Configures the [LED Indicators](features/led_indicators) feature.
|
||||||
|
@ -328,6 +338,8 @@ The ISO enter key is represented by a 1.25u×2uh key. Renderers which utilize in
|
||||||
* `h` <Badge type="info">KeyUnit</Badge>
|
* `h` <Badge type="info">KeyUnit</Badge>
|
||||||
* The height of the key, in key units.
|
* The height of the key, in key units.
|
||||||
* Default: `1` (1u)
|
* Default: `1` (1u)
|
||||||
|
* `hand` <Badge type="info">String</Badge>
|
||||||
|
* The handedness of the key for Chordal Hold, either `"L"` (left hand), `"R"` (right hand), or `"*"` (either or exempted handedness).
|
||||||
* `label` <Badge type="info">String</Badge>
|
* `label` <Badge type="info">String</Badge>
|
||||||
* What to name the key. This is *not* a key assignment as in the keymap, but should usually correspond to the keycode for the first layer of the default keymap.
|
* What to name the key. This is *not* a key assignment as in the keymap, but should usually correspond to the keycode for the first layer of the default keymap.
|
||||||
* Example: `"Escape"`
|
* Example: `"Escape"`
|
||||||
|
@ -409,7 +421,7 @@ Configures the [LED Matrix](features/led_matrix) feature.
|
||||||
* Default: `16`
|
* Default: `16`
|
||||||
* `led_process_limit` <Badge type="info">Number</Badge>
|
* `led_process_limit` <Badge type="info">Number</Badge>
|
||||||
* Limits the number of LEDs to process in an animation per task run (increases keyboard responsiveness).
|
* Limits the number of LEDs to process in an animation per task run (increases keyboard responsiveness).
|
||||||
* Default: `led_count / 5`
|
* Default: `(led_count + 4) / 5`
|
||||||
* `max_brightness` <Badge type="info">Number</Badge>
|
* `max_brightness` <Badge type="info">Number</Badge>
|
||||||
* The maximum value which brightness is scaled to, from 0 to 255.
|
* The maximum value which brightness is scaled to, from 0 to 255.
|
||||||
* Default: `255`
|
* Default: `255`
|
||||||
|
@ -420,7 +432,7 @@ Configures the [LED Matrix](features/led_matrix) feature.
|
||||||
* Turn off the LEDs when the host goes to sleep.
|
* Turn off the LEDs when the host goes to sleep.
|
||||||
* Default: `false`
|
* Default: `false`
|
||||||
* `speed_steps` <Badge type="info">Number</Badge>
|
* `speed_steps` <Badge type="info">Number</Badge>
|
||||||
* The number of speed adjustment steps.
|
* The value by which to increment the speed.
|
||||||
* Default: `16`
|
* Default: `16`
|
||||||
* `split_count` <Badge type="info">Array: Number</Badge>
|
* `split_count` <Badge type="info">Array: Number</Badge>
|
||||||
* For split keyboards, the number of LEDs on each half.
|
* For split keyboards, the number of LEDs on each half.
|
||||||
|
@ -429,7 +441,7 @@ Configures the [LED Matrix](features/led_matrix) feature.
|
||||||
* The LED activity timeout in milliseconds.
|
* The LED activity timeout in milliseconds.
|
||||||
* Default: `0` (no timeout)
|
* Default: `0` (no timeout)
|
||||||
* `val_steps` <Badge type="info">Number</Badge>
|
* `val_steps` <Badge type="info">Number</Badge>
|
||||||
* The number of brightness adjustment steps.
|
* The value by which to increment the brightness.
|
||||||
* Default: `8`
|
* Default: `8`
|
||||||
|
|
||||||
## Matrix {#matrix}
|
## Matrix {#matrix}
|
||||||
|
@ -545,7 +557,7 @@ Configures the [RGB Lighting](features/rgblight) feature.
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
* `brightness_steps` <Badge type="info">Number</Badge>
|
* `brightness_steps` <Badge type="info">Number</Badge>
|
||||||
* The number of brightness adjustment steps.
|
* The value by which to increment the brightness.
|
||||||
* Default: `17`
|
* Default: `17`
|
||||||
* `default`
|
* `default`
|
||||||
* `animation` <Badge type="info">String</Badge>
|
* `animation` <Badge type="info">String</Badge>
|
||||||
|
@ -570,7 +582,7 @@ Configures the [RGB Lighting](features/rgblight) feature.
|
||||||
* The driver to use. Must be one of `apa102`, `custom`, `ws2812`.
|
* The driver to use. Must be one of `apa102`, `custom`, `ws2812`.
|
||||||
* Default: `"ws2812"`
|
* Default: `"ws2812"`
|
||||||
* `hue_steps` <Badge type="info">Number</Badge>
|
* `hue_steps` <Badge type="info">Number</Badge>
|
||||||
* The number of hue adjustment steps.
|
* The value by which to increment the hue.
|
||||||
* Default: `8`
|
* Default: `8`
|
||||||
* `layers`
|
* `layers`
|
||||||
* `blink` <Badge type="info">Boolean</Badge>
|
* `blink` <Badge type="info">Boolean</Badge>
|
||||||
|
@ -589,7 +601,7 @@ Configures the [RGB Lighting](features/rgblight) feature.
|
||||||
* The maximum value which the HSV "V" component is scaled to, from 0 to 255.
|
* The maximum value which the HSV "V" component is scaled to, from 0 to 255.
|
||||||
* Default: `255`
|
* Default: `255`
|
||||||
* `saturation_steps` <Badge type="info">Number</Badge>
|
* `saturation_steps` <Badge type="info">Number</Badge>
|
||||||
* The number of saturation adjustment steps.
|
* The value by which to increment the suturation.
|
||||||
* Default: `17`
|
* Default: `17`
|
||||||
* `sleep` <Badge type="info">Boolean</Badge>
|
* `sleep` <Badge type="info">Boolean</Badge>
|
||||||
* Turn off the LEDs when the host goes to sleep.
|
* Turn off the LEDs when the host goes to sleep.
|
||||||
|
@ -641,7 +653,7 @@ Configures the [RGB Matrix](features/rgb_matrix) feature.
|
||||||
* `driver` <Badge type="info">String</Badge> <Badge>Required</Badge>
|
* `driver` <Badge type="info">String</Badge> <Badge>Required</Badge>
|
||||||
* The driver to use. Must be one of `aw20216s`, `custom`, `is31fl3218`, `is31fl3236`, `is31fl3729`, `is31fl3731`, `is31fl3733`, `is31fl3736`, `is31fl3737`, `is31fl3741`, `is31fl3742a`, `is31fl3743a`, `is31fl3745`, `is31fl3746a`, `snled27351`, `ws2812`.
|
* The driver to use. Must be one of `aw20216s`, `custom`, `is31fl3218`, `is31fl3236`, `is31fl3729`, `is31fl3731`, `is31fl3733`, `is31fl3736`, `is31fl3737`, `is31fl3741`, `is31fl3742a`, `is31fl3743a`, `is31fl3745`, `is31fl3746a`, `snled27351`, `ws2812`.
|
||||||
* `hue_steps` <Badge type="info">Number</Badge>
|
* `hue_steps` <Badge type="info">Number</Badge>
|
||||||
* The number of hue adjustment steps.
|
* The value by which to increment the hue.
|
||||||
* Default: `8`
|
* Default: `8`
|
||||||
* `layout` <Badge type="info">Array: Object</Badge> <Badge>Required</Badge>
|
* `layout` <Badge type="info">Array: Object</Badge> <Badge>Required</Badge>
|
||||||
* List of LED configuration dictionaries. Each dictionary contains:
|
* List of LED configuration dictionaries. Each dictionary contains:
|
||||||
|
@ -660,7 +672,7 @@ Configures the [RGB Matrix](features/rgb_matrix) feature.
|
||||||
* Default: `16`
|
* Default: `16`
|
||||||
* `led_process_limit` <Badge type="info">Number</Badge>
|
* `led_process_limit` <Badge type="info">Number</Badge>
|
||||||
* Limits the number of LEDs to process in an animation per task run (increases keyboard responsiveness).
|
* Limits the number of LEDs to process in an animation per task run (increases keyboard responsiveness).
|
||||||
* Default: `led_count / 5`
|
* Default: `(led_count + 4) / 5`
|
||||||
* `max_brightness` <Badge type="info">Number</Badge>
|
* `max_brightness` <Badge type="info">Number</Badge>
|
||||||
* The maximum value which the HSV "V" component is scaled to, from 0 to 255.
|
* The maximum value which the HSV "V" component is scaled to, from 0 to 255.
|
||||||
* Default: `255`
|
* Default: `255`
|
||||||
|
@ -668,13 +680,13 @@ Configures the [RGB Matrix](features/rgb_matrix) feature.
|
||||||
* Animations react to keyup instead of keydown.
|
* Animations react to keyup instead of keydown.
|
||||||
* Default: `false`
|
* Default: `false`
|
||||||
* `sat_steps` <Badge type="info">Number</Badge>
|
* `sat_steps` <Badge type="info">Number</Badge>
|
||||||
* The number of saturation adjustment steps.
|
* The value by which to increment the saturation.
|
||||||
* Default: `16`
|
* Default: `16`
|
||||||
* `sleep` <Badge type="info">Boolean</Badge>
|
* `sleep` <Badge type="info">Boolean</Badge>
|
||||||
* Turn off the LEDs when the host goes to sleep.
|
* Turn off the LEDs when the host goes to sleep.
|
||||||
* Default: `false`
|
* Default: `false`
|
||||||
* `speed_steps` <Badge type="info">Number</Badge>
|
* `speed_steps` <Badge type="info">Number</Badge>
|
||||||
* The number of speed adjustment steps.
|
* The value by which to increment the speed.
|
||||||
* Default: `16`
|
* Default: `16`
|
||||||
* `split_count` <Badge type="info">Array: Number</Badge>
|
* `split_count` <Badge type="info">Array: Number</Badge>
|
||||||
* For split keyboards, the number of LEDs on each half.
|
* For split keyboards, the number of LEDs on each half.
|
||||||
|
@ -683,7 +695,7 @@ Configures the [RGB Matrix](features/rgb_matrix) feature.
|
||||||
* The LED activity timeout in milliseconds.
|
* The LED activity timeout in milliseconds.
|
||||||
* Default: `0` (no timeout)
|
* Default: `0` (no timeout)
|
||||||
* `val_steps` <Badge type="info">Number</Badge>
|
* `val_steps` <Badge type="info">Number</Badge>
|
||||||
* The number of brightness adjustment steps.
|
* The value by which to increment the brightness.
|
||||||
* Default: `16`
|
* Default: `16`
|
||||||
|
|
||||||
## Secure {#secure}
|
## Secure {#secure}
|
||||||
|
@ -814,9 +826,6 @@ Configures the [Stenography](features/stenography) feature.
|
||||||
* `vid` <Badge type="info">String</Badge> <Badge>Required</Badge>
|
* `vid` <Badge type="info">String</Badge> <Badge>Required</Badge>
|
||||||
* The USB vendor ID as a four-digit hexadecimal number.
|
* The USB vendor ID as a four-digit hexadecimal number.
|
||||||
* Example: `"0xC1ED"`
|
* Example: `"0xC1ED"`
|
||||||
* `force_nkro` <Badge type="info">Boolean</Badge>
|
|
||||||
* Force NKRO to be active.
|
|
||||||
* Default: `false`
|
|
||||||
* `max_power` <Badge type="info">Number</Badge>
|
* `max_power` <Badge type="info">Number</Badge>
|
||||||
* The maximum current draw the host should expect from the device. This does not control the actual current usage.
|
* The maximum current draw the host should expect from the device. This does not control the actual current usage.
|
||||||
* Default: `500` (500 mA)
|
* Default: `500` (500 mA)
|
||||||
|
|
|
@ -55,6 +55,7 @@ These headers are located in [`quantum/keymap_extras/`](https://github.com/qmk/q
|
||||||
|English (US International) |`keymap_us_international.h` |`sendstring_us_international.h` |
|
|English (US International) |`keymap_us_international.h` |`sendstring_us_international.h` |
|
||||||
|English (US International, Linux)|`keymap_us_international_linux.h`| |
|
|English (US International, Linux)|`keymap_us_international_linux.h`| |
|
||||||
|Estonian |`keymap_estonian.h` |`sendstring_estonian.h` |
|
|Estonian |`keymap_estonian.h` |`sendstring_estonian.h` |
|
||||||
|
|EurKEY |`keymap_eurkey.h` | |
|
||||||
|Farsi |`keymap_farsi.h` | |
|
|Farsi |`keymap_farsi.h` | |
|
||||||
|Finnish |`keymap_finnish.h` |`sendstring_finnish.h` |
|
|Finnish |`keymap_finnish.h` |`sendstring_finnish.h` |
|
||||||
|French |`keymap_french.h` |`sendstring_french.h` |
|
|French |`keymap_french.h` |`sendstring_french.h` |
|
||||||
|
|
246
docs/tap_hold.md
246
docs/tap_hold.md
|
@ -425,6 +425,252 @@ uint16_t get_quick_tap_term(uint16_t keycode, keyrecord_t *record) {
|
||||||
If `QUICK_TAP_TERM` is set higher than `TAPPING_TERM`, it will default to `TAPPING_TERM`.
|
If `QUICK_TAP_TERM` is set higher than `TAPPING_TERM`, it will default to `TAPPING_TERM`.
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
## Flow Tap
|
||||||
|
|
||||||
|
Flow Tap modifies mod-tap `MT` and layer-tap `LT` keys such that when pressed within a short timeout of the preceding key, the tapping behavior is triggered. This is particularly useful for home row mods to avoid accidental mod triggers. It basically disables the hold behavior during fast typing, creating a "flow of taps." This also helps to reduce the input lag of tap-hold keys during fast typing, since the tapped behavior is sent immediately.
|
||||||
|
|
||||||
|
Flow Tap is enabled by defining `FLOW_TAP_TERM` in your `config.h` with the desired timeout in milliseconds. A timeout of 150 ms is recommended as a starting point:
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define FLOW_TAP_TERM 150
|
||||||
|
```
|
||||||
|
|
||||||
|
By default, Flow Tap is enabled when:
|
||||||
|
|
||||||
|
* The tap-hold key is pressed within `FLOW_TAP_TERM` milliseconds of the previous key press.
|
||||||
|
|
||||||
|
* The tapping keycodes of the previous key and tap-hold key are *both* among `KC_A`–`KC_Z`, `KC_COMM`, `KC_DOT`, `KC_SCLN`, `KC_SLSH` (the main alphas area of a conventional QWERTY layout) or `KC_SPC`.
|
||||||
|
|
||||||
|
As an exception to the above, Flow Tap is temporarily disabled while a tap-hold key is undecided. This is to allow chording multiple mod-tap keys without having to wait out the Flow Tap term.
|
||||||
|
|
||||||
|
|
||||||
|
### is_flow_tap_key()
|
||||||
|
|
||||||
|
Optionally, define the `is_flow_tap_key()` callback to specify where Flow Tap is enabled. The callback is called for both the tap-hold key *and* the key press immediately preceding it, and if the callback returns true for both keycodes, Flow Tap is enabled.
|
||||||
|
|
||||||
|
The default implementation of this callback is:
|
||||||
|
|
||||||
|
```c
|
||||||
|
bool is_flow_tap_key(uint16_t keycode) {
|
||||||
|
if ((get_mods() & (MOD_MASK_CG | MOD_BIT_LALT)) != 0) {
|
||||||
|
return false; // Disable Flow Tap on hotkeys.
|
||||||
|
}
|
||||||
|
switch (get_tap_keycode(keycode)) {
|
||||||
|
case KC_SPC:
|
||||||
|
case KC_A ... KC_Z:
|
||||||
|
case KC_DOT:
|
||||||
|
case KC_COMM:
|
||||||
|
case KC_SCLN:
|
||||||
|
case KC_SLSH:
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Copy the above to your `keymap.c` and edit to customize. For instance, remove the `case KC_SPC` line to disable Flow Tap for the Space key.
|
||||||
|
|
||||||
|
### get_flow_tap_term()
|
||||||
|
|
||||||
|
Optionally, for further flexibility, define the `get_flow_tap_term()` callback. Flow Tap acts only when key events are closer together than the time returned by the callback. Return a time of 0 to disable filtering. In this way, Flow Tap may be disabled for certain tap-hold keys, or when following certain previous keys.
|
||||||
|
|
||||||
|
The default implementation of this callback is
|
||||||
|
|
||||||
|
```c
|
||||||
|
uint16_t get_flow_tap_term(uint16_t keycode, keyrecord_t* record,
|
||||||
|
uint16_t prev_keycode) {
|
||||||
|
if (is_flow_tap_key(keycode) && is_flow_tap_key(prev_keycode)) {
|
||||||
|
return FLOW_TAP_TERM;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
In this callback, `keycode` and `record` correspond to the current tap-hold key, and `prev_keycode` is the keycode of the previous key. Return the timeout to use. Returning `0` disables Flow Tap. This callback enables setting per-key timeouts. It is also possible to enable or disable Flow Tap for certain tap-hold keys or when following certain previous keys. Example:
|
||||||
|
|
||||||
|
```c
|
||||||
|
uint16_t get_flow_tap_term(uint16_t keycode, keyrecord_t* record,
|
||||||
|
uint16_t prev_keycode) {
|
||||||
|
if (is_flow_tap_key(keycode) && is_flow_tap_key(prev_keycode)) {
|
||||||
|
switch (keycode) {
|
||||||
|
case LCTL_T(KC_F):
|
||||||
|
case RCTL_T(KC_H):
|
||||||
|
return FLOW_TAP_TERM - 25; // Short timeout on these keys.
|
||||||
|
|
||||||
|
default:
|
||||||
|
return FLOW_TAP_TERM; // Longer timeout otherwise.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0; // Disable Flow Tap.
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
::: tip If you define both `is_flow_tap_key()` and `get_flow_tap_term()`, then the latter takes precedence.
|
||||||
|
:::
|
||||||
|
|
||||||
|
## Chordal Hold
|
||||||
|
|
||||||
|
Chordal Hold is intended to be used together with either Permissive Hold or Hold
|
||||||
|
On Other Key Press. Chordal Hold is enabled by adding to your `config.h`:
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define CHORDAL_HOLD
|
||||||
|
```
|
||||||
|
|
||||||
|
Chordal Hold implements, by default, an "opposite hands" rule. Suppose a
|
||||||
|
tap-hold key is pressed and then, before the tapping term, another key is
|
||||||
|
pressed. With Chordal Hold, the tap-hold key is settled as tapped if the two
|
||||||
|
keys are on the same hand.
|
||||||
|
|
||||||
|
Otherwise, if the keys are on opposite hands, Chordal Hold introduces no new
|
||||||
|
behavior. Hold On Other Key Press or Permissive Hold may be used together with
|
||||||
|
Chordal Hold to configure the behavior in the opposite hands case. With Hold On
|
||||||
|
Other Key Press, an opposite hands chord is settled immediately as held. Or with
|
||||||
|
Permissive Hold, an opposite hands chord is settled as held provided the other
|
||||||
|
key is pressed and released (nested press) before releasing the tap-hold key.
|
||||||
|
|
||||||
|
Chordal Hold may be useful to avoid accidental modifier activation with
|
||||||
|
mod-taps, particularly in rolled keypresses when using home row mods.
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
|
||||||
|
* Chordal Hold has no effect after the tapping term.
|
||||||
|
|
||||||
|
* Combos are exempt from the opposite hands rule, since "handedness" is
|
||||||
|
ill-defined in this case. Even so, Chordal Hold's behavior involving combos
|
||||||
|
may be customized through the `get_chordal_hold()` callback.
|
||||||
|
|
||||||
|
An example of a sequence that is affected by “chordal hold”:
|
||||||
|
|
||||||
|
- `SFT_T(KC_A)` Down
|
||||||
|
- `KC_C` Down
|
||||||
|
- `KC_C` Up
|
||||||
|
- `SFT_T(KC_A)` Up
|
||||||
|
|
||||||
|
```
|
||||||
|
TAPPING_TERM
|
||||||
|
+---------------------------|--------+
|
||||||
|
| +----------------------+ | |
|
||||||
|
| | SFT_T(KC_A) | | |
|
||||||
|
| +----------------------+ | |
|
||||||
|
| +--------------+ | |
|
||||||
|
| | KC_C | | |
|
||||||
|
| +--------------+ | |
|
||||||
|
+---------------------------|--------+
|
||||||
|
```
|
||||||
|
|
||||||
|
If the two keys are on the same hand, then this will produce `ac` with
|
||||||
|
`SFT_T(KC_A)` settled as tapped the moment that `KC_C` is pressed.
|
||||||
|
|
||||||
|
If the two keys are on opposite hands and the `HOLD_ON_OTHER_KEY_PRESS` option
|
||||||
|
enabled, this will produce `C` with `SFT_T(KC_A)` settled as held when `KC_C` is
|
||||||
|
pressed.
|
||||||
|
|
||||||
|
Or if the two keys are on opposite hands and the `PERMISSIVE_HOLD` option is
|
||||||
|
enabled, this will produce `C` with `SFT_T(KC_A)` settled as held when that
|
||||||
|
`KC_C` is released.
|
||||||
|
|
||||||
|
### Chordal Hold Handedness
|
||||||
|
|
||||||
|
Determining whether keys are on the same or opposite hands involves defining the
|
||||||
|
"handedness" of each key position. By default, if nothing is specified,
|
||||||
|
handedness is guessed based on keyboard geometry.
|
||||||
|
|
||||||
|
Handedness may be specified with `chordal_hold_layout`. In keymap.c, define
|
||||||
|
`chordal_hold_layout` in the following form:
|
||||||
|
|
||||||
|
```c
|
||||||
|
const char chordal_hold_layout[MATRIX_ROWS][MATRIX_COLS] PROGMEM =
|
||||||
|
LAYOUT(
|
||||||
|
'L', 'L', 'L', 'L', 'L', 'L', 'R', 'R', 'R', 'R', 'R', 'R',
|
||||||
|
'L', 'L', 'L', 'L', 'L', 'L', 'R', 'R', 'R', 'R', 'R', 'R',
|
||||||
|
'L', 'L', 'L', 'L', 'L', 'L', 'R', 'R', 'R', 'R', 'R', 'R',
|
||||||
|
'L', 'L', 'L', 'R', 'R', 'R'
|
||||||
|
);
|
||||||
|
```
|
||||||
|
|
||||||
|
Use the same `LAYOUT` macro as used to define your keymap layers. Each entry is
|
||||||
|
a character indicating the handedness of one key, either `'L'` for left, `'R'`
|
||||||
|
for right, or `'*'` to exempt keys from the "opposite hands rule." A key with
|
||||||
|
`'*'` handedness may settle as held in chords with any other key. This could be
|
||||||
|
used perhaps on thumb keys or other places where you want to allow same-hand
|
||||||
|
chords.
|
||||||
|
|
||||||
|
Keyboard makers may specify handedness in keyboard.json. Under `"layouts"`,
|
||||||
|
specify the handedness of a key by adding a `"hand"` field with a value of
|
||||||
|
either `"L"`, `"R"`, or `"*"`. Note that if `"layouts"` contains multiple
|
||||||
|
layouts, only the first one is read. For example:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{"matrix": [5, 6], "x": 0, "y": 5.5, "w": 1.25, "hand": "*"},
|
||||||
|
```
|
||||||
|
|
||||||
|
Alternatively, handedness may be defined functionally with
|
||||||
|
`chordal_hold_handedness()`. For example, in keymap.c define:
|
||||||
|
|
||||||
|
```c
|
||||||
|
char chordal_hold_handedness(keypos_t key) {
|
||||||
|
if (key.col == 0 || key.col == MATRIX_COLS - 1) {
|
||||||
|
return '*'; // Exempt the outer columns.
|
||||||
|
}
|
||||||
|
// On split keyboards, typically, the first half of the rows are on the
|
||||||
|
// left, and the other half are on the right.
|
||||||
|
return key.row < MATRIX_ROWS / 2 ? 'L' : 'R';
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Given the matrix position of a key, the function should return `'L'`, `'R'`, or
|
||||||
|
`'*'`. Adapt the logic in this function according to the keyboard's matrix.
|
||||||
|
|
||||||
|
::: warning
|
||||||
|
Note the matrix may have irregularities around larger keys, around the edges of
|
||||||
|
the board, and around thumb clusters. You may find it helpful to use [this
|
||||||
|
debugging example](faq_debug#which-matrix-position-is-this-keypress) to
|
||||||
|
correspond physical keys to matrix positions.
|
||||||
|
:::
|
||||||
|
|
||||||
|
::: tip If you define both `chordal_hold_layout[MATRIX_ROWS][MATRIX_COLS]` and
|
||||||
|
`chordal_hold_handedness(keypos_t key)` for handedness, the latter takes
|
||||||
|
precedence.
|
||||||
|
:::
|
||||||
|
|
||||||
|
|
||||||
|
### Per-chord customization
|
||||||
|
|
||||||
|
Beyond the per-key configuration possible through handedness, Chordal Hold may
|
||||||
|
be configured at a *per-chord* granularity for detailed tuning. In keymap.c,
|
||||||
|
define `get_chordal_hold()`. Returning `true` allows the chord to be held, while
|
||||||
|
returning `false` settles as tapped.
|
||||||
|
|
||||||
|
For example:
|
||||||
|
|
||||||
|
```c
|
||||||
|
bool get_chordal_hold(uint16_t tap_hold_keycode, keyrecord_t* tap_hold_record,
|
||||||
|
uint16_t other_keycode, keyrecord_t* other_record) {
|
||||||
|
// Exceptionally allow some one-handed chords for hotkeys.
|
||||||
|
switch (tap_hold_keycode) {
|
||||||
|
case LCTL_T(KC_Z):
|
||||||
|
if (other_keycode == KC_C || other_keycode == KC_V) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RCTL_T(KC_SLSH):
|
||||||
|
if (other_keycode == KC_N) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// Otherwise defer to the opposite hands rule.
|
||||||
|
return get_chordal_hold_default(tap_hold_record, other_record);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
As shown in the last line above, you may use
|
||||||
|
`get_chordal_hold_default(tap_hold_record, other_record)` to get the default tap
|
||||||
|
vs. hold decision according to the opposite hands rule.
|
||||||
|
|
||||||
|
|
||||||
## Retro Tapping
|
## Retro Tapping
|
||||||
|
|
||||||
To enable `retro tapping`, add the following to your `config.h`:
|
To enable `retro tapping`, add the following to your `config.h`:
|
||||||
|
|
|
@ -58,6 +58,34 @@ It's not yet possible to do a full integration test, where you would compile the
|
||||||
|
|
||||||
In that model you would emulate the input, and expect a certain output from the emulated keyboard.
|
In that model you would emulate the input, and expect a certain output from the emulated keyboard.
|
||||||
|
|
||||||
|
# Keycode String {#keycode-string}
|
||||||
|
|
||||||
|
It's much nicer to read keycodes as names like "`LT(2,KC_D)`" than numerical codes like "`0x4207`." To convert keycodes to human-readable strings, add `KEYCODE_STRING_ENABLE = yes` to the `rules.mk` file, then use the `get_keycode_string(kc)` function to convert a given 16-bit keycode to a string.
|
||||||
|
|
||||||
|
```c
|
||||||
|
const char *key_name = get_keycode_string(keycode);
|
||||||
|
dprintf("kc: %s\n", key_name);
|
||||||
|
```
|
||||||
|
|
||||||
|
The stringified keycode may then be logged to console output with `dprintf()` or elsewhere.
|
||||||
|
|
||||||
|
::: warning
|
||||||
|
Use the result of `get_keycode_string()` immediately. Subsequent invocations reuse the same static buffer and overwrite the previous contents.
|
||||||
|
:::
|
||||||
|
|
||||||
|
Many common QMK keycodes are recognized by `get_keycode_string()`, but not all. These include some common basic keycodes, layer switch keycodes, mod-taps, one-shot keycodes, tap dance keycodes, and Unicode keycodes. As a fallback, an unrecognized keycode is written as a hex number.
|
||||||
|
|
||||||
|
Optionally, `KEYCODE_STRING_NAMES_USER` may be defined to add names for additional keycodes. For example, supposing keymap.c defines `MYMACRO1` and `MYMACRO2` as custom keycodes, the following adds their names:
|
||||||
|
|
||||||
|
```c
|
||||||
|
KEYCODE_STRING_NAMES_USER(
|
||||||
|
KEYCODE_STRING_NAME(MYMACRO1),
|
||||||
|
KEYCODE_STRING_NAME(MYMACRO2),
|
||||||
|
);
|
||||||
|
```
|
||||||
|
|
||||||
|
Similarly, `KEYCODE_STRING_NAMES_KB` may be defined to add names at the keyboard level.
|
||||||
|
|
||||||
# Tracing Variables {#tracing-variables}
|
# Tracing Variables {#tracing-variables}
|
||||||
|
|
||||||
Sometimes you might wonder why a variable gets changed and where, and this can be quite tricky to track down without having a debugger. It's of course possible to manually add print statements to track it, but you can also enable the variable trace feature. This works for both variables that are changed by the code, and when the variable is changed by some memory corruption.
|
Sometimes you might wonder why a variable gets changed and where, and this can be quite tricky to track down without having a debugger. It's of course possible to manually add print statements to track it, but you can also enable the variable trace feature. This works for both variables that are changed by the code, and when the variable is changed by some memory corruption.
|
||||||
|
|
41
drivers/battery/battery.c
Normal file
41
drivers/battery/battery.c
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
// Copyright 2025 QMK
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
#include "battery_driver.h"
|
||||||
|
#include "battery.h"
|
||||||
|
#include "timer.h"
|
||||||
|
|
||||||
|
#ifndef BATTERY_SAMPLE_INTERVAL
|
||||||
|
# define BATTERY_SAMPLE_INTERVAL 30000
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static uint8_t last_bat_level = 100;
|
||||||
|
|
||||||
|
void battery_init(void) {
|
||||||
|
battery_driver_init();
|
||||||
|
|
||||||
|
last_bat_level = battery_driver_sample_percent();
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__((weak)) void battery_percent_changed_user(uint8_t level) {}
|
||||||
|
__attribute__((weak)) void battery_percent_changed_kb(uint8_t level) {}
|
||||||
|
|
||||||
|
static void handle_percent_changed(void) {
|
||||||
|
battery_percent_changed_user(last_bat_level);
|
||||||
|
battery_percent_changed_kb(last_bat_level);
|
||||||
|
}
|
||||||
|
|
||||||
|
void battery_task(void) {
|
||||||
|
static uint32_t bat_timer = 0;
|
||||||
|
if (timer_elapsed32(bat_timer) > BATTERY_SAMPLE_INTERVAL) {
|
||||||
|
last_bat_level = battery_driver_sample_percent();
|
||||||
|
|
||||||
|
handle_percent_changed();
|
||||||
|
|
||||||
|
bat_timer = timer_read32();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t battery_get_percent(void) {
|
||||||
|
return last_bat_level;
|
||||||
|
}
|
46
drivers/battery/battery.h
Normal file
46
drivers/battery/battery.h
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
// Copyright 2025 QMK
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \defgroup battery Battery API
|
||||||
|
*
|
||||||
|
* \brief API to query battery status.
|
||||||
|
* \{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Initialize the battery driver.
|
||||||
|
*/
|
||||||
|
void battery_init(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Perform housekeeping tasks.
|
||||||
|
*/
|
||||||
|
void battery_task(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Sample battery level.
|
||||||
|
*
|
||||||
|
* \return The battery percentage, in the range 0-100.
|
||||||
|
*/
|
||||||
|
uint8_t battery_get_percent(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief user hook called when battery level changed.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void battery_percent_changed_user(uint8_t level);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief keyboard hook called when battery level changed.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void battery_percent_changed_kb(uint8_t level);
|
||||||
|
|
||||||
|
/** \} */
|
55
drivers/battery/battery_adc.c
Normal file
55
drivers/battery/battery_adc.c
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
// Copyright 2025 QMK
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
#include "analog.h"
|
||||||
|
#include "gpio.h"
|
||||||
|
|
||||||
|
#ifndef BATTERY_PIN
|
||||||
|
# error("BATTERY_PIN not configured!")
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef BATTERY_REF_VOLTAGE_MV
|
||||||
|
# define BATTERY_REF_VOLTAGE_MV 3300
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef BATTERY_VOLTAGE_DIVIDER_R1
|
||||||
|
# define BATTERY_VOLTAGE_DIVIDER_R1 100
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef BATTERY_VOLTAGE_DIVIDER_R2
|
||||||
|
# define BATTERY_VOLTAGE_DIVIDER_R2 100
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// TODO: infer from adc config?
|
||||||
|
#ifndef BATTERY_ADC_RESOLUTION
|
||||||
|
# define BATTERY_ADC_RESOLUTION 10
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void battery_driver_init(void) {
|
||||||
|
gpio_set_pin_input(BATTERY_PIN);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t battery_driver_get_mv(void) {
|
||||||
|
uint32_t raw = analogReadPin(BATTERY_PIN);
|
||||||
|
|
||||||
|
uint32_t bat_mv = raw * BATTERY_REF_VOLTAGE_MV / (1 << BATTERY_ADC_RESOLUTION);
|
||||||
|
|
||||||
|
#if BATTERY_VOLTAGE_DIVIDER_R1 > 0 && BATTERY_VOLTAGE_DIVIDER_R2 > 0
|
||||||
|
bat_mv = bat_mv * (BATTERY_VOLTAGE_DIVIDER_R1 + BATTERY_VOLTAGE_DIVIDER_R2) / BATTERY_VOLTAGE_DIVIDER_R2;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return bat_mv;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t battery_driver_sample_percent(void) {
|
||||||
|
uint16_t bat_mv = battery_driver_get_mv();
|
||||||
|
|
||||||
|
// https://github.com/zmkfirmware/zmk/blob/3f7c9d7cc4f46617faad288421025ea2a6b0bd28/app/module/drivers/sensor/battery/battery_common.c#L33
|
||||||
|
if (bat_mv >= 4200) {
|
||||||
|
return 100;
|
||||||
|
} else if (bat_mv <= 3450) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return bat_mv * 2 / 15 - 459;
|
||||||
|
}
|
29
drivers/battery/battery_driver.h
Normal file
29
drivers/battery/battery_driver.h
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
// Copyright 2025 QMK
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \defgroup battery Battery Driver API
|
||||||
|
*
|
||||||
|
* \brief API to query battery status.
|
||||||
|
* \{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Initialize the battery driver. This function must be called only once, before any of the below functions can be called.
|
||||||
|
*/
|
||||||
|
void battery_driver_init(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Sample battery level.
|
||||||
|
*
|
||||||
|
* \return The battery percentage, in the range 0-100.
|
||||||
|
*/
|
||||||
|
uint8_t battery_driver_sample_percent(void);
|
||||||
|
|
||||||
|
/** \} */
|
|
@ -32,13 +32,8 @@
|
||||||
# define BLUEFRUIT_LE_SCK_DIVISOR 2 // 4MHz SCK/8MHz CPU, calculated for Feather 32U4 BLE
|
# define BLUEFRUIT_LE_SCK_DIVISOR 2 // 4MHz SCK/8MHz CPU, calculated for Feather 32U4 BLE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define SAMPLE_BATTERY
|
|
||||||
#define ConnectionUpdateInterval 1000 /* milliseconds */
|
#define ConnectionUpdateInterval 1000 /* milliseconds */
|
||||||
|
|
||||||
#ifndef BATTERY_LEVEL_PIN
|
|
||||||
# define BATTERY_LEVEL_PIN B5
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static struct {
|
static struct {
|
||||||
bool is_connected;
|
bool is_connected;
|
||||||
bool initialized;
|
bool initialized;
|
||||||
|
@ -48,10 +43,6 @@ static struct {
|
||||||
#define UsingEvents 2
|
#define UsingEvents 2
|
||||||
bool event_flags;
|
bool event_flags;
|
||||||
|
|
||||||
#ifdef SAMPLE_BATTERY
|
|
||||||
uint16_t last_battery_update;
|
|
||||||
uint32_t vbat;
|
|
||||||
#endif
|
|
||||||
uint16_t last_connection_update;
|
uint16_t last_connection_update;
|
||||||
} state;
|
} state;
|
||||||
|
|
||||||
|
@ -549,14 +540,6 @@ void bluefruit_le_task(void) {
|
||||||
set_connected(atoi(resbuf));
|
set_connected(atoi(resbuf));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef SAMPLE_BATTERY
|
|
||||||
if (timer_elapsed(state.last_battery_update) > BatteryUpdateInterval && resp_buf.empty()) {
|
|
||||||
state.last_battery_update = timer_read();
|
|
||||||
|
|
||||||
state.vbat = analogReadPin(BATTERY_LEVEL_PIN);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool process_queue_item(struct queue_item *item, uint16_t timeout) {
|
static bool process_queue_item(struct queue_item *item, uint16_t timeout) {
|
||||||
|
@ -655,10 +638,6 @@ void bluefruit_le_send_mouse(report_mouse_t *report) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t bluefruit_le_read_battery_voltage(void) {
|
|
||||||
return state.vbat;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool bluefruit_le_set_mode_leds(bool on) {
|
bool bluefruit_le_set_mode_leds(bool on) {
|
||||||
if (!state.configured) {
|
if (!state.configured) {
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -45,10 +45,6 @@ extern void bluefruit_le_send_consumer(uint16_t usage);
|
||||||
* change. */
|
* change. */
|
||||||
extern void bluefruit_le_send_mouse(report_mouse_t *report);
|
extern void bluefruit_le_send_mouse(report_mouse_t *report);
|
||||||
|
|
||||||
/* Compute battery voltage by reading an analog pin.
|
|
||||||
* Returns the integer number of millivolts */
|
|
||||||
extern uint32_t bluefruit_le_read_battery_voltage(void);
|
|
||||||
|
|
||||||
extern bool bluefruit_le_set_mode_leds(bool on);
|
extern bool bluefruit_le_set_mode_leds(bool on);
|
||||||
extern bool bluefruit_le_set_power_level(int8_t level);
|
extern bool bluefruit_le_set_power_level(int8_t level);
|
||||||
|
|
||||||
|
|
|
@ -1,62 +1,32 @@
|
||||||
/*
|
// Copyright 2025 QMK
|
||||||
* Copyright 2022
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "bluetooth.h"
|
#include "bluetooth.h"
|
||||||
|
|
||||||
#if defined(BLUETOOTH_BLUEFRUIT_LE)
|
__attribute__((weak)) void bluetooth_init(void) {}
|
||||||
# include "bluefruit_le.h"
|
|
||||||
#elif defined(BLUETOOTH_RN42)
|
|
||||||
# include "rn42.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void bluetooth_init(void) {
|
__attribute__((weak)) void bluetooth_task(void) {}
|
||||||
#if defined(BLUETOOTH_BLUEFRUIT_LE)
|
|
||||||
bluefruit_le_init();
|
__attribute__((weak)) bool bluetooth_is_connected(void) {
|
||||||
#elif defined(BLUETOOTH_RN42)
|
return true;
|
||||||
rn42_init();
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void bluetooth_task(void) {
|
__attribute__((weak)) bool bluetooth_can_send_nkro(void) {
|
||||||
#if defined(BLUETOOTH_BLUEFRUIT_LE)
|
return false;
|
||||||
bluefruit_le_task();
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void bluetooth_send_keyboard(report_keyboard_t *report) {
|
__attribute__((weak)) uint8_t bluetooth_keyboard_leds(void) {
|
||||||
#if defined(BLUETOOTH_BLUEFRUIT_LE)
|
return 0;
|
||||||
bluefruit_le_send_keyboard(report);
|
|
||||||
#elif defined(BLUETOOTH_RN42)
|
|
||||||
rn42_send_keyboard(report);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void bluetooth_send_mouse(report_mouse_t *report) {
|
__attribute__((weak)) void bluetooth_send_keyboard(report_keyboard_t *report) {}
|
||||||
#if defined(BLUETOOTH_BLUEFRUIT_LE)
|
|
||||||
bluefruit_le_send_mouse(report);
|
|
||||||
#elif defined(BLUETOOTH_RN42)
|
|
||||||
rn42_send_mouse(report);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void bluetooth_send_consumer(uint16_t usage) {
|
__attribute__((weak)) void bluetooth_send_nkro(report_nkro_t *report) {}
|
||||||
#if defined(BLUETOOTH_BLUEFRUIT_LE)
|
|
||||||
bluefruit_le_send_consumer(usage);
|
__attribute__((weak)) void bluetooth_send_mouse(report_mouse_t *report) {}
|
||||||
#elif defined(BLUETOOTH_RN42)
|
|
||||||
rn42_send_consumer(usage);
|
__attribute__((weak)) void bluetooth_send_consumer(uint16_t usage) {}
|
||||||
#endif
|
|
||||||
}
|
__attribute__((weak)) void bluetooth_send_system(uint16_t usage) {}
|
||||||
|
|
||||||
|
__attribute__((weak)) void bluetooth_send_raw_hid(uint8_t *data, uint8_t length) {}
|
||||||
|
|
|
@ -30,6 +30,23 @@ void bluetooth_init(void);
|
||||||
*/
|
*/
|
||||||
void bluetooth_task(void);
|
void bluetooth_task(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Detects if Bluetooth is connected.
|
||||||
|
*
|
||||||
|
* \return `true` if connected, `false` otherwise.
|
||||||
|
*/
|
||||||
|
bool bluetooth_is_connected(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Detects if `bluetooth_send_nkro` should be used over `bluetooth_send_keyboard`.
|
||||||
|
*/
|
||||||
|
bool bluetooth_can_send_nkro(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Get current LED state.
|
||||||
|
*/
|
||||||
|
uint8_t bluetooth_keyboard_leds(void);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Send a keyboard report.
|
* \brief Send a keyboard report.
|
||||||
*
|
*
|
||||||
|
@ -37,6 +54,13 @@ void bluetooth_task(void);
|
||||||
*/
|
*/
|
||||||
void bluetooth_send_keyboard(report_keyboard_t *report);
|
void bluetooth_send_keyboard(report_keyboard_t *report);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Send a nkro report.
|
||||||
|
*
|
||||||
|
* \param report The nkro report to send.
|
||||||
|
*/
|
||||||
|
void bluetooth_send_nkro(report_nkro_t *report);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Send a mouse report.
|
* \brief Send a mouse report.
|
||||||
*
|
*
|
||||||
|
@ -50,3 +74,18 @@ void bluetooth_send_mouse(report_mouse_t *report);
|
||||||
* \param usage The consumer usage to send.
|
* \param usage The consumer usage to send.
|
||||||
*/
|
*/
|
||||||
void bluetooth_send_consumer(uint16_t usage);
|
void bluetooth_send_consumer(uint16_t usage);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Send a system usage.
|
||||||
|
*
|
||||||
|
* \param usage The system usage to send.
|
||||||
|
*/
|
||||||
|
void bluetooth_send_system(uint16_t usage);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Send a raw_hid packet.
|
||||||
|
*
|
||||||
|
* \param data A pointer to the buffer to be sent. Always 32 bytes in length.
|
||||||
|
* \param length The length of the buffer. Always 32.
|
||||||
|
*/
|
||||||
|
void bluetooth_send_raw_hid(uint8_t *data, uint8_t length);
|
||||||
|
|
71
drivers/bluetooth/bluetooth_drivers.c
Normal file
71
drivers/bluetooth/bluetooth_drivers.c
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2022
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "bluetooth.h"
|
||||||
|
|
||||||
|
#if defined(BLUETOOTH_BLUEFRUIT_LE)
|
||||||
|
# include "bluefruit_le.h"
|
||||||
|
#elif defined(BLUETOOTH_RN42)
|
||||||
|
# include "rn42.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void bluetooth_init(void) {
|
||||||
|
#if defined(BLUETOOTH_BLUEFRUIT_LE)
|
||||||
|
bluefruit_le_init();
|
||||||
|
#elif defined(BLUETOOTH_RN42)
|
||||||
|
rn42_init();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void bluetooth_task(void) {
|
||||||
|
#if defined(BLUETOOTH_BLUEFRUIT_LE)
|
||||||
|
bluefruit_le_task();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
bool bluetooth_is_connected(void) {
|
||||||
|
#if defined(BLUETOOTH_BLUEFRUIT_LE)
|
||||||
|
return bluefruit_le_is_connected();
|
||||||
|
#else
|
||||||
|
// TODO: drivers should check if BT is connected here
|
||||||
|
return true;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void bluetooth_send_keyboard(report_keyboard_t *report) {
|
||||||
|
#if defined(BLUETOOTH_BLUEFRUIT_LE)
|
||||||
|
bluefruit_le_send_keyboard(report);
|
||||||
|
#elif defined(BLUETOOTH_RN42)
|
||||||
|
rn42_send_keyboard(report);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void bluetooth_send_mouse(report_mouse_t *report) {
|
||||||
|
#if defined(BLUETOOTH_BLUEFRUIT_LE)
|
||||||
|
bluefruit_le_send_mouse(report);
|
||||||
|
#elif defined(BLUETOOTH_RN42)
|
||||||
|
rn42_send_mouse(report);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void bluetooth_send_consumer(uint16_t usage) {
|
||||||
|
#if defined(BLUETOOTH_BLUEFRUIT_LE)
|
||||||
|
bluefruit_le_send_consumer(usage);
|
||||||
|
#elif defined(BLUETOOTH_RN42)
|
||||||
|
rn42_send_consumer(usage);
|
||||||
|
#endif
|
||||||
|
}
|
|
@ -1,70 +0,0 @@
|
||||||
/*
|
|
||||||
Copyright 2017 Priyadi Iman Nurcahyo
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 2 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "outputselect.h"
|
|
||||||
#include "usb_util.h"
|
|
||||||
|
|
||||||
#ifdef BLUETOOTH_BLUEFRUIT_LE
|
|
||||||
# include "bluefruit_le.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
uint8_t desired_output = OUTPUT_DEFAULT;
|
|
||||||
|
|
||||||
/** \brief Set Output
|
|
||||||
*
|
|
||||||
* FIXME: Needs doc
|
|
||||||
*/
|
|
||||||
void set_output(uint8_t output) {
|
|
||||||
set_output_user(output);
|
|
||||||
desired_output = output;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** \brief Set Output User
|
|
||||||
*
|
|
||||||
* FIXME: Needs doc
|
|
||||||
*/
|
|
||||||
__attribute__((weak)) void set_output_user(uint8_t output) {}
|
|
||||||
|
|
||||||
/** \brief Auto Detect Output
|
|
||||||
*
|
|
||||||
* FIXME: Needs doc
|
|
||||||
*/
|
|
||||||
uint8_t auto_detect_output(void) {
|
|
||||||
if (usb_connected_state()) {
|
|
||||||
return OUTPUT_USB;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef BLUETOOTH_BLUEFRUIT_LE
|
|
||||||
if (bluefruit_le_is_connected()) {
|
|
||||||
return OUTPUT_BLUETOOTH;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef BLUETOOTH_ENABLE
|
|
||||||
return OUTPUT_BLUETOOTH; // should check if BT is connected here
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return OUTPUT_NONE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** \brief Where To Send
|
|
||||||
*
|
|
||||||
* FIXME: Needs doc
|
|
||||||
*/
|
|
||||||
uint8_t where_to_send(void) {
|
|
||||||
if (desired_output == OUTPUT_AUTO) {
|
|
||||||
return auto_detect_output();
|
|
||||||
}
|
|
||||||
return desired_output;
|
|
||||||
}
|
|
|
@ -14,21 +14,17 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <stdint.h>
|
#include "connection.h"
|
||||||
|
|
||||||
enum outputs {
|
// DEPRECATED - DO NOT USE
|
||||||
OUTPUT_AUTO,
|
|
||||||
|
|
||||||
OUTPUT_NONE,
|
#define OUTPUT_AUTO CONNECTION_HOST_AUTO
|
||||||
OUTPUT_USB,
|
#define OUTPUT_NONE CONNECTION_HOST_NONE
|
||||||
OUTPUT_BLUETOOTH
|
#define OUTPUT_USB CONNECTION_HOST_USB
|
||||||
};
|
#define OUTPUT_BLUETOOTH CONNECTION_HOST_BLUETOOTH
|
||||||
|
|
||||||
#ifndef OUTPUT_DEFAULT
|
#define set_output connection_set_host_noeeprom
|
||||||
# define OUTPUT_DEFAULT OUTPUT_AUTO
|
#define where_to_send connection_get_host
|
||||||
#endif
|
#define auto_detect_output connection_auto_detect_host
|
||||||
|
|
||||||
void set_output(uint8_t output);
|
|
||||||
void set_output_user(uint8_t output);
|
void set_output_user(uint8_t output);
|
||||||
uint8_t auto_detect_output(void);
|
|
||||||
uint8_t where_to_send(void);
|
|
||||||
|
|
|
@ -20,6 +20,6 @@
|
||||||
The size of the transient EEPROM buffer size.
|
The size of the transient EEPROM buffer size.
|
||||||
*/
|
*/
|
||||||
#ifndef TRANSIENT_EEPROM_SIZE
|
#ifndef TRANSIENT_EEPROM_SIZE
|
||||||
# include "eeconfig.h"
|
# include "nvm_eeprom_eeconfig_internal.h"
|
||||||
# define TRANSIENT_EEPROM_SIZE (((EECONFIG_SIZE + 3) / 4) * 4) // based off eeconfig's current usage, aligned to 4-byte sizes, to deal with LTO
|
# define TRANSIENT_EEPROM_SIZE (((EECONFIG_SIZE + 3) / 4) * 4) // based off eeconfig's current usage, aligned to 4-byte sizes, to deal with LTO
|
||||||
#endif
|
#endif
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue