20251130.md (13169B)
1 # QMK Breaking Changes - 2025 Nov 30 Changelog 2 3 ## Notable Features {#notable-features} 4 5 ### Speculative Hold option for mod-taps: hold mods instantly while unsettled [#25572](https://github.com/qmk/qmk_firmware/pull/25572) 6 7 Speculative Hold makes mod-tap keys more responsive by applying the modifier instantly on keydown, before the tap-hold decision is made. This is especially useful for actions like Shift+click and Ctrl+scroll wheel with an external mouse, which can feel laggy with standard mod-taps. 8 9 The firmware holds the modifier speculatively. Once the key's behavior is settled: 10 11 * If held, the modifier remains active as expected until the key is released. 12 * If tapped, the speculative modifier is canceled just before the tapping keycode is sent. 13 14 Speculative Hold applies the modifier early but does not change the underlying tap-hold decision logic. Speculative Hold is compatible to use in combination with any other tap-hold options. 15 16 see the [Speculative Hold](../tap_hold#speculative-hold) documentation for more information. 17 18 ## Changes Requiring User Action 19 20 ### Updated Keyboard Codebases 21 22 | Old Keyboard Name | New Keyboard Name | 23 |----------------------------------|-------------------------| 24 | 0xcb/splaytoraid/32u4 | 0xcb/splaytoraid | 25 | 0xcb/splaytoraid/rp2040_ce | 0xcb/splaytoraid | 26 | 1upkeyboards/sweet16v2/kb2040 | 1upkeyboards/sweet16v2 | 27 | 1upkeyboards/sweet16v2/pro_micro | 1upkeyboards/sweet16v2 | 28 | 40percentclub/gherkin/kb2040 | 40percentclub/gherkin | 29 | 40percentclub/gherkin/pro_micro | 40percentclub/gherkin | 30 | durgod/dgk6x/venus | durgod/dgk6x/venus_ansi | 31 32 ### Reduce tap dance memory usage, move state out of data [#25415](https://github.com/qmk/qmk_firmware/pull/25415) 33 34 The tap dance state has been separated from the action structure. Custom tap dance functions now receive the state as a separate parameter instead of accessing it through `action->state`. 35 36 If your keymap uses custom tap dance functions that access the tap dance state, you need to update your code. 37 38 * You can't use `action->state`. Instead you need to call `tap_dance_state_t *tap_dance_get_state(uint8_t tap_dance_idx)` to get the state. 39 * You now get a pointer to the state, so use `->` notation rather than `.` notation to get fields from it. 40 41 ### Before: 42 ```c 43 bool process_record_user(uint16_t keycode, keyrecord_t *record) { 44 tap_dance_action_t *action; 45 46 switch (keycode) { 47 case TD(CT_CLN): 48 action = tap_dance_get(QK_TAP_DANCE_GET_INDEX(keycode)); 49 if (!record->event.pressed && action->state.count && !action->state.finished) { 50 tap_dance_tap_hold_t *tap_hold = (tap_dance_tap_hold_t *)action->user_data; 51 tap_code16(tap_hold->tap); 52 } 53 54 } 55 return true; 56 } 57 ``` 58 ### After: 59 ```c 60 bool process_record_user(uint16_t keycode, keyrecord_t *record) { 61 tap_dance_action_t *action; 62 tap_dance_state_t* state; 63 switch (keycode) { 64 case TD(CT_CLN): 65 action = tap_dance_get(QK_TAP_DANCE_GET_INDEX(keycode)); 66 state = tap_dance_get_state(QK_TAP_DANCE_GET_INDEX(keycode)); 67 if (!record->event.pressed && state != NULL && state->count && !state->finished) { 68 tap_dance_tap_hold_t *tap_hold = (tap_dance_tap_hold_t *)action->user_data; 69 tap_code16(tap_hold->tap); 70 } 71 } 72 return true; 73 } 74 ``` 75 76 ## Deprecation Notices 77 78 In line with the [notice period](../support_deprecation_policy#how-much-advance-notice-will-be-given), deprecation notices for larger items are listed here. 79 80 ### Remove override of QK_{LED,RGB}_MATRIX_TOGGLE keycode [#25672](https://github.com/qmk/qmk_firmware/pull/25672) 81 82 [#24649](https://github.com/qmk/qmk_firmware/pull/24649) implemented genetic behavior, including keycodes, to cycle flags. 83 84 Any overriding of existing keycodes that duplicate this behavior will be removed to ensure consistency with core functionality. 85 86 ## Full changelist 87 88 Core: 89 * suspend: suppress wake up keypress ([#23389](https://github.com/qmk/qmk_firmware/pull/23389)) 90 * [Feature Improvement]add option to keep layer state when recording dynamic macros ([#24418](https://github.com/qmk/qmk_firmware/pull/24418)) 91 * Add generic handling to cycle LED/RGB Matrix flags ([#24649](https://github.com/qmk/qmk_firmware/pull/24649)) 92 * Implement `mod_t` packed struct ([#25168](https://github.com/qmk/qmk_firmware/pull/25168)) 93 * Implement minimal connection update logic ([#25334](https://github.com/qmk/qmk_firmware/pull/25334)) 94 * Reduce tap dance memory usage, move state out of data ([#25415](https://github.com/qmk/qmk_firmware/pull/25415)) 95 * Refactor debounce algorithm with static allocation ([#25515](https://github.com/qmk/qmk_firmware/pull/25515)) 96 * Restructure Pixel Rain interval code ([#25516](https://github.com/qmk/qmk_firmware/pull/25516)) 97 * Guard remapping logic with MAGIC_ENABLE ([#25537](https://github.com/qmk/qmk_firmware/pull/25537)) 98 * Update default OLED font ([#25565](https://github.com/qmk/qmk_firmware/pull/25565)) 99 * Speculative Hold option for mod-taps: hold mods instantly while unsettled. ([#25572](https://github.com/qmk/qmk_firmware/pull/25572)) 100 * Simplify hue calculation in raindrops animation ([#25587](https://github.com/qmk/qmk_firmware/pull/25587)) 101 * Simplify tap_code16_delay ([#25595](https://github.com/qmk/qmk_firmware/pull/25595)) 102 * Debounce: Deprecate num_rows parameter ([#25632](https://github.com/qmk/qmk_firmware/pull/25632)) 103 * Add I2C Transmit and Receive function ([#25637](https://github.com/qmk/qmk_firmware/pull/25637)) 104 * [QP] Minor cleanup and support for RGB888 surface ([#25706](https://github.com/qmk/qmk_firmware/pull/25706)) 105 * Restrict mouse timer activation to movement keycodes ([#25716](https://github.com/qmk/qmk_firmware/pull/25716)) 106 * Update STM32F446 default HSE to 8MHz ([#25717](https://github.com/qmk/qmk_firmware/pull/25717)) 107 * making flowtap timer public so it can be used easily with combos ([#25731](https://github.com/qmk/qmk_firmware/pull/25731)) 108 * Add PixArt PAW-3222 mouse sensor driver ([#25763](https://github.com/qmk/qmk_firmware/pull/25763)) 109 * Merge upstream uf2conv changes ([#25786](https://github.com/qmk/qmk_firmware/pull/25786)) 110 * Partially skip generating community modules when none enabled ([#25819](https://github.com/qmk/qmk_firmware/pull/25819)) 111 112 CLI: 113 * Generate default encoder resolution for sparse config ([#25247](https://github.com/qmk/qmk_firmware/pull/25247)) 114 * Add DIP Switch map support to keymap.json ([#25431](https://github.com/qmk/qmk_firmware/pull/25431)) 115 * Add return code to `qmk userspace-doctor` ([#25775](https://github.com/qmk/qmk_firmware/pull/25775)) 116 * Better defaulting of `{RGB,LED}_MATRIX_DEFAULT_FLAGS` ([#25785](https://github.com/qmk/qmk_firmware/pull/25785)) 117 * add BCD versions of QMK Version ([#25804](https://github.com/qmk/qmk_firmware/pull/25804)) 118 * Lint error on missing keyboard readme ([#25814](https://github.com/qmk/qmk_firmware/pull/25814)) 119 120 Submodule updates: 121 * Update ChibiOS-Contrib. ([#25751](https://github.com/qmk/qmk_firmware/pull/25751)) 122 123 Keyboards: 124 * `atreus`: restore intended matrix implementations ([#24082](https://github.com/qmk/qmk_firmware/pull/24082)) 125 * add SteelSeries prime, a stripped down prime+ ([#24719](https://github.com/qmk/qmk_firmware/pull/24719)) 126 * Add new macropad Sharkropad ([#24961](https://github.com/qmk/qmk_firmware/pull/24961)) 127 * Addition of the D60B tsangan pcb ([#25245](https://github.com/qmk/qmk_firmware/pull/25245)) 128 * Migrate `eeconfig_init_kb` implementations to config ([#25422](https://github.com/qmk/qmk_firmware/pull/25422)) 129 * Generate `CUSTOM_MATRIX = lite` without `matrix_pins.custom` ([#25453](https://github.com/qmk/qmk_firmware/pull/25453)) 130 * Add classic48 keyboard ([#25492](https://github.com/qmk/qmk_firmware/pull/25492)) 131 * add durgod venus iso support ([#25526](https://github.com/qmk/qmk_firmware/pull/25526)) 132 * Migrate `g_led_config` to DD (0-9, A) ([#25558](https://github.com/qmk/qmk_firmware/pull/25558)) 133 * Migrate `g_led_config` to DD (B, C) ([#25559](https://github.com/qmk/qmk_firmware/pull/25559)) 134 * Migrate `g_led_config` to DD (D) ([#25560](https://github.com/qmk/qmk_firmware/pull/25560)) 135 * Migrate `g_led_config` to DD (E, F) ([#25561](https://github.com/qmk/qmk_firmware/pull/25561)) 136 * Remove duplication of RP2040 config defaults ([#25563](https://github.com/qmk/qmk_firmware/pull/25563)) 137 * Refactor 40percentclub/ut47 ([#25571](https://github.com/qmk/qmk_firmware/pull/25571)) 138 * E7-V2 Implementation ([#25594](https://github.com/qmk/qmk_firmware/pull/25594)) 139 * Migrate `g_led_config` to DD (G) ([#25598](https://github.com/qmk/qmk_firmware/pull/25598)) 140 * Migrate `g_led_config` to DD (H) ([#25599](https://github.com/qmk/qmk_firmware/pull/25599)) 141 * Migrate `g_led_config` to DD (I) ([#25600](https://github.com/qmk/qmk_firmware/pull/25600)) 142 * Migrate `g_led_config` to DD (JK1) ([#25601](https://github.com/qmk/qmk_firmware/pull/25601)) 143 * Migrate `g_led_config` to DD (K2) ([#25602](https://github.com/qmk/qmk_firmware/pull/25602)) 144 * Migrate `g_led_config` to DD (K3) ([#25603](https://github.com/qmk/qmk_firmware/pull/25603)) 145 * Migrate `g_led_config` to DD (K4) ([#25605](https://github.com/qmk/qmk_firmware/pull/25605)) 146 * Migrate `g_led_config` to DD (K5) ([#25606](https://github.com/qmk/qmk_firmware/pull/25606)) 147 * Migrate `g_led_config` to DD (K6) ([#25607](https://github.com/qmk/qmk_firmware/pull/25607)) 148 * Refactor `40percentclub/gherkin` ([#25608](https://github.com/qmk/qmk_firmware/pull/25608)) 149 * Refactor `0xcb/splaytoraid` ([#25609](https://github.com/qmk/qmk_firmware/pull/25609)) 150 * Refactor `1upkeyboards/sweet16v2` ([#25610](https://github.com/qmk/qmk_firmware/pull/25610)) 151 * Migrate `g_led_config` to DD (K7) ([#25616](https://github.com/qmk/qmk_firmware/pull/25616)) 152 * Migrate `g_led_config` to DD (L) ([#25617](https://github.com/qmk/qmk_firmware/pull/25617)) 153 * Migrate `g_led_config` to DD (M1) ([#25618](https://github.com/qmk/qmk_firmware/pull/25618)) 154 * Migrate `g_led_config` to DD (M2) ([#25619](https://github.com/qmk/qmk_firmware/pull/25619)) 155 * Migrate `g_led_config` to DD (M3) ([#25620](https://github.com/qmk/qmk_firmware/pull/25620)) 156 * Migrate `g_led_config` to DD (NO) ([#25621](https://github.com/qmk/qmk_firmware/pull/25621)) 157 * Migrate `g_led_config` to DD (P) ([#25622](https://github.com/qmk/qmk_firmware/pull/25622)) 158 * Migrate `g_led_config` to DD (QR) ([#25623](https://github.com/qmk/qmk_firmware/pull/25623)) 159 * Migrate `g_led_config` to DD (S) ([#25624](https://github.com/qmk/qmk_firmware/pull/25624)) 160 * Migrate `g_led_config` to DD (TUW) ([#25625](https://github.com/qmk/qmk_firmware/pull/25625)) 161 * Remove idobao *_DISABLE_UNDERGLOW behaviour ([#25638](https://github.com/qmk/qmk_firmware/pull/25638)) 162 * Migrate `g_led_config` to DD (YZ) ([#25650](https://github.com/qmk/qmk_firmware/pull/25650)) 163 * Tidy Keebio keyboards ([#25653](https://github.com/qmk/qmk_firmware/pull/25653)) 164 * Remove encoder resolution where duplicating defaults ([#25654](https://github.com/qmk/qmk_firmware/pull/25654)) 165 * Custom oled fonts cleanup ([#25665](https://github.com/qmk/qmk_firmware/pull/25665)) 166 * Binepad KnobX1 - refactor `x1_layer_led` function as weak ([#25668](https://github.com/qmk/qmk_firmware/pull/25668)) 167 * Add DD {LED,RGB}_MATRIX_DEFAULT_FLAGS support ([#25671](https://github.com/qmk/qmk_firmware/pull/25671)) 168 * keyboards: Add Royal Kludge RK61 ([#25694](https://github.com/qmk/qmk_firmware/pull/25694)) 169 * Add TRKeyboard TRK2 keyboard ([#25754](https://github.com/qmk/qmk_firmware/pull/25754)) 170 171 Keyboard fixes: 172 * Fixup `kprepublic/bm60hsrgb/rev2` ([#25644](https://github.com/qmk/qmk_firmware/pull/25644)) 173 * Fixup `kprepublic/bm60hsrgb_iso/rev2` ([#25648](https://github.com/qmk/qmk_firmware/pull/25648)) 174 * Fixup `kprepublic/bm60hsrgb_poker/rev2` ([#25649](https://github.com/qmk/qmk_firmware/pull/25649)) 175 * Fixup `rgbkb/pan` ([#25678](https://github.com/qmk/qmk_firmware/pull/25678)) 176 * Align use of keymap level `_kb` callbacks ([#25774](https://github.com/qmk/qmk_firmware/pull/25774)) 177 178 Others: 179 * Rework converter docs ([#18314](https://github.com/qmk/qmk_firmware/pull/18314)) 180 * Update USBaspLoader ISP instructions ([#25590](https://github.com/qmk/qmk_firmware/pull/25590)) 181 * Add LED/RGB Matrix flags API docs ([#25673](https://github.com/qmk/qmk_firmware/pull/25673)) 182 183 Bugs: 184 * Fix single key combos activating only once ([#25198](https://github.com/qmk/qmk_firmware/pull/25198)) 185 * Fix RGB matrix not syncing and turning off properly on timeout ([#25467](https://github.com/qmk/qmk_firmware/pull/25467)) 186 * Fix drv haptics docs by using the correct function name ([#25733](https://github.com/qmk/qmk_firmware/pull/25733)) 187 * Fix Magic GUI masking logic ([#25780](https://github.com/qmk/qmk_firmware/pull/25780)) 188 * Fix Speculative Hold to enable also right-handed RSFT, RCTL by default. ([#25797](https://github.com/qmk/qmk_firmware/pull/25797)) 189 * Fix community layout keymap discovery ([#25802](https://github.com/qmk/qmk_firmware/pull/25802)) 190 * Fix preference of output file for 'qmk generate-autocorrect-data' ([#25818](https://github.com/qmk/qmk_firmware/pull/25818))