-
-
Notifications
You must be signed in to change notification settings - Fork 42.4k
[Core] Flow Tap tap-hold option to disable HRMs during fast typing (aka Global Quick Tap, Require Prior Idle). #25125
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
"Flow Tap" (or a name ending with tap) might sound better together with "Chordal Hold". It isn't a strong preference because creating descriptive names for arcane features isn't easy. |
@filterpaper thank you for that suggestion! "Flow Tap" is clever. It parallels "Chordal Hold" (and "Quick Tap" too!) in fitting way. I've updated the name. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Code LGTM and I have been daily driving this since the PR was opened - together with chordal hold this feels very natural with HRMs.
|
I used the tap_flow community module first and it was great, but this core implementation is awesome. It feels very natural, as KarlK90 said, and makes HRM much more usable for me. I don't expect I'll ever use a QMK keyboard without flow_tap enabled. I do have two small issues, but I'm not sure yet if it's my configuration or an actual issue. I am using QWERTY on a ZSA Voyager, not using Oryx. Relevant configurations: The last step, pressing GUI+T, is initiated within the flow_tap term. When I press RGUI_T(KC_J) the J key will be registered as a repeating tap but if I wait out the flow_tap term (still holding RGUI_T(KC_J)) then tap KC_T, the RGUI_T(KC_J) key gets converted to a hold. I'm not sure if this is to be expected but it seems the ideal behavior would be that it would either be a tap or a hold, but converting after registering as a tap is odd. One other scenario I've encountered is as follows: In this scenario, if the flow_tap term hasn't expired from the first KC_H then when I try to add LCTL it registers as a tap, even though LALT_T(KC_S) has already settled as a hold and hasn't been released. Again, not sure if this is expected behavior but it does interrupt the flow and seems to me it might be a use case to look at. Even with the couple of very minor things above flow_tap is a HUGE improvement to HRM on QMK and is an amazing contribution! Thank you, @getreuer. |
|
Thank you @KarlK90 for trying it out and for the approval! |
|
@mwpardue thank you for the support and detailed feedback! You raise an interesting point. Both of those scenarios are fast, back-to-back hotkeys. They are "working as expected" so far as what logic I intended to implement, but I see this logic has a gap in achieving the intended idea. The idea is that Flow Tap is active during "normal typing," and this shouldn't include hotkeys use. To fix that, I just pushed a commit to this PR to tweak the default |
I've pulled the changes and have a bit more feedback. Sorry, I don't mean to be a PITA so if I get too nitpicky please tell me. I had Disregard that other use case that I said was buggy. I'm an idiot. It was working precisely as intended, I just kept testing by jumping into my browser where I use Vimium and it just so happened all the tests I performed were keys that worked the same with and without the GUI modifier, and so I thought it was converting to a hold. |
|
@mwpardue yes, sorry for the trouble. I appreciate all the feedback! As you've worked out, I've put a "tip" note about this in docs, which render as blue boxes on docs.qmk.fm, to warn about that. |
I think it may actually be fine. I was reviewing and I realized that my |
|
This pull request should also resolve #24860 |
|
Awesome to see the After some brief testing, I have just one question: shouldn't we add an |
I tried to get rid of this behaviour by defining /* Copyright 2021 @ Keychron (https://www.keychron.com)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include QMK_KEYBOARD_H
bool is_flow_tap_key(uint16_t keycode) {
//if ((get_mods() & (MOD_MASK_CG | MOD_BIT_LALT)) != 0) {
//return false; // Disable Flow Tap on hotkeys.
//}
switch (get_tap_keycode(keycode)) {
case KC_SPC:
case KC_A ... KC_Z:
case KC_DOT:
case KC_COMM:
case KC_SCLN:
case KC_SLSH:
return true;
}
return false;
}
// clang-format off
enum layers {
MAC_BASE,
WIN_BASE,
_FN1,
_FN2,
_FN3
};
#define KC_TASK LGUI(KC_TAB)
#define KC_FLXP LGUI(KC_E)
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[MAC_BASE] = LAYOUT_60_ansi(
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
KC_LCTL, KC_LOPT, KC_LCMD, KC_SPC, KC_RCMD, MO(_FN1), MO(_FN3), KC_RCTL),
[WIN_BASE] = LAYOUT_60_ansi(
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
KC_CAPS, KC_A, KC_S, MT(MOD_LALT, KC_D), MT(MOD_LCTL, KC_F), KC_G, KC_H, MT(MOD_RCTL, KC_J), MT(MOD_LALT, KC_K), KC_L, KC_SCLN, KC_QUOT, KC_ENT,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
KC_LCTL, KC_LALT, KC_LWIN, MT(MOD_LGUI, KC_SPC), KC_RALT, MO(_FN2), MO(_FN3), KC_RCTL),
[_FN1] = LAYOUT_60_ansi(
KC_GRV, KC_BRID, KC_BRIU, KC_NO, KC_NO, RM_VALD, RM_VALU, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, RM_NEXT,
RM_TOGG, RM_NEXT, RM_VALU, RM_HUEU, RM_SATU, RM_SPDU, _______, _______, _______, _______, KC_INS, KC_PGUP, KC_HOME, _______,
_______, RM_PREV, RM_VALD, RM_HUED, RM_SATD, RM_SPDD, _______, _______, KC_UP, _______, KC_PGDN, KC_END, _______,
_______, _______, _______, _______, _______, _______, NK_TOGG, KC_LEFT, KC_DOWN, KC_RIGHT, KC_DEL, _______,
_______, _______, _______, _______, _______, _______, _______, _______),
[_FN2] = LAYOUT_60_ansi(
KC_GRV, KC_BRID, KC_BRIU, KC_TASK, KC_FLXP, RM_VALD, RM_VALU, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, RM_NEXT,
RM_TOGG, RM_NEXT, RM_VALU, RM_HUEU, RM_SATU, RM_SPDU, _______, _______, KC_APP, KC_SCRL, KC_INS, KC_PGUP, KC_HOME, _______,
_______, RM_PREV, RM_VALD, RM_HUED, RM_SATD, RM_SPDD, _______, _______, KC_UP, KC_PSCR, KC_PGDN, KC_END, _______,
_______, _______, _______, _______, _______, _______, NK_TOGG, KC_LEFT, KC_DOWN, KC_RIGHT, KC_DEL, _______,
_______, _______, _______, _______, _______, _______, _______, _______),
[_FN3] = LAYOUT_60_ansi(
KC_TILD, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______,
RM_TOGG, RM_NEXT, RM_VALU, RM_HUEU, RM_SATU, RM_SPDU, _______, _______, _______, _______, _______, _______, _______, _______,
_______, RM_PREV, RM_VALD, RM_HUED, RM_SATD, RM_SPDD, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______)
}; |
|
Ignore my previous comment because I figured out the issue. I’m experiencing something similar to this:
I have D, F, J, K, and Space set to tap-hold keys. For the following quick sequence:
J is treated as a tap-hold key instead of a tap key. This issue does not occur if I start with a tap key. I’m pretty sure this is a bug. |
|
Thanks all for the feedback!
@NikGovorov Fair question. This is effectively baked into If The
@amarz45 thanks for reporting! I am able to repro this. Interestingly a rolled press "F↓, J↓, F↑, J↑" works as intended (and is covered by a unit test), but the incorrect behavior occurs on distinct taps "F↓, F↑, J↓, J↑." I'll fix this. |
|
@getreuer I've reviewed the code again, and I see that you're absolutely right. However, for some reason - which I admit seems a bit strange - I believe that the
If I add qmk_firmware/quantum/action_tapping.c Line 169 in 988d815
|
I think this is the issue I was trying to report, I just don't think I explained it very well. I do still encounter this, especially with a word like DEFANG, where only D F and A are taphold keys. It's somewhat common to get the A key treated as a hold. This doesn't happen so long as I don't have multiple tap hold keys in a row. I was going to try and add an update to last_input in the key-release event for tap-hold keys that are flow-tap keys as well, I just haven't had time to decipher where it goes in action_tapping.c yet. I thought this would preserve the ability to chord holds. This was my strategy because it seemed like the reason for the hold was that the flow_tap term had expired. If I set the term higher, like 300ms, then the issue goes away unless I also slow down my typing speed. |
|
The only logical explanation I can see for my issue is that |
|
@amarz45, @mwpardue, @NikGovorov thanks again for your testing and feedback! I just opened #25175 to fix the problems reported above. I'd very much appreciate if you could try it out to check how it works. Thank you! |
|
Update: a revision of Flow Tap is in #25175. @amarz45, @mwpardue, @NikGovorov have tested and confirmed that the problems reported previously are fixed. 🎉 |
|
@getreuer thank you so much for all the work you've been doing on tap-hold stuff! I just tried out flow tap (I applied this and the other PR on top of 0.28.8), but I ran into an issue where I type I hope that I managed to accurately explain what happens. Without flow tap, this seems to work as expected where the LT key holds. So it seems that somehow I cannot go from fast typing, to holding a key to trigger a modifier, I need to wait for a little bit in order to be able to hold the tap-hold key. You can find my config and keymap here: https://git.sr.ht/~r-vdp/nixos-config/tree/a955e979fac395e24d709b992f5339bb093f3e03/item/keyboards/dilemma |
Try adding the following function to your |
|
@NikGovorov ah, so MT and LT keys are handled differently by default? I will try your suggestion and see how that goes, thanks! |
|
@r-vdp thanks for trying Flow Tap. Yes, that's the tradeoff with Flow Tap, "going from fast typing, to holding" requires either waiting out the Flow Tap term or that Flow Tap be disabled for that key and/or preceding key. By default, Flow Tap is enabled for both MT and LT keys whose tapping key is a letter A–Z or punctuation |
…mk#25125) aka Global Quick Tap, Require Prior Idle
…mk#25125) aka Global Quick Tap, Require Prior Idle
…mk#25125) aka Global Quick Tap, Require Prior Idle
|
Hi @getreuer, Thank you for your efforts in enhancing HRM for QMK! I’ve been using FLOW TAP on my split keyboard and encountered an issue that’s quite troubling. As a Vim user, when I need to copy text, I often press o followed by MT(cmd, d) v in quick succession. However, the rapid pressing of d interrupts the hold behavior of the MT key, particularly when using both hands within a FLOW TAP window. Additionally, there could be an opportunity to improve FLOW TAP by shortening the timing window for the flow tap when a hold key is pressed after releasing a normal key on the opposite hand. |
|
@hitsmaxft thanks for the feedback!
Right, yes. A limitation with Flow Tap is that the defaults don't play well with a hotkey that you are so fast at that you use it within the Flow Tap term. To get around this, you can define the get_flow_tap_term() callback to exceptionally use a shorter term or return 0 to disable Flow Tap entirely for those hotkeys. The callback takes both the tap-hold keycode and the previous keycode as args, so it's possible to be fine-grained with specifying such exceptions. Something like: uint16_t get_flow_tap_term(uint16_t keycode, keyrecord_t* record,
uint16_t prev_keycode) {
if (is_flow_tap_key(keycode) && is_flow_tap_key(prev_keycode)) {
switch (keycode) {
case LGUI_T(KC_D):
// Disable Flow Tap for KC_O followed by LGUI_T(KC_D).
if (prev_keycode == KC_O) { return 0; }
break;
}
return FLOW_TAP_TERM; // Default timeout.
}
return 0; // Disable Flow Tap.
} |
|
@getreuer i have question! First, I am a first time QMK user. |
Thank you for your reply. I am now trying to alleviate the tap caused by the hands operating too quickly by comparing the coordinates of the keyrecord pressed before and after, hoping that my experimental results will be positive and can be used as an additional feature. |
There should be no issue with using both keymap.c and keymap.json. I can confirm this works, but this may require an updated repo. |
…mk#25125) aka Global Quick Tap, Require Prior Idle
* add 75_(ansi|iso) Community Layouts to mechlovin/olly/octagon (qmk#22459) * expand mechlovin/olly/octagon * Update info.json * Rename info.json to keyboard.json * correct matrix position for key * remove VIA * [Core] get_keycode_string(): function to format keycodes as strings, for more readable debug logging. (qmk#24787) * keycode_string(): Format keycodes as strings. This adds the `keycode_string()` function described in https://getreuer.info/posts/keyboards/keycode-string/index.html as a core feature. * Fix formatting. * keycode_string review revisions. * Rename keycode_string() -> get_keycode_string() for consistency with existing string utils like get_u8_str(). * Revise custom keycode names with separate _user and _kb tables. * Correct indent in builddefs/generic_features.mk. Co-authored-by: Ryan <fauxpark@gmail.com> * Add KC_NUHS, KC_NUBS, and KC_CAPS. * Fix linking error with custom names. * Attempt at simplifying interface. * Formatting fix. * Several fixes and revisions. * Don't use PSTR in KEYCODE_STRING_NAME, since this fails to build on AVR. Store custom names in RAM. * Revise the internal table of common keycode names to use its own storage representation, still in PROGMEM, and now more efficiently stored flat in 8 bytes per entry. * Support Swap Hands keycodes and a few other keycodes. * Revert "Formatting fix." This reverts commit 2a27710. * Revert "Attempt at simplifying interface." This reverts commit 8eaf67d. * Simplify custom names API by sigprof's suggestion. * Support more keycodes. * Add QK_LOCK keycode. * Add Secure keycodes. * Add Joystick keycodes. * Add Programmable Button keycodes. * Add macro MC_ keycodes. * For remaining keys in known code ranges, stringify them as "QK_<feature>+<number>". For instance, "QK_MIDI+7". * Bug fix and a few improvements. * Fix missing right-hand bit when displaying 5-bit mods numerically. * Support KC_HYPR, KC_MEH, HYPR_T(kc), MEH_T(kc). * Exclude one-shot keycodes when NO_ACTION_ONESHOT is defined. --------- Co-authored-by: Ryan <fauxpark@gmail.com> * Align to latest CLI dependencies (qmk#24553) * Align to latest CLI dependencies * Update docs * Add Community Layout support to daskeyboard4 (qmk#23884) add ansi CL * Add the plywrks ply8x hotswap variant. (qmk#23558) * Add hotswap variant * Update RGB matrix * Move files around to target develop * Revert rules.mk for keyboards/jaykeeb/joker/rules.mk * Update keyboards/plywrks/ply8x/hotswap/keyboard.json Co-authored-by: Drashna Jaelre <drashna@live.com> * Apply suggestions from code review Co-authored-by: Duncan Sutherland <dunk2k_2000@hotmail.com> * Add missing community layouts * Delete keyboards/plywrks/ply8x/rules.mk * Update missing keys in RGB matrix * Add missing key in RGB matrix for hotswap ver * Remove via keymaps * Add keyboard alias for plywrks/ply8x to plywrks/ply8x/solder * Fix typo * Fix another typo --------- Co-authored-by: Drashna Jaelre <drashna@live.com> Co-authored-by: Duncan Sutherland <dunk2k_2000@hotmail.com> * [Core] use `keycode_string` in unit tests (qmk#25042) * tests: use keycode_string feature With a proper keycode to string implementation in qmk there is no need to use the unit tests only implementation anymore. Signed-off-by: Stefan Kerkmann <karlk90@pm.me> * tests: remove keycode_util feature This feature is no longer used as we switched the tests to the keycode string implementation. Signed-off-by: Stefan Kerkmann <karlk90@pm.me> * Non-volatile memory data repository pattern (qmk#24356) * First batch of eeconfig conversions. * Offset and length for datablocks. * `via`, `dynamic_keymap`. * Fix filename. * Commentary. * wilba leds * satisfaction75 * satisfaction75 * more keyboard whack-a-mole * satisfaction75 * omnikeyish * more whack-a-mole * `generic_features.mk` to automatically pick up nvm repositories * thievery * deferred variable resolve * whitespace * convert api to structs/unions * convert api to structs/unions * convert api to structs/unions * fixups * code-side docs * code size fix * rollback * nvm_xxxxx_erase * Updated location of eeconfig magic numbers so non-EEPROM nvm drivers can use them too. * Fixup build. * Fixup compilation error with encoders. * Build fixes. * Add `via_ci` keymap to onekey to exercise VIA bindings (and thus dynamic keymap et.al.), fixup compilation errors based on preprocessor+sizeof. * Build failure rectification. * Migrate remaining `split.soft_serial_pin` to `split.serial.pin` (qmk#25046) * Migrate keyboards/bastardkb * Migrate keyboards/handwired * Migrate keyboards/helix * Fix duplicate serial key * Fix outdated GPIO control function usage (qmk#25060) * [Modules] Provide access to current path in `rules.mk`. (qmk#25061) * Update keymap for keycult 1800 (qmk#25070) Update keymap Co-authored-by: yiancar <yiancar@gmail.com> * Add handwired/erikpeyronson/erkbd (qmk#25030) Co-authored-by: Erik Peyronson <erik.peyronson@gmail.com> Co-authored-by: jack <jack@pngu.org> Co-authored-by: Drashna Jaelre <drashna@live.com> * Add support for Starry FRL (qmk#24626) Co-authored-by: jack <jack@pngu.org> Co-authored-by: Drashna Jaelre <drashna@live.com> Co-authored-by: Ryan <fauxpark@gmail.com> * Add "Large Lad" keyboard (qmk#24727) Co-authored-by: jack <jack@pngu.org> * Bump vite from 5.4.12 to 5.4.15 in /builddefs/docsgen (qmk#25065) Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.4.12 to 5.4.15. - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/v5.4.15/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v5.4.15/packages/vite) --- updated-dependencies: - dependency-name: vite dependency-type: direct:development ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Allow AnnePro2 to reboot (qmk#24886) Without this, the QK_REBOOT key did nothing. * Fix path typo related RP2040 (qmk#25069) Fix path typo * Update onekey example for nucleo f446re (qmk#25067) * use accessible pins for nucleo f446re onekey example * remove pin collision with matrix in keyboard.json * use accessible pins for LED * remove pin collision with matrix * Update readme.md to reflect pin changes * Module documentation typo correction (qmk#25073) * Fix lockups on AVR with `qmk/hello_world` module (qmk#25074) Fix lockups on AVR. * At101ish (qmk#25072) * Dell AT101 replacement pcb support * Update keyboards/at101ish/readme.md Co-Authored-By: fauxpark <fauxpark@gmail.com> * remove empty src clause in makefile * feature: Update at101ish to qmk v0.28 * feature: Add osdetecting keymap variant. * refactor: Move at101ish keyboard to handwired folder. * fix: Adjust at101ish readme- * fix: review changes. * chore: Remove unneeded feature. --------- Co-authored-by: fauxpark <fauxpark@gmail.com> * Add "license" field to Community Module JSON schema. (qmk#25085) Add "license" field to community module schema. * Add kt60HS-T v2 PCB (qmk#25080) * Add kt60HS-Tv2 * Update keyboards/keyten/kt60hs_t/readme.md Co-authored-by: Sergey Vlasov <sigprof@gmail.com> * Update keyboards/keyten/kt60hs_t/v1/readme.md Co-authored-by: Sergey Vlasov <sigprof@gmail.com> * Update keyboards/keyten/kt60hs_t/v2/keyboard.json Co-authored-by: Sergey Vlasov <sigprof@gmail.com> * Update keyboards/keyten/kt60hs_t/v2/readme.md Co-authored-by: Sergey Vlasov <sigprof@gmail.com> * Update keyboards/keyten/kt60hs_t/info.json Co-authored-by: Sergey Vlasov <sigprof@gmail.com> * Change of structure * Moving the keyboard * Update data/mappings/keyboard_aliases.hjson Co-authored-by: Sergey Vlasov <sigprof@gmail.com> * Update keyboards/keyten/kt60hs_t/v1/keyboard.json Co-authored-by: Duncan Sutherland <dunk2k_2000@hotmail.com> * Update keyboards/keyten/kt60hs_t/v2/keyboard.json Co-authored-by: Duncan Sutherland <dunk2k_2000@hotmail.com> --------- Co-authored-by: Sergey Vlasov <sigprof@gmail.com> Co-authored-by: Duncan Sutherland <dunk2k_2000@hotmail.com> * Make sure that unit tests run on all release versions * [ErgoDox EZ] Fix complication issues due to updates * [ErgoDox EZ] Fix compilication errors and warnings We want all green! * Fix 'qmk lint -kb' argument handling (qmk#25093) * Refactor Deemen17 Works DE60 (qmk#25088) * Add Coban Pad 12A (qmk#25039) Co-authored-by: jack <jack@pngu.org> * [Keyboard] Add PHDesign PH60/Multi Keyboard PCB (qmk#25086) * Add PH60/Multi Support * Add PCB PIcture for README * Remove MO(_FN2) * README Typo Fix * Layout and README Adjustment * Add README for PHDesign Main Folder * Keymap Improvement * Update README.md * [Keyboard] Add Ortho Slayer (qmk#25099) * Add Ortho Slayer * Update keyboards/keyten/ortho_slayer/keymaps/default/keymap.c Co-authored-by: jack <jack@pngu.org> * Update keyboards/keyten/ortho_slayer/readme.md Co-authored-by: jack <jack@pngu.org> --------- Co-authored-by: jack <jack@pngu.org> * Fix coban pad9a wrong layout in keyboard.json (qmk#25100) * Remove `CTPC`/`CONVERT_TO_PROTON_C` options (qmk#25111) * Remove direct docs.qmk.fm links from docs (qmk#25113) * Add warning when deprecated 'promicro_rp2040' is used (qmk#25112) * Add Vida to QMK (qmk#24225) Co-authored-by: jack <jack@pngu.org> Co-authored-by: Duncan Sutherland <dunk2k_2000@hotmail.com> * More Windows->Unix style path fixes. (qmk#25119) * Include `math.h` where necessary. (qmk#25122) * Cater for use of `__errno_r()` in ChibiOS syscalls.c with newer picolibc revisions (qmk#25121) * chore: Allow disabling underglow on Work Louder devices (qmk#25123) (qmk#25120) * Allow disabling Underglow on Work Louder devices Allows disabling Underglow on Work Louder devices by using `RGBLIGHT_ENABLE = no` on rules.mk * Update keyboards/work_louder/rgb_functions.c Suggested by @zvecr on review. Co-authored-by: Joel Challis <git@zvecr.com> --------- Co-authored-by: Joel Challis <git@zvecr.com> * Exclude external userspace from lint checking (qmk#24680) * fix: Fix startup sound for Preonic (qmk#25132) (qmk#25133) Add `AUDIO_INIT_DELAY ` to config.h to resolve * New standard layout for Savage65 (65_ansi_blocker_tsangan_split_bs) (qmk#24690) * Added a default firmware and layout for the WindStudio Wind X R1 keyboard. * Wind X R1: cleaned-up the folders to make clear that this firmware is for the release 1 of this keyboard. * Delete keyboards/windstudio/wind_x/R1 directory Removing the uppercase R1 folder * feat(cannonkeys/savage65): Added layout to keyboard.json - Added the layout LAYOUT_65_ansi_blocker_tsangan_split_bs to the community layouts. * kradoindustries_promenade: add LAYOUT_1x2u (qmk#25090) * Update shuguet/shu89 (qmk#24780) * Update keyboard.json Update mod keys location in RGB layout. * Update keyboard.json * Update keyboards/shuguet/shu89/keyboard.json Co-authored-by: Ryan <fauxpark@gmail.com> --------- Co-authored-by: Ryan <fauxpark@gmail.com> * [Keyboard] Add suika83opti (qmk#24991) * [chore]: move and rename mouse/scroll min/max defines (qmk#25141) * protocol: move {XY/HV}_REPORT_{MIN,MAX} into report.h ..to allow easier re-use in other code implementations. * protocol: rename {XY/HV}_REPORT_{MIN/MAX} to MOUSE_REPORT_{XY/HV}_{MIN/MAX} ..to avoid naming collisions. * [Core] Flow Tap tap-hold option to disable HRMs during fast typing (qmk#25125) aka Global Quick Tap, Require Prior Idle * Add Link keyboard (qmk#25058) Co-authored-by: jack <jack@pngu.org> Co-authored-by: Drashna Jaelre <drashna@live.com> * Remove Sofle `rgb_default` keymap & tidy readme's (qmk#25010) * Added Keyboard LumPy27 (qmk#24967) Co-authored-by: jack <jack@pngu.org> Co-authored-by: Drashna Jaelre <drashna@live.com> * [Keyboard] Kobold r1 (qmk#25161) * Kobold r1 * Apply suggestions from code review Co-authored-by: jack <jack@pngu.org> * `board_init` => `early_hardware_init_post`. --------- Co-authored-by: jack <jack@pngu.org> * [Docs] Unify lighting step descriptions (qmk#25167) unify lighting step descriptions and defaults across docs * [Keyboard] Add voidhhkb-hotswap (qmk#25007) * Added files for voidhhkb-hotswap * Updated keyboard name to resolve build errors * Implement suggestions from PR. Use 60_hhkb community layout. * Update keyboards/void/voidhhkb_hotswap/readme.md Co-authored-by: Ryan <fauxpark@gmail.com> * Apply suggestions from code review Co-authored-by: jack <jack@pngu.org> --------- Co-authored-by: Ryan <fauxpark@gmail.com> Co-authored-by: jack <jack@pngu.org> * Remove duplication of RGB Matrix defaults (qmk#25146) * Remove duplication of RGB Matrix defaults * Remove more duplication of defaults * fix * Fix missing and extra commas in JSON schema (qmk#25057) * Remove duplication of RGBLight defaults (qmk#25169) * Ignore the Layer Lock key in Repeat Key and Caps Word. (qmk#25171) * Allow for disabling EEPROM subsystem entirely. (qmk#25173) * [keyboard] ymdk/id75/rp2040 (qmk#25157) Co-authored-by: tao heihei <> * Remove `bluefruit_le_read_battery_voltage` function (qmk#25129) * Fix 'Would you like to clone the submodules?' prompt under msys (qmk#24958) * Fixup eeconfig lighting reset. (qmk#25166) * DOCS: `qmk-hid` missing in bootloaders list? (qmk#25177) * Fix for `.clangd`. (qmk#25180) * Update develop branch to Pico SDK 1.5.1 (qmk#25178) * Add lint warning for empty url (qmk#25182) * Implement connection keycode logic (qmk#25176) * Add handwired/footy (qmk#25151) Co-authored-by: jack <jack@pngu.org> * Decrease firmware size for `anavi/macropad8`. (qmk#25185) Preparation for bootstrapper. * Align ChibiOS `USB_WAIT_FOR_ENUMERATION` implementation (qmk#25184) * [Bug][Core] Fix for Flow Tap: fix handling of distinct taps and timer updates. (qmk#25175) * Flow Tap bug fix. As reported by @amarz45 and @mwpardue, there is a bug where if two tap-hold keys are pressed in distinct taps back to back, then Flow Tap is not applied on the second tap-hold key, but it should be. In a related bug reported by @NikGovorov, if a tap-hold key is held followed by a tap of a tap-hold key, then Flow Tap updates its timer on the release of the held tap-hold key, but it should be ignored. The problem common to both these bugs is that I incorrectly assumed `tapping_key` is cleared to noevent once it is released, when actually `tapping_key` is still maintained for `TAPPING_TERM` ms after release (for Quick Tap). This commit fixes that. Thanks to @amarz45, @mwpardue, and @NikGovorov for reporting! Details: * Logic for converting the current tap-hold event to a tap is extracted to `flow_tap_key_if_within_term()`, which is now invoked also in the post-release "interfered with other tap key" case. This fixes the distinct taps bug. * The Flow Tap timer is now updated at the beginning of each call to `process_record()`, provided that there is no unsettled tap-hold key at that time and that the record is not for a mod or layer switch key. By moving this update logic to `process_record()`, it is conceptually simpler and more robust. * Unit tests extended to cover the reported scenarios. * Fix formatting. * Revision to fix @NikGovorov's scenario. The issue is that when another key is pressed while a layer-tap hasn't been settled yet, the `prev_keycode` remembers the keycode from before the layer switched. This can then enable Flow Tap for the following key when it shouldn't, or vice versa. Thanks to @NikGovorov for reporting! This commit revises Flow Tap in the following ways: * The previous key and timer are both updated from `process_record()`. This is slightly later in the sequence of processing than before, and by this point, a just-settled layer-tap should have taken effect so that the keycode from the correct layer is remembered. * The Flow Tap previous key and timer are updated now also on key release events, except for releases of modifiers and held layer switches. * The Flow Tap previous key and timer are now updated together, for simplicity. This makes the logic easier to think about. * A few additional unit tests, including @NikGovorov's scenario as "layer_tap_ignored_with_disabled_key_complex." * Remove empty `url` fields (qmk#25181) * Prompt for converter when creating new keymap (qmk#25116) * High resolution scrolling (without feature report parsing) (qmk#24423) * hires scrolling without feature report parsing * fix valid range for exponent * fix incorrect minimum exponent value documentation * Avoid duplication in generated community modules `rules.mk` (qmk#25135) * Bump rlespinasse/github-slug-action from 3 to 5 (qmk#25021) * Remove `"console":false` from keyboards (qmk#25190) * Update 'qmk generate-api' to only publish pure DD keymaps (qmk#24782) * Remove more duplication of defaults (qmk#25189) * Align `new-keyboard` template to current standards (qmk#25191) * Bump vite from 5.4.15 to 5.4.18 in /builddefs/docsgen (qmk#25192) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Fix `boardsource/beiwagon` RGB Matrix coordinates (qmk#25018) * Remove `"command":false` from keyboards (qmk#25193) * Extend lint checks to reject duplication of defaults (qmk#25149) * modelh: add prerequisites for via support (qmk#24932) * First TypeK support (qmk#22876) * Add Lemokey X0 keyboard (qmk#24994) * keyboards/annepro2/ld: Add per-variant linker scripts (qmk#24999) C18 has an MCU with 16K SRAM, up from C15's 8K. Split the linker script into C15 and C18 variants to make use of the larger RAM capacity of C18. * Add new keyboard MirageiX (qmk#25054) Co-authored-by: Drashna Jaelre <drashna@live.com> Co-authored-by: jack <0x6a73@protonmail.com> * [Keymap] Sofle RGB - fixed stuck on numpad layer and layout comments (qmk#24942) * Add handwired 4x14 LuMaWing keyboard (qmk#24885) * Add jcpm2 (JC Pro Macro 2) (qmk#24816) Co-authored-by: jack <jack@pngu.org> Co-authored-by: Drashna Jaelre <drashna@live.com> Co-authored-by: Joel Challis <git@zvecr.com> * [Keyboard] Add splitkb.com's Halcyon Elora rev2 (qmk#24790) Co-authored-by: Drashna Jaelre <drashna@live.com> * [Keyboard] mzmkb/slimdash/rev1 (qmk#24804) Co-authored-by: Drashna Jaelre <drashna@live.com> Co-authored-by: jack <jack@pngu.org> Co-authored-by: Duncan Sutherland <dunk2k_2000@hotmail.com> Co-authored-by: Ryan <fauxpark@gmail.com> * Added new keyboard epssp75 (qmk#24756) Co-authored-by: Drashna Jaelre <drashna@live.com> * Addition of OK-1 (qmk#24646) Co-authored-by: Joel Challis <git@zvecr.com> Co-authored-by: Drashna Jaelre <drashna@live.com> * Add Umbra keyboard (qmk#24569) Co-authored-by: Duncan Sutherland <dunk2k_2000@hotmail.com> Co-authored-by: Ryan <fauxpark@gmail.com> Co-authored-by: Drashna Jaelre <drashna@live.com> * Amptrics 0420 keyboard addition (qmk#24744) Co-authored-by: jack <jack@pngu.org> Co-authored-by: Drashna Jaelre <drashna@live.com> Co-authored-by: Ryan <fauxpark@gmail.com> * [Core] Enhance Flow Tap to work better for rolls over multiple tap-hold keys. (qmk#25200) * Flow Tap revision for rolling press. * Remove debugging cruft. * Formatting fix. * amptrics/0422 - Prevent OOB in `update_leds_for_layer` (qmk#25209) * [Keyboard] Add Gravity-45(qmk#25206) * add gravity-45 * readme.md * fix readme * Update keyboards/green_keys/gravity_45/keyboard.json Co-authored-by: jack <0x6a73@protonmail.com> * run qmk format-json -i keyboards/green_keys/gravity_45/keyboard.json * add url * Update keyboards/green_keys/gravity_45/keyboard.json Co-authored-by: Duncan Sutherland <dunk2k_2000@hotmail.com> * Update keyboard.json * Update keyboard.json * Update keyboards/green_keys/gravity_45/keyboard.json Co-authored-by: Drashna Jaelre <drashna@live.com> --------- Co-authored-by: jack <0x6a73@protonmail.com> Co-authored-by: Duncan Sutherland <dunk2k_2000@hotmail.com> Co-authored-by: Drashna Jaelre <drashna@live.com> * Remove redundant keyboard headers (qmk#25208) * Fix Spleeb compile when pointing device is enabled (qmk#25016) * [Bug] Minimise force-included files (qmk#25194) * Add additional hooks for Community modules (qmk#25050) * Workaround for resolving keyboard alias for config file values (qmk#25228) * Generate versions to keycode headers (qmk#25219) * Resolve alias for `qmk new-keymap` keyboard prompts (qmk#25210) * [Keyboard] Add Binepad KN01 (qmk#25224) * Add Binepad NeoKnob KN01 * post @waffle87 recommendations * Add battery changed callbacks (qmk#25207) * Ensure `qmk_userspace_paths` maintains detected order (qmk#25204) * Bind Bluetooth driver to `host_driver_t` (qmk#25199) * Deprecate `qmk generate-compilation-database`. (qmk#25237) * Remove force disable of NKRO when Bluetooth enabled (qmk#25201) * Keycult 60 (qmk#25213) Co-authored-by: Duncan Sutherland <dunk2k_2000@hotmail.com> Co-authored-by: jack <jack@pngu.org> * [Keyboard] Add Binepad KnobX1 (qmk#25222) Co-authored-by: Drashna Jaelre <drashna@live.com> * [Keyboard] Update Tractyl Manuform and add F405 (weact) variant (qmk#24764) * Layout corrections: Zed60 (qmk#25003) * Fixed print statement after enabling 32-bit layers (qmk#25027) * Fix Aurora sweep default keymap configuration (qmk#25148) * Docs update for installing qmk with uv (qmk#24995) * CXT Studio 12E3: Fix encoder resolutions not applying (qmk#25242) * add resolution to encoders so they apply * Tweak default keymap * replace KC_UNDO with C(KC_Z) as well * Add debounce to duplicated defaults check (qmk#25246) * [Docs] Fix typos introduced by PR qmk#25050 (qmk#25250) It isn't a drashna PR if there aren't some typos in it somewhere. * Allow LVGL onekey keymap to be able compile for other board (qmk#25005) * [Keyboard] Add Jason Hazel’s Bad Wings v2 (qmk#25252) Co-authored-by: Florent Allard <florent.allard@savoirfairelinux.com> * Add raw_hid support to host driver (qmk#25255) * Fix Wear Leveling compilation (qmk#25254) * [New Feature/Core] New RGB Matrix Animation "Starlight Smooth" (qmk#25203) * Enable community modules to define LED matrix and RGB matrix effects. (qmk#25187) Co-authored-by: Joel Challis <git@zvecr.com> * Fix OS_DETECTION_KEYBOARD_RESET (qmk#25015) Co-authored-by: Nick Brassel <nick@tzarc.org> * Fixes the numlock indicator for Magic Force MF17 numpad (qmk#25260) * Add Harite v2 keyboard (qmk#24975) * dlip/haritev2 - Post merge fixes (qmk#25264) * Remove more USB only branches from NKRO handling (qmk#25263) * Deprecate `usb.force_nkro`/`FORCE_NKRO` (qmk#25262) * Add BDN9 Rev. 3 (qmk#25261) * Remove duplicate of SPI default config from keyboards (qmk#25266) * Resolve miscellaneous keyboard lint warnings (qmk#25268) * Add Zeropad (qmk#24737) Co-authored-by: Drashna Jaelre <drashna@live.com> Co-authored-by: Joel Challis <git@zvecr.com> * Add Waveshare RP2040-Keyboard-3 support (qmk#25269) * Update PR checklist notes on custom matrix (qmk#25240) * Chew folders (qmk#24785) * gcc15 AVR compilation fixes (qmk#25238) * [Core] STM32G0x1 support (qmk#24301) * Use relative paths for schemas, instead of $id. Enables VScode validation. (qmk#25251) * add doio/kb03 (qmk#24815) Co-authored-by: Drashna Jaelre <drashna@live.com> Co-authored-by: Joel Challis <git@zvecr.com> * Move rookiebwoy to ivndbt (qmk#25142) * [Chore] use {rgblight,rgb_matrix}_hsv_to_rgb overrides (qmk#25271) * Remove outdated `nix` support due to bit-rot. (qmk#25280) * Add `compiler_support.h` (qmk#25274) * Configure boards to use development_board - 0-9 (qmk#25287) * [Fix] lib8tion: enable fixed scale8 and blend functions (qmk#25272) lib8tion: enable fixed scale8 and blend functions These FastLED derived lib8tion functions have been fixed and enabled by default in FastLED. QMK just never set these defines, there is no reason to keep the buggy implementation. It is assumed that nobody relied on the buggy behavior. * Configure boards to use development_board - UVWXYZ (qmk#25288) * [Docs] Fix tap_hold code blocks (qmk#25298) * salicylic_acid3/getta25 - Fix oled keymap (qmk#25295) * Configure boards to use development_board - S (qmk#25293) * Configure boards to use development_board - T (qmk#25294) * 2025 Q2 changelog (qmk#25297) Co-authored-by: Drashna Jaelre <drashna@live.com> Co-authored-by: Nick Brassel <nick@tzarc.org> * Update Oryx module for newer code * Soft reset matrix * Use improved i2c reset for voyager and moonlander matrix * Fix formatting * Remove labeler action (unneeded) * Fix module API version for Oryx module * Use i2cStop instead of trying to work around --------- Signed-off-by: Stefan Kerkmann <karlk90@pm.me> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: Duncan Sutherland <dunk2k_2000@hotmail.com> Co-authored-by: QMK Bot <hello@qmk.fm> Co-authored-by: Pascal Getreuer <50221757+getreuer@users.noreply.github.com> Co-authored-by: Ryan <fauxpark@gmail.com> Co-authored-by: Joel Challis <git@zvecr.com> Co-authored-by: Ramon Imbao <ramonimbao@gmail.com> Co-authored-by: Stefan Kerkmann <karlk90@pm.me> Co-authored-by: Nick Brassel <nick@tzarc.org> Co-authored-by: jack <jack@pngu.org> Co-authored-by: yiancar <yiangosyiangou@cytanet.com.cy> Co-authored-by: yiancar <yiancar@gmail.com> Co-authored-by: Erik Peyronson <erikpeyronson@gmail.com> Co-authored-by: Erik Peyronson <erik.peyronson@gmail.com> Co-authored-by: Sắn <59417802+MaiTheSan@users.noreply.github.com> Co-authored-by: Hyphen-ated <Hyphen-ated@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Geoffrey Frogeye <s+github@frogeye.fr> Co-authored-by: lsh4711 <120231876+lsh4711@users.noreply.github.com> Co-authored-by: Ben Green <bengreen.uk@gmail.com> Co-authored-by: フィルターペーパー <76888457+filterpaper@users.noreply.github.com> Co-authored-by: henrikosorensen <henrik.sorensen@gmail.com> Co-authored-by: Ivan Gromov <38141348+key10iq@users.noreply.github.com> Co-authored-by: Sergey Vlasov <sigprof@gmail.com> Co-authored-by: Pham Duc Minh <95753855+Deemen17@users.noreply.github.com> Co-authored-by: Dam Vu Duy <RyanDam@users.noreply.github.com> Co-authored-by: nonameCCC <79012391+nonameCCC@users.noreply.github.com> Co-authored-by: sudo pacman -Syu <hauvipapro@gmail.com> Co-authored-by: Andrew Kannan <andrew.kannan@gmail.com> Co-authored-by: Luis Garcia <luis@bitjester.com> Co-authored-by: Christian C. Berclaz <christian.berclaz@mac.com> Co-authored-by: Olivier Mehani <shtrom-github@ssji.net> Co-authored-by: Sylvain Huguet <sylvain@huguet.me> Co-authored-by: suikagiken <115451678+suikagiken@users.noreply.github.com> Co-authored-by: Daniel Reisch <danieljreisch@gmail.com> Co-authored-by: ClownFish <177758267+clownfish-og@users.noreply.github.com> Co-authored-by: JamesWilson1996 <47866504+JamesWilson1996@users.noreply.github.com> Co-authored-by: Less/Rikki <86894501+lesshonor@users.noreply.github.com> Co-authored-by: Jan Bláha <blaha.j502@gmail.com> Co-authored-by: Eric Molitor <534583+emolitor@users.noreply.github.com> Co-authored-by: CJ Pais <cj@cjpais.com> Co-authored-by: eynsai <47629346+eynsai@users.noreply.github.com> Co-authored-by: Joel Beckmeyer <joel@beckmeyer.us> Co-authored-by: Álvaro A. Volpato <alvaro.augusto.volpato@gmail.com> Co-authored-by: Aidan Gauland <aidalgol@users.noreply.github.com> Co-authored-by: Michał Kopeć <michal@nozomi.space> Co-authored-by: takashicompany <t@kashi.company> Co-authored-by: jack <0x6a73@protonmail.com> Co-authored-by: Matheus Marques <matheusmbar@gmail.com> Co-authored-by: LucasMateijsen <l.mateijsen@outlook.com> Co-authored-by: Jeremy Cook <jscook55@gmail.com> Co-authored-by: VeyPatch <126267034+VeyPatch@users.noreply.github.com> Co-authored-by: mizma <omoikane@path-works.net> Co-authored-by: hen-des <141591967+hen-des@users.noreply.github.com> Co-authored-by: Cipulot <40441626+Cipulot@users.noreply.github.com> Co-authored-by: josephawilliamsiv <31166673+josephawilliamsiv@users.noreply.github.com> Co-authored-by: vchowl <vchowl@outlook.com> Co-authored-by: Christopher Hoage <iam@chrishoage.com> Co-authored-by: Silvino R. <366673+silvinor@users.noreply.github.com> Co-authored-by: dabstractor <dustindschultz@gmail.com> Co-authored-by: Nathan Cain <13713501+nathanscain@users.noreply.github.com> Co-authored-by: muge <221161+muge@users.noreply.github.com> Co-authored-by: HorrorTroll <sonicvipduc@gmail.com> Co-authored-by: cyxae <cyxae@amphitryon.nrst.fr> Co-authored-by: Florent Allard <florent.allard@savoirfairelinux.com> Co-authored-by: art-was-here <mail@buckles.email> Co-authored-by: Matti Hiljanen <170205+qvr@users.noreply.github.com> Co-authored-by: Wasteland Fluttershy <ingvardm@gmail.com> Co-authored-by: Dane Lipscombe <danelipscombe@gmail.com> Co-authored-by: Danny <nooges@users.noreply.github.com> Co-authored-by: Infos <136488157+diffrentGuesser@users.noreply.github.com> Co-authored-by: Florent Linguenheld <f@linguenheld.fr> Co-authored-by: ivan <81021475+ivndbt@users.noreply.github.com> Co-authored-by: Pablo Martínez <58857054+elpekenin@users.noreply.github.com>
…mk#25125) aka Global Quick Tap, Require Prior Idle
…mk#25125) aka Global Quick Tap, Require Prior Idle
…mk#25125) aka Global Quick Tap, Require Prior Idle



Adds Flow Tap as a core tap-hold option to disable HRMs during fast typing, aka Global Quick Tap, Require Prior Idle.
Description
I previously developed a Tap Flow community module, inspired by @filterpaper's Contextual Mod-Taps, to disable home row mods during fast typing. This PR implements Tap Flow / Flow Tap as a core QMK option. This solves a couple limitations that the module version has. Notable, the module version is unable to act on tap-hold keys that are also used in a combo. In this core implementation, the logic can be added in the proper place to work nicely with combos.
Flow Tap modifies mod-tap
MTand layer-tapLTkeys such that when pressed within a short timeout of the preceding key, the tapping behavior is triggered. It basically disables the hold behavior during fast typing, creating a "flow of taps." It also helps to reduce the input lag of tap-hold keys during fast typing, since the tapped behavior is sent immediately.Naming
There are multiple reasonable ways to name this option. Some pre-existing names:
The name "Flow Tap" is a good one with the rationale that, one, it's short, and additionally, it's illustrative of the intended result that fast typing is a "flow of taps." It also parallels the existing "Quick Tap" and "Chordal Hold" names in a fitting way. I've named the option that way here. I'm open to renaming if there's strong favor for something else.
Implementation notes
The interesting changes are in
action_tapping.c. In the Chordal Hold PR #24560, I added a "registered_taps" array inaction_tapping.cto remember tapped tap-hold keys, so that they release correctly. I reuse that logic here for Flow Tap, which makes this PR relatively straightforward. Essentially, when the timing condition is met, register the tap-hold key as tapped.How to use Flow Tap
To enable Flow Tap, define
FLOW_TAP_TERMin yourconfig.h. I recommend a timeout of 150 ms as a starting point:By default, Flow Tap is enabled when:
The tap-hold key is pressed within
FLOW_TAP_TERMmilliseconds of the previous key press.The tapping keycodes of the previous key and tap-hold key are both among
KC_A–KC_Z,KC_COMM,KC_DOT,KC_SCLN,KC_SLSH(the main alphas area of a conventional QWERTY layout) orKC_SPC. The idea is that this should work reasonably even if the layout is remapped on the host to an alt layout or international layout (e.g. Dvorak or AZERTY), where these same key positions are mostly used for typing letters.As an exception to the above, Flow Tap is temporarily disabled while a tap-hold key is undecided. This is to allow chording multiple mod-tap keys without having to wait out the Flow Tap term.
Optionally, Flow Tap may be customized by defining the
is_flow_tap_key()andget_flow_tap_term()callbacks. Please see the documentation added intap_hold.mdfor details.Types of Changes
Issues Fixed or Closed by This PR
require-prior-idle-msin QMK #24262Checklist