summaryrefslogtreecommitdiff
path: root/docs
diff options
context:
space:
mode:
authorNick Brassel <nick@tzarc.org>2023-05-29 06:17:24 +1000
committerNick Brassel <nick@tzarc.org>2023-05-29 06:17:24 +1000
commit5024370dd0b441e86ace3089193e84c5b050d892 (patch)
treeb661d5b154be987f9c3dba3a526b70e0b63f9fef /docs
parent16767e4d59c2334fcd2d5e6556a68d5ff60ffd7b (diff)
parent8b1d86eabf399e82af7738fb675b9c74195d0f98 (diff)
Merge branch 'develop'
Diffstat (limited to 'docs')
-rw-r--r--docs/ChangeLog/20230528.md551
-rw-r--r--docs/_summary.md2
-rw-r--r--docs/breaking_changes.md24
-rw-r--r--docs/breaking_changes_history.md1
-rw-r--r--docs/breaking_changes_instructions.md8
-rw-r--r--docs/cli_commands.md19
-rw-r--r--docs/config_options.md11
-rw-r--r--docs/feature_caps_word.md20
-rw-r--r--docs/feature_combo.md33
-rw-r--r--docs/feature_converters.md8
-rw-r--r--docs/feature_dynamic_macros.md2
-rw-r--r--docs/feature_encoders.md16
-rw-r--r--docs/feature_layers.md48
-rw-r--r--docs/feature_led_matrix.md8
-rw-r--r--docs/feature_oled_driver.md119
-rw-r--r--docs/feature_pointing_device.md26
-rw-r--r--docs/feature_repeat_key.md457
-rw-r--r--docs/feature_rgb_matrix.md100
-rw-r--r--docs/feature_rgblight.md13
-rw-r--r--docs/feature_split_keyboard.md6
-rw-r--r--docs/feature_stenography.md2
-rw-r--r--docs/feature_swap_hands.md11
-rw-r--r--docs/getting_started_vagrant.md56
-rw-r--r--docs/ja/_summary.md2
-rw-r--r--docs/ja/config_options.md5
-rw-r--r--docs/ja/feature_combo.md6
-rw-r--r--docs/ja/feature_dynamic_macros.md2
-rw-r--r--docs/ja/feature_stenography.md2
-rw-r--r--docs/ja/getting_started_vagrant.md61
-rw-r--r--docs/ja/tap_hold.md28
-rw-r--r--docs/keycodes.md9
-rw-r--r--docs/mod_tap.md2
-rw-r--r--docs/newbs_building_firmware_workflow.md2
-rw-r--r--docs/pr_checklist.md4
-rw-r--r--docs/quantum_painter.md24
-rw-r--r--docs/squeezing_avr.md1
-rw-r--r--docs/tap_hold.md89
-rw-r--r--docs/understanding_qmk.md2
-rw-r--r--docs/ws2812_driver.md8
-rw-r--r--docs/zh-cn/_summary.md4
-rw-r--r--docs/zh-cn/getting_started_vagrant.md61
-rw-r--r--docs/zh-cn/mod_tap.md2
42 files changed, 1398 insertions, 457 deletions
diff --git a/docs/ChangeLog/20230528.md b/docs/ChangeLog/20230528.md
new file mode 100644
index 0000000000..b4044d3109
--- /dev/null
+++ b/docs/ChangeLog/20230528.md
@@ -0,0 +1,551 @@
1# QMK Breaking Changes - 2023 May 28 Changelog
2
3## Notable Changes :id=notable-changes
4
5As per last breaking changes cycle, there has been _a lot_ of emphasis on behind-the-scenes changes, mainly around migration of configurables into `info.json` files, cleanup of `info.json` files, additional layout definitions for keyboards, adding support for general community layouts to keyboards, as well as addressing technical debt.
6
7Of note for keyboard designers:
8
9* Layout and matrix definitions in `info.json` are now _mandatory_ for merge into QMK.
10 * Layout macros in `<yourkeyboard>.h` are no longer accepted into QMK Firmware.
11 * Existing keyboards have been meticulously converted by the QMK collaborators
12 * Layouts missing from keyboard definitions have been added in the process
13 * Keys within layouts should not specify `"w":1` or `"h":1` if the key size is 1 -- `w`/`h` should only be present for sizes other than 1
14* `config_common.h` has been removed and should not be present anywhere in your keyboard code.
15* `RGB_DI_PIN` will now cause an error during build:
16 * For WS2812-like LEDs, this should be moved to `info.json`: `"ws2812": { "pin": "xxx" }`
17 * For APA102 LEDs, this should be moved to `info.json`: `"apa102": { "data_pin": "xxx" }`
18* Other mandatory data-driven changes should be automatically flagged during build
19* Keymaps with `encoder_map` should now have the following change made:
20 * `encoder_map[][NUM_ENCODERS][2]` => `encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS]`
21 * Users assumed the `2` referred to the number of encoders, rather than the number of directions (which is always 2)
22
23### Repeat last key ([#19700](https://github.com/qmk/qmk_firmware/pull/19700)) :id=repeat-last-key
24
25A new pair of keys has been added to QMK -- namely `QK_REPEAT_KEY` and `QK_ALT_REPEAT_KEY` (shortened: `QK_REP`/`QK_AREP`). These allow you to repeat the last key pressed, or in the case of the alternate key, press the "opposite" of the last key. For example, if you press `KC_LEFT`, pressing `QK_REPEAT_KEY` afterwards repeats `KC_LEFT`, but pressing `QK_ALT_REPEAT_KEY` instead sends `KC_RIGHT`.
26
27The full list of default alternate keys is available on the [Repeat Key](feature_repeat_key.md) documentation.
28
29To enable these keys, in your keymap's `rules.mk`, add:
30
31```make
32REPEAT_KEY_ENABLE = yes
33```
34
35...and add them to your keymap.
36
37### User callback for pre process record ([#20584](https://github.com/qmk/qmk_firmware/pull/20584)) :id=user-callback-for-pre-process-record
38
39Two new boolean callback functions, `pre_process_record_kb` and `pre_process_record_user`, have been added. They are called at the beginning of `process_record`, right before `process_combo`.
40
41Similar to existing `*_kb` and `*_user` callback functions, returning `false` will halt further processing of key events. The `pre_process_record_user` function will allow user space opportunity to handle or capture an input before it undergoes quantum processing. For example, while action tapping is still resolving the tap or hold output of a mod-tap key, `pre_process_record_user` can capture the next key record of an input event that follows. That key record can be used to influence the [decision of the mod-tap](https://docs.qmk.fm/#/tap_hold) key that is currently undergoing quantum processing.
42
43### Consolidate modelm ([#14996](https://github.com/qmk/qmk_firmware/pull/14996) :id=consolidate-modelm
44
45Several build targets for the IBM Model M were cluttered in different folders. The maintainers of several Model M replacement controller projects agreed to consolidate them under one common folder.
46
47The list of all moved keyboard locations is listed [below](20230528.md#updated-keyboard-codebases).
48
49## Changes Requiring User Action :id=changes-requiring-user-action
50
51### `IGNORE_MOD_TAP_INTERRUPT` behaviour changes ([#20211](https://github.com/qmk/qmk_firmware/pull/20211)) :id=i-m-t-i
52
53Following up from the last breaking changes cycle, `IGNORE_MOD_TAP_INTERRUPT` has been removed and if present in keymap code, will now fail to build. The previous functionality for `IGNORE_MOD_TAP_INTERRUPT` is now default, and should you wish to revert to the old behaviour, you can use `HOLD_ON_OTHER_KEY_PRESS` instead.
54
55For more information, you are invited to read the section on [HOLD_ON_OTHER_KEY_PRESS](tap_hold.md#hold-on-other-key-press) in the page on [Tap-Hold configuration options](tap_hold.md).
56
57### Updated Keyboard Codebases :id=updated-keyboard-codebases
58
59| Old Keyboard Name | New Keyboard Name |
60|---------------------------------|-------------------------------------|
61| ashpil/modelm_usbc | ibm/model_m/ashpil_usbc |
62| binepad/bn009r2 | binepad/bn009/r2 |
63| converter/modelm101 | ibm/model_m/teensypp |
64| converter/modelm101_teensy2 | ibm/model_m/teensy2 |
65| converter/modelm_ssk | ibm/model_m_ssk/teensypp_ssk |
66| durgod/dgk6x/hades | durgod/dgk6x/hades_ansi |
67| handwired/ibm122m | ibm/model_m_122/ibm122m |
68| jacky_studio/piggy60/hotswap | jacky_studio/piggy60/rev1/hotswap |
69| jacky_studio/piggy60/solder | jacky_studio/piggy60/rev1/solder |
70| kamigakushi | jaykeeb/kamigakushi |
71| massdrop/thekey | drop/thekey/v1 |
72| massdrop/thekey_v2 | drop/thekey/v2 |
73| mschwingen/modelm | ibm/model_m/mschwingen |
74| tronguylabs/m122_3270 | ibm/model_m_122/m122_3270 |
75| tronguylabs/m122_3270/blackpill | ibm/model_m_122/m122_3270/blackpill |
76| tronguylabs/m122_3270/bluepill | ibm/model_m_122/m122_3270/bluepill |
77| tronguylabs/m122_3270/teensy | ibm/model_m_122/m122_3270/teensy |
78| yugo_m/model_m_101 | ibm/model_m/yugo_m |
79
80## Notable core changes :id=notable-core
81
82### Encoder functionality fallback ([#20320](https://github.com/qmk/qmk_firmware/pull/20320)) :id=encoder-functionality-fallback
83
84For keyboards who have not yet been migrated to encoder map, a default set of encoder functionality is now enabled, gracefully degrading functionality depending on which flags are enabled by the keyboard:
85
86* If `EXTRAKEY_ENABLE` is enabled by the keyboard, the encoder will be mapped to `KC_VOLU`/`KC_VOLD`
87* If `MOUSEKEY_ENABLE` is enabled by the keyboard, the encoder will be mapped to `KC_MS_WH_UP`/`KC_MS_WH_DOWN`
88* Otherwise, `KC_PGDN`/`KC_PGUP` will be used
89
90Additionally, this ensures that builds on QMK Configurator produce some sort of usable encoder mapping.
91
92### OLED Driver Improvements ([#20331](https://github.com/qmk/qmk_firmware/pull/20331)) :id=oled-driver-improvements
93
94The "classic" OLED driver picked up support for additional sizes of OLED displays, support for the SH1107 controller, and SPI-based OLED support.
95
96Other configurable items are available and can be found on the [OLED Driver page](https://docs.qmk.fm/#/feature_oled_driver).
97
98## Full changelist :id=full-changelist
99
100Core:
101* Refactor `keyevent_t` for 1ms timing resolution ([#15847](https://github.com/qmk/qmk_firmware/pull/15847))
102* PS/2 PIO Driver for RP2040 ([#17893](https://github.com/qmk/qmk_firmware/pull/17893))
103* Relocate various modifier defines ([#18638](https://github.com/qmk/qmk_firmware/pull/18638))
104* Added PMW3320 driver ([#19543](https://github.com/qmk/qmk_firmware/pull/19543))
105* Keymap introspection for combos. ([#19670](https://github.com/qmk/qmk_firmware/pull/19670))
106* Add direction to dynamic_macro_record_start_user ([#19689](https://github.com/qmk/qmk_firmware/pull/19689))
107* Add Repeat Key ("repeat last key") as a core feature. ([#19700](https://github.com/qmk/qmk_firmware/pull/19700))
108* [Cleanup] Quantum Painter ([#19825](https://github.com/qmk/qmk_firmware/pull/19825))
109* Improve robustness of AW20216 driver ([#19849](https://github.com/qmk/qmk_firmware/pull/19849))
110* Make "detected_host_os()" available on the SLAVE side of the split keyboard ([#19854](https://github.com/qmk/qmk_firmware/pull/19854))
111* Add RP2040 Community Edition alias for splitkb.com's Liatris controller ([#19966](https://github.com/qmk/qmk_firmware/pull/19966))
112* Remove some use of keymap.h ([#19980](https://github.com/qmk/qmk_firmware/pull/19980))
113* Merge upstream changes to uf2conv ([#19993](https://github.com/qmk/qmk_firmware/pull/19993))
114* Remove keymap.h ([#20004](https://github.com/qmk/qmk_firmware/pull/20004))
115* Remove some use of keymap.h ([#20006](https://github.com/qmk/qmk_firmware/pull/20006))
116* Quantum Painter QoL enhancements -- auto-poweroff, auto-flush, buffer sizing ([#20013](https://github.com/qmk/qmk_firmware/pull/20013))
117* Make Pointing Device Auto Layer more configurable ([#20061](https://github.com/qmk/qmk_firmware/pull/20061))
118* Add last activity functions for pointing device ([#20079](https://github.com/qmk/qmk_firmware/pull/20079))
119* Caps Word "Invert on shift" option: pressing Shift inverts the shift state. ([#20092](https://github.com/qmk/qmk_firmware/pull/20092))
120* Remove bootloader logic from `mcu_selection.mk` ([#20150](https://github.com/qmk/qmk_firmware/pull/20150))
121* Update qmk_cli container references ([#20154](https://github.com/qmk/qmk_firmware/pull/20154))
122* Clean up APA102 config and add DD mapping ([#20159](https://github.com/qmk/qmk_firmware/pull/20159))
123* Sync activity timestamps between sides. ([#20192](https://github.com/qmk/qmk_firmware/pull/20192))
124* Update Doxygen comments for some headers ([#20194](https://github.com/qmk/qmk_firmware/pull/20194))
125* Make IGNORE_MOD_TAP_INTERRUPT the default behaviour for mod-taps ([#20211](https://github.com/qmk/qmk_firmware/pull/20211))
126* Add some helpers to tidy up XAP ([#20235](https://github.com/qmk/qmk_firmware/pull/20235))
127* Tidy up duplication of MIN/MAX fallback implementations ([#20236](https://github.com/qmk/qmk_firmware/pull/20236))
128* Optionally keep intermediate file listings in order to do comparisons between builds. ([#20237](https://github.com/qmk/qmk_firmware/pull/20237))
129* Add basic profiler. ([#20238](https://github.com/qmk/qmk_firmware/pull/20238))
130* WS2812 driver improvements ([#20262](https://github.com/qmk/qmk_firmware/pull/20262))
131* typing_heatmap: Add macro to configure increase steps ([#20300](https://github.com/qmk/qmk_firmware/pull/20300))
132* Migrate `rgblight.pin` and `RGB_DI_PIN` to `ws2812.pin` ([#20303](https://github.com/qmk/qmk_firmware/pull/20303))
133* Delete config_common.h ([#20312](https://github.com/qmk/qmk_firmware/pull/20312))
134* Allow EEPROM_DRIVER from info.json ([#20313](https://github.com/qmk/qmk_firmware/pull/20313))
135* rp2040: *_PAL_MODE overridable for this platform too ([#20314](https://github.com/qmk/qmk_firmware/pull/20314))
136* Add core/fallback encoder behaviour ([#20320](https://github.com/qmk/qmk_firmware/pull/20320))
137* OLED Driver improvements ([#20331](https://github.com/qmk/qmk_firmware/pull/20331))
138* [Chore] Remove stray mod tap interrupt defines and per key functions ([#20347](https://github.com/qmk/qmk_firmware/pull/20347))
139* Add swap hands toggle functions ([#20381](https://github.com/qmk/qmk_firmware/pull/20381))
140* Prevent Tri-Layer keys from stopping caps word ([#20398](https://github.com/qmk/qmk_firmware/pull/20398))
141* quantum/action_util.c: Use uint8_t for oneshot_layer_data ([#20423](https://github.com/qmk/qmk_firmware/pull/20423))
142* Encoder map direction define. ([#20454](https://github.com/qmk/qmk_firmware/pull/20454))
143* Realign and size check EECONFIG structures ([#20541](https://github.com/qmk/qmk_firmware/pull/20541))
144* Clean up ISSI drivers, Add IS31FL3736 support ([#20572](https://github.com/qmk/qmk_firmware/pull/20572))
145* Add a user callback for pre process record ([#20584](https://github.com/qmk/qmk_firmware/pull/20584))
146* Disable debug on QP's internal task ([#20623](https://github.com/qmk/qmk_firmware/pull/20623))
147* Add required string header file ([#20638](https://github.com/qmk/qmk_firmware/pull/20638))
148* Add Develop is31fl3736 multi drivers ([#20642](https://github.com/qmk/qmk_firmware/pull/20642))
149* Support PS/2 mouse 9-bit output with MOUSE_EXTENDED_REPORT ([#20734](https://github.com/qmk/qmk_firmware/pull/20734))
150* BIOI G60/Morgan65: use custom Bluetooth driver ([#20897](https://github.com/qmk/qmk_firmware/pull/20897))
151* Move `pre_process_record_kb()` before `process_combo()` ([#20969](https://github.com/qmk/qmk_firmware/pull/20969))
152* Implement UF2 device type id extension tag ([#21029](https://github.com/qmk/qmk_firmware/pull/21029))
153
154CLI:
155* Add force support to 'qmk git-submodule' ([#19705](https://github.com/qmk/qmk_firmware/pull/19705))
156* JSON encoder: improve sorting of layout dict keys ([#19974](https://github.com/qmk/qmk_firmware/pull/19974))
157* Increase verbosity of make command ([#20172](https://github.com/qmk/qmk_firmware/pull/20172))
158* Append user variables to the end of make command ([#20177](https://github.com/qmk/qmk_firmware/pull/20177))
159* Strip API specific output from `qmk info` ([#20234](https://github.com/qmk/qmk_firmware/pull/20234))
160* `qmk find`: usability improvements ([#20440](https://github.com/qmk/qmk_firmware/pull/20440))
161* `qmk format-json`: Expose full key path and respect `sort_keys` ([#20836](https://github.com/qmk/qmk_firmware/pull/20836))
162* Update json2c to use dump_lines ([#21013](https://github.com/qmk/qmk_firmware/pull/21013))
163
164Submodule updates:
165* Update ChibiOS to latest stable 21.11.x ([#20470](https://github.com/qmk/qmk_firmware/pull/20470))
166
167Keyboards:
168* Allow a larger int for the idle timeout for urbanvanilla keymap ([#19738](https://github.com/qmk/qmk_firmware/pull/19738))
169* Change aidansmithdotdev/fine40 to use Encoder Map ([#19912](https://github.com/qmk/qmk_firmware/pull/19912))
170* Custom keycodes in JSON ([#19925](https://github.com/qmk/qmk_firmware/pull/19925))
171* Remove `"w":1` and `"h":1` from info.json ([#19961](https://github.com/qmk/qmk_firmware/pull/19961))
172* Move matrix config to info.json, part 1 ([#19985](https://github.com/qmk/qmk_firmware/pull/19985))
173* Move matrix config to info.json, part 2 ([#19987](https://github.com/qmk/qmk_firmware/pull/19987))
174* Move matrix config to info.json, part 3 ([#19991](https://github.com/qmk/qmk_firmware/pull/19991))
175* Move matrix config to info.json, part 4 ([#20001](https://github.com/qmk/qmk_firmware/pull/20001))
176* Move matrix config to info.json, part 5 ([#20003](https://github.com/qmk/qmk_firmware/pull/20003))
177* Move matrix config to info.json, part 6 ([#20019](https://github.com/qmk/qmk_firmware/pull/20019))
178* Move matrix config to info.json, part 7 ([#20020](https://github.com/qmk/qmk_firmware/pull/20020))
179* Move matrix config to info.json, part 8 ([#20030](https://github.com/qmk/qmk_firmware/pull/20030))
180* Remove empty rules.mk from keymaps ([#20056](https://github.com/qmk/qmk_firmware/pull/20056))
181* Adjust offset for some layouts ([#20075](https://github.com/qmk/qmk_firmware/pull/20075))
182* Remove useless "ifdef KEYBOARD_*" ([#20078](https://github.com/qmk/qmk_firmware/pull/20078))
183* Remove pointless `USE_I2C` blocks in keyboard headers ([#20084](https://github.com/qmk/qmk_firmware/pull/20084))
184* Add support for ISO version of Durgod Hades ([#20110](https://github.com/qmk/qmk_firmware/pull/20110))
185* Consolidate Binepad BN009 R1 and R2 into common folder ([#20113](https://github.com/qmk/qmk_firmware/pull/20113))
186* Remove more empty headers ([#20155](https://github.com/qmk/qmk_firmware/pull/20155))
187* Remove trailing zeroes in info.json layouts ([#20156](https://github.com/qmk/qmk_firmware/pull/20156))
188* Clean up usage of `QMK_KEYBOARD_H` ([#20167](https://github.com/qmk/qmk_firmware/pull/20167))
189* Move Keychron Q0 and Q0 Plus data-driven configuration; `keychron` keymap `rules.mk` cleanup ([#20168](https://github.com/qmk/qmk_firmware/pull/20168))
190* Move ortho & numpad layouts to data driven ([#20183](https://github.com/qmk/qmk_firmware/pull/20183))
191* Remove `RGB_DI_PIN` ifdefs ([#20218](https://github.com/qmk/qmk_firmware/pull/20218))
192* Add the KJ-Modify RS40 PCB keyboard ([#20243](https://github.com/qmk/qmk_firmware/pull/20243))
193* Move `WS2812_DRIVER` to data driven ([#20248](https://github.com/qmk/qmk_firmware/pull/20248))
194* [jacky_studio/piggy60] move AVR PCB under rev1 ([#20253](https://github.com/qmk/qmk_firmware/pull/20253))
195* Move 75% and 96% layouts to data driven ([#20289](https://github.com/qmk/qmk_firmware/pull/20289))
196* Move split layouts to data driven ([#20290](https://github.com/qmk/qmk_firmware/pull/20290))
197* Move 66% and 68% layouts to data driven ([#20293](https://github.com/qmk/qmk_firmware/pull/20293))
198* add jacky_studio/piggy60/rev2 ([#20297](https://github.com/qmk/qmk_firmware/pull/20297))
199* Move 65% layouts to data driven ([#20308](https://github.com/qmk/qmk_firmware/pull/20308))
200* Move TKL F13 and FRL layouts to data driven ([#20310](https://github.com/qmk/qmk_firmware/pull/20310))
201* Remove some use of keymap.h ([#20316](https://github.com/qmk/qmk_firmware/pull/20316))
202* Move fullsize layouts to data driven ([#20317](https://github.com/qmk/qmk_firmware/pull/20317))
203* Add 36-key layout for Beekeeb Piantor ([#20328](https://github.com/qmk/qmk_firmware/pull/20328))
204* Add sriwedari70 and move kamigakushi to new folder ([#20334](https://github.com/qmk/qmk_firmware/pull/20334))
205* Move TKL layouts to data driven ([#20337](https://github.com/qmk/qmk_firmware/pull/20337))
206* Move Alice and Ergodox layouts to data driven ([#20340](https://github.com/qmk/qmk_firmware/pull/20340))
207* Move small macropad-ish layouts to data driven ([#20341](https://github.com/qmk/qmk_firmware/pull/20341))
208* Move `default` layouts to data driven ([#20349](https://github.com/qmk/qmk_firmware/pull/20349))
209* Move `RGB_MATRIX_DRIVER` to data driven ([#20350](https://github.com/qmk/qmk_firmware/pull/20350))
210* Move split space/backspace layouts to data driven ([#20356](https://github.com/qmk/qmk_firmware/pull/20356))
211* Move single `LAYOUT`s to data driven ([#20365](https://github.com/qmk/qmk_firmware/pull/20365))
212* Add encoder map for Iris Rev. 5 VIA ([#20412](https://github.com/qmk/qmk_firmware/pull/20412))
213* Move remaining `LAYOUT`s to data driven ([#20422](https://github.com/qmk/qmk_firmware/pull/20422))
214* Move single `LAYOUT_all`s to data driven ([#20430](https://github.com/qmk/qmk_firmware/pull/20430))
215* 4pplet/yakiimo Layout Macro Conversion and Additions ([#20436](https://github.com/qmk/qmk_firmware/pull/20436))
216* Move single `60_ansi`, `60_hhkb` and `60_iso` layouts to data driven ([#20438](https://github.com/qmk/qmk_firmware/pull/20438))
217* Update brauner preonic layout ([#20439](https://github.com/qmk/qmk_firmware/pull/20439))
218* AEBoards Satellite Rev1 Layout Macro Conversion ([#20442](https://github.com/qmk/qmk_firmware/pull/20442))
219* Acheron Austin Layout Macro Conversion and Additions ([#20443](https://github.com/qmk/qmk_firmware/pull/20443))
220* Move remaining `LAYOUT_all`s to data driven ([#20463](https://github.com/qmk/qmk_firmware/pull/20463))
221* Update lotus58 RGB config ([#20468](https://github.com/qmk/qmk_firmware/pull/20468))
222* Cleanup `ekow/akira` ([#20474](https://github.com/qmk/qmk_firmware/pull/20474))
223* Move 60% layouts to data driven ([#20477](https://github.com/qmk/qmk_firmware/pull/20477))
224* Move DZ60 and MJ6XY layouts to data driven ([#20478](https://github.com/qmk/qmk_firmware/pull/20478))
225* AEBoards Constellation Layout Macro Updates ([#20487](https://github.com/qmk/qmk_firmware/pull/20487))
226* AI03 Equinox Layout Macro Additions ([#20488](https://github.com/qmk/qmk_firmware/pull/20488))
227* AI03 Vega Layout Macro Additions ([#20489](https://github.com/qmk/qmk_firmware/pull/20489))
228* AKB OGR Layout Macro Additions ([#20490](https://github.com/qmk/qmk_firmware/pull/20490))
229* AKB Vero Layout Macro Additions ([#20491](https://github.com/qmk/qmk_firmware/pull/20491))
230* Alf DC60 Layout Macro Additions ([#20494](https://github.com/qmk/qmk_firmware/pull/20494))
231* Alf X2 Layout Macro Additions ([#20495](https://github.com/qmk/qmk_firmware/pull/20495))
232* Koolertron AMAG23 Touch-Up ([#20496](https://github.com/qmk/qmk_firmware/pull/20496))
233* BIOI G60 Layout Macro Additions ([#20498](https://github.com/qmk/qmk_firmware/pull/20498))
234* BIOI Morgan65 Layout Macro Additions ([#20499](https://github.com/qmk/qmk_firmware/pull/20499))
235* BIOI S65 Layout Macro Additions ([#20500](https://github.com/qmk/qmk_firmware/pull/20500))
236* Boston Layout Macro Additions ([#20504](https://github.com/qmk/qmk_firmware/pull/20504))
237* Potato65S Layout Macro Additions ([#20508](https://github.com/qmk/qmk_firmware/pull/20508))
238* Move miscellaneous layouts to data driven ([#20516](https://github.com/qmk/qmk_firmware/pull/20516))
239* Cable Car Designs Cypher rev6 Layout Additions and Touch-Up ([#20518](https://github.com/qmk/qmk_firmware/pull/20518))
240* Caffeinated Studios Serpent65 Layout Macro Additions ([#20519](https://github.com/qmk/qmk_firmware/pull/20519))
241* CannonKeys Adelie Layout Macro Additions ([#20546](https://github.com/qmk/qmk_firmware/pull/20546))
242* CannonKeys Aella Layout Macro Additions ([#20547](https://github.com/qmk/qmk_firmware/pull/20547))
243* CannonKeys Balance Layout Macro Additions and Touch-Up ([#20548](https://github.com/qmk/qmk_firmware/pull/20548))
244* CannonKeys Brutal v2 1800 Layout Macro Additions ([#20549](https://github.com/qmk/qmk_firmware/pull/20549))
245* CannonKeys Brutal v2 65 Layout Macro Additions ([#20552](https://github.com/qmk/qmk_firmware/pull/20552))
246* CannonKeys Cloudline Layout Macro Additions ([#20553](https://github.com/qmk/qmk_firmware/pull/20553))
247* CannonKeys Crin Layout Macro Additions ([#20554](https://github.com/qmk/qmk_firmware/pull/20554))
248* CannonKeys DevastatingTKL Layout Macro Additions ([#20555](https://github.com/qmk/qmk_firmware/pull/20555))
249* CannonKeys Ellipse Layout Macro Additions ([#20558](https://github.com/qmk/qmk_firmware/pull/20558))
250* CannonKeys Ellipse Hotswap Layout Macro Addition & Touch-Up ([#20560](https://github.com/qmk/qmk_firmware/pull/20560))
251* CannonKeys Gentoo Layout Macro Additions ([#20561](https://github.com/qmk/qmk_firmware/pull/20561))
252* CannonKeys Gentoo Hotswap Touch-Up ([#20562](https://github.com/qmk/qmk_firmware/pull/20562))
253* CannonKeys HoodrowG Layout Macro Additions ([#20563](https://github.com/qmk/qmk_firmware/pull/20563))
254* CannonKeys Moment Layout Macro Additions ([#20564](https://github.com/qmk/qmk_firmware/pull/20564))
255* CannonKeys Moment Hotswap Touch-Up ([#20565](https://github.com/qmk/qmk_firmware/pull/20565))
256* CannonKeys Nearfield Layout Macro Addition ([#20566](https://github.com/qmk/qmk_firmware/pull/20566))
257* CannonKeys Obliterated75 Layout Macro Additions ([#20567](https://github.com/qmk/qmk_firmware/pull/20567))
258* CannonKeys Onyx Layout Macro Additions ([#20568](https://github.com/qmk/qmk_firmware/pull/20568))
259* CannonKeys Rekt1800 Layout Macro Additions ([#20569](https://github.com/qmk/qmk_firmware/pull/20569))
260* CannonKeys Serenity Layout Macro Additions ([#20570](https://github.com/qmk/qmk_firmware/pull/20570))
261* CannonKeys Vector Layout Macro Additions ([#20571](https://github.com/qmk/qmk_firmware/pull/20571))
262* Carbo65 Community Layout support ([#20580](https://github.com/qmk/qmk_firmware/pull/20580))
263* cest73 TKM Layout Macro Additions ([#20583](https://github.com/qmk/qmk_firmware/pull/20583))
264* Charue Charon Layout Macro Additions ([#20585](https://github.com/qmk/qmk_firmware/pull/20585))
265* Charue Sunsetter R2 Layout Macro Additions ([#20586](https://github.com/qmk/qmk_firmware/pull/20586))
266* Remove `FLIP_HALF` layouts and move to data driven ([#20588](https://github.com/qmk/qmk_firmware/pull/20588))
267* update ymdk/id75/rules.mk for develop ([#20592](https://github.com/qmk/qmk_firmware/pull/20592))
268* CherryB Studio CB1800 Layout Macro Additions ([#20593](https://github.com/qmk/qmk_firmware/pull/20593))
269* CherryB Studio CB65 Layout Macro Additions ([#20594](https://github.com/qmk/qmk_firmware/pull/20594))
270* CherryB Studio CB87RGB Layout Macro Additions ([#20595](https://github.com/qmk/qmk_firmware/pull/20595))
271* CheckerBoards G_IDB60 Layout Macro Edits ([#20596](https://github.com/qmk/qmk_firmware/pull/20596))
272* CherryB Studio CB87v2 Layout Macro Additions ([#20597](https://github.com/qmk/qmk_firmware/pull/20597))
273* CX60 Community Layout Support ([#20598](https://github.com/qmk/qmk_firmware/pull/20598))
274* Demiurge Layout Macro Touch-Up ([#20599](https://github.com/qmk/qmk_firmware/pull/20599))
275* Ducky One 2 SF 1967ST Layout Macro Additions ([#20600](https://github.com/qmk/qmk_firmware/pull/20600))
276* Move `FORCE_NKRO` to data driven ([#20604](https://github.com/qmk/qmk_firmware/pull/20604))
277* dyz Synthesis60 Layout Macro Addition ([#20610](https://github.com/qmk/qmk_firmware/pull/20610))
278* DZTech Bocc Layout Macro Additions ([#20611](https://github.com/qmk/qmk_firmware/pull/20611))
279* E88 Layout Macro Additions ([#20612](https://github.com/qmk/qmk_firmware/pull/20612))
280* Emery65 Layout Macro Additions ([#20613](https://github.com/qmk/qmk_firmware/pull/20613))
281* EvyD13 MX5160 Layout Macro Additions ([#20614](https://github.com/qmk/qmk_firmware/pull/20614))
282* FJLabs AD65 Layout Macro Additions ([#20619](https://github.com/qmk/qmk_firmware/pull/20619))
283* FJLabs Avalon Layout Additions and Touch-Up ([#20620](https://github.com/qmk/qmk_firmware/pull/20620))
284* FJLabs Midway60 Layout Macro Additions ([#20621](https://github.com/qmk/qmk_firmware/pull/20621))
285* FJLabs Polaris Layout Additions and Touch-Up ([#20622](https://github.com/qmk/qmk_firmware/pull/20622))
286* FJLabs Sinanju WK Layout Additions and Touch-Up ([#20628](https://github.com/qmk/qmk_firmware/pull/20628))
287* LFK87 refactor ([#20635](https://github.com/qmk/qmk_firmware/pull/20635))
288* Fox Lab Time80 Layout Macro Additions ([#20636](https://github.com/qmk/qmk_firmware/pull/20636))
289* FJLabs Solanis Layout Macro Additions ([#20639](https://github.com/qmk/qmk_firmware/pull/20639))
290* GrayStudio Aero 75 Refactor and Touch-Up ([#20640](https://github.com/qmk/qmk_firmware/pull/20640))
291* Move `USB_MAX_POWER_CONSUMPTION` to data driven ([#20648](https://github.com/qmk/qmk_firmware/pull/20648))
292* `info.json` whitespace cleanups ([#20651](https://github.com/qmk/qmk_firmware/pull/20651))
293* Hand88 Layout Macro Additions ([#20657](https://github.com/qmk/qmk_firmware/pull/20657))
294* Cyberstar Handwired Layout Macro Additions ([#20658](https://github.com/qmk/qmk_firmware/pull/20658))
295* split_65 Handwired Layout Macro Addition and Touch-Up ([#20659](https://github.com/qmk/qmk_firmware/pull/20659))
296* Bebol Handwired Layout Macro Additions ([#20660](https://github.com/qmk/qmk_firmware/pull/20660))
297* Glacier Handwired Layout Macro Addition and Touch-Up ([#20661](https://github.com/qmk/qmk_firmware/pull/20661))
298* Koalafications Handwired Layout Macro Additions ([#20662](https://github.com/qmk/qmk_firmware/pull/20662))
299* The Galleon Handwired Layout Macro Additions ([#20663](https://github.com/qmk/qmk_firmware/pull/20663))
300* More `info.json` whitespace cleanups ([#20665](https://github.com/qmk/qmk_firmware/pull/20665))
301* Remove use of layout macros for LFKeyboards LED config ([#20666](https://github.com/qmk/qmk_firmware/pull/20666))
302* Helix rev2: remove 4 rows option ([#20667](https://github.com/qmk/qmk_firmware/pull/20667))
303* Wakizashi40 Handwired Touch-Up ([#20671](https://github.com/qmk/qmk_firmware/pull/20671))
304* yttyx: convert readme to utf-8 encoding ([#20672](https://github.com/qmk/qmk_firmware/pull/20672))
305* Alicia Cook Layout Macro Additions ([#20675](https://github.com/qmk/qmk_firmware/pull/20675))
306* Primus75 Layout Macro Additions ([#20676](https://github.com/qmk/qmk_firmware/pull/20676))
307* Volcano660 Layout Macro Additions ([#20677](https://github.com/qmk/qmk_firmware/pull/20677))
308* Iris Keyboards Iris60 Layout Macro Additions ([#20678](https://github.com/qmk/qmk_firmware/pull/20678))
309* Irene Layout Macro Additions ([#20679](https://github.com/qmk/qmk_firmware/pull/20679))
310* Iron180 Layout Macro Additions ([#20680](https://github.com/qmk/qmk_firmware/pull/20680))
311* kinesis/alvicstep: remove kicad project files ([#20681](https://github.com/qmk/qmk_firmware/pull/20681))
312* Remove more junk files and scripts ([#20682](https://github.com/qmk/qmk_firmware/pull/20682))
313* JKeys Design Gentleman65 Layout Macro Addition and Touch-Up ([#20684](https://github.com/qmk/qmk_firmware/pull/20684))
314* JKeys Design Gentleman65 Suited Edition Layout Macro Addition ([#20685](https://github.com/qmk/qmk_firmware/pull/20685))
315* add additional layouts to `dactyl_manuform` variants ([#20688](https://github.com/qmk/qmk_firmware/pull/20688))
316* TheDogKeyboard Layout Macro Addition ([#20689](https://github.com/qmk/qmk_firmware/pull/20689))
317* KBDfans Bella Soldered Layout Macro Additions ([#20691](https://github.com/qmk/qmk_firmware/pull/20691))
318* KBDfans Bounce75 Hotswap Touch-Up ([#20692](https://github.com/qmk/qmk_firmware/pull/20692))
319* KBDfans KBD66 Layout Additions and Refactor ([#20693](https://github.com/qmk/qmk_firmware/pull/20693))
320* KBDfans Odin RGB Touch-Up ([#20694](https://github.com/qmk/qmk_firmware/pull/20694))
321* KBDfans Odin Soldered Layout Additions and Touch-Up ([#20695](https://github.com/qmk/qmk_firmware/pull/20695))
322* keebzdotnet FMe Layout Additions ([#20696](https://github.com/qmk/qmk_firmware/pull/20696))
323* Kegen G-Boy Layout Additions ([#20697](https://github.com/qmk/qmk_firmware/pull/20697))
324* Escape Unicode characters in info.json ([#20698](https://github.com/qmk/qmk_firmware/pull/20698))
325* Kiko's Lab Ellora65 Layout Additions ([#20699](https://github.com/qmk/qmk_firmware/pull/20699))
326* Even more `info.json` whitespace cleanups ([#20703](https://github.com/qmk/qmk_firmware/pull/20703))
327* kkatano Bakeneko 65 V3 Layout Additions ([#20706](https://github.com/qmk/qmk_firmware/pull/20706))
328* kopibeng MNK65 Layout Additions ([#20708](https://github.com/qmk/qmk_firmware/pull/20708))
329* kopibeng Typ65+ Layout Additions ([#20710](https://github.com/qmk/qmk_firmware/pull/20710))
330* kopibeng XT60 Layout Additions ([#20711](https://github.com/qmk/qmk_firmware/pull/20711))
331* kopibeng XT60_SINGA Layout Additions ([#20712](https://github.com/qmk/qmk_firmware/pull/20712))
332* kopibeng XT8x Layout Additions ([#20713](https://github.com/qmk/qmk_firmware/pull/20713))
333* Lefty Touch-Up ([#20714](https://github.com/qmk/qmk_firmware/pull/20714))
334* Loki65 Layout Additions ([#20715](https://github.com/qmk/qmk_firmware/pull/20715))
335* Lucid Alexa Solder Layout Additions ([#20716](https://github.com/qmk/qmk_firmware/pull/20716))
336* Lucid Phantom Soldered Layout Additions ([#20717](https://github.com/qmk/qmk_firmware/pull/20717))
337* Leftover30 Layout Addition ([#20718](https://github.com/qmk/qmk_firmware/pull/20718))
338* Matrix Cain RE Touch-Up ([#20719](https://github.com/qmk/qmk_firmware/pull/20719))
339* Matrix Lab 8XV1.2 OG Layout Updates ([#20720](https://github.com/qmk/qmk_firmware/pull/20720))
340* Mechlovin Studio Hex6C Layout Additions ([#20722](https://github.com/qmk/qmk_firmware/pull/20722))
341* Mechlovin.Studio Rogue87 Rev.1 Layout Additions ([#20724](https://github.com/qmk/qmk_firmware/pull/20724))
342* Mechlovin.Studio Rouge87 Rev.1 Layout Additions ([#20725](https://github.com/qmk/qmk_firmware/pull/20725))
343* Mechlovin.Studio infinity87 Rev.1 Layout Additions ([#20726](https://github.com/qmk/qmk_firmware/pull/20726))
344* Mechlovin.Studio Infinity87 RGB Rev1 Layout Additions ([#20727](https://github.com/qmk/qmk_firmware/pull/20727))
345* Mechlovin9 Layout Addition ([#20728](https://github.com/qmk/qmk_firmware/pull/20728))
346* 1upkeyboards/pi50 WS2812_DI_PIN patch for develop ([#20731](https://github.com/qmk/qmk_firmware/pull/20731))
347* Mechlovin.Studio Infinity87 Rev.2 Layout Additions ([#20735](https://github.com/qmk/qmk_firmware/pull/20735))
348* Mechlovin.Studio Olly JF Layout Additions ([#20736](https://github.com/qmk/qmk_firmware/pull/20736))
349* Mechlovin Studio Serratus Layout Additions ([#20737](https://github.com/qmk/qmk_firmware/pull/20737))
350* MechWild Mercutio Layout Addition ([#20738](https://github.com/qmk/qmk_firmware/pull/20738))
351* MisterKnife Knife66 ISO Layout Addition ([#20739](https://github.com/qmk/qmk_firmware/pull/20739))
352* MNK1800s Layout Addition ([#20740](https://github.com/qmk/qmk_firmware/pull/20740))
353* MNK75 Layout Additions ([#20741](https://github.com/qmk/qmk_firmware/pull/20741))
354* Mode SixtyFive S Layout Additions ([#20742](https://github.com/qmk/qmk_firmware/pull/20742))
355* Mode SeventyFive H Layout Addition ([#20743](https://github.com/qmk/qmk_firmware/pull/20743))
356* Monstargear XO87 Soldered Layout Additions ([#20744](https://github.com/qmk/qmk_firmware/pull/20744))
357* MTBKeys MTB60 Solder Layout Additions ([#20745](https://github.com/qmk/qmk_firmware/pull/20745))
358* Nix Keyboards Day Off 60 Touch-Up and Layout Additions ([#20746](https://github.com/qmk/qmk_firmware/pull/20746))
359* Kastenwagen 1840 Layout Addition ([#20747](https://github.com/qmk/qmk_firmware/pull/20747))
360* Kastenwagen 48 Layout Addition ([#20748](https://github.com/qmk/qmk_firmware/pull/20748))
361* NovelKeys NK87 Touch-Up ([#20749](https://github.com/qmk/qmk_firmware/pull/20749))
362* NovelKeys NK87B Touch-Up ([#20750](https://github.com/qmk/qmk_firmware/pull/20750))
363* Noxary 378 Layout Addition ([#20751](https://github.com/qmk/qmk_firmware/pull/20751))
364* Noxary Valhalla Layout Addition ([#20752](https://github.com/qmk/qmk_firmware/pull/20752))
365* Nightly Boards/DeskDaily Daily60 Layout Additions ([#20753](https://github.com/qmk/qmk_firmware/pull/20753))
366* Odelia Touch-Up ([#20754](https://github.com/qmk/qmk_firmware/pull/20754))
367* One Key Co Dango40 Touch-Up and Layout Addition ([#20755](https://github.com/qmk/qmk_firmware/pull/20755))
368* P3D Glitch Layout Addition ([#20763](https://github.com/qmk/qmk_firmware/pull/20763))
369* Pearl Boards Pandora Layout Additions ([#20764](https://github.com/qmk/qmk_firmware/pull/20764))
370* Pearl Boards Pearl Layout Addition ([#20765](https://github.com/qmk/qmk_firmware/pull/20765))
371* support boards with APM32 instead of the STM32 ([#20770](https://github.com/qmk/qmk_firmware/pull/20770))
372* Pearl Boards Zeus Layout Additions ([#20773](https://github.com/qmk/qmk_firmware/pull/20773))
373* Peej Rosaline Staggered Layout Additions ([#20774](https://github.com/qmk/qmk_firmware/pull/20774))
374* plywrks Lune Layout Touch-Up ([#20775](https://github.com/qmk/qmk_firmware/pull/20775))
375* Project Keyboard Signature65 Layout Additions ([#20776](https://github.com/qmk/qmk_firmware/pull/20776))
376* protoTypist Allison Layout Additions ([#20777](https://github.com/qmk/qmk_firmware/pull/20777))
377* Prototypist J-01 Rev1 Layout Additions ([#20778](https://github.com/qmk/qmk_firmware/pull/20778))
378* Protozoa Cassini Layout Additions ([#20779](https://github.com/qmk/qmk_firmware/pull/20779))
379* Protozoa P.01 Layout Additions ([#20781](https://github.com/qmk/qmk_firmware/pull/20781))
380* QwertleKeys Calice Layout Addition ([#20782](https://github.com/qmk/qmk_firmware/pull/20782))
381* Ramlord WITF Layout Touch-Up and Addition ([#20783](https://github.com/qmk/qmk_firmware/pull/20783))
382* Rart45: rename LAYOUT_all to LAYOUT ([#20784](https://github.com/qmk/qmk_firmware/pull/20784))
383* Rart60 Layout Additions ([#20785](https://github.com/qmk/qmk_firmware/pull/20785))
384* Rart67 Layout Additions ([#20786](https://github.com/qmk/qmk_firmware/pull/20786))
385* Rart67M: rename LAYOUT_all to LAYOUT ([#20787](https://github.com/qmk/qmk_firmware/pull/20787))
386* RART75 Layout Additions ([#20788](https://github.com/qmk/qmk_firmware/pull/20788))
387* RART75 Hotswap Layout Additions ([#20789](https://github.com/qmk/qmk_firmware/pull/20789))
388* RART75M: rename LAYOUT_all to LAYOUT ([#20790](https://github.com/qmk/qmk_firmware/pull/20790))
389* RART80 Hotswap Layout Additions ([#20791](https://github.com/qmk/qmk_firmware/pull/20791))
390* Rartand Layout Additions ([#20799](https://github.com/qmk/qmk_firmware/pull/20799))
391* Rartlice: rename LAYOUT_all to LAYOUT ([#20800](https://github.com/qmk/qmk_firmware/pull/20800))
392* Ratio65 Hotswap: rename LAYOUT_all to LAYOUT_65_ansi_blocker ([#20801](https://github.com/qmk/qmk_firmware/pull/20801))
393* Ratio65 Solder Layout Additions ([#20802](https://github.com/qmk/qmk_firmware/pull/20802))
394* Specifying the default board file is redundant ([#20807](https://github.com/qmk/qmk_firmware/pull/20807))
395* RGBKB Pan Layout Additions ([#20809](https://github.com/qmk/qmk_firmware/pull/20809))
396* saevus cor Layout Additions ([#20810](https://github.com/qmk/qmk_firmware/pull/20810))
397* Clean up trailing commas from info.json ([#20812](https://github.com/qmk/qmk_firmware/pull/20812))
398* Enable LTO on salicylic acid 7skb to reduce size ([#20813](https://github.com/qmk/qmk_firmware/pull/20813))
399* Reduce compiled size for mt64rgb's via keymap ([#20814](https://github.com/qmk/qmk_firmware/pull/20814))
400* Reduce compiled size for prototypist oceanographer's via keymap ([#20816](https://github.com/qmk/qmk_firmware/pull/20816))
401* Sauce Mild Layout Additions ([#20818](https://github.com/qmk/qmk_firmware/pull/20818))
402* VCL x SawnsProjects VCL65 Layout Additions ([#20819](https://github.com/qmk/qmk_firmware/pull/20819))
403* senselessclay had60 Layout Additions ([#20820](https://github.com/qmk/qmk_firmware/pull/20820))
404* Space Holdings Nebula12B ([#20821](https://github.com/qmk/qmk_firmware/pull/20821))
405* SmithRune Iron180 Layout Additions ([#20822](https://github.com/qmk/qmk_firmware/pull/20822))
406* Stello65 Beta Layout Additions and Clean-Up ([#20824](https://github.com/qmk/qmk_firmware/pull/20824))
407* Studio Kestra Nue Layout Additions ([#20825](https://github.com/qmk/qmk_firmware/pull/20825))
408* Switchplate Peripherals 910 Layout Additions ([#20827](https://github.com/qmk/qmk_firmware/pull/20827))
409* TKC California Layout Addition and Touch-Up ([#20829](https://github.com/qmk/qmk_firmware/pull/20829))
410* TKC M0lly Layout Additions ([#20830](https://github.com/qmk/qmk_firmware/pull/20830))
411* TKC TKL A/B87 Layout Additions ([#20831](https://github.com/qmk/qmk_firmware/pull/20831))
412* Viendi 8L Layout Additions ([#20832](https://github.com/qmk/qmk_firmware/pull/20832))
413* Viktus Smolka Layout Additions ([#20833](https://github.com/qmk/qmk_firmware/pull/20833))
414* Viktus SP111 Layout Additions ([#20834](https://github.com/qmk/qmk_firmware/pull/20834))
415* Viktus SP_Mini Layout Additions ([#20835](https://github.com/qmk/qmk_firmware/pull/20835))
416* W1-AT Layout Additions ([#20842](https://github.com/qmk/qmk_firmware/pull/20842))
417* Weirdo Geminate60 Layout Additions ([#20843](https://github.com/qmk/qmk_firmware/pull/20843))
418* Cypher rev5 Layout Additions ([#20844](https://github.com/qmk/qmk_firmware/pull/20844))
419* Prophet Layout Additions ([#20845](https://github.com/qmk/qmk_firmware/pull/20845))
420* Tidy up encoder_map directions ([#20847](https://github.com/qmk/qmk_firmware/pull/20847))
421* Rama Works Koyu Community Layout Support ([#20848](https://github.com/qmk/qmk_firmware/pull/20848))
422* Rama Works M65-B Community Layout Support ([#20850](https://github.com/qmk/qmk_firmware/pull/20850))
423* Rama Works M65-BX Community Layout Support ([#20851](https://github.com/qmk/qmk_firmware/pull/20851))
424* Rama Works U80-A Community Layout Support ([#20853](https://github.com/qmk/qmk_firmware/pull/20853))
425* Wilba Tech WT60-B Community Layout Support ([#20854](https://github.com/qmk/qmk_firmware/pull/20854))
426* Wilba Tech WT60-BX Layout Additions and Touch-Up ([#20855](https://github.com/qmk/qmk_firmware/pull/20855))
427* Wilba Tech WT60-C Community Layout Support ([#20858](https://github.com/qmk/qmk_firmware/pull/20858))
428* Wilba Tech WT60-D Layout Addition and Touch-Up ([#20859](https://github.com/qmk/qmk_firmware/pull/20859))
429* Wilba Tech WT60-G Community Layout Support ([#20860](https://github.com/qmk/qmk_firmware/pull/20860))
430* Wilba Tech WT60-G2 Community Layout Support ([#20861](https://github.com/qmk/qmk_firmware/pull/20861))
431* Wilba Tech WT60-H2: rename LAYOUT_all to LAYOUT_60_ansi_tsangan_split_rshift ([#20864](https://github.com/qmk/qmk_firmware/pull/20864))
432* Wilba Tech WT60-XT Layout Additions and Touch-Up ([#20865](https://github.com/qmk/qmk_firmware/pull/20865))
433* Wilba Tech WT65-A Community Layout Support and Touch-Up ([#20866](https://github.com/qmk/qmk_firmware/pull/20866))
434* Wilba Tech WT65-B Layout Addition and Touch-Up ([#20867](https://github.com/qmk/qmk_firmware/pull/20867))
435* Wilba Tech WT65-F Community Layout Support and Touch-Up ([#20869](https://github.com/qmk/qmk_firmware/pull/20869))
436* Wilba Tech WT65-FX Community Layout Support ([#20870](https://github.com/qmk/qmk_firmware/pull/20870))
437* Wilba Tech WT65-G Layout Additions and Touch-Up ([#20871](https://github.com/qmk/qmk_firmware/pull/20871))
438* Wilba Tech WT65-G2 Layout Additions and Touch-Up ([#20872](https://github.com/qmk/qmk_firmware/pull/20872))
439* Wilba Tech WT65-XT: rename LAYOUT_all to LAYOUT_65_xt_ansi_blocker_tsangan ([#20873](https://github.com/qmk/qmk_firmware/pull/20873))
440* Wilba Tech WT65-XTX Layout Additions and Touch-Up ([#20874](https://github.com/qmk/qmk_firmware/pull/20874))
441* Wilba Tech WT69-A Layout Addition and Touch-Up ([#20875](https://github.com/qmk/qmk_firmware/pull/20875))
442* Wilba Tech WT70-JB Layout Addition and Touch-Up ([#20876](https://github.com/qmk/qmk_firmware/pull/20876))
443* Wilba Tech WT75-A Layout Additions and Touch-Up ([#20877](https://github.com/qmk/qmk_firmware/pull/20877))
444* Wilba Tech WT75-B Layout Additions and Touch-Up ([#20878](https://github.com/qmk/qmk_firmware/pull/20878))
445* Wilba Tech WT75-C Layout Additions and Touch-Up ([#20879](https://github.com/qmk/qmk_firmware/pull/20879))
446* Wilba Tech WT80-G Layout Additions and Touch-Up ([#20880](https://github.com/qmk/qmk_firmware/pull/20880))
447* WinKeys Mini Winni: rename LAYOUT_all to LAYOUT_ortho_2x4 ([#20881](https://github.com/qmk/qmk_firmware/pull/20881))
448* Scarlet Bandana Layout Additions ([#20882](https://github.com/qmk/qmk_firmware/pull/20882))
449* Winkeyless B87 Community Layout Support ([#20884](https://github.com/qmk/qmk_firmware/pull/20884))
450* Xelus AkiS Layout Additions ([#20885](https://github.com/qmk/qmk_firmware/pull/20885))
451* Xelus Dharma Layout Additions ([#20886](https://github.com/qmk/qmk_firmware/pull/20886))
452* Xelus Kangaroo Layout Additions ([#20887](https://github.com/qmk/qmk_firmware/pull/20887))
453* Xelus La+ Layout Addition ([#20888](https://github.com/qmk/qmk_firmware/pull/20888))
454* Xelus Pachi Mini 32U4 Community Layout Support ([#20889](https://github.com/qmk/qmk_firmware/pull/20889))
455* Xelus Pachi rev1 Community Layout Support ([#20891](https://github.com/qmk/qmk_firmware/pull/20891))
456* Xelus Trinity XT TKL Layout Additions ([#20892](https://github.com/qmk/qmk_firmware/pull/20892))
457* Xelus Valor FRL TKL Layout Additions ([#20893](https://github.com/qmk/qmk_firmware/pull/20893))
458* YDKB Chili Community Layout Support ([#20895](https://github.com/qmk/qmk_firmware/pull/20895))
459* YDKB Grape Layout Additions ([#20899](https://github.com/qmk/qmk_firmware/pull/20899))
460* YMDK Wings Layout Addition ([#20900](https://github.com/qmk/qmk_firmware/pull/20900))
461* YMDK Wings Hotswap: rename LAYOUT_all to LAYOUT ([#20901](https://github.com/qmk/qmk_firmware/pull/20901))
462* YMDK YM68 Community Layout Support ([#20906](https://github.com/qmk/qmk_firmware/pull/20906))
463* Yugo-M Controller Layout Additions ([#20907](https://github.com/qmk/qmk_firmware/pull/20907))
464* Zicodia TKLFRLNRLMLAO Layout Addition ([#20908](https://github.com/qmk/qmk_firmware/pull/20908))
465* ZTBoards After Layout Addition ([#20912](https://github.com/qmk/qmk_firmware/pull/20912))
466* ZTBoards Noon Layout Addition ([#20913](https://github.com/qmk/qmk_firmware/pull/20913))
467* SawnsProjects Amber80 Solder Community Layout Support ([#20917](https://github.com/qmk/qmk_firmware/pull/20917))
468* Pearl Boards Atlas Layout Additions ([#20918](https://github.com/qmk/qmk_firmware/pull/20918))
469* Xiudi XD004: rename LAYOUT_all to LAYOUT_ortho_1x4 ([#20919](https://github.com/qmk/qmk_firmware/pull/20919))
470* Wilba Tech WT80-BC Community Layout Support ([#20920](https://github.com/qmk/qmk_firmware/pull/20920))
471* 4pplet Eagle Viper REP Rev B Community Layout Support ([#20921](https://github.com/qmk/qmk_firmware/pull/20921))
472* FR4Boards unix60 Layout Additions ([#20926](https://github.com/qmk/qmk_firmware/pull/20926))
473* MC-76K: rename LAYOUT_all to LAYOUT ([#20927](https://github.com/qmk/qmk_firmware/pull/20927))
474* Mechlovin Studio Jay60 Community Layout Support ([#20928](https://github.com/qmk/qmk_firmware/pull/20928))
475* MisterKnife Knife66 Layout Additions ([#20929](https://github.com/qmk/qmk_firmware/pull/20929))
476* MisterKnife Knife66 ISO Layout Additions II ([#20930](https://github.com/qmk/qmk_firmware/pull/20930))
477* 4pplet Waffling80 Community Layout Support and Touch-Up ([#20932](https://github.com/qmk/qmk_firmware/pull/20932))
478* Acheron Elongate Delta: rename LAYOUT_all to LAYOUT ([#20956](https://github.com/qmk/qmk_firmware/pull/20956))
479* ADPenrose Akemipad Layout Addition ([#20957](https://github.com/qmk/qmk_firmware/pull/20957))
480* ADPenrose Shisaku: rename LAYOUT_all to LAYOUT ([#20958](https://github.com/qmk/qmk_firmware/pull/20958))
481* AEBoards Aegis Layout Additions ([#20960](https://github.com/qmk/qmk_firmware/pull/20960))
482* rart/rart80:via: restore rules.mk after #20334 ([#21002](https://github.com/qmk/qmk_firmware/pull/21002))
483* Remove HHKB RN42 code ([#21007](https://github.com/qmk/qmk_firmware/pull/21007))
484* Move `thekey` to Drop vendor folder ([#21032](https://github.com/qmk/qmk_firmware/pull/21032))
485
486Keyboard fixes:
487* userspace/community layout fixes ([#19998](https://github.com/qmk/qmk_firmware/pull/19998))
488* Fix layout macro keys with no matrix position ([#20033](https://github.com/qmk/qmk_firmware/pull/20033))
489* Restore matrix pins for ep/40 ([#20083](https://github.com/qmk/qmk_firmware/pull/20083))
490* kbdfans/tiger80: remove duplicate keys in info.json ([#20148](https://github.com/qmk/qmk_firmware/pull/20148))
491* Fixup z70ultra — replace mis-removed file ([#20157](https://github.com/qmk/qmk_firmware/pull/20157))
492* Fixup CI build for F103C6 onekey. ([#20188](https://github.com/qmk/qmk_firmware/pull/20188))
493* Fix layouts containing keys with multiple matrix positions ([#20191](https://github.com/qmk/qmk_firmware/pull/20191))
494* Fix some more missing `#pragma once`s ([#20241](https://github.com/qmk/qmk_firmware/pull/20241))
495* Fixup CI build for `nack`. ([#20292](https://github.com/qmk/qmk_firmware/pull/20292))
496* Fixup Pointing device functions ([#20311](https://github.com/qmk/qmk_firmware/pull/20311))
497* Fix a handful of CLI errors ([#20321](https://github.com/qmk/qmk_firmware/pull/20321))
498* Fix API errors ([#20326](https://github.com/qmk/qmk_firmware/pull/20326))
499* Set up DEFAULT_FOLDER for primekb/meridian ([#20367](https://github.com/qmk/qmk_firmware/pull/20367))
500* Fix up via keymap builds. ([#20383](https://github.com/qmk/qmk_firmware/pull/20383))
501* Fix up via keymap builds. ([#20397](https://github.com/qmk/qmk_firmware/pull/20397))
502* Fix some missing QMK_KEYBOARD_H includes in user keymaps ([#20417](https://github.com/qmk/qmk_firmware/pull/20417))
503* Update ymdk/id75 config ([#20432](https://github.com/qmk/qmk_firmware/pull/20432))
504* Fix info.json LTO and format encoder definitions ([#20456](https://github.com/qmk/qmk_firmware/pull/20456))
505* Fixup dymium65 RGB Pin on develop ([#20473](https://github.com/qmk/qmk_firmware/pull/20473))
506* Fixup missing include in mxss `via` keymap ([#20475](https://github.com/qmk/qmk_firmware/pull/20475))
507* Fix nk plus ws2812 config ([#20524](https://github.com/qmk/qmk_firmware/pull/20524))
508* cannonkeys/ellipse_hs: correct layout macro references ([#20577](https://github.com/qmk/qmk_firmware/pull/20577))
509* Remove use of layout macros for `music_map` ([#20634](https://github.com/qmk/qmk_firmware/pull/20634))
510* Vertex/angle65 WS2812 pin fix ([#20653](https://github.com/qmk/qmk_firmware/pull/20653))
511* Fix ws2812 pin for phantagom boards ([#20670](https://github.com/qmk/qmk_firmware/pull/20670))
512* Fixup 1upkeyboards/pi50 ([#20733](https://github.com/qmk/qmk_firmware/pull/20733))
513* Fix `test_json2c_no_json()` ([#20756](https://github.com/qmk/qmk_firmware/pull/20756))
514* Fix mxss rgblight.c compilation issues ([#20804](https://github.com/qmk/qmk_firmware/pull/20804))
515* Fixup paladin64 ([#20805](https://github.com/qmk/qmk_firmware/pull/20805))
516* Fixup dogtag ([#20808](https://github.com/qmk/qmk_firmware/pull/20808))
517* Fixup zwag75 ([#20923](https://github.com/qmk/qmk_firmware/pull/20923))
518* Fixup latinpadble ([#20924](https://github.com/qmk/qmk_firmware/pull/20924))
519* Add missing layout data for a handful of boards ([#20931](https://github.com/qmk/qmk_firmware/pull/20931))
520* Fixup evo70 ([#20949](https://github.com/qmk/qmk_firmware/pull/20949))
521* Fixup Crkbd default keymap ([#20962](https://github.com/qmk/qmk_firmware/pull/20962))
522* Fix key display on Corne OLED ([#21044](https://github.com/qmk/qmk_firmware/pull/21044))
523
524Others:
525* Add layer-cycle example ([#19069](https://github.com/qmk/qmk_firmware/pull/19069))
526* Remove remnants of Vagrant. ([#20000](https://github.com/qmk/qmk_firmware/pull/20000))
527* Develop cleanup IS31FL3736 docs ([#20633](https://github.com/qmk/qmk_firmware/pull/20633))
528* Organise config/rules <-> info mappings ([#20723](https://github.com/qmk/qmk_firmware/pull/20723))
529* Add a change log for PR20584 ([#20998](https://github.com/qmk/qmk_firmware/pull/20998))
530
531Bugs:
532* Strip whitespace from CONVERT_TO variables ([#19948](https://github.com/qmk/qmk_firmware/pull/19948))
533* Check all rows have the correct number of columns when parsing `g_led_config` ([#19954](https://github.com/qmk/qmk_firmware/pull/19954))
534* Fix OSMs getting stuck ([#20034](https://github.com/qmk/qmk_firmware/pull/20034))
535* Fix rgblight layers when animations aren't enabled ([#20097](https://github.com/qmk/qmk_firmware/pull/20097))
536* Fixed split keyboard issue where custom LED indicators could activate incorrect LEDs (#20203) ([#20204](https://github.com/qmk/qmk_firmware/pull/20204))
537* Reduce _validate complexity ([#20274](https://github.com/qmk/qmk_firmware/pull/20274))
538* `qmk info`: account for ISO enter when calculating layout X offset ([#20325](https://github.com/qmk/qmk_firmware/pull/20325))
539* Disable specific warnings to mitigate compilation problems with `KEEP_INTERMEDIATES=yes`. ([#20339](https://github.com/qmk/qmk_firmware/pull/20339))
540* Fix compilation issue with Swap Hands and Encoder Map ([#20348](https://github.com/qmk/qmk_firmware/pull/20348))
541* Fix preprocessor condition for SPLIT_HAPTIC_ENABLE ([#20411](https://github.com/qmk/qmk_firmware/pull/20411))
542* Fix compilation issues with PS/2 driver on F4x1 controllers ([#20433](https://github.com/qmk/qmk_firmware/pull/20433))
543* Fix capital letters not getting sent with sendstring_swiss_fr.h ([#20515](https://github.com/qmk/qmk_firmware/pull/20515))
544* Duplicate board files for blok converter ([#20629](https://github.com/qmk/qmk_firmware/pull/20629))
545* Fix Mod-Tap combo regression ([#20669](https://github.com/qmk/qmk_firmware/pull/20669))
546* Revert use of legacy wear leveling driver now ChibiOS is fixed ([#20806](https://github.com/qmk/qmk_firmware/pull/20806))
547* Fix compilation error introduced by #20669 ([#20849](https://github.com/qmk/qmk_firmware/pull/20849))
548* Fix English word list retrieval in qmk generate-autocorrect-data ([#20915](https://github.com/qmk/qmk_firmware/pull/20915))
549* Improve keymap folder resolution ([#20981](https://github.com/qmk/qmk_firmware/pull/20981))
550* Fix issue with Repeat Key-Combo test ([#21005](https://github.com/qmk/qmk_firmware/pull/21005))
551* `qmk info` - Remove printing of "Keyboard Folder" ([#21033](https://github.com/qmk/qmk_firmware/pull/21033))
diff --git a/docs/_summary.md b/docs/_summary.md
index 01808bd675..3d9bde6b17 100644
--- a/docs/_summary.md
+++ b/docs/_summary.md
@@ -41,7 +41,6 @@
41 * [Keymap Overview](keymap.md) 41 * [Keymap Overview](keymap.md)
42 * Development Environments 42 * Development Environments
43 * [Docker Guide](getting_started_docker.md) 43 * [Docker Guide](getting_started_docker.md)
44 * [Vagrant Guide](getting_started_vagrant.md)
45 * Flashing 44 * Flashing
46 * [Flashing](flashing.md) 45 * [Flashing](flashing.md)
47 * [Flashing ATmega32A (ps2avrgb)](flashing_bootloadhid.md) 46 * [Flashing ATmega32A (ps2avrgb)](flashing_bootloadhid.md)
@@ -71,6 +70,7 @@
71 * [Macros](feature_macros.md) 70 * [Macros](feature_macros.md)
72 * [Mouse Keys](feature_mouse_keys.md) 71 * [Mouse Keys](feature_mouse_keys.md)
73 * [Programmable Button](feature_programmable_button.md) 72 * [Programmable Button](feature_programmable_button.md)
73 * [Repeat Key](feature_repeat_key.md)
74 * [Space Cadet Shift](feature_space_cadet.md) 74 * [Space Cadet Shift](feature_space_cadet.md)
75 * [US ANSI Shifted Keys](keycodes_us_ansi_shifted.md) 75 * [US ANSI Shifted Keys](keycodes_us_ansi_shifted.md)
76 76
diff --git a/docs/breaking_changes.md b/docs/breaking_changes.md
index 919c443123..e660182c32 100644
--- a/docs/breaking_changes.md
+++ b/docs/breaking_changes.md
@@ -10,27 +10,25 @@ Practically, this means QMK merges the `develop` branch into the `master` branch
10 10
11## What has been included in past Breaking Changes? 11## What has been included in past Breaking Changes?
12 12
13* [2023 May 28](ChangeLog/20230528.md)
13* [2023 Feb 26](ChangeLog/20230226.md) 14* [2023 Feb 26](ChangeLog/20230226.md)
14* [2022 Nov 26](ChangeLog/20221126.md) 15* [2022 Nov 26](ChangeLog/20221126.md)
15* [2022 Aug 27](ChangeLog/20220827.md)
16* [2022 May 28](ChangeLog/20220528.md)
17* [2022 Feb 26](ChangeLog/20220226.md)
18* [Older Breaking Changes](breaking_changes_history.md) 16* [Older Breaking Changes](breaking_changes_history.md)
19 17
20## When is the next Breaking Change? 18## When is the next Breaking Change?
21 19
22The next Breaking Change is scheduled for May 28, 2023. 20The next Breaking Change is scheduled for August 27, 2023.
23 21
24### Important Dates 22### Important Dates
25 23
26* 2023 Feb 26 - `develop` is tagged with a new release version. Each push to `master` is subsequently merged to `develop` by GitHub actions. 24* 2023 May 28 - `develop` is tagged with a new release version. Each push to `master` is subsequently merged to `develop` by GitHub actions.
27* 2023 Apr 30 - `develop` closed to new PRs. 25* 2023 Jul 30 - `develop` closed to new PRs.
28* 2023 Apr 30 - Call for testers. 26* 2023 Jul 30 - Call for testers.
29* 2023 May 14 - Last day for merges -- after this point `develop` is locked for testing and accepts only bugfixes 27* 2023 Aug 13 - Last day for merges -- after this point `develop` is locked for testing and accepts only bugfixes
30* 2023 May 21 - `develop` is locked, only critical bugfix PRs merged. 28* 2023 Aug 20 - `develop` is locked, only critical bugfix PRs merged.
31* 2023 May 26 - `master` is locked, no PRs merged. 29* 2023 Aug 25 - `master` is locked, no PRs merged.
32* 2023 May 28 - Merge `develop` to `master`. 30* 2023 Aug 27 - Merge `develop` to `master`.
33* 2023 May 28 - `master` is unlocked. PRs can be merged again. 31* 2023 Aug 27 - `master` is unlocked. PRs can be merged again.
34 32
35## What changes will be included? 33## What changes will be included?
36 34
@@ -50,7 +48,7 @@ Criteria for acceptance:
50 48
51Strongly suggested: 49Strongly suggested:
52 50
53* The PR has a ChangeLog file describing the changes under `<qmk_firmware>/docs/Changelog/20221126`. 51* The PR has a ChangeLog file describing the changes under `<qmk_firmware>/docs/Changelog/20230827`.
54 * This should be in Markdown format, with a name in the format `PR12345.md`, substituting the digits for your PRs ID. 52 * This should be in Markdown format, with a name in the format `PR12345.md`, substituting the digits for your PRs ID.
55 * One strong recommendation that the ChangeLog document matches the PR description on GitHub, so as to ensure traceability. 53 * One strong recommendation that the ChangeLog document matches the PR description on GitHub, so as to ensure traceability.
56 54
diff --git a/docs/breaking_changes_history.md b/docs/breaking_changes_history.md
index efc388985b..79f2899d2c 100644
--- a/docs/breaking_changes_history.md
+++ b/docs/breaking_changes_history.md
@@ -2,6 +2,7 @@
2 2
3This page links to all previous changelogs from the QMK Breaking Changes process. 3This page links to all previous changelogs from the QMK Breaking Changes process.
4 4
5* [2023 May 28](ChangeLog/20230528.md) - version 0.21.0
5* [2023 Feb 26](ChangeLog/20230226.md) - version 0.20.0 6* [2023 Feb 26](ChangeLog/20230226.md) - version 0.20.0
6* [2022 Nov 26](ChangeLog/20221126.md) - version 0.19.0 7* [2022 Nov 26](ChangeLog/20221126.md) - version 0.19.0
7* [2022 Aug 27](ChangeLog/20220827.md) - version 0.18.0 8* [2022 Aug 27](ChangeLog/20220827.md) - version 0.18.0
diff --git a/docs/breaking_changes_instructions.md b/docs/breaking_changes_instructions.md
index d835671556..7bde4b6004 100644
--- a/docs/breaking_changes_instructions.md
+++ b/docs/breaking_changes_instructions.md
@@ -23,14 +23,6 @@ If it is determined that your submission is a breaking change, there are a few t
23 23
24If you are contributing core code, and the only reason it needs to go through breaking changes is that you are updating keymaps to match your change, consider whether you can submit your feature in a way that the old keymaps continue to work. Then submit a separate PR that goes through the breaking changes process to remove the old code. 24If you are contributing core code, and the only reason it needs to go through breaking changes is that you are updating keymaps to match your change, consider whether you can submit your feature in a way that the old keymaps continue to work. Then submit a separate PR that goes through the breaking changes process to remove the old code.
25 25
26### Contribute a ChangeLog Entry
27
28We require submissions that go through the Breaking Change process to include a changelog entry. The entry should be a short summary of the changes your pull request makes &ndash; [each section here started as a changelog](ChangeLog/20190830.md "n.b. This should link to the 2019 Aug 30 Breaking Changes doc - @noroadsleft").
29
30Your changelog should be located at `docs/ChangeLog/YYYYMMDD/PR####.md`, where `YYYYMMDD` is the date on which QMK's breaking change branch &ndash; usually named `develop` &ndash; will be merged into the `master` branch, and `####` is the number of your pull request.
31
32If your submission requires action on the part of users, your changelog should instruct users what action(s) must be taken, or link to a location that does so.
33
34### Document Your Changes 26### Document Your Changes
35 27
36Understanding the purpose for your submission, and possible implications or actions it will require can make the review process more straightforward. A changelog may suffice for this purpose, but more extensive changes may require a level of detail that is ill-suited for a changelog. 28Understanding the purpose for your submission, and possible implications or actions it will require can make the review process more straightforward. A changelog may suffice for this purpose, but more extensive changes may require a level of detail that is ill-suited for a changelog.
diff --git a/docs/cli_commands.md b/docs/cli_commands.md
index d759c9c35a..79fd9de575 100644
--- a/docs/cli_commands.md
+++ b/docs/cli_commands.md
@@ -165,16 +165,31 @@ qmk find -f 'processor=STM32F411'
165qmk find -f 'processor=STM32F411' -f 'features.rgb_matrix=true' 165qmk find -f 'processor=STM32F411' -f 'features.rgb_matrix=true'
166``` 166```
167 167
168The following filter expressions are also supported:
169
170 - `exists(key)`: Match targets where `key` is present.
171 - `absent(key)`: Match targets where `key` is not present.
172 - `contains(key, value)`: Match targets where `key` contains `value`. Can be used for strings, arrays and object keys.
173 - `length(key, value)`: Match targets where the length of `key` is `value`. Can be used for strings, arrays and objects.
174
175You can also list arbitrary values for each matched target with `--print`:
176
177```
178qmk find -f 'processor=STM32F411' -p 'keyboard_name' -p 'features.rgb_matrix'
179```
180
168**Usage**: 181**Usage**:
169 182
170``` 183```
171qmk find [-h] [-km KEYMAP] [-f FILTER] 184qmk find [-h] [-km KEYMAP] [-p PRINT] [-f FILTER]
172 185
173options: 186options:
174 -km KEYMAP, --keymap KEYMAP 187 -km KEYMAP, --keymap KEYMAP
175 The keymap name to build. Default is 'default'. 188 The keymap name to build. Default is 'default'.
189 -p PRINT, --print PRINT
190 For each matched target, print the value of the supplied info.json key. May be passed multiple times.
176 -f FILTER, --filter FILTER 191 -f FILTER, --filter FILTER
177 Filter the list of keyboards based on the supplied value in rules.mk. Matches info.json structure, and accepts the formats 'features.rgblight=true' or 'exists(matrix_pins.direct)'. May be passed multiple times, all filters need to match. Value may include wildcards such as '*' and '?'. 192 Filter the list of keyboards based on their info.json data. Accepts the formats key=value, function(key), or function(key,value), eg. 'features.rgblight=true'. Valid functions are 'absent', 'contains', 'exists' and 'length'. May be passed multiple times; all filters need to match. Value may include wildcards such as '*' and '?'.
178``` 193```
179 194
180## `qmk console` 195## `qmk console`
diff --git a/docs/config_options.md b/docs/config_options.md
index 5bfb7c5d58..4698260118 100644
--- a/docs/config_options.md
+++ b/docs/config_options.md
@@ -150,7 +150,7 @@ If you define these options you will enable the associated feature, which may in
150* `#define TAPPING_TERM_PER_KEY` 150* `#define TAPPING_TERM_PER_KEY`
151 * enables handling for per key `TAPPING_TERM` settings 151 * enables handling for per key `TAPPING_TERM` settings
152* `#define RETRO_TAPPING` 152* `#define RETRO_TAPPING`
153 * tap anyway, even after TAPPING_TERM, if there was no other key interruption between press and release 153 * tap anyway, even after `TAPPING_TERM`, if there was no other key interruption between press and release
154 * See [Retro Tapping](tap_hold.md#retro-tapping) for details 154 * See [Retro Tapping](tap_hold.md#retro-tapping) for details
155* `#define RETRO_TAPPING_PER_KEY` 155* `#define RETRO_TAPPING_PER_KEY`
156 * enables handling for per key `RETRO_TAPPING` settings 156 * enables handling for per key `RETRO_TAPPING` settings
@@ -161,9 +161,6 @@ If you define these options you will enable the associated feature, which may in
161 * See [Permissive Hold](tap_hold.md#permissive-hold) for details 161 * See [Permissive Hold](tap_hold.md#permissive-hold) for details
162* `#define PERMISSIVE_HOLD_PER_KEY` 162* `#define PERMISSIVE_HOLD_PER_KEY`
163 * enabled handling for per key `PERMISSIVE_HOLD` settings 163 * enabled handling for per key `PERMISSIVE_HOLD` settings
164* `#define IGNORE_MOD_TAP_INTERRUPT`
165 * makes it possible to do rolling combos (zx) with keys that convert to other keys on hold, by enforcing the `TAPPING_TERM` for both keys.
166 * See [Ignore Mod Tap Interrupt](tap_hold.md#ignore-mod-tap-interrupt) for details
167* `#define QUICK_TAP_TERM 100` 164* `#define QUICK_TAP_TERM 100`
168 * tap-then-hold timing to use a dual role key to repeat keycode 165 * tap-then-hold timing to use a dual role key to repeat keycode
169 * See [Quick Tap Term](tap_hold.md#quick-tap-term) 166 * See [Quick Tap Term](tap_hold.md#quick-tap-term)
@@ -189,8 +186,6 @@ If you define these options you will enable the associated feature, which may in
189 * how long before oneshot times out 186 * how long before oneshot times out
190* `#define ONESHOT_TAP_TOGGLE 2` 187* `#define ONESHOT_TAP_TOGGLE 2`
191 * how many taps before oneshot toggle is triggered 188 * how many taps before oneshot toggle is triggered
192* `#define COMBO_COUNT 2`
193 * Set this to the number of combos that you're using in the [Combo](feature_combo.md) feature. Or leave it undefined and programmatically set the count.
194* `#define COMBO_TERM 200` 189* `#define COMBO_TERM 200`
195 * how long for the Combo keys to be detected. Defaults to `TAPPING_TERM` if not defined. 190 * how long for the Combo keys to be detected. Defaults to `TAPPING_TERM` if not defined.
196* `#define COMBO_MUST_HOLD_MODS` 191* `#define COMBO_MUST_HOLD_MODS`
@@ -217,7 +212,7 @@ If you define these options you will enable the associated feature, which may in
217 212
218## RGB Light Configuration 213## RGB Light Configuration
219 214
220* `#define RGB_DI_PIN D7` 215* `#define WS2812_DI_PIN D7`
221 * pin the DI on the WS2812 is hooked-up to 216 * pin the DI on the WS2812 is hooked-up to
222* `#define RGBLIGHT_LAYERS` 217* `#define RGBLIGHT_LAYERS`
223 * Lets you define [lighting layers](feature_rgblight.md?id=lighting-layers) that can be toggled on or off. Great for showing the current keyboard layer or caps lock state. 218 * Lets you define [lighting layers](feature_rgblight.md?id=lighting-layers) that can be toggled on or off. Great for showing the current keyboard layer or caps lock state.
@@ -233,7 +228,7 @@ If you define these options you will enable the associated feature, which may in
233* `#define RGBLIGHT_SPLIT` 228* `#define RGBLIGHT_SPLIT`
234 * Needed if both halves of the board have RGB LEDs wired directly to the RGB output pin on the controllers instead of passing the output of the left half to the input of the right half 229 * Needed if both halves of the board have RGB LEDs wired directly to the RGB output pin on the controllers instead of passing the output of the left half to the input of the right half
235* `#define RGBLED_SPLIT { 6, 6 }` 230* `#define RGBLED_SPLIT { 6, 6 }`
236 * number of LEDs connected that are directly wired to `RGB_DI_PIN` on each half of a split keyboard 231 * number of LEDs connected that are directly wired to the RGB pin on each half of a split keyboard
237 * First value indicates number of LEDs for left half, second value is for the right half 232 * First value indicates number of LEDs for left half, second value is for the right half
238 * When RGBLED_SPLIT is defined, RGBLIGHT_SPLIT is implicitly defined. 233 * When RGBLED_SPLIT is defined, RGBLIGHT_SPLIT is implicitly defined.
239* `#define RGBLIGHT_HUE_STEP 12` 234* `#define RGBLIGHT_HUE_STEP 12`
diff --git a/docs/feature_caps_word.md b/docs/feature_caps_word.md
index c58d1a56e2..7f726b059d 100644
--- a/docs/feature_caps_word.md
+++ b/docs/feature_caps_word.md
@@ -90,6 +90,26 @@ by defining `IS_COMMAND()` in config.h:
90 90
91## Customizing Caps Word :id=customizing-caps-word 91## Customizing Caps Word :id=customizing-caps-word
92 92
93### Invert on shift :id=invert-on-shift
94
95By default, Caps Word turns off when Shift keys are pressed, considering them as
96word-breaking. Alternatively with the `CAPS_WORD_INVERT_ON_SHIFT` option,
97pressing the Shift key continues Caps Word and inverts the shift state. This
98is convenient for uncapitalizing one or a few letters within a word, for
99example with Caps Word on, typing "D, B, Shift+A, Shift+A, S" produces "DBaaS",
100or typing "P, D, F, Shift+S" produces "PDFs".
101
102Enable it by adding in config.h
103
104```c
105#define CAPS_WORD_INVERT_ON_SHIFT
106```
107
108This option works with regular Shift keys `KC_LSFT` and `KC_RSFT`, mod-tap Shift
109keys, and one-shot Shift keys. Note that while Caps Word is on, one-shot Shift
110keys behave like regular Shift keys, and have effect only while they are held.
111
112
93### Idle timeout :id=idle-timeout 113### Idle timeout :id=idle-timeout
94 114
95Caps Word turns off automatically if no keys are pressed for 115Caps Word turns off automatically if no keys are pressed for
diff --git a/docs/feature_combo.md b/docs/feature_combo.md
index 075fe252ae..fd241061fb 100644
--- a/docs/feature_combo.md
+++ b/docs/feature_combo.md
@@ -4,15 +4,12 @@ The Combo feature is a chording type solution for adding custom actions. It lets
4 4
5To enable this feature, you need to add `COMBO_ENABLE = yes` to your `rules.mk`. 5To enable this feature, you need to add `COMBO_ENABLE = yes` to your `rules.mk`.
6 6
7Additionally, in your `config.h`, you'll need to specify the number of combos that you'll be using, by adding `#define COMBO_COUNT 1` (replacing 1 with the number that you're using). It is also possible to not define this and instead set the variable `COMBO_LEN` yourself. There's a trick where we don't need to think about this variable at all. More on this later.
8
9
10Then, in your `keymap.c` file, you'll need to define a sequence of keys, terminated with `COMBO_END`, and a structure to list the combination of keys, and its resulting action. 7Then, in your `keymap.c` file, you'll need to define a sequence of keys, terminated with `COMBO_END`, and a structure to list the combination of keys, and its resulting action.
11 8
12```c 9```c
13const uint16_t PROGMEM test_combo1[] = {KC_A, KC_B, COMBO_END}; 10const uint16_t PROGMEM test_combo1[] = {KC_A, KC_B, COMBO_END};
14const uint16_t PROGMEM test_combo2[] = {KC_C, KC_D, COMBO_END}; 11const uint16_t PROGMEM test_combo2[] = {KC_C, KC_D, COMBO_END};
15combo_t key_combos[COMBO_COUNT] = { 12combo_t key_combos[] = {
16 COMBO(test_combo1, KC_ESC), 13 COMBO(test_combo1, KC_ESC),
17 COMBO(test_combo2, LCTL(KC_Z)), // keycodes with modifiers are possible too! 14 COMBO(test_combo2, LCTL(KC_Z)), // keycodes with modifiers are possible too!
18}; 15};
@@ -33,7 +30,7 @@ It is possible to overlap combos. Before, with the example below both combos wou
33```c 30```c
34const uint16_t PROGMEM test_combo1[] = {LSFT_T(KC_A), LT(1, KC_B), COMBO_END}; 31const uint16_t PROGMEM test_combo1[] = {LSFT_T(KC_A), LT(1, KC_B), COMBO_END};
35const uint16_t PROGMEM test_combo2[] = {LSFT_T(KC_A), LT(1, KC_B), KC_C, COMBO_END}; 32const uint16_t PROGMEM test_combo2[] = {LSFT_T(KC_A), LT(1, KC_B), KC_C, COMBO_END};
36combo_t key_combos[COMBO_COUNT] = { 33combo_t key_combos[] = {
37 COMBO(test_combo1, KC_ESC) 34 COMBO(test_combo1, KC_ESC)
38 COMBO(test_combo2, KC_TAB) 35 COMBO(test_combo2, KC_TAB)
39}; 36};
@@ -41,17 +38,15 @@ combo_t key_combos[COMBO_COUNT] = {
41 38
42## Examples 39## Examples
43 40
44A long list of combos can be defined in an `enum` list that ends with `COMBO_LENGTH` and you can leave `COMBO_COUNT` undefined: 41A long list of combos can be defined in an `enum` list:
45 42
46```c 43```c
47enum combos { 44enum combos {
48 AB_ESC, 45 AB_ESC,
49 JK_TAB, 46 JK_TAB,
50 QW_SFT, 47 QW_SFT,
51 SD_LAYER, 48 SD_LAYER
52 COMBO_LENGTH
53}; 49};
54uint16_t COMBO_LEN = COMBO_LENGTH; // remove the COMBO_COUNT define and use this instead!
55 50
56const uint16_t PROGMEM ab_combo[] = {KC_A, KC_B, COMBO_END}; 51const uint16_t PROGMEM ab_combo[] = {KC_A, KC_B, COMBO_END};
57const uint16_t PROGMEM jk_combo[] = {KC_J, KC_K, COMBO_END}; 52const uint16_t PROGMEM jk_combo[] = {KC_J, KC_K, COMBO_END};
@@ -72,9 +67,7 @@ For a more complicated implementation, you can use the `process_combo_event` fun
72enum combo_events { 67enum combo_events {
73 EM_EMAIL, 68 EM_EMAIL,
74 BSPC_LSFT_CLEAR, 69 BSPC_LSFT_CLEAR,
75 COMBO_LENGTH
76}; 70};
77uint16_t COMBO_LEN = COMBO_LENGTH; // remove the COMBO_COUNT define and use this instead!
78 71
79const uint16_t PROGMEM email_combo[] = {KC_E, KC_M, COMBO_END}; 72const uint16_t PROGMEM email_combo[] = {KC_E, KC_M, COMBO_END};
80const uint16_t PROGMEM clear_line_combo[] = {KC_BSPC, KC_LSFT, COMBO_END}; 73const uint16_t PROGMEM clear_line_combo[] = {KC_BSPC, KC_LSFT, COMBO_END};
@@ -259,18 +252,6 @@ bool combo_should_trigger(uint16_t combo_index, combo_t *combo, uint16_t keycode
259} 252}
260``` 253```
261 254
262### Variable Length Combos
263If you leave `COMBO_COUNT` undefined in `config.h`, it allows you to programmatically declare the size of the Combo data structure and avoid updating `COMBO_COUNT`. Instead a variable called `COMBO_LEN` has to be set. It can be set with something similar to the following in `keymap.c`: `uint16_t COMBO_LEN = ARRAY_SIZE(key_combos);` or by adding `COMBO_LENGTH` as the *last* entry in the combo enum and then `uint16_t COMBO_LEN = COMBO_LENGTH;` as such:
264```c
265enum myCombos {
266 ...,
267 COMBO_LENGTH
268};
269uint16_t COMBO_LEN = COMBO_LENGTH;
270```
271Regardless of the method used to declare `COMBO_LEN`, this also requires to convert the `combo_t key_combos[COMBO_COUNT] = {...};` line to `combo_t key_combos[] = {...};`.
272
273
274### Combo timer 255### Combo timer
275 256
276Normally, the timer is started on the first key press and then reset on every subsequent key press within the `COMBO_TERM`. 257Normally, the timer is started on the first key press and then reset on every subsequent key press within the `COMBO_TERM`.
@@ -300,10 +281,8 @@ Here's an example where a combo resolves to two modifiers, and on key releases t
300 281
301```c 282```c
302enum combos { 283enum combos {
303 AB_MODS, 284 AB_MODS
304 COMBO_LENGTH
305}; 285};
306uint16_t COMBO_LEN = COMBO_LENGTH;
307 286
308const uint16_t PROGMEM ab_combo[] = {KC_A, KC_B, COMBO_END}; 287const uint16_t PROGMEM ab_combo[] = {KC_A, KC_B, COMBO_END};
309 288
@@ -415,6 +394,4 @@ SUBS(TH_THE, "the", KC_T, KC_H) // SUBS uses SEND_STRING to output the give
415... 394...
416``` 395```
417 396
418Now, you can update only one place to add or alter combos. You don't even need to remember to update the `COMBO_COUNT` or the `COMBO_LEN` variables at all. Everything is taken care of. Magic!
419
420For small to huge ready made dictionaries of combos, you can check out http://combos.gboards.ca/. 397For small to huge ready made dictionaries of combos, you can check out http://combos.gboards.ca/.
diff --git a/docs/feature_converters.md b/docs/feature_converters.md
index ec1f3915ee..b1abfa373a 100644
--- a/docs/feature_converters.md
+++ b/docs/feature_converters.md
@@ -20,11 +20,13 @@ Currently the following converters are available:
20| `promicro` | `rp2040_ce` | 20| `promicro` | `rp2040_ce` |
21| `promicro` | `elite_pi` | 21| `promicro` | `elite_pi` |
22| `promicro` | `helios` | 22| `promicro` | `helios` |
23| `promicro` | `liatris` |
23| `promicro` | `michi` | 24| `promicro` | `michi` |
24| `elite_c` | `stemcell` | 25| `elite_c` | `stemcell` |
25| `elite_c` | `rp2040_ce` | 26| `elite_c` | `rp2040_ce` |
26| `elite_c` | `elite_pi` | 27| `elite_c` | `elite_pi` |
27| `elite_c` | `helios` | 28| `elite_c` | `helios` |
29| `elite_c` | `liatris` |
28 30
29See below for more in depth information on each converter. 31See below for more in depth information on each converter.
30 32
@@ -87,6 +89,7 @@ If a board currently supported in QMK uses a [Pro Micro](https://www.sparkfun.co
87| [customMK Bonsai C4](https://shop.custommk.com/products/bonsai-c4-microcontroller-board) | `bonsai_c4` | 89| [customMK Bonsai C4](https://shop.custommk.com/products/bonsai-c4-microcontroller-board) | `bonsai_c4` |
88| [Elite-Pi](https://keeb.io/products/elite-pi-usb-c-pro-micro-replacement-rp2040) | `elite_pi` | 90| [Elite-Pi](https://keeb.io/products/elite-pi-usb-c-pro-micro-replacement-rp2040) | `elite_pi` |
89| [0xCB Helios](https://keeb.supply/products/0xcb-helios) | `helios` | 91| [0xCB Helios](https://keeb.supply/products/0xcb-helios) | `helios` |
92| [Liatris](https://splitkb.com/products/liatris) | `liatris` |
90| [Michi](https://github.com/ci-bus/michi-promicro-rp2040) | `michi` | 93| [Michi](https://github.com/ci-bus/michi-promicro-rp2040) | `michi` |
91 94
92Converter summary: 95Converter summary:
@@ -103,6 +106,7 @@ Converter summary:
103| `rp2040_ce` | `-e CONVERT_TO=rp2040_ce` | `CONVERT_TO=rp2040_ce` | `#ifdef CONVERT_TO_RP2040_CE` | 106| `rp2040_ce` | `-e CONVERT_TO=rp2040_ce` | `CONVERT_TO=rp2040_ce` | `#ifdef CONVERT_TO_RP2040_CE` |
104| `elite_pi` | `-e CONVERT_TO=elite_pi` | `CONVERT_TO=elite_pi` | `#ifdef CONVERT_TO_ELITE_PI` | 107| `elite_pi` | `-e CONVERT_TO=elite_pi` | `CONVERT_TO=elite_pi` | `#ifdef CONVERT_TO_ELITE_PI` |
105| `helios` | `-e CONVERT_TO=helios` | `CONVERT_TO=helios` | `#ifdef CONVERT_TO_HELIOS` | 108| `helios` | `-e CONVERT_TO=helios` | `CONVERT_TO=helios` | `#ifdef CONVERT_TO_HELIOS` |
109| `liatris` | `-e CONVERT_TO=liatris` | `CONVERT_TO=liatris` | `#ifdef CONVERT_TO_LIATRIS` |
106| `michi` | `-e CONVERT_TO=michi` | `CONVERT_TO=michi` | `#ifdef CONVERT_TO_MICHI` | 110| `michi` | `-e CONVERT_TO=michi` | `CONVERT_TO=michi` | `#ifdef CONVERT_TO_MICHI` |
107 111
108### Proton C :id=proton_c 112### Proton C :id=proton_c
@@ -167,7 +171,7 @@ The Bonsai C4 only has one on-board LED (B2), and by default, both the Pro Micro
167#define B0 PAL_LINE(GPIOA, 9) 171#define B0 PAL_LINE(GPIOA, 9)
168``` 172```
169 173
170### RP2040 Community Edition - Elite-Pi and Helios :id=rp2040_ce 174### RP2040 Community Edition - Elite-Pi, Helios, and Liatris :id=rp2040_ce
171 175
172Feature set currently identical to [Adafruit KB2040](#kb2040). 176Feature set currently identical to [Adafruit KB2040](#kb2040).
173 177
@@ -184,6 +188,7 @@ If a board currently supported in QMK uses an [Elite-C](https://keeb.io/products
184| [STeMCell](https://github.com/megamind4089/STeMCell) | `stemcell` | 188| [STeMCell](https://github.com/megamind4089/STeMCell) | `stemcell` |
185| [Elite-Pi](https://keeb.io/products/elite-pi-usb-c-pro-micro-replacement-rp2040) | `elite_pi` | 189| [Elite-Pi](https://keeb.io/products/elite-pi-usb-c-pro-micro-replacement-rp2040) | `elite_pi` |
186| [0xCB Helios](https://keeb.supply/products/0xcb-helios) | `helios` | 190| [0xCB Helios](https://keeb.supply/products/0xcb-helios) | `helios` |
191| [Liatris](https://splitkb.com/products/liatris) | `liatris` |
187 192
188Converter summary: 193Converter summary:
189 194
@@ -193,6 +198,7 @@ Converter summary:
193| `rp2040_ce` | `-e CONVERT_TO=rp2040_ce` | `CONVERT_TO=rp2040_ce` | `#ifdef CONVERT_TO_RP2040_CE` | 198| `rp2040_ce` | `-e CONVERT_TO=rp2040_ce` | `CONVERT_TO=rp2040_ce` | `#ifdef CONVERT_TO_RP2040_CE` |
194| `elite_pi` | `-e CONVERT_TO=elite_pi` | `CONVERT_TO=elite_pi` | `#ifdef CONVERT_TO_ELITE_PI` | 199| `elite_pi` | `-e CONVERT_TO=elite_pi` | `CONVERT_TO=elite_pi` | `#ifdef CONVERT_TO_ELITE_PI` |
195| `helios` | `-e CONVERT_TO=helios` | `CONVERT_TO=helios` | `#ifdef CONVERT_TO_HELIOS` | 200| `helios` | `-e CONVERT_TO=helios` | `CONVERT_TO=helios` | `#ifdef CONVERT_TO_HELIOS` |
201| `liatris` | `-e CONVERT_TO=liatris` | `CONVERT_TO=liatris` | `#ifdef CONVERT_TO_LIATRIS` |
196 202
197### STeMCell :id=stemcell_elite 203### STeMCell :id=stemcell_elite
198 204
diff --git a/docs/feature_dynamic_macros.md b/docs/feature_dynamic_macros.md
index f5a6952b6b..8ab1bad61c 100644
--- a/docs/feature_dynamic_macros.md
+++ b/docs/feature_dynamic_macros.md
@@ -59,7 +59,7 @@ There are a number of hooks that you can use to add custom functionality and fee
59 59
60Note, that direction indicates which macro it is, with `1` being Macro 1, `-1` being Macro 2, and 0 being no macro. 60Note, that direction indicates which macro it is, with `1` being Macro 1, `-1` being Macro 2, and 0 being no macro.
61 61
62* `dynamic_macro_record_start_user(void)` - Triggered when you start recording a macro. 62* `dynamic_macro_record_start_user(int8_t direction)` - Triggered when you start recording a macro.
63* `dynamic_macro_play_user(int8_t direction)` - Triggered when you play back a macro. 63* `dynamic_macro_play_user(int8_t direction)` - Triggered when you play back a macro.
64* `dynamic_macro_record_key_user(int8_t direction, keyrecord_t *record)` - Triggered on each keypress while recording a macro. 64* `dynamic_macro_record_key_user(int8_t direction, keyrecord_t *record)` - Triggered on each keypress while recording a macro.
65* `dynamic_macro_record_end_user(int8_t direction)` - Triggered when the macro recording is stopped. 65* `dynamic_macro_record_end_user(int8_t direction)` - Triggered when the macro recording is stopped.
diff --git a/docs/feature_encoders.md b/docs/feature_encoders.md
index 1c521a4eff..891baeefa1 100644
--- a/docs/feature_encoders.md
+++ b/docs/feature_encoders.md
@@ -81,7 +81,7 @@ Your `keymap.c` will then need an encoder mapping defined (for four layers and t
81 81
82```c 82```c
83#if defined(ENCODER_MAP_ENABLE) 83#if defined(ENCODER_MAP_ENABLE)
84const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = { 84const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
85 [_BASE] = { ENCODER_CCW_CW(KC_MS_WH_UP, KC_MS_WH_DOWN), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, 85 [_BASE] = { ENCODER_CCW_CW(KC_MS_WH_UP, KC_MS_WH_DOWN), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
86 [_LOWER] = { ENCODER_CCW_CW(RGB_HUD, RGB_HUI), ENCODER_CCW_CW(RGB_SAD, RGB_SAI) }, 86 [_LOWER] = { ENCODER_CCW_CW(RGB_HUD, RGB_HUI), ENCODER_CCW_CW(RGB_SAD, RGB_SAI) },
87 [_RAISE] = { ENCODER_CCW_CW(RGB_VAD, RGB_VAI), ENCODER_CCW_CW(RGB_SPD, RGB_SPI) }, 87 [_RAISE] = { ENCODER_CCW_CW(RGB_VAD, RGB_VAI), ENCODER_CCW_CW(RGB_SPD, RGB_SPI) },
@@ -102,9 +102,9 @@ Using encoder mapping pumps events through the normal QMK keycode processing pip
102 102
103## Callbacks 103## Callbacks
104 104
105When not using `ENCODER_MAP_ENABLE = yes`, the callback functions can be inserted into your `<keyboard>.c`: 105?> [**Default Behaviour**](https://github.com/qmk/qmk_firmware/blob/master/quantum/encoder.c#L79-#L98): all encoders installed will function as volume up (`KC_VOLU`) on clockwise rotation and volume down (`KC_VOLD`) on counter-clockwise rotation. If you do not wish to override this, no further configuration is necessary.
106 106
107?> Those who are adding new keyboard support where encoders are enabled at the keyboard level should include basic encoder functionality at the keyboard level (`<keyboard>.c`) using the `encoder_update_kb()` function, that way it works for QMK Configuator users and exists in general. 107If you would like the alter the default behaviour, and are not using `ENCODER_MAP_ENABLE = yes`, the callback functions can be inserted into your `<keyboard>.c`:
108 108
109```c 109```c
110bool encoder_update_kb(uint8_t index, bool clockwise) { 110bool encoder_update_kb(uint8_t index, bool clockwise) {
@@ -113,9 +113,9 @@ bool encoder_update_kb(uint8_t index, bool clockwise) {
113 } 113 }
114 if (index == 0) { /* First encoder */ 114 if (index == 0) { /* First encoder */
115 if (clockwise) { 115 if (clockwise) {
116 tap_code_delay(KC_VOLU, 10); 116 tap_code(KC_PGDN);
117 } else { 117 } else {
118 tap_code_delay(KC_VOLD, 10); 118 tap_code(KC_PGUP);
119 } 119 }
120 } else if (index == 1) { /* Second encoder */ 120 } else if (index == 1) { /* Second encoder */
121 if (clockwise) { 121 if (clockwise) {
@@ -134,9 +134,9 @@ or `keymap.c`:
134bool encoder_update_user(uint8_t index, bool clockwise) { 134bool encoder_update_user(uint8_t index, bool clockwise) {
135 if (index == 0) { /* First encoder */ 135 if (index == 0) { /* First encoder */
136 if (clockwise) { 136 if (clockwise) {
137 tap_code_delay(KC_VOLU, 10); 137 tap_code(KC_PGDN);
138 } else { 138 } else {
139 tap_code_delay(KC_VOLD, 10); 139 tap_code(KC_PGUP);
140 } 140 }
141 } else if (index == 1) { /* Second encoder */ 141 } else if (index == 1) { /* Second encoder */
142 if (clockwise) { 142 if (clockwise) {
@@ -149,7 +149,7 @@ bool encoder_update_user(uint8_t index, bool clockwise) {
149} 149}
150``` 150```
151 151
152!> If you return `true` in the keymap level `_user` function, it will allow the keyboard level encoder code to run on top of your own. Returning `false` will override the keyboard level function, if setup correctly. This is generally the safest option to avoid confusion. 152!> If you return `true` in the keymap level `_user` function, it will allow the keyboard/core level encoder code to run on top of your own. Returning `false` will override the keyboard level function, if setup correctly. This is generally the safest option to avoid confusion.
153 153
154## Hardware 154## Hardware
155 155
diff --git a/docs/feature_layers.md b/docs/feature_layers.md
index f8cb53eda4..8503603ffe 100644
--- a/docs/feature_layers.md
+++ b/docs/feature_layers.md
@@ -127,6 +127,54 @@ layer_state_t layer_state_set_user(layer_state_t state) {
127} 127}
128``` 128```
129 129
130### Example: Keycode to cycle through layers
131
132This example shows how to implement a custom keycode to cycle through a range of layers.
133
134```c
135// Define the keycode, `QK_USER` avoids collisions with existing keycodes
136enum keycodes {
137 KC_CYCLE_LAYERS = QK_USER,
138};
139
140// 1st layer on the cycle
141#define LAYER_CYCLE_START 0
142// Last layer on the cycle
143#define LAYER_CYCLE_END 4
144
145// Add the behaviour of this new keycode
146bool process_record_user(uint16_t keycode, keyrecord_t *record) {
147 switch (keycode) {
148 case KC_CYCLE_LAYERS:
149 // Our logic will happen on presses, nothing is done on releases
150 if (!record->event.pressed) {
151 // We've already handled the keycode (doing nothing), let QMK know so no further code is run unnecessarily
152 return false;
153 }
154
155 uint8_t current_layer = get_highest_layer(layer_state);
156
157 // Check if we are within the range, if not quit
158 if (curent_layer > LAYER_CYCLE_END || current_layer < LAYER_CYCLE_START) {
159 return false;
160 }
161
162 uint8_t next_layer = current_layer + 1;
163 if (next_layer > LAYER_CYCLE_END) {
164 next_layer = LAYER_CYCLE_START;
165 }
166 layer_move(next_layer);
167 return false;
168
169 // Process other keycodes normally
170 default:
171 return true;
172 }
173}
174
175// Place `KC_CYCLE_LAYERS` as a keycode in your keymap
176```
177
130Use the `IS_LAYER_ON_STATE(state, layer)` and `IS_LAYER_OFF_STATE(state, layer)` macros to check the status of a particular layer. 178Use the `IS_LAYER_ON_STATE(state, layer)` and `IS_LAYER_OFF_STATE(state, layer)` macros to check the status of a particular layer.
131 179
132Outside of `layer_state_set_*` functions, you can use the `IS_LAYER_ON(layer)` and `IS_LAYER_OFF(layer)` macros to check global layer state. 180Outside of `layer_state_set_*` functions, you can use the `IS_LAYER_ON(layer)` and `IS_LAYER_OFF(layer)` macros to check global layer state.
diff --git a/docs/feature_led_matrix.md b/docs/feature_led_matrix.md
index 1cde9b66e1..bc86099f1f 100644
--- a/docs/feature_led_matrix.md
+++ b/docs/feature_led_matrix.md
@@ -378,13 +378,7 @@ For inspiration and examples, check out the built-in effects under `quantum/led_
378 378
379## EEPROM storage :id=eeprom-storage 379## EEPROM storage :id=eeprom-storage
380 380
381The EEPROM for it is currently shared with the RGB Matrix system (it's generally assumed only one feature would be used at a time), but could be configured to use its own 32bit address with: 381The EEPROM for it is currently shared with the RGB Matrix system (it's generally assumed only one feature would be used at a time).
382
383```c
384#define EECONFIG_LED_MATRIX (uint32_t *)28
385```
386
387Where `28` is an unused index from `eeconfig.h`.
388 382
389### Direct Operation :id=direct-operation 383### Direct Operation :id=direct-operation
390|Function |Description | 384|Function |Description |
diff --git a/docs/feature_oled_driver.md b/docs/feature_oled_driver.md
index dea9cb8074..a62294b23a 100644
--- a/docs/feature_oled_driver.md
+++ b/docs/feature_oled_driver.md
@@ -2,15 +2,18 @@
2 2
3## Supported Hardware 3## Supported Hardware
4 4
5OLED modules using SSD1306 or SH1106 driver ICs, communicating over I2C. 5OLED modules using SSD1306, SH1106 or SH1107 driver ICs, communicating over I2C or SPI.
6Tested combinations: 6Tested combinations:
7 7
8|IC |Size |Platform|Notes | 8|IC |Size |Platform|Notes |
9|---------|------|--------|------------------------| 9|---------|-------|--------|------------------------|
10|SSD1306 |128x32|AVR |Primary support | 10|SSD1306 |128x32 |AVR |Primary support |
11|SSD1306 |128x64|AVR |Verified working | 11|SSD1306 |128x64 |AVR |Verified working |
12|SSD1306 |128x32|Arm | | 12|SSD1306 |128x32 |Arm | |
13|SH1106 |128x64|AVR |No rotation or scrolling| 13|SH1106 |128x64 |AVR |No scrolling |
14|SH1107 |64x128 |AVR |No scrolling |
15|SH1107 |64x128 |Arm |No scrolling |
16|SH1107 |128x128|Arm |No scrolling |
14 17
15Hardware configurations using Arm-based microcontrollers or different sizes of OLED modules may be compatible, but are untested. 18Hardware configurations using Arm-based microcontrollers or different sizes of OLED modules may be compatible, but are untested.
16 19
@@ -23,15 +26,26 @@ OLED_ENABLE = yes
23``` 26```
24 27
25## OLED type 28## OLED type
26|OLED Driver |Supported Device | 29
27|-------------------|---------------------------| 30|OLED Driver |Supported Device |
28|SSD1306 (default) |For both SSD1306 and SH1106| 31|-------------------|------------------------------------|
32|SSD1306 (default) |For both SSD1306, SH1106, and SH1107|
29 33
30e.g. 34e.g.
31```make 35```make
32OLED_DRIVER = SSD1306 36OLED_DRIVER = SSD1306
33``` 37```
34 38
39|OLED Transport | |
40|---------------|------------------------------------------------|
41|i2c (default) | Uses I2C for communication with the OLED panel |
42|spi | Uses SPI for communication with the OLED panel |
43
44e.g.
45```make
46OLED_TRANSPORT = i2c
47```
48
35Then in your `keymap.c` file, implement the OLED task call. This example assumes your keymap has three layers named `_QWERTY`, `_FN` and `_ADJ`: 49Then in your `keymap.c` file, implement the OLED task call. This example assumes your keymap has three layers named `_QWERTY`, `_FN` and `_ADJ`:
36 50
37```c 51```c
@@ -159,32 +173,57 @@ These configuration options should be placed in `config.h`. Example:
159#define OLED_BRIGHTNESS 128 173#define OLED_BRIGHTNESS 128
160``` 174```
161 175
176|Define |Default |Description |
177|---------------------------|-------------------------------|---------------------------------------------------------------------------------------------------------------------|
178|`OLED_BRIGHTNESS` |`255` |The default brightness level of the OLED, from 0 to 255. |
179|`OLED_COLUMN_OFFSET` |`0` |Shift output to the right this many pixels.<br />Useful for 128x64 displays centered on a 132x64 SH1106 IC. |
180|`OLED_DISPLAY_CLOCK` |`0x80` |Set the display clock divide ratio/oscillator frequency. |
181|`OLED_FONT_H` |`"glcdfont.c"` |The font code file to use for custom fonts |
182|`OLED_FONT_START` |`0` |The starting character index for custom fonts |
183|`OLED_FONT_END` |`223` |The ending character index for custom fonts |
184|`OLED_FONT_WIDTH` |`6` |The font width |
185|`OLED_FONT_HEIGHT` |`8` |The font height (untested) |
186|`OLED_IC` |`OLED_IC_SSD1306` |Set to `OLED_IC_SH1106` or `OLED_IC_SH1107` if the corresponding controller chip is used. |
187|`OLED_FADE_OUT` |*Not defined* |Enables fade out animation. Use together with `OLED_TIMEOUT`. |
188|`OLED_FADE_OUT_INTERVAL` |`0` |The speed of fade out animation, from 0 to 15. Larger values are slower. |
189|`OLED_SCROLL_TIMEOUT` |`0` |Scrolls the OLED screen after 0ms of OLED inactivity. Helps reduce OLED Burn-in. Set to 0 to disable. |
190|`OLED_SCROLL_TIMEOUT_RIGHT`|*Not defined* |Scroll timeout direction is right when defined, left when undefined. |
191|`OLED_TIMEOUT` |`60000` |Turns off the OLED screen after 60000ms of screen update inactivity. Helps reduce OLED Burn-in. Set to 0 to disable. |
192|`OLED_UPDATE_INTERVAL` |`0` (`50` for split keyboards) |Set the time interval for updating the OLED display in ms. This will improve the matrix scan rate. |
193|`OLED_UPDATE_PROCESS_LIMIT'|`1` |Set the number of dirty blocks to render per loop. Increasing may degrade performance. |
194
195### I2C Configuration
162|Define |Default |Description | 196|Define |Default |Description |
163|---------------------------|-----------------|--------------------------------------------------------------------------------------------------------------------------| 197|---------------------------|-----------------|--------------------------------------------------------------------------------------------------------------------------|
164|`OLED_DISPLAY_ADDRESS` |`0x3C` |The i2c address of the OLED Display | 198|`OLED_DISPLAY_ADDRESS` |`0x3C` |The i2c address of the OLED Display |
165|`OLED_FONT_H` |`"glcdfont.c"` |The font code file to use for custom fonts | 199
166|`OLED_FONT_START` |`0` |The starting character index for custom fonts | 200### SPI Configuration
167|`OLED_FONT_END` |`223` |The ending character index for custom fonts | 201
168|`OLED_FONT_WIDTH` |`6` |The font width | 202|Define |Default |Description |
169|`OLED_FONT_HEIGHT` |`8` |The font height (untested) | 203|---------------------------|-----------------|--------------------------------------------------------------------------------------------------------------------------|
170|`OLED_TIMEOUT` |`60000` |Turns off the OLED screen after 60000ms of screen update inactivity. Helps reduce OLED Burn-in. Set to 0 to disable. | 204|`OLED_DC_PIN` | Required |The pin used for the DC connection of the OLED Display. |
171|`OLED_FADE_OUT` |*Not defined* |Enables fade out animation. Use together with `OLED_TIMEOUT`. | 205|`OLED_CS_PIN` | Required |The pin used for the CS connection of the OLED Display. |
172|`OLED_FADE_OUT_INTERVAL` |`0` |The speed of fade out animation, from 0 to 15. Larger values are slower. | 206|`OLED_RST_PIN` | *Not defined* |The pin used for the RST connection of the OLED Display (may be left undefined if the RST pin is not connected). |
173|`OLED_SCROLL_TIMEOUT` |`0` |Scrolls the OLED screen after 0ms of OLED inactivity. Helps reduce OLED Burn-in. Set to 0 to disable. | 207|`OLED_SPI_MODE` |`3` (default) |The SPI Mode for the OLED Display (not typically changed). |
174|`OLED_SCROLL_TIMEOUT_RIGHT`|*Not defined* |Scroll timeout direction is right when defined, left when undefined. | 208|`OLED_SPI_DIVISOR` |`2` (default) |The SPI Multiplier to use for the OLED Display. |
175|`OLED_IC` |`OLED_IC_SSD1306`|Set to `OLED_IC_SH1106` if you're using the SH1106 OLED controller. | 209
176|`OLED_COLUMN_OFFSET` |`0` |(SH1106 only.) Shift output to the right this many pixels.<br />Useful for 128x64 displays centered on a 132x64 SH1106 IC.| 210## 128x64 & Custom sized OLED Displays
177|`OLED_BRIGHTNESS` |`255` |The default brightness level of the OLED, from 0 to 255. | 211
178|`OLED_UPDATE_INTERVAL` |`0` |Set the time interval for updating the OLED display in ms. This will improve the matrix scan rate. | 212 The default display size for this feature is 128x32, and the defaults are set with that in mind. However, there are a number of additional presets for common sizes that we have added. You can define one of these values to use the presets. If your display doesn't match one of these presets, you can define `OLED_DISPLAY_CUSTOM` to manually specify all of the values.
179 213
180 ## 128x64 & Custom sized OLED Displays 214|Define |Default |Description |
181 215|----------------------|---------------|---------------------------------------------------------------------------------------------------------------------------------------|
182 The default display size for this feature is 128x32 and all necessary defines are precalculated with that in mind. We have added a define, `OLED_DISPLAY_128X64`, to switch all the values to be used in a 128x64 display, as well as added a custom define, `OLED_DISPLAY_CUSTOM`, that allows you to provide the necessary values to the driver. 216|`OLED_DISPLAY_128X64` |*Not defined* |Changes the display defines for use with 128x64 displays. |
217|`OLED_DISPLAY_64X32` |*Not defined* |Changes the display defines for use with 64x32 displays. |
218|`OLED_DISPLAY_64X48` |*Not defined* |Changes the display defines for use with 64x48 displays. |
219|`OLED_DISPLAY_64X128` |*Not defined* |Changes the display defines for use with 64x128 displays. |
220|`OLED_DISPLAY_128X128`|*Not defined* |Changes the display defines for use with 128x128 displays. |
221|`OLED_DISPLAY_CUSTOM` |*Not defined* |Changes the display defines for use with custom displays.<br>Requires user to implement the below defines. |
222
223!> 64x128 and 128x128 displays default to the SH1107 IC type, as these heights are not supported by the other IC types.
183 224
184|Define |Default |Description | 225|Define |Default |Description |
185|---------------------|---------------|----------------------------------------------------------------------------------------------------------------------------------------| 226| --------------------|---------------|----------------------------------------------------------------------------------------------------------------------------------------|
186|`OLED_DISPLAY_128X64`|*Not defined* |Changes the display defines for use with 128x64 displays. |
187|`OLED_DISPLAY_CUSTOM`|*Not defined* |Changes the display defines for use with custom displays.<br>Requires user to implement the below defines. |
188|`OLED_DISPLAY_WIDTH` |`128` |The width of the OLED display. | 227|`OLED_DISPLAY_WIDTH` |`128` |The width of the OLED display. |
189|`OLED_DISPLAY_HEIGHT`|`32` |The height of the OLED display. | 228|`OLED_DISPLAY_HEIGHT`|`32` |The height of the OLED display. |
190|`OLED_MATRIX_SIZE` |`512` |The local buffer size to allocate.<br>`(OLED_DISPLAY_HEIGHT / 8 * OLED_DISPLAY_WIDTH)`. | 229|`OLED_MATRIX_SIZE` |`512` |The local buffer size to allocate.<br>`(OLED_DISPLAY_HEIGHT / 8 * OLED_DISPLAY_WIDTH)`. |
@@ -192,14 +231,13 @@ These configuration options should be placed in `config.h`. Example:
192|`OLED_BLOCK_COUNT` |`16` |The number of blocks the display is divided into for dirty rendering.<br>`(sizeof(OLED_BLOCK_TYPE) * 8)`. | 231|`OLED_BLOCK_COUNT` |`16` |The number of blocks the display is divided into for dirty rendering.<br>`(sizeof(OLED_BLOCK_TYPE) * 8)`. |
193|`OLED_BLOCK_SIZE` |`32` |The size of each block for dirty rendering<br>`(OLED_MATRIX_SIZE / OLED_BLOCK_COUNT)`. | 232|`OLED_BLOCK_SIZE` |`32` |The size of each block for dirty rendering<br>`(OLED_MATRIX_SIZE / OLED_BLOCK_COUNT)`. |
194|`OLED_COM_PINS` |`COM_PINS_SEQ` |How the SSD1306 chip maps it's memory to display.<br>Options are `COM_PINS_SEQ`, `COM_PINS_ALT`, `COM_PINS_SEQ_LR`, & `COM_PINS_ALT_LR`.| 233|`OLED_COM_PINS` |`COM_PINS_SEQ` |How the SSD1306 chip maps it's memory to display.<br>Options are `COM_PINS_SEQ`, `COM_PINS_ALT`, `COM_PINS_SEQ_LR`, & `COM_PINS_ALT_LR`.|
234|`OLED_COM_PIN_COUNT` |*Not defined* |Number of COM pins supported by the controller.<br>If not defined, the value appropriate for the defined `OLED_IC` is used. |
235|`OLED_COM_PIN_OFFSET`|`0` |Number of the first COM pin used by the OLED matrix. |
195|`OLED_SOURCE_MAP` |`{ 0, ... N }` |Precalculated source array to use for mapping source buffer to target OLED memory in 90 degree rendering. | 236|`OLED_SOURCE_MAP` |`{ 0, ... N }` |Precalculated source array to use for mapping source buffer to target OLED memory in 90 degree rendering. |
196|`OLED_TARGET_MAP` |`{ 24, ... N }`|Precalculated target array to use for mapping source buffer to target OLED memory in 90 degree rendering. | 237|`OLED_TARGET_MAP` |`{ 24, ... N }`|Precalculated target array to use for mapping source buffer to target OLED memory in 90 degree rendering. |
197 238
198
199### 90 Degree Rotation - Technical Mumbo Jumbo 239### 90 Degree Rotation - Technical Mumbo Jumbo
200 240
201!> Rotation is unsupported on the SH1106.
202
203```c 241```c
204// OLED Rotation enum values are flags 242// OLED Rotation enum values are flags
205typedef enum { 243typedef enum {
@@ -210,7 +248,7 @@ typedef enum {
210} oled_rotation_t; 248} oled_rotation_t;
211``` 249```
212 250
213OLED displays driven by SSD1306 drivers only natively support in hardware 0 degree and 180 degree rendering. This feature is done in software and not free. Using this feature will increase the time to calculate what data to send over i2c to the OLED. If you are strapped for cycles, this can cause keycodes to not register. In testing however, the rendering time on an ATmega32U4 board only went from 2ms to 5ms and keycodes not registering was only noticed once we hit 15ms. 251OLED displays driven by SSD1306, SH1106 or SH1107 drivers only natively support in hardware 0 degree and 180 degree rendering. This feature is done in software and not free. Using this feature will increase the time to calculate what data to send over i2c to the OLED. If you are strapped for cycles, this can cause keycodes to not register. In testing however, the rendering time on an ATmega32U4 board only went from 2ms to 5ms and keycodes not registering was only noticed once we hit 15ms.
214 252
21590 degree rotation is achieved by using bitwise operations to rotate each 8 block of memory and uses two precalculated arrays to remap buffer memory to OLED memory. The memory map defines are precalculated for remap performance and are calculated based on the display height, width, and block size. For example, in the 128x32 implementation with a `uint8_t` block type, we have a 64 byte block size. This gives us eight 8 byte blocks that need to be rotated and rendered. The OLED renders horizontally two 8 byte blocks before moving down a page, e.g: 25390 degree rotation is achieved by using bitwise operations to rotate each 8 block of memory and uses two precalculated arrays to remap buffer memory to OLED memory. The memory map defines are precalculated for remap performance and are calculated based on the display height, width, and block size. For example, in the 128x32 implementation with a `uint8_t` block type, we have a 64 byte block size. This gives us eight 8 byte blocks that need to be rotated and rendered. The OLED renders horizontally two 8 byte blocks before moving down a page, e.g:
216 254
@@ -232,6 +270,8 @@ However the local buffer is stored as if it was Height x Width display instead o
232 270
233So those precalculated arrays just index the memory offsets in the order in which each one iterates its data. 271So those precalculated arrays just index the memory offsets in the order in which each one iterates its data.
234 272
273Rotation on SH1106 and SH1107 is noticeably less efficient than on SSD1306, because these controllers do not support the “horizontal addressing mode”, which allows transferring the data for the whole rotated block at once; instead, separate address setup commands for every page in the block are required. The screen refresh time for SH1107 is therefore about 45% higher than for a same size screen with SSD1306 when using STM32 MCUs (on AVR the slowdown is about 20%, because the code which actually rotates the bitmap consumes more time).
274
235## OLED API 275## OLED API
236 276
237```c 277```c
@@ -253,6 +293,11 @@ bool oled_init(oled_rotation_t rotation);
253oled_rotation_t oled_init_kb(oled_rotation_t rotation); 293oled_rotation_t oled_init_kb(oled_rotation_t rotation);
254oled_rotation_t oled_init_user(oled_rotation_t rotation); 294oled_rotation_t oled_init_user(oled_rotation_t rotation);
255 295
296// Send commands/data to screen
297bool oled_send_cmd(const uint8_t *data, uint16_t size);
298bool oled_send_cmd_P(const uint8_t *data, uint16_t size);
299bool oled_send_data(const uint8_t *data, uint16_t size);
300
256// Clears the display buffer, resets cursor position to 0, and sets the buffer to dirty for rendering 301// Clears the display buffer, resets cursor position to 0, and sets the buffer to dirty for rendering
257void oled_clear(void); 302void oled_clear(void);
258 303
@@ -386,7 +431,9 @@ uint8_t oled_max_chars(void);
386uint8_t oled_max_lines(void); 431uint8_t oled_max_lines(void);
387``` 432```
388 433
389!> Scrolling and rotation are unsupported on the SH1106. 434!> Scrolling is unsupported on the SH1106 and SH1107.
435
436!> Scrolling does not work properly on the SSD1306 if the display width is smaller than 128.
390 437
391## SSD1306.h Driver Conversion Guide 438## SSD1306.h Driver Conversion Guide
392 439
diff --git a/docs/feature_pointing_device.md b/docs/feature_pointing_device.md
index 4da5d64a1a..909eff826d 100644
--- a/docs/feature_pointing_device.md
+++ b/docs/feature_pointing_device.md
@@ -197,6 +197,24 @@ The Pimoroni Trackball module is a I2C based breakout board with an RGB enable t
197| `PIMORONI_TRACKBALL_DEBOUNCE_CYCLES` | (Optional) The number of scan cycles used for debouncing on the ball press. | `20` | 197| `PIMORONI_TRACKBALL_DEBOUNCE_CYCLES` | (Optional) The number of scan cycles used for debouncing on the ball press. | `20` |
198| `PIMORONI_TRACKBALL_ERROR_COUNT` | (Optional) Specifies the number of read/write errors until the sensor is disabled. | `10` | 198| `PIMORONI_TRACKBALL_ERROR_COUNT` | (Optional) Specifies the number of read/write errors until the sensor is disabled. | `10` |
199 199
200### PMW3320 Sensor
201
202To use the PMW3320 sensor, add this to your `rules.mk`
203
204```make
205POINTING_DEVICE_DRIVER = pmw3320
206```
207
208The PMW3320 sensor uses a serial type protocol for communication, and requires an additional light source (it could work without one, but expect it to be out of service early).
209
210| Setting | Description | Default |
211| ------------------- | ------------------------------------------------------------------- | -------------------------- |
212| `PMW3320_SCLK_PIN` | (Required) The pin connected to the clock pin of the sensor. | `POINTING_DEVICE_SCLK_PIN` |
213| `PMW3320_SDIO_PIN` | (Required) The pin connected to the data pin of the sensor. | `POINTING_DEVICE_SDIO_PIN` |
214| `PMW3320_CS_PIN` | (Required) The pin connected to the cable select pin of the sensor. | `POINTING_DEVICE_CS_PIN` |
215
216The CPI range is 500-3500, in increments of 250. Defaults to 1000 CPI.
217
200### PMW 3360 and PMW 3389 Sensor 218### PMW 3360 and PMW 3389 Sensor
201 219
202This drivers supports both the PMW 3360 and PMW 3389 sensor as well as multiple sensors of the same type _per_ controller, so 2 can be attached at the same side for split keyboards (or unsplit keyboards). 220This drivers supports both the PMW 3360 and PMW 3389 sensor as well as multiple sensors of the same type _per_ controller, so 2 can be attached at the same side for split keyboards (or unsplit keyboards).
@@ -671,6 +689,10 @@ There are several functions that allow for more advanced interaction with the au
671| `auto_mouse_layer_off(void)` | Disable target layer if appropriate will call (makes call to `layer_state_set`) | | `void`(None) | 689| `auto_mouse_layer_off(void)` | Disable target layer if appropriate will call (makes call to `layer_state_set`) | | `void`(None) |
672| `auto_mouse_toggle(void)` | Toggle on/off target toggle state (disables layer deactivation when true) | | `void`(None) | 690| `auto_mouse_toggle(void)` | Toggle on/off target toggle state (disables layer deactivation when true) | | `void`(None) |
673| `get_auto_mouse_toggle(void)` | Return value of toggling state variable | | `bool` | 691| `get_auto_mouse_toggle(void)` | Return value of toggling state variable | | `bool` |
692| `set_auto_mouse_timeout(uint16_t timeout)` | Change/set the timeout for turing off the layer | | `void`(None) |
693| `get_auto_mouse_timeout(void)` | Return the current timeout for turing off the layer | | `uint16_t` |
694| `set_auto_mouse_debounce(uint16_t timeout)` | Change/set the debounce for preventing layer activation | | `void`(None) |
695| `get_auto_mouse_debounce(void)` | Return the current debounce for preventing layer activation | | `uint8_t` |
674 696
675_NOTES:_ 697_NOTES:_
676 - _Due to the nature of how some functions work, the `auto_mouse_trigger_reset`, and `auto_mouse_layer_off` functions should never be called in the `layer_state_set_*` stack as this can cause indefinite loops._ 698 - _Due to the nature of how some functions work, the `auto_mouse_trigger_reset`, and `auto_mouse_layer_off` functions should never be called in the `layer_state_set_*` stack as this can cause indefinite loops._
@@ -782,7 +804,7 @@ _Note: The Cirque pinnacle track pad already implements a custom activation func
782When using a custom pointing device (overwriting `pointing_device_task`) the following code should be somewhere in the `pointing_device_task_*` stack: 804When using a custom pointing device (overwriting `pointing_device_task`) the following code should be somewhere in the `pointing_device_task_*` stack:
783 805
784```c 806```c
785void pointing_device_task(void) { 807bool pointing_device_task(void) {
786 //...Custom pointing device task code 808 //...Custom pointing device task code
787 809
788 // handle automatic mouse layer (needs report_mouse_t as input) 810 // handle automatic mouse layer (needs report_mouse_t as input)
@@ -790,7 +812,7 @@ void pointing_device_task(void) {
790 812
791 //...More custom pointing device task code 813 //...More custom pointing device task code
792 814
793 pointing_device_send(); 815 return pointing_device_send();
794} 816}
795``` 817```
796 818
diff --git a/docs/feature_repeat_key.md b/docs/feature_repeat_key.md
new file mode 100644
index 0000000000..6fa8a724ef
--- /dev/null
+++ b/docs/feature_repeat_key.md
@@ -0,0 +1,457 @@
1# Repeat Key
2
3The Repeat Key performs the action of the last pressed key. Tapping the Repeat
4Key after tapping the <kbd>Z</kbd> key types another "`z`." This is useful for
5typing doubled letters, like the `z` in "`dazzle`": a double tap on <kbd>Z</kbd>
6can instead be a roll from <kbd>Z</kbd> to <kbd>Repeat</kbd>, which is
7potentially faster and more comfortable. The Repeat Key is also useful for
8hotkeys, like repeating Ctrl + Shift + Right Arrow to select by word.
9
10Repeat Key remembers mods that were active with the last key press. These mods
11are combined with any additional mods while pressing the Repeat Key. If the last
12press key was <kbd>Ctrl</kbd> + <kbd>Z</kbd>, then <kbd>Shift</kbd> +
13<kbd>Repeat</kbd> performs Ctrl + Shift + `Z`.
14
15## How do I enable Repeat Key
16
17In your `rules.mk`, add:
18
19```make
20REPEAT_KEY_ENABLE = yes
21```
22
23Then pick a key in your keymap and assign it the keycode `QK_REPEAT_KEY` (short
24alias `QK_REP`). Optionally, use the keycode `QK_ALT_REPEAT_KEY` (short alias
25`QK_AREP`) on another key.
26
27## Keycodes
28
29|Keycode |Aliases |Description |
30|-----------------------|---------|-------------------------------------|
31|`QK_REPEAT_KEY` |`QK_REP` |Repeat the last pressed key |
32|`QK_ALT_REPEAT_KEY` |`QK_AREP`|Perform alternate of the last key |
33
34## Alternate Repeating
35
36The Alternate Repeat Key performs the "alternate" action of the last pressed key
37if it is defined. By default, Alternate Repeat is defined for navigation keys to
38act in the reverse direction. When the last key is the common "select by word"
39hotkey Ctrl + Shift + Right Arrow, the Alternate Repeat Key performs Ctrl +
40Shift + Left Arrow, which together with the Repeat Key enables convenient
41selection by words in either direction.
42
43Alternate Repeat is enabled with the Repeat Key by default. Optionally, to
44reduce firmware size, Alternate Repeat may be disabled by adding in config.h:
45
46```c
47#define NO_ALT_REPEAT_KEY
48```
49
50The following alternate keys are defined by default. See
51`get_alt_repeat_key_keycode_user()` below for how to change or add to these
52definitions. Where it makes sense, these definitions also include combinations
53with mods, like Ctrl + Left &harr; Ctrl + Right Arrow.
54
55**Navigation**
56
57|Keycodes |Description |
58|-----------------------------------|-----------------------------------|
59|`KC_LEFT` &harr; `KC_RGHT` | Left &harr; Right Arrow |
60|`KC_UP` &harr; `KC_DOWN` | Up &harr; Down Arrow |
61|`KC_HOME` &harr; `KC_END` | Home &harr; End |
62|`KC_PGUP` &harr; `KC_PGDN` | Page Up &harr; Page Down |
63|`KC_MS_L` &harr; `KC_MS_R` | Mouse Cursor Left &harr; Right |
64|`KC_MS_U` &harr; `KC_MS_D` | Mouse Cursor Up &harr; Down |
65|`KC_WH_L` &harr; `KC_WH_R` | Mouse Wheel Left &harr; Right |
66|`KC_WH_U` &harr; `KC_WH_D` | Mouse Wheel Up &harr; Down |
67
68**Misc**
69
70|Keycodes |Description |
71|-----------------------------------|-----------------------------------|
72|`KC_BSPC` &harr; `KC_DEL` | Backspace &harr; Delete |
73|`KC_LBRC` &harr; `KC_RBRC` | `[` &harr; `]` |
74|`KC_LCBR` &harr; `KC_RCBR` | `{` &harr; `}` |
75
76**Media**
77
78|Keycodes |Description |
79|-----------------------------------|-----------------------------------|
80|`KC_WBAK` &harr; `KC_WFWD` | Browser Back &harr; Forward |
81|`KC_MNXT` &harr; `KC_MPRV` | Next &harr; Previous Media Track |
82|`KC_MFFD` &harr; `KC_MRWD` | Fast Forward &harr; Rewind Media |
83|`KC_VOLU` &harr; `KC_VOLD` | Volume Up &harr; Down |
84|`KC_BRIU` &harr; `KC_BRID` | Brightness Up &harr; Down |
85
86**Hotkeys in Vim, Emacs, and other programs**
87
88|Keycodes |Description |
89|-----------------------------------|-----------------------------------|
90|mod + `KC_F` &harr; mod + `KC_B` | Forward &harr; Backward |
91|mod + `KC_D` &harr; mod + `KC_U` | Down &harr; Up |
92|mod + `KC_N` &harr; mod + `KC_P` | Next &harr; Previous |
93|mod + `KC_A` &harr; mod + `KC_E` | Home &harr; End |
94|mod + `KC_O` &harr; mod + `KC_I` | Vim jump list Older &harr; Newer |
95|`KC_J` &harr; `KC_K` | Down &harr; Up |
96|`KC_H` &harr; `KC_L` | Left &harr; Right |
97|`KC_W` &harr; `KC_B` | Forward &harr; Backward by Word |
98
99(where above, "mod" is Ctrl, Alt, or GUI)
100
101
102## Defining alternate keys
103
104Use the `get_alt_repeat_key_keycode_user()` callback to define the "alternate"
105for additional keys or override the default definitions. For example, to define
106Ctrl + Y as the alternate of Ctrl + Z, and vice versa, add the following in
107keymap.c:
108
109```c
110uint16_t get_alt_repeat_key_keycode_user(uint16_t keycode, uint8_t mods) {
111 if ((mods & MOD_MASK_CTRL)) { // Was Ctrl held?
112 switch (keycode) {
113 case KC_Y: return C(KC_Z); // Ctrl + Y reverses to Ctrl + Z.
114 case KC_Z: return C(KC_Y); // Ctrl + Z reverses to Ctrl + Y.
115 }
116 }
117
118 return KC_TRNS; // Defer to default definitions.
119}
120```
121
122The `keycode` and `mods` args are the keycode and mods that were active with the
123last pressed key. The meaning of the return value from this function is:
124
125* `KC_NO` &ndash; do nothing (any predefined alternate key is not used);
126* `KC_TRNS` &ndash; use the default alternate key if it exists;
127* anything else &ndash; use the specified keycode. Any keycode may be returned
128 as an alternate key, including custom keycodes.
129
130Another example, defining Shift + Tab as the alternate of Tab, and vice versa:
131
132```c
133uint16_t get_alt_repeat_key_keycode_user(uint16_t keycode, uint8_t mods) {
134 bool shifted = (mods & MOD_MASK_SHIFT); // Was Shift held?
135 switch (keycode) {
136 case KC_TAB:
137 if (shifted) { // If the last key was Shift + Tab,
138 return KC_TAB; // ... the reverse is Tab.
139 } else { // Otherwise, the last key was Tab,
140 return S(KC_TAB); // ... and the reverse is Shift + Tab.
141 }
142 }
143
144 return KC_TRNS;
145}
146```
147
148#### Eliminating SFBs
149
150Alternate Repeat can be configured more generally to perform an action that
151"complements" the last key. Alternate Repeat is not limited to reverse
152repeating, and it need not be symmetric. You can use it to eliminate cases of
153same-finger bigrams in your layout, that is, pairs of letters typed by the same
154finger. The following addresses the top 5 same-finger bigrams in English on
155QWERTY, so that for instance "`ed`" may be typed as <kbd>E</kbd>, <kbd>Alt
156Repeat</kbd>.
157
158```c
159uint16_t get_alt_repeat_key_keycode_user(uint16_t keycode, uint8_t mods) {
160 switch (keycode) {
161 case KC_E: return KC_D; // For "ED" bigram.
162 case KC_D: return KC_E; // For "DE" bigram.
163 case KC_C: return KC_E; // For "CE" bigram.
164 case KC_L: return KC_O; // For "LO" bigram.
165 case KC_U: return KC_N; // For "UN" bigram.
166 }
167
168 return KC_TRNS;
169}
170```
171
172#### Typing shortcuts
173
174A useful possibility is having Alternate Repeat press [a
175macro](feature_macros.md). This way macros can be used without having to
176dedicate keys to them. The following defines a couple shortcuts.
177
178* Typing <kbd>K</kbd>, <kbd>Alt Repeat</kbd> produces "`keyboard`," with the
179 initial "`k`" typed as usual and the "`eybord`" produced by the macro.
180* Typing <kbd>.</kbd>, <kbd>Alt Repeat</kbd> produces "`../`," handy for "up
181 directory" on the shell. Similary, <kbd>.</kbd> types the initial "`.`" and
182 "`./`" is produced by the macro.
183
184```c
185enum custom_keycodes {
186 M_KEYBOARD = SAFE_RANGE,
187 M_UPDIR,
188 // Other custom keys...
189};
190
191uint16_t get_alt_repeat_key_keycode_user(uint16_t keycode, uint8_t mods) {
192 switch (keycode) {
193 case KC_K: return M_KEYBOARD;
194 case KC_DOT: return M_UPDIR;
195 }
196
197 return KC_TRNS;
198}
199
200bool process_record_user(uint16_t keycode, keyrecord_t* record) {
201 switch (keycode) {
202 case M_KEYBOARD: SEND_STRING(/*k*/"eyboard"); break;
203 case M_UPDIR: SEND_STRING(/*.*/"./"); break;
204 }
205 return true;
206}
207```
208
209## Ignoring certain keys and mods
210
211In tracking what is "the last key" to be repeated or alternate repeated,
212modifier and layer switch keys are always ignored. This makes it possible to set
213some mods and change layers between pressing a key and repeating it. By default,
214all other (non-modifier, non-layer switch) keys are remembered so that they are
215eligible for repeating. To configure additional keys to be ignored, define
216`remember_last_key_user()` in your keymap.c.
217
218#### Ignoring a key
219
220The following ignores the Backspace key:
221
222```c
223bool remember_last_key_user(uint16_t keycode, keyrecord_t* record,
224 uint8_t* remembered_mods) {
225 switch (keycode) {
226 case KC_BSPC:
227 return false; // Ignore backspace.
228 }
229
230 return true; // Other keys can be repeated.
231}
232```
233
234Then for instance, the Repeat key in <kbd>Left Arrow</kbd>,
235<kbd>Backspace</kbd>, <kbd>Repeat</kbd> sends Left Arrow again instead of
236repeating Backspace.
237
238The `remember_last_key_user()` callback is called on every key press excluding
239modifiers and layer switches. Returning true indicates the key is remembered,
240while false means it is ignored.
241
242#### Filtering remembered mods
243
244The `remembered_mods` arg represents the mods that will be remembered with
245this key. It can be modified to forget certain mods. This may be
246useful to forget capitalization when repeating shifted letters, so that "Aaron"
247does not becom "AAron":
248
249```c
250bool remember_last_key_user(uint16_t keycode, keyrecord_t* record,
251 uint8_t* remembered_mods) {
252 // Forget Shift on letter keys when Shift or AltGr are the only mods.
253 switch (keycode) {
254 case KC_A ... KC_Z:
255 if ((*remembered_mods & ~(MOD_MASK_SHIFT | MOD_BIT(KC_RALT))) == 0) {
256 *remembered_mods &= ~MOD_MASK_SHIFT;
257 }
258 break;
259 }
260
261 return true;
262}
263```
264
265#### Further conditions
266
267Besides checking the keycode, this callback could also make conditions based on
268the current layer state (with `IS_LAYER_ON(layer)`) or mods (`get_mods()`). For
269example, the following ignores keys on layer 2 as well as key combinations
270involving GUI:
271
272```c
273bool remember_last_key_user(uint16_t keycode, keyrecord_t* record,
274 uint8_t* remembered_mods) {
275 if (IS_LAYER_ON(2) || (get_mods() & MOD_MASK_GUI)) {
276 return false; // Ignore layer 2 keys and GUI chords.
277 }
278
279 return true; // Other keys can be repeated.
280}
281```
282
283?> See [Layer Functions](feature_layers.md#functions) and [Checking Modifier
284State](feature_advanced_keycodes.md#checking-modifier-state) for further
285details.
286
287
288## Handle how a key is repeated
289
290By default, pressing the Repeat Key will simply behave as if the last key
291were pressed again. This also works with macro keys with custom handlers,
292invoking the macro again. In case fine-tuning is needed for sensible repetition,
293you can handle how a key is repeated with `get_repeat_key_count()` within
294`process_record_user()`.
295
296The `get_repeat_key_count()` function returns a signed count of times the key
297has been repeated or alternate repeated. When a key is pressed as usual,
298`get_repeat_key_count()` is 0. On the first repeat, it is 1, then the second
299repeat, 2, and so on. Negative counts are used similarly for alternate
300repeating. For instance supposing `MY_MACRO` is a custom keycode used in the
301layout:
302
303```c
304bool process_record_user(uint16_t keycode, keyrecord_t* record) {
305 switch (keycode) {
306 case MY_MACRO:
307 if (get_repeat_key_count() > 0) {
308 // MY_MACRO is being repeated!
309 if (record->event.pressed) {
310 SEND_STRING("repeat!");
311 }
312 } else {
313 // MY_MACRO is being used normally.
314 if (record->event.pressed) {
315 SEND_STRING("macro");
316 }
317 }
318 return false;
319
320 // Other macros...
321 }
322 return true;
323}
324```
325
326## Handle how a key is alternate repeated
327
328Pressing the Alternate Repeat Key behaves as if the "alternate" of the last
329pressed key were pressed, if an alternate is defined. To define how a particular
330key is alternate repeated, use the `get_alt_repeat_key_keycode_user()` callback
331as described above to define which keycode to use as its alternate. Beyond this,
332`get_repeat_key_count()` may be used in custom handlers to fine-tune behavior
333when alternate repeating.
334
335The following example defines `MY_MACRO` as its own alternate, and specially
336handles repeating and alternate repeating:
337
338```c
339uint16_t get_alt_repeat_key_keycode_user(uint16_t keycode, uint8_t mods) {
340 switch (keycode) {
341 case MY_MACRO: return MY_MACRO; // MY_MACRO is its own alternate.
342 }
343 return KC_TRNS;
344}
345
346bool process_record_user(uint16_t keycode, keyrecord_t* record) {
347 switch (keycode) {
348 case MY_MACRO:
349 if (get_repeat_key_count() > 0) { // Repeating.
350 if (record->event.pressed) {
351 SEND_STRING("repeat!");
352 }
353 } else if (get_repeat_key_count() < 0) { // Alternate repeating.
354 if (record->event.pressed) {
355 SEND_STRING("alt repeat!");
356 }
357 } else { // Used normally.
358 if (record->event.pressed) {
359 SEND_STRING("macro");
360 }
361 }
362 return false;
363
364 // Other macros...
365 }
366 return true;
367}
368```
369
370
371## Functions
372
373| Function | Description |
374|--------------------------------|------------------------------------------------------------------------|
375| `get_last_keycode()` | The last key's keycode, the key to be repeated. |
376| `get_last_mods()` | Mods to apply when repeating. |
377| `set_last_keycode(kc)` | Set the keycode to be repeated. |
378| `set_last_mods(mods)` | Set the mods to apply when repeating. |
379| `get_repeat_key_count()` | Signed count of times the key has been repeated or alternate repeated. |
380| `get_alt_repeat_key_keycode()` | Keycode to be used for alternate repeating. |
381
382
383## Additional "Alternate" keys
384
385By leveraging `get_last_keycode()` in macros, it is possible to define
386additional, distinct "Alternate Repeat"-like keys. The following defines two
387keys `ALTREP2` and `ALTREP3` and implements ten shortcuts with them for common
388English 5-gram letter patterns, taking inspiration from
389[Stenotype](feature_stenography.md):
390
391
392| Typing | Produces | Typing | Produces |
393|----------------------------------|----------|----------------------------------|----------|
394| <kbd>A</kbd>, <kbd>ALTREP2</kbd> | `ation` | <kbd>A</kbd>, <kbd>ALTREP3</kbd> | `about` |
395| <kbd>I</kbd>, <kbd>ALTREP2</kbd> | `ition` | <kbd>I</kbd>, <kbd>ALTREP3</kbd> | `inter` |
396| <kbd>S</kbd>, <kbd>ALTREP2</kbd> | `ssion` | <kbd>S</kbd>, <kbd>ALTREP3</kbd> | `state` |
397| <kbd>T</kbd>, <kbd>ALTREP2</kbd> | `their` | <kbd>T</kbd>, <kbd>ALTREP3</kbd> | `there` |
398| <kbd>W</kbd>, <kbd>ALTREP2</kbd> | `which` | <kbd>W</kbd>, <kbd>ALTREP3</kbd> | `would` |
399
400```c
401enum custom_keycodes {
402 ALTREP2 = SAFE_RANGE,
403 ALTREP3,
404};
405
406// Use ALTREP2 and ALTREP3 in your layout...
407
408bool remember_last_key_user(uint16_t keycode, keyrecord_t* record,
409 uint8_t* remembered_mods) {
410 switch (keycode) {
411 case ALTREP2:
412 case ALTREP3:
413 return false; // Ignore ALTREP keys.
414 }
415
416 return true; // Other keys can be repeated.
417}
418
419static void process_altrep2(uint16_t keycode, uint8_t mods) {
420 switch (keycode) {
421 case KC_A: SEND_STRING(/*a*/"tion"); break;
422 case KC_I: SEND_STRING(/*i*/"tion"); break;
423 case KC_S: SEND_STRING(/*s*/"sion"); break;
424 case KC_T: SEND_STRING(/*t*/"heir"); break;
425 case KC_W: SEND_STRING(/*w*/"hich"); break;
426 }
427}
428
429static void process_altrep3(uint16_t keycode, uint8_t mods) {
430 switch (keycode) {
431 case KC_A: SEND_STRING(/*a*/"bout"); break;
432 case KC_I: SEND_STRING(/*i*/"nter"); break;
433 case KC_S: SEND_STRING(/*s*/"tate"); break;
434 case KC_T: SEND_STRING(/*t*/"here"); break;
435 case KC_W: SEND_STRING(/*w*/"ould"); break;
436 }
437}
438
439bool process_record_user(uint16_t keycode, keyrecord_t* record) {
440 switch (keycode) {
441 case ALTREP2:
442 if (record->event.pressed) {
443 process_altrep2(get_last_keycode(), get_last_mods());
444 }
445 return false;
446
447 case ALTREP3:
448 if (record->event.pressed) {
449 process_altrep3(get_last_keycode(), get_last_mods());
450 }
451 return false;
452 }
453
454 return true;
455}
456```
457
diff --git a/docs/feature_rgb_matrix.md b/docs/feature_rgb_matrix.md
index 20ad4c7faf..75f07b5e64 100644
--- a/docs/feature_rgb_matrix.md
+++ b/docs/feature_rgb_matrix.md
@@ -156,6 +156,82 @@ const is31_led PROGMEM g_is31_leds[RGB_MATRIX_LED_COUNT] = {
156Where `X_Y` is the location of the LED in the matrix defined by [the datasheet](https://www.issi.com/WW/pdf/31FL3733.pdf) and the header file `drivers/led/issi/is31fl3733.h`. The `driver` is the index of the driver you defined in your `config.h` (`0`, `1`, `2`, or `3` for now). 156Where `X_Y` is the location of the LED in the matrix defined by [the datasheet](https://www.issi.com/WW/pdf/31FL3733.pdf) and the header file `drivers/led/issi/is31fl3733.h`. The `driver` is the index of the driver you defined in your `config.h` (`0`, `1`, `2`, or `3` for now).
157 157
158--- 158---
159### IS31FL3736 :id=is31fl3736
160
161There is basic support for addressable RGB matrix lighting with the I2C IS31FL3736 RGB controller. To enable it, add this to your `rules.mk`:
162
163```make
164RGB_MATRIX_ENABLE = yes
165RGB_MATRIX_DRIVER = IS31FL3736
166```
167You can use between 1 and 4 IS31FL3736 IC's. Do not specify `DRIVER_ADDR_<N>` defines for IC's that are not present on your keyboard.
168
169Configure the hardware via your `config.h`:
170
171| Variable | Description | Default |
172|----------|-------------|---------|
173| `ISSI_TIMEOUT` | (Optional) How long to wait for i2c messages, in milliseconds | 100 |
174| `ISSI_PERSISTENCE` | (Optional) Retry failed messages this many times | 0 |
175| `ISSI_PWM_FREQUENCY` | (Optional) PWM Frequency Setting - IS31FL3736B only | 0 |
176| `ISSI_GLOBALCURRENT` | (Optional) Configuration for the Global Current Register | 0xFF |
177| `ISSI_SWPULLUP` | (Optional) Set the value of the SWx lines on-chip de-ghosting resistors | PUR_0R (Disabled) |
178| `ISSI_CSPULLUP` | (Optional) Set the value of the CSx lines on-chip de-ghosting resistors | PUR_0R (Disabled) |
179| `DRIVER_COUNT` | (Required) How many RGB driver IC's are present | |
180| `RGB_MATRIX_LED_COUNT` | (Required) How many RGB lights are present across all drivers | |
181| `DRIVER_ADDR_1` | (Required) Address for the first RGB driver | |
182| `DRIVER_ADDR_2` | (Optional) Address for the second RGB driver | |
183| `DRIVER_ADDR_3` | (Optional) Address for the third RGB driver | |
184| `DRIVER_ADDR_4` | (Optional) Address for the fourth RGB driver | |
185
186The IS31FL3736 IC's have on-chip resistors that can be enabled to allow for de-ghosting of the RGB matrix. By default these resistors are not enabled (`ISSI_SWPULLUP`/`ISSI_CSPULLUP` are given the value of`PUR_0R`), the values that can be set to enable de-ghosting are as follows:
187
188| `ISSI_SWPULLUP/ISSI_CSPULLUP` | Description |
189|----------------------|-------------|
190| `PUR_0R` | (default) Do not use the on-chip resistors/enable de-ghosting |
191| `PUR_05KR` | The 0.5k Ohm resistor used during blanking period (t_NOL) |
192| `PUR_1KR` | The 1k Ohm resistor used during blanking period (t_NOL) |
193| `PUR_2KR` | The 2k Ohm resistor used during blanking period (t_NOL) |
194| `PUR_4KR` | The 4k Ohm resistor used during blanking period (t_NOL) |
195| `PUR_8KR` | The 8k Ohm resistor during blanking period (t_NOL) |
196| `PUR_16KR` | The 16k Ohm resistor during blanking period (t_NOL) |
197| `PUR_32KR` | The 32k Ohm resistor used during blanking period (t_NOL) |
198
199Here is an example using 2 drivers.
200
201```c
202// This is a 7-bit address, that gets left-shifted and bit 0
203// set to 0 for write, 1 for read (as per I2C protocol)
204// The address will vary depending on your wiring:
205// 0000 <-> GND
206// 0101 <-> SCL
207// 1010 <-> SDA
208// 1111 <-> VCC
209// ADDR represents A3:A0 of the 7-bit address.
210// The result is: 0b101(ADDR)
211#define DRIVER_ADDR_1 0b1010000
212#define DRIVER_ADDR_2 0b1010001
213
214#define DRIVER_COUNT 2
215#define DRIVER_1_LED_TOTAL 30
216#define DRIVER_2_LED_TOTAL 32
217#define RGB_MATRIX_LED_COUNT (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)
218```
219!> Note the parentheses, this is so when `RGB_MATRIX_LED_COUNT` is used in code and expanded, the values are added together before any additional math is applied to them. As an example, `rand() % (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)` will give very different results than `rand() % DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL`.
220
221Define these arrays listing all the LEDs in your `<keyboard>.c`:
222
223```c
224const is31_led PROGMEM g_is31_leds[RGB_MATRIX_LED_COUNT] = {
225/* Refer to IS31 manual for these locations
226 * driver
227 * | R location
228 * | | G location
229 * | | | B location
230 * | | | | */
231 {0, B_1, A_1, C_1},
232 ....
233}
234```
159### IS31FL3737 :id=is31fl3737 235### IS31FL3737 :id=is31fl3737
160 236
161There is basic support for addressable RGB matrix lighting with the I2C IS31FL3737 RGB controller. To enable it, add this to your `rules.mk`: 237There is basic support for addressable RGB matrix lighting with the I2C IS31FL3737 RGB controller. To enable it, add this to your `rules.mk`:
@@ -218,8 +294,6 @@ Here is an example using 2 drivers.
218``` 294```
219!> Note the parentheses, this is so when `RGB_MATRIX_LED_COUNT` is used in code and expanded, the values are added together before any additional math is applied to them. As an example, `rand() % (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)` will give very different results than `rand() % DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL`. 295!> Note the parentheses, this is so when `RGB_MATRIX_LED_COUNT` is used in code and expanded, the values are added together before any additional math is applied to them. As an example, `rand() % (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)` will give very different results than `rand() % DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL`.
220 296
221Currently only 2 drivers are supported, but it would be trivial to support all 4 combinations.
222
223Define these arrays listing all the LEDs in your `<keyboard>.c`: 297Define these arrays listing all the LEDs in your `<keyboard>.c`:
224 298
225```c 299```c
@@ -361,7 +435,7 @@ Configure the hardware via your `config.h`:
361 435
362```c 436```c
363// The pin connected to the data pin of the LEDs 437// The pin connected to the data pin of the LEDs
364#define RGB_DI_PIN D7 438#define WS2812_DI_PIN D7
365// The number of LEDs connected 439// The number of LEDs connected
366#define RGB_MATRIX_LED_COUNT 70 440#define RGB_MATRIX_LED_COUNT 70
367``` 441```
@@ -383,9 +457,9 @@ Configure the hardware via your `config.h`:
383 457
384```c 458```c
385// The pin connected to the data pin of the LEDs 459// The pin connected to the data pin of the LEDs
386#define RGB_DI_PIN D7 460#define APA102_DI_PIN D7
387// The pin connected to the clock pin of the LEDs 461// The pin connected to the clock pin of the LEDs
388#define RGB_CI_PIN D6 462#define APA102_CI_PIN D6
389// The number of LEDs connected 463// The number of LEDs connected
390#define RGB_MATRIX_LED_COUNT 70 464#define RGB_MATRIX_LED_COUNT 70
391``` 465```
@@ -690,6 +764,14 @@ Remove the spread effect entirely.
690#define RGB_MATRIX_TYPING_HEATMAP_SLIM 764#define RGB_MATRIX_TYPING_HEATMAP_SLIM
691``` 765```
692 766
767It's also possible to adjust the tempo of *heating up*. It's defined as the number of shades that are
768increased on the [HSV scale](https://en.wikipedia.org/wiki/HSL_and_HSV). Decreasing this value increases
769the number of keystrokes needed to fully heat up the key.
770
771```c
772#define RGB_MATRIX_TYPING_HEATMAP_INCREASE_STEP 32
773```
774
693### RGB Matrix Effect Solid Reactive :id=rgb-matrix-effect-solid-reactive 775### RGB Matrix Effect Solid Reactive :id=rgb-matrix-effect-solid-reactive
694 776
695Solid reactive effects will pulse RGB light on key presses with user configurable hues. To enable gradient mode that will automatically change reactive color, add the following define: 777Solid reactive effects will pulse RGB light on key presses with user configurable hues. To enable gradient mode that will automatically change reactive color, add the following define:
@@ -811,13 +893,7 @@ These are defined in [`color.h`](https://github.com/qmk/qmk_firmware/blob/master
811 893
812## EEPROM storage :id=eeprom-storage 894## EEPROM storage :id=eeprom-storage
813 895
814The EEPROM for it is currently shared with the LED Matrix system (it's generally assumed only one feature would be used at a time), but could be configured to use its own 32bit address with: 896The EEPROM for it is currently shared with the LED Matrix system (it's generally assumed only one feature would be used at a time).
815
816```c
817#define EECONFIG_RGB_MATRIX (uint32_t *)28
818```
819
820Where `28` is an unused index from `eeconfig.h`.
821 897
822## Functions :id=functions 898## Functions :id=functions
823 899
diff --git a/docs/feature_rgblight.md b/docs/feature_rgblight.md
index 060efaf1b3..5131658ae1 100644
--- a/docs/feature_rgblight.md
+++ b/docs/feature_rgblight.md
@@ -33,12 +33,13 @@ RGBLIGHT_DRIVER = APA102
33 33
34At minimum you must define the data pin your LED strip is connected to, and the number of LEDs in the strip, in your `config.h`. For APA102 LEDs, you must also define the clock pin. If your keyboard has onboard RGB LEDs, and you are simply creating a keymap, you usually won't need to modify these. 34At minimum you must define the data pin your LED strip is connected to, and the number of LEDs in the strip, in your `config.h`. For APA102 LEDs, you must also define the clock pin. If your keyboard has onboard RGB LEDs, and you are simply creating a keymap, you usually won't need to modify these.
35 35
36|Define |Description | 36|Define |Description |
37|---------------|---------------------------------------------------------------------------------------------------------| 37|---------------|-------------------------------------------------------------------------|
38|`RGB_DI_PIN` |The pin connected to the data pin of the LEDs | 38|`WS2812_DI_PIN`|The pin connected to the data pin of the LEDs (WS2812) |
39|`RGB_CI_PIN` |The pin connected to the clock pin of the LEDs (APA102 only) | 39|`APA102_DI_PIN`|The pin connected to the data pin of the LEDs (APA102) |
40|`RGBLED_NUM` |The number of LEDs connected | 40|`APA102_CI_PIN`|The pin connected to the clock pin of the LEDs (APA102) |
41|`RGBLED_SPLIT` |(Optional) For split keyboards, the number of LEDs connected on each half directly wired to `RGB_DI_PIN` | 41|`RGBLED_NUM` |The number of LEDs connected |
42|`RGBLED_SPLIT` |(Optional) For split keyboards, the number of LEDs connected on each half|
42 43
43Then you should be able to use the keycodes below to change the RGB lighting to your liking. 44Then you should be able to use the keycodes below to change the RGB lighting to your liking.
44 45
diff --git a/docs/feature_split_keyboard.md b/docs/feature_split_keyboard.md
index c095c8712f..1705ea9222 100644
--- a/docs/feature_split_keyboard.md
+++ b/docs/feature_split_keyboard.md
@@ -300,6 +300,12 @@ This enables transmitting the pointing device status to the master side of the s
300 300
301This enables triggering of haptic feedback on the slave side of the split keyboard. For DRV2605L this will send the mode, but for solenoids it is expected that the desired mode is already set up on the slave. 301This enables triggering of haptic feedback on the slave side of the split keyboard. For DRV2605L this will send the mode, but for solenoids it is expected that the desired mode is already set up on the slave.
302 302
303```c
304#define SPLIT_ACTIVITY_ENABLE
305```
306
307This synchronizes the activity timestamps between sides of the split keyboard, allowing for activity timeouts to occur.
308
303### Custom data sync between sides :id=custom-data-sync 309### Custom data sync between sides :id=custom-data-sync
304 310
305QMK's split transport allows for arbitrary data transactions at both the keyboard and user levels. This is modelled on a remote procedure call, with the master invoking a function on the slave side, with the ability to send data from master to slave, process it slave side, and send data back from slave to master. 311QMK's split transport allows for arbitrary data transactions at both the keyboard and user levels. This is modelled on a remote procedure call, with the master invoking a function on the slave side, with the ability to send data from master to slave, process it slave side, and send data back from slave to master.
diff --git a/docs/feature_stenography.md b/docs/feature_stenography.md
index 62d4dabf81..df4c9c6ad3 100644
--- a/docs/feature_stenography.md
+++ b/docs/feature_stenography.md
@@ -138,7 +138,7 @@ bool post_process_steno_user(uint16_t keycode, keyrecord_t *record, steno_mode_t
138 138
139This function is called after a key has been processed, but before any decision about whether or not to send a chord. This is where to put hooks for things like, say, live displays of steno chords or keys. 139This function is called after a key has been processed, but before any decision about whether or not to send a chord. This is where to put hooks for things like, say, live displays of steno chords or keys.
140 140
141If `IS_PRESSED(record->event)` is false, and `n_pressed_keys` is 0 or 1, the chord will be sent shortly, but has not yet been sent. This relieves you of the need of keeping track of where a packet ends and another begins. 141If `record->event.pressed` is false, and `n_pressed_keys` is 0 or 1, the chord will be sent shortly, but has not yet been sent. This relieves you of the need of keeping track of where a packet ends and another begins.
142 142
143The `chord` argument contains the packet of the current chord as specified by the protocol in use. This is *NOT* simply a list of chorded steno keys of the form `[STN_E, STN_U, STN_BR, STN_GR]`. Refer to the appropriate protocol section of this document to learn more about the format of the packets in your steno protocol/mode of choice. 143The `chord` argument contains the packet of the current chord as specified by the protocol in use. This is *NOT* simply a list of chorded steno keys of the form `[STN_E, STN_U, STN_BR, STN_GR]`. Refer to the appropriate protocol section of this document to learn more about the format of the packets in your steno protocol/mode of choice.
144 144
diff --git a/docs/feature_swap_hands.md b/docs/feature_swap_hands.md
index 4d0d554093..e9c1d4b7ba 100644
--- a/docs/feature_swap_hands.md
+++ b/docs/feature_swap_hands.md
@@ -47,6 +47,11 @@ const uint8_t PROGMEM encoder_hand_swap_config[NUM_ENCODERS] = { 1, 0 };
47 47
48### Functions :id=functions 48### Functions :id=functions
49 49
50| Function | Description | 50User callback functions to manipulate Swap-Hands:
51|----------------------|---------------------------------------------| 51
52| `is_swap_hands_on()` | Returns true if Swap-Hands is currently on. | 52| Function | Description |
53|-----------------------|---------------------------------------------|
54| `swap_hands_on()` | Turns Swap-Hands on. |
55| `swap_hands_off()` | Turns Swap-Hands off. |
56| `swap_hands_toggle()` | Toggles Swap-Hands. |
57| `is_swap_hands_on()` | Returns true if Swap-Hands is currently on. |
diff --git a/docs/getting_started_vagrant.md b/docs/getting_started_vagrant.md
deleted file mode 100644
index b5b5ce1539..0000000000
--- a/docs/getting_started_vagrant.md
+++ /dev/null
@@ -1,56 +0,0 @@
1# Vagrant Quick Start
2
3This project includes a `Vagrantfile` that will allow you to build a new firmware for your keyboard very easily without major changes to your primary operating system. This also ensures that when you clone the project and perform a build, you have the exact same environment as anyone else using the Vagrantfile to build. This makes it much easier for people to help you troubleshoot any issues you encounter.
4
5## Requirements
6
7Using the `Vagrantfile` in this repository requires you have [Vagrant](https://www.vagrantup.com/) as well as a supported provider installed:
8
9* [VirtualBox](https://www.virtualbox.org/) (Version at least 5.0.12)
10 * Sold as 'the most accessible platform to use Vagrant'
11* [VMware Workstation](https://www.vmware.com/products/workstation) and [Vagrant VMware plugin](https://www.vagrantup.com/vmware)
12 * The (paid) VMware plugin requires a licensed copy of VMware Workstation/Fusion
13* [Docker](https://www.docker.com/)
14
15Other than having Vagrant, a suitable provider installed and possibly a restart of your computer afterwards, you can simple run a 'vagrant up' anywhere inside the folder where you checked out this project and it will start an environment (either a virtual machine or container) that contains all the tools required to build this project. There is a post Vagrant startup hint that will get you off on the right foot, otherwise you can also reference the build documentation below.
16
17## Flashing the Firmware
18
19The "easy" way to flash the firmware is using a tool from your host OS:
20
21* [QMK Toolbox](https://github.com/qmk/qmk_toolbox) (recommended)
22* [Teensy Loader](https://www.pjrc.com/teensy/loader.html)
23
24If you want to program via the command line you can uncomment the ['modifyvm'] lines in the Vagrantfile to enable the USB passthrough into Linux and then program using the command line tools like dfu-util/dfu-programmer or you can install the Teensy CLI version.
25
26## Vagrantfile Overview
27The development environment is configured to run the QMK Docker image, `qmkfm/qmk_cli`. This not only ensures predictability between systems, it also mirrors the CI environment.
28
29## FAQ
30
31### Why am I seeing issues under Virtualbox?
32Certain versions of Virtualbox 5 appear to have an incompatibility with the Virtualbox extensions installed in the boxes in this Vagrantfile. If you encounter any issues with the /vagrant mount not succeeding, please upgrade your version of Virtualbox to at least 5.0.12. **Alternately, you can try running the following command:**
33
34```
35vagrant plugin install vagrant-vbguest
36```
37
38### How do I remove an existing environment?
39Finished with your environment? From anywhere inside the folder where you checked out this project, Execute:
40
41```
42vagrant destroy
43```
44
45### What if I want to use Docker directly?
46Want to benefit from the Vagrant workflow without a virtual machine? The Vagrantfile is configured to bypass running a virtual machine, and run the container directly. Execute the following when bringing up the environment to force the use of Docker:
47```
48vagrant up --provider=docker
49```
50
51### How do I access the virtual machine instead of the Docker container?
52Execute the following to bypass the `vagrant` user booting directly to the official qmk builder image:
53
54```
55vagrant ssh -c 'sudo -i'
56```
diff --git a/docs/ja/_summary.md b/docs/ja/_summary.md
index 8516a5eaaa..4d6f2348d5 100644
--- a/docs/ja/_summary.md
+++ b/docs/ja/_summary.md
@@ -38,7 +38,6 @@
38 * [キーマップの概要](ja/keymap.md) 38 * [キーマップの概要](ja/keymap.md)
39 * 開発環境 39 * 開発環境
40 * [Docker のガイド](ja/getting_started_docker.md) 40 * [Docker のガイド](ja/getting_started_docker.md)
41 * [Vagrant のガイド](ja/getting_started_vagrant.md)
42 * 書き込み 41 * 書き込み
43 * [書き込み](ja/flashing.md) 42 * [書き込み](ja/flashing.md)
44 * [ATmega32A の書き込み (ps2avrgb)](ja/flashing_bootloadhid.md) 43 * [ATmega32A の書き込み (ps2avrgb)](ja/flashing_bootloadhid.md)
@@ -69,6 +68,7 @@
69 * [モッドタップ](ja/mod_tap.md) 68 * [モッドタップ](ja/mod_tap.md)
70 * [マクロ](ja/feature_macros.md) 69 * [マクロ](ja/feature_macros.md)
71 * [マウスキー](ja/feature_mouse_keys.md) 70 * [マウスキー](ja/feature_mouse_keys.md)
71 * [Repeat Key](ja/feature_repeat_key.md)
72 * [Space Cadet Shift](ja/feature_space_cadet.md) 72 * [Space Cadet Shift](ja/feature_space_cadet.md)
73 * [US ANSI シフトキー](ja/keycodes_us_ansi_shifted.md) 73 * [US ANSI シフトキー](ja/keycodes_us_ansi_shifted.md)
74 74
diff --git a/docs/ja/config_options.md b/docs/ja/config_options.md
index 6135721a42..5e98da5eee 100644
--- a/docs/ja/config_options.md
+++ b/docs/ja/config_options.md
@@ -159,9 +159,6 @@ QMK での全ての利用可能な設定にはデフォルトがあります。
159 * 詳細は [Permissive Hold](ja/tap_hold.md#permissive-hold) を見てください 159 * 詳細は [Permissive Hold](ja/tap_hold.md#permissive-hold) を見てください
160* `#define PERMISSIVE_HOLD_PER_KEY` 160* `#define PERMISSIVE_HOLD_PER_KEY`
161 * キーごとの `PERMISSIVE_HOLD` 設定の処理を有効にします 161 * キーごとの `PERMISSIVE_HOLD` 設定の処理を有効にします
162* `#define IGNORE_MOD_TAP_INTERRUPT`
163 * 両方のキーに `TAPPING_TERM` を適用することで、ホールド時に他のキーに変換するキーを使ってローリングコンボ (zx) をすることができるようにします
164 * 詳細は [Ignore Mod Tap Interrupt](ja/tap_hold.md#ignore-mod-tap-interrupt) を見てください
165* `#define TAPPING_FORCE_HOLD` 162* `#define TAPPING_FORCE_HOLD`
166 * タップされた直後に、デュアルロールキーを修飾子として使用できるようにします 163 * タップされた直後に、デュアルロールキーを修飾子として使用できるようにします
167 * [Tapping Force Hold](ja/tap_hold.md#tapping-force-hold)を見てください 164 * [Tapping Force Hold](ja/tap_hold.md#tapping-force-hold)を見てください
@@ -179,8 +176,6 @@ QMK での全ての利用可能な設定にはデフォルトがあります。
179 * ワンショットがタイムアウトするまでの時間 176 * ワンショットがタイムアウトするまでの時間
180* `#define ONESHOT_TAP_TOGGLE 2` 177* `#define ONESHOT_TAP_TOGGLE 2`
181 * ワンショットトグルが引き起こされるまでのタップ数 178 * ワンショットトグルが引き起こされるまでのタップ数
182* `#define COMBO_COUNT 2`
183 * [コンボ](ja/feature_combo.md)機能で使っているコンボの数にこれを設定します。
184* `#define COMBO_TERM 200` 179* `#define COMBO_TERM 200`
185 * コンボキーが検出されるまでの時間。定義されていない場合は、デフォルトは `TAPPING_TERM` です。 180 * コンボキーが検出されるまでの時間。定義されていない場合は、デフォルトは `TAPPING_TERM` です。
186* `#define TAP_CODE_DELAY 100` 181* `#define TAP_CODE_DELAY 100`
diff --git a/docs/ja/feature_combo.md b/docs/ja/feature_combo.md
index bd46e88b7f..0c0591e5f7 100644
--- a/docs/ja/feature_combo.md
+++ b/docs/ja/feature_combo.md
@@ -18,7 +18,7 @@
18 18
19```c 19```c
20const uint16_t PROGMEM test_combo[] = {KC_A, KC_B, COMBO_END}; 20const uint16_t PROGMEM test_combo[] = {KC_A, KC_B, COMBO_END};
21combo_t key_combos[COMBO_COUNT] = {COMBO(test_combo, KC_ESC)}; 21combo_t key_combos[] = {COMBO(test_combo, KC_ESC)};
22``` 22```
23 23
24これは、A と B のキーを押した場合に、"Escape" を送信します。 24これは、A と B のキーを押した場合に、"Escape" を送信します。
@@ -38,7 +38,7 @@ enum combos {
38const uint16_t PROGMEM ab_combo[] = {KC_A, KC_B, COMBO_END}; 38const uint16_t PROGMEM ab_combo[] = {KC_A, KC_B, COMBO_END};
39const uint16_t PROGMEM jk_combo[] = {KC_J, KC_K, COMBO_END}; 39const uint16_t PROGMEM jk_combo[] = {KC_J, KC_K, COMBO_END};
40 40
41combo_t key_combos[COMBO_COUNT] = { 41combo_t key_combos[] = {
42 [AB_ESC] = COMBO(ab_combo, KC_ESC), 42 [AB_ESC] = COMBO(ab_combo, KC_ESC),
43 [JK_TAB] = COMBO(jk_combo, KC_TAB) 43 [JK_TAB] = COMBO(jk_combo, KC_TAB)
44}; 44};
@@ -55,7 +55,7 @@ enum combo_events {
55const uint16_t PROGMEM copy_combo[] = {KC_Z, KC_C, COMBO_END}; 55const uint16_t PROGMEM copy_combo[] = {KC_Z, KC_C, COMBO_END};
56const uint16_t PROGMEM paste_combo[] = {KC_X, KC_V, COMBO_END}; 56const uint16_t PROGMEM paste_combo[] = {KC_X, KC_V, COMBO_END};
57 57
58combo_t key_combos[COMBO_COUNT] = { 58combo_t key_combos[] = {
59 [ZC_COPY] = COMBO_ACTION(copy_combo), 59 [ZC_COPY] = COMBO_ACTION(copy_combo),
60 [XV_PASTE] = COMBO_ACTION(paste_combo), 60 [XV_PASTE] = COMBO_ACTION(paste_combo),
61}; 61};
diff --git a/docs/ja/feature_dynamic_macros.md b/docs/ja/feature_dynamic_macros.md
index 3cff788007..fa1a1df931 100644
--- a/docs/ja/feature_dynamic_macros.md
+++ b/docs/ja/feature_dynamic_macros.md
@@ -64,7 +64,7 @@ QMK はその場で作られた一時的なマクロをサポートします。
64 64
65direction がどのマクロであるかを示すことに注意してください。`1` がマクロ 1、`-1` がマクロ 2、0 がマクロ無しです。 65direction がどのマクロであるかを示すことに注意してください。`1` がマクロ 1、`-1` がマクロ 2、0 がマクロ無しです。
66 66
67* `dynamic_macro_record_start_user(void)` - マクロの記録を開始する時に起動されます。 67* `dynamic_macro_record_start_user(int8_t direction)` - マクロの記録を開始する時に起動されます。
68* `dynamic_macro_play_user(int8_t direction)` - マクロを再生する時に起動されます。 68* `dynamic_macro_play_user(int8_t direction)` - マクロを再生する時に起動されます。
69* `dynamic_macro_record_key_user(int8_t direction, keyrecord_t *record)` - マクロの記録中に各キー押下で起動されます。 69* `dynamic_macro_record_key_user(int8_t direction, keyrecord_t *record)` - マクロの記録中に各キー押下で起動されます。
70* `dynamic_macro_record_end_user(int8_t direction)` - マクロの記録を停止した時に起動されます。 70* `dynamic_macro_record_end_user(int8_t direction)` - マクロの記録を停止した時に起動されます。
diff --git a/docs/ja/feature_stenography.md b/docs/ja/feature_stenography.md
index b280084ae3..9551221696 100644
--- a/docs/ja/feature_stenography.md
+++ b/docs/ja/feature_stenography.md
@@ -80,7 +80,7 @@ bool process_steno_user(uint16_t keycode, keyrecord_t *record) { return true; }
80bool post_process_steno_user(uint16_t keycode, keyrecord_t *record, steno_mode_t mode, uint8_t chord[6], int8_t pressed); 80bool post_process_steno_user(uint16_t keycode, keyrecord_t *record, steno_mode_t mode, uint8_t chord[6], int8_t pressed);
81``` 81```
82 82
83この関数はキーが処理された後、ただしコードを送信するかどうかを決める前に呼び出されます。`IS_PRESSED(record->event)` が false で、`pressed` が 0 または 1 の場合は、コードはまもなく送信されますが、まだ送信されてはいません。ここが速記コードあるいはキーのライブ表示などのフックを配置する場所です。 83この関数はキーが処理された後、ただしコードを送信するかどうかを決める前に呼び出されます。`record->event.pressed` が false で、`pressed` が 0 または 1 の場合は、コードはまもなく送信されますが、まだ送信されてはいません。ここが速記コードあるいはキーのライブ表示などのフックを配置する場所です。
84 84
85 85
86## キーコードリファレンス :id=keycode-reference 86## キーコードリファレンス :id=keycode-reference
diff --git a/docs/ja/getting_started_vagrant.md b/docs/ja/getting_started_vagrant.md
deleted file mode 100644
index 0888b7f311..0000000000
--- a/docs/ja/getting_started_vagrant.md
+++ /dev/null
@@ -1,61 +0,0 @@
1# Vagrant クイックスタート
2
3<!---
4 original document: 0.12.43:docs/getting_started_vagrant.md
5 git diff 0.12.43 HEAD -- docs/getting_started_vagrant.md | cat
6-->
7
8このプロジェクトは、プライマリオペレーティングシステムに大きな変更を加えることなくキーボードの新しいファームウェアを非常に簡単に構築することができる `Vagrantfile` を含みます。これは、あなたがプロジェクトをクローンしビルドを実行した時に、ビルドのために Vagrantfile を使っている他のユーザと全く同じ環境を持つことも保証します。これにより、人々はあなたが遭遇した問題の解決をより簡単に行えるようになります。
9
10## 必要事項
11
12このリポジトリ内の `Vagrantfile` を使うには、[Vagrant](https://www.vagrantup.com/) およびサポートされるプロバイダがインストールされている必要があります:
13
14* [VirtualBox](https://www.virtualbox.org/) (バージョン 5.0.12 以降)
15 * 「Vagrant を使うために最もアクセスしやすいプラットフォーム」とうたわれています。
16* [VMware Workstation](https://www.vmware.com/products/workstation) および [Vagrant VMware プラグイン](https://www.vagrantup.com/vmware)
17 * (有料) VMware プラグインには、ライセンスされた VMware Workstation/Fusion のコピーが必要です。
18* [Docker](https://www.docker.com/)
19
20Vagrant 以外に、適切なプロバイダがインストールされ、その後におそらくコンピュータを再起動すると、このプロジェクトをチェックアウトしたフォルダ内の任意の場所で 'vagrant up' を単純に実行することができ、このプロジェクトをビルドするのに必要な全てのツールが含まれる環境(仮想マシンあるいはコンテナ)が開始されます。Vagrant 起動時にうまく始めるためのヒントが表示されますが、それ以外に、以下のビルドドキュメントを参照することもできます。
21
22## ファームウェアの書き込み
23
24ファームウェアを書き込む「簡単な」方法は、ホスト OS からツールを使うことです:
25
26* [QMK Toolbox](https://github.com/qmk/qmk_toolbox) (推奨)
27* [Teensy ローダー](https://www.pjrc.com/teensy/loader.html)
28
29コマンドラインでプログラムしたい場合は、Vagranfile の ['modifyvm'] 行のコメントを解除して Linux への USB パススルーを有効にし、dfu-util/dfu-programmer のようなコマンドラインツールを使ってプログラムすることができます。あるいは Teensy CLI バージョンをインストールすることができます。
30
31## Vagrantfile の概要
32開発環境は QMK Docker イメージ、`qmkfm/qmk_cli` を実行するように設定されています。これはシステム間の予測可能性が保証されるだけでなく、CI 環境もミラーされます。
33
34## FAQ
35
36### Virtualbox で問題が発生するのはなぜですか?
37Virtualbox 5 の特定のバージョンはこの Vagrantfile のボックスにインストールされている Virtualbox の拡張機能と互換性が無いようです。/vagrant のマウントで問題が発生した場合は、Virtualbox のバージョンを少なくとも 5.0.12 にアップグレードしてください。**または、以下のコマンドを実行してみることができます:**
38
39```console
40vagrant plugin install vagrant-vbguest
41```
42
43### 既存の環境を削除するにはどうすればいいですか?
44あなたの環境での作業が完了しましたか?このプロジェクトをチェックアウトしたフォルダの中のどこからでも、以下を実行してください:
45
46```console
47vagrant destroy
48```
49
50### Docker を直接使いたい場合はどうしますか?
51仮想マシン無しで Vagrant のワークフローを活用したいですか?Vagrantfile は仮想マシンの実行をバイパスし、コンテナを直接実行するように設定されています。Docker を強制的に使うように環境を立ち上げる場合は、以下を実行してください:
52```console
53vagrant up --provider=docker
54```
55
56### Docker コンテナではなく仮想マシンにアクセスするにはどうすればいいですか?
57以下を実行して、公式の QMK ビルダーイメージから直接起動する `vagrant` ユーザをバイパスするようにします:
58
59```console
60vagrant ssh -c 'sudo -i'
61```
diff --git a/docs/ja/tap_hold.md b/docs/ja/tap_hold.md
index ac64fe6ce3..00b80c8b22 100644
--- a/docs/ja/tap_hold.md
+++ b/docs/ja/tap_hold.md
@@ -63,8 +63,6 @@ uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) {
63 63
64通常、これら全てを `TAPPING_TERM` (デフォルト: 200ms) 内で行うと、ファームウェアとホストシステムによって `ax` として登録されます。許容ホールドを有効にすると、別のキーがタップされた場合にモッドタップキーを修飾キーと見なすように処理を変更し、 `X` (`SHIFT`+`x`) と登録されます。 64通常、これら全てを `TAPPING_TERM` (デフォルト: 200ms) 内で行うと、ファームウェアとホストシステムによって `ax` として登録されます。許容ホールドを有効にすると、別のキーがタップされた場合にモッドタップキーを修飾キーと見なすように処理を変更し、 `X` (`SHIFT`+`x`) と登録されます。
65 65
66?> `モッドタップ割り込みの無視`を有効にしている場合、これにより両方の動きが変更されます。通常のキーには、最初のキーが最初に放された場合、あるいは両方のキーが `TAPPING_TERM` より長くホールドされた場合に、修飾キーが追加されます。
67
68この機能をより細かく制御するために、以下を `config.h` に追加することができます: 66この機能をより細かく制御するために、以下を `config.h` に追加することができます:
69 67
70```c 68```c
@@ -84,32 +82,6 @@ bool get_permissive_hold(uint16_t keycode, keyrecord_t *record) {
84} 82}
85``` 83```
86 84
87## モッドタップ割り込みの無視
88
89この設定を有効にするには、これを `config.h` に追加してください:
90
91```c
92#define IGNORE_MOD_TAP_INTERRUPT
93```
94
95許容ホールドと同様に、これは高速なタイピストのためのファームウェアの処理方法を変更します。モッドタップキーを押し、他のキーを押し、モッドタップキーを放し、通常のキーを放すと、`TAPPING_TERM` 内で押された場合でも、通常はモッドと通常のキーが出力されます。これは、ローリングコンボキーや、頻繁に使用するキー(例えば、`RCTL_T(KC_QUOT)`)にモッドタップを使う高速なタイピストには望ましくない場合があります。
96
97`モッドタップ割り込みの無視`を設定するには、両方のキーを `TAPPING_TERM` の間ホールドすると、(その修飾キーの)ホールド機能を実行する必要があります。
98
99例えば:
100
101- `SFT_T(KC_A)` を押す
102- `KC_X` を押す
103- `SFT_T(KC_A)` を放す
104- `KC_X` を放す
105
106通常、これは大文字の `X` (`SHIFT`+`x`)、またはモッド + キーを送信します。`モッドタップ割り込みの無視` を有効にすると、ホールドアクションを登録するには、両方のキーを `TAPPING_TERM` の間ホールドする必要があります。この場合、素早いタップは `ax` を送信しますが、両方をホールドすると、大文字の `X` (`SHIFT`+`x`) を出力します。
107
108
109?> __注意__: これはモディファイアにのみ関係し、レイヤー切り替えキーには関係しません。
110
111?> `許容ホールド`を有効にすると、これは両方がどのように動作するかを変更します。通常のキーには、最初のキーが最初に放された場合、あるいは両方のキーが `TAPPING_TERM` より長くホールドされた場合に、修飾キーが追加されます。
112
113## タッピング強制ホールド 85## タッピング強制ホールド
114 86
115`タッピング強制ホールド` を有効にするには、以下を `config.h` に追加します: 87`タッピング強制ホールド` を有効にするには、以下を `config.h` に追加します:
diff --git a/docs/keycodes.md b/docs/keycodes.md
index cad050ccf7..e5b6246af7 100644
--- a/docs/keycodes.md
+++ b/docs/keycodes.md
@@ -803,6 +803,15 @@ See also: [Programmable Button](feature_programmable_button.md)
803|`QK_PROGRAMMABLE_BUTTON_31`|`PB_31`|Programmable button 31| 803|`QK_PROGRAMMABLE_BUTTON_31`|`PB_31`|Programmable button 31|
804|`QK_PROGRAMMABLE_BUTTON_32`|`PB_32`|Programmable button 32| 804|`QK_PROGRAMMABLE_BUTTON_32`|`PB_32`|Programmable button 32|
805 805
806## Repeat Key :id=repeat-key
807
808See also: [Repeat Key](feature_repeat_key.md)
809
810|Keycode |Aliases |Description |
811|-----------------------|---------|-------------------------------------|
812|`QK_REPEAT_KEY` |`QK_REP` |Repeat the last pressed key |
813|`QK_ALT_REPEAT_KEY` |`QK_AREP`|Perform alternate of the last key |
814
806## Space Cadet :id=space-cadet 815## Space Cadet :id=space-cadet
807 816
808See also: [Space Cadet](feature_space_cadet.md) 817See also: [Space Cadet](feature_space_cadet.md)
diff --git a/docs/mod_tap.md b/docs/mod_tap.md
index ca3a2752c7..8b953d76b4 100644
--- a/docs/mod_tap.md
+++ b/docs/mod_tap.md
@@ -111,8 +111,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
111} 111}
112``` 112```
113 113
114Enabling `IGNORE_MOD_TAP_INTERRUPT` is recommended when using Mod-Tap on alphanumeric keys to avoid hold function taking precendence when the next key is pressed quickly. See [Ignore Mod Tap Interrupt](tap_hold.md#ignore-mod-tap-interrupt) for more details.
115
116### Changing both tap and hold 114### Changing both tap and hold
117 115
118This last example implements custom tap and hold function with `LT(0,KC_NO)` to create a single copy-on-tap, paste-on-hold key: 116This last example implements custom tap and hold function with `LT(0,KC_NO)` to create a single copy-on-tap, paste-on-hold key:
diff --git a/docs/newbs_building_firmware_workflow.md b/docs/newbs_building_firmware_workflow.md
index e6895252aa..51ce304901 100644
--- a/docs/newbs_building_firmware_workflow.md
+++ b/docs/newbs_building_firmware_workflow.md
@@ -95,7 +95,7 @@ on: [push, workflow_dispatch]
95jobs: 95jobs:
96 build: 96 build:
97 runs-on: ubuntu-latest 97 runs-on: ubuntu-latest
98 container: qmkfm/qmk_cli 98 container: ghcr.io/qmk/qmk_cli
99 strategy: 99 strategy:
100 fail-fast: false 100 fail-fast: false
101 matrix: 101 matrix:
diff --git a/docs/pr_checklist.md b/docs/pr_checklist.md
index 6dc6c0000d..65584a9538 100644
--- a/docs/pr_checklist.md
+++ b/docs/pr_checklist.md
@@ -62,7 +62,7 @@ https://github.com/qmk/qmk_firmware/pulls?q=is%3Apr+is%3Aclosed+label%3Akeyboard
62 - valid maintainer 62 - valid maintainer
63 - valid USB VID/PID and device version 63 - valid USB VID/PID and device version
64 - displays correctly in Configurator (press Ctrl+Shift+I to preview local file, turn on fast input to verify ordering) 64 - displays correctly in Configurator (press Ctrl+Shift+I to preview local file, turn on fast input to verify ordering)
65 - `layout` definitions should include matrix positions, so that `LAYOUT` macros can be generated at build time 65 - `layout` definitions must include matrix positions, so that `LAYOUT` macros can be generated at build time
66 - should use standard definitions if applicable 66 - should use standard definitions if applicable
67 - use the Community Layout macro names where they apply (preferred above `LAYOUT`/`LAYOUT_all`) 67 - use the Community Layout macro names where they apply (preferred above `LAYOUT`/`LAYOUT_all`)
68 - If the keyboard only has a single electrical/switch layout: 68 - If the keyboard only has a single electrical/switch layout:
@@ -124,7 +124,7 @@ https://github.com/qmk/qmk_firmware/pulls?q=is%3Apr+is%3Aclosed+label%3Akeyboard
124 - hardware that's enabled at the keyboard level and requires configuration such as OLED displays or encoders should have basic functionality implemented here 124 - hardware that's enabled at the keyboard level and requires configuration such as OLED displays or encoders should have basic functionality implemented here
125- `<keyboard>.h` 125- `<keyboard>.h`
126 - `#include "quantum.h"` appears at the top 126 - `#include "quantum.h"` appears at the top
127 - `LAYOUT` macros should be moved to `info.json` 127 - `LAYOUT` macros are no longer accepted and should instead be moved to `info.json`
128- keymap `config.h` 128- keymap `config.h`
129 - no duplication of `rules.mk` or `config.h` from keyboard 129 - no duplication of `rules.mk` or `config.h` from keyboard
130- `keymaps/default/keymap.c` 130- `keymaps/default/keymap.c`
diff --git a/docs/quantum_painter.md b/docs/quantum_painter.md
index ac37053c79..317a9d9f1a 100644
--- a/docs/quantum_painter.md
+++ b/docs/quantum_painter.md
@@ -32,16 +32,20 @@ Supported devices:
32 32
33## Quantum Painter Configuration :id=quantum-painter-config 33## Quantum Painter Configuration :id=quantum-painter-config
34 34
35| Option | Default | Purpose | 35| Option | Default | Purpose |
36|------------------------------------------|---------|---------------------------------------------------------------------------------------------------------------------------------------------| 36|---------------------------------------------------|---------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
37| `QUANTUM_PAINTER_NUM_IMAGES` | `8` | The maximum number of images/animations that can be loaded at any one time. | 37| `QUANTUM_PAINTER_DISPLAY_TIMEOUT` | `30000` | This controls the amount of time (in milliseconds) that all displays will remain on after the last user input. If set to `0`, the display will remain on indefinitely. |
38| `QUANTUM_PAINTER_NUM_FONTS` | `4` | The maximum number of fonts that can be loaded at any one time. | 38| `QUANTUM_PAINTER_TASK_THROTTLE` | `1` | This controls the amount of time (in milliseconds) that the Quantum Painter internal task will wait between each execution. Affects animations, display timeout, and LVGL timing if enabled. |
39| `QUANTUM_PAINTER_CONCURRENT_ANIMATIONS` | `4` | The maximum number of animations that can be executed at the same time. | 39| `QUANTUM_PAINTER_NUM_IMAGES` | `8` | The maximum number of images/animations that can be loaded at any one time. |
40| `QUANTUM_PAINTER_LOAD_FONTS_TO_RAM` | `FALSE` | Whether or not fonts should be loaded to RAM. Relevant for fonts stored in off-chip persistent storage, such as external flash. | 40| `QUANTUM_PAINTER_NUM_FONTS` | `4` | The maximum number of fonts that can be loaded at any one time. |
41| `QUANTUM_PAINTER_PIXDATA_BUFFER_SIZE` | `32` | The limit of the amount of pixel data that can be transmitted in one transaction to the display. Higher values require more RAM on the MCU. | 41| `QUANTUM_PAINTER_CONCURRENT_ANIMATIONS` | `4` | The maximum number of animations that can be executed at the same time. |
42| `QUANTUM_PAINTER_SUPPORTS_256_PALETTE` | `FALSE` | If 256-color palettes are supported. Requires significantly more RAM on the MCU. | 42| `QUANTUM_PAINTER_LOAD_FONTS_TO_RAM` | `FALSE` | Whether or not fonts should be loaded to RAM. Relevant for fonts stored in off-chip persistent storage, such as external flash. |
43| `QUANTUM_PAINTER_SUPPORTS_NATIVE_COLORS` | `FALSE` | If native color range is supported. Requires significantly more RAM on the MCU. | 43| `QUANTUM_PAINTER_PIXDATA_BUFFER_SIZE` | `32` | The limit of the amount of pixel data that can be transmitted in one transaction to the display. Higher values require more RAM on the MCU. |
44| `QUANTUM_PAINTER_DEBUG` | _unset_ | Prints out significant amounts of debugging information to CONSOLE output. Significant performance degradation, use only for debugging. | 44| `QUANTUM_PAINTER_SUPPORTS_256_PALETTE` | `FALSE` | If 256-color palettes are supported. Requires significantly more RAM on the MCU. |
45| `QUANTUM_PAINTER_SUPPORTS_NATIVE_COLORS` | `FALSE` | If native color range is supported. Requires significantly more RAM on the MCU. |
46| `QUANTUM_PAINTER_DEBUG` | _unset_ | Prints out significant amounts of debugging information to CONSOLE output. Significant performance degradation, use only for debugging. |
47| `QUANTUM_PAINTER_DEBUG_ENABLE_FLUSH_TASK_OUTPUT` | _unset_ | By default, debug output is disabled while the internal task is flushing the display(s). If you want to keep it enabled, add this to your `config.h`. Note: Console will get clogged. |
48
45 49
46Drivers have their own set of configurable options, and are described in their respective sections. 50Drivers have their own set of configurable options, and are described in their respective sections.
47 51
diff --git a/docs/squeezing_avr.md b/docs/squeezing_avr.md
index 62db7f2471..ce9e43cdae 100644
--- a/docs/squeezing_avr.md
+++ b/docs/squeezing_avr.md
@@ -194,6 +194,7 @@ That said, there are a number of Pro Micro replacements with ARM controllers:
194* [Blok](https://boardsource.xyz/store/628b95b494dfa308a6581622) 194* [Blok](https://boardsource.xyz/store/628b95b494dfa308a6581622)
195* [Elite-Pi](https://keeb.io/products/elite-pi-usb-c-pro-micro-replacement-rp2040) 195* [Elite-Pi](https://keeb.io/products/elite-pi-usb-c-pro-micro-replacement-rp2040)
196* [0xCB Helios](https://keeb.supply/products/0xcb-helios) ([Open Source](https://github.com/0xCB-dev/0xCB-Helios), DIY/PCBA/Shop) 196* [0xCB Helios](https://keeb.supply/products/0xcb-helios) ([Open Source](https://github.com/0xCB-dev/0xCB-Helios), DIY/PCBA/Shop)
197* [Liatris](https://splitkb.com/products/liatris)
197* [Michi](https://github.com/ci-bus/michi-promicro-rp2040) 198* [Michi](https://github.com/ci-bus/michi-promicro-rp2040)
198 199
199There are other, non-Pro Micro compatible boards out there. The most popular being: 200There are other, non-Pro Micro compatible boards out there. The most popular being:
diff --git a/docs/tap_hold.md b/docs/tap_hold.md
index 348e2655eb..cdc1cfeca7 100644
--- a/docs/tap_hold.md
+++ b/docs/tap_hold.md
@@ -130,20 +130,18 @@ Note that until the tap-or-hold decision completes (which happens when either th
130 130
131To better illustrate the tap-or-hold decision modes, let us compare the expected output of each decision mode in a handful of tapping scenarios involving a mod-tap key (`LSFT_T(KC_A)`) and a regular key (`KC_B`) with the `TAPPING_TERM` set to 200ms. 131To better illustrate the tap-or-hold decision modes, let us compare the expected output of each decision mode in a handful of tapping scenarios involving a mod-tap key (`LSFT_T(KC_A)`) and a regular key (`KC_B`) with the `TAPPING_TERM` set to 200ms.
132 132
133By default, mod-taps behave like `HOLD_ON_OTHER_KEY_PRESS`, while layer-taps behave like "Ignore Interrupt" out of the box. If you want "Ignore Interrupt"-like behaviour for mod-taps, you must enable `IGNORE_MOD_TAP_INTERRUPT`, or return `false` in the `get_hold_on_other_key_press` function for all mod-taps.
134
135Note: "`kc` held" in the "Physical key event" column means that the key wasn't physically released yet at this point in time. 133Note: "`kc` held" in the "Physical key event" column means that the key wasn't physically released yet at this point in time.
136 134
137#### Distinct taps (AABB) :id=distinct-taps 135#### Distinct taps (AABB) :id=distinct-taps
138 136
139| Time | Physical key event |Ignore Interrupt| `PERMISSIVE_HOLD` | `HOLD_ON_OTHER_KEY_PRESS` | 137| Time | Physical key event | Default | `PERMISSIVE_HOLD` | `HOLD_ON_OTHER_KEY_PRESS` |
140|------|--------------------|----------------|-------------------|----------------------------| 138|------|--------------------|----------------|-------------------|----------------------------|
141| 0 | `LSFT_T(KC_A)` down| | | | 139| 0 | `LSFT_T(KC_A)` down| | | |
142| 199 | `LSFT_T(KC_A)` up | a | a | a | 140| 199 | `LSFT_T(KC_A)` up | a | a | a |
143| 210 | `KC_B` down | ab | ab | ab | 141| 210 | `KC_B` down | ab | ab | ab |
144| 220 | `KC_B` up | ab | ab | ab | 142| 220 | `KC_B` up | ab | ab | ab |
145 143
146| Time | Physical key event |Ignore Interrupt| `PERMISSIVE_HOLD` | `HOLD_ON_OTHER_KEY_PRESS` | 144| Time | Physical key event | Default | `PERMISSIVE_HOLD` | `HOLD_ON_OTHER_KEY_PRESS` |
147|------|--------------------|----------------|-------------------|----------------------------| 145|------|--------------------|----------------|-------------------|----------------------------|
148| 0 | `LSFT_T(KC_A)` down| | | | 146| 0 | `LSFT_T(KC_A)` down| | | |
149| 200 | `LSFT_T(KC_A)` held|<kbd>Shift</kbd>| <kbd>Shift</kbd> | <kbd>Shift</kbd> | 147| 200 | `LSFT_T(KC_A)` held|<kbd>Shift</kbd>| <kbd>Shift</kbd> | <kbd>Shift</kbd> |
@@ -153,14 +151,14 @@ Note: "`kc` held" in the "Physical key event" column means that the key wasn't p
153 151
154#### Nested tap (ABBA) :id=nested-tap 152#### Nested tap (ABBA) :id=nested-tap
155 153
156| Time | Physical key event |Ignore Interrupt| `PERMISSIVE_HOLD` | `HOLD_ON_OTHER_KEY_PRESS` | 154| Time | Physical key event | Default | `PERMISSIVE_HOLD` | `HOLD_ON_OTHER_KEY_PRESS` |
157|------|--------------------|----------------|-------------------|----------------------------| 155|------|--------------------|----------------|-------------------|----------------------------|
158| 0 | `LSFT_T(KC_A)` down| | | | 156| 0 | `LSFT_T(KC_A)` down| | | |
159| 110 | `KC_B` down | | | B | 157| 110 | `KC_B` down | | | B |
160| 120 | `KC_B` up | | B | B | 158| 120 | `KC_B` up | | B | B |
161| 199 | `LSFT_T(KC_A)` up | ab | B | B | 159| 199 | `LSFT_T(KC_A)` up | ab | B | B |
162 160
163| Time | Physical key event |Ignore Interrupt| `PERMISSIVE_HOLD` | `HOLD_ON_OTHER_KEY_PRESS` | 161| Time | Physical key event | Default | `PERMISSIVE_HOLD` | `HOLD_ON_OTHER_KEY_PRESS` |
164|------|--------------------|----------------|-------------------|----------------------------| 162|------|--------------------|----------------|-------------------|----------------------------|
165| 0 | `LSFT_T(KC_A)` down| | | | 163| 0 | `LSFT_T(KC_A)` down| | | |
166| 110 | `KC_B` down | | | B | 164| 110 | `KC_B` down | | | B |
@@ -168,7 +166,7 @@ Note: "`kc` held" in the "Physical key event" column means that the key wasn't p
168| 200 | `LSFT_T(KC_A)` held| B | B | B | 166| 200 | `LSFT_T(KC_A)` held| B | B | B |
169| 210 | `LSFT_T(KC_A)` up | B | B | B | 167| 210 | `LSFT_T(KC_A)` up | B | B | B |
170 168
171| Time | Physical key event |Ignore Interrupt| `PERMISSIVE_HOLD` | `HOLD_ON_OTHER_KEY_PRESS` | 169| Time | Physical key event | Default | `PERMISSIVE_HOLD` | `HOLD_ON_OTHER_KEY_PRESS` |
172|------|--------------------|----------------|-------------------|----------------------------| 170|------|--------------------|----------------|-------------------|----------------------------|
173| 0 | `LSFT_T(KC_A)` down| | | | 171| 0 | `LSFT_T(KC_A)` down| | | |
174| 200 | `LSFT_T(KC_A)` held|<kbd>Shift</kbd>| <kbd>Shift</kbd> | <kbd>Shift</kbd> | 172| 200 | `LSFT_T(KC_A)` held|<kbd>Shift</kbd>| <kbd>Shift</kbd> | <kbd>Shift</kbd> |
@@ -178,14 +176,14 @@ Note: "`kc` held" in the "Physical key event" column means that the key wasn't p
178 176
179#### Rolling keys (ABAB) :id=rolling-keys 177#### Rolling keys (ABAB) :id=rolling-keys
180 178
181| Time | Physical key event |Ignore Interrupt| `PERMISSIVE_HOLD` | `HOLD_ON_OTHER_KEY_PRESS` | 179| Time | Physical key event | Default | `PERMISSIVE_HOLD` | `HOLD_ON_OTHER_KEY_PRESS` |
182|------|--------------------|----------------|-------------------|----------------------------| 180|------|--------------------|----------------|-------------------|----------------------------|
183| 0 | `LSFT_T(KC_A)` down| | | | 181| 0 | `LSFT_T(KC_A)` down| | | |
184| 110 | `KC_B` down | | | B | 182| 110 | `KC_B` down | | | B |
185| 130 | `LSFT_T(KC_A)` up | ab | ab | B | 183| 130 | `LSFT_T(KC_A)` up | ab | ab | B |
186| 140 | `KC_B` up | ab | ab | B | 184| 140 | `KC_B` up | ab | ab | B |
187 185
188| Time | Physical key event |Ignore Interrupt| `PERMISSIVE_HOLD` | `HOLD_ON_OTHER_KEY_PRESS` | 186| Time | Physical key event | Default | `PERMISSIVE_HOLD` | `HOLD_ON_OTHER_KEY_PRESS` |
189|------|--------------------|----------------|-------------------|----------------------------| 187|------|--------------------|----------------|-------------------|----------------------------|
190| 0 | `LSFT_T(KC_A)` down| | | | 188| 0 | `LSFT_T(KC_A)` down| | | |
191| 110 | `KC_B` down | | | B | 189| 110 | `KC_B` down | | | B |
@@ -241,10 +239,8 @@ Example sequence 3 (Mod Tap):
241 | +--------------+ | | 239 | +--------------+ | |
242 +---------------------------|--------+ 240 +---------------------------|--------+
243``` 241```
244Based on previous examples, you might have expected the output of the above sequence to be `KC_A` `KC_X` 242In the above sequence, `SFT_T(KC_A)` has been released before the end of its `TAPPING_TERM` and as such will be interpreted as `KC_A`,
245since `SFT_T(KC_A)` is NOT held longer than the `TAPPING_TERM`. 243followed by any key event that happened after the initial press of `SFT_T(KC_A)`. In this instance, the output would be `KC_A` `KC_X`.
246However, the actual output would be capital `X` (`SHIFT` + `x`) due to reasons
247explained under [Ignore Mod Tap Interrupt](#ignore-mod-tap-interrupt).
248 244
249### Permissive Hold 245### Permissive Hold
250 246
@@ -379,73 +375,6 @@ bool get_hold_on_other_key_press(uint16_t keycode, keyrecord_t *record) {
379} 375}
380``` 376```
381 377
382
383## Ignore Mod Tap Interrupt
384
385To enable this setting, add this to your `config.h`:
386
387```c
388#define IGNORE_MOD_TAP_INTERRUPT
389```
390
391?> This option affects only the Mod Tap keys; it does not affect other dual-role keys such as Layer Tap.
392
393By default, the tap-or-hold decision for Mod Tap keys strongly prefers the hold action. If you press a Mod Tap key, then press another key while still holding the Mod Tap key down, the Mod Tap press will be handled as a modifier hold even if the Mod Tap key is then released within the tapping term, and irrespective of the order in which those keys are released. Using options such as `PERMISSIVE_HOLD` or `HOLD_ON_OTHER_KEY_PRESS` will not affect the functionality of Mod Tap keys in a major way (these options would still affect the delay until the common code for dual-role keys finishes its tap-or-hold decision, but then the special code for Mod Tap keys will override the result of that decision and choose the hold action if another key was pressed). In fact, by default, the tap-or-hold decision for Mod Tap keys is done in the same way as if the `HOLD_ON_OTHER_KEY_PRESS` option was enabled, but without the decreased delay provided by `HOLD_ON_OTHER_KEY_PRESS`.
394
395If the `IGNORE_MOD_TAP_INTERRUPT` option is enabled, Mod Tap keys are no longer treated as a special case, and their behavior will match the behavior of other dual-role keys such as Layer Tap. Then the behavior of Mod Tap keys can be further tuned using other options such as `PERMISSIVE_HOLD` or `HOLD_ON_OTHER_KEY_PRESS`.
396
397An example of a sequence that will be affected by the `IGNORE_MOD_TAP_INTERRUPT` option (assuming that options like `PERMISSIVE_HOLD` or `HOLD_ON_OTHER_KEY_PRESS` are not enabled):
398
399- `SFT_T(KC_A)` Down
400- `KC_X` Down
401- `SFT_T(KC_A)` Up
402- `KC_X` Up
403
404```
405 TAPPING_TERM
406 +---------------------------|--------+
407 | +-------------+ | |
408 | | SFT_T(KC_A) | | |
409 | +-------------+ | |
410 | +--------------+ | |
411 | | KC_X | | |
412 | +--------------+ | |
413 +---------------------------|--------+
414```
415
416Normally, this would send a capital `X` (`SHIFT`+`x`), even if the sequence is performed faster than the `TAPPING_TERM`. However, if the `IGNORE_MOD_TAP_INTERRUPT` option is enabled, the `SFT_T(KC_A)` key must be held longer than the `TAPPING_TERM` to register the hold action. A quick tap will output `ax` in this case, while a hold will still output a capital `X` (`SHIFT`+`x`).
417
418However, if the `HOLD_ON_OTHER_KEY_PRESS` option is enabled in addition to `IGNORE_MOD_TAP_INTERRUPT`, the above sequence will again send a capital `X` (`SHIFT`+`x`) even if performed faster than the `TAPPING_TERM`. The difference from the default configuration is that by default the host will receive the key events only after the `SFT_T(KC_A)` key is released, but with the `HOLD_ON_OTHER_KEY_PRESS` option, the host will start receiving key events when the `KC_X` key is pressed.
419
420For more granular control of this feature, you can add the following to your `config.h`:
421
422```c
423#define HOLD_ON_OTHER_KEY_PRESS_PER_KEY
424```
425
426?> This option affects *all* dual-role keys.
427
428You can then add the following function to your keymap:
429
430```c
431bool get_hold_on_other_key_press(uint16_t keycode, keyrecord_t *record) {
432 switch (keycode) {
433 case SFT_T(KC_SPC):
434 // Do not force the mod-tap key press to be handled as a modifier
435 // if any other key was pressed while the mod-tap key is held down.
436 return false;
437 default:
438 // Force the dual-role key press to be handled as a modifier if any
439 // other key was pressed while the mod-tap key is held down.
440 return true;
441 }
442}
443```
444
445Note that you must return `false` in `get_hold_on_other_key_press` in order to apply `IGNORE_MOD_TAP_INTERRUPT` for a certain mod-tap key.
446
447?> `IGNORE_MOD_TAP_INTERRUPT[_PER_KEY]` is being progressively phased out to align the (default) behavior and configuration of mod-taps with the rest of dual-role keys.
448
449## Quick Tap Term 378## Quick Tap Term
450 379
451When the user holds a key after tapping it, the tapping function is repeated by default, rather than activating the hold function. This allows keeping the ability to auto-repeat the tapping function of a dual-role key. `QUICK_TAP_TERM` enables fine tuning of that ability. If set to `0`, it will remove the auto-repeat ability and activate the hold function instead. 380When the user holds a key after tapping it, the tapping function is repeated by default, rather than activating the hold function. This allows keeping the ability to auto-repeat the tapping function of a dual-role key. `QUICK_TAP_TERM` enables fine tuning of that ability. If set to `0`, it will remove the auto-repeat ability and activate the hold function instead.
diff --git a/docs/understanding_qmk.md b/docs/understanding_qmk.md
index 7b436a45be..7cb46bd8cf 100644
--- a/docs/understanding_qmk.md
+++ b/docs/understanding_qmk.md
@@ -129,6 +129,8 @@ The `process_record()` function itself is deceptively simple, but hidden within
129 129
130* [`void action_exec(keyevent_t event)`](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/action.c#L78-L140) 130* [`void action_exec(keyevent_t event)`](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/action.c#L78-L140)
131 * [`void pre_process_record_quantum(keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/quantum.c#L204) 131 * [`void pre_process_record_quantum(keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/quantum.c#L204)
132 * [`bool pre_process_record_kb(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/27119fa77e8a1b95fff80718d3db4f3e32849298/quantum/quantum.c#L117)
133 * [`bool pre_process_record_user(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/27119fa77e8a1b95fff80718d3db4f3e32849298/quantum/quantum.c#L121)
132 * [`bool process_combo(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_combo.c#L521) 134 * [`bool process_combo(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_combo.c#L521)
133 * [`void process_record(keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/action.c#L254) 135 * [`void process_record(keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/action.c#L254)
134 * [`bool process_record_quantum(keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/quantum.c#L224) 136 * [`bool process_record_quantum(keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/quantum.c#L224)
diff --git a/docs/ws2812_driver.md b/docs/ws2812_driver.md
index 5942da28d1..f8cad20ce0 100644
--- a/docs/ws2812_driver.md
+++ b/docs/ws2812_driver.md
@@ -72,12 +72,12 @@ WS2812_DRIVER = i2c
72 72
73Configure the hardware via your config.h: 73Configure the hardware via your config.h:
74```c 74```c
75#define WS2812_ADDRESS 0xb0 // default: 0xb0 75#define WS2812_I2C_ADDRESS 0xB0 // default: 0xB0
76#define WS2812_TIMEOUT 100 // default: 100 76#define WS2812_I2C_TIMEOUT 100 // default: 100
77``` 77```
78 78
79### SPI 79### SPI
80Targeting STM32 boards where WS2812 support is offloaded to an SPI hardware device. The advantage is that the use of DMA offloads processing of the WS2812 protocol from the MCU. `RGB_DI_PIN` for this driver is the configured SPI MOSI pin. Due to the nature of repurposing SPI to drive the LEDs, the other SPI pins, MISO and SCK, **must** remain unused. To configure it, add this to your rules.mk: 80Targeting STM32 boards where WS2812 support is offloaded to an SPI hardware device. The advantage is that the use of DMA offloads processing of the WS2812 protocol from the MCU. `WS2812_DI_PIN` for this driver is the configured SPI MOSI pin. Due to the nature of repurposing SPI to drive the LEDs, the other SPI pins, MISO and SCK, **must** remain unused. To configure it, add this to your rules.mk:
81 81
82```make 82```make
83WS2812_DRIVER = spi 83WS2812_DRIVER = spi
@@ -183,7 +183,7 @@ This can be configured for bitbang, PWM and SPI.
183 183
184Note: This only applies to STM32 boards. 184Note: This only applies to STM32 boards.
185 185
186 To configure the `RGB_DI_PIN` to open drain configuration add this to your config.h file: 186 To configure the `WS2812_DI_PIN` to open drain configuration add this to your config.h file:
187```c 187```c
188#define WS2812_EXTERNAL_PULLUP 188#define WS2812_EXTERNAL_PULLUP
189``` 189```
diff --git a/docs/zh-cn/_summary.md b/docs/zh-cn/_summary.md
index 3baee6dc2e..0fc92e33d3 100644
--- a/docs/zh-cn/_summary.md
+++ b/docs/zh-cn/_summary.md
@@ -42,7 +42,6 @@
42 * [键映射总览](zh-cn/keymap.md) 42 * [键映射总览](zh-cn/keymap.md)
43 * 开发环境 43 * 开发环境
44 * [Docker指南](zh-cn/getting_started_docker.md) 44 * [Docker指南](zh-cn/getting_started_docker.md)
45 * [Vagrant指南](zh-cn/getting_started_vagrant.md)
46 * 刷写(Flashing) 45 * 刷写(Flashing)
47 * [刷写](zh-cn/flashing.md) 46 * [刷写](zh-cn/flashing.md)
48 * [刷写ATmega32A (ps2avrgb)](zh-cn/flashing_bootloadhid.md) 47 * [刷写ATmega32A (ps2avrgb)](zh-cn/flashing_bootloadhid.md)
@@ -74,6 +73,7 @@
74 * [Mod-Tap](zh-cn/mod_tap.md) 73 * [Mod-Tap](zh-cn/mod_tap.md)
75 * [宏](zh-cn/feature_macros.md) 74 * [宏](zh-cn/feature_macros.md)
76 * [鼠标键](zh-cn/feature_mouse_keys.md) 75 * [鼠标键](zh-cn/feature_mouse_keys.md)
76 * [Repeat Key](zh-cn/feature_repeat_key.md)
77 * [Space Cadet Shift](zh-cn/feature_space_cadet.md) 77 * [Space Cadet Shift](zh-cn/feature_space_cadet.md)
78 * [US ANSI上档键值](zh-cn/keycodes_us_ansi_shifted.md) 78 * [US ANSI上档键值](zh-cn/keycodes_us_ansi_shifted.md)
79 79
@@ -188,5 +188,5 @@
188 * [Midi辅助功能](zh-cn/internals/midi_util.md) 188 * [Midi辅助功能](zh-cn/internals/midi_util.md)
189 * [发送函数](zh-cn/internals/send_functions.md) 189 * [发送函数](zh-cn/internals/send_functions.md)
190 * [Sysex工具](zh-cn/internals/sysex_tools.md) 190 * [Sysex工具](zh-cn/internals/sysex_tools.md)
191 191
192<!--fromen:20211014-12:00(GMT+8) commit 04cf161aa01fd433b5dae69d9fd31569ed5dca59--> 192<!--fromen:20211014-12:00(GMT+8) commit 04cf161aa01fd433b5dae69d9fd31569ed5dca59-->
diff --git a/docs/zh-cn/getting_started_vagrant.md b/docs/zh-cn/getting_started_vagrant.md
deleted file mode 100644
index 5e5de44552..0000000000
--- a/docs/zh-cn/getting_started_vagrant.md
+++ /dev/null
@@ -1,61 +0,0 @@
1# Vagrant快速上手指引
2
3<!---
4 original document: 0.15.12:docs/getting_started_vagrant.md
5 git diff 0.15.12 HEAD -- docs/getting_started_vagrant.md | cat
6-->
7
8本工程包含一份 `Vagrantfile`,可以方便地在不更改你系统环境情况下完成新固件文件的构建工作。这同时也保证了在你拉取该工程代码后的编译环境与也使用Vagrantfile的其它人的一致。当你需要其他人协助你排查遇到的问题时会方便很多。
9
10## 需求
11
12本工程中的 `Vagrantfile` 需要安装[Vagrant](https://www.vagrantup.com/)以及可用的虚拟机服务:
13
14* [VirtualBox](https://www.virtualbox.org/) (5.0.12及以后版本)
15 * 卖点是'最适用于Vagrant的平台'
16* [VMware Workstation](https://www.vmware.com/products/workstation) 及 [Vagrant VMware插件](https://www.vagrantup.com/vmware)
17 * (付费购买的)VMware插件需要在经过正版授权的VMware Workstation/Fusion上运行
18* [Docker](https://www.docker.com/)
19
20安装了Vagrant之后,在安装合适的虚拟机服务后可能需要重启机器。拉取本工程后在工程目录下执行 'vagrant up' 将启动一个包含了所有本工程所需工具的构建环境(虚拟机或是容器)。最后会有一个vagrant启动提示告知你一切正常就绪,否则你也可以参考一下下面的构建文档。
21
22## 刷写固件
23
24比较“简单”的方案是在你的宿主系统上借助以下工具刷写固件:
25
26* [QMK工具箱](https://github.com/qmk/qmk_toolbox) (推荐)
27* [Teensy Loader](https://www.pjrc.com/teensy/loader.html)
28
29如果你希望通过命令行进行编程工作,可以在Vagrantfile中取消掉['modifyvm']的注释以允许USB直通到Linux环境,既可以使用dfu-util/dfu-programmer之类的命令行工具进行编程工作,或是安装Teensy的命令行版本。
30
31## Vagrantfile概览
32开发环境被配置为运行QMK Docker镜像 `qmkfm/qmk_cli`,不仅让各系统下的功能预期一致,也是我们CI环境的镜像。
33
34## FAQ
35
36### 为什么我的VirtualBox环境会有问题?
37VirtualBox 5的某些版本与工程中Vagrantfile中指定的VirtualBox扩展存在兼容问题。如果你遇到了/vagrant挂载不成功的问题,请升级VirtualBox至5.0.12或更高版本。**或者,可以尝试执行如下命令:**
38
39```console
40vagrant plugin install vagrant-vbguest
41```
42
43### 如何移除一个现有环境?
44不再需要这个环境了是吗?在本工程目录下的任何位置,执行:
45
46```console
47vagrant destroy
48```
49
50### 如果我是想直接用Docker呢?
51想在不使用虚拟机技术的情况下也能使用Vagrant工作流?Vagrangfile已配置为允许绕过运行虚拟机,直接运行容器。通过如下方式执行命令可以强制使用Docker来启动环境:
52```console
53vagrant up --provider=docker
54```
55
56### 如何访问虚拟机环境而非Docker容器?
57通过如下方法跳过 `vagrant` 的用户初始化过程以在QMK构建镜像中直接执行:
58
59```console
60vagrant ssh -c 'sudo -i'
61```
diff --git a/docs/zh-cn/mod_tap.md b/docs/zh-cn/mod_tap.md
index 5bf18a1527..9dc59bfb79 100644
--- a/docs/zh-cn/mod_tap.md
+++ b/docs/zh-cn/mod_tap.md
@@ -117,8 +117,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
117} 117}
118``` 118```
119 119
120在数字及字母键上使用Mod-Tap时推荐启用 `IGNORE_MOD_TAP_INTERRUPT`,以避免在快速按下下一个键时保持功能优先级。参见[忽略Mod Tap中断](zh-cn/tap_hold.md#ignore-mod-tap-interrupt)。
121
122### 同时改变点击和按住功能 120### 同时改变点击和按住功能
123 121
124最后一个例子通过 `LT(0,KC_NO)` 实现了点击复制,按住粘贴的功能: 122最后一个例子通过 `LT(0,KC_NO)` 实现了点击复制,按住粘贴的功能: