import { _ as _export_sfc, c as createElementBlock, o as openBlock, a8 as createStaticVNode } from "./chunks/framework.DyMmIvSC.js"; const __pageData = JSON.parse('{"title":"QMK Breaking Changes - 2023 November 26 Changelog","description":"","frontmatter":{},"headers":[],"relativePath":"ChangeLog/20231126.md","filePath":"ChangeLog/20231126.md"}'); const _sfc_main = { name: "ChangeLog/20231126.md" }; const _hoisted_1 = /* @__PURE__ */ createStaticVNode('

QMK Breaking Changes - 2023 November 26 Changelog

Notable Features

As per last few breaking changes cycles, there have been a lot of behind-the-scenes changes, mainly around consolidation of config into info.json files, cleanup of info.json files, cleaning up driver naming, as well as addressing technical debt.

As a followup to last cycle's notable changes, as qmk/qmk_firmware is no longer accepting PRs for keymaps we're pleased to announce that storing and building keymaps externally from the normal QMK Firmware repository is now possible. This is done through the new External Userspace feature, more details below!

Changes Requiring User Action

Updated Keyboard Codebases

Old Keyboard NameNew Keyboard Name
adm42adm42/rev4
dp3000dp3000/rev1
handwired/dactyl_manuform/dmote/62keyhandwired/dmote
keychron/q0/rev_0130keychron/q0/base
keychron/q0/rev_0131keychron/q0/plus
keychron/q1/ansikeychron/q1v1/ansi
keychron/q1/ansi_encoderkeychron/q1v1/ansi_encoder
keychron/q1/isokeychron/q1v1/iso
keychron/q1/iso_encoderkeychron/q1v1/iso_encoder
keychron/q4/ansi_v1keychron/q4/ansi
kprepublic/bm40hsrgbkprepublic/bm40hsrgb/rev1
matchstickworks/southpadmatchstickworks/southpad/rev2
soda/mangomagic_force/mf17
soda/pocketmagic_force/mf34
studiokestra/line_tklstudiokestra/line_friends_tkl
ymdk/melody96ymdk/melody96/soldered

Notable core changes

External Userspace (#22222)

As mentioned above, the new External Userspace feature allows for keymaps to be stored and built externally from the main QMK Firmware repository. This allows for keymaps to be stored separately -- usually in their own repository -- and for users to be able to maintain and build their keymaps without needing to fork the main QMK Firmware repository.

See the External Userspace documentation for more details.

A significant portion of user keymaps have already been removed from qmk/qmk_firmware and more will follow in coming weeks. You can still recover your keymap from the tag user-keymaps-still-present if required -- a perfect time to migrate to the new External Userspace!

WARNING

This feature is still in beta, and we're looking for feedback on it. Please try it out and let us know what you think -- a new #help-userspace channel has been set up on Discord.

Improve and Cleanup Shutdown callbacks (#21060)

Shutdown callbacks at the keyboard level were never present, preventing safe shutdown sequencing for peripherals such as OLEDs, RGB LEDs, and other devices. This PR adds a new shutdown_kb function, as well as amending shutdown_user, allowing for safe shutdown of peripherals at both keyboard and keymap level.

See the Keyboard Shutdown/Reboot Code documentation for more details.

OLED Force Flush (#20953)

Along with the new shutdown_kb function, a new API oled_render_dirty(bool) function has been added. This allows OLED contents to be written deterministically when supplied with true -- that is, the OLED will be updated immediately, rather than waiting for the next OLED update cycle. This allows for OLEDs to show things such as "BOOTLOADER MODE" and the like if resetting to bootloader from QMK.

Switch statement helpers for keycode ranges (#20059)

Predefined ranges usable within switch statements have been added for groups of similar keycodes, where people who wish to handle entire blocks at once can do so. This allows keymaps to be immune to changes in keycode values, and also allows for more efficient code generation.

The ranges are as follows:

NameMapping
INTERNAL_KEYCODE_RANGEKC_NO ... KC_TRANSPARENT
BASIC_KEYCODE_RANGEKC_A ... KC_EXSEL
SYSTEM_KEYCODE_RANGEKC_SYSTEM_POWER ... KC_SYSTEM_WAKE
CONSUMER_KEYCODE_RANGEKC_AUDIO_MUTE ... KC_LAUNCHPAD
MOUSE_KEYCODE_RANGEKC_MS_UP ... KC_MS_ACCEL2
MODIFIER_KEYCODE_RANGEKC_LEFT_CTRL ... KC_RIGHT_GUI
SWAP_HANDS_KEYCODE_RANGEQK_SWAP_HANDS_TOGGLE ... QK_SWAP_HANDS_ONE_SHOT
MAGIC_KEYCODE_RANGEQK_MAGIC_SWAP_CONTROL_CAPS_LOCK ... QK_MAGIC_TOGGLE_ESCAPE_CAPS_LOCK
MIDI_KEYCODE_RANGEQK_MIDI_ON ... QK_MIDI_PITCH_BEND_UP
SEQUENCER_KEYCODE_RANGEQK_SEQUENCER_ON ... QK_SEQUENCER_STEPS_CLEAR
JOYSTICK_KEYCODE_RANGEQK_JOYSTICK_BUTTON_0 ... QK_JOYSTICK_BUTTON_31
PROGRAMMABLE_BUTTON_KEYCODE_RANGEQK_PROGRAMMABLE_BUTTON_1 ... QK_PROGRAMMABLE_BUTTON_32
AUDIO_KEYCODE_RANGEQK_AUDIO_ON ... QK_AUDIO_VOICE_PREVIOUS
STENO_KEYCODE_RANGEQK_STENO_BOLT ... QK_STENO_COMB_MAX
MACRO_KEYCODE_RANGEQK_MACRO_0 ... QK_MACRO_31
BACKLIGHT_KEYCODE_RANGEQK_BACKLIGHT_ON ... QK_BACKLIGHT_TOGGLE_BREATHING
RGB_KEYCODE_RANGERGB_TOG ... RGB_MODE_TWINKLE
QUANTUM_KEYCODE_RANGEQK_BOOTLOADER ... QK_ALT_REPEAT_KEY
KB_KEYCODE_RANGEQK_KB_0 ... QK_KB_31
USER_KEYCODE_RANGEQK_USER_0 ... QK_USER_31

Usage:

c
    switch (keycode) {\n        case KC_A ... KC_EXSEL:\n        case KC_LEFT_CTRL ... KC_RIGHT_GUI:\n        /* do stuff with basic and modifier keycodes */

Becomes:

c
    switch (keycode) {\n        case BASIC_KEYCODE_RANGE:\n        case MODIFIER_KEYCODE_RANGE:\n        /* do stuff with basic and modifier keycodes */

Quantum Painter OLED support (#19997)

Quantum Painter has picked up support for SH1106 displays -- commonly seen as 128x64 OLEDs. Support for both I2C and SPI displays is available.

If you're already using OLED through OLED_DRIVER_ENABLE = yes or equivalent in info.json and wish to use Quantum Painter instead, you'll need to disable the old OLED system, instead enabling Quantum Painter as well as enabling the appropriate SH1106 driver. See the Quantum Painter driver documentation for more details. The old OLED driver is still available, and keymaps do not require migrating to Quantum Painter if you don't want to do so.

RGB/LED lighting driver naming and cleanup (#21890, #21891, #21892, #21903, #21904, #21905, #21918, #21929, #21938, #22004, #22008, #22009, #22071, #22090, #22099, #22126, #22133, #22163, #22200, #22308, #22309, #22311, #22325, #22365, #22379, #22380, #22381, #22383, #22436)

As you can probably tell by the list of PRs just above, there has been a lot of cleanup and consolidation this cycle when it comes to RGB/LED lighting drivers. The number of changes is too large to list here, but the general theme has been focusing on consistency of naming, both of drivers themselves and their respective implementation and configuration. Most changes only affect keyboard designers -- if you find that your in-development keyboard is no longer building due to naming of defines changing, your best bet is to refer to another board already in the repository which has had the changes applied.

Peripheral subsystem enabling (#22253, #22448, #22106)

When enabling peripherals such as I2C, SPI, or Analog/ADC, some required manual inclusion of source files in order to provide driver support, and in some cases, when multiple drivers were using the same underlying peripheral, files were being added to the build multiple times.

Most systems requiring other peripherals now mark their respective dependencies as "required", allowing the build system to check whether peripherals are necessary before including them in the build rather than having each location enable them manually.

For a concrete example, users or keyboard designers who previously added SRC += analog.c in order to allow for analog readings via an ADC now should specify ANALOG_DRIVER_REQUIRED = yes instead. The full list of added options is as follows:

New optionOld Equivalent
ANALOG_DRIVER_REQUIRED = yesSRC += analog.c
APA102_DRIVER_REQUIRED = yesSRC += apa102.c
I2C_DRIVER_REQUIRED = yesSRC += i2c_master.c or QUANTUM_LIB_SRC += i2c_master.c
SPI_DRIVER_REQUIRED = yesSRC += spi_master.c or QUANTUM_LIB_SRC += spi_master.c
UART_DRIVER_REQUIRED = yesSRC += uart.c
WS2812_DRIVER_REQUIRED = yesSRC += ws2812.c

NKRO on V-USB boards (#22398)

NKRO is now available for ATmega32A and 328P-based keyboards (including PS2AVRGB/Bootmapper boards), thanks to some internal refactoring and cleanup. To enable it, the process is the same as always - add NKRO_ENABLE = yes to your rules.mk, then assign and press the NK_TOGG keycode to switch modes.

Full changelist

Core:

CLI:

Keyboards:

Keyboard fixes:

Others:

Bugs:

', 51); const _hoisted_52 = [ _hoisted_1 ]; function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) { return openBlock(), createElementBlock("div", null, _hoisted_52); } const _20231126 = /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render]]); export { __pageData, _20231126 as default };