<spanclass="line"><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><p>The correct way to update this code without accidentally changing how the layer-taps work would be the following:</p><divclass="language-c vp-adaptive-theme"><buttontitle="Copy Code"class="copy"></button><spanclass="lang">c</span><preclass="shiki shiki-themes github-light github-dark vp-code"><code><spanclass="line"><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;">bool</span><spanstyle="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> get_hold_on_other_key_press</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;">uint16_t</span><spanstyle="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> keycode</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><spanstyle="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">keyrecord_t</span><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;"> *</span><spanstyle="--shiki-light:#E36209;--shiki-dark:#FFAB70;">record</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
<spanclass="line"><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // Enable HOLD_ON_OTHER_KEY_PRESS for every other mod-tap keycode.</span></span>
<spanclass="line"><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><p>For more information, you are invited to read the sections on <ahref="./../tap_hold#ignore-mod-tap-interrupt">IGNORE_MOD_TAP_INTERRUPT</a> and <ahref="./../tap_hold#hold-on-other-key-press">HOLD_ON_OTHER_KEY_PRESS</a> in the page on <ahref="./../tap_hold">Tap-Hold configuration options</a>.</p><h3id="quick-tap-term"tabindex="-1"><code>TAPPING_FORCE_HOLD</code> =><code>QUICK_TAP_TERM</code> (<ahref="https://github.com/qmk/qmk_firmware/pull/17007"target="_blank"rel="noreferrer">#17007</a>) <aclass="header-anchor"href="#quick-tap-term"aria-label="Permalink to "`TAPPING_FORCE_HOLD` => `QUICK_TAP_TERM` ([#17007](https://github.com/qmk/qmk_firmware/pull/17007)) {#quick-tap-term}""></a></h3><p><code>TAPPING_FORCE_HOLD</code> feature is now replaced by <code>QUICK_TAP_TERM</code>. Instead of turning off auto-repeat completely, user will have the option to configure a <code>QUICK_TAP_TERM</code> in milliseconds. When the user holds a tap-hold key after tapping it within <code>QUICK_TAP_TERM</code>, QMK will send the tap keycode to the host, enabling auto-repeat.</p><p>Its value is set to <code>TAPPING_TERM</code> by default and it can be reduced to match typing habits to avoid false triggers. To disable auto-repeat completely, set <code>QUICK_TAP_TERM</code> to zero.</p><p><code>TAPPING_FORCE_HOLD_PER_KEY</code> is also deprecated and replaced by <code>QUICK_TAP_TERM_PER_KEY</code>. The old granular control function for tapping force hold is:</p><divclass="language-c vp-adaptive-theme"><buttontitle="Copy Code"class="copy"></button><spanclass="lang">c</span><preclass="shiki shiki-themes github-light github-dark vp-code"><code><spanclass="line"><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;">bool</span><spanstyle="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> get_tapping_force_hold</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;">uint16_t</span><spanstyle="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> keycode</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><spanstyle="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">keyrecord_t</span><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;"> *</span><spanstyle="--shiki-light:#E36209;--shiki-dark:#FFAB70;">record</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
<spanclass="line"><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><p>For more details, please read the updated documentation section on <ahref="./../tap_hold#quick-tap-term">Quick Tap Term</a>.</p><h3id="leader-key-rework-leader-key-rework-19632"tabindex="-1">Leader Key Rework {#leader-key-rework (<ahref="https://github.com/qmk/qmk_firmware/pull/19632"target="_blank"rel="noreferrer">#19632</a>)} <aclass="header-anchor"href="#leader-key-rework-leader-key-rework-19632"aria-label="Permalink to "Leader Key Rework {#leader-key-rework ([#19632](https://github.com/qmk/qmk_firmware/pull/19632))}""></a></h3><p>The Leader Key feature API has been significantly improved, along with some bugfixes and added tests.</p><p>Instead of defining your leader sequences in <code>matrix_scan_user()</code>, they are now handled in the <code>leader_end_user()</code> callback, and the <code>LEADER_EXTERNS()</code>/<code>LEADER_DICTIONARY()</code> macros are no longer needed:</p><divclass="language-c vp-adaptive-theme"><buttontitle="Copy Code"class="copy"></button><spanclass="lang">c</span><preclass="shiki shiki-themes github-light github-dark vp-code"><code><spanclass="line"><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;">void</span><spanstyle="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> leader_end_user</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;">void</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
<spanclass="line"><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // Leader, f => Types the below string</span></span>
<spanclass="line"><spanstyle="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> SEND_STRING</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><spanstyle="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"QMK is awesome."</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">);</span></span>
<spanclass="line"><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><p>For more information please see the <ahref="./../features/leader_key">Leader Key documentation</a>.</p><h3id="updated-keyboard-codebases"tabindex="-1">Updated Keyboard Codebases <aclass="header-anchor"href="#updated-keyboard-codebases"aria-label="Permalink to "Updated Keyboard Codebases {#updated-keyboard-codebases}""></a></h3><p>The following keyboards have had their source moved within QMK:</p><table><thead><tr><th>Old Keyboard Name</th><th>New Keyboard Name</th></tr></thead><tbody><tr><td>ramonimbao/aelith</td><td>rmi_kb/aelith</td></tr><tr><td>ramonimbao/herringbone/pro</td><td>rmi_kb/herringbone/pro</td></tr><tr><td>ramonimbao/herringbone/v1</td><td>rmi_kb/herringbone/v1</td></tr><tr><td>ramonimbao/mona/v1_1</td><td>rmi_kb/mona/v1_1</td></tr><tr><td>ramonimbao/mona/v1</td><td>rmi_kb/mona/v1</td></tr><tr><td>ramonimbao/mona/v32a</td><td>rmi_kb/mona/v32a</td></tr><tr><td>ramonimbao/squishy65</td><td>rmi_kb/squishy65</td></tr><tr><td>ramonimbao/squishytkl</td><td>rmi_kb/squishytkl</td></tr><tr><td>ramonimbao/tkl_ff</td><td>rmi_kb/tkl_ff</td></tr><tr><td>ramonimbao/tkl_ff/v1</td><td>rmi_kb/tkl_ff/v1</td></tr><tr><td>ramonimbao/tkl_ff/v2</td><td>rmi_kb/tkl_ff/v2</td></tr><tr><td>ramonimbao/wete/v1</td><td>rmi_kb/wete/v1</td></tr><tr><td>ramonimbao/wete/v2</td><td>rmi_kb/wete/v2</td></tr><tr><td>the_uni</td><td>stenothe_uni</td></tr><tr><td>xelus/xs60</td><td>xelus/xs60/soldered</td></tr></tbody></table><h2id="notable-core"tabindex="-1">Notable core changes <aclass="header-anchor"href="#notable-core"aria-label="Permalink to "Notable core changes {#notable-core}""></a></h2><p>As per last breaking changes cycle, there has been <em>a lot</em> of emphasis on behind-the-scenes changes, mainly around consolidation of core subsystems and constant values, as well as addressing tech debt. Whilst not outwardly visible, this cleanup and refactoring should start paying dividends as it simplifies future development and maintenance.</p><p>A handful of examples:</p><ul><li>Standardised the lower/raise/adjust layer change pattern with explicit keycodes and configurable target layers</li><li>Cleaned up a lot of Makefile logic to simplify and speed up builds</li><li>Automated tooling to regenerate keycode values has been hooked into the PR pipeline and will trigger failures if they're incorrect</li><li>Many more configuration options have moved into <code>info.json</code>, such as backlight, encoders</li><li>Additional unit tests to ensure keycode behaviours don't accidentally change</li></ul><h2id="full-changelist"tabindex="-1">Full changelist <aclass="header-anchor"href="#full-changelist"aria-label="Permalink to "Full changelist {#full-changelist}""></a></h2><p>Core:</p><ul><li>Remove IGNORE_MOD_TAP_INTERRUPT_PER_KEY in favour of HOLD_ON_OTHER_KEY_PRESS_PER_KEY (<ahref="https://github.com/qmk/qmk_firmware/pull/15741"target="_blank"rel="noreferrer">#15741</a>)</li><li>Add combo hook to allow per layer combo reference layers. (<ahref="https://github.com/qmk/qmk_firmware/pull/16699"target="_blank"rel="noreferrer">#16699</a>)</li><li>Replace Tapping Force Hold feature with Quick Tap Term (<ahref="https://github.com/qmk/qmk_firmware/pull/17007"target="_blank"rel="noreferrer">#17007</a>)</li><li>[Test] Reset timer for every unit test and provide timestamps for log messages (<ahref="https://github.com/qmk/qmk_firmware/pull/17028"target="_blank"rel="noreferrer">#17028</a>)</li><li>Bug17281 - Retain momentary layers until the end of tapping (<ahref="https://github.com/qmk/qmk_firmware/pull/17282"target="_blank"rel="noreferrer">#17282</a>)</li><li>Detect host OS based on USB fingerprint (<ahref="https://github.com/qmk/qmk_firmware/pull/18463"target="_blank"rel="noreferrer">#18463</a>)</li><li>allow locking the matrix state (<ahref="https://github.com/qmk/qmk_firmware/pull/18852"target="_blank"rel="noreferrer">#18852</a>)</li><li>Initial DD keymap_extra