aboutsummaryrefslogtreecommitdiff
path: root/docs
diff options
context:
space:
mode:
authorJames Young <18669334+noroadsleft@users.noreply.github.com>2020-05-30 13:14:59 -0700
committerGitHub <noreply@github.com>2020-05-30 13:14:59 -0700
commitfced377ac007d27f2650ccffbe0b18abcdcfe23d (patch)
treebd5b141987394a5a16cfc416bfe2b9efdb14d067 /docs
parent7b8a013826ad90714a05ea522de53adf964ab3b9 (diff)
downloadqmk_firmware-fced377ac007d27f2650ccffbe0b18abcdcfe23d.tar.gz
qmk_firmware-fced377ac007d27f2650ccffbe0b18abcdcfe23d.zip
2020 May 30 Breaking Changes Update (#9215)
* Branch point for 2020 May 30 Breaking Change * Migrate `ACTION_LAYER_TOGGLE` to `TG()` (#8954) * Migrate `ACTION_MODS_ONESHOT` to `OSM()` (#8957) * Migrate `ACTION_DEFAULT_LAYER_SET` to `DF()` (#8958) * Migrate `ACTION_LAYER_MODS` to `LM()` (#8959) * Migrate `ACTION_MODS_TAP_KEY` to `MT()` (#8968) * Convert V-USB usbdrv to a submodule (#8321) * Unify Tap Hold functions and documentation (#8348) * Changing board names to prevent confusion (#8412) * Move the Keyboardio Model01 to a keyboardio/ subdir (#8499) * Move spaceman keyboards (#8830) * Migrate miscellaneous `fn_actions` entries (#8977) * Migrate `ACTION_MODS_KEY` to chained mod keycodes (#8979) * Organizing my keyboards (plaid, tartan, ergoinu) (#8537) * Refactor Lily58 to use split_common (#6260) * Refactor zinc to use split_common (#7114) * Add a message if bin/qmk doesn't work (#9000) * Fix conflicting types for 'tfp_printf' (#8269) * Fixed RGB_DISABLE_AFTER_TIMEOUT to be seconds based & small internals cleanup (#6480) * Refactor and updates to TKC1800 code (#8472) * Switch to qmk forks for everything (#9019) * audio refactor: replace deprecated PLAY_NOTE_ARRAY (#8484) * Audio enable corrections (2/3) (#8903) * Split HHKB to ANSI and JP layouts and Add VIA support for each (#8582) * Audio enable corrections (Part 4) (#8974) * Fix typo from PR7114 (#9171) * Augment future branch Changelogs (#8978) * Revert "Branch point for 2020 May 30 Breaking Change"
Diffstat (limited to 'docs')
-rw-r--r--docs/ChangeLog/20200530.md239
-rw-r--r--docs/_summary.md1
-rw-r--r--docs/breaking_changes.md45
-rw-r--r--docs/breaking_changes_instructions.md2
-rw-r--r--docs/custom_quantum_functions.md57
-rw-r--r--docs/feature_rgb_matrix.md3
-rw-r--r--docs/ja/custom_quantum_functions.md8
-rw-r--r--docs/tap_hold.md87
-rw-r--r--docs/zh-cn/custom_quantum_functions.md6
9 files changed, 349 insertions, 99 deletions
diff --git a/docs/ChangeLog/20200530.md b/docs/ChangeLog/20200530.md
new file mode 100644
index 000000000..9def9ae12
--- /dev/null
+++ b/docs/ChangeLog/20200530.md
@@ -0,0 +1,239 @@
1# QMK Breaking Change - 2020 May 30 Changelog
2
3Four times a year QMK runs a process for merging Breaking Changes. A Breaking Change is any change which modifies how QMK behaves in a way that is incompatible or potentially dangerous. We limit these changes to 4 times per year so that users can have confidence that updating their QMK tree will not break their keymaps.
4
5The list of changes follows.
6
7
8## Core Changes
9
10### Converting V-USB usbdrv to a submodule
11
12[#8321](https://github.com/qmk/qmk_firmware/pull/8321) and [qmk_compiler#62](https://github.com/qmk/qmk_compiler/pull/62).
13
14These PRs move the V-USB driver code out of the qmk_firmware repository and into a submodule pointed at https://github.com/obdev/v-usb. This will make it easier to update the codebase if needed, while applying any potential QMK-specific modifications by forking it to the QMK GitHub organization.
15
16### Unify Tap Hold functions and documentation
17
18[#8348](https://github.com/qmk/qmk_firmware/pull/8348)
19
20Updates all of the per key tap-hold functions to pass the `keyrecord_t` structure, and include documentation changes.
21
22Any remaining versions or code outside of the main repo will need to be converted:
23| Old function | New Function |
24|------------------------------------------------------|---------------------------------------------------------------------------|
25|`uint16_t get_tapping_term(uint16_t keycode)` |`uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record)` |
26|`bool get_ignore_mod_tap_interrupt(uint16_t keycode)` |`bool get_ignore_mod_tap_interrupt(uint16_t keycode, keyrecord_t *record)` |
27
28### Python Required In The Build Process
29
30[#9000](https://github.com/qmk/qmk_firmware/pull/9000)
31
32This is the last release of QMK that will work without having Python 3.6 (or later) installed. If your environment is not fully setup you will get a warning instructing you to set it up.
33
34After the next breaking change you will not be able to build if `bin/qmk hello` does not work.
35
36### Upgrade from tinyprintf to mpaland/printf
37
38[#8269](https://github.com/qmk/qmk_firmware/pull/8269)
39
40- Provides debug functionality on ChibiOS/ARM that is more compliant than previous integrations.
41- Less maintenence, fewer QMK customisations, and allows QMK to sidestep previous compile and runtime issues.
42- A `make git-submodule` may be required after pulling the latest QMK Firmware code to update to the new dependency.
43
44### Fixed RGB_DISABLE_AFTER_TIMEOUT to be seconds based & small internals cleanup
45
46[#6480](https://github.com/qmk/qmk_firmware/pull/6480)
47
48- Changes `RGB_DISABLE_AFTER_TIMEOUT` to be based on milliseconds instead of ticks.
49- Includes a code cleanup, resulting in a savings of 100 bytes, depending on features used.
50- Fixed issues with timeouts / suspending at the wrong time not turning off all LEDs in some cases.
51
52The `RGB_DISABLE_AFTER_TIMEOUT` definition is now deprecated, and has been superseded by `RGB_DISABLE_TIMEOUT`. To use the new definition, rename `RGB_DISABLE_AFTER_TIMEOUT` to `RGB_DISABLE_TIMEOUT` in your `config.h` file, and multiply the value set by 1200.
53
54Before: `#define RGB_DISABLE_AFTER_TIMEOUT 100`
55After: `#define RGB_DISABLE_TIMEOUT 120000`
56
57### Switch to qmk forks for everything
58
59[#9019](https://github.com/qmk/qmk_firmware/pull/9019)
60
61Fork all QMK submodules to protect against upstream repositories disappearing.
62
63### code cleanup regarding deprecated macro PLAY_NOTE_ARRAY by replacing it with PLAY_SONG
64
65[#8484](https://github.com/qmk/qmk_firmware/pull/8484)
66
67Removes the deprecated `PLAY_NOTE_ARRAY` macro. References to it are replaced with `PLAY_SONG`, which references the same function.
68
69### fixing wrong configuration of AUDIO feature
70
71[#8903](https://github.com/qmk/qmk_firmware/pull/8903) and [#8974](https://github.com/qmk/qmk_firmware/pull/8974)
72
73`audio_avr.c` does not default to any pin; there has to be a #define XX_AUDIO in config.h at some level for Audio to actually work. Otherwise, the Audio code ends up cluttering the firmware, possibly breaking builds because the maximum allowed firmware size is exceeded.
74
75These changes fix this by disabling Audio on keyboards that have the feature misconfigured, and therefore non-functional.
76
77Also, add a compile-time error to alert the user to a missing pin-configuration (on AVR boards) when `AUDIO_ENABLE = yes` is set.
78
79
80## Keyboard Refactors
81
82### Migrating Lily58 to use split_common
83
84[#6260](https://github.com/qmk/qmk_firmware/pull/6260)
85
86Modifies the default firmware for Lily58 to use the `split_common` library, instead of including and depending on its own set of libraries for the following functionality:
87
88- SSD1306 display
89- i2c for OLED
90- Serial Communication
91
92This allows current lily58 firmware to advance with updates to the `split_common` library, which is shared with many other split keyboards.
93
94#### To migrate existing Lily58 firmware:
95
96[Changes to `config.h`](https://github.com/qmk/qmk_firmware/pull/6260/files#diff-445ac369c8717dcd6fc6fc3630836fc1):
97- Remove `#define SSD1306OLED` from config.h
98
99
100[Changes to `keymap.c`](https://github.com/qmk/qmk_firmware/pull/6260/files#diff-20943ea59856e9bdf3d99ecb2eee40b7):
101- Find/Replace each instance of `#ifdef SSD1306OLED` with `#ifdef OLED_DRIVER_ENABLE`
102- The following changes are for compatibility with the OLED driver. If you don't use the OLED driver you may safely delete [this section](https://github.com/qmk/qmk_firmware/blob/e6b9980bd45c186f7360df68c24b6e05a80c10dc/keyboards/lily58/keymaps/default/keymap.c#L144-L190)
103- Alternatively, if you did not change the OLED code from that in `default`, you may find it easier to simply copy the [relevant section](https://github.com/qmk/qmk_firmware/blob/4ac310668501ae6786c711ecc8f01f62ddaa1c0b/keyboards/lily58/keymaps/default/keymap.c#L138-L172). Otherwise, the changes you need to make are as follows (sample change [here](https://github.com/qmk/qmk_firmware/pull/6260/files#diff-20943ea59856e9bdf3d99ecb2eee40b7R138-R173))
104- [Remove](https://github.com/qmk/qmk_firmware/pull/6260/files#diff-20943ea59856e9bdf3d99ecb2eee40b7L138-L141) the block
105```c
106#ifdef SSD1306OLED
107 iota_gfx_init(!has_usb()); // turns on the display
108#endif
109```
110- Within the block bounded by `#ifdef OLED_DRIVER_ENABLE` and `#endif // OLED_DRIVER_ENABLE`, add the following block to ensure that your two OLEDs are rotated correctly across the left and right sides:
111```c
112oled_rotation_t oled_init_user(oled_rotation_t rotation) {
113 if (!is_keyboard_master())
114 return OLED_ROTATION_180; // flips the display 180 degrees if offhand
115 return rotation;
116}
117```
118- Remove the functions `matrix_scan_user`, `matrix_update` and `iota_gfx_task_user`
119- Find/Replace `matrix_render_user(struct CharacterMatrix *matrix)` with `iota_gfx_task_user(void)`
120- Find/Replace `is_master` with `is_keyboard_master()`
121- For each instance of `matrix_write_ln(matrix, display_fn())`, rewrite it as `oled_write_ln(read_layer_state(), false);`
122- For each instance of `matrix_write(matrix, read_logo());`, replace with `oled_write(read_logo(), false);`
123
124### Refactor zinc to use split_common
125
126[#7114](https://github.com/qmk/qmk_firmware/pull/7114) and [#9171](https://github.com/qmk/qmk_firmware/pull/9171)
127
128* Refactor to use split_common and remove split codes under the zinc/revx/
129* Add - backlight RGB LED and/or underglow RGB LED option
130* Add - continuous RGB animations feature (between L and R halves)
131* Fix - keymap files to adapt to changes
132 * all authors of keymaps confirmed this PR
133* Update - documents and rules.mk
134
135### Refactor of TKC1800 to use common OLED code
136
137[#8472](https://github.com/qmk/qmk_firmware/pull/8472)
138
139Modifies the default firmware for TKC1800 to use the in-built I2C and OLED drivers, instead of including and depending on its own set of libraries for the following functionality:
140
141- SSD1306 display
142- i2c for OLED
143
144This allows current TKC1800 firmware to advance with updates to those drivers, which are shared with other keyboards.
145
146#### To migrate existing TKC1800 firmware:
147
148[Changes to `config.h`](https://github.com/qmk/qmk_firmware/pull/8472/files#diff-d10b26e676b4a55cbb00d71955116526):
149- Remove `#define SSD1306OLED` from config.h
150
151[Changes to `tkc1800.c`](https://github.com/qmk/qmk_firmware/pull/8472/files#diff-3b35bd30abe89c8110717c6972cd2cc5):
152- Add the following to avoid debug errors on HID_listen if the screen is not present
153```c
154void keyboard_pre_init_kb(void) {
155 setPinInputHigh(D0);
156 setPinInputHigh(D1);
157
158 keyboard_pre_init_user();
159}
160```
161
162[Changes to `keymap.c`](https://github.com/qmk/qmk_firmware/pull/8472/files#diff-05a2a344ce27e4d045fe68520ccd4771):
163- Find/Replace each instance of `#ifdef SSD1306OLED` with `#ifdef OLED_DRIVER_ENABLE`
164- The following changes are for compatibility with the OLED driver. If you don't use the OLED driver you may safely delete [this section](https://github.com/qmk/qmk_firmware/blob/e6b9980bd45c186f7360df68c24b6e05a80c10dc/keyboards/lily58/keymaps/default/keymap.c#L144-L190)
165- [Remove](https://github.com/qmk/qmk_firmware/pull/6260/files#diff-20943ea59856e9bdf3d99ecb2eee40b7L91-L158) the block
166```c
167#ifdef SSD1306OLED
168 iota_gfx_init(!has_usb()); // turns on the display
169#endif
170```
171- Within the block bounded by `#ifdef OLED_DRIVER_ENABLE` and `#endif // OLED_DRIVER_ENABLE`, add the following block to ensure that your two OLEDs are rotated correctly across the left and right sides:
172```c
173oled_rotation_t oled_init_user(oled_rotation_t rotation) {
174 if (!is_keyboard_master())
175 return OLED_ROTATION_180; // flips the display 180 degrees if offhand
176 return rotation;
177}
178```
179- Remove the function `iota_gfx_task_user`
180
181### Split HHKB to ANSI and JP layouts and Add VIA support for each
182
183[#8582](https://github.com/qmk/qmk_firmware/pull/8582)
184
185- Splits the HHKB codebase into two separate folders `keyboards/hhkb/ansi` and `keyboards/hhkb/jp`.
186- Adds VIA Configurator support for both versions.
187
188#### Migrating existing HHKB keymaps
189
190- Remove any checks for the `HHKB_JP` definition
191 - All checks for this definition have been removed, and each version uses the source that is appropriate to that version.
192- Move the directory for your keymap into the appropriate `keymaps` directory
193 - `keyboards/hhkb/ansi/keymaps/` for ANSI HHKBs
194 - `keyboards/hhkb/jp/keymaps/` for HHKB JPs
195- Compile with the new keyboard names
196 - This PR changes the compilation instructions for the HHKB Alternate Controller. To compile firmware for this controller moving forward, use:
197 - `make hhkb/ansi` for ANSI-layout HHKBs
198 - `make hhkb/jp` for HHKB JP keyboards
199
200
201## Keyboard Moves
202
203- [#8412](https://github.com/qmk/qmk_firmware/pull/8412 "Changing board names to prevent confusion") by blindassassin111
204- [#8499](https://github.com/qmk/qmk_firmware/pull/8499 "Move the Keyboardio Model01 to a keyboardio/ subdir") by algernon
205- [#8830](https://github.com/qmk/qmk_firmware/pull/8830 "Move spaceman keyboards") by Spaceman (formerly known as Rionlion100)
206- [#8537](https://github.com/qmk/qmk_firmware/pull/8537 "Organizing my keyboards (plaid, tartan, ergoinu)") by hsgw
207
208Keyboards by Keyboardio, Spaceman, and hsgw move to vendor folders, while PCBs designed by blindassassin111 are renamed.
209
210Old Name | New Name
211:----------------- | :-----------------
2122_milk | spaceman/2_milk
213at101_blackheart | at101_bh
214ergoinu | dm9records/ergoinu
215model01 | keyboardio/model01
216omnikey_blackheart | omnikey_bh
217pancake | spaceman/pancake
218plaid | dm9records/plaid
219tartan | dm9records/tartan
220z150_blackheart | z150_bh
221
222If you own one of these PCBs, please use the new names to compile your firmware moving forward.
223
224
225## Keycode Migration PRs
226
227[#8954](https://github.com/qmk/qmk_firmware/pull/8954 "Migrate `ACTION_LAYER_TOGGLE` to `TG()`"), [#8957](https://github.com/qmk/qmk_firmware/pull/8957 "Migrate `ACTION_MODS_ONESHOT` to `OSM()`"), [#8958](https://github.com/qmk/qmk_firmware/pull/8958 "Migrate `ACTION_DEFAULT_LAYER_SET` to `DF()`"), [#8959](https://github.com/qmk/qmk_firmware/pull/8959 "Migrate `ACTION_LAYER_MODS` to `LM()`"), [#8968](https://github.com/qmk/qmk_firmware/pull/8968 "Migrate `ACTION_MODS_TAP_KEY` to `MT()`"), [#8977](https://github.com/qmk/qmk_firmware/pull/8977 "Migrate miscellaneous `fn_actions` entries"), and [#8979](https://github.com/qmk/qmk_firmware/pull/8979 "Migrate `ACTION_MODS_KEY` to chained mod keycodes")
228
229Authored by fauxpark, these pull requests remove references to deprecated TMK macros that have been superseded by native QMK keycodes.
230
231Old `fn_actions` action | New QMK keycode
232:---------------------- | :--------------
233`ACTION_DEFAULT_LAYER_SET(layer)` | `DF(layer)`
234`ACTION_LAYER_MODS(layer, mod)` | `LM(layer, mod)`
235`ACTION_LAYER_ONESHOT(mod)` | `OSL(mod)`
236`ACTION_LAYER_TOGGLE(layer)` | `TG(layer)`
237`ACTION_MODS_ONESHOT(mod)` | `OSM(mod)`
238`ACTION_MODS_TAP_KEY(mod, kc)` | `MT(mod, kc)`
239`ACTION_MODS_KEY(mod, kc)`<br>e.g. `ACTION_MODS_KEY(MOD_LCTL, KC_0)` | `MOD(kc)`<br>e.g. `LCTL(KC_0)`
diff --git a/docs/_summary.md b/docs/_summary.md
index b3553b428..1b6ddc67c 100644
--- a/docs/_summary.md
+++ b/docs/_summary.md
@@ -115,6 +115,7 @@
115 * [Overview](breaking_changes.md) 115 * [Overview](breaking_changes.md)
116 * [My Pull Request Was Flagged](breaking_changes_instructions.md) 116 * [My Pull Request Was Flagged](breaking_changes_instructions.md)
117 * History 117 * History
118 * [2020 May 30](ChangeLog/20200530.md)
118 * [2020 Feb 29](ChangeLog/20200229.md) 119 * [2020 Feb 29](ChangeLog/20200229.md)
119 * [2019 Aug 30](ChangeLog/20190830.md) 120 * [2019 Aug 30](ChangeLog/20190830.md)
120 121
diff --git a/docs/breaking_changes.md b/docs/breaking_changes.md
index 6c684970d..154695dda 100644
--- a/docs/breaking_changes.md
+++ b/docs/breaking_changes.md
@@ -6,27 +6,28 @@ The breaking change period is when we will merge PR's that change QMK in dangero
6 6
7## What has been included in past Breaking Changes? 7## What has been included in past Breaking Changes?
8 8
9* [2020 May 30](ChangeLog/20200530.md)
9* [2020 Feb 29](ChangeLog/20200229.md) 10* [2020 Feb 29](ChangeLog/20200229.md)
10* [2019 Aug 30](ChangeLog/20190830.md) 11* [2019 Aug 30](ChangeLog/20190830.md)
11 12
12## When is the next Breaking Change? 13## When is the next Breaking Change?
13 14
14The next Breaking Change is scheduled for May 30, 2020. 15The next Breaking Change is scheduled for Aug 29, 2020.
15 16
16### Important Dates 17### Important Dates
17 18
18* [x] 2020 Feb 29 - `future` is created. It will be rebased weekly. 19* [x] 2020 May 30 - `develop` is created. It will be rebased weekly.
19* [ ] 2020 May 2 - `future` closed to new PR's. 20* [ ] 2020 Aug 1 - `develop` closed to new PR's.
20* [ ] 2020 May 2 - Call for testers. 21* [ ] 2020 Aug 1 - Call for testers.
21* [ ] 2020 May 28 - `master` is locked, no PR's merged. 22* [ ] 2020 Aug 27 - `master` is locked, no PR's merged.
22* [ ] 2020 May 30 - Merge `future` to `master`. 23* [ ] 2020 Aug 29 - Merge `develop` to `master`.
23* [ ] 2020 May 30 - `master` is unlocked. PR's can be merged again. 24* [ ] 2020 Aug 29 - `master` is unlocked. PR's can be merged again.
24 25
25## What changes will be included? 26## What changes will be included?
26 27
27To see a list of breaking change candidates you can look at the [`breaking_change` label](https://github.com/qmk/qmk_firmware/pulls?q=is%3Aopen+label%3Abreaking_change+is%3Apr). New changes might be added between now and when `future` is closed, and a PR with that label applied is not guaranteed to be merged. 28To see a list of breaking change candidates you can look at the [`breaking_change` label](https://github.com/qmk/qmk_firmware/pulls?q=is%3Aopen+label%3Abreaking_change+is%3Apr). New changes might be added between now and when `develop` is closed, and a PR with that label applied is not guaranteed to be merged.
28 29
29If you want your breaking change to be included in this round you need to create a PR with the `breaking_change` label and have it accepted before `future` closes. After `future` closes no new breaking changes will be accepted. 30If you want your breaking change to be included in this round you need to create a PR with the `breaking_change` label and have it accepted before `develop` closes. After `develop` closes no new breaking changes will be accepted.
30 31
31Criteria for acceptance: 32Criteria for acceptance:
32 33
@@ -37,9 +38,9 @@ Criteria for acceptance:
37 38
38This section documents various processes we use when running the Breaking Changes process. 39This section documents various processes we use when running the Breaking Changes process.
39 40
40## Rebase `future` from `master` 41## Rebase `develop` from `master`
41 42
42This is run every Friday while `future` is open. 43This is run every Friday while `develop` is open.
43 44
44Process: 45Process:
45 46
@@ -47,31 +48,31 @@ Process:
47cd qmk_firmware 48cd qmk_firmware
48git checkout master 49git checkout master
49git pull --ff-only 50git pull --ff-only
50git checkout future 51git checkout develop
51git rebase master 52git rebase master
52git push --force 53git push --force
53``` 54```
54 55
55## Creating the `future` branch 56## Creating the `develop` branch
56 57
57This happens immediately after the previous `future` branch is merged. 58This happens immediately after the previous `develop` branch is merged.
58 59
59* `qmk_firmware` git commands 60* `qmk_firmware` git commands
60 * [ ] `git checkout master` 61 * [ ] `git checkout master`
61 * [ ] `git pull --ff-only` 62 * [ ] `git pull --ff-only`
62 * [ ] `git checkout -b future` 63 * [ ] `git checkout -b develop`
63 * [ ] Edit `readme.md` 64 * [ ] Edit `readme.md`
64 * [ ] Add a big notice at the top that this is a testing branch. 65 * [ ] Add a big notice at the top that this is a testing branch.
65 * [ ] Include a link to this document 66 * [ ] Include a link to this document
66 * [ ] `git commit -m 'Branch point for <DATE> Breaking Change'` 67 * [ ] `git commit -m 'Branch point for <DATE> Breaking Change'`
67 * [ ] `git tag breakpoint_<YYYY>_<MM>_<DD>` 68 * [ ] `git tag breakpoint_<YYYY>_<MM>_<DD>`
68 * [ ] `git tag <next_version>` # Prevent the breakpoint tag from confusing version incrementing 69 * [ ] `git tag <next_version>` # Prevent the breakpoint tag from confusing version incrementing
69 * [ ] `git push origin future` 70 * [ ] `git push origin develop`
70 * [ ] `git push --tags` 71 * [ ] `git push --tags`
71 72
72## 4 Weeks Before Merge 73## 4 Weeks Before Merge
73 74
74* `future` is now closed to new PR's, only fixes for current PR's may be merged 75* `develop` is now closed to new PR's, only fixes for current PR's may be merged
75* Post call for testers 76* Post call for testers
76 * [ ] Discord 77 * [ ] Discord
77 * [ ] GitHub PR 78 * [ ] GitHub PR
@@ -94,15 +95,15 @@ This happens immediately after the previous `future` branch is merged.
94## Day Of Merge 95## Day Of Merge
95 96
96* `qmk_firmware` git commands 97* `qmk_firmware` git commands
97 * [ ] `git checkout future` 98 * [ ] `git checkout develop`
98 * [ ] `git pull --ff-only` 99 * [ ] `git pull --ff-only`
99 * [ ] `git rebase origin/master` 100 * [ ] `git rebase origin/master`
100 * [ ] Edit `readme.md` 101 * [ ] Edit `readme.md`
101 * [ ] Remove the notes about `future` 102 * [ ] Remove the notes about `develop`
102 * [ ] Roll up the ChangeLog into one file. 103 * [ ] Roll up the ChangeLog into one file.
103 * [ ] `git commit -m 'Merge point for <DATE> Breaking Change'` 104 * [ ] `git commit -m 'Merge point for <DATE> Breaking Change'`
104 * [ ] `git push origin future` 105 * [ ] `git push origin develop`
105* GitHub Actions 106* GitHub Actions
106 * [ ] Create a PR for `future` 107 * [ ] Create a PR for `develop`
107 * [ ] Make sure travis comes back clean 108 * [ ] Make sure travis comes back clean
108 * [ ] Merge `future` PR 109 * [ ] Merge `develop` PR
diff --git a/docs/breaking_changes_instructions.md b/docs/breaking_changes_instructions.md
index 3f2f93834..d83567155 100644
--- a/docs/breaking_changes_instructions.md
+++ b/docs/breaking_changes_instructions.md
@@ -27,7 +27,7 @@ If you are contributing core code, and the only reason it needs to go through br
27 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"). 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 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 `future` &ndash; will be merged into the `master` branch, and `####` is the number of your pull request. 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 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. 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 33
diff --git a/docs/custom_quantum_functions.md b/docs/custom_quantum_functions.md
index 84ae589ed..6eb144af7 100644
--- a/docs/custom_quantum_functions.md
+++ b/docs/custom_quantum_functions.md
@@ -57,7 +57,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
57 case KC_ENTER: 57 case KC_ENTER:
58 // Play a tone when enter is pressed 58 // Play a tone when enter is pressed
59 if (record->event.pressed) { 59 if (record->event.pressed) {
60 PLAY_NOTE_ARRAY(tone_qwerty); 60 PLAY_SONG(tone_qwerty);
61 } 61 }
62 return true; // Let QMK send the enter press/release events 62 return true; // Let QMK send the enter press/release events
63 default: 63 default:
@@ -438,7 +438,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
438 case KC_ENTER: 438 case KC_ENTER:
439 // Play a tone when enter is pressed 439 // Play a tone when enter is pressed
440 if (record->event.pressed) { 440 if (record->event.pressed) {
441 PLAY_NOTE_ARRAY(tone_qwerty); 441 PLAY_SONG(tone_qwerty);
442 } 442 }
443 return true; // Let QMK send the enter press/release events 443 return true; // Let QMK send the enter press/release events
444 case RGB_LYR: // This allows me to use underglow as layer indication, or as normal 444 case RGB_LYR: // This allows me to use underglow as layer indication, or as normal
@@ -486,56 +486,3 @@ And you're done. The RGB layer indication will only work if you want it to. And
486* Keymap: `void eeconfig_init_user(void)`, `uint32_t eeconfig_read_user(void)` and `void eeconfig_update_user(uint32_t val)` 486* Keymap: `void eeconfig_init_user(void)`, `uint32_t eeconfig_read_user(void)` and `void eeconfig_update_user(uint32_t val)`
487 487
488The `val` is the value of the data that you want to write to EEPROM. And the `eeconfig_read_*` function return a 32 bit (DWORD) value from the EEPROM. 488The `val` is the value of the data that you want to write to EEPROM. And the `eeconfig_read_*` function return a 32 bit (DWORD) value from the EEPROM.
489
490# Custom Tapping Term
491
492By default, the tapping term and related options (such as `IGNORE_MOD_TAP_INTERRUPT`) are defined globally, and are not configurable by key. For most users, this is perfectly fine. But in some cases, dual function keys would be greatly improved by different timeout behaviors than `LT` keys, or because some keys may be easier to hold than others. Instead of using custom key codes for each, this allows for per key configurable timeout behaviors.
493
494There are two configurable options to control per-key timeout behaviors:
495
496- `TAPPING_TERM_PER_KEY`
497- `IGNORE_MOD_TAP_INTERRUPT_PER_KEY`
498
499You need to add `#define` lines to your `config.h` for each feature you want.
500
501```
502#define TAPPING_TERM_PER_KEY
503#define IGNORE_MOD_TAP_INTERRUPT_PER_KEY
504```
505
506
507## Example `get_tapping_term` Implementation
508
509To change the `TAPPING_TERM` based on the keycode, you'd want to add something like the following to your `keymap.c` file:
510
511```c
512uint16_t get_tapping_term(uint16_t keycode) {
513 switch (keycode) {
514 case SFT_T(KC_SPC):
515 return TAPPING_TERM + 1250;
516 case LT(1, KC_GRV):
517 return 130;
518 default:
519 return TAPPING_TERM;
520 }
521}
522```
523
524## Example `get_ignore_mod_tap_interrupt` Implementation
525
526To change the `IGNORE_MOD_TAP_INTERRUPT` value based on the keycode, you'd want to add something like the following to your `keymap.c` file:
527
528```c
529bool get_ignore_mod_tap_interrupt(uint16_t keycode) {
530 switch (keycode) {
531 case SFT_T(KC_SPC):
532 return true;
533 default:
534 return false;
535 }
536}
537```
538
539## `get_tapping_term` / `get_ignore_mod_tap_interrupt` Function Documentation
540
541Unlike many of the other functions here, there isn't a need (or even reason) to have a quantum or keyboard level function. Only user level functions are useful here, so no need to mark them as such.
diff --git a/docs/feature_rgb_matrix.md b/docs/feature_rgb_matrix.md
index 15057827c..a4f434cbd 100644
--- a/docs/feature_rgb_matrix.md
+++ b/docs/feature_rgb_matrix.md
@@ -374,7 +374,8 @@ These are defined in [`rgblight_list.h`](https://github.com/qmk/qmk_firmware/blo
374```c 374```c
375#define RGB_MATRIX_KEYPRESSES // reacts to keypresses 375#define RGB_MATRIX_KEYPRESSES // reacts to keypresses
376#define RGB_MATRIX_KEYRELEASES // reacts to keyreleases (instead of keypresses) 376#define RGB_MATRIX_KEYRELEASES // reacts to keyreleases (instead of keypresses)
377#define RGB_DISABLE_AFTER_TIMEOUT 0 // number of ticks to wait until disabling effects 377#define RGB_DISABLE_TIMEOUT 0 // number of milliseconds to wait until rgb automatically turns off
378#define RGB_DISABLE_AFTER_TIMEOUT 0 // OBSOLETE: number of ticks to wait until disabling effects
378#define RGB_DISABLE_WHEN_USB_SUSPENDED false // turn off effects when suspended 379#define RGB_DISABLE_WHEN_USB_SUSPENDED false // turn off effects when suspended
379#define RGB_MATRIX_LED_PROCESS_LIMIT (DRIVER_LED_TOTAL + 4) / 5 // limits the number of LEDs to process in an animation per task run (increases keyboard responsiveness) 380#define RGB_MATRIX_LED_PROCESS_LIMIT (DRIVER_LED_TOTAL + 4) / 5 // limits the number of LEDs to process in an animation per task run (increases keyboard responsiveness)
380#define RGB_MATRIX_LED_FLUSH_LIMIT 16 // limits in milliseconds how frequently an animation will update the LEDs. 16 (16ms) is equivalent to limiting to 60fps (increases keyboard responsiveness) 381#define RGB_MATRIX_LED_FLUSH_LIMIT 16 // limits in milliseconds how frequently an animation will update the LEDs. 16 (16ms) is equivalent to limiting to 60fps (increases keyboard responsiveness)
diff --git a/docs/ja/custom_quantum_functions.md b/docs/ja/custom_quantum_functions.md
index 7e4fbd897..1524717c8 100644
--- a/docs/ja/custom_quantum_functions.md
+++ b/docs/ja/custom_quantum_functions.md
@@ -62,7 +62,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
62 case KC_ENTER: 62 case KC_ENTER:
63 // enter が押された時に音を再生します 63 // enter が押された時に音を再生します
64 if (record->event.pressed) { 64 if (record->event.pressed) {
65 PLAY_NOTE_ARRAY(tone_qwerty); 65 PLAY_SONG(tone_qwerty);
66 } 66 }
67 return true; // QMK に enter のプレスまたはリリースイベントを送信させます 67 return true; // QMK に enter のプレスまたはリリースイベントを送信させます
68 default: 68 default:
@@ -440,7 +440,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
440 case KC_ENTER: 440 case KC_ENTER:
441 // enter が押された時に音を再生します 441 // enter が押された時に音を再生します
442 if (record->event.pressed) { 442 if (record->event.pressed) {
443 PLAY_NOTE_ARRAY(tone_qwerty); 443 PLAY_SONG(tone_qwerty);
444 } 444 }
445 return true; // QMK に enter のプレスまたはリリースイベントを送信させます 445 return true; // QMK に enter のプレスまたはリリースイベントを送信させます
446 case RGB_LYR: // これにより、アンダーグローをレイヤー表示として、あるいは通常通りに使うことができます。 446 case RGB_LYR: // これにより、アンダーグローをレイヤー表示として、あるいは通常通りに使うことができます。
@@ -511,7 +511,7 @@ void eeconfig_init_user(void) { // EEPROM がリセットされます!
511キーコードに基づいて `TAPPING_TERM` を変更するには、次のようなものを `keymap.c` ファイルに追加します: 511キーコードに基づいて `TAPPING_TERM` を変更するには、次のようなものを `keymap.c` ファイルに追加します:
512 512
513```c 513```c
514uint16_t get_tapping_term(uint16_t keycode) { 514uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) {
515 switch (keycode) { 515 switch (keycode) {
516 case SFT_T(KC_SPC): 516 case SFT_T(KC_SPC):
517 return TAPPING_TERM + 1250; 517 return TAPPING_TERM + 1250;
@@ -528,7 +528,7 @@ uint16_t get_tapping_term(uint16_t keycode) {
528キーコードに基づいて `IGNORE_MOD_TAP_INTERRUPT` の値を変更するには、次のようなものを `keymap.c` ファイルに追加します: 528キーコードに基づいて `IGNORE_MOD_TAP_INTERRUPT` の値を変更するには、次のようなものを `keymap.c` ファイルに追加します:
529 529
530```c 530```c
531bool get_ignore_mod_tap_interrupt(uint16_t keycode) { 531bool get_ignore_mod_tap_interrupt(uint16_t keycode, keyrecord_t *record) {
532 switch (keycode) { 532 switch (keycode) {
533 case SFT_T(KC_SPC): 533 case SFT_T(KC_SPC):
534 return true; 534 return true;
diff --git a/docs/tap_hold.md b/docs/tap_hold.md
index a0b648694..2dc57f03c 100644
--- a/docs/tap_hold.md
+++ b/docs/tap_hold.md
@@ -4,6 +4,38 @@ While Tap-Hold options are fantastic, they are not without their issues. We hav
4 4
5These options let you modify the behavior of the Tap-Hold keys. 5These options let you modify the behavior of the Tap-Hold keys.
6 6
7## Tapping Term
8
9The crux of all of the following features is the tapping term setting. This determines what is a tap and what is a hold. And the exact timing for this to feel natural can vary from keyboard to keyboard, from switch to switch, and from key to key.
10
11You can set the global time for this by adding the following setting to your `config.h`:
12
13```c
14#define TAPPING_TERM 200
15```
16
17This setting is defined in milliseconds, and does default to 200ms. This is a good average for a majority of people.
18
19For more granular control of this feature, you can add the following to your `config.h`:
20```c
21#define TAPPING_TERM_PER_KEY
22```
23
24You can then add the following function to your keymap:
25
26```c
27uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) {
28 switch (keycode) {
29 case SFT_T(KC_SPC):
30 return TAPPING_TERM + 1250;
31 case LT(1, KC_GRV):
32 return 130;
33 default:
34 return TAPPING_TERM;
35}
36```
37
38
7## Permissive Hold 39## Permissive Hold
8 40
9As of [PR#1359](https://github.com/qmk/qmk_firmware/pull/1359/), there is a new `config.h` option: 41As of [PR#1359](https://github.com/qmk/qmk_firmware/pull/1359/), there is a new `config.h` option:
@@ -27,6 +59,25 @@ Normally, if you do all this within the `TAPPING_TERM` (default: 200ms) this wil
27 59
28?> If you have `Ignore Mod Tap Interrupt` enabled, as well, this will modify how both work. The regular key has the modifier added if the first key is released first or if both keys are held longer than the `TAPPING_TERM`. 60?> If you have `Ignore Mod Tap Interrupt` enabled, as well, this will modify how both work. The regular key has the modifier added if the first key is released first or if both keys are held longer than the `TAPPING_TERM`.
29 61
62For more granular control of this feature, you can add the following to your `config.h`:
63
64```c
65#define PERMISSIVE_HOLD_PER_KEY
66```
67
68You can then add the following function to your keymap:
69
70```c
71bool get_permissive_hold(uint16_t keycode, keyrecord_t *record) {
72 switch (keycode) {
73 case LT(1, KC_BSPC):
74 return true;
75 default:
76 return false;
77 }
78}
79```
80
30## Ignore Mod Tap Interrupt 81## Ignore Mod Tap Interrupt
31 82
32To enable this setting, add this to your `config.h`: 83To enable this setting, add this to your `config.h`:
@@ -62,13 +113,13 @@ For more granular control of this feature, you can add the following to your `co
62You can then add the following function to your keymap: 113You can then add the following function to your keymap:
63 114
64```c 115```c
65bool get_ignore_mod_tap_interrupt(uint16_t keycode) { 116bool get_ignore_mod_tap_interrupt(uint16_t keycode, keyrecord_t *record) {
66 switch (keycode) { 117 switch (keycode) {
67 case SFT_T(KC_SPC): 118 case SFT_T(KC_SPC):
68 return true; 119 return true;
69 default: 120 default:
70 return false; 121 return false;
71 } 122 }
72} 123}
73``` 124```
74 125
@@ -106,12 +157,12 @@ You can then add the following function to your keymap:
106 157
107```c 158```c
108bool get_tapping_force_hold(uint16_t keycode, keyrecord_t *record) { 159bool get_tapping_force_hold(uint16_t keycode, keyrecord_t *record) {
109 switch (keycode) { 160 switch (keycode) {
110 case LT(1, KC_BSPC): 161 case LT(1, KC_BSPC):
111 return true; 162 return true;
112 default: 163 default:
113 return false; 164 return false;
114 } 165 }
115} 166}
116``` 167```
117 168
@@ -126,3 +177,13 @@ To enable `retro tapping`, add the following to your `config.h`:
126Holding and releasing a dual function key without pressing another key will result in nothing happening. With retro tapping enabled, releasing the key without pressing another will send the original keycode even if it is outside the tapping term. 177Holding and releasing a dual function key without pressing another key will result in nothing happening. With retro tapping enabled, releasing the key without pressing another will send the original keycode even if it is outside the tapping term.
127 178
128For instance, holding and releasing `LT(2, KC_SPACE)` without hitting another key will result in nothing happening. With this enabled, it will send `KC_SPACE` instead. 179For instance, holding and releasing `LT(2, KC_SPACE)` without hitting another key will result in nothing happening. With this enabled, it will send `KC_SPACE` instead.
180
181## Why do we include the key record for the per key functions?
182
183One thing that you may notice is that we include the key record for all of the "per key" functions, and may be wondering why we do that.
184
185Well, it's simply really: customization. But specifically, it depends on how your keyboard is wired up. For instance, if each row is actually using a row in the keyboard's matrix, then it may be simpler to use `if (record->event.row == 3)` instead of checking a whole bunch of keycodes. Which is especially good for those people using the Tap Hold type keys on the home row. So you could fine tune those to not interfere with your normal typing.
186
187## Why is there no `*_kb` or `*_user` functions?!
188
189Unlike many of the other functions here, there isn't a need (or even reason) to have a quantum or keyboard level function. Only user level functions are useful here, so no need to mark them as such.
diff --git a/docs/zh-cn/custom_quantum_functions.md b/docs/zh-cn/custom_quantum_functions.md
index f2c6098dc..95b2084db 100644
--- a/docs/zh-cn/custom_quantum_functions.md
+++ b/docs/zh-cn/custom_quantum_functions.md
@@ -57,7 +57,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
57 case KC_ENTER: 57 case KC_ENTER:
58 // 当按下回车时播放音符 58 // 当按下回车时播放音符
59 if (record->event.pressed) { 59 if (record->event.pressed) {
60 PLAY_NOTE_ARRAY(tone_qwerty); 60 PLAY_SONG(tone_qwerty);
61 } 61 }
62 return true; // 让QMK触发回车按下/释放事件 62 return true; // 让QMK触发回车按下/释放事件
63 default: 63 default:
@@ -413,7 +413,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
413 case KC_ENTER: 413 case KC_ENTER:
414 // 在按下回车时播放音符 414 // 在按下回车时播放音符
415 if (record->event.pressed) { 415 if (record->event.pressed) {
416 PLAY_NOTE_ARRAY(tone_qwerty); 416 PLAY_SONG(tone_qwerty);
417 } 417 }
418 return true; // 让QMK产生回车按下/释放事件 418 return true; // 让QMK产生回车按下/释放事件
419 case RGB_LYR: // 本句让underglow作为层指示,或正常使用。 419 case RGB_LYR: // 本句让underglow作为层指示,或正常使用。
@@ -473,7 +473,7 @@ void eeconfig_init_user(void) { // EEPROM正被重置
473想要修改基于键码的`TAPPING TERM`,你要向`keymap.c`文件添加如下代码: 473想要修改基于键码的`TAPPING TERM`,你要向`keymap.c`文件添加如下代码:
474 474
475```c 475```c
476uint16_t get_tapping_term(uint16_t keycode) { 476uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) {
477 switch (keycode) { 477 switch (keycode) {
478 case SFT_T(KC_SPC): 478 case SFT_T(KC_SPC):
479 return TAPPING_TERM + 1250; 479 return TAPPING_TERM + 1250;