qmk_firmware

QMK firmware for my keyboards (Corne, Sweep Ferris) and trackball (Ploopy Adept)
Log | Files | Refs | Submodules | LICENSE

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))