From d983251c10c4bb152c746dc4e94bc954b1b82c8c Mon Sep 17 00:00:00 2001 From: Ryan Date: Mon, 29 Aug 2022 02:59:40 +1000 Subject: Switch over MANUFACTURER and PRODUCT to string literals (#18183) --- lib/python/qmk/tests/test_cli_commands.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'lib/python') diff --git a/lib/python/qmk/tests/test_cli_commands.py b/lib/python/qmk/tests/test_cli_commands.py index fde8b079a3..185abb5f21 100644 --- a/lib/python/qmk/tests/test_cli_commands.py +++ b/lib/python/qmk/tests/test_cli_commands.py @@ -265,8 +265,8 @@ def test_generate_config_h(): check_returncode(result) assert '# define DEVICE_VER 0x0001' in result.stdout assert '# define DIODE_DIRECTION COL2ROW' in result.stdout - assert '# define MANUFACTURER none' in result.stdout - assert '# define PRODUCT pytest' in result.stdout + assert '# define MANUFACTURER "none"' in result.stdout + assert '# define PRODUCT "pytest"' in result.stdout assert '# define PRODUCT_ID 0x6465' in result.stdout assert '# define VENDOR_ID 0xFEED' in result.stdout assert '# define MATRIX_COLS 1' in result.stdout -- cgit 1.4.1 From 3adaf6a46ae6bac75997e9f2d2e97f550f1c8e87 Mon Sep 17 00:00:00 2001 From: Ryan Date: Mon, 29 Aug 2022 04:35:17 +1000 Subject: Handle escaping of manufacturer/product strings (#18194) --- keyboards/adpenrose/shisaku/info.json | 1 + keyboards/karlb/kbic65/info.json | 1 + keyboards/keebio/bamfk4/info.json | 1 + lib/python/qmk/cli/generate/config_h.py | 3 ++- lib/python/qmk/info.py | 2 +- 5 files changed, 6 insertions(+), 2 deletions(-) (limited to 'lib/python') diff --git a/keyboards/adpenrose/shisaku/info.json b/keyboards/adpenrose/shisaku/info.json index 6f765ba648..a93898c33b 100644 --- a/keyboards/adpenrose/shisaku/info.json +++ b/keyboards/adpenrose/shisaku/info.json @@ -1,5 +1,6 @@ { "keyboard_name": "shisaku", + "manufacturer": "ADPenrose", "url": "https://github.com/ADPenrose/shisaku_keeb", "maintainer": "ADPenrose", "usb": { diff --git a/keyboards/karlb/kbic65/info.json b/keyboards/karlb/kbic65/info.json index d572a92fc2..2d9d7ab037 100644 --- a/keyboards/karlb/kbic65/info.json +++ b/keyboards/karlb/kbic65/info.json @@ -1,5 +1,6 @@ { "keyboard_name": "KBIC65", + "manufacturer": "b-karl", "url": "https://karlb.eu/kbic65/", "maintainer": "b-karl", "diode_direction": "ROW2COL", diff --git a/keyboards/keebio/bamfk4/info.json b/keyboards/keebio/bamfk4/info.json index 1d04f4348b..0704d0e1d2 100644 --- a/keyboards/keebio/bamfk4/info.json +++ b/keyboards/keebio/bamfk4/info.json @@ -1,5 +1,6 @@ { "keyboard_name": "BAMFK-4", + "manufacturer": "Keebio", "url": "https://keeb.io", "maintainer": "nooges", "usb": { diff --git a/lib/python/qmk/cli/generate/config_h.py b/lib/python/qmk/cli/generate/config_h.py index a26dcdf7d7..a2178bf1e9 100755 --- a/lib/python/qmk/cli/generate/config_h.py +++ b/lib/python/qmk/cli/generate/config_h.py @@ -117,9 +117,10 @@ def generate_config_items(kb_info_json, config_h_lines): config_h_lines.append(f'# define {key} {value}') config_h_lines.append(f'#endif // {key}') elif key_type == 'str': + escaped_str = config_value.replace('\\', '\\\\').replace('"', '\\"') config_h_lines.append('') config_h_lines.append(f'#ifndef {config_key}') - config_h_lines.append(f'# define {config_key} "{config_value}"') + config_h_lines.append(f'# define {config_key} "{escaped_str}"') config_h_lines.append(f'#endif // {config_key}') elif key_type == 'bcd_version': (major, minor, revision) = config_value.split('.') diff --git a/lib/python/qmk/info.py b/lib/python/qmk/info.py index c95b55916c..e0a46e7ed1 100644 --- a/lib/python/qmk/info.py +++ b/lib/python/qmk/info.py @@ -479,7 +479,7 @@ def _config_to_json(key_type, config_value): return int(config_value) elif key_type == 'str': - return config_value.strip('"') + return config_value.strip('"').replace('\\"', '"').replace('\\\\', '\\') elif key_type == 'bcd_version': major = int(config_value[2:4]) -- cgit 1.4.1 From bb6f02883363b815de8e2510964787634f86d635 Mon Sep 17 00:00:00 2001 From: Ryan Date: Thu, 1 Sep 2022 00:17:24 +1000 Subject: Move bootloader.mk to platforms (#18228) --- builddefs/bootloader.mk | 223 ---------------------- builddefs/build_keyboard.mk | 2 +- keyboards/handwired/pytest/basic/rules.mk | 1 - keyboards/handwired/pytest/has_community/rules.mk | 2 - keyboards/handwired/pytest/has_template/rules.mk | 1 - keyboards/handwired/pytest/info.json | 4 +- keyboards/handwired/pytest/macro/rules.mk | 1 - lib/python/qmk/info.py | 6 - lib/python/qmk/keymap.py | 2 +- platforms/arm_atsam/bootloader.mk | 46 +++++ platforms/avr/bootloader.mk | 144 ++++++++++++++ platforms/chibios/bootloader.mk | 122 ++++++++++++ 12 files changed, 317 insertions(+), 237 deletions(-) delete mode 100644 builddefs/bootloader.mk create mode 100644 platforms/arm_atsam/bootloader.mk create mode 100644 platforms/avr/bootloader.mk create mode 100644 platforms/chibios/bootloader.mk (limited to 'lib/python') diff --git a/builddefs/bootloader.mk b/builddefs/bootloader.mk deleted file mode 100644 index 31004cab98..0000000000 --- a/builddefs/bootloader.mk +++ /dev/null @@ -1,223 +0,0 @@ -# Copyright 2017 Jack Humbert -# -# 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 . - -# If it's possible that multiple bootloaders can be used for one project, -# you can leave this unset, and the correct size will be selected -# automatically. -# -# Sets the bootloader defined in the keyboard's/keymap's rules.mk -# Current options: -# -# AVR: -# halfkay PJRC Teensy -# caterina Pro Micro (Sparkfun/generic) -# atmel-dfu Atmel factory DFU -# lufa-dfu LUFA DFU -# qmk-dfu QMK DFU (LUFA + blinkenlight) -# qmk-hid QMK HID (LUFA + blinkenlight) -# bootloadhid HIDBootFlash compatible (ATmega32A) -# usbasploader USBaspLoader (ATmega328P) -# ARM: -# halfkay PJRC Teensy -# kiibohd Input:Club Kiibohd bootloader (only used on their boards) -# stm32duino STM32Duino (STM32F103x8) -# stm32-dfu STM32 USB DFU in ROM -# apm32-dfu APM32 USB DFU in ROM -# RISC-V: -# gd32v-dfu GD32V USB DFU in ROM -# -# If you need to provide your own implementation, you can set inside `rules.mk` -# `BOOTLOADER = custom` -- you'll need to provide your own implementations. See -# the respective file under `platforms//bootloaders/custom.c` to see -# which functions may be overridden. -# -# BOOTLOADER_SIZE can still be defined manually, but it's recommended -# you add any possible configuration to this list - -ifeq ($(strip $(BOOTLOADER)), custom) - OPT_DEFS += -DBOOTLOADER_CUSTOM - BOOTLOADER_TYPE = custom -endif -ifeq ($(strip $(BOOTLOADER)), atmel-dfu) - OPT_DEFS += -DBOOTLOADER_ATMEL_DFU - OPT_DEFS += -DBOOTLOADER_DFU - BOOTLOADER_TYPE = dfu - - ifneq (,$(filter $(MCU), at90usb162 atmega16u2 atmega32u2 atmega16u4 atmega32u4 at90usb646 at90usb647)) - BOOTLOADER_SIZE = 4096 - endif - ifneq (,$(filter $(MCU), at90usb1286 at90usb1287)) - BOOTLOADER_SIZE = 8192 - endif -endif -ifeq ($(strip $(BOOTLOADER)), lufa-dfu) - OPT_DEFS += -DBOOTLOADER_LUFA_DFU - OPT_DEFS += -DBOOTLOADER_DFU - BOOTLOADER_TYPE = dfu - - ifneq (,$(filter $(MCU), at90usb162 atmega16u2 atmega32u2 atmega16u4 atmega32u4 at90usb646 at90usb647)) - BOOTLOADER_SIZE ?= 4096 - endif - ifneq (,$(filter $(MCU), at90usb1286 at90usb1287)) - BOOTLOADER_SIZE ?= 8192 - endif -endif -ifeq ($(strip $(BOOTLOADER)), qmk-dfu) - OPT_DEFS += -DBOOTLOADER_QMK_DFU - OPT_DEFS += -DBOOTLOADER_DFU - BOOTLOADER_TYPE = dfu - - ifneq (,$(filter $(MCU), at90usb162 atmega16u2 atmega32u2 atmega16u4 atmega32u4 at90usb646 at90usb647)) - BOOTLOADER_SIZE ?= 4096 - endif - ifneq (,$(filter $(MCU), at90usb1286 at90usb1287)) - BOOTLOADER_SIZE ?= 8192 - endif -endif -ifeq ($(strip $(BOOTLOADER)), qmk-hid) - OPT_DEFS += -DBOOTLOADER_QMK_HID - OPT_DEFS += -DBOOTLOADER_HID - BOOTLOADER_TYPE = dfu - - BOOTLOADER_SIZE ?= 4096 -endif -ifeq ($(strip $(BOOTLOADER)), halfkay) - OPT_DEFS += -DBOOTLOADER_HALFKAY - BOOTLOADER_TYPE = halfkay - - # Teensy 2.0 - ifeq ($(strip $(MCU)), atmega32u4) - BOOTLOADER_SIZE = 512 - endif - # Teensy 2.0++ - ifeq ($(strip $(MCU)), at90usb1286) - BOOTLOADER_SIZE = 1024 - endif - # Teensy LC, 3.0, 3.1/2, 3.5, 3.6 - ifneq (,$(filter $(MCU_ORIG), MKL26Z64 MK20DX128 MK20DX256 MK64FX512 MK66FX1M0)) - FIRMWARE_FORMAT = hex - endif -endif -ifeq ($(strip $(BOOTLOADER)), caterina) - OPT_DEFS += -DBOOTLOADER_CATERINA - BOOTLOADER_TYPE = caterina - - BOOTLOADER_SIZE = 4096 -endif -ifeq ($(strip $(BOOTLOADER)), bootloadhid) - OPT_DEFS += -DBOOTLOADER_BOOTLOADHID - BOOTLOADER_TYPE = bootloadhid - - BOOTLOADER_SIZE = 4096 -endif -ifeq ($(strip $(BOOTLOADER)), usbasploader) - OPT_DEFS += -DBOOTLOADER_USBASP - BOOTLOADER_TYPE = usbasploader - - BOOTLOADER_SIZE = 4096 -endif -ifeq ($(strip $(BOOTLOADER)), lufa-ms) - OPT_DEFS += -DBOOTLOADER_MS - BOOTLOADER_TYPE = dfu - - BOOTLOADER_SIZE ?= 8192 - FIRMWARE_FORMAT = bin -cpfirmware: lufa_warning -.INTERMEDIATE: lufa_warning -lufa_warning: $(FIRMWARE_FORMAT) - $(info @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@) - $(info LUFA MASS STORAGE Bootloader selected) - $(info DO NOT USE THIS BOOTLOADER IN NEW PROJECTS!) - $(info It is extremely prone to bricking, and is only included to support existing boards.) - $(info @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@) -endif -ifdef BOOTLOADER_SIZE - OPT_DEFS += -DBOOTLOADER_SIZE=$(strip $(BOOTLOADER_SIZE)) -endif - -ifeq ($(strip $(BOOTLOADER)), stm32-dfu) - OPT_DEFS += -DBOOTLOADER_STM32_DFU - BOOTLOADER_TYPE = stm32_dfu - - # Options to pass to dfu-util when flashing - DFU_ARGS ?= -d 0483:DF11 -a 0 -s 0x08000000:leave - DFU_SUFFIX_ARGS ?= -v 0483 -p DF11 -endif -ifeq ($(strip $(BOOTLOADER)), apm32-dfu) - OPT_DEFS += -DBOOTLOADER_APM32_DFU - BOOTLOADER_TYPE = stm32_dfu - - # Options to pass to dfu-util when flashing - DFU_ARGS ?= -d 314B:0106 -a 0 -s 0x08000000:leave - DFU_SUFFIX_ARGS ?= -v 314B -p 0106 -endif -ifeq ($(strip $(BOOTLOADER)), gd32v-dfu) - OPT_DEFS += -DBOOTLOADER_GD32V_DFU - BOOTLOADER_TYPE = gd32v_dfu - - # Options to pass to dfu-util when flashing - DFU_ARGS ?= -d 28E9:0189 -a 0 -s 0x08000000:leave - DFU_SUFFIX_ARGS ?= -v 28E9 -p 0189 -endif -ifeq ($(strip $(BOOTLOADER)), kiibohd) - OPT_DEFS += -DBOOTLOADER_KIIBOHD - BOOTLOADER_TYPE = kiibohd - - ifeq ($(strip $(MCU_ORIG)), MK20DX128) - MCU_LDSCRIPT = MK20DX128BLDR4 - endif - ifeq ($(strip $(MCU_ORIG)), MK20DX256) - MCU_LDSCRIPT = MK20DX256BLDR8 - endif - - # Options to pass to dfu-util when flashing - DFU_ARGS = -d 1C11:B007 - DFU_SUFFIX_ARGS = -v 1C11 -p B007 -endif -ifeq ($(strip $(BOOTLOADER)), stm32duino) - OPT_DEFS += -DBOOTLOADER_STM32DUINO - MCU_LDSCRIPT = STM32F103x8_stm32duino_bootloader - BOARD = STM32_F103_STM32DUINO - BOOTLOADER_TYPE = stm32duino - - # Options to pass to dfu-util when flashing - DFU_ARGS = -d 1EAF:0003 -a 2 -R - DFU_SUFFIX_ARGS = -v 1EAF -p 0003 -endif -ifeq ($(strip $(BOOTLOADER)), tinyuf2) - OPT_DEFS += -DBOOTLOADER_TINYUF2 - BOOTLOADER_TYPE = tinyuf2 - FIRMWARE_FORMAT = uf2 -endif -ifeq ($(strip $(BOOTLOADER)), rp2040) - OPT_DEFS += -DBOOTLOADER_RP2040 - BOOTLOADER_TYPE = rp2040 -endif -ifeq ($(strip $(BOOTLOADER)), halfkay) - OPT_DEFS += -DBOOTLOADER_HALFKAY - BOOTLOADER_TYPE = halfkay -endif -ifeq ($(strip $(BOOTLOADER)), md-boot) - OPT_DEFS += -DBOOTLOADER_MD_BOOT - BOOTLOADER_TYPE = md_boot -endif -ifeq ($(strip $(BOOTLOADER)), wb32-dfu) - OPT_DEFS += -DBOOTLOADER_WB32_DFU - BOOTLOADER_TYPE = wb32_dfu -endif - -ifeq ($(strip $(BOOTLOADER_TYPE)),) - $(call CATASTROPHIC_ERROR,Invalid BOOTLOADER,No bootloader specified. Please set an appropriate 'BOOTLOADER' in your keyboard's 'rules.mk' file.) -endif diff --git a/builddefs/build_keyboard.mk b/builddefs/build_keyboard.mk index fe95dcaf15..65bc0451f7 100644 --- a/builddefs/build_keyboard.mk +++ b/builddefs/build_keyboard.mk @@ -428,7 +428,6 @@ include $(BUILDDEFS_PATH)/common_features.mk include $(BUILDDEFS_PATH)/generic_features.mk include $(TMK_PATH)/protocol.mk include $(PLATFORM_PATH)/common.mk -include $(BUILDDEFS_PATH)/bootloader.mk SRC += $(patsubst %.c,%.clib,$(LIB_SRC)) SRC += $(patsubst %.c,%.clib,$(QUANTUM_LIB_SRC)) @@ -443,6 +442,7 @@ ifneq ($(REQUIRE_PLATFORM_KEY),) endif endif +-include $(PLATFORM_PATH)/$(PLATFORM_KEY)/bootloader.mk include $(PLATFORM_PATH)/$(PLATFORM_KEY)/platform.mk -include $(PLATFORM_PATH)/$(PLATFORM_KEY)/flash.mk diff --git a/keyboards/handwired/pytest/basic/rules.mk b/keyboards/handwired/pytest/basic/rules.mk index 6b42774dbf..e69de29bb2 100644 --- a/keyboards/handwired/pytest/basic/rules.mk +++ b/keyboards/handwired/pytest/basic/rules.mk @@ -1 +0,0 @@ -MCU = atmega32u4 diff --git a/keyboards/handwired/pytest/has_community/rules.mk b/keyboards/handwired/pytest/has_community/rules.mk index 4161649cbc..051634b3a4 100644 --- a/keyboards/handwired/pytest/has_community/rules.mk +++ b/keyboards/handwired/pytest/has_community/rules.mk @@ -1,3 +1 @@ -MCU = atmega32u4 - LAYOUTS = ortho_1x1 diff --git a/keyboards/handwired/pytest/has_template/rules.mk b/keyboards/handwired/pytest/has_template/rules.mk index 6b42774dbf..e69de29bb2 100644 --- a/keyboards/handwired/pytest/has_template/rules.mk +++ b/keyboards/handwired/pytest/has_template/rules.mk @@ -1 +0,0 @@ -MCU = atmega32u4 diff --git a/keyboards/handwired/pytest/info.json b/keyboards/handwired/pytest/info.json index 331472762c..2ba7d34d52 100644 --- a/keyboards/handwired/pytest/info.json +++ b/keyboards/handwired/pytest/info.json @@ -6,5 +6,7 @@ "vid": "0xFEED", "pid": "0x6465", "device_version": "0.0.1" - } + }, + "processor": "atmega32u4", + "bootloader": "atmel-dfu" } diff --git a/keyboards/handwired/pytest/macro/rules.mk b/keyboards/handwired/pytest/macro/rules.mk index 6b42774dbf..e69de29bb2 100644 --- a/keyboards/handwired/pytest/macro/rules.mk +++ b/keyboards/handwired/pytest/macro/rules.mk @@ -1 +0,0 @@ -MCU = atmega32u4 diff --git a/lib/python/qmk/info.py b/lib/python/qmk/info.py index e0a46e7ed1..637a27b764 100644 --- a/lib/python/qmk/info.py +++ b/lib/python/qmk/info.py @@ -755,9 +755,6 @@ def arm_processor_rules(info_data, rules): info_data['processor_type'] = 'arm' info_data['protocol'] = 'ChibiOS' - if 'bootloader' not in info_data: - info_data['bootloader'] = 'unknown' - if 'STM32' in info_data['processor']: info_data['platform'] = 'STM32' elif 'MCU_SERIES' in rules: @@ -775,9 +772,6 @@ def avr_processor_rules(info_data, rules): info_data['platform'] = rules['ARCH'] if 'ARCH' in rules else 'unknown' info_data['protocol'] = 'V-USB' if rules.get('MCU') in VUSB_PROCESSORS else 'LUFA' - if 'bootloader' not in info_data: - info_data['bootloader'] = 'atmel-dfu' - # FIXME(fauxpark/anyone): Eventually we should detect the protocol by looking at PROTOCOL inherited from mcu_selection.mk: # info_data['protocol'] = 'V-USB' if rules.get('PROTOCOL') == 'VUSB' else 'LUFA' diff --git a/lib/python/qmk/keymap.py b/lib/python/qmk/keymap.py index f317f4d11e..fc1421962f 100644 --- a/lib/python/qmk/keymap.py +++ b/lib/python/qmk/keymap.py @@ -412,7 +412,7 @@ def list_keymaps(keyboard, c=True, json=True, additional_files=None, fullpath=Fa rules = rules_mk(keyboard) names = set() - if rules: + if rules is not None: keyboards_dir = Path('keyboards') kb_path = keyboards_dir / keyboard diff --git a/platforms/arm_atsam/bootloader.mk b/platforms/arm_atsam/bootloader.mk new file mode 100644 index 0000000000..1ec42edeb6 --- /dev/null +++ b/platforms/arm_atsam/bootloader.mk @@ -0,0 +1,46 @@ +# Copyright 2017 Jack Humbert +# +# 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 . + +# If it's possible that multiple bootloaders can be used for one project, +# you can leave this unset, and the correct size will be selected +# automatically. +# +# Sets the bootloader defined in the keyboard's/keymap's rules.mk +# +# Current options for ARM (ATSAM): +# md-boot Atmel SAM-BA (only used by Drop boards) +# +# If you need to provide your own implementation, you can set inside `rules.mk` +# `BOOTLOADER = custom` -- you'll need to provide your own implementations. See +# the respective file under `platforms//bootloaders/custom.c` to see +# which functions may be overridden. + +ifeq ($(strip $(BOOTLOADER)), custom) + OPT_DEFS += -DBOOTLOADER_CUSTOM + BOOTLOADER_TYPE = custom +endif + +ifeq ($(strip $(BOOTLOADER)), md-boot) + OPT_DEFS += -DBOOTLOADER_MD_BOOT + BOOTLOADER_TYPE = md_boot +endif + +ifeq ($(strip $(BOOTLOADER_TYPE)),) + ifneq ($(strip $(BOOTLOADER)),) + $(call CATASTROPHIC_ERROR,Invalid BOOTLOADER,Invalid bootloader specified. Please set an appropriate bootloader in your rules.mk or info.json.) + else + $(call CATASTROPHIC_ERROR,Invalid BOOTLOADER,No bootloader specified. Please set an appropriate bootloader in your rules.mk or info.json.) + endif +endif diff --git a/platforms/avr/bootloader.mk b/platforms/avr/bootloader.mk new file mode 100644 index 0000000000..63fe635d96 --- /dev/null +++ b/platforms/avr/bootloader.mk @@ -0,0 +1,144 @@ +# Copyright 2017 Jack Humbert +# +# 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 . + +# If it's possible that multiple bootloaders can be used for one project, +# you can leave this unset, and the correct size will be selected +# automatically. +# +# Sets the bootloader defined in the keyboard's/keymap's rules.mk +# +# Current options for AVR: +# halfkay PJRC Teensy +# caterina Pro Micro (Sparkfun/generic) +# atmel-dfu Atmel factory DFU +# lufa-dfu LUFA DFU +# qmk-dfu QMK DFU (LUFA + blinkenlight) +# qmk-hid QMK HID (LUFA + blinkenlight) +# bootloadhid HIDBootFlash compatible (ATmega32A) +# usbasploader USBaspLoader (ATmega328P) +# +# If you need to provide your own implementation, you can set inside `rules.mk` +# `BOOTLOADER = custom` -- you'll need to provide your own implementations. See +# the respective file under `platforms//bootloaders/custom.c` to see +# which functions may be overridden. +# +# BOOTLOADER_SIZE can still be defined manually, but it's recommended +# you add any possible configuration to this list + +ifeq ($(strip $(BOOTLOADER)), custom) + OPT_DEFS += -DBOOTLOADER_CUSTOM + BOOTLOADER_TYPE = custom +endif + +ifeq ($(strip $(BOOTLOADER)), atmel-dfu) + OPT_DEFS += -DBOOTLOADER_ATMEL_DFU + OPT_DEFS += -DBOOTLOADER_DFU + BOOTLOADER_TYPE = dfu + + ifneq (,$(filter $(MCU), at90usb162 atmega16u2 atmega32u2 atmega16u4 atmega32u4 at90usb646 at90usb647)) + BOOTLOADER_SIZE = 4096 + endif + ifneq (,$(filter $(MCU), at90usb1286 at90usb1287)) + BOOTLOADER_SIZE = 8192 + endif +endif +ifeq ($(strip $(BOOTLOADER)), lufa-dfu) + OPT_DEFS += -DBOOTLOADER_LUFA_DFU + OPT_DEFS += -DBOOTLOADER_DFU + BOOTLOADER_TYPE = dfu + + ifneq (,$(filter $(MCU), at90usb162 atmega16u2 atmega32u2 atmega16u4 atmega32u4 at90usb646 at90usb647)) + BOOTLOADER_SIZE ?= 4096 + endif + ifneq (,$(filter $(MCU), at90usb1286 at90usb1287)) + BOOTLOADER_SIZE ?= 8192 + endif +endif +ifeq ($(strip $(BOOTLOADER)), qmk-dfu) + OPT_DEFS += -DBOOTLOADER_QMK_DFU + OPT_DEFS += -DBOOTLOADER_DFU + BOOTLOADER_TYPE = dfu + + ifneq (,$(filter $(MCU), at90usb162 atmega16u2 atmega32u2 atmega16u4 atmega32u4 at90usb646 at90usb647)) + BOOTLOADER_SIZE ?= 4096 + endif + ifneq (,$(filter $(MCU), at90usb1286 at90usb1287)) + BOOTLOADER_SIZE ?= 8192 + endif +endif +ifeq ($(strip $(BOOTLOADER)), qmk-hid) + OPT_DEFS += -DBOOTLOADER_QMK_HID + OPT_DEFS += -DBOOTLOADER_HID + BOOTLOADER_TYPE = dfu + + BOOTLOADER_SIZE ?= 4096 +endif +ifeq ($(strip $(BOOTLOADER)), halfkay) + OPT_DEFS += -DBOOTLOADER_HALFKAY + BOOTLOADER_TYPE = halfkay + + # Teensy 2.0 + ifeq ($(strip $(MCU)), atmega32u4) + BOOTLOADER_SIZE = 512 + endif + # Teensy 2.0++ + ifeq ($(strip $(MCU)), at90usb1286) + BOOTLOADER_SIZE = 1024 + endif +endif +ifeq ($(strip $(BOOTLOADER)), caterina) + OPT_DEFS += -DBOOTLOADER_CATERINA + BOOTLOADER_TYPE = caterina + + BOOTLOADER_SIZE = 4096 +endif +ifeq ($(strip $(BOOTLOADER)), bootloadhid) + OPT_DEFS += -DBOOTLOADER_BOOTLOADHID + BOOTLOADER_TYPE = bootloadhid + + BOOTLOADER_SIZE = 4096 +endif +ifeq ($(strip $(BOOTLOADER)), usbasploader) + OPT_DEFS += -DBOOTLOADER_USBASP + BOOTLOADER_TYPE = usbasploader + + BOOTLOADER_SIZE = 4096 +endif +ifeq ($(strip $(BOOTLOADER)), lufa-ms) + OPT_DEFS += -DBOOTLOADER_MS + BOOTLOADER_TYPE = dfu + + BOOTLOADER_SIZE ?= 8192 + FIRMWARE_FORMAT = bin +cpfirmware: lufa_warning +.INTERMEDIATE: lufa_warning +lufa_warning: $(FIRMWARE_FORMAT) + $(info @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@) + $(info LUFA MASS STORAGE Bootloader selected) + $(info DO NOT USE THIS BOOTLOADER IN NEW PROJECTS!) + $(info It is extremely prone to bricking, and is only included to support existing boards.) + $(info @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@) +endif +ifdef BOOTLOADER_SIZE + OPT_DEFS += -DBOOTLOADER_SIZE=$(strip $(BOOTLOADER_SIZE)) +endif + +ifeq ($(strip $(BOOTLOADER_TYPE)),) + ifneq ($(strip $(BOOTLOADER)),) + $(call CATASTROPHIC_ERROR,Invalid BOOTLOADER,Invalid bootloader specified. Please set an appropriate bootloader in your rules.mk or info.json.) + else + $(call CATASTROPHIC_ERROR,Invalid BOOTLOADER,No bootloader specified. Please set an appropriate bootloader in your rules.mk or info.json.) + endif +endif diff --git a/platforms/chibios/bootloader.mk b/platforms/chibios/bootloader.mk new file mode 100644 index 0000000000..0568d35321 --- /dev/null +++ b/platforms/chibios/bootloader.mk @@ -0,0 +1,122 @@ +# Copyright 2017 Jack Humbert +# +# 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 . + +# If it's possible that multiple bootloaders can be used for one project, +# you can leave this unset, and the correct size will be selected +# automatically. +# +# Sets the bootloader defined in the keyboard's/keymap's rules.mk +# +# Current options for ARM: +# halfkay PJRC Teensy +# kiibohd Input:Club Kiibohd bootloader (only used on their boards) +# stm32duino STM32Duino (STM32F103x8) +# stm32-dfu STM32 USB DFU in ROM +# apm32-dfu APM32 USB DFU in ROM +# wb32-dfu WB32 USB DFU in ROM +# tinyuf2 TinyUF2 +# rp2040 Raspberry Pi RP2040 +# Current options for RISC-V: +# gd32v-dfu GD32V USB DFU in ROM +# +# If you need to provide your own implementation, you can set inside `rules.mk` +# `BOOTLOADER = custom` -- you'll need to provide your own implementations. See +# the respective file under `platforms//bootloaders/custom.c` to see +# which functions may be overridden. + +ifeq ($(strip $(BOOTLOADER)), custom) + OPT_DEFS += -DBOOTLOADER_CUSTOM + BOOTLOADER_TYPE = custom +endif + +ifeq ($(strip $(BOOTLOADER)), halfkay) + OPT_DEFS += -DBOOTLOADER_HALFKAY + BOOTLOADER_TYPE = halfkay + + # Teensy LC, 3.0, 3.1/2, 3.5, 3.6 + ifneq (,$(filter $(MCU_ORIG), MKL26Z64 MK20DX128 MK20DX256 MK64FX512 MK66FX1M0)) + FIRMWARE_FORMAT = hex + endif +endif +ifeq ($(strip $(BOOTLOADER)), stm32-dfu) + OPT_DEFS += -DBOOTLOADER_STM32_DFU + BOOTLOADER_TYPE = stm32_dfu + + # Options to pass to dfu-util when flashing + DFU_ARGS ?= -d 0483:DF11 -a 0 -s 0x08000000:leave + DFU_SUFFIX_ARGS ?= -v 0483 -p DF11 +endif +ifeq ($(strip $(BOOTLOADER)), apm32-dfu) + OPT_DEFS += -DBOOTLOADER_APM32_DFU + BOOTLOADER_TYPE = stm32_dfu + + # Options to pass to dfu-util when flashing + DFU_ARGS ?= -d 314B:0106 -a 0 -s 0x08000000:leave + DFU_SUFFIX_ARGS ?= -v 314B -p 0106 +endif +ifeq ($(strip $(BOOTLOADER)), gd32v-dfu) + OPT_DEFS += -DBOOTLOADER_GD32V_DFU + BOOTLOADER_TYPE = gd32v_dfu + + # Options to pass to dfu-util when flashing + DFU_ARGS ?= -d 28E9:0189 -a 0 -s 0x08000000:leave + DFU_SUFFIX_ARGS ?= -v 28E9 -p 0189 +endif +ifeq ($(strip $(BOOTLOADER)), kiibohd) + OPT_DEFS += -DBOOTLOADER_KIIBOHD + BOOTLOADER_TYPE = kiibohd + + ifeq ($(strip $(MCU_ORIG)), MK20DX128) + MCU_LDSCRIPT = MK20DX128BLDR4 + endif + ifeq ($(strip $(MCU_ORIG)), MK20DX256) + MCU_LDSCRIPT = MK20DX256BLDR8 + endif + + # Options to pass to dfu-util when flashing + DFU_ARGS = -d 1C11:B007 + DFU_SUFFIX_ARGS = -v 1C11 -p B007 +endif +ifeq ($(strip $(BOOTLOADER)), stm32duino) + OPT_DEFS += -DBOOTLOADER_STM32DUINO + MCU_LDSCRIPT = STM32F103x8_stm32duino_bootloader + BOARD = STM32_F103_STM32DUINO + BOOTLOADER_TYPE = stm32duino + + # Options to pass to dfu-util when flashing + DFU_ARGS = -d 1EAF:0003 -a 2 -R + DFU_SUFFIX_ARGS = -v 1EAF -p 0003 +endif +ifeq ($(strip $(BOOTLOADER)), tinyuf2) + OPT_DEFS += -DBOOTLOADER_TINYUF2 + BOOTLOADER_TYPE = tinyuf2 + FIRMWARE_FORMAT = uf2 +endif +ifeq ($(strip $(BOOTLOADER)), rp2040) + OPT_DEFS += -DBOOTLOADER_RP2040 + BOOTLOADER_TYPE = rp2040 +endif +ifeq ($(strip $(BOOTLOADER)), wb32-dfu) + OPT_DEFS += -DBOOTLOADER_WB32_DFU + BOOTLOADER_TYPE = wb32_dfu +endif + +ifeq ($(strip $(BOOTLOADER_TYPE)),) + ifneq ($(strip $(BOOTLOADER)),) + $(call CATASTROPHIC_ERROR,Invalid BOOTLOADER,Invalid bootloader specified. Please set an appropriate bootloader in your rules.mk or info.json.) + else + $(call CATASTROPHIC_ERROR,Invalid BOOTLOADER,No bootloader specified. Please set an appropriate bootloader in your rules.mk or info.json.) + endif +endif -- cgit 1.4.1 From bc0756f294f9555267dbd7007478804f537614c1 Mon Sep 17 00:00:00 2001 From: Ryan Date: Fri, 16 Sep 2022 12:05:25 +1000 Subject: Disconnect `usb.device_ver` (#18259) --- data/mappings/info_config.json | 4 +--- lib/python/qmk/cli/generate/layouts.py | 6 ------ lib/python/qmk/info.py | 14 -------------- 3 files changed, 1 insertion(+), 23 deletions(-) (limited to 'lib/python') diff --git a/data/mappings/info_config.json b/data/mappings/info_config.json index af7ae0749c..eb11f87e7d 100644 --- a/data/mappings/info_config.json +++ b/data/mappings/info_config.json @@ -20,9 +20,7 @@ "COMBO_COUNT": {"info_key": "combo.count", "value_type": "int"}, "COMBO_TERM": {"info_key": "combo.term", "value_type": "int"}, "DEBOUNCE": {"info_key": "debounce", "value_type": "int"}, - "DEVICE_VER": {"info_key": "usb.device_ver", "value_type": "hex"}, - # TODO: Replace ^^^ with vvv - #"DEVICE_VER": {"info_key": "usb.device_version", "value_type": "bcd_version"}, + "DEVICE_VER": {"info_key": "usb.device_version", "value_type": "bcd_version"}, "DIODE_DIRECTION": {"info_key": "diode_direction"}, "DOUBLE_TAP_SHIFT_TURNS_ON_CAPS_WORD": {"info_key": "caps_word.double_tap_shift_turns_on", "value_type": "bool"}, "FORCE_NKRO": {"info_key": "usb.force_nkro", "value_type": "bool"}, diff --git a/lib/python/qmk/cli/generate/layouts.py b/lib/python/qmk/cli/generate/layouts.py index 193633baf6..8336f36b50 100755 --- a/lib/python/qmk/cli/generate/layouts.py +++ b/lib/python/qmk/cli/generate/layouts.py @@ -9,12 +9,6 @@ from qmk.keyboard import keyboard_completer, keyboard_folder from qmk.path import is_keyboard, normpath from qmk.commands import dump_lines -usb_properties = { - 'vid': 'VENDOR_ID', - 'pid': 'PRODUCT_ID', - 'device_ver': 'DEVICE_VER', -} - @cli.argument('-o', '--output', arg_only=True, type=normpath, help='File to write to') @cli.argument('-q', '--quiet', arg_only=True, action='store_true', help="Quiet mode, only output error messages") diff --git a/lib/python/qmk/info.py b/lib/python/qmk/info.py index b039c2c424..834f7d9170 100644 --- a/lib/python/qmk/info.py +++ b/lib/python/qmk/info.py @@ -437,19 +437,6 @@ def _extract_matrix_info(info_data, config_c): return info_data -# TODO: kill off usb.device_ver in favor of usb.device_version -def _extract_device_version(info_data): - if info_data.get('usb'): - if info_data['usb'].get('device_version') and not info_data['usb'].get('device_ver'): - (major, minor, revision) = info_data['usb']['device_version'].split('.', 3) - info_data['usb']['device_ver'] = f'0x{major.zfill(2)}{minor}{revision}' - if not info_data['usb'].get('device_version') and info_data['usb'].get('device_ver'): - major = int(info_data['usb']['device_ver'][2:4]) - minor = int(info_data['usb']['device_ver'][4]) - revision = int(info_data['usb']['device_ver'][5]) - info_data['usb']['device_version'] = f'{major}.{minor}.{revision}' - - def _config_to_json(key_type, config_value): """Convert config value using spec """ @@ -535,7 +522,6 @@ def _extract_config_h(info_data, config_c): _extract_split_right_pins(info_data, config_c) _extract_encoders(info_data, config_c) _extract_split_encoders(info_data, config_c) - _extract_device_version(info_data) return info_data -- cgit 1.4.1 From fb29c0ae53e32fb049516fcbe0f7863882ca9173 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Sat, 17 Sep 2022 00:50:54 -0700 Subject: [Core] Add getreuer's Autocorrect feature to core (#15699) Co-authored-by: Albert Y <76888457+filterpaper@users.noreply.github.com> --- builddefs/generic_features.mk | 1 + builddefs/show_options.mk | 3 +- docs/_summary.md | 1 + docs/feature_autocorrect.md | 295 +++++++++++++++++++++ lib/python/qmk/cli/__init__.py | 1 + lib/python/qmk/cli/generate/autocorrect_data.py | 289 ++++++++++++++++++++ quantum/eeconfig.c | 2 +- quantum/keycode_config.h | 1 + quantum/process_keycode/autocorrect_data_default.h | 85 ++++++ quantum/process_keycode/process_autocorrect.c | 287 ++++++++++++++++++++ quantum/process_keycode/process_autocorrect.h | 17 ++ quantum/quantum.c | 3 + quantum/quantum.h | 4 + quantum/quantum_keycodes.h | 8 + tests/autocorrect/config.h | 6 + tests/autocorrect/test.mk | 8 + tests/autocorrect/test_autocorrect.cpp | 204 ++++++++++++++ 17 files changed, 1213 insertions(+), 2 deletions(-) create mode 100644 docs/feature_autocorrect.md create mode 100644 lib/python/qmk/cli/generate/autocorrect_data.py create mode 100644 quantum/process_keycode/autocorrect_data_default.h create mode 100644 quantum/process_keycode/process_autocorrect.c create mode 100644 quantum/process_keycode/process_autocorrect.h create mode 100644 tests/autocorrect/config.h create mode 100644 tests/autocorrect/test.mk create mode 100644 tests/autocorrect/test_autocorrect.cpp (limited to 'lib/python') diff --git a/builddefs/generic_features.mk b/builddefs/generic_features.mk index f195e9fd75..0d897bc1c8 100644 --- a/builddefs/generic_features.mk +++ b/builddefs/generic_features.mk @@ -17,6 +17,7 @@ SPACE_CADET_ENABLE ?= yes GRAVE_ESC_ENABLE ?= yes GENERIC_FEATURES = \ + AUTOCORRECT \ CAPS_WORD \ COMBO \ COMMAND \ diff --git a/builddefs/show_options.mk b/builddefs/show_options.mk index 8d992c080c..fac6576ba1 100644 --- a/builddefs/show_options.mk +++ b/builddefs/show_options.mk @@ -84,7 +84,8 @@ OTHER_OPTION_NAMES = \ LTO_ENABLE \ PROGRAMMABLE_BUTTON_ENABLE \ SECURE_ENABLE \ - CAPS_WORD_ENABLE + CAPS_WORD_ENABLE \ + AUTOCORRECT_ENABLE define NAME_ECHO @printf " %-30s = %-16s # %s\\n" "$1" "$($1)" "$(origin $1)" diff --git a/docs/_summary.md b/docs/_summary.md index f2bdcd5ccd..bf49bbb140 100644 --- a/docs/_summary.md +++ b/docs/_summary.md @@ -76,6 +76,7 @@ * Software Features * [Auto Shift](feature_auto_shift.md) + * [Autocorrect](feature_autocorrect.md) * [Caps Word](feature_caps_word.md) * [Combos](feature_combo.md) * [Debounce API](feature_debounce_type.md) diff --git a/docs/feature_autocorrect.md b/docs/feature_autocorrect.md new file mode 100644 index 0000000000..480131e5fc --- /dev/null +++ b/docs/feature_autocorrect.md @@ -0,0 +1,295 @@ +# Autocorrect + +There are a lot of words that are prone to being typed incorrectly, due to habit, sequence or just user error. This feature leverages your firmware to automatically correct these errors, to help reduce typos. + +## How does it work? :id=how-does-it-work + +The feature maintains a small buffer of recent key presses. On each key press, it checks whether the buffer ends in a recognized typo, and if so, automatically sends keystrokes to correct it. + +The tricky part is how to efficiently check the buffer for typos. We don’t want to spend too much memory or time on storing or searching the typos. A good solution is to represent the typos with a trie data structure. A trie is a tree data structure where each node is a letter, and words are formed by following a path to one of the leaves. + +![An example trie](https://i.imgur.com/HL5DP8H.png) + +Since we search whether the buffer ends in a typo, we store the trie writing in reverse. The trie is queried starting from the last letter, then second to last letter, and so on, until either a letter doesn’t match or we reach a leaf, meaning a typo was found. + +## How do I enable Autocorrection :id=how-do-i-enable-autocorrection + +In your `rules.mk`, add this: + +```make +AUTOCORRECT_ENABLE = yes +``` + +Additionally, you will need a library for autocorrection. A small sample library is included by default, so that you can get up and running right away, but you can provide a customized library. + +By default, autocorrect is disabled. To enable it, you need to use the `AUTOCORRECT_TOGGLE` keycode to enable it. The status is stored in persistent memory, so you shouldn't need to enabled it again. + +## Customizing autocorrect library :id=customizing-autocorrect-library + +To provide a custom library, you need to create a text file with the corrections. For instance: + +```text +:thier -> their +fitler -> filter +lenght -> length +ouput -> output +widht -> width +``` + +The syntax is `typo -> correction`. Typos and corrections are case insensitive, and any whitespace before or after the typo and correction is ignored. The typo must be only the letters a–z, or the special character : representing a word break. The correction may have any non-unicode characters. + +Then, run: + +```sh +qmk generate-autocorrect-data autocorrect_dictionary.txt +``` + +This will process the file and produce an `autocorrect_data.h` file with the trie library, in the folder that you are at. You can specify the keyboard and keymap (eg `-kb planck/rev6 -km jackhumbert`), and it will place the file in that folder instead. But as long as the file is located in your keymap folder, or user folder, it should be picked up automatically. + +This file will look like this: + +```c +// :thier -> their +// fitler -> filter +// lenght -> length +// ouput -> output +// widht -> width + +#define AUTOCORRECT_MIN_LENGTH 5 // "ouput" +#define AUTOCORRECT_MAX_LENGTH 6 // ":thier" + +#define DICTIONARY_SIZE 74 + +static const uint8_t autocorrect_data[DICTIONARY_SIZE] PROGMEM = {85, 7, 0, 23, 35, 0, 0, 8, 0, 76, 16, 0, 15, 25, 0, 0, + 11, 23, 44, 0, 130, 101, 105, 114, 0, 23, 12, 9, 0, 131, 108, 116, 101, 114, 0, 75, 42, 0, 24, 64, 0, 0, 71, 49, 0, + 10, 56, 0, 0, 12, 26, 0, 129, 116, 104, 0, 17, 8, 15, 0, 129, 116, 104, 0, 19, 24, 18, 0, 130, 116, 112, 117, 116, + 0}; +``` + +### Avoiding false triggers :id=avoiding-false-triggers + +By default, typos are searched within words, to find typos within longer identifiers like maxFitlerOuput. While this is useful, a consequence is that autocorrection will falsely trigger when a typo happens to be a substring of a correctly-spelled word. For instance, if we had thier -> their as an entry, it would falsely trigger on (correct, though relatively uncommon) words like “wealthier” and “filthier.” + +The solution is to set a word break : before and/or after the typo to constrain matching. : matches space, period, comma, underscore, digits, and most other non-alpha characters. + +|Text |thier |:thier |thier: |:thier: | +|-----------------|:------:|:------:|:------:|:------:| +|see `thier` typo |matches |matches |matches |matches | +|it’s `thiers` |matches |matches |no |no | +|wealthier words |matches |no |matches |no | + +:thier: is most restrictive, matching only when thier is a whole word. + +The `qmk generate-autocorrect-data` commands can make an effort to check for entries that would false trigger as substrings of correct words. It searches each typo against a dictionary of 25K English words from the english_words Python package, provided it’s installed. (run `python3 -m pip install english_words` to install it.) + +?> Unfortunately, this is limited to just english words, at this point. + +## Overriding Autocorrect + +Occasionally you might actually want to type a typo (for instance, while editing autocorrection_dict.txt) without being autocorrected. There are a couple of ways to do this: + +1. Begin typing the typo. +2. Before typing the last letter, press and release the Ctrl or Alt key. +3. Type the remaining letters. + +This works because the autocorrection implementation doesn’t understand hotkeys, so it resets itself whenever a modifier other than shift is held. + +Additionally, you can use the `AUTOCORRECT_TOGGLE` keycode to toggle the on/off status for Autocorrect. + +### Keycodes :id=keycodes + +|Keycode | Short keycode | Description | +|---------------------|---------------|------------------------------------------------| +|`AUTOCORRECT_ON` | `CRT_ON` | Turns on the Autocorrect feature. | +|`AUTOCORRECT_OFF` | `CRT_OFF` | Turns off the Autocorrect feature. | +|`AUTOCORRECT_TOGGLE` | `CRT_TOG` | Toggles the status of the Autocorrect feature. | + +## User Callback Functions + +### Process Autocorrect + +Callback function `bool process_autocorrect_user(uint16_t *keycode, keyrecord_t *record, uint8_t *typo_buffer_size, uint8_t *mods)` is available to customise incoming keycodes and handle exceptions. You can use this function to sanitise input before they are passed onto the autocorrect engine + +?> Sanitisation of input is required because autocorrect will only match 8-bit [basic keycodes](keycodes_basic.md) for typos. If valid modifier keys or 16-bit keycodes that are part of a user's word input (such as Shift + A) is passed through, they will fail typo letter detection. For example a [Mod-Tap](mod_tap.md) key such as `LCTL_T(KC_A)` is 16-bit and should be masked for the 8-bit `KC_A`. + +The default user callback function is found inside `quantum/process_keycode/process_autocorrect.c`. It covers most use-cases for QMK special functions and quantum keycodes, including [overriding autocorrect](#overriding-autocorrect) with a modifier other than shift. The `process_autocorrect_user` function is `weak` defined to allow user's copy inside `keymap.c` (or code files) to overwrite it. + +#### Process Autocorrect Example + +If you have a custom keycode `QMKBEST` that should be ignored as part of a word, and another custom keycode `QMKLAYER` that should override autocorrect, both can be added to the bottom of the `process_autocorrect_user` `switch` statement in your source code: + +```c +bool process_autocorrect_user(uint16_t *keycode, keyrecord_t *record, uint8_t *typo_buffer_size, uint8_t *mods) { + // See quantum_keycodes.h for reference on these matched ranges. + switch (*keycode) { + // Exclude these keycodes from processing. + case KC_LSFT: + case KC_RSFT: + case KC_CAPS: + case QK_TO ... QK_ONE_SHOT_LAYER_MAX: + case QK_LAYER_TAP_TOGGLE ... QK_LAYER_MOD_MAX: + case QK_ONE_SHOT_MOD ... QK_ONE_SHOT_MOD_MAX: + return false; + + // Mask for base keycode from shifted keys. + case QK_LSFT ... QK_LSFT + 255: + case QK_RSFT ... QK_RSFT + 255: + if (*keycode >= QK_LSFT && *keycode <= (QK_LSFT + 255)) { + *mods |= MOD_LSFT; + } else { + *mods |= MOD_RSFT; + } + *keycode &= 0xFF; // Get the basic keycode. + return true; +#ifndef NO_ACTION_TAPPING + // Exclude tap-hold keys when they are held down + // and mask for base keycode when they are tapped. + case QK_LAYER_TAP ... QK_LAYER_TAP_MAX: +# ifdef NO_ACTION_LAYER + // Exclude Layer Tap, if layers are disabled + // but action tapping is still enabled. + return false; +# endif + case QK_MOD_TAP ... QK_MOD_TAP_MAX: + // Exclude hold if mods other than Shift is not active + if (!record->tap.count) { + return false; + } + *keycode &= 0xFF; + break; +#else + case QK_MOD_TAP ... QK_MOD_TAP_MAX: + case QK_LAYER_TAP ... QK_LAYER_TAP_MAX: + // Exclude if disabled + return false; +#endif + // Exclude swap hands keys when they are held down + // and mask for base keycode when they are tapped. + case QK_SWAP_HANDS ... QK_SWAP_HANDS_MAX: +#ifdef SWAP_HANDS_ENABLE + if (*keycode >= 0x56F0 || !record->tap.count) { + return false; + } + *keycode &= 0xFF; + break; +#else + // Exclude if disabled + return false; +#endif + // Handle custom keycodes + case QMKBEST: + return false; + case QMKLAYER: + *typo_buffer_size = 0; + return false; + } + + // Disable autocorrect while a mod other than shift is active. + if ((*mods & ~MOD_MASK_SHIFT) != 0) { + *typo_buffer_size = 0; + return false; + } + + return true; +} +``` + +?> In this callback function, `return false` will skip processing of that keycode for autocorrect. Adding `*typo_buffer_size = 0` will also reset the autocorrect buffer at the same time, cancelling any current letters already stored in the buffer. + +### Apply Autocorrect + +Additionally, `apply_autocorrect(uint8_t backspaces, const char *str)` allows for users to add additional handling to the autocorrection, or replace the functionality entirely. This passes on the number of backspaces needed to replace the words, as well as the replacement string (partial word, not the full word). + +#### Apply Autocorrect Example + +This following example will play a sound when a typo is autocorrected and execute the autocorrection itself: + +```c +#ifdef AUDIO_ENABLE +float autocorrect_song[][2] = SONG(TERMINAL_SOUND); +#endif + +bool apply_autocorrect(uint8_t backspaces, const char *str) { +#ifdef AUDIO_ENABLE + PLAY_SONG(autocorrect_song); +#endif + for (uint8_t i = 0; i < backspaces; ++i) { + tap_code(KC_BSPC); + } + send_string_P(str); + return false; +} +``` + +?> In this callback function, `return false` will stop the normal processing of autocorrect, which requires manually handling of removing the "bad" characters and typing the new characters. + +!> ***IMPORTANT***: `str` is a pointer to `PROGMEM` data for the autocorrection. If you return false, and want to send the string, this needs to use `send_string_P` and not `send_string` or `SEND_STRING`. + +You can also use `apply_autocorrect` to detect and display the event but allow internal code to execute the autocorrection with `return true`: + +```c +bool apply_autocorrect(uint8_t backspaces, const char *str) { +#ifdef OLED_ENABLE + oled_write_P(PSTR("Auto-corrected"), false); +#endif + return true; +} +``` + +## Appendix: Trie binary data format :id=appendix + +This section details how the trie is serialized to byte data in autocorrection_data. You don’t need to care about this to use this autocorrection implementation. But it is documented for the record in case anyone is interested in modifying the implementation, or just curious how it works. + +What I did here is fairly arbitrary, but it is simple to decode and gets the job done. + +### Encoding :id=encoding + +All autocorrection data is stored in a single flat array autocorrection_data. Each trie node is associated with a byte offset into this array, where data for that node is encoded, beginning with root at offset 0. There are three kinds of nodes. The highest two bits of the first byte of the node indicate what kind: + +* 00 ⇒ chain node: a trie node with a single child. +* 01 ⇒ branching node: a trie node with multiple children. +* 10 ⇒ leaf node: a leaf, corresponding to a typo and storing its correction. + +![An example trie](https://i.imgur.com/HL5DP8H.png) + +**Branching node**. Each branch is encoded with one byte for the keycode (KC_A–KC_Z) followed by a link to the child node. Links between nodes are 16-bit byte offsets relative to the beginning of the array, serialized in little endian order. + +All branches are serialized this way, one after another, and terminated with a zero byte. As described above, the node is identified as a branch by setting the two high bits of the first byte to 01, done by bitwise ORing the first keycode with 64. keycode. The root node for the above figure would be serialized like: + +``` ++-------+-------+-------+-------+-------+-------+-------+ +| R|64 | node 2 | T | node 3 | 0 | ++-------+-------+-------+-------+-------+-------+-------+ +``` + +**Chain node**. Tries tend to have long chains of single-child nodes, as seen in the example above with f-i-t-l in fitler. So to save space, we use a different format to encode chains than branching nodes. A chain is encoded as a string of keycodes, beginning with the node closest to the root, and terminated with a zero byte. The child of the last node in the chain is encoded immediately after. That child could be either a branching node or a leaf. + +In the figure above, the f-i-t-l chain is encoded as + +``` ++-------+-------+-------+-------+-------+ +| L | T | I | F | 0 | ++-------+-------+-------+-------+-------+ +``` + +If we were to encode this chain using the same format used for branching nodes, we would encode a 16-bit node link with every node, costing 8 more bytes in this example. Across the whole trie, this adds up. Conveniently, we can point to intermediate points in the chain and interpret the bytes in the same way as before. E.g. starting at the i instead of the l, and the subchain has the same format. + +**Leaf node**. A leaf node corresponds to a particular typo and stores data to correct the typo. The leaf begins with a byte for the number of backspaces to type, and is followed by a null-terminated ASCII string of the replacement text. The idea is, after tapping backspace the indicated number of times, we can simply pass this string to the `send_string_P` function. For fitler, we need to tap backspace 3 times (not 4, because we catch the typo as the final ‘r’ is pressed) and replace it with lter. To identify the node as a leaf, the two high bits are set to 10 by ORing the backspace count with 128: + +``` ++-------+-------+-------+-------+-------+-------+ +| 3|128 | 'l' | 't' | 'e' | 'r' | 0 | ++-------+-------+-------+-------+-------+-------+ +``` + +### Decoding :id=decoding + +This format is by design decodable with fairly simple logic. A 16-bit variable state represents our current position in the trie, initialized with 0 to start at the root node. Then, for each keycode, test the highest two bits in the byte at state to identify the kind of node. + +* 00 ⇒ **chain node**: If the node’s byte matches the keycode, increment state by one to go to the next byte. If the next byte is zero, increment again to go to the following node. +* 01 ⇒ **branching node**: Search the branches for one that matches the keycode, and follow its node link. +* 10 ⇒ **leaf node**: a typo has been found! We read its first byte for the number of backspaces to type, then pass its following bytes to send_string_P to type the correction. + +## Credits + +Credit goes to [getreuer](https://github.com/getreuer) for originally implementing this [here](https://getreuer.info/posts/keyboards/autocorrection/#how-does-it-work). As well as to [filterpaper](https://github.com/filterpaper) for converting the code to use PROGMEM, and additional improvements. diff --git a/lib/python/qmk/cli/__init__.py b/lib/python/qmk/cli/__init__.py index 98e212c47b..02561da1fb 100644 --- a/lib/python/qmk/cli/__init__.py +++ b/lib/python/qmk/cli/__init__.py @@ -47,6 +47,7 @@ subcommands = [ 'qmk.cli.format.python', 'qmk.cli.format.text', 'qmk.cli.generate.api', + 'qmk.cli.generate.autocorrect_data', 'qmk.cli.generate.compilation_database', 'qmk.cli.generate.config_h', 'qmk.cli.generate.develop_pr_list', diff --git a/lib/python/qmk/cli/generate/autocorrect_data.py b/lib/python/qmk/cli/generate/autocorrect_data.py new file mode 100644 index 0000000000..00ab6180ab --- /dev/null +++ b/lib/python/qmk/cli/generate/autocorrect_data.py @@ -0,0 +1,289 @@ +# Copyright 2021 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Python program to make autocorrect_data.h. +This program reads from a prepared dictionary file and generates a C source file +"autocorrect_data.h" with a serialized trie embedded as an array. Run this +program and pass it as the first argument like: +$ qmk generate-autocorrect-data autocorrect_dict.txt +Each line of the dict file defines one typo and its correction with the syntax +"typo -> correction". Blank lines or lines starting with '#' are ignored. +Example: + :thier -> their + fitler -> filter + lenght -> length + ouput -> output + widht -> width +For full documentation, see QMK Docs +""" + +import sys +import textwrap +from typing import Any, Dict, Iterator, List, Tuple + +from milc import cli + +import qmk.path +from qmk.keyboard import keyboard_completer, keyboard_folder +from qmk.keymap import keymap_completer, locate_keymap + +KC_A = 4 +KC_SPC = 0x2c +KC_QUOT = 0x34 + +TYPO_CHARS = dict([ + ("'", KC_QUOT), + (':', KC_SPC), # "Word break" character. +] + [(chr(c), c + KC_A - ord('a')) for c in range(ord('a'), + ord('z') + 1)]) # Characters a-z. + + +def parse_file(file_name: str) -> List[Tuple[str, str]]: + """Parses autocorrections dictionary file. + Each line of the file defines one typo and its correction with the syntax + "typo -> correction". Blank lines or lines starting with '#' are ignored. The + function validates that typos only have characters a-z and that typos are not + substrings of other typos, otherwise the longer typo would never trigger. + Args: + file_name: String, path of the autocorrections dictionary. + Returns: + List of (typo, correction) tuples. + """ + + try: + from english_words import english_words_lower_alpha_set as correct_words + except ImportError: + cli.echo('Autocorrection will falsely trigger when a typo is a substring of a correctly spelled word.') + cli.echo('To check for this, install the english_words package and rerun this script:') + cli.echo(' {fg_cyan}python3 -m pip install english_words') + # Use a minimal word list as a fallback. + correct_words = ('information', 'available', 'international', 'language', 'loosest', 'reference', 'wealthier', 'entertainment', 'association', 'provides', 'technology', 'statehood') + + autocorrections = [] + typos = set() + for line_number, typo, correction in parse_file_lines(file_name): + if typo in typos: + cli.log.warning('{fg_red}Error:%d:{fg_reset} Ignoring duplicate typo: "{fg_cyan}%s{fg_reset}"', line_number, typo) + continue + + # Check that `typo` is valid. + if not (all([c in TYPO_CHARS for c in typo])): + cli.log.error('{fg_red}Error:%d:{fg_reset} Typo "{fg_cyan}%s{fg_reset}" has characters other than a-z, \' and :.', line_number, typo) + sys.exit(1) + for other_typo in typos: + if typo in other_typo or other_typo in typo: + cli.log.error('{fg_red}Error:%d:{fg_reset} Typos may not be substrings of one another, otherwise the longer typo would never trigger: "{fg_cyan}%s{fg_reset}" vs. "{fg_cyan}%s{fg_reset}".', line_number, typo, other_typo) + sys.exit(1) + if len(typo) < 5: + cli.log.warning('{fg_yellow}Warning:%d:{fg_reset} It is suggested that typos are at least 5 characters long to avoid false triggers: "{fg_cyan}%s{fg_reset}"', line_number, typo) + if len(typo) > 127: + cli.log.error('{fg_red}Error:%d:{fg_reset} Typo exceeds 127 chars: "{fg_cyan}%s{fg_reset}"', line_number, typo) + sys.exit(1) + + check_typo_against_dictionary(typo, line_number, correct_words) + + autocorrections.append((typo, correction)) + typos.add(typo) + + return autocorrections + + +def make_trie(autocorrections: List[Tuple[str, str]]) -> Dict[str, Any]: + """Makes a trie from the the typos, writing in reverse. + Args: + autocorrections: List of (typo, correction) tuples. + Returns: + Dict of dict, representing the trie. + """ + trie = {} + for typo, correction in autocorrections: + node = trie + for letter in typo[::-1]: + node = node.setdefault(letter, {}) + node['LEAF'] = (typo, correction) + + return trie + + +def parse_file_lines(file_name: str) -> Iterator[Tuple[int, str, str]]: + """Parses lines read from `file_name` into typo-correction pairs.""" + + line_number = 0 + for line in open(file_name, 'rt'): + line_number += 1 + line = line.strip() + if line and line[0] != '#': + # Parse syntax "typo -> correction", using strip to ignore indenting. + tokens = [token.strip() for token in line.split('->', 1)] + if len(tokens) != 2 or not tokens[0]: + print(f'Error:{line_number}: Invalid syntax: "{line}"') + sys.exit(1) + + typo, correction = tokens + typo = typo.lower() # Force typos to lowercase. + typo = typo.replace(' ', ':') + + yield line_number, typo, correction + + +def check_typo_against_dictionary(typo: str, line_number: int, correct_words) -> None: + """Checks `typo` against English dictionary words.""" + + if typo.startswith(':') and typo.endswith(':'): + if typo[1:-1] in correct_words: + cli.log.warning('{fg_yellow}Warning:%d:{fg_reset} Typo "{fg_cyan}%s{fg_reset}" is a correctly spelled dictionary word.', line_number, typo) + elif typo.startswith(':') and not typo.endswith(':'): + for word in correct_words: + if word.startswith(typo[1:]): + cli.log.warning('{fg_yellow}Warning:%d: {fg_reset}Typo "{fg_cyan}%s{fg_reset}" would falsely trigger on correctly spelled word "{fg_cyan}%s{fg_reset}".', line_number, typo, word) + elif not typo.startswith(':') and typo.endswith(':'): + for word in correct_words: + if word.endswith(typo[:-1]): + cli.log.warning('{fg_yellow}Warning:%d:{fg_reset} Typo "{fg_cyan}%s{fg_reset}" would falsely trigger on correctly spelled word "{fg_cyan}%s{fg_reset}".', line_number, typo, word) + elif not typo.startswith(':') and not typo.endswith(':'): + for word in correct_words: + if typo in word: + cli.log.warning('{fg_yellow}Warning:%d:{fg_reset} Typo "{fg_cyan}%s{fg_reset}" would falsely trigger on correctly spelled word "{fg_cyan}%s{fg_reset}".', line_number, typo, word) + + +def serialize_trie(autocorrections: List[Tuple[str, str]], trie: Dict[str, Any]) -> List[int]: + """Serializes trie and correction data in a form readable by the C code. + Args: + autocorrections: List of (typo, correction) tuples. + trie: Dict of dicts. + Returns: + List of ints in the range 0-255. + """ + table = [] + + # Traverse trie in depth first order. + def traverse(trie_node): + if 'LEAF' in trie_node: # Handle a leaf trie node. + typo, correction = trie_node['LEAF'] + word_boundary_ending = typo[-1] == ':' + typo = typo.strip(':') + i = 0 # Make the autocorrection data for this entry and serialize it. + while i < min(len(typo), len(correction)) and typo[i] == correction[i]: + i += 1 + backspaces = len(typo) - i - 1 + word_boundary_ending + assert 0 <= backspaces <= 63 + correction = correction[i:] + bs_count = [backspaces + 128] + data = bs_count + list(bytes(correction, 'ascii')) + [0] + + entry = {'data': data, 'links': [], 'byte_offset': 0} + table.append(entry) + elif len(trie_node) == 1: # Handle trie node with a single child. + c, trie_node = next(iter(trie_node.items())) + entry = {'chars': c, 'byte_offset': 0} + + # It's common for a trie to have long chains of single-child nodes. We + # find the whole chain so that we can serialize it more efficiently. + while len(trie_node) == 1 and 'LEAF' not in trie_node: + c, trie_node = next(iter(trie_node.items())) + entry['chars'] += c + + table.append(entry) + entry['links'] = [traverse(trie_node)] + else: # Handle trie node with multiple children. + entry = {'chars': ''.join(sorted(trie_node.keys())), 'byte_offset': 0} + table.append(entry) + entry['links'] = [traverse(trie_node[c]) for c in entry['chars']] + return entry + + traverse(trie) + + def serialize(e: Dict[str, Any]) -> List[int]: + if not e['links']: # Handle a leaf table entry. + return e['data'] + elif len(e['links']) == 1: # Handle a chain table entry. + return [TYPO_CHARS[c] for c in e['chars']] + [0] # + encode_link(e['links'][0])) + else: # Handle a branch table entry. + data = [] + for c, link in zip(e['chars'], e['links']): + data += [TYPO_CHARS[c] | (0 if data else 64)] + encode_link(link) + return data + [0] + + byte_offset = 0 + for e in table: # To encode links, first compute byte offset of each entry. + e['byte_offset'] = byte_offset + byte_offset += len(serialize(e)) + assert 0 <= byte_offset <= 0xffff + + return [b for e in table for b in serialize(e)] # Serialize final table. + + +def encode_link(link: Dict[str, Any]) -> List[int]: + """Encodes a node link as two bytes.""" + byte_offset = link['byte_offset'] + if not (0 <= byte_offset <= 0xffff): + cli.log.error('{fg_red}Error:{fg_reset} The autocorrection table is too large, a node link exceeds 64KB limit. Try reducing the autocorrection dict to fewer entries.') + sys.exit(1) + return [byte_offset & 255, byte_offset >> 8] + + +def write_generated_code(autocorrections: List[Tuple[str, str]], data: List[int], file_name: str) -> None: + """Writes autocorrection data as generated C code to `file_name`. + Args: + autocorrections: List of (typo, correction) tuples. + data: List of ints in 0-255, the serialized trie. + file_name: String, path of the output C file. + """ + assert all(0 <= b <= 255 for b in data) + + def typo_len(e: Tuple[str, str]) -> int: + return len(e[0]) + + min_typo = min(autocorrections, key=typo_len)[0] + max_typo = max(autocorrections, key=typo_len)[0] + generated_code = ''.join([ + '// Generated code.\n\n', f'// Autocorrection dictionary ({len(autocorrections)} entries):\n', ''.join(sorted(f'// {typo:<{len(max_typo)}} -> {correction}\n' for typo, correction in autocorrections)), + f'\n#define AUTOCORRECT_MIN_LENGTH {len(min_typo)} // "{min_typo}"\n', f'#define AUTOCORRECT_MAX_LENGTH {len(max_typo)} // "{max_typo}"\n\n', f'#define DICTIONARY_SIZE {len(data)}\n\n', + textwrap.fill('static const uint8_t autocorrect_data[DICTIONARY_SIZE] PROGMEM = {%s};' % (', '.join(map(str, data))), width=120, subsequent_indent=' '), '\n\n' + ]) + + with open(file_name, 'wt') as f: + f.write(generated_code) + + +@cli.argument('filename', default='autocorrect_dict.txt', help='The autocorrection database file') +@cli.argument('-kb', '--keyboard', type=keyboard_folder, completer=keyboard_completer, help='The keyboard to build a firmware for. Ignored when a configurator export is supplied.') +@cli.argument('-km', '--keymap', completer=keymap_completer, help='The keymap to build a firmware for. Ignored when a configurator export is supplied.') +@cli.argument('-o', '--output', arg_only=True, type=qmk.path.normpath, help='File to write to') +@cli.subcommand('Generate the autocorrection data file from a dictionary file.') +def generate_autocorrect_data(cli): + autocorrections = parse_file(cli.args.filename) + trie = make_trie(autocorrections) + data = serialize_trie(autocorrections, trie) + # Environment processing + if cli.args.output == '-': + cli.args.output = None + + if cli.args.output: + cli.args.output.parent.mkdir(parents=True, exist_ok=True) + cli.log.info('Creating autocorrect database at {fg_cyan}%s', cli.args.output) + write_generated_code(autocorrections, data, cli.args.output) + + else: + current_keyboard = cli.args.keyboard or cli.config.user.keyboard or cli.config.generate_autocorrect_data.keyboard + current_keymap = cli.args.keymap or cli.config.user.keymap or cli.config.generate_autocorrect_data.keymap + + if current_keyboard and current_keymap: + filename = locate_keymap(current_keyboard, current_keymap).parent / 'autocorrect_data.h' + cli.log.info('Creating autocorrect database at {fg_cyan}%s', filename) + write_generated_code(autocorrections, data, filename) + + else: + write_generated_code(autocorrections, data, 'autocorrect_data.h') + + cli.log.info('Processed %d autocorrection entries to table with %d bytes.', len(autocorrections), len(data)) diff --git a/quantum/eeconfig.c b/quantum/eeconfig.c index 0b7ae39907..7c0431fd12 100644 --- a/quantum/eeconfig.c +++ b/quantum/eeconfig.c @@ -46,7 +46,7 @@ void eeconfig_init_quantum(void) { eeprom_update_byte(EECONFIG_DEFAULT_LAYER, 0); default_layer_state = 0; eeprom_update_byte(EECONFIG_KEYMAP_LOWER_BYTE, 0); - eeprom_update_byte(EECONFIG_KEYMAP_UPPER_BYTE, 0x4); + eeprom_update_byte(EECONFIG_KEYMAP_UPPER_BYTE, 0xC); eeprom_update_byte(EECONFIG_MOUSEKEY_ACCEL, 0); eeprom_update_byte(EECONFIG_BACKLIGHT, 0); eeprom_update_byte(EECONFIG_AUDIO, 0xFF); // On by default diff --git a/quantum/keycode_config.h b/quantum/keycode_config.h index 81a8e61471..eef048d95c 100644 --- a/quantum/keycode_config.h +++ b/quantum/keycode_config.h @@ -39,6 +39,7 @@ typedef union { bool swap_rctl_rgui : 1; bool oneshot_enable : 1; bool swap_escape_capslock : 1; + bool autocorrect_enable : 1; }; } keymap_config_t; diff --git a/quantum/process_keycode/autocorrect_data_default.h b/quantum/process_keycode/autocorrect_data_default.h new file mode 100644 index 0000000000..bfc29666df --- /dev/null +++ b/quantum/process_keycode/autocorrect_data_default.h @@ -0,0 +1,85 @@ +// Generated code. + +// Autocorrection dictionary (70 entries): +// :guage -> gauge +// :the:the: -> the +// :thier -> their +// :ture -> true +// accomodate -> accommodate +// acommodate -> accommodate +// aparent -> apparent +// aparrent -> apparent +// apparant -> apparent +// apparrent -> apparent +// aquire -> acquire +// becuase -> because +// cauhgt -> caught +// cheif -> chief +// choosen -> chosen +// cieling -> ceiling +// collegue -> colleague +// concensus -> consensus +// contians -> contains +// cosnt -> const +// dervied -> derived +// fales -> false +// fasle -> false +// fitler -> filter +// flase -> false +// foward -> forward +// frequecy -> frequency +// gaurantee -> guarantee +// guaratee -> guarantee +// heigth -> height +// heirarchy -> hierarchy +// inclued -> include +// interator -> iterator +// intput -> input +// invliad -> invalid +// lenght -> length +// liasion -> liaison +// libary -> library +// listner -> listener +// looses: -> loses +// looup -> lookup +// manefist -> manifest +// namesapce -> namespace +// namespcae -> namespace +// occassion -> occasion +// occured -> occurred +// ouptut -> output +// ouput -> output +// overide -> override +// postion -> position +// priviledge -> privilege +// psuedo -> pseudo +// recieve -> receive +// refered -> referred +// relevent -> relevant +// repitition -> repetition +// retrun -> return +// retun -> return +// reuslt -> result +// reutrn -> return +// saftey -> safety +// seperate -> separate +// singed -> signed +// stirng -> string +// strign -> string +// swithc -> switch +// swtich -> switch +// thresold -> threshold +// udpate -> update +// widht -> width + +#define AUTOCORRECT_MIN_LENGTH 5 // ":ture" +#define AUTOCORRECT_MAX_LENGTH 10 // "accomodate" + +#define DICTIONARY_SIZE 1104 + +static const uint8_t autocorrect_data[DICTIONARY_SIZE] PROGMEM = {108, 43, 0, 6, 71, 0, 7, 81, 0, 8, 199, 0, 9, 240, 1, 10, 250, 1, 11, 26, 2, 17, 53, 2, 18, 190, 2, 19, 202, 2, 21, 212, 2, 22, 20, 3, 23, 67, 3, 28, 16, 4, 0, 72, 50, 0, 22, 60, 0, 0, 11, 23, 44, 8, 11, 23, 44, 0, 132, 0, 8, 22, 18, 18, 15, 0, 132, 115, 101, 115, 0, 11, 23, 12, 26, 22, 0, 129, 99, 104, 0, 68, 94, 0, 8, 106, 0, 15, 174, 0, 21, 187, 0, 0, 12, 15, 25, 17, 12, 0, 131, 97, 108, 105, 100, 0, 74, 119, 0, 12, 129, 0, 21, 140, 0, 24, 165, 0, 0, 17, 12, 22, 0, 131, 103, 110, 101, 100, 0, 25, 21, 8, 7, 0, 131, 105, 118, 101, 100, 0, 72, 147, 0, 24, 156, 0, 0, 9, 8, 21, 0, 129, 114, 101, 100, 0, 6, 6, 18, 0, 129, 114, 101, 100, 0, 15, 6, 17, 12, 0, 129, 100, 101, 0, 18, 22, 8, 21, 11, 23, 0, 130, 104, 111, + 108, 100, 0, 4, 26, 18, 9, 0, 131, 114, 119, 97, 114, 100, 0, 68, 233, 0, 6, 246, 0, 7, 4, 1, 8, 16, 1, 10, 52, 1, 15, 81, 1, 21, 90, 1, 22, 117, 1, 23, 144, 1, 24, 215, 1, 25, 228, 1, 0, 6, 19, 22, 8, 16, 4, 17, 0, 130, 97, 99, 101, 0, 19, 4, 22, 8, 16, 4, 17, 0, 131, 112, 97, 99, 101, 0, 12, 21, 8, 25, 18, 0, 130, 114, 105, 100, 101, 0, 23, 0, 68, 25, 1, 17, 36, 1, 0, 21, 4, 24, 10, 0, 130, 110, 116, 101, 101, 0, 4, 21, 24, 4, 10, 0, 135, 117, 97, 114, 97, 110, 116, 101, 101, 0, 68, 59, 1, 7, 69, 1, 0, 24, 10, 44, 0, 131, 97, 117, 103, 101, 0, 8, 15, 12, 25, 12, 21, 19, 0, 130, 103, 101, 0, 22, 4, 9, 0, 130, 108, 115, 101, 0, 76, 97, 1, 24, 109, 1, 0, 24, 20, 4, 0, 132, 99, 113, 117, 105, 114, 101, 0, 23, 44, 0, + 130, 114, 117, 101, 0, 4, 0, 79, 126, 1, 24, 134, 1, 0, 9, 0, 131, 97, 108, 115, 101, 0, 6, 8, 5, 0, 131, 97, 117, 115, 101, 0, 4, 0, 71, 156, 1, 19, 193, 1, 21, 203, 1, 0, 18, 16, 0, 80, 166, 1, 18, 181, 1, 0, 18, 6, 4, 0, 135, 99, 111, 109, 109, 111, 100, 97, 116, 101, 0, 6, 6, 4, 0, 132, 109, 111, 100, 97, 116, 101, 0, 7, 24, 0, 132, 112, 100, 97, 116, 101, 0, 8, 19, 8, 22, 0, 132, 97, 114, 97, 116, 101, 0, 10, 8, 15, 15, 18, 6, 0, 130, 97, 103, 117, 101, 0, 8, 12, 6, 8, 21, 0, 131, 101, 105, 118, 101, 0, 12, 8, 11, 6, 0, 130, 105, 101, 102, 0, 17, 0, 76, 3, 2, 21, 16, 2, 0, 15, 8, 12, 6, 0, 133, 101, 105, 108, 105, 110, 103, 0, 12, 23, 22, 0, 131, 114, 105, 110, 103, 0, 70, 33, 2, 23, 44, 2, 0, 12, 23, 26, 22, 0, 131, 105, + 116, 99, 104, 0, 10, 12, 8, 11, 0, 129, 104, 116, 0, 72, 69, 2, 10, 80, 2, 18, 89, 2, 21, 156, 2, 24, 167, 2, 0, 22, 18, 18, 11, 6, 0, 131, 115, 101, 110, 0, 12, 21, 23, 22, 0, 129, 110, 103, 0, 12, 0, 86, 98, 2, 23, 124, 2, 0, 68, 105, 2, 22, 114, 2, 0, 12, 15, 0, 131, 105, 115, 111, 110, 0, 4, 6, 6, 18, 0, 131, 105, 111, 110, 0, 76, 131, 2, 22, 146, 2, 0, 23, 12, 19, 8, 21, 0, 134, 101, 116, 105, 116, 105, 111, 110, 0, 18, 19, 0, 131, 105, 116, 105, 111, 110, 0, 23, 24, 8, 21, 0, 131, 116, 117, 114, 110, 0, 85, 174, 2, 23, 183, 2, 0, 23, 8, 21, 0, 130, 117, 114, 110, 0, 8, 21, 0, 128, 114, 110, 0, 7, 8, 24, 22, 19, 0, 131, 101, 117, 100, 111, 0, 24, 18, 18, 15, 0, 129, 107, 117, 112, 0, 72, 219, 2, 18, 3, 3, 0, 76, 229, 2, 15, 238, + 2, 17, 248, 2, 0, 11, 23, 44, 0, 130, 101, 105, 114, 0, 23, 12, 9, 0, 131, 108, 116, 101, 114, 0, 23, 22, 12, 15, 0, 130, 101, 110, 101, 114, 0, 23, 4, 21, 8, 23, 17, 12, 0, 135, 116, 101, 114, 97, 116, 111, 114, 0, 72, 30, 3, 17, 38, 3, 24, 51, 3, 0, 15, 4, 9, 0, 129, 115, 101, 0, 4, 12, 23, 17, 18, 6, 0, 131, 97, 105, 110, 115, 0, 22, 17, 8, 6, 17, 18, 6, 0, 133, 115, 101, 110, 115, 117, 115, 0, 74, 86, 3, 11, 96, 3, 15, 118, 3, 17, 129, 3, 22, 218, 3, 24, 232, 3, 0, 11, 24, 4, 6, 0, 130, 103, 104, 116, 0, 71, 103, 3, 10, 110, 3, 0, 12, 26, 0, 129, 116, 104, 0, 17, 8, 15, 0, 129, 116, 104, 0, 22, 24, 8, 21, 0, 131, 115, 117, 108, 116, 0, 68, 139, 3, 8, 150, 3, 22, 210, 3, 0, 21, 4, 19, 19, 4, 0, 130, 101, 110, 116, 0, 85, 157, + 3, 25, 200, 3, 0, 68, 164, 3, 21, 175, 3, 0, 19, 4, 0, 132, 112, 97, 114, 101, 110, 116, 0, 4, 19, 0, 68, 185, 3, 19, 193, 3, 0, 133, 112, 97, 114, 101, 110, 116, 0, 4, 0, 131, 101, 110, 116, 0, 8, 15, 8, 21, 0, 130, 97, 110, 116, 0, 18, 6, 0, 130, 110, 115, 116, 0, 12, 9, 8, 17, 4, 16, 0, 132, 105, 102, 101, 115, 116, 0, 83, 239, 3, 23, 6, 4, 0, 87, 246, 3, 24, 254, 3, 0, 17, 12, 0, 131, 112, 117, 116, 0, 18, 0, 130, 116, 112, 117, 116, 0, 19, 24, 18, 0, 131, 116, 112, 117, 116, 0, 70, 29, 4, 8, 41, 4, 11, 51, 4, 21, 69, 4, 0, 8, 24, 20, 8, 21, 9, 0, 129, 110, 99, 121, 0, 23, 9, 4, 22, 0, 130, 101, 116, 121, 0, 6, 21, 4, 21, 12, 8, 11, 0, 135, 105, 101, 114, 97, 114, 99, 104, 121, 0, 4, 5, 12, 15, 0, 130, 114, 97, 114, 121, 0}; diff --git a/quantum/process_keycode/process_autocorrect.c b/quantum/process_keycode/process_autocorrect.c new file mode 100644 index 0000000000..abae5e7811 --- /dev/null +++ b/quantum/process_keycode/process_autocorrect.c @@ -0,0 +1,287 @@ +// Copyright 2021 Google LLC +// Copyright 2021 @filterpaper +// SPDX-License-Identifier: Apache-2.0 +// Original source: https://getreuer.info/posts/keyboards/autocorrection + +#include "process_autocorrect.h" +#include +#include "keycode_config.h" + +#if __has_include("autocorrect_data.h") +# include "autocorrect_data.h" +#else +# pragma message "Autocorrect is using the default library." +# include "autocorrect_data_default.h" +#endif + +static uint8_t typo_buffer[AUTOCORRECT_MAX_LENGTH] = {KC_SPC}; +static uint8_t typo_buffer_size = 1; + +/** + * @brief function for querying the enabled state of autocorrect + * + * @return true if enabled + * @return false if disabled + */ +bool autocorrect_is_enabled(void) { + return keymap_config.autocorrect_enable; +} + +/** + * @brief Enables autocorrect and saves state to eeprom + * + */ +void autocorrect_enable(void) { + keymap_config.autocorrect_enable = true; + eeconfig_update_keymap(keymap_config.raw); +} + +/** + * @brief Disables autocorrect and saves state to eeprom + * + */ +void autocorrect_disable(void) { + keymap_config.autocorrect_enable = false; + typo_buffer_size = 0; + eeconfig_update_keymap(keymap_config.raw); +} + +/** + * @brief Toggles autocorrect's status and save state to eeprom + * + */ +void autocorrect_toggle(void) { + keymap_config.autocorrect_enable = !keymap_config.autocorrect_enable; + typo_buffer_size = 0; + eeconfig_update_keymap(keymap_config.raw); +} + +/** + * @brief handler for determining if autocorrect should process keypress + * + * @param keycode Keycode registered by matrix press, per keymap + * @param record keyrecord_t structure + * @param typo_buffer_size passed along to allow resetting of autocorrect buffer + * @param mods allow processing of mod status + * @return true Allow autocorection + * @return false Stop processing and escape from autocorrect. + */ +__attribute__((weak)) bool process_autocorrect_user(uint16_t *keycode, keyrecord_t *record, uint8_t *typo_buffer_size, uint8_t *mods) { + // See quantum_keycodes.h for reference on these matched ranges. + switch (*keycode) { + // Exclude these keycodes from processing. + case KC_LSFT: + case KC_RSFT: + case KC_CAPS: + case QK_TO ... QK_ONE_SHOT_LAYER_MAX: + case QK_LAYER_TAP_TOGGLE ... QK_LAYER_MOD_MAX: + case QK_ONE_SHOT_MOD ... QK_ONE_SHOT_MOD_MAX: + return false; + + // Mask for base keycode from shifted keys. + case QK_LSFT ... QK_LSFT + 255: + case QK_RSFT ... QK_RSFT + 255: + if (*keycode >= QK_LSFT && *keycode <= (QK_LSFT + 255)) { + *mods |= MOD_LSFT; + } else { + *mods |= MOD_RSFT; + } + *keycode &= 0xFF; // Get the basic keycode. + return true; +#ifndef NO_ACTION_TAPPING + // Exclude tap-hold keys when they are held down + // and mask for base keycode when they are tapped. + case QK_LAYER_TAP ... QK_LAYER_TAP_MAX: +# ifdef NO_ACTION_LAYER + // Exclude Layer Tap, if layers are disabled + // but action tapping is still enabled. + return false; +# endif + case QK_MOD_TAP ... QK_MOD_TAP_MAX: + // Exclude hold keycode + if (!record->tap.count) { + return false; + } + *keycode &= 0xFF; + break; +#else + case QK_MOD_TAP ... QK_MOD_TAP_MAX: + case QK_LAYER_TAP ... QK_LAYER_TAP_MAX: + // Exclude if disabled + return false; +#endif + // Exclude swap hands keys when they are held down + // and mask for base keycode when they are tapped. + case QK_SWAP_HANDS ... QK_SWAP_HANDS_MAX: +#ifdef SWAP_HANDS_ENABLE + if (*keycode >= 0x56F0 || !record->tap.count) { + return false; + } + *keycode &= 0xFF; + break; +#else + // Exclude if disabled + return false; +#endif + } + + // Disable autocorrect while a mod other than shift is active. + if ((*mods & ~MOD_MASK_SHIFT) != 0) { + *typo_buffer_size = 0; + return false; + } + + return true; +} + +/** + * @brief handling for when autocorrection has been triggered + * + * @param backspaces number of characters to remove + * @param str pointer to PROGMEM string to replace mistyped seletion with + * @return true apply correction + * @return false user handled replacement + */ +__attribute__((weak)) bool apply_autocorrect(uint8_t backspaces, const char *str) { + return true; +} + +/** + * @brief Process handler for autocorrect feature + * + * @param keycode Keycode registered by matrix press, per keymap + * @param record keyrecord_t structure + * @return true Continue processing keycodes, and send to host + * @return false Stop processing keycodes, and don't send to host + */ +bool process_autocorrect(uint16_t keycode, keyrecord_t *record) { + uint8_t mods = get_mods(); +#ifndef NO_ACTION_ONESHOT + mods |= get_oneshot_mods(); +#endif + + if ((keycode >= AUTOCORRECT_ON && keycode <= AUTOCORRECT_TOGGLE) && record->event.pressed) { + if (keycode == AUTOCORRECT_ON) { + autocorrect_enable(); + } else if (keycode == AUTOCORRECT_OFF) { + autocorrect_disable(); + } else if (keycode == AUTOCORRECT_TOGGLE) { + autocorrect_toggle(); + } else { + return true; + } + + return false; + } + + if (!keymap_config.autocorrect_enable) { + typo_buffer_size = 0; + return true; + } + + if (!record->event.pressed) { + return true; + } + + // autocorrect keycode verification and extraction + if (!process_autocorrect_user(&keycode, record, &typo_buffer_size, &mods)) { + return true; + } + + // keycode buffer check + switch (keycode) { + case KC_A ... KC_Z: + // process normally + break; + case KC_1 ... KC_0: + case KC_TAB ... KC_SEMICOLON: + case KC_GRAVE ... KC_SLASH: + // Set a word boundary if space, period, digit, etc. is pressed. + keycode = KC_SPC; + break; + case KC_ENTER: + // Behave more conservatively for the enter key. Reset, so that enter + // can't be used on a word ending. + typo_buffer_size = 0; + keycode = KC_SPC; + break; + case KC_BSPC: + // Remove last character from the buffer. + if (typo_buffer_size > 0) { + --typo_buffer_size; + } + return true; + case KC_QUOTE: + // Treat " (shifted ') as a word boundary. + if ((mods & MOD_MASK_SHIFT) != 0) { + keycode = KC_SPC; + } + break; + default: + // Clear state if some other non-alpha key is pressed. + typo_buffer_size = 0; + return true; + } + + // Rotate oldest character if buffer is full. + if (typo_buffer_size >= AUTOCORRECT_MAX_LENGTH) { + memmove(typo_buffer, typo_buffer + 1, AUTOCORRECT_MAX_LENGTH - 1); + typo_buffer_size = AUTOCORRECT_MAX_LENGTH - 1; + } + + // Append `keycode` to buffer. + typo_buffer[typo_buffer_size++] = keycode; + // Return if buffer is smaller than the shortest word. + if (typo_buffer_size < AUTOCORRECT_MIN_LENGTH) { + return true; + } + + // Check for typo in buffer using a trie stored in `autocorrect_data`. + uint16_t state = 0; + uint8_t code = pgm_read_byte(autocorrect_data + state); + for (int8_t i = typo_buffer_size - 1; i >= 0; --i) { + uint8_t const key_i = typo_buffer[i]; + + if (code & 64) { // Check for match in node with multiple children. + code &= 63; + for (; code != key_i; code = pgm_read_byte(autocorrect_data + (state += 3))) { + if (!code) return true; + } + // Follow link to child node. + state = (pgm_read_byte(autocorrect_data + state + 1) | pgm_read_byte(autocorrect_data + state + 2) << 8); + // Check for match in node with single child. + } else if (code != key_i) { + return true; + } else if (!(code = pgm_read_byte(autocorrect_data + (++state)))) { + ++state; + } + + // Stop if `state` becomes an invalid index. This should not normally + // happen, it is a safeguard in case of a bug, data corruption, etc. + if (state >= DICTIONARY_SIZE) { + return true; + } + + code = pgm_read_byte(autocorrect_data + state); + + if (code & 128) { // A typo was found! Apply autocorrect. + const uint8_t backspaces = (code & 63) + !record->event.pressed; + if (apply_autocorrect(backspaces, (char const *)(autocorrect_data + state + 1))) { + for (uint8_t i = 0; i < backspaces; ++i) { + tap_code(KC_BSPC); + } + send_string_P((char const *)(autocorrect_data + state + 1)); + } + + if (keycode == KC_SPC) { + typo_buffer[0] = KC_SPC; + typo_buffer_size = 1; + return true; + } else { + typo_buffer_size = 0; + return false; + } + } + } + return true; +} diff --git a/quantum/process_keycode/process_autocorrect.h b/quantum/process_keycode/process_autocorrect.h new file mode 100644 index 0000000000..c7596107e5 --- /dev/null +++ b/quantum/process_keycode/process_autocorrect.h @@ -0,0 +1,17 @@ +// Copyright 2021 Google LLC +// Copyright 2021 @filterpaper +// SPDX-License-Identifier: Apache-2.0 +// Original source: https://getreuer.info/posts/keyboards/autocorrection + +#pragma once + +#include "quantum.h" + +bool process_autocorrect(uint16_t keycode, keyrecord_t *record); +bool process_autocorrect_user(uint16_t *keycode, keyrecord_t *record, uint8_t *typo_buffer_size, uint8_t *mods); +bool apply_autocorrect(uint8_t backspaces, const char *str); + +bool autocorrect_is_enabled(void); +void autocorrect_enable(void); +void autocorrect_disable(void); +void autocorrect_toggle(void); diff --git a/quantum/quantum.c b/quantum/quantum.c index acafd8025c..9f1d3502fb 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c @@ -335,6 +335,9 @@ bool process_record_quantum(keyrecord_t *record) { #endif #ifdef PROGRAMMABLE_BUTTON_ENABLE process_programmable_button(keycode, record) && +#endif +#ifdef AUTOCORRECT_ENABLE + process_autocorrect(keycode, record) && #endif true)) { return false; diff --git a/quantum/quantum.h b/quantum/quantum.h index 51360c3d2a..9c1b9952b8 100644 --- a/quantum/quantum.h +++ b/quantum/quantum.h @@ -236,6 +236,10 @@ extern layer_state_t layer_state; # include "process_caps_word.h" #endif +#ifdef AUTOCORRECT_ENABLE +# include "process_autocorrect.h" +#endif + // For tri-layer void update_tri_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3); layer_state_t update_tri_layer_state(layer_state_t state, uint8_t layer1, uint8_t layer2, uint8_t layer3); diff --git a/quantum/quantum_keycodes.h b/quantum/quantum_keycodes.h index c8f03fa1ce..abf3f1a384 100644 --- a/quantum/quantum_keycodes.h +++ b/quantum/quantum_keycodes.h @@ -611,6 +611,10 @@ enum quantum_keycodes { UNICODE_MODE_EMACS, + AUTOCORRECT_ON, + AUTOCORRECT_OFF, + AUTOCORRECT_TOGGLE, + // Start of custom keycode range for keyboards and keymaps - always leave at the end SAFE_RANGE }; @@ -799,6 +803,10 @@ enum quantum_keycodes { #define EH_LEFT MAGIC_EE_HANDS_LEFT #define EH_RGHT MAGIC_EE_HANDS_RIGHT +#define CRT_ON AUTOCORRECT_ON +#define CRT_OFF AUTOCORRECT_OFF +#define CRT_TOG AUTOCORRECT_TOGGLE + // GOTO layer - 256 layer max #define TO(layer) (QK_TO | ((layer)&0xFF)) diff --git a/tests/autocorrect/config.h b/tests/autocorrect/config.h new file mode 100644 index 0000000000..b68bf0c2d5 --- /dev/null +++ b/tests/autocorrect/config.h @@ -0,0 +1,6 @@ +// Copyright 2021 Christopher Courtney, aka Drashna Jael're (@drashna) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "test_common.h" diff --git a/tests/autocorrect/test.mk b/tests/autocorrect/test.mk new file mode 100644 index 0000000000..7b97d8cce3 --- /dev/null +++ b/tests/autocorrect/test.mk @@ -0,0 +1,8 @@ +# Copyright 2021 Christopher Courtney, aka Drashna Jael're (@drashna) +# SPDX-License-Identifier: GPL-2.0-or-later + +# -------------------------------------------------------------------------------- +# Keep this file, even if it is empty, as a marker that this folder contains tests +# -------------------------------------------------------------------------------- + +AUTOCORRECT_ENABLE = yes diff --git a/tests/autocorrect/test_autocorrect.cpp b/tests/autocorrect/test_autocorrect.cpp new file mode 100644 index 0000000000..509c1c9ea4 --- /dev/null +++ b/tests/autocorrect/test_autocorrect.cpp @@ -0,0 +1,204 @@ +// Copyright 2021 Christopher Courtney, aka Drashna Jael're (@drashna) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "keycode.h" +#include "test_common.hpp" + +using ::testing::_; +using ::testing::AnyNumber; +using ::testing::InSequence; + +class AutoCorrect : public TestFixture { + public: + void SetUp() override { + autocorrect_enable(); + } + // Convenience function to tap `key`. + void TapKey(KeymapKey key) { + key.press(); + run_one_scan_loop(); + key.release(); + run_one_scan_loop(); + } + + // Taps in order each key in `keys`. + template + void TapKeys(Ts... keys) { + for (KeymapKey key : {keys...}) { + TapKey(key); + } + } +}; + +// Test that verifies enable/disable/toggling works +TEST_F(AutoCorrect, OnOffToggle) { + TestDriver driver; + + EXPECT_EQ(autocorrect_is_enabled(), true); + + autocorrect_disable(); + EXPECT_EQ(autocorrect_is_enabled(), false); + autocorrect_disable(); + EXPECT_EQ(autocorrect_is_enabled(), false); + + autocorrect_enable(); + EXPECT_EQ(autocorrect_is_enabled(), true); + autocorrect_enable(); + EXPECT_EQ(autocorrect_is_enabled(), true); + + autocorrect_toggle(); + EXPECT_EQ(autocorrect_is_enabled(), false); + autocorrect_toggle(); + EXPECT_EQ(autocorrect_is_enabled(), true); + + testing::Mock::VerifyAndClearExpectations(&driver); +} + +// Test that typing "fales" autocorrects to "false" +TEST_F(AutoCorrect, fales_to_false_autocorrection) { + TestDriver driver; + auto key_f = KeymapKey(0, 0, 0, KC_F); + auto key_a = KeymapKey(0, 1, 0, KC_A); + auto key_l = KeymapKey(0, 2, 0, KC_L); + auto key_e = KeymapKey(0, 3, 0, KC_E); + auto key_s = KeymapKey(0, 4, 0, KC_S); + + set_keymap({key_f, key_a, key_l, key_e, key_s}); + + // Allow any number of empty reports. + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(AnyNumber()); + { // Expect the following reports in this order. + InSequence s; + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_F))); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_A))); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_L))); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_E))); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_BACKSPACE))); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_S))); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_E))); + } + + TapKeys(key_f, key_a, key_l, key_e, key_s); + + testing::Mock::VerifyAndClearExpectations(&driver); +} + +// Test that typing "fales" doesn't autocorrect if disabled +TEST_F(AutoCorrect, fales_disabled_autocorrect) { + TestDriver driver; + auto key_f = KeymapKey(0, 0, 0, KC_F); + auto key_a = KeymapKey(0, 1, 0, KC_A); + auto key_l = KeymapKey(0, 2, 0, KC_L); + auto key_e = KeymapKey(0, 3, 0, KC_E); + auto key_s = KeymapKey(0, 4, 0, KC_S); + + set_keymap({key_f, key_a, key_l, key_e, key_s}); + + // Allow any number of empty reports. + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(AnyNumber()); + { // Expect the following reports in this order. + InSequence s; + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_F))); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_A))); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_L))); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_E))); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_S))); + } + + autocorrect_disable(); + TapKeys(key_f, key_a, key_l, key_e, key_s); + autocorrect_enable(); + + testing::Mock::VerifyAndClearExpectations(&driver); +} + +// Test that typing "falsify" doesn't autocorrect if disabled +TEST_F(AutoCorrect, falsify_should_not_autocorrect) { + TestDriver driver; + auto key_f = KeymapKey(0, 0, 0, KC_F); + auto key_a = KeymapKey(0, 1, 0, KC_A); + auto key_l = KeymapKey(0, 2, 0, KC_L); + auto key_s = KeymapKey(0, 3, 0, KC_S); + auto key_i = KeymapKey(0, 4, 0, KC_I); + auto key_y = KeymapKey(0, 5, 0, KC_Y); + + set_keymap({key_f, key_a, key_l, key_s, key_i, key_y}); + + // Allow any number of empty reports. + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(AnyNumber()); + { // Expect the following reports in this order. + InSequence s; + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_F))); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_A))); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_L))); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_S))); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_I))); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_F))); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_Y))); + } + + TapKeys(key_f, key_a, key_l, key_s, key_i, key_f, key_y); + + testing::Mock::VerifyAndClearExpectations(&driver); +} + +// Test that typing "ture" autocorrect to "true" +TEST_F(AutoCorrect, ture_to_true_autocorrect) { + TestDriver driver; + auto key_t_code = KeymapKey(0, 0, 0, KC_T); + auto key_r = KeymapKey(0, 1, 0, KC_R); + auto key_u = KeymapKey(0, 2, 0, KC_U); + auto key_e = KeymapKey(0, 3, 0, KC_E); + auto key_space = KeymapKey(0, 4, 0, KC_SPACE); + + set_keymap({key_t_code, key_r, key_u, key_e, key_space}); + + // Allow any number of empty reports. + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(AnyNumber()); + { // Expect the following reports in this order. + InSequence s; + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_SPACE))); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_T))); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_U))); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_R))); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_BACKSPACE))).Times(2); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_R))); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_U))); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_E))); + } + + TapKeys(key_space, key_t_code, key_u, key_r, key_e); + + testing::Mock::VerifyAndClearExpectations(&driver); +} + +// Test that typing "overture" does not autocorrect +TEST_F(AutoCorrect, overture_should_not_autocorrect) { + TestDriver driver; + auto key_t_code = KeymapKey(0, 0, 0, KC_T); + auto key_r = KeymapKey(0, 1, 0, KC_R); + auto key_u = KeymapKey(0, 2, 0, KC_U); + auto key_e = KeymapKey(0, 3, 0, KC_E); + auto key_o = KeymapKey(0, 4, 0, KC_O); + auto key_v = KeymapKey(0, 5, 0, KC_V); + + set_keymap({key_t_code, key_r, key_u, key_e, key_o, key_v}); + + // Allow any number of empty reports. + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(AnyNumber()); + { // Expect the following reports in this order. + InSequence s; + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_O))); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_V))); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_E))); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_R))); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_T))); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_U))); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_R))); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_E))); + } + + TapKeys(key_o, key_v, key_e, key_r, key_t_code, key_u, key_r, key_e); + + testing::Mock::VerifyAndClearExpectations(&driver); +} -- cgit 1.4.1 From 20f142a7723b0362c0d936d600fb01c649cec951 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Mon, 19 Sep 2022 01:35:46 +0100 Subject: Tidy up LAYOUT macro generation (#18262) --- builddefs/build_keyboard.mk | 24 ++++----- keyboards/ktec/ergodone/ergodone.h | 1 - lib/python/qmk/cli/__init__.py | 1 - lib/python/qmk/cli/generate/keyboard_h.py | 69 +++++++++++++++++++++---- lib/python/qmk/cli/generate/layouts.py | 84 ------------------------------- lib/python/qmk/tests/test_cli_commands.py | 6 --- 6 files changed, 68 insertions(+), 117 deletions(-) delete mode 100755 lib/python/qmk/cli/generate/layouts.py (limited to 'lib/python') diff --git a/builddefs/build_keyboard.mk b/builddefs/build_keyboard.mk index 65bc0451f7..91cd851ef6 100644 --- a/builddefs/build_keyboard.mk +++ b/builddefs/build_keyboard.mk @@ -241,21 +241,20 @@ endif # # https://docs.qmk.fm/#/feature_layouts?id=tips-for-making-layouts-keyboard-agnostic # -QMK_KEYBOARD_H = $(KEYBOARD_OUTPUT)/src/default_keyboard.h ifneq ("$(wildcard $(KEYBOARD_PATH_1)/$(KEYBOARD_FOLDER_1).h)","") - QMK_KEYBOARD_H = $(KEYBOARD_FOLDER_1).h + FOUND_KEYBOARD_H = $(KEYBOARD_FOLDER_1).h endif ifneq ("$(wildcard $(KEYBOARD_PATH_2)/$(KEYBOARD_FOLDER_2).h)","") - QMK_KEYBOARD_H = $(KEYBOARD_FOLDER_2).h + FOUND_KEYBOARD_H = $(KEYBOARD_FOLDER_2).h endif ifneq ("$(wildcard $(KEYBOARD_PATH_3)/$(KEYBOARD_FOLDER_3).h)","") - QMK_KEYBOARD_H = $(KEYBOARD_FOLDER_3).h + FOUND_KEYBOARD_H = $(KEYBOARD_FOLDER_3).h endif ifneq ("$(wildcard $(KEYBOARD_PATH_4)/$(KEYBOARD_FOLDER_4).h)","") - QMK_KEYBOARD_H = $(KEYBOARD_FOLDER_4).h + FOUND_KEYBOARD_H = $(KEYBOARD_FOLDER_4).h endif ifneq ("$(wildcard $(KEYBOARD_PATH_5)/$(KEYBOARD_FOLDER_5).h)","") - QMK_KEYBOARD_H = $(KEYBOARD_FOLDER_5).h + FOUND_KEYBOARD_H = $(KEYBOARD_FOLDER_5).h endif # Determine and set parameters based on the keyboard's processor family. @@ -329,7 +328,7 @@ ifneq ("$(wildcard $(KEYBOARD_PATH_5)/info.json)","") INFO_JSON_FILES += $(KEYBOARD_PATH_5)/info.json endif -CONFIG_H += $(KEYBOARD_OUTPUT)/src/info_config.h $(KEYBOARD_OUTPUT)/src/layouts.h +CONFIG_H += $(KEYBOARD_OUTPUT)/src/info_config.h KEYBOARD_SRC += $(KEYBOARD_OUTPUT)/src/default_keyboard.c $(KEYBOARD_OUTPUT)/src/info_config.h: $(INFO_JSON_FILES) @@ -344,15 +343,10 @@ $(KEYBOARD_OUTPUT)/src/default_keyboard.c: $(INFO_JSON_FILES) $(KEYBOARD_OUTPUT)/src/default_keyboard.h: $(INFO_JSON_FILES) @$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD) - $(eval CMD=$(QMK_BIN) generate-keyboard-h --quiet --keyboard $(KEYBOARD) --output $(KEYBOARD_OUTPUT)/src/default_keyboard.h) + $(eval CMD=$(QMK_BIN) generate-keyboard-h --quiet --keyboard $(KEYBOARD) --include $(FOUND_KEYBOARD_H) --output $(KEYBOARD_OUTPUT)/src/default_keyboard.h) @$(BUILD_CMD) -$(KEYBOARD_OUTPUT)/src/layouts.h: $(INFO_JSON_FILES) - @$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD) - $(eval CMD=$(QMK_BIN) generate-layouts --quiet --keyboard $(KEYBOARD) --output $(KEYBOARD_OUTPUT)/src/layouts.h) - @$(BUILD_CMD) - -generated-files: $(KEYBOARD_OUTPUT)/src/info_config.h $(KEYBOARD_OUTPUT)/src/default_keyboard.c $(KEYBOARD_OUTPUT)/src/default_keyboard.h $(KEYBOARD_OUTPUT)/src/layouts.h +generated-files: $(KEYBOARD_OUTPUT)/src/info_config.h $(KEYBOARD_OUTPUT)/src/default_keyboard.c $(KEYBOARD_OUTPUT)/src/default_keyboard.h .INTERMEDIATE : generated-files @@ -471,7 +465,7 @@ ALL_CONFIGS := $(PROJECT_CONFIG) $(CONFIG_H) OUTPUTS := $(KEYMAP_OUTPUT) $(KEYBOARD_OUTPUT) $(KEYMAP_OUTPUT)_SRC := $(SRC) $(KEYMAP_OUTPUT)_DEFS := $(OPT_DEFS) \ --DQMK_KEYBOARD=\"$(KEYBOARD)\" -DQMK_KEYBOARD_H=\"$(QMK_KEYBOARD_H)\" \ +-DQMK_KEYBOARD=\"$(KEYBOARD)\" -DQMK_KEYBOARD_H=\"$(KEYBOARD_OUTPUT)/src/default_keyboard.h\" \ -DQMK_KEYMAP=\"$(KEYMAP)\" -DQMK_KEYMAP_H=\"$(KEYMAP).h\" -DQMK_KEYMAP_CONFIG_H=\"$(KEYMAP_PATH)/config.h\" $(KEYMAP_OUTPUT)_INC := $(VPATH) $(EXTRAINCDIRS) $(KEYMAP_OUTPUT)_CONFIG := $(CONFIG_H) diff --git a/keyboards/ktec/ergodone/ergodone.h b/keyboards/ktec/ergodone/ergodone.h index 191b1ca2a9..7e7f848d50 100644 --- a/keyboards/ktec/ergodone/ergodone.h +++ b/keyboards/ktec/ergodone/ergodone.h @@ -4,7 +4,6 @@ #pragma once #include "quantum.h" -#include "layouts.h" // Ensure access to info.json layouts // This file only exists to pull in.... #include "ergodox_compat.h" diff --git a/lib/python/qmk/cli/__init__.py b/lib/python/qmk/cli/__init__.py index 02561da1fb..cf5b5ad87e 100644 --- a/lib/python/qmk/cli/__init__.py +++ b/lib/python/qmk/cli/__init__.py @@ -56,7 +56,6 @@ subcommands = [ 'qmk.cli.generate.info_json', 'qmk.cli.generate.keyboard_c', 'qmk.cli.generate.keyboard_h', - 'qmk.cli.generate.layouts', 'qmk.cli.generate.rgb_breathe_table', 'qmk.cli.generate.rules_mk', 'qmk.cli.generate.version_h', diff --git a/lib/python/qmk/cli/generate/keyboard_h.py b/lib/python/qmk/cli/generate/keyboard_h.py index 54ddb4cffd..910bd6a08d 100755 --- a/lib/python/qmk/cli/generate/keyboard_h.py +++ b/lib/python/qmk/cli/generate/keyboard_h.py @@ -1,33 +1,72 @@ """Used by the make system to generate keyboard.h from info.json. """ +from pathlib import Path + from milc import cli +from qmk.path import normpath from qmk.info import info_json from qmk.commands import dump_lines from qmk.keyboard import keyboard_completer, keyboard_folder -from qmk.path import normpath -from qmk.constants import GPL2_HEADER_C_LIKE, GENERATED_HEADER_C_LIKE +from qmk.constants import COL_LETTERS, ROW_LETTERS, GPL2_HEADER_C_LIKE, GENERATED_HEADER_C_LIKE -def would_populate_layout_h(keyboard): - """Detect if a given keyboard is doing data driven layouts +def _generate_layouts(keyboard): + """Generates the layouts.h file. """ # Build the info.json file kb_info_json = info_json(keyboard) + if 'matrix_size' not in kb_info_json: + cli.log.error(f'{keyboard}: Invalid matrix config.') + return [] + + col_num = kb_info_json['matrix_size']['cols'] + row_num = kb_info_json['matrix_size']['rows'] + + lines = [] for layout_name in kb_info_json['layouts']: if kb_info_json['layouts'][layout_name]['c_macro']: continue if 'matrix' not in kb_info_json['layouts'][layout_name]['layout'][0]: - cli.log.debug('%s/%s: No matrix data!', keyboard, layout_name) + cli.log.debug(f'{keyboard}/{layout_name}: No matrix data!') continue - return True + layout_keys = [] + layout_matrix = [['KC_NO' for i in range(col_num)] for i in range(row_num)] + + for i, key in enumerate(kb_info_json['layouts'][layout_name]['layout']): + row = key['matrix'][0] + col = key['matrix'][1] + identifier = 'k%s%s' % (ROW_LETTERS[row], COL_LETTERS[col]) - return False + try: + layout_matrix[row][col] = identifier + layout_keys.append(identifier) + except IndexError: + key_name = key.get('label', identifier) + cli.log.error(f'Matrix data out of bounds for layout {layout_name} at index {i} ({key_name}): [{row}, {col}]') + return [] + lines.append('') + lines.append('#define %s(%s) {\\' % (layout_name, ', '.join(layout_keys))) + rows = ', \\\n'.join(['\t {' + ', '.join(row) + '}' for row in layout_matrix]) + rows += ' \\' + lines.append(rows) + lines.append('}') + + for alias, target in kb_info_json.get('layout_aliases', {}).items(): + lines.append('') + lines.append(f'#ifndef {alias}') + lines.append(f'# define {alias} {target}') + lines.append('#endif') + + return lines + + +@cli.argument('-i', '--include', nargs='?', arg_only=True, help='Optional file to include') @cli.argument('-o', '--output', arg_only=True, type=normpath, help='File to write to') @cli.argument('-q', '--quiet', arg_only=True, action='store_true', help="Quiet mode, only output error messages") @cli.argument('-kb', '--keyboard', arg_only=True, type=keyboard_folder, completer=keyboard_completer, required=True, help='Keyboard to generate keyboard.h for.') @@ -35,13 +74,23 @@ def would_populate_layout_h(keyboard): def generate_keyboard_h(cli): """Generates the keyboard.h file. """ - has_layout_h = would_populate_layout_h(cli.args.keyboard) + keyboard_h = cli.args.include + dd_layouts = _generate_layouts(cli.args.keyboard) + valid_config = dd_layouts or keyboard_h # Build the layouts.h file. keyboard_h_lines = [GPL2_HEADER_C_LIKE, GENERATED_HEADER_C_LIKE, '#pragma once', '#include "quantum.h"'] - if not has_layout_h: - keyboard_h_lines.append('#error(".h is only optional for data driven keyboards - kb.h == bad times")') + keyboard_h_lines.append('') + keyboard_h_lines.append('// Layout content') + if dd_layouts: + keyboard_h_lines.extend(dd_layouts) + if keyboard_h: + keyboard_h_lines.append(f'#include "{Path(keyboard_h).name}"') + + # Protect against poorly configured keyboards + if not valid_config: + keyboard_h_lines.append('#error(".h is required unless your keyboard uses data-driven configuration. Please rename your keyboard\'s header file to .h")') # Show the results dump_lines(cli.args.output, keyboard_h_lines, cli.args.quiet) diff --git a/lib/python/qmk/cli/generate/layouts.py b/lib/python/qmk/cli/generate/layouts.py deleted file mode 100755 index 8336f36b50..0000000000 --- a/lib/python/qmk/cli/generate/layouts.py +++ /dev/null @@ -1,84 +0,0 @@ -"""Used by the make system to generate layouts.h from info.json. -""" -from milc import cli - -from qmk.constants import COL_LETTERS, ROW_LETTERS, GPL2_HEADER_C_LIKE, GENERATED_HEADER_C_LIKE -from qmk.decorators import automagic_keyboard, automagic_keymap -from qmk.info import info_json -from qmk.keyboard import keyboard_completer, keyboard_folder -from qmk.path import is_keyboard, normpath -from qmk.commands import dump_lines - - -@cli.argument('-o', '--output', arg_only=True, type=normpath, help='File to write to') -@cli.argument('-q', '--quiet', arg_only=True, action='store_true', help="Quiet mode, only output error messages") -@cli.argument('-kb', '--keyboard', type=keyboard_folder, completer=keyboard_completer, help='Keyboard to generate config.h for.') -@cli.subcommand('Used by the make system to generate layouts.h from info.json', hidden=True) -@automagic_keyboard -@automagic_keymap -def generate_layouts(cli): - """Generates the layouts.h file. - """ - # Determine our keyboard(s) - if not cli.config.generate_layouts.keyboard: - cli.log.error('Missing parameter: --keyboard') - cli.subcommands['info'].print_help() - return False - - if not is_keyboard(cli.config.generate_layouts.keyboard): - cli.log.error('Invalid keyboard: "%s"', cli.config.generate_layouts.keyboard) - return False - - # Build the info.json file - kb_info_json = info_json(cli.config.generate_layouts.keyboard) - - # Build the layouts.h file. - layouts_h_lines = [GPL2_HEADER_C_LIKE, GENERATED_HEADER_C_LIKE, '#pragma once'] - - if 'matrix_size' not in kb_info_json: - cli.log.error('%s: Invalid matrix config.', cli.config.generate_layouts.keyboard) - return False - - col_num = kb_info_json['matrix_size']['cols'] - row_num = kb_info_json['matrix_size']['rows'] - - for layout_name in kb_info_json['layouts']: - if kb_info_json['layouts'][layout_name]['c_macro']: - continue - - if 'matrix' not in kb_info_json['layouts'][layout_name]['layout'][0]: - cli.log.debug('%s/%s: No matrix data!', cli.config.generate_layouts.keyboard, layout_name) - continue - - layout_keys = [] - layout_matrix = [['KC_NO' for i in range(col_num)] for i in range(row_num)] - - for i, key in enumerate(kb_info_json['layouts'][layout_name]['layout']): - row = key['matrix'][0] - col = key['matrix'][1] - identifier = 'k%s%s' % (ROW_LETTERS[row], COL_LETTERS[col]) - - try: - layout_matrix[row][col] = identifier - layout_keys.append(identifier) - except IndexError: - key_name = key.get('label', identifier) - cli.log.error('Matrix data out of bounds for layout %s at index %s (%s): %s, %s', layout_name, i, key_name, row, col) - return False - - layouts_h_lines.append('') - layouts_h_lines.append('#define %s(%s) {\\' % (layout_name, ', '.join(layout_keys))) - - rows = ', \\\n'.join(['\t {' + ', '.join(row) + '}' for row in layout_matrix]) - rows += ' \\' - layouts_h_lines.append(rows) - layouts_h_lines.append('}') - - for alias, target in kb_info_json.get('layout_aliases', {}).items(): - layouts_h_lines.append('') - layouts_h_lines.append(f'#ifndef {alias}') - layouts_h_lines.append(f'# define {alias} {target}') - layouts_h_lines.append('#endif') - - # Show the results - dump_lines(cli.args.output, layouts_h_lines, cli.args.quiet) diff --git a/lib/python/qmk/tests/test_cli_commands.py b/lib/python/qmk/tests/test_cli_commands.py index 185abb5f21..c8c4e2f80c 100644 --- a/lib/python/qmk/tests/test_cli_commands.py +++ b/lib/python/qmk/tests/test_cli_commands.py @@ -288,12 +288,6 @@ def test_generate_version_h(): assert '#define QMK_VERSION' in result.stdout -def test_generate_layouts(): - result = check_subcommand('generate-layouts', '-kb', 'handwired/pytest/basic') - check_returncode(result) - assert '#define LAYOUT_custom(k0A) {' in result.stdout - - def test_format_json_keyboard(): result = check_subcommand('format-json', '--format', 'keyboard', 'lib/python/qmk/tests/minimal_info.json') check_returncode(result) -- cgit 1.4.1 From 591701cdf9ae3642daa8ba369327692396065438 Mon Sep 17 00:00:00 2001 From: Ryan Date: Wed, 21 Sep 2022 11:41:18 +1000 Subject: Fix incorrect g_led_config generation (#18431) --- lib/python/qmk/info.py | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) (limited to 'lib/python') diff --git a/lib/python/qmk/info.py b/lib/python/qmk/info.py index 834f7d9170..5ca282b2d3 100644 --- a/lib/python/qmk/info.py +++ b/lib/python/qmk/info.py @@ -613,20 +613,24 @@ def _extract_led_config(info_data, keyboard): cols = info_data['matrix_size']['cols'] rows = info_data['matrix_size']['rows'] - # Assume what feature owns g_led_config - feature = "rgb_matrix" - if info_data.get("features", {}).get("led_matrix", False): + # Determine what feature owns g_led_config + features = info_data.get("features", {}) + feature = None + if features.get("rgb_matrix", False): + feature = "rgb_matrix" + elif features.get("led_matrix", False): feature = "led_matrix" - # Process - for file in find_keyboard_c(keyboard): - try: - ret = find_led_config(file, cols, rows) - if ret: - info_data[feature] = info_data.get(feature, {}) - info_data[feature]["layout"] = ret - except Exception as e: - _log_warning(info_data, f'led_config: {file.name}: {e}') + if feature: + # Process + for file in find_keyboard_c(keyboard): + try: + ret = find_led_config(file, cols, rows) + if ret: + info_data[feature] = info_data.get(feature, {}) + info_data[feature]["layout"] = ret + except Exception as e: + _log_warning(info_data, f'led_config: {file.name}: {e}') return info_data -- cgit 1.4.1 From 2f48d300f4fdce10d4183279f68cf4fe355cf605 Mon Sep 17 00:00:00 2001 From: Ryan Date: Thu, 22 Sep 2022 03:31:57 +1000 Subject: Normalise info_config.h define generation (#18439) * Normalise info_config.h define generation * format * Fix tests * Update lib/python/qmk/cli/generate/config_h.py Co-authored-by: Nick Brassel Co-authored-by: Nick Brassel --- lib/python/qmk/cli/generate/config_h.py | 114 ++++++++---------------------- lib/python/qmk/tests/test_cli_commands.py | 20 +++--- 2 files changed, 41 insertions(+), 93 deletions(-) (limited to 'lib/python') diff --git a/lib/python/qmk/cli/generate/config_h.py b/lib/python/qmk/cli/generate/config_h.py index a2178bf1e9..d6e87c8803 100755 --- a/lib/python/qmk/cli/generate/config_h.py +++ b/lib/python/qmk/cli/generate/config_h.py @@ -13,6 +13,14 @@ from qmk.path import normpath from qmk.constants import GPL2_HEADER_C_LIKE, GENERATED_HEADER_C_LIKE +def generate_define(define, value=None): + value = f' {value}' if value is not None else '' + return f""" +#ifndef {define} +# define {define}{value} +#endif // {define}""" + + def direct_pins(direct_pins, postfix): """Return the config.h lines that set the direct pins. """ @@ -22,11 +30,7 @@ def direct_pins(direct_pins, postfix): cols = ','.join(map(str, [col or 'NO_PIN' for col in row])) rows.append('{' + cols + '}') - return f""" -#ifndef DIRECT_PINS{postfix} -# define DIRECT_PINS{postfix} {{ {", ".join(rows)} }} -#endif // DIRECT_PINS{postfix} -""" + return generate_define(f'DIRECT_PINS{postfix}', f'{{ {", ".join(rows)} }}') def pin_array(define, pins, postfix): @@ -34,11 +38,7 @@ def pin_array(define, pins, postfix): """ pin_array = ', '.join(map(str, [pin or 'NO_PIN' for pin in pins])) - return f""" -#ifndef {define}_PINS{postfix} -# define {define}_PINS{postfix} {{ {pin_array} }} -#endif // {define}_PINS{postfix} -""" + return generate_define(f'{define}_PINS{postfix}', f'{{ {pin_array} }}') def matrix_pins(matrix_pins, postfix=''): @@ -62,18 +62,8 @@ def generate_matrix_size(kb_info_json, config_h_lines): """Add the matrix size to the config.h. """ if 'matrix_pins' in kb_info_json: - col_count = kb_info_json['matrix_size']['cols'] - row_count = kb_info_json['matrix_size']['rows'] - - config_h_lines.append(f""" -#ifndef MATRIX_COLS -# define MATRIX_COLS {col_count} -#endif // MATRIX_COLS - -#ifndef MATRIX_ROWS -# define MATRIX_ROWS {row_count} -#endif // MATRIX_ROWS -""") + config_h_lines.append(generate_define('MATRIX_COLS', kb_info_json['matrix_size']['cols'])) + config_h_lines.append(generate_define('MATRIX_ROWS', kb_info_json['matrix_size']['rows'])) def generate_config_items(kb_info_json, config_h_lines): @@ -95,44 +85,23 @@ def generate_config_items(kb_info_json, config_h_lines): continue if key_type.startswith('array.array'): - config_h_lines.append('') - config_h_lines.append(f'#ifndef {config_key}') - config_h_lines.append(f'# define {config_key} {{ {", ".join(["{" + ",".join(list(map(str, x))) + "}" for x in config_value])} }}') - config_h_lines.append(f'#endif // {config_key}') + config_h_lines.append(generate_define(config_key, f'{{ {", ".join(["{" + ",".join(list(map(str, x))) + "}" for x in config_value])} }}')) elif key_type.startswith('array'): - config_h_lines.append('') - config_h_lines.append(f'#ifndef {config_key}') - config_h_lines.append(f'# define {config_key} {{ {", ".join(map(str, config_value))} }}') - config_h_lines.append(f'#endif // {config_key}') + config_h_lines.append(generate_define(config_key, f'{{ {", ".join(map(str, config_value))} }}')) elif key_type == 'bool': if config_value: - config_h_lines.append('') - config_h_lines.append(f'#ifndef {config_key}') - config_h_lines.append(f'# define {config_key}') - config_h_lines.append(f'#endif // {config_key}') + config_h_lines.append(generate_define(config_key)) elif key_type == 'mapping': for key, value in config_value.items(): - config_h_lines.append('') - config_h_lines.append(f'#ifndef {key}') - config_h_lines.append(f'# define {key} {value}') - config_h_lines.append(f'#endif // {key}') + config_h_lines.append(generate_define(key, value)) elif key_type == 'str': escaped_str = config_value.replace('\\', '\\\\').replace('"', '\\"') - config_h_lines.append('') - config_h_lines.append(f'#ifndef {config_key}') - config_h_lines.append(f'# define {config_key} "{escaped_str}"') - config_h_lines.append(f'#endif // {config_key}') + config_h_lines.append(generate_define(config_key, f'"{escaped_str}"')) elif key_type == 'bcd_version': (major, minor, revision) = config_value.split('.') - config_h_lines.append('') - config_h_lines.append(f'#ifndef {config_key}') - config_h_lines.append(f'# define {config_key} 0x{major.zfill(2)}{minor}{revision}') - config_h_lines.append(f'#endif // {config_key}') + config_h_lines.append(generate_define(config_key, f'0x{major.zfill(2)}{minor}{revision}')) else: - config_h_lines.append('') - config_h_lines.append(f'#ifndef {config_key}') - config_h_lines.append(f'# define {config_key} {config_value}') - config_h_lines.append(f'#endif // {config_key}') + config_h_lines.append(generate_define(config_key, config_value)) def generate_encoder_config(encoder_json, config_h_lines, postfix=''): @@ -145,24 +114,15 @@ def generate_encoder_config(encoder_json, config_h_lines, postfix=''): b_pads.append(encoder["pin_b"]) resolutions.append(encoder.get("resolution", None)) - config_h_lines.append(f'#ifndef ENCODERS_PAD_A{postfix}') - config_h_lines.append(f'# define ENCODERS_PAD_A{postfix} {{ { ", ".join(a_pads) } }}') - config_h_lines.append(f'#endif // ENCODERS_PAD_A{postfix}') - - config_h_lines.append(f'#ifndef ENCODERS_PAD_B{postfix}') - config_h_lines.append(f'# define ENCODERS_PAD_B{postfix} {{ { ", ".join(b_pads) } }}') - config_h_lines.append(f'#endif // ENCODERS_PAD_B{postfix}') + config_h_lines.append(generate_define(f'ENCODERS_PAD_A{postfix}', f'{{ {", ".join(a_pads)} }}')) + config_h_lines.append(generate_define(f'ENCODERS_PAD_B{postfix}', f'{{ {", ".join(b_pads)} }}')) if None in resolutions: cli.log.debug("Unable to generate ENCODER_RESOLUTION configuration") elif len(set(resolutions)) == 1: - config_h_lines.append(f'#ifndef ENCODER_RESOLUTION{postfix}') - config_h_lines.append(f'# define ENCODER_RESOLUTION{postfix} { resolutions[0] }') - config_h_lines.append(f'#endif // ENCODER_RESOLUTION{postfix}') + config_h_lines.append(generate_define(f'ENCODER_RESOLUTION{postfix}', resolutions[0])) else: - config_h_lines.append(f'#ifndef ENCODER_RESOLUTIONS{postfix}') - config_h_lines.append(f'# define ENCODER_RESOLUTIONS{postfix} {{ { ", ".join(map(str,resolutions)) } }}') - config_h_lines.append(f'#endif // ENCODER_RESOLUTIONS{postfix}') + config_h_lines.append(generate_define(f'ENCODER_RESOLUTIONS{postfix}', f'{{ {", ".join(map(str,resolutions))} }}')) def generate_split_config(kb_info_json, config_h_lines): @@ -171,35 +131,23 @@ def generate_split_config(kb_info_json, config_h_lines): if kb_info_json['split']['primary'] in ('left', 'right'): config_h_lines.append('') config_h_lines.append('#ifndef MASTER_LEFT') - config_h_lines.append('# ifndef MASTER_RIGHT') + config_h_lines.append('# ifndef MASTER_RIGHT') if kb_info_json['split']['primary'] == 'left': - config_h_lines.append('# define MASTER_LEFT') + config_h_lines.append('# define MASTER_LEFT') elif kb_info_json['split']['primary'] == 'right': - config_h_lines.append('# define MASTER_RIGHT') - config_h_lines.append('# endif // MASTER_RIGHT') + config_h_lines.append('# define MASTER_RIGHT') + config_h_lines.append('# endif // MASTER_RIGHT') config_h_lines.append('#endif // MASTER_LEFT') elif kb_info_json['split']['primary'] == 'pin': - config_h_lines.append('') - config_h_lines.append('#ifndef SPLIT_HAND_PIN') - config_h_lines.append('# define SPLIT_HAND_PIN') - config_h_lines.append('#endif // SPLIT_HAND_PIN') + config_h_lines.append(generate_define('SPLIT_HAND_PIN')) elif kb_info_json['split']['primary'] == 'matrix_grid': - config_h_lines.append('') - config_h_lines.append('#ifndef SPLIT_HAND_MATRIX_GRID') - config_h_lines.append('# define SPLIT_HAND_MATRIX_GRID {%s}' % (','.join(kb_info_json["split"]["matrix_grid"],))) - config_h_lines.append('#endif // SPLIT_HAND_MATRIX_GRID') + config_h_lines.append(generate_define('SPLIT_HAND_MATRIX_GRID', f'{{ {",".join(kb_info_json["split"]["matrix_grid"])} }}')) elif kb_info_json['split']['primary'] == 'eeprom': - config_h_lines.append('') - config_h_lines.append('#ifndef EE_HANDS') - config_h_lines.append('# define EE_HANDS') - config_h_lines.append('#endif // EE_HANDS') + config_h_lines.append(generate_define('EE_HANDS')) if 'protocol' in kb_info_json['split'].get('transport', {}): if kb_info_json['split']['transport']['protocol'] == 'i2c': - config_h_lines.append('') - config_h_lines.append('#ifndef USE_I2C') - config_h_lines.append('# define USE_I2C') - config_h_lines.append('#endif // USE_I2C') + config_h_lines.append(generate_define('USE_I2C')) if 'right' in kb_info_json['split'].get('matrix_pins', {}): config_h_lines.append(matrix_pins(kb_info_json['split']['matrix_pins']['right'], '_RIGHT')) diff --git a/lib/python/qmk/tests/test_cli_commands.py b/lib/python/qmk/tests/test_cli_commands.py index c8c4e2f80c..9bfc5a0a79 100644 --- a/lib/python/qmk/tests/test_cli_commands.py +++ b/lib/python/qmk/tests/test_cli_commands.py @@ -263,16 +263,16 @@ def test_generate_rgb_breathe_table(): def test_generate_config_h(): result = check_subcommand('generate-config-h', '-kb', 'handwired/pytest/basic') check_returncode(result) - assert '# define DEVICE_VER 0x0001' in result.stdout - assert '# define DIODE_DIRECTION COL2ROW' in result.stdout - assert '# define MANUFACTURER "none"' in result.stdout - assert '# define PRODUCT "pytest"' in result.stdout - assert '# define PRODUCT_ID 0x6465' in result.stdout - assert '# define VENDOR_ID 0xFEED' in result.stdout - assert '# define MATRIX_COLS 1' in result.stdout - assert '# define MATRIX_COL_PINS { F4 }' in result.stdout - assert '# define MATRIX_ROWS 1' in result.stdout - assert '# define MATRIX_ROW_PINS { F5 }' in result.stdout + assert '# define DEVICE_VER 0x0001' in result.stdout + assert '# define DIODE_DIRECTION COL2ROW' in result.stdout + assert '# define MANUFACTURER "none"' in result.stdout + assert '# define PRODUCT "pytest"' in result.stdout + assert '# define PRODUCT_ID 0x6465' in result.stdout + assert '# define VENDOR_ID 0xFEED' in result.stdout + assert '# define MATRIX_COLS 1' in result.stdout + assert '# define MATRIX_COL_PINS { F4 }' in result.stdout + assert '# define MATRIX_ROWS 1' in result.stdout + assert '# define MATRIX_ROW_PINS { F5 }' in result.stdout def test_generate_rules_mk(): -- cgit 1.4.1 From 675d91b813db6488ccc1ca55555ebbf0d4a45dc0 Mon Sep 17 00:00:00 2001 From: Ryan Date: Mon, 26 Sep 2022 10:04:21 +1000 Subject: Generate DD RGBLight/LED/RGB Matrix animation defines (#18459) --- data/mappings/info_config.json | 10 ---------- data/schemas/keyboard.jsonschema | 12 ++++++++++++ lib/python/qmk/cli/generate/config_h.py | 15 +++++++++++++++ 3 files changed, 27 insertions(+), 10 deletions(-) (limited to 'lib/python') diff --git a/data/mappings/info_config.json b/data/mappings/info_config.json index b27081e037..49b0a1bfe0 100644 --- a/data/mappings/info_config.json +++ b/data/mappings/info_config.json @@ -64,16 +64,6 @@ "RGB_DI_PIN": {"info_key": "rgblight.pin"}, "RGBLED_NUM": {"info_key": "rgblight.led_count", "value_type": "int"}, "RGBLED_SPLIT": {"info_key": "rgblight.split_count", "value_type": "array.int"}, - "RGBLIGHT_EFFECT_ALTERNATING": {"info_key": "rgblight.animations.alternating", "value_type": "bool"}, - "RGBLIGHT_EFFECT_BREATHING": {"info_key": "rgblight.animations.breathing", "value_type": "bool"}, - "RGBLIGHT_EFFECT_CHRISTMAS": {"info_key": "rgblight.animations.christmas", "value_type": "bool"}, - "RGBLIGHT_EFFECT_KNIGHT": {"info_key": "rgblight.animations.knight", "value_type": "bool"}, - "RGBLIGHT_EFFECT_RAINBOW_MOOD": {"info_key": "rgblight.animations.rainbow_mood", "value_type": "bool"}, - "RGBLIGHT_EFFECT_RAINBOW_SWIRL": {"info_key": "rgblight.animations.rainbow_swirl", "value_type": "bool"}, - "RGBLIGHT_EFFECT_RGB_TEST": {"info_key": "rgblight.animations.rgb_test", "value_type": "bool"}, - "RGBLIGHT_EFFECT_SNAKE": {"info_key": "rgblight.animations.snake", "value_type": "bool"}, - "RGBLIGHT_EFFECT_STATIC_GRADIENT": {"info_key": "rgblight.animations.static_gradient", "value_type": "bool"}, - "RGBLIGHT_EFFECT_TWINKLE": {"info_key": "rgblight.animations.twinkle"}, "RGBLIGHT_LAYER_BLINK": {"info_key": "rgblight.layers.blink", "value_type": "bool"}, "RGBLIGHT_LAYERS": {"info_key": "rgblight.layers.enabled", "value_type": "bool"}, "RGBLIGHT_LAYERS_OVERRIDE_RGB_OFF": {"info_key": "rgblight.layers.override_rgb", "value_type": "bool"}, diff --git a/data/schemas/keyboard.jsonschema b/data/schemas/keyboard.jsonschema index ff5163e737..1906ce5f75 100644 --- a/data/schemas/keyboard.jsonschema +++ b/data/schemas/keyboard.jsonschema @@ -264,6 +264,12 @@ "led_matrix": { "type": "object", "properties": { + "animations": { + "type": "object", + "additionalProperties": { + "type": "boolean" + } + }, "driver": {"type": "string"}, "center_point": { "type": "array", @@ -308,6 +314,12 @@ "rgb_matrix": { "type": "object", "properties": { + "animations": { + "type": "object", + "additionalProperties": { + "type": "boolean" + } + }, "driver": {"type": "string"}, "center_point": { "type": "array", diff --git a/lib/python/qmk/cli/generate/config_h.py b/lib/python/qmk/cli/generate/config_h.py index d6e87c8803..3752174841 100755 --- a/lib/python/qmk/cli/generate/config_h.py +++ b/lib/python/qmk/cli/generate/config_h.py @@ -156,6 +156,12 @@ def generate_split_config(kb_info_json, config_h_lines): generate_encoder_config(kb_info_json['split']['encoder']['right'], config_h_lines, '_RIGHT') +def generate_led_animations_config(led_feature_json, config_h_lines, prefix): + for animation in led_feature_json.get('animations', {}): + if led_feature_json['animations'][animation]: + config_h_lines.append(generate_define(f'{prefix}{animation.upper()}')) + + @cli.argument('-o', '--output', arg_only=True, type=normpath, help='File to write to') @cli.argument('-q', '--quiet', arg_only=True, action='store_true', help="Quiet mode, only output error messages") @cli.argument('-kb', '--keyboard', arg_only=True, type=keyboard_folder, completer=keyboard_completer, required=True, help='Keyboard to generate config.h for.') @@ -186,5 +192,14 @@ def generate_config_h(cli): if 'split' in kb_info_json: generate_split_config(kb_info_json, config_h_lines) + if 'led_matrix' in kb_info_json: + generate_led_animations_config(kb_info_json['led_matrix'], config_h_lines, 'ENABLE_LED_MATRIX_') + + if 'rgb_matrix' in kb_info_json: + generate_led_animations_config(kb_info_json['rgb_matrix'], config_h_lines, 'ENABLE_RGB_MATRIX_') + + if 'rgblight' in kb_info_json: + generate_led_animations_config(kb_info_json['rgblight'], config_h_lines, 'RGBLIGHT_EFFECT_') + # Show the results dump_lines(cli.args.output, config_h_lines, cli.args.quiet) -- cgit 1.4.1 From fc0330a54a180c6e0d9de93277f23421ea143c03 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Wed, 19 Oct 2022 11:29:44 +0100 Subject: Correctly build keymap.json containing additional config (#18766) --- lib/python/qmk/commands.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) (limited to 'lib/python') diff --git a/lib/python/qmk/commands.py b/lib/python/qmk/commands.py index 9c0a5dce56..2ab506c710 100644 --- a/lib/python/qmk/commands.py +++ b/lib/python/qmk/commands.py @@ -2,13 +2,13 @@ """ import os import sys +import json import shutil from pathlib import Path from milc import cli import jsonschema -import qmk.keymap from qmk.constants import KEYBOARD_OUTPUT_PREFIX from qmk.json_schema import json_load, validate @@ -134,12 +134,11 @@ def compile_configurator_json(user_keymap, bootloader=None, parallel=1, **env_va target = f'{keyboard_filesafe}_{user_keymap["keymap"]}' keyboard_output = Path(f'{KEYBOARD_OUTPUT_PREFIX}{keyboard_filesafe}') keymap_output = Path(f'{keyboard_output}_{user_keymap["keymap"]}') - c_text = qmk.keymap.generate_c(user_keymap) keymap_dir = keymap_output / 'src' - keymap_c = keymap_dir / 'keymap.c' + keymap_json = keymap_dir / 'keymap.json' keymap_dir.mkdir(exist_ok=True, parents=True) - keymap_c.write_text(c_text) + keymap_json.write_text(json.dumps(user_keymap), encoding='utf-8') # Return a command that can be run to make the keymap and flash if given verbose = 'true' if cli.config.general.verbose else 'false' @@ -175,7 +174,7 @@ def compile_configurator_json(user_keymap, bootloader=None, parallel=1, **env_va f'MAIN_KEYMAP_PATH_3={keymap_output}', f'MAIN_KEYMAP_PATH_4={keymap_output}', f'MAIN_KEYMAP_PATH_5={keymap_output}', - f'KEYMAP_C={keymap_c}', + f'KEYMAP_JSON={keymap_json}', f'KEYMAP_PATH={keymap_dir}', f'VERBOSE={verbose}', f'COLOR={color}', -- cgit 1.4.1 From aa8e0a3e7aa9268136fea31d5fd5832e91c0ccc4 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Wed, 19 Oct 2022 17:43:25 +0100 Subject: Build correctly when out of tree (#18775) --- builddefs/build_keyboard.mk | 4 ++-- lib/python/qmk/cli/generate/config_h.py | 24 +++++++++++++++--------- lib/python/qmk/cli/generate/rules_mk.py | 24 +++++++++++++++--------- 3 files changed, 32 insertions(+), 20 deletions(-) (limited to 'lib/python') diff --git a/builddefs/build_keyboard.mk b/builddefs/build_keyboard.mk index c137639eac..cfec9cdebe 100644 --- a/builddefs/build_keyboard.mk +++ b/builddefs/build_keyboard.mk @@ -162,7 +162,7 @@ ifneq ("$(wildcard $(KEYMAP_JSON))", "") -include $(KEYMAP_PATH)/rules.mk # Load any rules.mk content from keymap.json - INFO_RULES_MK = $(shell $(QMK_BIN) generate-rules-mk --quiet --escape --keyboard $(KEYBOARD) --keymap $(KEYMAP) --output $(KEYMAP_OUTPUT)/src/rules.mk) + INFO_RULES_MK = $(shell $(QMK_BIN) generate-rules-mk --quiet --escape --output $(KEYMAP_OUTPUT)/src/rules.mk $(KEYMAP_JSON)) include $(INFO_RULES_MK) # Add rules to generate the keymap files - indentation here is important @@ -173,7 +173,7 @@ $(KEYMAP_OUTPUT)/src/keymap.c: $(KEYMAP_JSON) $(KEYMAP_OUTPUT)/src/config.h: $(KEYMAP_JSON) @$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD) - $(eval CMD=$(QMK_BIN) generate-config-h --quiet --keyboard $(KEYBOARD) --keymap $(KEYMAP) --output $(KEYMAP_H)) + $(eval CMD=$(QMK_BIN) generate-config-h --quiet --output $(KEYMAP_H) $(KEYMAP_JSON)) @$(BUILD_CMD) generated-files: $(KEYMAP_OUTPUT)/src/config.h $(KEYMAP_OUTPUT)/src/keymap.c diff --git a/lib/python/qmk/cli/generate/config_h.py b/lib/python/qmk/cli/generate/config_h.py index 3752174841..fa7c43788d 100755 --- a/lib/python/qmk/cli/generate/config_h.py +++ b/lib/python/qmk/cli/generate/config_h.py @@ -1,15 +1,16 @@ """Used by the make system to generate info_config.h from info.json. """ from pathlib import Path - from dotty_dict import dotty + +from argcomplete.completers import FilesCompleter from milc import cli -from qmk.info import info_json, keymap_json_config +from qmk.info import info_json from qmk.json_schema import json_load from qmk.keyboard import keyboard_completer, keyboard_folder -from qmk.commands import dump_lines -from qmk.path import normpath +from qmk.commands import dump_lines, parse_configurator_json +from qmk.path import normpath, FileType from qmk.constants import GPL2_HEADER_C_LIKE, GENERATED_HEADER_C_LIKE @@ -162,19 +163,24 @@ def generate_led_animations_config(led_feature_json, config_h_lines, prefix): config_h_lines.append(generate_define(f'{prefix}{animation.upper()}')) +@cli.argument('filename', nargs='?', arg_only=True, type=FileType('r'), completer=FilesCompleter('.json'), help='A configurator export JSON to be compiled and flashed or a pre-compiled binary firmware file (bin/hex) to be flashed.') @cli.argument('-o', '--output', arg_only=True, type=normpath, help='File to write to') @cli.argument('-q', '--quiet', arg_only=True, action='store_true', help="Quiet mode, only output error messages") -@cli.argument('-kb', '--keyboard', arg_only=True, type=keyboard_folder, completer=keyboard_completer, required=True, help='Keyboard to generate config.h for.') -@cli.argument('-km', '--keymap', arg_only=True, help='Keymap to generate config.h for.') +@cli.argument('-kb', '--keyboard', arg_only=True, type=keyboard_folder, completer=keyboard_completer, help='Keyboard to generate config.h for.') @cli.subcommand('Used by the make system to generate info_config.h from info.json', hidden=True) def generate_config_h(cli): """Generates the info_config.h file. """ # Determine our keyboard/keymap - if cli.args.keymap: - kb_info_json = dotty(keymap_json_config(cli.args.keyboard, cli.args.keymap)) - else: + if cli.args.filename: + user_keymap = parse_configurator_json(cli.args.filename) + kb_info_json = user_keymap.get('config', {}) + elif cli.args.keyboard: kb_info_json = dotty(info_json(cli.args.keyboard)) + else: + cli.log.error('You must supply a configurator export or `--keyboard`.') + cli.subcommands['generate-config-h'].print_help() + return False # Build the info_config.h file. config_h_lines = [GPL2_HEADER_C_LIKE, GENERATED_HEADER_C_LIKE, '#pragma once'] diff --git a/lib/python/qmk/cli/generate/rules_mk.py b/lib/python/qmk/cli/generate/rules_mk.py index 9623d00fb5..361d3c758a 100755 --- a/lib/python/qmk/cli/generate/rules_mk.py +++ b/lib/python/qmk/cli/generate/rules_mk.py @@ -1,15 +1,16 @@ """Used by the make system to generate a rules.mk """ from pathlib import Path - from dotty_dict import dotty + +from argcomplete.completers import FilesCompleter from milc import cli -from qmk.info import info_json, keymap_json_config +from qmk.info import info_json from qmk.json_schema import json_load from qmk.keyboard import keyboard_completer, keyboard_folder -from qmk.commands import dump_lines -from qmk.path import normpath +from qmk.commands import dump_lines, parse_configurator_json +from qmk.path import normpath, FileType from qmk.constants import GPL2_HEADER_SH_LIKE, GENERATED_HEADER_SH_LIKE @@ -39,20 +40,25 @@ def process_mapping_rule(kb_info_json, rules_key, info_dict): return f'{rules_key} ?= {rules_value}' +@cli.argument('filename', nargs='?', arg_only=True, type=FileType('r'), completer=FilesCompleter('.json'), help='A configurator export JSON to be compiled and flashed or a pre-compiled binary firmware file (bin/hex) to be flashed.') @cli.argument('-o', '--output', arg_only=True, type=normpath, help='File to write to') @cli.argument('-q', '--quiet', arg_only=True, action='store_true', help="Quiet mode, only output error messages") @cli.argument('-e', '--escape', arg_only=True, action='store_true', help="Escape spaces in quiet mode") -@cli.argument('-kb', '--keyboard', arg_only=True, type=keyboard_folder, completer=keyboard_completer, required=True, help='Keyboard to generate rules.mk for.') -@cli.argument('-km', '--keymap', arg_only=True, help='Keymap to generate rules.mk for.') +@cli.argument('-kb', '--keyboard', arg_only=True, type=keyboard_folder, completer=keyboard_completer, help='Keyboard to generate rules.mk for.') @cli.subcommand('Used by the make system to generate rules.mk from info.json', hidden=True) def generate_rules_mk(cli): """Generates a rules.mk file from info.json. """ # Determine our keyboard/keymap - if cli.args.keymap: - kb_info_json = dotty(keymap_json_config(cli.args.keyboard, cli.args.keymap)) - else: + if cli.args.filename: + user_keymap = parse_configurator_json(cli.args.filename) + kb_info_json = user_keymap.get('config', {}) + elif cli.args.keyboard: kb_info_json = dotty(info_json(cli.args.keyboard)) + else: + cli.log.error('You must supply a configurator export or `--keyboard`.') + cli.subcommands['generate-rules-mk'].print_help() + return False info_rules_map = json_load(Path('data/mappings/info_rules.json')) rules_mk_lines = [GPL2_HEADER_SH_LIKE, GENERATED_HEADER_SH_LIKE] -- cgit 1.4.1 From 0b41c13509b5547028f141d869e10199566a1228 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Thu, 20 Oct 2022 14:35:27 +0100 Subject: [CLI] Ensure consistent clean behaviour (#18781) --- lib/python/qmk/cli/compile.py | 57 +++++++++---------------- lib/python/qmk/cli/flash.py | 99 +++++++++++++++++-------------------------- lib/python/qmk/commands.py | 35 +++++++++++++-- 3 files changed, 91 insertions(+), 100 deletions(-) (limited to 'lib/python') diff --git a/lib/python/qmk/cli/compile.py b/lib/python/qmk/cli/compile.py index 95118e6687..9e7629906f 100755 --- a/lib/python/qmk/cli/compile.py +++ b/lib/python/qmk/cli/compile.py @@ -2,14 +2,13 @@ You can compile a keymap already in the repo or using a QMK Configurator export. """ -from subprocess import DEVNULL - from argcomplete.completers import FilesCompleter + from milc import cli import qmk.path from qmk.decorators import automagic_keyboard, automagic_keymap -from qmk.commands import compile_configurator_json, create_make_command, parse_configurator_json +from qmk.commands import compile_configurator_json, create_make_command, parse_configurator_json, build_environment from qmk.keyboard import keyboard_completer, keyboard_folder from qmk.keymap import keymap_completer @@ -31,48 +30,32 @@ def compile(cli): If a keyboard and keymap are provided this command will build a firmware based on that. """ - if cli.args.clean and not cli.args.filename and not cli.args.dry_run: - if cli.config.compile.keyboard and cli.config.compile.keymap: - command = create_make_command(cli.config.compile.keyboard, cli.config.compile.keymap, 'clean') - cli.run(command, capture_output=False, stdin=DEVNULL) - # Build the environment vars - envs = {} - for env in cli.args.env: - if '=' in env: - key, value = env.split('=', 1) - envs[key] = value - else: - cli.log.warning('Invalid environment variable: %s', env) + envs = build_environment(cli.args.env) # Determine the compile command - command = None + commands = [] if cli.args.filename: # If a configurator JSON was provided generate a keymap and compile it user_keymap = parse_configurator_json(cli.args.filename) - command = compile_configurator_json(user_keymap, parallel=cli.config.compile.parallel, **envs) + commands = [compile_configurator_json(user_keymap, parallel=cli.config.compile.parallel, clean=cli.args.clean, **envs)] - else: - if cli.config.compile.keyboard and cli.config.compile.keymap: - # Generate the make command for a specific keyboard/keymap. - command = create_make_command(cli.config.compile.keyboard, cli.config.compile.keymap, parallel=cli.config.compile.parallel, **envs) + elif cli.config.compile.keyboard and cli.config.compile.keymap: + # Generate the make command for a specific keyboard/keymap. + if cli.args.clean: + commands.append(create_make_command(cli.config.compile.keyboard, cli.config.compile.keymap, 'clean', **envs)) + commands.append(create_make_command(cli.config.compile.keyboard, cli.config.compile.keymap, parallel=cli.config.compile.parallel, **envs)) - elif not cli.config.compile.keyboard: - cli.log.error('Could not determine keyboard!') - elif not cli.config.compile.keymap: - cli.log.error('Could not determine keymap!') - - # Compile the firmware, if we're able to - if command: - cli.log.info('Compiling keymap with {fg_cyan}%s', ' '.join(command)) - if not cli.args.dry_run: - cli.echo('\n') - # FIXME(skullydazed/anyone): Remove text=False once milc 1.0.11 has had enough time to be installed everywhere. - compile = cli.run(command, capture_output=False, text=False) - return compile.returncode - - else: + if not commands: cli.log.error('You must supply a configurator export, both `--keyboard` and `--keymap`, or be in a directory for a keyboard or keymap.') - cli.echo('usage: qmk compile [-h] [-b] [-kb KEYBOARD] [-km KEYMAP] [filename]') + cli.print_help() return False + + cli.log.info('Compiling keymap with {fg_cyan}%s', ' '.join(commands[-1])) + if not cli.args.dry_run: + cli.echo('\n') + for command in commands: + ret = cli.run(command, capture_output=False) + if ret.returncode: + return ret.returncode diff --git a/lib/python/qmk/cli/flash.py b/lib/python/qmk/cli/flash.py index c39f4b36d4..40bfbdab56 100644 --- a/lib/python/qmk/cli/flash.py +++ b/lib/python/qmk/cli/flash.py @@ -3,15 +3,13 @@ You can compile a keymap already in the repo or using a QMK Configurator export. A bootloader must be specified. """ -from subprocess import DEVNULL -import sys - from argcomplete.completers import FilesCompleter + from milc import cli import qmk.path from qmk.decorators import automagic_keyboard, automagic_keymap -from qmk.commands import compile_configurator_json, create_make_command, parse_configurator_json +from qmk.commands import compile_configurator_json, create_make_command, parse_configurator_json, build_environment from qmk.keyboard import keyboard_completer, keyboard_folder from qmk.flashers import flasher @@ -75,59 +73,40 @@ def flash(cli): return False except KeyboardInterrupt: cli.log.info('Ctrl-C was pressed, exiting...') - sys.exit(0) - - else: - if cli.args.clean and not cli.args.filename and not cli.args.dry_run: - if cli.config.flash.keyboard and cli.config.flash.keymap: - command = create_make_command(cli.config.flash.keyboard, cli.config.flash.keymap, 'clean') - cli.run(command, capture_output=False, stdin=DEVNULL) - - # Build the environment vars - envs = {} - for env in cli.args.env: - if '=' in env: - key, value = env.split('=', 1) - envs[key] = value - else: - cli.log.warning('Invalid environment variable: %s', env) - - # Determine the compile command - command = '' - - if cli.args.bootloaders: - # Provide usage and list bootloaders - cli.echo('usage: qmk flash [-h] [-b] [-n] [-kb KEYBOARD] [-km KEYMAP] [-bl BOOTLOADER] [filename]') - print_bootloader_help() - return False - - if cli.args.filename: - # Handle compiling a configurator JSON - user_keymap = parse_configurator_json(cli.args.filename) - keymap_path = qmk.path.keymap(user_keymap['keyboard']) - command = compile_configurator_json(user_keymap, cli.args.bootloader, parallel=cli.config.flash.parallel, **envs) - - cli.log.info('Wrote keymap to {fg_cyan}%s/%s/keymap.c', keymap_path, user_keymap['keymap']) - - else: - if cli.config.flash.keyboard and cli.config.flash.keymap: - # Generate the make command for a specific keyboard/keymap. - command = create_make_command(cli.config.flash.keyboard, cli.config.flash.keymap, cli.args.bootloader, parallel=cli.config.flash.parallel, **envs) - - elif not cli.config.flash.keyboard: - cli.log.error('Could not determine keyboard!') - elif not cli.config.flash.keymap: - cli.log.error('Could not determine keymap!') - - # Compile the firmware, if we're able to - if command: - cli.log.info('Compiling keymap with {fg_cyan}%s', ' '.join(command)) - if not cli.args.dry_run: - cli.echo('\n') - compile = cli.run(command, capture_output=False, stdin=DEVNULL) - return compile.returncode - - else: - cli.log.error('You must supply a configurator export, both `--keyboard` and `--keymap`, or be in a directory for a keyboard or keymap.') - cli.echo('usage: qmk flash [-h] [-b] [-n] [-kb KEYBOARD] [-km KEYMAP] [-bl BOOTLOADER] [filename]') - return False + return True + + if cli.args.bootloaders: + # Provide usage and list bootloaders + cli.print_help() + print_bootloader_help() + return False + + # Build the environment vars + envs = build_environment(cli.args.env) + + # Determine the compile command + commands = [] + + if cli.args.filename: + # If a configurator JSON was provided generate a keymap and compile it + user_keymap = parse_configurator_json(cli.args.filename) + commands = [compile_configurator_json(user_keymap, cli.args.bootloader, parallel=cli.config.flash.parallel, clean=cli.args.clean, **envs)] + + elif cli.config.flash.keyboard and cli.config.flash.keymap: + # Generate the make command for a specific keyboard/keymap. + if cli.args.clean: + commands.append(create_make_command(cli.config.flash.keyboard, cli.config.flash.keymap, 'clean', **envs)) + commands.append(create_make_command(cli.config.flash.keyboard, cli.config.flash.keymap, cli.args.bootloader, parallel=cli.config.flash.parallel, **envs)) + + if not commands: + cli.log.error('You must supply a configurator export, both `--keyboard` and `--keymap`, or be in a directory for a keyboard or keymap.') + cli.print_help() + return False + + cli.log.info('Compiling keymap with {fg_cyan}%s', ' '.join(commands[-1])) + if not cli.args.dry_run: + cli.echo('\n') + for command in commands: + ret = cli.run(command, capture_output=False) + if ret.returncode: + return ret.returncode diff --git a/lib/python/qmk/commands.py b/lib/python/qmk/commands.py index 2ab506c710..07826a4866 100644 --- a/lib/python/qmk/commands.py +++ b/lib/python/qmk/commands.py @@ -107,7 +107,7 @@ def get_make_parallel_args(parallel=1): return parallel_args -def compile_configurator_json(user_keymap, bootloader=None, parallel=1, **env_vars): +def compile_configurator_json(user_keymap, bootloader=None, parallel=1, clean=False, **env_vars): """Convert a configurator export JSON file into a C file and then compile it. Args: @@ -129,7 +129,6 @@ def compile_configurator_json(user_keymap, bootloader=None, parallel=1, **env_va # e.g.: qmk compile - < keyboards/clueboard/california/keymaps/default/keymap.json user_keymap["keymap"] = user_keymap.get("keymap", "default_json") - # Write the keymap.c file keyboard_filesafe = user_keymap['keyboard'].replace('/', '_') target = f'{keyboard_filesafe}_{user_keymap["keymap"]}' keyboard_output = Path(f'{KEYBOARD_OUTPUT_PREFIX}{keyboard_filesafe}') @@ -137,8 +136,25 @@ def compile_configurator_json(user_keymap, bootloader=None, parallel=1, **env_va keymap_dir = keymap_output / 'src' keymap_json = keymap_dir / 'keymap.json' + if clean: + if keyboard_output.exists(): + shutil.rmtree(keyboard_output) + if keymap_output.exists(): + shutil.rmtree(keymap_output) + + # begin with making the deepest folder in the tree keymap_dir.mkdir(exist_ok=True, parents=True) - keymap_json.write_text(json.dumps(user_keymap), encoding='utf-8') + + # Compare minified to ensure consistent comparison + new_content = json.dumps(user_keymap, separators=(',', ':')) + if keymap_json.exists(): + old_content = json.dumps(json.loads(keymap_json.read_text(encoding='utf-8')), separators=(',', ':')) + if old_content == new_content: + new_content = None + + # Write the keymap.json file if different + if new_content: + keymap_json.write_text(new_content, encoding='utf-8') # Return a command that can be run to make the keymap and flash if given verbose = 'true' if cli.config.general.verbose else 'false' @@ -210,6 +226,19 @@ def parse_configurator_json(configurator_file): return user_keymap +def build_environment(args): + """Common processing for cli.args.env + """ + envs = {} + for env in args: + if '=' in env: + key, value = env.split('=', 1) + envs[key] = value + else: + cli.log.warning('Invalid environment variable: %s', env) + return envs + + def in_virtualenv(): """Check if running inside a virtualenv. Based on https://stackoverflow.com/a/1883251 -- cgit 1.4.1 From 345f19a5d763053cd9cea6698656d4a2a1000b23 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Fri, 21 Oct 2022 02:21:17 +0100 Subject: Add converter support to keymap.json (#18776) --- data/schemas/keymap.jsonschema | 4 ++++ lib/python/qmk/cli/generate/config_h.py | 2 +- lib/python/qmk/cli/generate/rules_mk.py | 7 ++++++- 3 files changed, 11 insertions(+), 2 deletions(-) (limited to 'lib/python') diff --git a/data/schemas/keymap.jsonschema b/data/schemas/keymap.jsonschema index 0a4fb5d453..1b8d01bcc6 100644 --- a/data/schemas/keymap.jsonschema +++ b/data/schemas/keymap.jsonschema @@ -5,6 +5,10 @@ "type": "object", "properties": { "author": {"type": "string"}, + "converter": { + "type": "string", + "enum": ["elite_pi", "proton_c", "kb2040", "promicro_rp2040", "blok", "bit_c_pro", "stemcell", "bonsai_c4"] + }, "host_language": {"$ref": "qmk.definitions.v1#/text_identifier"}, "keyboard": {"$ref": "qmk.definitions.v1#/text_identifier"}, "keymap": {"$ref": "qmk.definitions.v1#/text_identifier"}, diff --git a/lib/python/qmk/cli/generate/config_h.py b/lib/python/qmk/cli/generate/config_h.py index fa7c43788d..f64daba134 100755 --- a/lib/python/qmk/cli/generate/config_h.py +++ b/lib/python/qmk/cli/generate/config_h.py @@ -174,7 +174,7 @@ def generate_config_h(cli): # Determine our keyboard/keymap if cli.args.filename: user_keymap = parse_configurator_json(cli.args.filename) - kb_info_json = user_keymap.get('config', {}) + kb_info_json = dotty(user_keymap.get('config', {})) elif cli.args.keyboard: kb_info_json = dotty(info_json(cli.args.keyboard)) else: diff --git a/lib/python/qmk/cli/generate/rules_mk.py b/lib/python/qmk/cli/generate/rules_mk.py index 361d3c758a..1d708f371e 100755 --- a/lib/python/qmk/cli/generate/rules_mk.py +++ b/lib/python/qmk/cli/generate/rules_mk.py @@ -49,10 +49,12 @@ def process_mapping_rule(kb_info_json, rules_key, info_dict): def generate_rules_mk(cli): """Generates a rules.mk file from info.json. """ + converter = None # Determine our keyboard/keymap if cli.args.filename: user_keymap = parse_configurator_json(cli.args.filename) - kb_info_json = user_keymap.get('config', {}) + kb_info_json = dotty(user_keymap.get('config', {})) + converter = user_keymap.get('converter', None) elif cli.args.keyboard: kb_info_json = dotty(info_json(cli.args.keyboard)) else: @@ -88,6 +90,9 @@ def generate_rules_mk(cli): else: rules_mk_lines.append('CUSTOM_MATRIX ?= yes') + if converter: + rules_mk_lines.append(f'CONVERT_TO ?= {converter}') + # Show the results dump_lines(cli.args.output, rules_mk_lines) -- cgit 1.4.1 From a69ab05dd687cb9aa38e0c125e4f64956c7da6c7 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Sat, 5 Nov 2022 10:30:09 +0000 Subject: Initial DD keycode migration (#18643) * Initial DD keycode migration * Sort magic keycodes --- data/constants/keycodes/keycodes_0.0.1.hjson | 96 ++ data/constants/keycodes/keycodes_0.0.1_audio.hjson | 84 ++ data/constants/keycodes/keycodes_0.0.1_basic.hjson | 1515 ++++++++++++++++++++ .../keycodes/keycodes_0.0.1_joystick.hjson | 228 +++ .../keycodes/keycodes_0.0.1_lighting.hjson | 154 ++ data/constants/keycodes/keycodes_0.0.1_macro.hjson | 133 ++ data/constants/keycodes/keycodes_0.0.1_magic.hjson | 249 ++++ data/constants/keycodes/keycodes_0.0.1_midi.hjson | 670 +++++++++ .../keycodes_0.0.1_programmable_button.hjson | 228 +++ .../keycodes/keycodes_0.0.1_quantum.hjson | 464 ++++++ .../keycodes/keycodes_0.0.1_sequencer.hjson | 40 + data/constants/keycodes/keycodes_0.0.1_steno.hjson | 20 + .../keycodes/keycodes_0.0.1_swap_hands.hjson | 32 + data/schemas/keycodes.jsonschema | 57 + lib/python/qmk/cli/__init__.py | 1 + lib/python/qmk/cli/generate/api.py | 14 + lib/python/qmk/cli/generate/keycodes.py | 88 ++ lib/python/qmk/keycodes.py | 57 + quantum/action_code.h | 3 + quantum/keycode.h | 497 +------ quantum/keycodes.h | 1115 ++++++++++++++ quantum/keymap_common.c | 6 +- quantum/process_keycode/process_joystick.c | 6 +- quantum/process_keycode/process_magic.c | 270 ++-- .../process_keycode/process_programmable_button.c | 4 +- quantum/quantum_keycodes.h | 903 +----------- quantum/send_string/send_string_keycodes.h | 61 +- quantum/via.c | 1 - quantum/via.h | 11 +- quantum/via_ensure_keycode.h | 344 ----- 30 files changed, 5472 insertions(+), 1879 deletions(-) create mode 100644 data/constants/keycodes/keycodes_0.0.1.hjson create mode 100644 data/constants/keycodes/keycodes_0.0.1_audio.hjson create mode 100644 data/constants/keycodes/keycodes_0.0.1_basic.hjson create mode 100644 data/constants/keycodes/keycodes_0.0.1_joystick.hjson create mode 100644 data/constants/keycodes/keycodes_0.0.1_lighting.hjson create mode 100644 data/constants/keycodes/keycodes_0.0.1_macro.hjson create mode 100644 data/constants/keycodes/keycodes_0.0.1_magic.hjson create mode 100644 data/constants/keycodes/keycodes_0.0.1_midi.hjson create mode 100644 data/constants/keycodes/keycodes_0.0.1_programmable_button.hjson create mode 100644 data/constants/keycodes/keycodes_0.0.1_quantum.hjson create mode 100644 data/constants/keycodes/keycodes_0.0.1_sequencer.hjson create mode 100644 data/constants/keycodes/keycodes_0.0.1_steno.hjson create mode 100644 data/constants/keycodes/keycodes_0.0.1_swap_hands.hjson create mode 100644 data/schemas/keycodes.jsonschema create mode 100644 lib/python/qmk/cli/generate/keycodes.py create mode 100644 lib/python/qmk/keycodes.py create mode 100644 quantum/keycodes.h delete mode 100644 quantum/via_ensure_keycode.h (limited to 'lib/python') diff --git a/data/constants/keycodes/keycodes_0.0.1.hjson b/data/constants/keycodes/keycodes_0.0.1.hjson new file mode 100644 index 0000000000..7ba1ecf201 --- /dev/null +++ b/data/constants/keycodes/keycodes_0.0.1.hjson @@ -0,0 +1,96 @@ +{ + "ranges": { + "0x0000/0x00FF": { + "define": "QK_BASIC" + }, + "0x0100/0x1EFF": { + "define": "QK_MODS" + }, + "0x2000/0x1FFF": { + "define": "QK_MOD_TAP" + }, + "0x4000/0x0FFF": { + "define": "QK_LAYER_TAP" + }, + "0x5000/0x01FF": { + "define": "QK_LAYER_MOD" + }, + "0x5200/0x001F": { + "define": "QK_TO" + }, + "0x5220/0x001F": { + "define": "QK_MOMENTARY" + }, + "0x5240/0x001F": { + "define": "QK_DEF_LAYER" + }, + "0x5260/0x001F": { + "define": "QK_TOGGLE_LAYER" + }, + "0x5280/0x001F": { + "define": "QK_ONE_SHOT_LAYER" + }, + "0x52A0/0x001F": { + "define": "QK_ONE_SHOT_MOD" + }, + "0x52C0/0x001F": { + "define": "QK_LAYER_TAP_TOGGLE" + }, + // 0x52E0/0x001F - UNUSED + // 0x5300/0x02FF - UNUSED + "0x5600/0x00FF": { + "define": "QK_SWAP_HANDS" + }, + "0x5700/0x00FF": { + "define": "QK_TAP_DANCE" + }, + // 0x5800/0x17FF - UNUSED + "0x7000/0x00FF": { + "define": "QK_MAGIC" + }, + "0x7100/0x00FF": { + "define": "QK_MIDI" + }, + "0x7200/0x01FF": { + "define": "QK_SEQUENCER" + }, + "0x7400/0x003F": { + "define": "QK_JOYSTICK" + }, + "0x7440/0x003F": { + "define": "QK_PROGRAMMABLE_BUTTON" + }, + "0x7480/0x003F": { + "define": "QK_AUDIO" + }, + "0x74C0/0x003F": { + "define": "QK_STENO" + }, + // 0x7500/0x01FF - UNUSED + "0x7700/0x007F": { + "define": "QK_MACRO" + }, + // 0x7780/0x007F - UNUSED + "0x7800/0x00FF": { + "define": "QK_LIGHTING" + }, + // 0x7900/0x02FF - UNUSED + "0x7C00/0x01FF": { + "define": "QK_QUANTUM" + }, + "0x7E00/0x00FF": { + "define": "QK_KB" + }, + "0x7F00/0x00FF": { + "define": "QK_USER" + }, + "0x8000/0x7FFF": { + "define": "QK_UNICODE" + } + }, + "keycodes": { + "0x7E00": { + "key": "SAFE_RANGE" + } + } +} \ No newline at end of file diff --git a/data/constants/keycodes/keycodes_0.0.1_audio.hjson b/data/constants/keycodes/keycodes_0.0.1_audio.hjson new file mode 100644 index 0000000000..d26e515682 --- /dev/null +++ b/data/constants/keycodes/keycodes_0.0.1_audio.hjson @@ -0,0 +1,84 @@ +{ + "keycodes": { + "0x7480": { + "group": "audio", + "key": "AU_ON" + }, + "0x7481": { + "group": "audio", + "key": "AU_OFF" + }, + "0x7482": { + "group": "audio", + "key": "AU_TOG" + }, + + "0x748A": { + "group": "audio", + "key": "CLICKY_TOGGLE", + "aliases": [ + "CK_TOGG" + ] + }, + "0x748B": { + "group": "audio", + "key": "CLICKY_ENABLE", + "aliases": [ + "CK_ON" + ] + }, + "0x748C": { + "group": "audio", + "key": "CLICKY_DISABLE", + "aliases": [ + "CK_OFF" + ] + }, + "0x748D": { + "group": "audio", + "key": "CLICKY_UP", + "aliases": [ + "CK_UP" + ] + }, + "0x748E": { + "group": "audio", + "key": "CLICKY_DOWN", + "aliases": [ + "CK_DOWN" + ] + }, + "0x748F": { + "group": "audio", + "key": "CLICKY_RESET", + "aliases": [ + "CK_RST" + ] + }, + + "0x7490": { + "group": "audio", + "key": "MU_ON" + }, + "0x7491": { + "group": "audio", + "key": "MU_OFF" + }, + "0x7492": { + "group": "audio", + "key": "MU_TOG" + }, + "0x7493": { + "group": "audio", + "key": "MU_MOD" + }, + "0x7494": { + "group": "audio", + "key": "MUV_IN" + }, + "0x7495": { + "group": "audio", + "key": "MUV_DE" + } + } +} diff --git a/data/constants/keycodes/keycodes_0.0.1_basic.hjson b/data/constants/keycodes/keycodes_0.0.1_basic.hjson new file mode 100644 index 0000000000..7141d553b0 --- /dev/null +++ b/data/constants/keycodes/keycodes_0.0.1_basic.hjson @@ -0,0 +1,1515 @@ +{ + "keycodes": { + "0x0000": { + "group": "internal", + "key": "KC_NO", + "label": "", + "aliases": [ + "XXXXXXX" + ] + }, + "0x0001": { + "group": "internal", + "key": "KC_TRANSPARENT", + "label": "", + "aliases": [ + "_______", + "KC_TRNS" + ] + }, + "0x0004": { + "group": "basic", + "key": "KC_A", + "label": "A" + }, + "0x0005": { + "group": "basic", + "key": "KC_B", + "label": "B" + }, + "0x0006": { + "group": "basic", + "key": "KC_C", + "label": "C" + }, + "0x0007": { + "group": "basic", + "key": "KC_D", + "label": "D" + }, + "0x0008": { + "group": "basic", + "key": "KC_E", + "label": "E" + }, + "0x0009": { + "group": "basic", + "key": "KC_F", + "label": "F" + }, + "0x000A": { + "group": "basic", + "key": "KC_G", + "label": "G" + }, + "0x000B": { + "group": "basic", + "key": "KC_H", + "label": "H" + }, + "0x000C": { + "group": "basic", + "key": "KC_I", + "label": "I" + }, + "0x000D": { + "group": "basic", + "key": "KC_J", + "label": "J" + }, + "0x000E": { + "group": "basic", + "key": "KC_K", + "label": "K" + }, + "0x000F": { + "group": "basic", + "key": "KC_L", + "label": "L" + }, + "0x0010": { + "group": "basic", + "key": "KC_M", + "label": "M" + }, + "0x0011": { + "group": "basic", + "key": "KC_N", + "label": "N" + }, + "0x0012": { + "group": "basic", + "key": "KC_O", + "label": "O" + }, + "0x0013": { + "group": "basic", + "key": "KC_P", + "label": "P" + }, + "0x0014": { + "group": "basic", + "key": "KC_Q", + "label": "Q" + }, + "0x0015": { + "group": "basic", + "key": "KC_R", + "label": "R" + }, + "0x0016": { + "group": "basic", + "key": "KC_S", + "label": "S" + }, + "0x0017": { + "group": "basic", + "key": "KC_T", + "label": "T" + }, + "0x0018": { + "group": "basic", + "key": "KC_U", + "label": "U" + }, + "0x0019": { + "group": "basic", + "key": "KC_V", + "label": "V" + }, + "0x001A": { + "group": "basic", + "key": "KC_W", + "label": "W" + }, + "0x001B": { + "group": "basic", + "key": "KC_X", + "label": "X" + }, + "0x001C": { + "group": "basic", + "key": "KC_Y", + "label": "Y" + }, + "0x001D": { + "group": "basic", + "key": "KC_Z", + "label": "Z" + }, + "0x001E": { + "group": "basic", + "key": "KC_1", + "label": "1" + }, + "0x001F": { + "group": "basic", + "key": "KC_2", + "label": "2" + }, + "0x0020": { + "group": "basic", + "key": "KC_3", + "label": "3" + }, + "0x0021": { + "group": "basic", + "key": "KC_4", + "label": "4" + }, + "0x0022": { + "group": "basic", + "key": "KC_5", + "label": "5" + }, + "0x0023": { + "group": "basic", + "key": "KC_6", + "label": "6" + }, + "0x0024": { + "group": "basic", + "key": "KC_7", + "label": "7" + }, + "0x0025": { + "group": "basic", + "key": "KC_8", + "label": "8" + }, + "0x0026": { + "group": "basic", + "key": "KC_9", + "label": "9" + }, + "0x0027": { + "group": "basic", + "key": "KC_0", + "label": "0" + }, + "0x0028": { + "group": "basic", + "key": "KC_ENTER", + "label": "Enter", + "aliases": [ + "KC_ENT" + ] + }, + "0x0029": { + "group": "basic", + "key": "KC_ESCAPE", + "label": "Esc", + "aliases": [ + "KC_ESC" + ] + }, + "0x002A": { + "group": "basic", + "key": "KC_BACKSPACE", + "label": "Backspace", + "aliases": [ + "KC_BSPC" + ] + }, + "0x002B": { + "group": "basic", + "key": "KC_TAB", + "label": "Tab" + }, + "0x002C": { + "group": "basic", + "key": "KC_SPACE", + "label": "Spacebar", + "aliases": [ + "KC_SPC" + ] + }, + "0x002D": { + "group": "basic", + "key": "KC_MINUS", + "label": "-", + "aliases": [ + "KC_MINS" + ] + }, + "0x002E": { + "group": "basic", + "key": "KC_EQUAL", + "label": "=", + "aliases": [ + "KC_EQL" + ] + }, + "0x002F": { + "group": "basic", + "key": "KC_LEFT_BRACKET", + "label": "]", + "aliases": [ + "KC_LBRC" + ] + }, + "0x0030": { + "group": "basic", + "key": "KC_RIGHT_BRACKET", + "label": "[", + "aliases": [ + "KC_RBRC" + ] + }, + "0x0031": { + "group": "basic", + "key": "KC_BACKSLASH", + "label": "\\", + "aliases": [ + "KC_BSLS" + ] + }, + "0x0032": { + "group": "basic", + "key": "KC_NONUS_HASH", + "label": "#", + "aliases": [ + "KC_NUHS" + ] + }, + "0x0033": { + "group": "basic", + "key": "KC_SEMICOLON", + "label": ";", + "aliases": [ + "KC_SCLN" + ] + }, + "0x0034": { + "group": "basic", + "key": "KC_QUOTE", + "label": "'", + "aliases": [ + "KC_QUOT" + ] + }, + "0x0035": { + "group": "basic", + "key": "KC_GRAVE", + "label": "`", + "aliases": [ + "KC_GRV" + ] + }, + "0x0036": { + "group": "basic", + "key": "KC_COMMA", + "label": ",", + "aliases": [ + "KC_COMM" + ] + }, + "0x0037": { + "group": "basic", + "key": "KC_DOT", + "label": "." + }, + "0x0038": { + "group": "basic", + "key": "KC_SLASH", + "label": "/", + "aliases": [ + "KC_SLSH" + ] + }, + "0x0039": { + "group": "basic", + "key": "KC_CAPS_LOCK", + "label": "Caps Lock", + "aliases": [ + "KC_CAPS" + ] + }, + "0x003A": { + "group": "basic", + "key": "KC_F1", + "label": "F1" + }, + "0x003B": { + "group": "basic", + "key": "KC_F2", + "label": "F2" + }, + "0x003C": { + "group": "basic", + "key": "KC_F3", + "label": "F3" + }, + "0x003D": { + "group": "basic", + "key": "KC_F4", + "label": "F4" + }, + "0x003E": { + "group": "basic", + "key": "KC_F5", + "label": "F5" + }, + "0x003F": { + "group": "basic", + "key": "KC_F6", + "label": "F6" + }, + "0x0040": { + "group": "basic", + "key": "KC_F7", + "label": "F7" + }, + "0x0041": { + "group": "basic", + "key": "KC_F8", + "label": "F8" + }, + "0x0042": { + "group": "basic", + "key": "KC_F9", + "label": "F9" + }, + "0x0043": { + "group": "basic", + "key": "KC_F10", + "label": "F10" + }, + "0x0044": { + "group": "basic", + "key": "KC_F11", + "label": "F11" + }, + "0x0045": { + "group": "basic", + "key": "KC_F12", + "label": "F12" + }, + "0x0046": { + "group": "basic", + "key": "KC_PRINT_SCREEN", + "label": "Print Screen", + "aliases": [ + "KC_PSCR" + ] + }, + "0x0047": { + "group": "basic", + "key": "KC_SCROLL_LOCK", + "label": "Scroll Lock", + "aliases": [ + "KC_SCRL", + "KC_BRMD" + ] + }, + "0x0048": { + "group": "basic", + "key": "KC_PAUSE", + "label": "Pause", + "aliases": [ + "KC_PAUS", + "KC_BRK", + "KC_BRMU" + ] + }, + "0x0049": { + "group": "basic", + "key": "KC_INSERT", + "label": "Insert", + "aliases": [ + "KC_INS" + ] + }, + "0x004A": { + "group": "basic", + "key": "KC_HOME", + "label": "Home" + }, + "0x004B": { + "group": "basic", + "key": "KC_PAGE_UP", + "label": "Page Up", + "aliases": [ + "KC_PGUP" + ] + }, + "0x004C": { + "group": "basic", + "key": "KC_DELETE", + "label": "Delete", + "aliases": [ + "KC_DEL" + ] + }, + "0x004D": { + "group": "basic", + "key": "KC_END", + "label": "End" + }, + "0x004E": { + "group": "basic", + "key": "KC_PAGE_DOWN", + "label": "Page Down", + "aliases": [ + "KC_PGDN" + ] + }, + "0x004F": { + "group": "basic", + "key": "KC_RIGHT", + "label": "Right", + "aliases": [ + "KC_RGHT" + ] + }, + "0x0050": { + "group": "basic", + "key": "KC_LEFT", + "label": "Left" + }, + "0x0051": { + "group": "basic", + "key": "KC_DOWN", + "label": "Down" + }, + "0x0052": { + "group": "basic", + "key": "KC_UP", + "label": "Up" + }, + "0x0053": { + "group": "basic", + "key": "KC_NUM_LOCK", + "label": "Num Lock", + "aliases": [ + "KC_NUM" + ] + }, + "0x0054": { + "group": "basic", + "key": "KC_KP_SLASH", + "label": "/", + "aliases": [ + "KC_PSLS" + ] + }, + "0x0055": { + "group": "basic", + "key": "KC_KP_ASTERISK", + "label": "*", + "aliases": [ + "KC_PAST" + ] + }, + "0x0056": { + "group": "basic", + "key": "KC_KP_MINUS", + "label": "-", + "aliases": [ + "KC_PMNS" + ] + }, + "0x0057": { + "group": "basic", + "key": "KC_KP_PLUS", + "label": "+", + "aliases": [ + "KC_PPLS" + ] + }, + "0x0058": { + "group": "basic", + "key": "KC_KP_ENTER", + "label": "Enter", + "aliases": [ + "KC_PENT" + ] + }, + "0x0059": { + "group": "basic", + "key": "KC_KP_1", + "label": "1", + "aliases": [ + "KC_P1" + ] + }, + "0x005A": { + "group": "basic", + "key": "KC_KP_2", + "label": "2", + "aliases": [ + "KC_P2" + ] + }, + "0x005B": { + "group": "basic", + "key": "KC_KP_3", + "label": "3", + "aliases": [ + "KC_P3" + ] + }, + "0x005C": { + "group": "basic", + "key": "KC_KP_4", + "label": "4", + "aliases": [ + "KC_P4" + ] + }, + "0x005D": { + "group": "basic", + "key": "KC_KP_5", + "label": "5", + "aliases": [ + "KC_P5" + ] + }, + "0x005E": { + "group": "basic", + "key": "KC_KP_6", + "label": "6", + "aliases": [ + "KC_P6" + ] + }, + "0x005F": { + "group": "basic", + "key": "KC_KP_7", + "label": "7", + "aliases": [ + "KC_P7" + ] + }, + "0x0060": { + "group": "basic", + "key": "KC_KP_8", + "label": "8", + "aliases": [ + "KC_P8" + ] + }, + "0x0061": { + "group": "basic", + "key": "KC_KP_9", + "label": "9", + "aliases": [ + "KC_P9" + ] + }, + "0x0062": { + "group": "basic", + "key": "KC_KP_0", + "label": "0", + "aliases": [ + "KC_P0" + ] + }, + "0x0063": { + "group": "basic", + "key": "KC_KP_DOT", + "label": ".", + "aliases": [ + "KC_PDOT" + ] + }, + "0x0064": { + "group": "basic", + "key": "KC_NONUS_BACKSLASH", + "label": "\\", + "aliases": [ + "KC_NUBS" + ] + }, + "0x0065": { + "group": "basic", + "key": "KC_APPLICATION", + "label": "Application", + "aliases": [ + "KC_APP" + ] + }, + "0x0066": { + "group": "basic", + "key": "KC_KB_POWER", + "label": "Application" + }, + "0x0067": { + "group": "basic", + "key": "KC_KP_EQUAL", + "label": "=", + "aliases": [ + "KC_PEQL" + ] + }, + "0x0068": { + "group": "basic", + "key": "KC_F13", + "label": "F13" + }, + "0x0069": { + "group": "basic", + "key": "KC_F14", + "label": "F14" + }, + "0x006A": { + "group": "basic", + "key": "KC_F15", + "label": "F15" + }, + "0x006B": { + "group": "basic", + "key": "KC_F16", + "label": "F16" + }, + "0x006C": { + "group": "basic", + "key": "KC_F17", + "label": "F17" + }, + "0x006D": { + "group": "basic", + "key": "KC_F18", + "label": "F18" + }, + "0x006E": { + "group": "basic", + "key": "KC_F19", + "label": "F19" + }, + "0x006F": { + "group": "basic", + "key": "KC_F20", + "label": "F20" + }, + "0x0070": { + "group": "basic", + "key": "KC_F21", + "label": "F21" + }, + "0x0071": { + "group": "basic", + "key": "KC_F22", + "label": "F22" + }, + "0x0072": { + "group": "basic", + "key": "KC_F23", + "label": "F23" + }, + "0x0073": { + "group": "basic", + "key": "KC_F24", + "label": "F24" + }, + "0x0074": { + "group": "basic", + "key": "KC_EXECUTE", + "label": "Execute", + "aliases": [ + "KC_EXEC" + ] + }, + "0x0075": { + "group": "basic", + "key": "KC_HELP", + "label": "Help" + }, + "0x0076": { + "group": "basic", + "key": "KC_MENU", + "label": "Menu" + }, + "0x0077": { + "group": "basic", + "key": "KC_SELECT", + "label": "Select", + "aliases": [ + "KC_SLCT" + ] + }, + "0x0078": { + "group": "basic", + "key": "KC_STOP", + "label": "Stop" + }, + "0x0079": { + "group": "basic", + "key": "KC_AGAIN", + "label": "Again", + "aliases": [ + "KC_AGIN" + ] + }, + "0x007A": { + "group": "basic", + "key": "KC_UNDO", + "label": "Undo" + }, + "0x007B": { + "group": "basic", + "key": "KC_CUT", + "label": "Cut" + }, + "0x007C": { + "group": "basic", + "key": "KC_COPY", + "label": "Copy" + }, + "0x007D": { + "group": "basic", + "key": "KC_PASTE", + "label": "Paste", + "aliases": [ + "KC_PSTE" + ] + }, + "0x007E": { + "group": "basic", + "key": "KC_FIND", + "label": "Find" + }, + "0x007F": { + "group": "basic", + "key": "KC_KB_MUTE", + "label": "Mute" + }, + "0x0080": { + "group": "basic", + "key": "KC_KB_VOLUME_UP", + "label": "Volume Up" + }, + "0x0081": { + "group": "basic", + "key": "KC_KB_VOLUME_DOWN", + "label": "Volume Down" + }, + "0x0082": { + "group": "basic", + "key": "KC_LOCKING_CAPS_LOCK", + "label": "Caps Lock", + "aliases": [ + "KC_LCAP" + ] + }, + "0x0083": { + "group": "basic", + "key": "KC_LOCKING_NUM_LOCK", + "label": "Num Lock", + "aliases": [ + "KC_LNUM" + ] + }, + "0x0084": { + "group": "basic", + "key": "KC_LOCKING_SCROLL_LOCK", + "label": "Scroll Lock", + "aliases": [ + "KC_LSCR" + ] + }, + "0x0085": { + "group": "basic", + "key": "KC_KP_COMMA", + "label": ",", + "aliases": [ + "KC_PCMM" + ] + }, + "0x0086": { + "group": "basic", + "key": "KC_KP_EQUAL_AS400", + "label": "=" + }, + "0x0087": { + "group": "basic", + "key": "KC_INTERNATIONAL_1", + "label": "INT 1", + "aliases": [ + "KC_INT1" + ] + }, + "0x0088": { + "group": "basic", + "key": "KC_INTERNATIONAL_2", + "label": "INT 2", + "aliases": [ + "KC_INT2" + ] + }, + "0x0089": { + "group": "basic", + "key": "KC_INTERNATIONAL_3", + "label": "INT 3", + "aliases": [ + "KC_INT3" + ] + }, + "0x008A": { + "group": "basic", + "key": "KC_INTERNATIONAL_4", + "label": "INT 4", + "aliases": [ + "KC_INT4" + ] + }, + "0x008B": { + "group": "basic", + "key": "KC_INTERNATIONAL_5", + "label": "INT 5", + "aliases": [ + "KC_INT5" + ] + }, + "0x008C": { + "group": "basic", + "key": "KC_INTERNATIONAL_6", + "label": "INT 6", + "aliases": [ + "KC_INT6" + ] + }, + "0x008D": { + "group": "basic", + "key": "KC_INTERNATIONAL_7", + "label": "INT 7", + "aliases": [ + "KC_INT7" + ] + }, + "0x008E": { + "group": "basic", + "key": "KC_INTERNATIONAL_8", + "label": "INT 8", + "aliases": [ + "KC_INT8" + ] + }, + "0x008F": { + "group": "basic", + "key": "KC_INTERNATIONAL_9", + "label": "INT 9", + "aliases": [ + "KC_INT9" + ] + }, + "0x0090": { + "group": "basic", + "key": "KC_LANGUAGE_1", + "label": "LANG 1", + "aliases": [ + "KC_LNG1" + ] + }, + "0x0091": { + "group": "basic", + "key": "KC_LANGUAGE_2", + "label": "LANG 2", + "aliases": [ + "KC_LNG2" + ] + }, + "0x0092": { + "group": "basic", + "key": "KC_LANGUAGE_3", + "label": "LANG 3", + "aliases": [ + "KC_LNG3" + ] + }, + "0x0093": { + "group": "basic", + "key": "KC_LANGUAGE_4", + "label": "LANG 4", + "aliases": [ + "KC_LNG4" + ] + }, + "0x0094": { + "group": "basic", + "key": "KC_LANGUAGE_5", + "label": "LANG 5", + "aliases": [ + "KC_LNG5" + ] + }, + "0x0095": { + "group": "basic", + "key": "KC_LANGUAGE_6", + "label": "LANG 6", + "aliases": [ + "KC_LNG6" + ] + }, + "0x0096": { + "group": "basic", + "key": "KC_LANGUAGE_7", + "label": "LANG 7", + "aliases": [ + "KC_LNG7" + ] + }, + "0x0097": { + "group": "basic", + "key": "KC_LANGUAGE_8", + "label": "LANG 8", + "aliases": [ + "KC_LNG8" + ] + }, + "0x0098": { + "group": "basic", + "key": "KC_LANGUAGE_9", + "label": "LANG 9", + "aliases": [ + "KC_LNG9" + ] + }, + "0x0099": { + "group": "basic", + "key": "KC_ALTERNATE_ERASE", + "label": "Alternate Erase", + "aliases": [ + "KC_ERAS" + ] + }, + "0x009A": { + "group": "basic", + "key": "KC_SYSTEM_REQUEST", + "label": "SysReq/Attention", + "aliases": [ + "KC_SYRQ" + ] + }, + "0x009B": { + "group": "basic", + "key": "KC_CANCEL", + "label": "Cancel", + "aliases": [ + "KC_CNCL" + ] + }, + "0x009C": { + "group": "basic", + "key": "KC_CLEAR", + "label": "Clear", + "aliases": [ + "KC_CLR" + ] + }, + "0x009D": { + "group": "basic", + "key": "KC_PRIOR", + "label": "Prior", + "aliases": [ + "KC_PRIR" + ] + }, + "0x009E": { + "group": "basic", + "key": "KC_RETURN", + "label": "Return", + "aliases": [ + "KC_RETN" + ] + }, + "0x009F": { + "group": "basic", + "key": "KC_SEPARATOR", + "label": "Separator", + "aliases": [ + "KC_SEPR" + ] + }, + "0x00A0": { + "group": "basic", + "key": "KC_OUT", + "label": "Out" + }, + "0x00A1": { + "group": "basic", + "key": "KC_OPER", + "label": "Oper" + }, + "0x00A2": { + "group": "basic", + "key": "KC_CLEAR_AGAIN", + "label": "Clear/Again", + "aliases": [ + "KC_CLAG" + ] + }, + "0x00A3": { + "group": "basic", + "key": "KC_CRSEL", + "label": "CrSel/Props", + "aliases": [ + "KC_CRSL" + ] + }, + "0x00A4": { + "group": "basic", + "key": "KC_EXSEL", + "label": "ExSel", + "aliases": [ + "KC_EXSL" + ] + }, + "0x00A5": { + "group": "system", + "key": "KC_SYSTEM_POWER", + "label": "System Power Down", + "aliases": [ + "KC_PWR" + ] + }, + "0x00A6": { + "group": "system", + "key": "KC_SYSTEM_SLEEP", + "label": "System Sleep", + "aliases": [ + "KC_SLEP" + ] + }, + "0x00A7": { + "group": "system", + "key": "KC_SYSTEM_WAKE", + "label": "System Wake", + "aliases": [ + "KC_WAKE" + ] + }, + "0x00A8": { + "group": "media", + "key": "KC_AUDIO_MUTE", + "label": "Mute", + "aliases": [ + "KC_MUTE" + ] + }, + "0x00A9": { + "group": "media", + "key": "KC_AUDIO_VOL_UP", + "label": "Volume Up", + "aliases": [ + "KC_VOLU" + ] + }, + "0x00AA": { + "group": "media", + "key": "KC_AUDIO_VOL_DOWN", + "label": "Volume Down", + "aliases": [ + "KC_VOLD" + ] + }, + "0x00AB": { + "group": "media", + "key": "KC_MEDIA_NEXT_TRACK", + "label": "Next", + "aliases": [ + "KC_MNXT" + ] + }, + "0x00AC": { + "group": "media", + "key": "KC_MEDIA_PREV_TRACK", + "label": "Previous", + "aliases": [ + "KC_MPRV" + ] + }, + "0x00AD": { + "group": "media", + "key": "KC_MEDIA_STOP", + "label": "Stop", + "aliases": [ + "KC_MSTP" + ] + }, + "0x00AE": { + "group": "media", + "key": "KC_MEDIA_PLAY_PAUSE", + "label": "Mute", + "aliases": [ + "KC_MPLY" + ] + }, + "0x00AF": { + "group": "media", + "key": "KC_MEDIA_SELECT", + "label": "Launch Player", + "aliases": [ + "KC_MSEL" + ] + }, + "0x00B0": { + "group": "media", + "key": "KC_MEDIA_EJECT", + "label": "Eject", + "aliases": [ + "KC_EJCT" + ] + }, + "0x00B1": { + "group": "media", + "key": "KC_MAIL", + "label": "Launch Mail" + }, + "0x00B2": { + "group": "media", + "key": "KC_CALCULATOR", + "label": "Launch Calculator", + "aliases": [ + "KC_CALC" + ] + }, + "0x00B3": { + "group": "media", + "key": "KC_MY_COMPUTER", + "label": "Launch My Computer", + "aliases": [ + "KC_MYCM" + ] + }, + "0x00B4": { + "group": "media", + "key": "KC_WWW_SEARCH", + "label": "Browser Search", + "aliases": [ + "KC_WSCH" + ] + }, + "0x00B5": { + "group": "media", + "key": "KC_WWW_HOME", + "label": "Browser Home", + "aliases": [ + "KC_WHOM" + ] + }, + "0x00B6": { + "group": "media", + "key": "KC_WWW_BACK", + "label": "Browser Back", + "aliases": [ + "KC_WBAK" + ] + }, + "0x00B7": { + "group": "media", + "key": "KC_WWW_FORWARD", + "label": "Browser Forward", + "aliases": [ + "KC_WFWD" + ] + }, + "0x00B8": { + "group": "media", + "key": "KC_WWW_STOP", + "label": "Browser Stop", + "aliases": [ + "KC_WSTP" + ] + }, + "0x00B9": { + "group": "media", + "key": "KC_WWW_REFRESH", + "label": "Browser Refresh", + "aliases": [ + "KC_WREF" + ] + }, + "0x00BA": { + "group": "media", + "key": "KC_WWW_FAVORITES", + "label": "Browser Favorites", + "aliases": [ + "KC_WFAV" + ] + }, + "0x00BB": { + "group": "media", + "key": "KC_MEDIA_FAST_FORWARD", + "label": "Next Track", + "aliases": [ + "KC_MFFD" + ] + }, + "0x00BC": { + "group": "media", + "key": "KC_MEDIA_REWIND", + "label": "Previous Track", + "aliases": [ + "KC_MRWD" + ] + }, + "0x00BD": { + "group": "media", + "key": "KC_BRIGHTNESS_UP", + "label": "Brightness Up", + "aliases": [ + "KC_BRIU" + ] + }, + "0x00BE": { + "group": "media", + "key": "KC_BRIGHTNESS_DOWN", + "label": "Brightness Down", + "aliases": [ + "KC_BRID" + ] + }, + "0x00BF": { + "group": "media", + "key": "KC_CONTROL_PANEL", + "label": "Open Control Panel", + "aliases": [ + "KC_CPNL" + ] + }, + "0x00C0": { + "group": "media", + "key": "KC_ASSISTANT", + "label": "Launch Assistant", + "aliases": [ + "KC_ASST" + ] + }, + + "0x00CD": { + "group": "mouse", + "key": "KC_MS_UP", + "label": "Move cursor up", + "aliases": [ + "KC_MS_U" + ] + }, + "0x00CE": { + "group": "mouse", + "key": "KC_MS_DOWN", + "label": "Move cursor down", + "aliases": [ + "KC_MS_D" + ] + }, + "0x00CF": { + "group": "mouse", + "key": "KC_MS_LEFT", + "label": "Move cursor left", + "aliases": [ + "KC_MS_L" + ] + }, + "0x00D0": { + "group": "mouse", + "key": "KC_MS_RIGHT", + "label": "Move cursor right", + "aliases": [ + "KC_MS_R" + ] + }, + "0x00D1": { + "group": "mouse", + "key": "KC_MS_BTN1", + "label": "Press button 1", + "aliases": [ + "KC_BTN1" + ] + }, + "0x00D2": { + "group": "mouse", + "key": "KC_MS_BTN2", + "label": "Press button 2", + "aliases": [ + "KC_BTN2" + ] + }, + "0x00D3": { + "group": "mouse", + "key": "KC_MS_BTN3", + "label": "Press button 3", + "aliases": [ + "KC_BTN3" + ] + }, + "0x00D4": { + "group": "mouse", + "key": "KC_MS_BTN4", + "label": "Press button 4", + "aliases": [ + "KC_BTN4" + ] + }, + "0x00D5": { + "group": "mouse", + "key": "KC_MS_BTN5", + "label": "Press button 5", + "aliases": [ + "KC_BTN5" + ] + }, + "0x00D6": { + "group": "mouse", + "key": "KC_MS_BTN6", + "label": "Press button 6", + "aliases": [ + "KC_BTN6" + ] + }, + "0x00D7": { + "group": "mouse", + "key": "KC_MS_BTN7", + "label": "Press button 7", + "aliases": [ + "KC_BTN7" + ] + }, + "0x00D8": { + "group": "mouse", + "key": "KC_MS_BTN8", + "label": "Press button 8", + "aliases": [ + "KC_BTN8" + ] + }, + "0x00D9": { + "group": "mouse", + "key": "KC_MS_WH_UP", + "label": "Move wheel up", + "aliases": [ + "KC_WH_U" + ] + }, + "0x00DA": { + "group": "mouse", + "key": "KC_MS_WH_DOWN", + "label": "Move wheel down", + "aliases": [ + "KC_WH_D" + ] + }, + "0x00DB": { + "group": "mouse", + "key": "KC_MS_WH_LEFT", + "label": "Move wheel left", + "aliases": [ + "KC_WH_L" + ] + }, + "0x00DC": { + "group": "mouse", + "key": "KC_MS_WH_RIGHT", + "label": "Move wheel right", + "aliases": [ + "KC_WH_R" + ] + }, + "0x00DD": { + "group": "mouse", + "key": "KC_MS_ACCEL0", + "label": "Set speed to 0", + "aliases": [ + "KC_ACL0" + ] + }, + "0x00DE": { + "group": "mouse", + "key": "KC_MS_ACCEL1", + "label": "Set speed to 1", + "aliases": [ + "KC_ACL1" + ] + }, + "0x00DF": { + "group": "mouse", + "key": "KC_MS_ACCEL2", + "label": "Set speed to 2", + "aliases": [ + "KC_ACL2" + ] + }, + + "0x00E0": { + "group": "modifiers", + "key": "KC_LEFT_CTRL", + "label": "Left Control", + "aliases": [ + "KC_LCTL" + ] + }, + "0x00E1": { + "group": "modifiers", + "key": "KC_LEFT_SHIFT", + "label": "Left Shift", + "aliases": [ + "KC_LSFT" + ] + }, + "0x00E2": { + "group": "modifiers", + "key": "KC_LEFT_ALT", + "label": "Left Alt", + "aliases": [ + "KC_LALT", + "KC_LOPT" + ] + }, + "0x00E3": { + "group": "modifiers", + "key": "KC_LEFT_GUI", + "label": "Left GUI", + "aliases": [ + "KC_LGUI", + "KC_LCMD", + "KC_LWIN" + ] + }, + "0x00E4": { + "group": "modifiers", + "key": "KC_RIGHT_CTRL", + "label": "Right Control", + "aliases": [ + "KC_RCTL" + ] + }, + "0x00E5": { + "group": "modifiers", + "key": "KC_RIGHT_SHIFT", + "label": "Right Shift", + "aliases": [ + "KC_RSFT" + ] + }, + "0x00E6": { + "group": "modifiers", + "key": "KC_RIGHT_ALT", + "label": "Right Alt", + "aliases": [ + "KC_RALT", + "KC_ROPT", + "KC_ALGR" + ] + }, + "0x00E7": { + "group": "modifiers", + "key": "KC_RIGHT_GUI", + "label": "Right GUI", + "aliases": [ + "KC_RGUI", + "KC_RCMD", + "KC_RWIN" + ] + } + } +} \ No newline at end of file diff --git a/data/constants/keycodes/keycodes_0.0.1_joystick.hjson b/data/constants/keycodes/keycodes_0.0.1_joystick.hjson new file mode 100644 index 0000000000..0bda7c29f3 --- /dev/null +++ b/data/constants/keycodes/keycodes_0.0.1_joystick.hjson @@ -0,0 +1,228 @@ +{ + "keycodes": { + "0x7400": { + "group": "joystick", + "key": "QK_JOYSTICK_BUTTON_0", + "aliases": [ + "JS_0" + ] + }, + "0x7401": { + "group": "joystick", + "key": "QK_JOYSTICK_BUTTON_1", + "aliases": [ + "JS_1" + ] + }, + "0x7402": { + "group": "joystick", + "key": "QK_JOYSTICK_BUTTON_2", + "aliases": [ + "JS_2" + ] + }, + "0x7403": { + "group": "joystick", + "key": "QK_JOYSTICK_BUTTON_3", + "aliases": [ + "JS_3" + ] + }, + "0x7404": { + "group": "joystick", + "key": "QK_JOYSTICK_BUTTON_4", + "aliases": [ + "JS_4" + ] + }, + "0x7405": { + "group": "joystick", + "key": "QK_JOYSTICK_BUTTON_5", + "aliases": [ + "JS_5" + ] + }, + "0x7406": { + "group": "joystick", + "key": "QK_JOYSTICK_BUTTON_6", + "aliases": [ + "JS_6" + ] + }, + "0x7407": { + "group": "joystick", + "key": "QK_JOYSTICK_BUTTON_7", + "aliases": [ + "JS_7" + ] + }, + "0x7408": { + "group": "joystick", + "key": "QK_JOYSTICK_BUTTON_8", + "aliases": [ + "JS_8" + ] + }, + "0x7409": { + "group": "joystick", + "key": "QK_JOYSTICK_BUTTON_9", + "aliases": [ + "JS_9" + ] + }, + "0x740A": { + "group": "joystick", + "key": "QK_JOYSTICK_BUTTON_10", + "aliases": [ + "JS_10" + ] + }, + "0x740B": { + "group": "joystick", + "key": "QK_JOYSTICK_BUTTON_11", + "aliases": [ + "JS_11" + ] + }, + "0x740C": { + "group": "joystick", + "key": "QK_JOYSTICK_BUTTON_12", + "aliases": [ + "JS_12" + ] + }, + "0x740D": { + "group": "joystick", + "key": "QK_JOYSTICK_BUTTON_13", + "aliases": [ + "JS_13" + ] + }, + "0x740E": { + "group": "joystick", + "key": "QK_JOYSTICK_BUTTON_14", + "aliases": [ + "JS_14" + ] + }, + "0x740F": { + "group": "joystick", + "key": "QK_JOYSTICK_BUTTON_15", + "aliases": [ + "JS_15" + ] + }, + "0x7410": { + "group": "joystick", + "key": "QK_JOYSTICK_BUTTON_16", + "aliases": [ + "JS_16" + ] + }, + "0x7411": { + "group": "joystick", + "key": "QK_JOYSTICK_BUTTON_17", + "aliases": [ + "JS_17" + ] + }, + "0x7412": { + "group": "joystick", + "key": "QK_JOYSTICK_BUTTON_18", + "aliases": [ + "JS_18" + ] + }, + "0x7413": { + "group": "joystick", + "key": "QK_JOYSTICK_BUTTON_19", + "aliases": [ + "JS_19" + ] + }, + "0x7414": { + "group": "joystick", + "key": "QK_JOYSTICK_BUTTON_20", + "aliases": [ + "JS_20" + ] + }, + "0x7415": { + "group": "joystick", + "key": "QK_JOYSTICK_BUTTON_21", + "aliases": [ + "JS_21" + ] + }, + "0x7416": { + "group": "joystick", + "key": "QK_JOYSTICK_BUTTON_22", + "aliases": [ + "JS_22" + ] + }, + "0x7417": { + "group": "joystick", + "key": "QK_JOYSTICK_BUTTON_23", + "aliases": [ + "JS_23" + ] + }, + "0x7418": { + "group": "joystick", + "key": "QK_JOYSTICK_BUTTON_24", + "aliases": [ + "JS_24" + ] + }, + "0x7419": { + "group": "joystick", + "key": "QK_JOYSTICK_BUTTON_25", + "aliases": [ + "JS_25" + ] + }, + "0x741A": { + "group": "joystick", + "key": "QK_JOYSTICK_BUTTON_26", + "aliases": [ + "JS_26" + ] + }, + "0x741B": { + "group": "joystick", + "key": "QK_JOYSTICK_BUTTON_27", + "aliases": [ + "JS_27" + ] + }, + "0x741C": { + "group": "joystick", + "key": "QK_JOYSTICK_BUTTON_28", + "aliases": [ + "JS_28" + ] + }, + "0x741D": { + "group": "joystick", + "key": "QK_JOYSTICK_BUTTON_29", + "aliases": [ + "JS_29" + ] + }, + "0x741E": { + "group": "joystick", + "key": "QK_JOYSTICK_BUTTON_30", + "aliases": [ + "JS_30" + ] + }, + "0x741F": { + "group": "joystick", + "key": "QK_JOYSTICK_BUTTON_31", + "aliases": [ + "JS_31" + ] + } + } +} \ No newline at end of file diff --git a/data/constants/keycodes/keycodes_0.0.1_lighting.hjson b/data/constants/keycodes/keycodes_0.0.1_lighting.hjson new file mode 100644 index 0000000000..90ed36c645 --- /dev/null +++ b/data/constants/keycodes/keycodes_0.0.1_lighting.hjson @@ -0,0 +1,154 @@ +{ + "keycodes": { + "0x7800": { + "group": "backlight", + "key": "BL_ON" + }, + "0x7801": { + "group": "backlight", + "key": "BL_OFF" + }, + "0x7802": { + "group": "backlight", + "key": "BL_DEC" + }, + "0x7803": { + "group": "backlight", + "key": "BL_INC" + }, + "0x7804": { + "group": "backlight", + "key": "BL_TOGG" + }, + "0x7805": { + "group": "backlight", + "key": "BL_STEP" + }, + "0x7806": { + "group": "backlight", + "key": "BL_BRTG" + }, + + "0x7820": { + "group": "rgb", + "key": "RGB_TOG" + }, + "0x7821": { + "group": "rgb", + "key": "RGB_MODE_FORWARD", + "aliases": [ + "RGB_MOD" + ] + }, + "0x7822": { + "group": "rgb", + "key": "RGB_MODE_REVERSE", + "aliases": [ + "RGB_RMOD" + ] + }, + "0x7823": { + "group": "rgb", + "key": "RGB_HUI" + }, + "0x7824": { + "group": "rgb", + "key": "RGB_HUD" + }, + "0x7825": { + "group": "rgb", + "key": "RGB_SAI" + }, + "0x7826": { + "group": "rgb", + "key": "RGB_SAD" + }, + "0x7827": { + "group": "rgb", + "key": "RGB_VAI" + }, + "0x7828": { + "group": "rgb", + "key": "RGB_VAD" + }, + "0x7829": { + "group": "rgb", + "key": "RGB_SPI" + }, + "0x782A": { + "group": "rgb", + "key": "RGB_SPD" + }, + + "0x782B": { + "group": "rgb", + "key": "RGB_MODE_PLAIN", + "aliases": [ + "RGB_M_P" + ] + }, + "0x782C": { + "group": "rgb", + "key": "RGB_MODE_BREATHE", + "aliases": [ + "RGB_M_B" + ] + }, + "0x782D": { + "group": "rgb", + "key": "RGB_MODE_RAINBOW", + "aliases": [ + "RGB_M_R" + ] + }, + "0x782E": { + "group": "rgb", + "key": "RGB_MODE_SWIRL", + "aliases": [ + "RGB_M_SW" + ] + }, + "0x782F": { + "group": "rgb", + "key": "RGB_MODE_SNAKE", + "aliases": [ + "RGB_M_SN" + ] + }, + "0x7830": { + "group": "rgb", + "key": "RGB_MODE_KNIGHT", + "aliases": [ + "RGB_M_K" + ] + }, + "0x7831": { + "group": "rgb", + "key": "RGB_MODE_XMAS", + "aliases": [ + "RGB_M_X" + ] + }, + "0x7832": { + "group": "rgb", + "key": "RGB_MODE_GRADIENT", + "aliases": [ + "RGB_M_G" + ] + }, + "0x7833": { + "group": "rgb", + "key": "RGB_MODE_RGBTEST", + "aliases": [ + "RGB_M_T" + ] + }, + "0x7834": { + "group": "rgb", + "key": "RGB_MODE_TWINKLE", + "aliases": [ + "RGB_M_TW" + ] + } + } +} \ No newline at end of file diff --git a/data/constants/keycodes/keycodes_0.0.1_macro.hjson b/data/constants/keycodes/keycodes_0.0.1_macro.hjson new file mode 100644 index 0000000000..70b9ecf154 --- /dev/null +++ b/data/constants/keycodes/keycodes_0.0.1_macro.hjson @@ -0,0 +1,133 @@ +{ + "keycodes": { + + "0x7700": { + "group": "macro", + "key": "MACRO_0" + }, + "0x7701": { + "group": "macro", + "key": "MACRO_1" + }, + "0x7702": { + "group": "macro", + "key": "MACRO_2" + }, + "0x7703": { + "group": "macro", + "key": "MACRO_3" + }, + "0x7704": { + "group": "macro", + "key": "MACRO_4" + }, + "0x7705": { + "group": "macro", + "key": "MACRO_5" + }, + "0x7706": { + "group": "macro", + "key": "MACRO_6" + }, + "0x7707": { + "group": "macro", + "key": "MACRO_7" + }, + "0x7708": { + "group": "macro", + "key": "MACRO_8" + }, + "0x7709": { + "group": "macro", + "key": "MACRO_9" + }, + "0x770A": { + "group": "macro", + "key": "MACRO_10" + }, + "0x770B": { + "group": "macro", + "key": "MACRO_11" + }, + "0x770C": { + "group": "macro", + "key": "MACRO_12" + }, + "0x770D": { + "group": "macro", + "key": "MACRO_13" + }, + "0x770E": { + "group": "macro", + "key": "MACRO_14" + }, + "0x770F": { + "group": "macro", + "key": "MACRO_15" + }, + "0x7710": { + "group": "macro", + "key": "MACRO_16" + }, + "0x7711": { + "group": "macro", + "key": "MACRO_17" + }, + "0x7712": { + "group": "macro", + "key": "MACRO_18" + }, + "0x7713": { + "group": "macro", + "key": "MACRO_19" + }, + "0x7714": { + "group": "macro", + "key": "MACRO_20" + }, + "0x7715": { + "group": "macro", + "key": "MACRO_21" + }, + "0x7716": { + "group": "macro", + "key": "MACRO_22" + }, + "0x7717": { + "group": "macro", + "key": "MACRO_23" + }, + "0x7718": { + "group": "macro", + "key": "MACRO_24" + }, + "0x7719": { + "group": "macro", + "key": "MACRO_25" + }, + "0x771A": { + "group": "macro", + "key": "MACRO_26" + }, + "0x771B": { + "group": "macro", + "key": "MACRO_27" + }, + "0x771C": { + "group": "macro", + "key": "MACRO_28" + }, + "0x771D": { + "group": "macro", + "key": "MACRO_29" + }, + "0x771E": { + "group": "macro", + "key": "MACRO_30" + }, + "0x771F": { + "group": "macro", + "key": "MACRO_31" + } + } +} \ No newline at end of file diff --git a/data/constants/keycodes/keycodes_0.0.1_magic.hjson b/data/constants/keycodes/keycodes_0.0.1_magic.hjson new file mode 100644 index 0000000000..7ee1f2bce9 --- /dev/null +++ b/data/constants/keycodes/keycodes_0.0.1_magic.hjson @@ -0,0 +1,249 @@ +{ + "keycodes": { + "0x7000": { + "group": "magic", + "key": "MAGIC_SWAP_CONTROL_CAPSLOCK", + "aliases": [ + "CL_SWAP" + ] + }, + "0x7001": { + "group": "magic", + "key": "MAGIC_UNSWAP_CONTROL_CAPSLOCK", + "aliases": [ + "CL_NORM" + ] + }, + "0x7002": { + "group": "magic", + "key": "MAGIC_TOGGLE_CONTROL_CAPSLOCK", + "aliases": [ + "CL_TOGG" + ] + }, + "0x7003": { + "group": "magic", + "key": "MAGIC_UNCAPSLOCK_TO_CONTROL", + "aliases": [ + "CL_CAPS" + ] + }, + "0x7004": { + "group": "magic", + "key": "MAGIC_CAPSLOCK_TO_CONTROL", + "aliases": [ + "CL_CTRL" + ] + }, + "0x7005": { + "group": "magic", + "key": "MAGIC_SWAP_LALT_LGUI", + "aliases": [ + "LAG_SWP" + ] + }, + "0x7006": { + "group": "magic", + "key": "MAGIC_UNSWAP_LALT_LGUI", + "aliases": [ + "LAG_NRM" + ] + }, + "0x7007": { + "group": "magic", + "key": "MAGIC_SWAP_RALT_RGUI", + "aliases": [ + "RAG_SWP" + ] + }, + "0x7008": { + "group": "magic", + "key": "MAGIC_UNSWAP_RALT_RGUI", + "aliases": [ + "RAG_NRM" + ] + }, + "0x7009": { + "group": "magic", + "key": "MAGIC_UNNO_GUI", + "aliases": [ + "GUI_ON" + ] + }, + "0x700A": { + "group": "magic", + "key": "MAGIC_NO_GUI", + "aliases": [ + "GUI_OFF" + ] + }, + "0x700B": { + "group": "magic", + "key": "MAGIC_TOGGLE_GUI", + "aliases": [ + "GUI_TOG" + ] + }, + "0x700C": { + "group": "magic", + "key": "MAGIC_SWAP_GRAVE_ESC", + "aliases": [ + "GE_SWAP" + ] + }, + "0x700D": { + "group": "magic", + "key": "MAGIC_UNSWAP_GRAVE_ESC", + "aliases": [ + "GE_NORM" + ] + }, + "0x700E": { + "group": "magic", + "key": "MAGIC_SWAP_BACKSLASH_BACKSPACE", + "aliases": [ + "BS_SWAP" + ] + }, + "0x700F": { + "group": "magic", + "key": "MAGIC_UNSWAP_BACKSLASH_BACKSPACE", + "aliases": [ + "BS_NORM" + ] + }, + "0x7010": { + "group": "magic", + "key": "MAGIC_TOGGLE_BACKSLASH_BACKSPACE", + "aliases": [ + "BS_TOGG" + ] + }, + "0x7011": { + "group": "magic", + "key": "MAGIC_HOST_NKRO", + "aliases": [ + "NK_ON" + ] + }, + "0x7012": { + "group": "magic", + "key": "MAGIC_UNHOST_NKRO", + "aliases": [ + "NK_OFF" + ] + }, + "0x7013": { + "group": "magic", + "key": "MAGIC_TOGGLE_NKRO", + "aliases": [ + "NK_TOGG" + ] + }, + "0x7014": { + "group": "magic", + "key": "MAGIC_SWAP_ALT_GUI", + "aliases": [ + "AG_SWAP" + ] + }, + "0x7015": { + "group": "magic", + "key": "MAGIC_UNSWAP_ALT_GUI", + "aliases": [ + "AG_NORM" + ] + }, + "0x7016": { + "group": "magic", + "key": "MAGIC_TOGGLE_ALT_GUI", + "aliases": [ + "AG_TOGG" + ] + }, + "0x7017": { + "group": "magic", + "key": "MAGIC_SWAP_LCTL_LGUI", + "aliases": [ + "LCG_SWP" + ] + }, + "0x7018": { + "group": "magic", + "key": "MAGIC_UNSWAP_LCTL_LGUI", + "aliases": [ + "LCG_NRM" + ] + }, + "0x7019": { + "group": "magic", + "key": "MAGIC_SWAP_RCTL_RGUI", + "aliases": [ + "RCG_SWP" + ] + }, + "0x701A": { + "group": "magic", + "key": "MAGIC_UNSWAP_RCTL_RGUI", + "aliases": [ + "RCG_NRM" + ] + }, + "0x701B": { + "group": "magic", + "key": "MAGIC_SWAP_CTL_GUI", + "aliases": [ + "CG_SWAP" + ] + }, + "0x701C": { + "group": "magic", + "key": "MAGIC_UNSWAP_CTL_GUI", + "aliases": [ + "CG_NORM" + ] + }, + "0x701D": { + "group": "magic", + "key": "MAGIC_TOGGLE_CTL_GUI", + "aliases": [ + "CG_TOGG" + ] + }, + "0x701E": { + "group": "magic", + "key": "MAGIC_EE_HANDS_LEFT", + "aliases": [ + "EH_LEFT" + ] + }, + "0x701F": { + "group": "magic", + "key": "MAGIC_EE_HANDS_RIGHT", + "aliases": [ + "EH_RGHT" + ] + }, + "0x7020": { + "group": "magic", + "key": "MAGIC_SWAP_ESCAPE_CAPSLOCK", + "aliases": [ + "EC_SWAP" + ] + }, + "0x7021": { + "group": "magic", + "key": "MAGIC_UNSWAP_ESCAPE_CAPSLOCK", + "aliases": [ + "EC_NORM" + ] + }, + "0x7022": { + "group": "magic", + "key": "MAGIC_TOGGLE_ESCAPE_CAPSLOCK", + "aliases": [ + "EC_TOGG" + ] + } + } +} \ No newline at end of file diff --git a/data/constants/keycodes/keycodes_0.0.1_midi.hjson b/data/constants/keycodes/keycodes_0.0.1_midi.hjson new file mode 100644 index 0000000000..72d6e38900 --- /dev/null +++ b/data/constants/keycodes/keycodes_0.0.1_midi.hjson @@ -0,0 +1,670 @@ +{ + "keycodes": { + "0x7100": { + "group": "midi", + "key": "MI_ON" + }, + "0x7101": { + "group": "midi", + "key": "MI_OFF" + }, + "0x7102": { + "group": "midi", + "key": "MI_TOG" + }, + "0x7110": { + "group": "midi", + "key": "MI_C" + }, + "0x7111": { + "group": "midi", + "key": "MI_Cs", + "aliases": [ + "MI_Db" + ] + }, + "0x7112": { + "group": "midi", + "key": "MI_D" + }, + "0x7113": { + "group": "midi", + "key": "MI_Ds", + "aliases": [ + "MI_Eb" + ] + }, + "0x7114": { + "group": "midi", + "key": "MI_E" + }, + "0x7115": { + "group": "midi", + "key": "MI_F" + }, + "0x7116": { + "group": "midi", + "key": "MI_Fs", + "aliases": [ + "MI_Gb" + ] + }, + "0x7117": { + "group": "midi", + "key": "MI_G" + }, + "0x7118": { + "group": "midi", + "key": "MI_Gs", + "aliases": [ + "MI_Ab" + ] + }, + "0x7119": { + "group": "midi", + "key": "MI_A" + }, + "0x711A": { + "group": "midi", + "key": "MI_As", + "aliases": [ + "MI_Bb" + ] + }, + "0x711B": { + "group": "midi", + "key": "MI_B" + }, + "0x7120": { + "group": "midi", + "key": "MI_C_1" + }, + "0x7121": { + "group": "midi", + "key": "MI_Cs_1", + "aliases": [ + "MI_Db_1" + ] + }, + "0x7122": { + "group": "midi", + "key": "MI_D_1" + }, + "0x7123": { + "group": "midi", + "key": "MI_Ds_1", + "aliases": [ + "MI_Eb_1" + ] + }, + "0x7124": { + "group": "midi", + "key": "MI_E_1" + }, + "0x7125": { + "group": "midi", + "key": "MI_F_1" + }, + "0x7126": { + "group": "midi", + "key": "MI_Fs_1", + "aliases": [ + "MI_Gb_1" + ] + }, + "0x7127": { + "group": "midi", + "key": "MI_G_1" + }, + "0x7128": { + "group": "midi", + "key": "MI_Gs_1", + "aliases": [ + "MI_Ab_1" + ] + }, + "0x7129": { + "group": "midi", + "key": "MI_A_1" + }, + "0x712A": { + "group": "midi", + "key": "MI_As_1", + "aliases": [ + "MI_Bb_1" + ] + }, + "0x712B": { + "group": "midi", + "key": "MI_B_1" + }, + "0x7130": { + "group": "midi", + "key": "MI_C_2" + }, + "0x7131": { + "group": "midi", + "key": "MI_Cs_2", + "aliases": [ + "MI_Db_2" + ] + }, + "0x7132": { + "group": "midi", + "key": "MI_D_2" + }, + "0x7133": { + "group": "midi", + "key": "MI_Ds_2", + "aliases": [ + "MI_Eb_2" + ] + }, + "0x7134": { + "group": "midi", + "key": "MI_E_2" + }, + "0x7135": { + "group": "midi", + "key": "MI_F_2" + }, + "0x7136": { + "group": "midi", + "key": "MI_Fs_2", + "aliases": [ + "MI_Gb_2" + ] + }, + "0x7137": { + "group": "midi", + "key": "MI_G_2" + }, + "0x7138": { + "group": "midi", + "key": "MI_Gs_2", + "aliases": [ + "MI_Ab_2" + ] + }, + "0x7139": { + "group": "midi", + "key": "MI_A_2" + }, + "0x713A": { + "group": "midi", + "key": "MI_As_2", + "aliases": [ + "MI_Bb_2" + ] + }, + "0x713B": { + "group": "midi", + "key": "MI_B_2" + }, + "0x7140": { + "group": "midi", + "key": "MI_C_3" + }, + "0x7141": { + "group": "midi", + "key": "MI_Cs_3", + "aliases": [ + "MI_Db_3" + ] + }, + "0x7142": { + "group": "midi", + "key": "MI_D_3" + }, + "0x7143": { + "group": "midi", + "key": "MI_Ds_3", + "aliases": [ + "MI_Eb_3" + ] + }, + "0x7144": { + "group": "midi", + "key": "MI_E_3" + }, + "0x7145": { + "group": "midi", + "key": "MI_F_3" + }, + "0x7146": { + "group": "midi", + "key": "MI_Fs_3", + "aliases": [ + "MI_Gb_3" + ] + }, + "0x7147": { + "group": "midi", + "key": "MI_G_3" + }, + "0x7148": { + "group": "midi", + "key": "MI_Gs_3", + "aliases": [ + "MI_Ab_3" + ] + }, + "0x7149": { + "group": "midi", + "key": "MI_A_3" + }, + "0x714A": { + "group": "midi", + "key": "MI_As_3", + "aliases": [ + "MI_Bb_3" + ] + }, + "0x714B": { + "group": "midi", + "key": "MI_B_3" + }, + "0x7150": { + "group": "midi", + "key": "MI_C_4" + }, + "0x7151": { + "group": "midi", + "key": "MI_Cs_4", + "aliases": [ + "MI_Db_4" + ] + }, + "0x7152": { + "group": "midi", + "key": "MI_D_4" + }, + "0x7153": { + "group": "midi", + "key": "MI_Ds_4", + "aliases": [ + "MI_Eb_4" + ] + }, + "0x7154": { + "group": "midi", + "key": "MI_E_4" + }, + "0x7155": { + "group": "midi", + "key": "MI_F_4" + }, + "0x7156": { + "group": "midi", + "key": "MI_Fs_4", + "aliases": [ + "MI_Gb_4" + ] + }, + "0x7157": { + "group": "midi", + "key": "MI_G_4" + }, + "0x7158": { + "group": "midi", + "key": "MI_Gs_4", + "aliases": [ + "MI_Ab_4" + ] + }, + "0x7159": { + "group": "midi", + "key": "MI_A_4" + }, + "0x715A": { + "group": "midi", + "key": "MI_As_4", + "aliases": [ + "MI_Bb_4" + ] + }, + "0x715B": { + "group": "midi", + "key": "MI_B_4" + }, + "0x7160": { + "group": "midi", + "key": "MI_C_5" + }, + "0x7161": { + "group": "midi", + "key": "MI_Cs_5", + "aliases": [ + "MI_Db_5" + ] + }, + "0x7162": { + "group": "midi", + "key": "MI_D_5" + }, + "0x7163": { + "group": "midi", + "key": "MI_Ds_5", + "aliases": [ + "MI_Eb_5" + ] + }, + "0x7164": { + "group": "midi", + "key": "MI_E_5" + }, + "0x7165": { + "group": "midi", + "key": "MI_F_5" + }, + "0x7166": { + "group": "midi", + "key": "MI_Fs_5", + "aliases": [ + "MI_Gb_5" + ] + }, + "0x7167": { + "group": "midi", + "key": "MI_G_5" + }, + "0x7168": { + "group": "midi", + "key": "MI_Gs_5", + "aliases": [ + "MI_Ab_5" + ] + }, + "0x7169": { + "group": "midi", + "key": "MI_A_5" + }, + "0x716A": { + "group": "midi", + "key": "MI_As_5", + "aliases": [ + "MI_Bb_5" + ] + }, + "0x716B": { + "group": "midi", + "key": "MI_B_5" + }, + "0x7170": { + "group": "midi", + "key": "MI_OCT_N2" + }, + "0x7171": { + "group": "midi", + "key": "MI_OCT_N1" + }, + "0x7172": { + "group": "midi", + "key": "MI_OCT_0" + }, + "0x7173": { + "group": "midi", + "key": "MI_OCT_1" + }, + "0x7174": { + "group": "midi", + "key": "MI_OCT_2" + }, + "0x7175": { + "group": "midi", + "key": "MI_OCT_3" + }, + "0x7176": { + "group": "midi", + "key": "MI_OCT_4" + }, + "0x7177": { + "group": "midi", + "key": "MI_OCT_5" + }, + "0x7178": { + "group": "midi", + "key": "MI_OCT_6" + }, + "0x7179": { + "group": "midi", + "key": "MI_OCT_7" + }, + "0x717A": { + "group": "midi", + "key": "MI_OCTD" + }, + "0x717B": { + "group": "midi", + "key": "MI_OCTU" + }, + "0x7180": { + "group": "midi", + "key": "MI_TRNS_N6" + }, + "0x7181": { + "group": "midi", + "key": "MI_TRNS_N5" + }, + "0x7182": { + "group": "midi", + "key": "MI_TRNS_N4" + }, + "0x7183": { + "group": "midi", + "key": "MI_TRNS_N3" + }, + "0x7184": { + "group": "midi", + "key": "MI_TRNS_N2" + }, + "0x7185": { + "group": "midi", + "key": "MI_TRNS_N1" + }, + "0x7186": { + "group": "midi", + "key": "MI_TRNS_0" + }, + "0x7187": { + "group": "midi", + "key": "MI_TRNS_1" + }, + "0x7188": { + "group": "midi", + "key": "MI_TRNS_2" + }, + "0x7189": { + "group": "midi", + "key": "MI_TRNS_3" + }, + "0x718A": { + "group": "midi", + "key": "MI_TRNS_4" + }, + "0x718B": { + "group": "midi", + "key": "MI_TRNS_5" + }, + "0x718C": { + "group": "midi", + "key": "MI_TRNS_6" + }, + "0x718D": { + "group": "midi", + "key": "MI_TRNSD" + }, + "0x718E": { + "group": "midi", + "key": "MI_TRNSU" + }, + "0x7190": { + "group": "midi", + "key": "MI_VEL_0" + }, + "0x7191": { + "group": "midi", + "key": "MI_VEL_1" + }, + "0x7192": { + "group": "midi", + "key": "MI_VEL_2" + }, + "0x7193": { + "group": "midi", + "key": "MI_VEL_3" + }, + "0x7194": { + "group": "midi", + "key": "MI_VEL_4" + }, + "0x7195": { + "group": "midi", + "key": "MI_VEL_5" + }, + "0x7196": { + "group": "midi", + "key": "MI_VEL_6" + }, + "0x7197": { + "group": "midi", + "key": "MI_VEL_7" + }, + "0x7198": { + "group": "midi", + "key": "MI_VEL_8" + }, + "0x7199": { + "group": "midi", + "key": "MI_VEL_9" + }, + "0x719A": { + "group": "midi", + "key": "MI_VEL_10" + }, + "0x719B": { + "group": "midi", + "key": "MI_VELD" + }, + "0x719C": { + "group": "midi", + "key": "MI_VELU" + }, + "0x71A0": { + "group": "midi", + "key": "MI_CH1" + }, + "0x71A1": { + "group": "midi", + "key": "MI_CH2" + }, + "0x71A2": { + "group": "midi", + "key": "MI_CH3" + }, + "0x71A3": { + "group": "midi", + "key": "MI_CH4" + }, + "0x71A4": { + "group": "midi", + "key": "MI_CH5" + }, + "0x71A5": { + "group": "midi", + "key": "MI_CH6" + }, + "0x71A6": { + "group": "midi", + "key": "MI_CH7" + }, + "0x71A7": { + "group": "midi", + "key": "MI_CH8" + }, + "0x71A8": { + "group": "midi", + "key": "MI_CH9" + }, + "0x71A9": { + "group": "midi", + "key": "MI_CH10" + }, + "0x71AA": { + "group": "midi", + "key": "MI_CH11" + }, + "0x71AB": { + "group": "midi", + "key": "MI_CH12" + }, + "0x71AC": { + "group": "midi", + "key": "MI_CH13" + }, + "0x71AD": { + "group": "midi", + "key": "MI_CH14" + }, + "0x71AE": { + "group": "midi", + "key": "MI_CH15" + }, + "0x71AF": { + "group": "midi", + "key": "MI_CH16" + }, + "0x71B0": { + "group": "midi", + "key": "MI_CHD" + }, + "0x71B1": { + "group": "midi", + "key": "MI_CHU" + }, + "0x71C0": { + "group": "midi", + "key": "MI_ALLOFF" + }, + "0x71C1": { + "group": "midi", + "key": "MI_SUS" + }, + "0x71C2": { + "group": "midi", + "key": "MI_PORT" + }, + "0x71C3": { + "group": "midi", + "key": "MI_SOST" + }, + "0x71C4": { + "group": "midi", + "key": "MI_SOFT" + }, + "0x71C5": { + "group": "midi", + "key": "MI_LEG" + }, + "0x71C6": { + "group": "midi", + "key": "MI_MOD" + }, + "0x71C7": { + "group": "midi", + "key": "MI_MODSD" + }, + "0x71C8": { + "group": "midi", + "key": "MI_MODSU" + }, + "0x71C9": { + "group": "midi", + "key": "MI_BENDD" + }, + "0x71CA": { + "group": "midi", + "key": "MI_BENDU" + } + } +} diff --git a/data/constants/keycodes/keycodes_0.0.1_programmable_button.hjson b/data/constants/keycodes/keycodes_0.0.1_programmable_button.hjson new file mode 100644 index 0000000000..645bcd6a39 --- /dev/null +++ b/data/constants/keycodes/keycodes_0.0.1_programmable_button.hjson @@ -0,0 +1,228 @@ +{ + "keycodes": { + "0x7440": { + "group": "programmable_button", + "key": "QK_PROGRAMMABLE_BUTTON_1", + "aliases": [ + "PB_1" + ] + }, + "0x7441": { + "group": "programmable_button", + "key": "QK_PROGRAMMABLE_BUTTON_2", + "aliases": [ + "PB_2" + ] + }, + "0x7442": { + "group": "programmable_button", + "key": "QK_PROGRAMMABLE_BUTTON_3", + "aliases": [ + "PB_3" + ] + }, + "0x7443": { + "group": "programmable_button", + "key": "QK_PROGRAMMABLE_BUTTON_4", + "aliases": [ + "PB_4" + ] + }, + "0x7444": { + "group": "programmable_button", + "key": "QK_PROGRAMMABLE_BUTTON_5", + "aliases": [ + "PB_5" + ] + }, + "0x7445": { + "group": "programmable_button", + "key": "QK_PROGRAMMABLE_BUTTON_6", + "aliases": [ + "PB_6" + ] + }, + "0x7446": { + "group": "programmable_button", + "key": "QK_PROGRAMMABLE_BUTTON_7", + "aliases": [ + "PB_7" + ] + }, + "0x7447": { + "group": "programmable_button", + "key": "QK_PROGRAMMABLE_BUTTON_8", + "aliases": [ + "PB_8" + ] + }, + "0x7448": { + "group": "programmable_button", + "key": "QK_PROGRAMMABLE_BUTTON_9", + "aliases": [ + "PB_9" + ] + }, + "0x7449": { + "group": "programmable_button", + "key": "QK_PROGRAMMABLE_BUTTON_10", + "aliases": [ + "PB_10" + ] + }, + "0x744A": { + "group": "programmable_button", + "key": "QK_PROGRAMMABLE_BUTTON_11", + "aliases": [ + "PB_11" + ] + }, + "0x744B": { + "group": "programmable_button", + "key": "QK_PROGRAMMABLE_BUTTON_12", + "aliases": [ + "PB_12" + ] + }, + "0x744C": { + "group": "programmable_button", + "key": "QK_PROGRAMMABLE_BUTTON_13", + "aliases": [ + "PB_13" + ] + }, + "0x744D": { + "group": "programmable_button", + "key": "QK_PROGRAMMABLE_BUTTON_14", + "aliases": [ + "PB_14" + ] + }, + "0x744E": { + "group": "programmable_button", + "key": "QK_PROGRAMMABLE_BUTTON_15", + "aliases": [ + "PB_15" + ] + }, + "0x744F": { + "group": "programmable_button", + "key": "QK_PROGRAMMABLE_BUTTON_16", + "aliases": [ + "PB_16" + ] + }, + "0x7450": { + "group": "programmable_button", + "key": "QK_PROGRAMMABLE_BUTTON_17", + "aliases": [ + "PB_17" + ] + }, + "0x7451": { + "group": "programmable_button", + "key": "QK_PROGRAMMABLE_BUTTON_18", + "aliases": [ + "PB_18" + ] + }, + "0x7452": { + "group": "programmable_button", + "key": "QK_PROGRAMMABLE_BUTTON_19", + "aliases": [ + "PB_19" + ] + }, + "0x7453": { + "group": "programmable_button", + "key": "QK_PROGRAMMABLE_BUTTON_20", + "aliases": [ + "PB_20" + ] + }, + "0x7454": { + "group": "programmable_button", + "key": "QK_PROGRAMMABLE_BUTTON_21", + "aliases": [ + "PB_21" + ] + }, + "0x7455": { + "group": "programmable_button", + "key": "QK_PROGRAMMABLE_BUTTON_22", + "aliases": [ + "PB_22" + ] + }, + "0x7456": { + "group": "programmable_button", + "key": "QK_PROGRAMMABLE_BUTTON_23", + "aliases": [ + "PB_23" + ] + }, + "0x7457": { + "group": "programmable_button", + "key": "QK_PROGRAMMABLE_BUTTON_24", + "aliases": [ + "PB_24" + ] + }, + "0x7458": { + "group": "programmable_button", + "key": "QK_PROGRAMMABLE_BUTTON_25", + "aliases": [ + "PB_25" + ] + }, + "0x7459": { + "group": "programmable_button", + "key": "QK_PROGRAMMABLE_BUTTON_26", + "aliases": [ + "PB_26" + ] + }, + "0x745A": { + "group": "programmable_button", + "key": "QK_PROGRAMMABLE_BUTTON_27", + "aliases": [ + "PB_27" + ] + }, + "0x745B": { + "group": "programmable_button", + "key": "QK_PROGRAMMABLE_BUTTON_28", + "aliases": [ + "PB_28" + ] + }, + "0x745C": { + "group": "programmable_button", + "key": "QK_PROGRAMMABLE_BUTTON_29", + "aliases": [ + "PB_29" + ] + }, + "0x745D": { + "group": "programmable_button", + "key": "QK_PROGRAMMABLE_BUTTON_30", + "aliases": [ + "PB_30" + ] + }, + "0x745E": { + "group": "programmable_button", + "key": "QK_PROGRAMMABLE_BUTTON_31", + "aliases": [ + "PB_31" + ] + }, + "0x745F": { + "group": "programmable_button", + "key": "QK_PROGRAMMABLE_BUTTON_32", + "aliases": [ + "PB_32" + ] + } + } +} \ No newline at end of file diff --git a/data/constants/keycodes/keycodes_0.0.1_quantum.hjson b/data/constants/keycodes/keycodes_0.0.1_quantum.hjson new file mode 100644 index 0000000000..ceb9d4d16c --- /dev/null +++ b/data/constants/keycodes/keycodes_0.0.1_quantum.hjson @@ -0,0 +1,464 @@ +{ + "keycodes": { + "0x7C00": { + "group": "quantum", + "key": "QK_BOOTLOADER", + "aliases": [ + "QK_BOOT" + ] + }, + "0x7C01": { + "group": "quantum", + "key": "QK_REBOOT", + "aliases": [ + "QK_RBT" + ] + }, + "0x7C02": { + "group": "quantum", + "key": "QK_DEBUG_TOGGLE", + "aliases": [ + "DB_TOGG" + ] + }, + "0x7C03": { + "group": "quantum", + "key": "QK_CLEAR_EEPROM", + "aliases": [ + "EE_CLR" + ] + }, + "0x7C04": { + "group": "quantum", + "key": "QK_MAKE" + }, + + "0x7C10": { + "group": "quantum", + "key": "QK_AUTO_SHIFT_DOWN", + "aliases": [ + "AS_DOWN" + ] + }, + "0x7C11": { + "group": "quantum", + "key": "QK_AUTO_SHIFT_UP", + "aliases": [ + "AS_UP" + ] + }, + "0x7C12": { + "group": "quantum", + "key": "QK_AUTO_SHIFT_REPORT", + "aliases": [ + "AS_RPT" + ] + }, + "0x7C13": { + "group": "quantum", + "key": "QK_AUTO_SHIFT_ON", + "aliases": [ + "AS_ON" + ] + }, + "0x7C14": { + "group": "quantum", + "key": "QK_AUTO_SHIFT_OFF", + "aliases": [ + "AS_OFF" + ] + }, + "0x7C15": { + "group": "quantum", + "key": "QK_AUTO_SHIFT_TOGGLE", + "aliases": [ + "AS_TOGG" + ] + }, + + "0x7C16": { + "group": "quantum", + "key": "QK_GRAVE_ESCAPE", + "aliases": [ + "QK_GESC" + ] + }, + + "0x7C17": { + "group": "quantum", + "key": "QK_VELOCIKEY_TOGGLE", + "aliases": [ + "VK_TOGG" + ] + }, + + "0x7C18": { + "group": "quantum", + "key": "QK_SPACE_CADET_LEFT_CTRL_PARENTHESIS_OPEN", + "aliases": [ + "SC_LCPO" + ] + }, + "0x7C19": { + "group": "quantum", + "key": "QK_SPACE_CADET_RIGHT_CTRL_PARENTHESIS_CLOSE", + "aliases": [ + "SC_RCPC" + ] + }, + "0x7C1A": { + "group": "quantum", + "key": "QK_SPACE_CADET_LEFT_SHIFT_PARENTHESIS_OPEN", + "aliases": [ + "SC_LSPO" + ] + }, + "0x7C1B": { + "group": "quantum", + "key": "QK_SPACE_CADET_RIGHT_SHIFT_PARENTHESIS_CLOSE", + "aliases": [ + "SC_RSPC" + ] + }, + "0x7C1C": { + "group": "quantum", + "key": "QK_SPACE_CADET_LEFT_ALT_PARENTHESIS_OPEN", + "aliases": [ + "SC_LAPO" + ] + }, + "0x7C1D": { + "group": "quantum", + "key": "QK_SPACE_CADET_RIGHT_ALT_PARENTHESIS_CLOSE", + "aliases": [ + "SC_RAPC" + ] + }, + "0x7C1E": { + "group": "quantum", + "key": "QK_SPACE_CADET_RIGHT_SHIFT_ENTER", + "aliases": [ + "SC_SENT" + ] + }, + + "0x7C20": { + "group": "quantum", + "key": "OUT_AUTO" + }, + "0x7C21": { + "group": "quantum", + "key": "OUT_USB" + }, + "0x7C22": { + "group": "quantum", + "key": "OUT_BT" + }, + + "0x7C30": { + "group": "quantum", + "key": "QK_UNICODE_MODE_NEXT", + "aliases": [ + "UC_NEXT" + ] + }, + "0x7C31": { + "group": "quantum", + "key": "QK_UNICODE_MODE_PREVIOUS", + "aliases": [ + "UC_PREV" + ] + }, + "0x7C32": { + "group": "quantum", + "key": "QK_UNICODE_MODE_MACOS", + "aliases": [ + "UC_MAC" + ] + }, + "0x7C33": { + "group": "quantum", + "key": "QK_UNICODE_MODE_LINUX", + "aliases": [ + "UC_LINX" + ] + }, + "0x7C34": { + "group": "quantum", + "key": "QK_UNICODE_MODE_WINDOWS", + "aliases": [ + "UC_WIN" + ] + }, + "0x7C35": { + "group": "quantum", + "key": "QK_UNICODE_MODE_BSD", + "aliases": [ + "UC_BSD" + ] + }, + "0x7C36": { + "group": "quantum", + "key": "QK_UNICODE_MODE_WINCOMPOSE", + "aliases": [ + "UC_WINC" + ] + }, + "0x7C37": { + "group": "quantum", + "key": "QK_UNICODE_MODE_EMACS", + "aliases": [ + "UC_EMAC" + ] + }, + + "0x7C40": { + "group": "quantum", + "key": "HPT_ON" + }, + "0x7C41": { + "group": "quantum", + "key": "HPT_OFF" + }, + "0x7C42": { + "group": "quantum", + "key": "HPT_TOG" + }, + "0x7C43": { + "group": "quantum", + "key": "HPT_RST" + }, + "0x7C44": { + "group": "quantum", + "key": "HPT_FBK" + }, + "0x7C45": { + "group": "quantum", + "key": "HPT_BUZ" + }, + "0x7C46": { + "group": "quantum", + "key": "HPT_MODI" + }, + "0x7C47": { + "group": "quantum", + "key": "HPT_MODD" + }, + "0x7C48": { + "group": "quantum", + "key": "HPT_CONT" + }, + "0x7C49": { + "group": "quantum", + "key": "HPT_CONI" + }, + "0x7C4A": { + "group": "quantum", + "key": "HPT_COND" + }, + "0x7C4B": { + "group": "quantum", + "key": "HPT_DWLI" + }, + "0x7C4C": { + "group": "quantum", + "key": "HPT_DWLD" + }, + + "0x7C50": { + "group": "quantum", + "key": "QK_COMBO_ON", + "aliases": [ + "CM_ON" + ] + }, + "0x7C51": { + "group": "quantum", + "key": "QK_COMBO_OFF", + "aliases": [ + "CM_OFF" + ] + }, + "0x7C52": { + "group": "quantum", + "key": "QK_COMBO_TOGGLE", + "aliases": [ + "CM_TOGG" + ] + }, + + "0x7C53": { + "group": "quantum", + "key": "QK_DYNAMIC_MACRO_RECORD_START_1", + "aliases": [ + "DM_REC1" + ] + }, + "0x7C54": { + "group": "quantum", + "key": "QK_DYNAMIC_MACRO_RECORD_START_2", + "aliases": [ + "DM_REC2" + ] + }, + "0x7C55": { + "group": "quantum", + "key": "QK_DYNAMIC_MACRO_RECORD_STOP", + "aliases": [ + "DM_RSTP" + ] + }, + "0x7C56": { + "group": "quantum", + "key": "QK_DYNAMIC_MACRO_PLAY_1", + "aliases": [ + "DM_PLY1" + ] + }, + "0x7C57": { + "group": "quantum", + "key": "QK_DYNAMIC_MACRO_PLAY_2", + "aliases": [ + "DM_PLY2" + ] + }, + + "0x7C58": { + "group": "quantum", + "key": "QK_LEADER", + "aliases": [ + "QK_LEAD" + ] + }, + + "0x7C59": { + "group": "quantum", + "key": "QK_LOCK" + }, + + "0x7C5A": { + "group": "quantum", + "key": "QK_ONE_SHOT_ON", + "aliases": [ + "OS_ON" + ] + }, + "0x7C5B": { + "group": "quantum", + "key": "QK_ONE_SHOT_OFF", + "aliases": [ + "OS_OFF" + ] + }, + "0x7C5C": { + "group": "quantum", + "key": "QK_ONE_SHOT_TOGGLE", + "aliases": [ + "OS_TOGG" + ] + }, + + "0x7C5D": { + "group": "quantum", + "key": "QK_KEY_OVERRIDE_TOGGLE", + "aliases": [ + "KO_TOGG" + ] + }, + "0x7C5E": { + "group": "quantum", + "key": "QK_KEY_OVERRIDE_ON", + "aliases": [ + "KO_ON" + ] + }, + "0x7C5F": { + "group": "quantum", + "key": "QK_KEY_OVERRIDE_OFF", + "aliases": [ + "KO_OFF" + ] + }, + + "0x7C60": { + "group": "quantum", + "key": "QK_SECURE_LOCK", + "aliases": [ + "SE_LOCK" + ] + }, + "0x7C61": { + "group": "quantum", + "key": "QK_SECURE_UNLOCK", + "aliases": [ + "SE_UNLK" + ] + }, + "0x7C62": { + "group": "quantum", + "key": "QK_SECURE_TOGGLE", + "aliases": [ + "SE_TOGG" + ] + }, + "0x7C63": { + "group": "quantum", + "key": "QK_SECURE_REQUEST", + "aliases": [ + "SE_REQ" + ] + }, + + "0x7C70": { + "group": "quantum", + "key": "DT_PRNT" + }, + "0x7C71": { + "group": "quantum", + "key": "DT_UP" + }, + "0x7C72": { + "group": "quantum", + "key": "DT_DOWN" + }, + + "0x7C73": { + "group": "quantum", + "key": "PRINT_ON" + }, + "0x7C74": { + "group": "quantum", + "key": "PRINT_OFF" + }, + + "0x7C75": { + "group": "quantum", + "key": "QK_CAPS_WORD_TOGGLE", + "aliases": [ + "CW_TOGG" + ] + }, + + "0x7C76": { + "group": "quantum", + "key": "QK_AUTOCORRECT_ON", + "aliases": [ + "AC_ON" + ] + }, + "0x7C77": { + "group": "quantum", + "key": "QK_AUTOCORRECT_OFF", + "aliases": [ + "AC_OFF" + ] + }, + "0x7C78": { + "group": "quantum", + "key": "QK_AUTOCORRECT_TOGGLE", + "aliases": [ + "AC_TOGG" + ] + } + } +} \ No newline at end of file diff --git a/data/constants/keycodes/keycodes_0.0.1_sequencer.hjson b/data/constants/keycodes/keycodes_0.0.1_sequencer.hjson new file mode 100644 index 0000000000..039d09b2fa --- /dev/null +++ b/data/constants/keycodes/keycodes_0.0.1_sequencer.hjson @@ -0,0 +1,40 @@ +{ + "keycodes": { + "0x7200": { + "group": "sequencer", + "key": "SQ_ON" + }, + "0x7201": { + "group": "sequencer", + "key": "SQ_OFF" + }, + "0x7202": { + "group": "sequencer", + "key": "SQ_TOG" + }, + "0x7203": { + "group": "sequencer", + "key": "SQ_TMPD" + }, + "0x7204": { + "group": "sequencer", + "key": "SQ_TMPU" + }, + "0x7205": { + "group": "sequencer", + "key": "SQ_RESD" + }, + "0x7206": { + "group": "sequencer", + "key": "SQ_RESU" + }, + "0x7207": { + "group": "sequencer", + "key": "SQ_SALL" + }, + "0x7208": { + "group": "sequencer", + "key": "SQ_SCLR" + } + } +} \ No newline at end of file diff --git a/data/constants/keycodes/keycodes_0.0.1_steno.hjson b/data/constants/keycodes/keycodes_0.0.1_steno.hjson new file mode 100644 index 0000000000..cd19fdcde5 --- /dev/null +++ b/data/constants/keycodes/keycodes_0.0.1_steno.hjson @@ -0,0 +1,20 @@ +{ + "keycodes": { + "0x74F0": { + "group": "steno", + "key": "QK_STENO_BOLT" + }, + "0x74F1": { + "group": "steno", + "key": "QK_STENO_GEMINI" + }, + "0x74F2": { + "group": "steno", + "key": "QK_STENO_COMB" + }, + "0x74FC": { + "group": "steno", + "key": "QK_STENO_COMB_MAX" + } + } +} diff --git a/data/constants/keycodes/keycodes_0.0.1_swap_hands.hjson b/data/constants/keycodes/keycodes_0.0.1_swap_hands.hjson new file mode 100644 index 0000000000..c800baef35 --- /dev/null +++ b/data/constants/keycodes/keycodes_0.0.1_swap_hands.hjson @@ -0,0 +1,32 @@ +{ + "keycodes": { + "0x56F0": { + "group": "swap_hands", + "key": "SH_TG" + }, + "0x56F1": { + "group": "swap_hands", + "key": "SH_TT" + }, + "0x56F2": { + "group": "swap_hands", + "key": "SH_MON" + }, + "0x56F3": { + "group": "swap_hands", + "key": "SH_MOFF" + }, + "0x56F4": { + "group": "swap_hands", + "key": "SH_OFF" + }, + "0x56F5": { + "group": "swap_hands", + "key": "SH_ON" + }, + "0x56F6": { + "group": "swap_hands", + "key": "SH_OS" + } + } +} diff --git a/data/schemas/keycodes.jsonschema b/data/schemas/keycodes.jsonschema new file mode 100644 index 0000000000..77a8347b3b --- /dev/null +++ b/data/schemas/keycodes.jsonschema @@ -0,0 +1,57 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema#", + "$id": "qmk.keycodes.v1", + "title": "Keycode Information", + "type": "object", + "definitions": { + "define": { + "type": "string", + "minLength": 2, + "maxLength": 50, + "pattern": "^[A-Zs_0-9]*$" + }, + "hex_number_4d": { + "type": "string", + "pattern": "^0x[0-9A-F]{4}$" + } + }, + "properties": { + "ranges": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "required": [ + "define" + ], + "properties": { + "define": {"$ref": "#/definitions/define"} + } + } + }, + "keycodes": { + "type": "object", + "propertyNames": { + "$ref": "#/definitions/hex_number_4d" + }, + "additionalProperties": { + "type": "object", + "required": [ + "key" + ], + "properties": { + "key": {"$ref": "#/definitions/define"}, + "aliases": { + "type": "array", + "minItems": 1, + "items": { + "type": "string" + } + } + } + } + } + } +} diff --git a/lib/python/qmk/cli/__init__.py b/lib/python/qmk/cli/__init__.py index cf5b5ad87e..9190af4e50 100644 --- a/lib/python/qmk/cli/__init__.py +++ b/lib/python/qmk/cli/__init__.py @@ -56,6 +56,7 @@ subcommands = [ 'qmk.cli.generate.info_json', 'qmk.cli.generate.keyboard_c', 'qmk.cli.generate.keyboard_h', + 'qmk.cli.generate.keycodes', 'qmk.cli.generate.rgb_breathe_table', 'qmk.cli.generate.rules_mk', 'qmk.cli.generate.version_h', diff --git a/lib/python/qmk/cli/generate/api.py b/lib/python/qmk/cli/generate/api.py index 8d8ca3cd41..0f29cd2327 100755 --- a/lib/python/qmk/cli/generate/api.py +++ b/lib/python/qmk/cli/generate/api.py @@ -11,12 +11,23 @@ from qmk.info import info_json from qmk.json_encoders import InfoJSONEncoder from qmk.json_schema import json_load from qmk.keyboard import find_readme, list_keyboards +from qmk.keycodes import load_spec, list_versions DATA_PATH = Path('data') TEMPLATE_PATH = DATA_PATH / 'templates/api/' BUILD_API_PATH = Path('.build/api_data/') +def _resolve_keycode_specs(output_folder): + """To make it easier for consumers, publish pre-merged spec files + """ + for version in list_versions(): + overall = load_spec(version) + + output_file = output_folder / f'constants/keycodes_{version}.json' + output_file.write_text(json.dumps(overall, indent=4), encoding='utf-8') + + def _filtered_keyboard_list(): """Perform basic filtering of list_keyboards """ @@ -95,6 +106,9 @@ def generate_api(cli): 'usb': usb_list, } + # Feature specific handling + _resolve_keycode_specs(v1_dir) + # Write the global JSON files keyboard_all_json = json.dumps({'last_updated': current_datetime(), 'keyboards': kb_all}, cls=InfoJSONEncoder) usb_json = json.dumps({'last_updated': current_datetime(), 'usb': usb_list}, cls=InfoJSONEncoder) diff --git a/lib/python/qmk/cli/generate/keycodes.py b/lib/python/qmk/cli/generate/keycodes.py new file mode 100644 index 0000000000..29b7db3c80 --- /dev/null +++ b/lib/python/qmk/cli/generate/keycodes.py @@ -0,0 +1,88 @@ +"""Used by the make system to generate keycodes.h from keycodes_{version}.json +""" +from milc import cli + +from qmk.constants import GPL2_HEADER_C_LIKE, GENERATED_HEADER_C_LIKE +from qmk.commands import dump_lines +from qmk.path import normpath +from qmk.keycodes import load_spec + + +def _generate_ranges(lines, keycodes): + lines.append('') + lines.append('enum qk_keycode_ranges {') + lines.append('// Ranges') + for key, value in keycodes["ranges"].items(): + lo, mask = map(lambda x: int(x, 16), key.split("/")) + hi = lo + mask + define = value.get("define") + lines.append(f' {define.ljust(30)} = 0x{lo:04X},') + lines.append(f' {(define + "_MAX").ljust(30)} = 0x{hi:04X},') + lines.append('};') + + +def _generate_defines(lines, keycodes): + lines.append('') + lines.append('enum qk_keycode_defines {') + lines.append('// Keycodes') + for key, value in keycodes["keycodes"].items(): + lines.append(f' {value.get("key")} = {key},') + + lines.append('') + lines.append('// Alias') + for key, value in keycodes["keycodes"].items(): + temp = value.get("key") + for alias in value.get("aliases", []): + lines.append(f' {alias.ljust(10)} = {temp},') + + lines.append('};') + + +def _generate_helpers(lines, keycodes): + lines.append('') + lines.append('// Range Helpers') + for value in keycodes["ranges"].values(): + define = value.get("define") + lines.append(f'#define IS_{define}(code) ((code) >= {define} && (code) <= {define + "_MAX"})') + + # extract min/max + temp = {} + for key, value in keycodes["keycodes"].items(): + group = value.get('group', None) + if not group: + continue + if group not in temp: + temp[group] = [0xFFFF, 0] + key = int(key, 16) + if key < temp[group][0]: + temp[group][0] = key + if key > temp[group][1]: + temp[group][1] = key + + lines.append('') + lines.append('// Group Helpers') + for group, codes in temp.items(): + lo = keycodes["keycodes"][f'0x{codes[0]:04X}']['key'] + hi = keycodes["keycodes"][f'0x{codes[1]:04X}']['key'] + lines.append(f'#define IS_{ group.upper() }_KEYCODE(code) ((code) >= {lo} && (code) <= {hi})') + + +@cli.argument('-v', '--version', arg_only=True, required=True, help='Version of keycodes to generate.') +@cli.argument('-o', '--output', arg_only=True, type=normpath, help='File to write to') +@cli.argument('-q', '--quiet', arg_only=True, action='store_true', help="Quiet mode, only output error messages") +@cli.subcommand('Used by the make system to generate keycodes.h from keycodes_{version}.json', hidden=True) +def generate_keycodes(cli): + """Generates the keycodes.h file. + """ + + # Build the keycodes.h file. + keycodes_h_lines = [GPL2_HEADER_C_LIKE, GENERATED_HEADER_C_LIKE, '#pragma once', '// clang-format off'] + + keycodes = load_spec(cli.args.version) + + _generate_ranges(keycodes_h_lines, keycodes) + _generate_defines(keycodes_h_lines, keycodes) + _generate_helpers(keycodes_h_lines, keycodes) + + # Show the results + dump_lines(cli.args.output, keycodes_h_lines, cli.args.quiet) diff --git a/lib/python/qmk/keycodes.py b/lib/python/qmk/keycodes.py new file mode 100644 index 0000000000..cf1ee0767a --- /dev/null +++ b/lib/python/qmk/keycodes.py @@ -0,0 +1,57 @@ +from pathlib import Path + +from qmk.json_schema import deep_update, json_load, validate + +CONSTANTS_PATH = Path('data/constants/keycodes/') + + +def _validate(spec): + # first throw it to the jsonschema + validate(spec, 'qmk.keycodes.v1') + + # no duplicate keycodes + keycodes = [] + for value in spec['keycodes'].values(): + keycodes.append(value['key']) + keycodes.extend(value.get('aliases', [])) + duplicates = set([x for x in keycodes if keycodes.count(x) > 1]) + if duplicates: + raise ValueError(f'Keycode spec contains duplicate keycodes! ({",".join(duplicates)})') + + +def load_spec(version): + """Build keycode data from the requested spec file + """ + if version == 'latest': + version = list_versions()[0] + + file = CONSTANTS_PATH / f'keycodes_{version}.hjson' + if not file.exists(): + raise ValueError(f'Requested keycode spec ({version}) is invalid!') + + # Load base + spec = json_load(file) + + # Merge in fragments + fragments = CONSTANTS_PATH.glob(f'keycodes_{version}_*.hjson') + for file in fragments: + deep_update(spec, json_load(file)) + + # Sort? + spec['keycodes'] = dict(sorted(spec['keycodes'].items())) + + # Validate? + _validate(spec) + + return spec + + +def list_versions(): + """Return available versions - sorted newest first + """ + ret = [] + for file in CONSTANTS_PATH.glob('keycodes_[0-9].[0-9].[0-9].hjson'): + ret.append(file.stem.split('_')[1]) + + ret.sort(reverse=True) + return ret diff --git a/quantum/action_code.h b/quantum/action_code.h index 14cfd025f1..58d929016d 100644 --- a/quantum/action_code.h +++ b/quantum/action_code.h @@ -179,6 +179,9 @@ enum mods_bit { MOD_RALT = 0x14, MOD_RGUI = 0x18, }; +#define MOD_HYPR (MOD_LCTL | MOD_LSFT | MOD_LALT | MOD_LGUI) +#define MOD_MEH (MOD_LCTL | MOD_LSFT | MOD_LALT) + enum mods_codes { MODS_ONESHOT = 0x00, MODS_TAP_TOGGLE = 0x01, diff --git a/quantum/keycode.h b/quantum/keycode.h index 2e9a85ee66..45736e92f1 100644 --- a/quantum/keycode.h +++ b/quantum/keycode.h @@ -26,16 +26,14 @@ along with this program. If not, see . /* FIXME: Add doxygen comments here */ -#define IS_ERROR(code) (KC_ROLL_OVER <= (code) && (code) <= KC_UNDEFINED) #define IS_ANY(code) (KC_A <= (code) && (code) <= 0xFF) -#define IS_KEY(code) (KC_A <= (code) && (code) <= KC_EXSEL) -#define IS_MOD(code) (KC_LEFT_CTRL <= (code) && (code) <= KC_RIGHT_GUI) +#define IS_KEY(code) IS_BASIC_KEYCODE(code) +#define IS_MOD(code) IS_MODIFIERS_KEYCODE(code) -#define IS_SPECIAL(code) ((0xA5 <= (code) && (code) <= 0xDF) || (0xE8 <= (code) && (code) <= 0xFF)) -#define IS_SYSTEM(code) (KC_PWR <= (code) && (code) <= KC_WAKE) -#define IS_CONSUMER(code) (KC_MUTE <= (code) && (code) <= KC_ASST) +#define IS_SYSTEM(code) IS_SYSTEM_KEYCODE(code) +#define IS_CONSUMER(code) IS_MEDIA_KEYCODE(code) -#define IS_MOUSEKEY(code) (KC_MS_UP <= (code) && (code) <= KC_MS_ACCEL2) +#define IS_MOUSEKEY(code) IS_MOUSE_KEYCODE(code) #define IS_MOUSEKEY_MOVE(code) (KC_MS_UP <= (code) && (code) <= KC_MS_RIGHT) #define IS_MOUSEKEY_BUTTON(code) (KC_MS_BTN1 <= (code) && (code) <= KC_MS_BTN8) #define IS_MOUSEKEY_WHEEL(code) (KC_MS_WH_UP <= (code) && (code) <= KC_MS_WH_RIGHT) @@ -62,486 +60,5 @@ along with this program. If not, see . // clang-format off -/* - * Short names for ease of definition of keymap - */ -/* Transparent */ -#define KC_TRANSPARENT 0x01 -#define KC_TRNS KC_TRANSPARENT - -/* Punctuation */ -#define KC_ENT KC_ENTER -#define KC_ESC KC_ESCAPE -#define KC_BSPC KC_BACKSPACE -#define KC_SPC KC_SPACE -#define KC_MINS KC_MINUS -#define KC_EQL KC_EQUAL -#define KC_LBRC KC_LEFT_BRACKET -#define KC_RBRC KC_RIGHT_BRACKET -#define KC_BSLS KC_BACKSLASH -#define KC_NUHS KC_NONUS_HASH -#define KC_SCLN KC_SEMICOLON -#define KC_QUOT KC_QUOTE -#define KC_GRV KC_GRAVE -#define KC_COMM KC_COMMA -#define KC_SLSH KC_SLASH -#define KC_NUBS KC_NONUS_BACKSLASH - -/* Lock Keys */ -#define KC_CAPS KC_CAPS_LOCK -#define KC_SCRL KC_SCROLL_LOCK -#define KC_NUM KC_NUM_LOCK -#define KC_LCAP KC_LOCKING_CAPS_LOCK -#define KC_LNUM KC_LOCKING_NUM_LOCK -#define KC_LSCR KC_LOCKING_SCROLL_LOCK - -/* Commands */ -#define KC_PSCR KC_PRINT_SCREEN -#define KC_PAUS KC_PAUSE -#define KC_BRK KC_PAUSE -#define KC_INS KC_INSERT -#define KC_PGUP KC_PAGE_UP -#define KC_DEL KC_DELETE -#define KC_PGDN KC_PAGE_DOWN -#define KC_RGHT KC_RIGHT -#define KC_APP KC_APPLICATION -#define KC_EXEC KC_EXECUTE -#define KC_SLCT KC_SELECT -#define KC_AGIN KC_AGAIN -#define KC_PSTE KC_PASTE -#define KC_ERAS KC_ALTERNATE_ERASE -#define KC_SYRQ KC_SYSTEM_REQUEST -#define KC_CNCL KC_CANCEL -#define KC_CLR KC_CLEAR -#define KC_PRIR KC_PRIOR -#define KC_RETN KC_RETURN -#define KC_SEPR KC_SEPARATOR -#define KC_CLAG KC_CLEAR_AGAIN -#define KC_CRSL KC_CRSEL -#define KC_EXSL KC_EXSEL - -/* Keypad */ -#define KC_PSLS KC_KP_SLASH -#define KC_PAST KC_KP_ASTERISK -#define KC_PMNS KC_KP_MINUS -#define KC_PPLS KC_KP_PLUS -#define KC_PENT KC_KP_ENTER -#define KC_P1 KC_KP_1 -#define KC_P2 KC_KP_2 -#define KC_P3 KC_KP_3 -#define KC_P4 KC_KP_4 -#define KC_P5 KC_KP_5 -#define KC_P6 KC_KP_6 -#define KC_P7 KC_KP_7 -#define KC_P8 KC_KP_8 -#define KC_P9 KC_KP_9 -#define KC_P0 KC_KP_0 -#define KC_PDOT KC_KP_DOT -#define KC_PEQL KC_KP_EQUAL -#define KC_PCMM KC_KP_COMMA - -/* Language Specific */ -#define KC_INT1 KC_INTERNATIONAL_1 -#define KC_INT2 KC_INTERNATIONAL_2 -#define KC_INT3 KC_INTERNATIONAL_3 -#define KC_INT4 KC_INTERNATIONAL_4 -#define KC_INT5 KC_INTERNATIONAL_5 -#define KC_INT6 KC_INTERNATIONAL_6 -#define KC_INT7 KC_INTERNATIONAL_7 -#define KC_INT8 KC_INTERNATIONAL_8 -#define KC_INT9 KC_INTERNATIONAL_9 -#define KC_LNG1 KC_LANGUAGE_1 -#define KC_LNG2 KC_LANGUAGE_2 -#define KC_LNG3 KC_LANGUAGE_3 -#define KC_LNG4 KC_LANGUAGE_4 -#define KC_LNG5 KC_LANGUAGE_5 -#define KC_LNG6 KC_LANGUAGE_6 -#define KC_LNG7 KC_LANGUAGE_7 -#define KC_LNG8 KC_LANGUAGE_8 -#define KC_LNG9 KC_LANGUAGE_9 - -/* Modifiers */ -#define KC_LCTL KC_LEFT_CTRL -#define KC_LSFT KC_LEFT_SHIFT -#define KC_LALT KC_LEFT_ALT -#define KC_LOPT KC_LEFT_ALT -#define KC_LGUI KC_LEFT_GUI -#define KC_LCMD KC_LEFT_GUI -#define KC_LWIN KC_LEFT_GUI -#define KC_RCTL KC_RIGHT_CTRL -#define KC_RSFT KC_RIGHT_SHIFT -#define KC_RALT KC_RIGHT_ALT -#define KC_ALGR KC_RIGHT_ALT -#define KC_ROPT KC_RIGHT_ALT -#define KC_RGUI KC_RIGHT_GUI -#define KC_RCMD KC_RIGHT_GUI -#define KC_RWIN KC_RIGHT_GUI - -/* Generic Desktop Page (0x01) */ -#define KC_PWR KC_SYSTEM_POWER -#define KC_SLEP KC_SYSTEM_SLEEP -#define KC_WAKE KC_SYSTEM_WAKE - -/* Consumer Page (0x0C) */ -#define KC_MUTE KC_AUDIO_MUTE -#define KC_VOLU KC_AUDIO_VOL_UP -#define KC_VOLD KC_AUDIO_VOL_DOWN -#define KC_MNXT KC_MEDIA_NEXT_TRACK -#define KC_MPRV KC_MEDIA_PREV_TRACK -#define KC_MSTP KC_MEDIA_STOP -#define KC_MPLY KC_MEDIA_PLAY_PAUSE -#define KC_MSEL KC_MEDIA_SELECT -#define KC_EJCT KC_MEDIA_EJECT -#define KC_CALC KC_CALCULATOR -#define KC_MYCM KC_MY_COMPUTER -#define KC_WSCH KC_WWW_SEARCH -#define KC_WHOM KC_WWW_HOME -#define KC_WBAK KC_WWW_BACK -#define KC_WFWD KC_WWW_FORWARD -#define KC_WSTP KC_WWW_STOP -#define KC_WREF KC_WWW_REFRESH -#define KC_WFAV KC_WWW_FAVORITES -#define KC_MFFD KC_MEDIA_FAST_FORWARD -#define KC_MRWD KC_MEDIA_REWIND -#define KC_BRIU KC_BRIGHTNESS_UP -#define KC_BRID KC_BRIGHTNESS_DOWN -#define KC_CPNL KC_CONTROL_PANEL -#define KC_ASST KC_ASSISTANT - -/* System Specific */ -#define KC_BRMU KC_PAUSE -#define KC_BRMD KC_SCROLL_LOCK - -/* Mouse Keys */ -#define KC_MS_U KC_MS_UP -#define KC_MS_D KC_MS_DOWN -#define KC_MS_L KC_MS_LEFT -#define KC_MS_R KC_MS_RIGHT -#define KC_BTN1 KC_MS_BTN1 -#define KC_BTN2 KC_MS_BTN2 -#define KC_BTN3 KC_MS_BTN3 -#define KC_BTN4 KC_MS_BTN4 -#define KC_BTN5 KC_MS_BTN5 -#define KC_BTN6 KC_MS_BTN6 -#define KC_BTN7 KC_MS_BTN7 -#define KC_BTN8 KC_MS_BTN8 -#define KC_WH_U KC_MS_WH_UP -#define KC_WH_D KC_MS_WH_DOWN -#define KC_WH_L KC_MS_WH_LEFT -#define KC_WH_R KC_MS_WH_RIGHT -#define KC_ACL0 KC_MS_ACCEL0 -#define KC_ACL1 KC_MS_ACCEL1 -#define KC_ACL2 KC_MS_ACCEL2 - -// clang-format on - -/* Keyboard/Keypad Page (0x07) */ -enum hid_keyboard_keypad_usage { - KC_NO = 0x00, - KC_ROLL_OVER, - KC_POST_FAIL, - KC_UNDEFINED, - KC_A, - KC_B, - KC_C, - KC_D, - KC_E, - KC_F, - KC_G, - KC_H, - KC_I, - KC_J, - KC_K, - KC_L, - KC_M, // 0x10 - KC_N, - KC_O, - KC_P, - KC_Q, - KC_R, - KC_S, - KC_T, - KC_U, - KC_V, - KC_W, - KC_X, - KC_Y, - KC_Z, - KC_1, - KC_2, - KC_3, // 0x20 - KC_4, - KC_5, - KC_6, - KC_7, - KC_8, - KC_9, - KC_0, - KC_ENTER, - KC_ESCAPE, - KC_BACKSPACE, - KC_TAB, - KC_SPACE, - KC_MINUS, - KC_EQUAL, - KC_LEFT_BRACKET, - KC_RIGHT_BRACKET, // 0x30 - KC_BACKSLASH, - KC_NONUS_HASH, - KC_SEMICOLON, - KC_QUOTE, - KC_GRAVE, - KC_COMMA, - KC_DOT, - KC_SLASH, - KC_CAPS_LOCK, - KC_F1, - KC_F2, - KC_F3, - KC_F4, - KC_F5, - KC_F6, - KC_F7, // 0x40 - KC_F8, - KC_F9, - KC_F10, - KC_F11, - KC_F12, - KC_PRINT_SCREEN, - KC_SCROLL_LOCK, - KC_PAUSE, - KC_INSERT, - KC_HOME, - KC_PAGE_UP, - KC_DELETE, - KC_END, - KC_PAGE_DOWN, - KC_RIGHT, - KC_LEFT, // 0x50 - KC_DOWN, - KC_UP, - KC_NUM_LOCK, - KC_KP_SLASH, - KC_KP_ASTERISK, - KC_KP_MINUS, - KC_KP_PLUS, - KC_KP_ENTER, - KC_KP_1, - KC_KP_2, - KC_KP_3, - KC_KP_4, - KC_KP_5, - KC_KP_6, - KC_KP_7, - KC_KP_8, // 0x60 - KC_KP_9, - KC_KP_0, - KC_KP_DOT, - KC_NONUS_BACKSLASH, - KC_APPLICATION, - KC_KB_POWER, - KC_KP_EQUAL, - KC_F13, - KC_F14, - KC_F15, - KC_F16, - KC_F17, - KC_F18, - KC_F19, - KC_F20, - KC_F21, // 0x70 - KC_F22, - KC_F23, - KC_F24, - KC_EXECUTE, - KC_HELP, - KC_MENU, - KC_SELECT, - KC_STOP, - KC_AGAIN, - KC_UNDO, - KC_CUT, - KC_COPY, - KC_PASTE, - KC_FIND, - KC_KB_MUTE, - KC_KB_VOLUME_UP, // 0x80 - KC_KB_VOLUME_DOWN, - KC_LOCKING_CAPS_LOCK, - KC_LOCKING_NUM_LOCK, - KC_LOCKING_SCROLL_LOCK, - KC_KP_COMMA, - KC_KP_EQUAL_AS400, - KC_INTERNATIONAL_1, - KC_INTERNATIONAL_2, - KC_INTERNATIONAL_3, - KC_INTERNATIONAL_4, - KC_INTERNATIONAL_5, - KC_INTERNATIONAL_6, - KC_INTERNATIONAL_7, - KC_INTERNATIONAL_8, - KC_INTERNATIONAL_9, - KC_LANGUAGE_1, // 0x90 - KC_LANGUAGE_2, - KC_LANGUAGE_3, - KC_LANGUAGE_4, - KC_LANGUAGE_5, - KC_LANGUAGE_6, - KC_LANGUAGE_7, - KC_LANGUAGE_8, - KC_LANGUAGE_9, - KC_ALTERNATE_ERASE, - KC_SYSTEM_REQUEST, - KC_CANCEL, - KC_CLEAR, - KC_PRIOR, - KC_RETURN, - KC_SEPARATOR, - KC_OUT, // 0xA0 - KC_OPER, - KC_CLEAR_AGAIN, - KC_CRSEL, - KC_EXSEL, - -#if 0 - // *************************************************************** - // These keycodes are present in the HID spec, but are * - // nonfunctional on modern OSes. QMK uses this range (0xA5-0xDF) * - // for the media and function keys instead - see below. * - // *************************************************************** - - KC_KP_00 = 0xB0, - KC_KP_000, - KC_THOUSANDS_SEPARATOR, - KC_DECIMAL_SEPARATOR, - KC_CURRENCY_UNIT, - KC_CURRENCY_SUB_UNIT, - KC_KP_LEFT_PARENTHESIS, - KC_KP_RIGHT_PARENTHESIS, - KC_KP_LEFT_BRACE, - KC_KP_RIGHT_BRACE, - KC_KP_TAB, - KC_KP_BACKSPACE, - KC_KP_A, - KC_KP_B, - KC_KP_C, - KC_KP_D, - KC_KP_E, //0xC0 - KC_KP_F, - KC_KP_XOR, - KC_KP_HAT, - KC_KP_PERCENT, - KC_KP_LESS_THAN, - KC_KP_GREATER_THAN, - KC_KP_AND, - KC_KP_LAZY_AND, - KC_KP_OR, - KC_KP_LAZY_OR, - KC_KP_COLON, - KC_KP_HASH, - KC_KP_SPACE, - KC_KP_AT, - KC_KP_EXCLAMATION, - KC_KP_MEM_STORE, //0xD0 - KC_KP_MEM_RECALL, - KC_KP_MEM_CLEAR, - KC_KP_MEM_ADD, - KC_KP_MEM_SUB, - KC_KP_MEM_MUL, - KC_KP_MEM_DIV, - KC_KP_PLUS_MINUS, - KC_KP_CLEAR, - KC_KP_CLEAR_ENTRY, - KC_KP_BINARY, - KC_KP_OCTAL, - KC_KP_DECIMAL, - KC_KP_HEXADECIMAL, -#endif - - /* Modifiers */ - KC_LEFT_CTRL = 0xE0, - KC_LEFT_SHIFT, - KC_LEFT_ALT, - KC_LEFT_GUI, - KC_RIGHT_CTRL, - KC_RIGHT_SHIFT, - KC_RIGHT_ALT, - KC_RIGHT_GUI - - // ********************************************** - // * 0xF0-0xFF are unallocated in the HID spec. * - // * QMK uses these for Mouse Keys - see below. * - // ********************************************** -}; - -/* Media and Function keys */ -enum internal_special_keycodes { - /* Generic Desktop Page (0x01) */ - KC_SYSTEM_POWER = 0xA5, - KC_SYSTEM_SLEEP, - KC_SYSTEM_WAKE, - - /* Consumer Page (0x0C) */ - KC_AUDIO_MUTE, - KC_AUDIO_VOL_UP, - KC_AUDIO_VOL_DOWN, - KC_MEDIA_NEXT_TRACK, - KC_MEDIA_PREV_TRACK, - KC_MEDIA_STOP, - KC_MEDIA_PLAY_PAUSE, - KC_MEDIA_SELECT, - KC_MEDIA_EJECT, // 0xB0 - KC_MAIL, - KC_CALCULATOR, - KC_MY_COMPUTER, - KC_WWW_SEARCH, - KC_WWW_HOME, - KC_WWW_BACK, - KC_WWW_FORWARD, - KC_WWW_STOP, - KC_WWW_REFRESH, - KC_WWW_FAVORITES, - KC_MEDIA_FAST_FORWARD, - KC_MEDIA_REWIND, - KC_BRIGHTNESS_UP, - KC_BRIGHTNESS_DOWN, - KC_CONTROL_PANEL, - KC_ASSISTANT // 0xC0 -}; - -enum mouse_keys { -/* Mouse Buttons */ -#ifdef VIA_ENABLE - KC_MS_UP = 0xF0, -#else - KC_MS_UP = 0xCD, -#endif - KC_MS_DOWN, - KC_MS_LEFT, - KC_MS_RIGHT, - KC_MS_BTN1, - KC_MS_BTN2, - KC_MS_BTN3, - KC_MS_BTN4, - KC_MS_BTN5, -#ifdef VIA_ENABLE - KC_MS_BTN6 = KC_MS_BTN5, - KC_MS_BTN7 = KC_MS_BTN5, - KC_MS_BTN8 = KC_MS_BTN5, -#else - KC_MS_BTN6, - KC_MS_BTN7, - KC_MS_BTN8, -#endif - - /* Mouse Wheel */ - KC_MS_WH_UP, - KC_MS_WH_DOWN, - KC_MS_WH_LEFT, - KC_MS_WH_RIGHT, - - /* Acceleration */ - KC_MS_ACCEL0, - KC_MS_ACCEL1, - KC_MS_ACCEL2 // 0xDF, or 0xFF if via enabled -}; +// TODO: dd keycodes +#include "keycodes.h" diff --git a/quantum/keycodes.h b/quantum/keycodes.h new file mode 100644 index 0000000000..6772bb6a4a --- /dev/null +++ b/quantum/keycodes.h @@ -0,0 +1,1115 @@ +// Copyright 2022 QMK +// SPDX-License-Identifier: GPL-2.0-or-later + +/******************************************************************************* + 88888888888 888 d8b .d888 d8b 888 d8b + 888 888 Y8P d88P" Y8P 888 Y8P + 888 888 888 888 + 888 88888b. 888 .d8888b 888888 888 888 .d88b. 888 .d8888b + 888 888 "88b 888 88K 888 888 888 d8P Y8b 888 88K + 888 888 888 888 "Y8888b. 888 888 888 88888888 888 "Y8888b. + 888 888 888 888 X88 888 888 888 Y8b. 888 X88 + 888 888 888 888 88888P' 888 888 888 "Y8888 888 88888P' + 888 888 + 888 888 + 888 888 + .d88b. .d88b. 88888b. .d88b. 888d888 8888b. 888888 .d88b. .d88888 + d88P"88b d8P Y8b 888 "88b d8P Y8b 888P" "88b 888 d8P Y8b d88" 888 + 888 888 88888888 888 888 88888888 888 .d888888 888 88888888 888 888 + Y88b 888 Y8b. 888 888 Y8b. 888 888 888 Y88b. Y8b. Y88b 888 + "Y88888 "Y8888 888 888 "Y8888 888 "Y888888 "Y888 "Y8888 "Y88888 + 888 + Y8b d88P + "Y88P" +*******************************************************************************/ + +#pragma once +// clang-format off + +enum qk_keycode_ranges { +// Ranges + QK_BASIC = 0x0000, + QK_BASIC_MAX = 0x00FF, + QK_MODS = 0x0100, + QK_MODS_MAX = 0x1FFF, + QK_MOD_TAP = 0x2000, + QK_MOD_TAP_MAX = 0x3FFF, + QK_LAYER_TAP = 0x4000, + QK_LAYER_TAP_MAX = 0x4FFF, + QK_LAYER_MOD = 0x5000, + QK_LAYER_MOD_MAX = 0x51FF, + QK_TO = 0x5200, + QK_TO_MAX = 0x521F, + QK_MOMENTARY = 0x5220, + QK_MOMENTARY_MAX = 0x523F, + QK_DEF_LAYER = 0x5240, + QK_DEF_LAYER_MAX = 0x525F, + QK_TOGGLE_LAYER = 0x5260, + QK_TOGGLE_LAYER_MAX = 0x527F, + QK_ONE_SHOT_LAYER = 0x5280, + QK_ONE_SHOT_LAYER_MAX = 0x529F, + QK_ONE_SHOT_MOD = 0x52A0, + QK_ONE_SHOT_MOD_MAX = 0x52BF, + QK_LAYER_TAP_TOGGLE = 0x52C0, + QK_LAYER_TAP_TOGGLE_MAX = 0x52DF, + QK_SWAP_HANDS = 0x5600, + QK_SWAP_HANDS_MAX = 0x56FF, + QK_TAP_DANCE = 0x5700, + QK_TAP_DANCE_MAX = 0x57FF, + QK_MAGIC = 0x7000, + QK_MAGIC_MAX = 0x70FF, + QK_MIDI = 0x7100, + QK_MIDI_MAX = 0x71FF, + QK_SEQUENCER = 0x7200, + QK_SEQUENCER_MAX = 0x73FF, + QK_JOYSTICK = 0x7400, + QK_JOYSTICK_MAX = 0x743F, + QK_PROGRAMMABLE_BUTTON = 0x7440, + QK_PROGRAMMABLE_BUTTON_MAX = 0x747F, + QK_AUDIO = 0x7480, + QK_AUDIO_MAX = 0x74BF, + QK_STENO = 0x74C0, + QK_STENO_MAX = 0x74FF, + QK_MACRO = 0x7700, + QK_MACRO_MAX = 0x777F, + QK_LIGHTING = 0x7800, + QK_LIGHTING_MAX = 0x78FF, + QK_QUANTUM = 0x7C00, + QK_QUANTUM_MAX = 0x7DFF, + QK_KB = 0x7E00, + QK_KB_MAX = 0x7EFF, + QK_USER = 0x7F00, + QK_USER_MAX = 0x7FFF, + QK_UNICODE = 0x8000, + QK_UNICODE_MAX = 0xFFFF, +}; + +enum qk_keycode_defines { +// Keycodes + KC_NO = 0x0000, + KC_TRANSPARENT = 0x0001, + KC_A = 0x0004, + KC_B = 0x0005, + KC_C = 0x0006, + KC_D = 0x0007, + KC_E = 0x0008, + KC_F = 0x0009, + KC_G = 0x000A, + KC_H = 0x000B, + KC_I = 0x000C, + KC_J = 0x000D, + KC_K = 0x000E, + KC_L = 0x000F, + KC_M = 0x0010, + KC_N = 0x0011, + KC_O = 0x0012, + KC_P = 0x0013, + KC_Q = 0x0014, + KC_R = 0x0015, + KC_S = 0x0016, + KC_T = 0x0017, + KC_U = 0x0018, + KC_V = 0x0019, + KC_W = 0x001A, + KC_X = 0x001B, + KC_Y = 0x001C, + KC_Z = 0x001D, + KC_1 = 0x001E, + KC_2 = 0x001F, + KC_3 = 0x0020, + KC_4 = 0x0021, + KC_5 = 0x0022, + KC_6 = 0x0023, + KC_7 = 0x0024, + KC_8 = 0x0025, + KC_9 = 0x0026, + KC_0 = 0x0027, + KC_ENTER = 0x0028, + KC_ESCAPE = 0x0029, + KC_BACKSPACE = 0x002A, + KC_TAB = 0x002B, + KC_SPACE = 0x002C, + KC_MINUS = 0x002D, + KC_EQUAL = 0x002E, + KC_LEFT_BRACKET = 0x002F, + KC_RIGHT_BRACKET = 0x0030, + KC_BACKSLASH = 0x0031, + KC_NONUS_HASH = 0x0032, + KC_SEMICOLON = 0x0033, + KC_QUOTE = 0x0034, + KC_GRAVE = 0x0035, + KC_COMMA = 0x0036, + KC_DOT = 0x0037, + KC_SLASH = 0x0038, + KC_CAPS_LOCK = 0x0039, + KC_F1 = 0x003A, + KC_F2 = 0x003B, + KC_F3 = 0x003C, + KC_F4 = 0x003D, + KC_F5 = 0x003E, + KC_F6 = 0x003F, + KC_F7 = 0x0040, + KC_F8 = 0x0041, + KC_F9 = 0x0042, + KC_F10 = 0x0043, + KC_F11 = 0x0044, + KC_F12 = 0x0045, + KC_PRINT_SCREEN = 0x0046, + KC_SCROLL_LOCK = 0x0047, + KC_PAUSE = 0x0048, + KC_INSERT = 0x0049, + KC_HOME = 0x004A, + KC_PAGE_UP = 0x004B, + KC_DELETE = 0x004C, + KC_END = 0x004D, + KC_PAGE_DOWN = 0x004E, + KC_RIGHT = 0x004F, + KC_LEFT = 0x0050, + KC_DOWN = 0x0051, + KC_UP = 0x0052, + KC_NUM_LOCK = 0x0053, + KC_KP_SLASH = 0x0054, + KC_KP_ASTERISK = 0x0055, + KC_KP_MINUS = 0x0056, + KC_KP_PLUS = 0x0057, + KC_KP_ENTER = 0x0058, + KC_KP_1 = 0x0059, + KC_KP_2 = 0x005A, + KC_KP_3 = 0x005B, + KC_KP_4 = 0x005C, + KC_KP_5 = 0x005D, + KC_KP_6 = 0x005E, + KC_KP_7 = 0x005F, + KC_KP_8 = 0x0060, + KC_KP_9 = 0x0061, + KC_KP_0 = 0x0062, + KC_KP_DOT = 0x0063, + KC_NONUS_BACKSLASH = 0x0064, + KC_APPLICATION = 0x0065, + KC_KB_POWER = 0x0066, + KC_KP_EQUAL = 0x0067, + KC_F13 = 0x0068, + KC_F14 = 0x0069, + KC_F15 = 0x006A, + KC_F16 = 0x006B, + KC_F17 = 0x006C, + KC_F18 = 0x006D, + KC_F19 = 0x006E, + KC_F20 = 0x006F, + KC_F21 = 0x0070, + KC_F22 = 0x0071, + KC_F23 = 0x0072, + KC_F24 = 0x0073, + KC_EXECUTE = 0x0074, + KC_HELP = 0x0075, + KC_MENU = 0x0076, + KC_SELECT = 0x0077, + KC_STOP = 0x0078, + KC_AGAIN = 0x0079, + KC_UNDO = 0x007A, + KC_CUT = 0x007B, + KC_COPY = 0x007C, + KC_PASTE = 0x007D, + KC_FIND = 0x007E, + KC_KB_MUTE = 0x007F, + KC_KB_VOLUME_UP = 0x0080, + KC_KB_VOLUME_DOWN = 0x0081, + KC_LOCKING_CAPS_LOCK = 0x0082, + KC_LOCKING_NUM_LOCK = 0x0083, + KC_LOCKING_SCROLL_LOCK = 0x0084, + KC_KP_COMMA = 0x0085, + KC_KP_EQUAL_AS400 = 0x0086, + KC_INTERNATIONAL_1 = 0x0087, + KC_INTERNATIONAL_2 = 0x0088, + KC_INTERNATIONAL_3 = 0x0089, + KC_INTERNATIONAL_4 = 0x008A, + KC_INTERNATIONAL_5 = 0x008B, + KC_INTERNATIONAL_6 = 0x008C, + KC_INTERNATIONAL_7 = 0x008D, + KC_INTERNATIONAL_8 = 0x008E, + KC_INTERNATIONAL_9 = 0x008F, + KC_LANGUAGE_1 = 0x0090, + KC_LANGUAGE_2 = 0x0091, + KC_LANGUAGE_3 = 0x0092, + KC_LANGUAGE_4 = 0x0093, + KC_LANGUAGE_5 = 0x0094, + KC_LANGUAGE_6 = 0x0095, + KC_LANGUAGE_7 = 0x0096, + KC_LANGUAGE_8 = 0x0097, + KC_LANGUAGE_9 = 0x0098, + KC_ALTERNATE_ERASE = 0x0099, + KC_SYSTEM_REQUEST = 0x009A, + KC_CANCEL = 0x009B, + KC_CLEAR = 0x009C, + KC_PRIOR = 0x009D, + KC_RETURN = 0x009E, + KC_SEPARATOR = 0x009F, + KC_OUT = 0x00A0, + KC_OPER = 0x00A1, + KC_CLEAR_AGAIN = 0x00A2, + KC_CRSEL = 0x00A3, + KC_EXSEL = 0x00A4, + KC_SYSTEM_POWER = 0x00A5, + KC_SYSTEM_SLEEP = 0x00A6, + KC_SYSTEM_WAKE = 0x00A7, + KC_AUDIO_MUTE = 0x00A8, + KC_AUDIO_VOL_UP = 0x00A9, + KC_AUDIO_VOL_DOWN = 0x00AA, + KC_MEDIA_NEXT_TRACK = 0x00AB, + KC_MEDIA_PREV_TRACK = 0x00AC, + KC_MEDIA_STOP = 0x00AD, + KC_MEDIA_PLAY_PAUSE = 0x00AE, + KC_MEDIA_SELECT = 0x00AF, + KC_MEDIA_EJECT = 0x00B0, + KC_MAIL = 0x00B1, + KC_CALCULATOR = 0x00B2, + KC_MY_COMPUTER = 0x00B3, + KC_WWW_SEARCH = 0x00B4, + KC_WWW_HOME = 0x00B5, + KC_WWW_BACK = 0x00B6, + KC_WWW_FORWARD = 0x00B7, + KC_WWW_STOP = 0x00B8, + KC_WWW_REFRESH = 0x00B9, + KC_WWW_FAVORITES = 0x00BA, + KC_MEDIA_FAST_FORWARD = 0x00BB, + KC_MEDIA_REWIND = 0x00BC, + KC_BRIGHTNESS_UP = 0x00BD, + KC_BRIGHTNESS_DOWN = 0x00BE, + KC_CONTROL_PANEL = 0x00BF, + KC_ASSISTANT = 0x00C0, + KC_MS_UP = 0x00CD, + KC_MS_DOWN = 0x00CE, + KC_MS_LEFT = 0x00CF, + KC_MS_RIGHT = 0x00D0, + KC_MS_BTN1 = 0x00D1, + KC_MS_BTN2 = 0x00D2, + KC_MS_BTN3 = 0x00D3, + KC_MS_BTN4 = 0x00D4, + KC_MS_BTN5 = 0x00D5, + KC_MS_BTN6 = 0x00D6, + KC_MS_BTN7 = 0x00D7, + KC_MS_BTN8 = 0x00D8, + KC_MS_WH_UP = 0x00D9, + KC_MS_WH_DOWN = 0x00DA, + KC_MS_WH_LEFT = 0x00DB, + KC_MS_WH_RIGHT = 0x00DC, + KC_MS_ACCEL0 = 0x00DD, + KC_MS_ACCEL1 = 0x00DE, + KC_MS_ACCEL2 = 0x00DF, + KC_LEFT_CTRL = 0x00E0, + KC_LEFT_SHIFT = 0x00E1, + KC_LEFT_ALT = 0x00E2, + KC_LEFT_GUI = 0x00E3, + KC_RIGHT_CTRL = 0x00E4, + KC_RIGHT_SHIFT = 0x00E5, + KC_RIGHT_ALT = 0x00E6, + KC_RIGHT_GUI = 0x00E7, + SH_TG = 0x56F0, + SH_TT = 0x56F1, + SH_MON = 0x56F2, + SH_MOFF = 0x56F3, + SH_OFF = 0x56F4, + SH_ON = 0x56F5, + SH_OS = 0x56F6, + MAGIC_SWAP_CONTROL_CAPSLOCK = 0x7000, + MAGIC_UNSWAP_CONTROL_CAPSLOCK = 0x7001, + MAGIC_TOGGLE_CONTROL_CAPSLOCK = 0x7002, + MAGIC_UNCAPSLOCK_TO_CONTROL = 0x7003, + MAGIC_CAPSLOCK_TO_CONTROL = 0x7004, + MAGIC_SWAP_LALT_LGUI = 0x7005, + MAGIC_UNSWAP_LALT_LGUI = 0x7006, + MAGIC_SWAP_RALT_RGUI = 0x7007, + MAGIC_UNSWAP_RALT_RGUI = 0x7008, + MAGIC_UNNO_GUI = 0x7009, + MAGIC_NO_GUI = 0x700A, + MAGIC_TOGGLE_GUI = 0x700B, + MAGIC_SWAP_GRAVE_ESC = 0x700C, + MAGIC_UNSWAP_GRAVE_ESC = 0x700D, + MAGIC_SWAP_BACKSLASH_BACKSPACE = 0x700E, + MAGIC_UNSWAP_BACKSLASH_BACKSPACE = 0x700F, + MAGIC_TOGGLE_BACKSLASH_BACKSPACE = 0x7010, + MAGIC_HOST_NKRO = 0x7011, + MAGIC_UNHOST_NKRO = 0x7012, + MAGIC_TOGGLE_NKRO = 0x7013, + MAGIC_SWAP_ALT_GUI = 0x7014, + MAGIC_UNSWAP_ALT_GUI = 0x7015, + MAGIC_TOGGLE_ALT_GUI = 0x7016, + MAGIC_SWAP_LCTL_LGUI = 0x7017, + MAGIC_UNSWAP_LCTL_LGUI = 0x7018, + MAGIC_SWAP_RCTL_RGUI = 0x7019, + MAGIC_UNSWAP_RCTL_RGUI = 0x701A, + MAGIC_SWAP_CTL_GUI = 0x701B, + MAGIC_UNSWAP_CTL_GUI = 0x701C, + MAGIC_TOGGLE_CTL_GUI = 0x701D, + MAGIC_EE_HANDS_LEFT = 0x701E, + MAGIC_EE_HANDS_RIGHT = 0x701F, + MAGIC_SWAP_ESCAPE_CAPSLOCK = 0x7020, + MAGIC_UNSWAP_ESCAPE_CAPSLOCK = 0x7021, + MAGIC_TOGGLE_ESCAPE_CAPSLOCK = 0x7022, + MI_ON = 0x7100, + MI_OFF = 0x7101, + MI_TOG = 0x7102, + MI_C = 0x7110, + MI_Cs = 0x7111, + MI_D = 0x7112, + MI_Ds = 0x7113, + MI_E = 0x7114, + MI_F = 0x7115, + MI_Fs = 0x7116, + MI_G = 0x7117, + MI_Gs = 0x7118, + MI_A = 0x7119, + MI_As = 0x711A, + MI_B = 0x711B, + MI_C_1 = 0x7120, + MI_Cs_1 = 0x7121, + MI_D_1 = 0x7122, + MI_Ds_1 = 0x7123, + MI_E_1 = 0x7124, + MI_F_1 = 0x7125, + MI_Fs_1 = 0x7126, + MI_G_1 = 0x7127, + MI_Gs_1 = 0x7128, + MI_A_1 = 0x7129, + MI_As_1 = 0x712A, + MI_B_1 = 0x712B, + MI_C_2 = 0x7130, + MI_Cs_2 = 0x7131, + MI_D_2 = 0x7132, + MI_Ds_2 = 0x7133, + MI_E_2 = 0x7134, + MI_F_2 = 0x7135, + MI_Fs_2 = 0x7136, + MI_G_2 = 0x7137, + MI_Gs_2 = 0x7138, + MI_A_2 = 0x7139, + MI_As_2 = 0x713A, + MI_B_2 = 0x713B, + MI_C_3 = 0x7140, + MI_Cs_3 = 0x7141, + MI_D_3 = 0x7142, + MI_Ds_3 = 0x7143, + MI_E_3 = 0x7144, + MI_F_3 = 0x7145, + MI_Fs_3 = 0x7146, + MI_G_3 = 0x7147, + MI_Gs_3 = 0x7148, + MI_A_3 = 0x7149, + MI_As_3 = 0x714A, + MI_B_3 = 0x714B, + MI_C_4 = 0x7150, + MI_Cs_4 = 0x7151, + MI_D_4 = 0x7152, + MI_Ds_4 = 0x7153, + MI_E_4 = 0x7154, + MI_F_4 = 0x7155, + MI_Fs_4 = 0x7156, + MI_G_4 = 0x7157, + MI_Gs_4 = 0x7158, + MI_A_4 = 0x7159, + MI_As_4 = 0x715A, + MI_B_4 = 0x715B, + MI_C_5 = 0x7160, + MI_Cs_5 = 0x7161, + MI_D_5 = 0x7162, + MI_Ds_5 = 0x7163, + MI_E_5 = 0x7164, + MI_F_5 = 0x7165, + MI_Fs_5 = 0x7166, + MI_G_5 = 0x7167, + MI_Gs_5 = 0x7168, + MI_A_5 = 0x7169, + MI_As_5 = 0x716A, + MI_B_5 = 0x716B, + MI_OCT_N2 = 0x7170, + MI_OCT_N1 = 0x7171, + MI_OCT_0 = 0x7172, + MI_OCT_1 = 0x7173, + MI_OCT_2 = 0x7174, + MI_OCT_3 = 0x7175, + MI_OCT_4 = 0x7176, + MI_OCT_5 = 0x7177, + MI_OCT_6 = 0x7178, + MI_OCT_7 = 0x7179, + MI_OCTD = 0x717A, + MI_OCTU = 0x717B, + MI_TRNS_N6 = 0x7180, + MI_TRNS_N5 = 0x7181, + MI_TRNS_N4 = 0x7182, + MI_TRNS_N3 = 0x7183, + MI_TRNS_N2 = 0x7184, + MI_TRNS_N1 = 0x7185, + MI_TRNS_0 = 0x7186, + MI_TRNS_1 = 0x7187, + MI_TRNS_2 = 0x7188, + MI_TRNS_3 = 0x7189, + MI_TRNS_4 = 0x718A, + MI_TRNS_5 = 0x718B, + MI_TRNS_6 = 0x718C, + MI_TRNSD = 0x718D, + MI_TRNSU = 0x718E, + MI_VEL_0 = 0x7190, + MI_VEL_1 = 0x7191, + MI_VEL_2 = 0x7192, + MI_VEL_3 = 0x7193, + MI_VEL_4 = 0x7194, + MI_VEL_5 = 0x7195, + MI_VEL_6 = 0x7196, + MI_VEL_7 = 0x7197, + MI_VEL_8 = 0x7198, + MI_VEL_9 = 0x7199, + MI_VEL_10 = 0x719A, + MI_VELD = 0x719B, + MI_VELU = 0x719C, + MI_CH1 = 0x71A0, + MI_CH2 = 0x71A1, + MI_CH3 = 0x71A2, + MI_CH4 = 0x71A3, + MI_CH5 = 0x71A4, + MI_CH6 = 0x71A5, + MI_CH7 = 0x71A6, + MI_CH8 = 0x71A7, + MI_CH9 = 0x71A8, + MI_CH10 = 0x71A9, + MI_CH11 = 0x71AA, + MI_CH12 = 0x71AB, + MI_CH13 = 0x71AC, + MI_CH14 = 0x71AD, + MI_CH15 = 0x71AE, + MI_CH16 = 0x71AF, + MI_CHD = 0x71B0, + MI_CHU = 0x71B1, + MI_ALLOFF = 0x71C0, + MI_SUS = 0x71C1, + MI_PORT = 0x71C2, + MI_SOST = 0x71C3, + MI_SOFT = 0x71C4, + MI_LEG = 0x71C5, + MI_MOD = 0x71C6, + MI_MODSD = 0x71C7, + MI_MODSU = 0x71C8, + MI_BENDD = 0x71C9, + MI_BENDU = 0x71CA, + SQ_ON = 0x7200, + SQ_OFF = 0x7201, + SQ_TOG = 0x7202, + SQ_TMPD = 0x7203, + SQ_TMPU = 0x7204, + SQ_RESD = 0x7205, + SQ_RESU = 0x7206, + SQ_SALL = 0x7207, + SQ_SCLR = 0x7208, + QK_JOYSTICK_BUTTON_0 = 0x7400, + QK_JOYSTICK_BUTTON_1 = 0x7401, + QK_JOYSTICK_BUTTON_2 = 0x7402, + QK_JOYSTICK_BUTTON_3 = 0x7403, + QK_JOYSTICK_BUTTON_4 = 0x7404, + QK_JOYSTICK_BUTTON_5 = 0x7405, + QK_JOYSTICK_BUTTON_6 = 0x7406, + QK_JOYSTICK_BUTTON_7 = 0x7407, + QK_JOYSTICK_BUTTON_8 = 0x7408, + QK_JOYSTICK_BUTTON_9 = 0x7409, + QK_JOYSTICK_BUTTON_10 = 0x740A, + QK_JOYSTICK_BUTTON_11 = 0x740B, + QK_JOYSTICK_BUTTON_12 = 0x740C, + QK_JOYSTICK_BUTTON_13 = 0x740D, + QK_JOYSTICK_BUTTON_14 = 0x740E, + QK_JOYSTICK_BUTTON_15 = 0x740F, + QK_JOYSTICK_BUTTON_16 = 0x7410, + QK_JOYSTICK_BUTTON_17 = 0x7411, + QK_JOYSTICK_BUTTON_18 = 0x7412, + QK_JOYSTICK_BUTTON_19 = 0x7413, + QK_JOYSTICK_BUTTON_20 = 0x7414, + QK_JOYSTICK_BUTTON_21 = 0x7415, + QK_JOYSTICK_BUTTON_22 = 0x7416, + QK_JOYSTICK_BUTTON_23 = 0x7417, + QK_JOYSTICK_BUTTON_24 = 0x7418, + QK_JOYSTICK_BUTTON_25 = 0x7419, + QK_JOYSTICK_BUTTON_26 = 0x741A, + QK_JOYSTICK_BUTTON_27 = 0x741B, + QK_JOYSTICK_BUTTON_28 = 0x741C, + QK_JOYSTICK_BUTTON_29 = 0x741D, + QK_JOYSTICK_BUTTON_30 = 0x741E, + QK_JOYSTICK_BUTTON_31 = 0x741F, + QK_PROGRAMMABLE_BUTTON_1 = 0x7440, + QK_PROGRAMMABLE_BUTTON_2 = 0x7441, + QK_PROGRAMMABLE_BUTTON_3 = 0x7442, + QK_PROGRAMMABLE_BUTTON_4 = 0x7443, + QK_PROGRAMMABLE_BUTTON_5 = 0x7444, + QK_PROGRAMMABLE_BUTTON_6 = 0x7445, + QK_PROGRAMMABLE_BUTTON_7 = 0x7446, + QK_PROGRAMMABLE_BUTTON_8 = 0x7447, + QK_PROGRAMMABLE_BUTTON_9 = 0x7448, + QK_PROGRAMMABLE_BUTTON_10 = 0x7449, + QK_PROGRAMMABLE_BUTTON_11 = 0x744A, + QK_PROGRAMMABLE_BUTTON_12 = 0x744B, + QK_PROGRAMMABLE_BUTTON_13 = 0x744C, + QK_PROGRAMMABLE_BUTTON_14 = 0x744D, + QK_PROGRAMMABLE_BUTTON_15 = 0x744E, + QK_PROGRAMMABLE_BUTTON_16 = 0x744F, + QK_PROGRAMMABLE_BUTTON_17 = 0x7450, + QK_PROGRAMMABLE_BUTTON_18 = 0x7451, + QK_PROGRAMMABLE_BUTTON_19 = 0x7452, + QK_PROGRAMMABLE_BUTTON_20 = 0x7453, + QK_PROGRAMMABLE_BUTTON_21 = 0x7454, + QK_PROGRAMMABLE_BUTTON_22 = 0x7455, + QK_PROGRAMMABLE_BUTTON_23 = 0x7456, + QK_PROGRAMMABLE_BUTTON_24 = 0x7457, + QK_PROGRAMMABLE_BUTTON_25 = 0x7458, + QK_PROGRAMMABLE_BUTTON_26 = 0x7459, + QK_PROGRAMMABLE_BUTTON_27 = 0x745A, + QK_PROGRAMMABLE_BUTTON_28 = 0x745B, + QK_PROGRAMMABLE_BUTTON_29 = 0x745C, + QK_PROGRAMMABLE_BUTTON_30 = 0x745D, + QK_PROGRAMMABLE_BUTTON_31 = 0x745E, + QK_PROGRAMMABLE_BUTTON_32 = 0x745F, + AU_ON = 0x7480, + AU_OFF = 0x7481, + AU_TOG = 0x7482, + CLICKY_TOGGLE = 0x748A, + CLICKY_ENABLE = 0x748B, + CLICKY_DISABLE = 0x748C, + CLICKY_UP = 0x748D, + CLICKY_DOWN = 0x748E, + CLICKY_RESET = 0x748F, + MU_ON = 0x7490, + MU_OFF = 0x7491, + MU_TOG = 0x7492, + MU_MOD = 0x7493, + MUV_IN = 0x7494, + MUV_DE = 0x7495, + QK_STENO_BOLT = 0x74F0, + QK_STENO_GEMINI = 0x74F1, + QK_STENO_COMB = 0x74F2, + QK_STENO_COMB_MAX = 0x74FC, + MACRO_0 = 0x7700, + MACRO_1 = 0x7701, + MACRO_2 = 0x7702, + MACRO_3 = 0x7703, + MACRO_4 = 0x7704, + MACRO_5 = 0x7705, + MACRO_6 = 0x7706, + MACRO_7 = 0x7707, + MACRO_8 = 0x7708, + MACRO_9 = 0x7709, + MACRO_10 = 0x770A, + MACRO_11 = 0x770B, + MACRO_12 = 0x770C, + MACRO_13 = 0x770D, + MACRO_14 = 0x770E, + MACRO_15 = 0x770F, + MACRO_16 = 0x7710, + MACRO_17 = 0x7711, + MACRO_18 = 0x7712, + MACRO_19 = 0x7713, + MACRO_20 = 0x7714, + MACRO_21 = 0x7715, + MACRO_22 = 0x7716, + MACRO_23 = 0x7717, + MACRO_24 = 0x7718, + MACRO_25 = 0x7719, + MACRO_26 = 0x771A, + MACRO_27 = 0x771B, + MACRO_28 = 0x771C, + MACRO_29 = 0x771D, + MACRO_30 = 0x771E, + MACRO_31 = 0x771F, + BL_ON = 0x7800, + BL_OFF = 0x7801, + BL_DEC = 0x7802, + BL_INC = 0x7803, + BL_TOGG = 0x7804, + BL_STEP = 0x7805, + BL_BRTG = 0x7806, + RGB_TOG = 0x7820, + RGB_MODE_FORWARD = 0x7821, + RGB_MODE_REVERSE = 0x7822, + RGB_HUI = 0x7823, + RGB_HUD = 0x7824, + RGB_SAI = 0x7825, + RGB_SAD = 0x7826, + RGB_VAI = 0x7827, + RGB_VAD = 0x7828, + RGB_SPI = 0x7829, + RGB_SPD = 0x782A, + RGB_MODE_PLAIN = 0x782B, + RGB_MODE_BREATHE = 0x782C, + RGB_MODE_RAINBOW = 0x782D, + RGB_MODE_SWIRL = 0x782E, + RGB_MODE_SNAKE = 0x782F, + RGB_MODE_KNIGHT = 0x7830, + RGB_MODE_XMAS = 0x7831, + RGB_MODE_GRADIENT = 0x7832, + RGB_MODE_RGBTEST = 0x7833, + RGB_MODE_TWINKLE = 0x7834, + QK_BOOTLOADER = 0x7C00, + QK_REBOOT = 0x7C01, + QK_DEBUG_TOGGLE = 0x7C02, + QK_CLEAR_EEPROM = 0x7C03, + QK_MAKE = 0x7C04, + QK_AUTO_SHIFT_DOWN = 0x7C10, + QK_AUTO_SHIFT_UP = 0x7C11, + QK_AUTO_SHIFT_REPORT = 0x7C12, + QK_AUTO_SHIFT_ON = 0x7C13, + QK_AUTO_SHIFT_OFF = 0x7C14, + QK_AUTO_SHIFT_TOGGLE = 0x7C15, + QK_GRAVE_ESCAPE = 0x7C16, + QK_VELOCIKEY_TOGGLE = 0x7C17, + QK_SPACE_CADET_LEFT_CTRL_PARENTHESIS_OPEN = 0x7C18, + QK_SPACE_CADET_RIGHT_CTRL_PARENTHESIS_CLOSE = 0x7C19, + QK_SPACE_CADET_LEFT_SHIFT_PARENTHESIS_OPEN = 0x7C1A, + QK_SPACE_CADET_RIGHT_SHIFT_PARENTHESIS_CLOSE = 0x7C1B, + QK_SPACE_CADET_LEFT_ALT_PARENTHESIS_OPEN = 0x7C1C, + QK_SPACE_CADET_RIGHT_ALT_PARENTHESIS_CLOSE = 0x7C1D, + QK_SPACE_CADET_RIGHT_SHIFT_ENTER = 0x7C1E, + OUT_AUTO = 0x7C20, + OUT_USB = 0x7C21, + OUT_BT = 0x7C22, + QK_UNICODE_MODE_NEXT = 0x7C30, + QK_UNICODE_MODE_PREVIOUS = 0x7C31, + QK_UNICODE_MODE_MACOS = 0x7C32, + QK_UNICODE_MODE_LINUX = 0x7C33, + QK_UNICODE_MODE_WINDOWS = 0x7C34, + QK_UNICODE_MODE_BSD = 0x7C35, + QK_UNICODE_MODE_WINCOMPOSE = 0x7C36, + QK_UNICODE_MODE_EMACS = 0x7C37, + HPT_ON = 0x7C40, + HPT_OFF = 0x7C41, + HPT_TOG = 0x7C42, + HPT_RST = 0x7C43, + HPT_FBK = 0x7C44, + HPT_BUZ = 0x7C45, + HPT_MODI = 0x7C46, + HPT_MODD = 0x7C47, + HPT_CONT = 0x7C48, + HPT_CONI = 0x7C49, + HPT_COND = 0x7C4A, + HPT_DWLI = 0x7C4B, + HPT_DWLD = 0x7C4C, + QK_COMBO_ON = 0x7C50, + QK_COMBO_OFF = 0x7C51, + QK_COMBO_TOGGLE = 0x7C52, + QK_DYNAMIC_MACRO_RECORD_START_1 = 0x7C53, + QK_DYNAMIC_MACRO_RECORD_START_2 = 0x7C54, + QK_DYNAMIC_MACRO_RECORD_STOP = 0x7C55, + QK_DYNAMIC_MACRO_PLAY_1 = 0x7C56, + QK_DYNAMIC_MACRO_PLAY_2 = 0x7C57, + QK_LEADER = 0x7C58, + QK_LOCK = 0x7C59, + QK_ONE_SHOT_ON = 0x7C5A, + QK_ONE_SHOT_OFF = 0x7C5B, + QK_ONE_SHOT_TOGGLE = 0x7C5C, + QK_KEY_OVERRIDE_TOGGLE = 0x7C5D, + QK_KEY_OVERRIDE_ON = 0x7C5E, + QK_KEY_OVERRIDE_OFF = 0x7C5F, + QK_SECURE_LOCK = 0x7C60, + QK_SECURE_UNLOCK = 0x7C61, + QK_SECURE_TOGGLE = 0x7C62, + QK_SECURE_REQUEST = 0x7C63, + DT_PRNT = 0x7C70, + DT_UP = 0x7C71, + DT_DOWN = 0x7C72, + PRINT_ON = 0x7C73, + PRINT_OFF = 0x7C74, + QK_CAPS_WORD_TOGGLE = 0x7C75, + QK_AUTOCORRECT_ON = 0x7C76, + QK_AUTOCORRECT_OFF = 0x7C77, + QK_AUTOCORRECT_TOGGLE = 0x7C78, + SAFE_RANGE = 0x7E00, + +// Alias + XXXXXXX = KC_NO, + _______ = KC_TRANSPARENT, + KC_TRNS = KC_TRANSPARENT, + KC_ENT = KC_ENTER, + KC_ESC = KC_ESCAPE, + KC_BSPC = KC_BACKSPACE, + KC_SPC = KC_SPACE, + KC_MINS = KC_MINUS, + KC_EQL = KC_EQUAL, + KC_LBRC = KC_LEFT_BRACKET, + KC_RBRC = KC_RIGHT_BRACKET, + KC_BSLS = KC_BACKSLASH, + KC_NUHS = KC_NONUS_HASH, + KC_SCLN = KC_SEMICOLON, + KC_QUOT = KC_QUOTE, + KC_GRV = KC_GRAVE, + KC_COMM = KC_COMMA, + KC_SLSH = KC_SLASH, + KC_CAPS = KC_CAPS_LOCK, + KC_PSCR = KC_PRINT_SCREEN, + KC_SCRL = KC_SCROLL_LOCK, + KC_BRMD = KC_SCROLL_LOCK, + KC_PAUS = KC_PAUSE, + KC_BRK = KC_PAUSE, + KC_BRMU = KC_PAUSE, + KC_INS = KC_INSERT, + KC_PGUP = KC_PAGE_UP, + KC_DEL = KC_DELETE, + KC_PGDN = KC_PAGE_DOWN, + KC_RGHT = KC_RIGHT, + KC_NUM = KC_NUM_LOCK, + KC_PSLS = KC_KP_SLASH, + KC_PAST = KC_KP_ASTERISK, + KC_PMNS = KC_KP_MINUS, + KC_PPLS = KC_KP_PLUS, + KC_PENT = KC_KP_ENTER, + KC_P1 = KC_KP_1, + KC_P2 = KC_KP_2, + KC_P3 = KC_KP_3, + KC_P4 = KC_KP_4, + KC_P5 = KC_KP_5, + KC_P6 = KC_KP_6, + KC_P7 = KC_KP_7, + KC_P8 = KC_KP_8, + KC_P9 = KC_KP_9, + KC_P0 = KC_KP_0, + KC_PDOT = KC_KP_DOT, + KC_NUBS = KC_NONUS_BACKSLASH, + KC_APP = KC_APPLICATION, + KC_PEQL = KC_KP_EQUAL, + KC_EXEC = KC_EXECUTE, + KC_SLCT = KC_SELECT, + KC_AGIN = KC_AGAIN, + KC_PSTE = KC_PASTE, + KC_LCAP = KC_LOCKING_CAPS_LOCK, + KC_LNUM = KC_LOCKING_NUM_LOCK, + KC_LSCR = KC_LOCKING_SCROLL_LOCK, + KC_PCMM = KC_KP_COMMA, + KC_INT1 = KC_INTERNATIONAL_1, + KC_INT2 = KC_INTERNATIONAL_2, + KC_INT3 = KC_INTERNATIONAL_3, + KC_INT4 = KC_INTERNATIONAL_4, + KC_INT5 = KC_INTERNATIONAL_5, + KC_INT6 = KC_INTERNATIONAL_6, + KC_INT7 = KC_INTERNATIONAL_7, + KC_INT8 = KC_INTERNATIONAL_8, + KC_INT9 = KC_INTERNATIONAL_9, + KC_LNG1 = KC_LANGUAGE_1, + KC_LNG2 = KC_LANGUAGE_2, + KC_LNG3 = KC_LANGUAGE_3, + KC_LNG4 = KC_LANGUAGE_4, + KC_LNG5 = KC_LANGUAGE_5, + KC_LNG6 = KC_LANGUAGE_6, + KC_LNG7 = KC_LANGUAGE_7, + KC_LNG8 = KC_LANGUAGE_8, + KC_LNG9 = KC_LANGUAGE_9, + KC_ERAS = KC_ALTERNATE_ERASE, + KC_SYRQ = KC_SYSTEM_REQUEST, + KC_CNCL = KC_CANCEL, + KC_CLR = KC_CLEAR, + KC_PRIR = KC_PRIOR, + KC_RETN = KC_RETURN, + KC_SEPR = KC_SEPARATOR, + KC_CLAG = KC_CLEAR_AGAIN, + KC_CRSL = KC_CRSEL, + KC_EXSL = KC_EXSEL, + KC_PWR = KC_SYSTEM_POWER, + KC_SLEP = KC_SYSTEM_SLEEP, + KC_WAKE = KC_SYSTEM_WAKE, + KC_MUTE = KC_AUDIO_MUTE, + KC_VOLU = KC_AUDIO_VOL_UP, + KC_VOLD = KC_AUDIO_VOL_DOWN, + KC_MNXT = KC_MEDIA_NEXT_TRACK, + KC_MPRV = KC_MEDIA_PREV_TRACK, + KC_MSTP = KC_MEDIA_STOP, + KC_MPLY = KC_MEDIA_PLAY_PAUSE, + KC_MSEL = KC_MEDIA_SELECT, + KC_EJCT = KC_MEDIA_EJECT, + KC_CALC = KC_CALCULATOR, + KC_MYCM = KC_MY_COMPUTER, + KC_WSCH = KC_WWW_SEARCH, + KC_WHOM = KC_WWW_HOME, + KC_WBAK = KC_WWW_BACK, + KC_WFWD = KC_WWW_FORWARD, + KC_WSTP = KC_WWW_STOP, + KC_WREF = KC_WWW_REFRESH, + KC_WFAV = KC_WWW_FAVORITES, + KC_MFFD = KC_MEDIA_FAST_FORWARD, + KC_MRWD = KC_MEDIA_REWIND, + KC_BRIU = KC_BRIGHTNESS_UP, + KC_BRID = KC_BRIGHTNESS_DOWN, + KC_CPNL = KC_CONTROL_PANEL, + KC_ASST = KC_ASSISTANT, + KC_MS_U = KC_MS_UP, + KC_MS_D = KC_MS_DOWN, + KC_MS_L = KC_MS_LEFT, + KC_MS_R = KC_MS_RIGHT, + KC_BTN1 = KC_MS_BTN1, + KC_BTN2 = KC_MS_BTN2, + KC_BTN3 = KC_MS_BTN3, + KC_BTN4 = KC_MS_BTN4, + KC_BTN5 = KC_MS_BTN5, + KC_BTN6 = KC_MS_BTN6, + KC_BTN7 = KC_MS_BTN7, + KC_BTN8 = KC_MS_BTN8, + KC_WH_U = KC_MS_WH_UP, + KC_WH_D = KC_MS_WH_DOWN, + KC_WH_L = KC_MS_WH_LEFT, + KC_WH_R = KC_MS_WH_RIGHT, + KC_ACL0 = KC_MS_ACCEL0, + KC_ACL1 = KC_MS_ACCEL1, + KC_ACL2 = KC_MS_ACCEL2, + KC_LCTL = KC_LEFT_CTRL, + KC_LSFT = KC_LEFT_SHIFT, + KC_LALT = KC_LEFT_ALT, + KC_LOPT = KC_LEFT_ALT, + KC_LGUI = KC_LEFT_GUI, + KC_LCMD = KC_LEFT_GUI, + KC_LWIN = KC_LEFT_GUI, + KC_RCTL = KC_RIGHT_CTRL, + KC_RSFT = KC_RIGHT_SHIFT, + KC_RALT = KC_RIGHT_ALT, + KC_ROPT = KC_RIGHT_ALT, + KC_ALGR = KC_RIGHT_ALT, + KC_RGUI = KC_RIGHT_GUI, + KC_RCMD = KC_RIGHT_GUI, + KC_RWIN = KC_RIGHT_GUI, + CL_SWAP = MAGIC_SWAP_CONTROL_CAPSLOCK, + CL_NORM = MAGIC_UNSWAP_CONTROL_CAPSLOCK, + CL_TOGG = MAGIC_TOGGLE_CONTROL_CAPSLOCK, + CL_CAPS = MAGIC_UNCAPSLOCK_TO_CONTROL, + CL_CTRL = MAGIC_CAPSLOCK_TO_CONTROL, + LAG_SWP = MAGIC_SWAP_LALT_LGUI, + LAG_NRM = MAGIC_UNSWAP_LALT_LGUI, + RAG_SWP = MAGIC_SWAP_RALT_RGUI, + RAG_NRM = MAGIC_UNSWAP_RALT_RGUI, + GUI_ON = MAGIC_UNNO_GUI, + GUI_OFF = MAGIC_NO_GUI, + GUI_TOG = MAGIC_TOGGLE_GUI, + GE_SWAP = MAGIC_SWAP_GRAVE_ESC, + GE_NORM = MAGIC_UNSWAP_GRAVE_ESC, + BS_SWAP = MAGIC_SWAP_BACKSLASH_BACKSPACE, + BS_NORM = MAGIC_UNSWAP_BACKSLASH_BACKSPACE, + BS_TOGG = MAGIC_TOGGLE_BACKSLASH_BACKSPACE, + NK_ON = MAGIC_HOST_NKRO, + NK_OFF = MAGIC_UNHOST_NKRO, + NK_TOGG = MAGIC_TOGGLE_NKRO, + AG_SWAP = MAGIC_SWAP_ALT_GUI, + AG_NORM = MAGIC_UNSWAP_ALT_GUI, + AG_TOGG = MAGIC_TOGGLE_ALT_GUI, + LCG_SWP = MAGIC_SWAP_LCTL_LGUI, + LCG_NRM = MAGIC_UNSWAP_LCTL_LGUI, + RCG_SWP = MAGIC_SWAP_RCTL_RGUI, + RCG_NRM = MAGIC_UNSWAP_RCTL_RGUI, + CG_SWAP = MAGIC_SWAP_CTL_GUI, + CG_NORM = MAGIC_UNSWAP_CTL_GUI, + CG_TOGG = MAGIC_TOGGLE_CTL_GUI, + EH_LEFT = MAGIC_EE_HANDS_LEFT, + EH_RGHT = MAGIC_EE_HANDS_RIGHT, + EC_SWAP = MAGIC_SWAP_ESCAPE_CAPSLOCK, + EC_NORM = MAGIC_UNSWAP_ESCAPE_CAPSLOCK, + EC_TOGG = MAGIC_TOGGLE_ESCAPE_CAPSLOCK, + MI_Db = MI_Cs, + MI_Eb = MI_Ds, + MI_Gb = MI_Fs, + MI_Ab = MI_Gs, + MI_Bb = MI_As, + MI_Db_1 = MI_Cs_1, + MI_Eb_1 = MI_Ds_1, + MI_Gb_1 = MI_Fs_1, + MI_Ab_1 = MI_Gs_1, + MI_Bb_1 = MI_As_1, + MI_Db_2 = MI_Cs_2, + MI_Eb_2 = MI_Ds_2, + MI_Gb_2 = MI_Fs_2, + MI_Ab_2 = MI_Gs_2, + MI_Bb_2 = MI_As_2, + MI_Db_3 = MI_Cs_3, + MI_Eb_3 = MI_Ds_3, + MI_Gb_3 = MI_Fs_3, + MI_Ab_3 = MI_Gs_3, + MI_Bb_3 = MI_As_3, + MI_Db_4 = MI_Cs_4, + MI_Eb_4 = MI_Ds_4, + MI_Gb_4 = MI_Fs_4, + MI_Ab_4 = MI_Gs_4, + MI_Bb_4 = MI_As_4, + MI_Db_5 = MI_Cs_5, + MI_Eb_5 = MI_Ds_5, + MI_Gb_5 = MI_Fs_5, + MI_Ab_5 = MI_Gs_5, + MI_Bb_5 = MI_As_5, + JS_0 = QK_JOYSTICK_BUTTON_0, + JS_1 = QK_JOYSTICK_BUTTON_1, + JS_2 = QK_JOYSTICK_BUTTON_2, + JS_3 = QK_JOYSTICK_BUTTON_3, + JS_4 = QK_JOYSTICK_BUTTON_4, + JS_5 = QK_JOYSTICK_BUTTON_5, + JS_6 = QK_JOYSTICK_BUTTON_6, + JS_7 = QK_JOYSTICK_BUTTON_7, + JS_8 = QK_JOYSTICK_BUTTON_8, + JS_9 = QK_JOYSTICK_BUTTON_9, + JS_10 = QK_JOYSTICK_BUTTON_10, + JS_11 = QK_JOYSTICK_BUTTON_11, + JS_12 = QK_JOYSTICK_BUTTON_12, + JS_13 = QK_JOYSTICK_BUTTON_13, + JS_14 = QK_JOYSTICK_BUTTON_14, + JS_15 = QK_JOYSTICK_BUTTON_15, + JS_16 = QK_JOYSTICK_BUTTON_16, + JS_17 = QK_JOYSTICK_BUTTON_17, + JS_18 = QK_JOYSTICK_BUTTON_18, + JS_19 = QK_JOYSTICK_BUTTON_19, + JS_20 = QK_JOYSTICK_BUTTON_20, + JS_21 = QK_JOYSTICK_BUTTON_21, + JS_22 = QK_JOYSTICK_BUTTON_22, + JS_23 = QK_JOYSTICK_BUTTON_23, + JS_24 = QK_JOYSTICK_BUTTON_24, + JS_25 = QK_JOYSTICK_BUTTON_25, + JS_26 = QK_JOYSTICK_BUTTON_26, + JS_27 = QK_JOYSTICK_BUTTON_27, + JS_28 = QK_JOYSTICK_BUTTON_28, + JS_29 = QK_JOYSTICK_BUTTON_29, + JS_30 = QK_JOYSTICK_BUTTON_30, + JS_31 = QK_JOYSTICK_BUTTON_31, + PB_1 = QK_PROGRAMMABLE_BUTTON_1, + PB_2 = QK_PROGRAMMABLE_BUTTON_2, + PB_3 = QK_PROGRAMMABLE_BUTTON_3, + PB_4 = QK_PROGRAMMABLE_BUTTON_4, + PB_5 = QK_PROGRAMMABLE_BUTTON_5, + PB_6 = QK_PROGRAMMABLE_BUTTON_6, + PB_7 = QK_PROGRAMMABLE_BUTTON_7, + PB_8 = QK_PROGRAMMABLE_BUTTON_8, + PB_9 = QK_PROGRAMMABLE_BUTTON_9, + PB_10 = QK_PROGRAMMABLE_BUTTON_10, + PB_11 = QK_PROGRAMMABLE_BUTTON_11, + PB_12 = QK_PROGRAMMABLE_BUTTON_12, + PB_13 = QK_PROGRAMMABLE_BUTTON_13, + PB_14 = QK_PROGRAMMABLE_BUTTON_14, + PB_15 = QK_PROGRAMMABLE_BUTTON_15, + PB_16 = QK_PROGRAMMABLE_BUTTON_16, + PB_17 = QK_PROGRAMMABLE_BUTTON_17, + PB_18 = QK_PROGRAMMABLE_BUTTON_18, + PB_19 = QK_PROGRAMMABLE_BUTTON_19, + PB_20 = QK_PROGRAMMABLE_BUTTON_20, + PB_21 = QK_PROGRAMMABLE_BUTTON_21, + PB_22 = QK_PROGRAMMABLE_BUTTON_22, + PB_23 = QK_PROGRAMMABLE_BUTTON_23, + PB_24 = QK_PROGRAMMABLE_BUTTON_24, + PB_25 = QK_PROGRAMMABLE_BUTTON_25, + PB_26 = QK_PROGRAMMABLE_BUTTON_26, + PB_27 = QK_PROGRAMMABLE_BUTTON_27, + PB_28 = QK_PROGRAMMABLE_BUTTON_28, + PB_29 = QK_PROGRAMMABLE_BUTTON_29, + PB_30 = QK_PROGRAMMABLE_BUTTON_30, + PB_31 = QK_PROGRAMMABLE_BUTTON_31, + PB_32 = QK_PROGRAMMABLE_BUTTON_32, + CK_TOGG = CLICKY_TOGGLE, + CK_ON = CLICKY_ENABLE, + CK_OFF = CLICKY_DISABLE, + CK_UP = CLICKY_UP, + CK_DOWN = CLICKY_DOWN, + CK_RST = CLICKY_RESET, + RGB_MOD = RGB_MODE_FORWARD, + RGB_RMOD = RGB_MODE_REVERSE, + RGB_M_P = RGB_MODE_PLAIN, + RGB_M_B = RGB_MODE_BREATHE, + RGB_M_R = RGB_MODE_RAINBOW, + RGB_M_SW = RGB_MODE_SWIRL, + RGB_M_SN = RGB_MODE_SNAKE, + RGB_M_K = RGB_MODE_KNIGHT, + RGB_M_X = RGB_MODE_XMAS, + RGB_M_G = RGB_MODE_GRADIENT, + RGB_M_T = RGB_MODE_RGBTEST, + RGB_M_TW = RGB_MODE_TWINKLE, + QK_BOOT = QK_BOOTLOADER, + QK_RBT = QK_REBOOT, + DB_TOGG = QK_DEBUG_TOGGLE, + EE_CLR = QK_CLEAR_EEPROM, + AS_DOWN = QK_AUTO_SHIFT_DOWN, + AS_UP = QK_AUTO_SHIFT_UP, + AS_RPT = QK_AUTO_SHIFT_REPORT, + AS_ON = QK_AUTO_SHIFT_ON, + AS_OFF = QK_AUTO_SHIFT_OFF, + AS_TOGG = QK_AUTO_SHIFT_TOGGLE, + QK_GESC = QK_GRAVE_ESCAPE, + VK_TOGG = QK_VELOCIKEY_TOGGLE, + SC_LCPO = QK_SPACE_CADET_LEFT_CTRL_PARENTHESIS_OPEN, + SC_RCPC = QK_SPACE_CADET_RIGHT_CTRL_PARENTHESIS_CLOSE, + SC_LSPO = QK_SPACE_CADET_LEFT_SHIFT_PARENTHESIS_OPEN, + SC_RSPC = QK_SPACE_CADET_RIGHT_SHIFT_PARENTHESIS_CLOSE, + SC_LAPO = QK_SPACE_CADET_LEFT_ALT_PARENTHESIS_OPEN, + SC_RAPC = QK_SPACE_CADET_RIGHT_ALT_PARENTHESIS_CLOSE, + SC_SENT = QK_SPACE_CADET_RIGHT_SHIFT_ENTER, + UC_NEXT = QK_UNICODE_MODE_NEXT, + UC_PREV = QK_UNICODE_MODE_PREVIOUS, + UC_MAC = QK_UNICODE_MODE_MACOS, + UC_LINX = QK_UNICODE_MODE_LINUX, + UC_WIN = QK_UNICODE_MODE_WINDOWS, + UC_BSD = QK_UNICODE_MODE_BSD, + UC_WINC = QK_UNICODE_MODE_WINCOMPOSE, + UC_EMAC = QK_UNICODE_MODE_EMACS, + CM_ON = QK_COMBO_ON, + CM_OFF = QK_COMBO_OFF, + CM_TOGG = QK_COMBO_TOGGLE, + DM_REC1 = QK_DYNAMIC_MACRO_RECORD_START_1, + DM_REC2 = QK_DYNAMIC_MACRO_RECORD_START_2, + DM_RSTP = QK_DYNAMIC_MACRO_RECORD_STOP, + DM_PLY1 = QK_DYNAMIC_MACRO_PLAY_1, + DM_PLY2 = QK_DYNAMIC_MACRO_PLAY_2, + QK_LEAD = QK_LEADER, + OS_ON = QK_ONE_SHOT_ON, + OS_OFF = QK_ONE_SHOT_OFF, + OS_TOGG = QK_ONE_SHOT_TOGGLE, + KO_TOGG = QK_KEY_OVERRIDE_TOGGLE, + KO_ON = QK_KEY_OVERRIDE_ON, + KO_OFF = QK_KEY_OVERRIDE_OFF, + SE_LOCK = QK_SECURE_LOCK, + SE_UNLK = QK_SECURE_UNLOCK, + SE_TOGG = QK_SECURE_TOGGLE, + SE_REQ = QK_SECURE_REQUEST, + CW_TOGG = QK_CAPS_WORD_TOGGLE, + AC_ON = QK_AUTOCORRECT_ON, + AC_OFF = QK_AUTOCORRECT_OFF, + AC_TOGG = QK_AUTOCORRECT_TOGGLE, +}; + +// Range Helpers +#define IS_QK_BASIC(code) ((code) >= QK_BASIC && (code) <= QK_BASIC_MAX) +#define IS_QK_MODS(code) ((code) >= QK_MODS && (code) <= QK_MODS_MAX) +#define IS_QK_MOD_TAP(code) ((code) >= QK_MOD_TAP && (code) <= QK_MOD_TAP_MAX) +#define IS_QK_LAYER_TAP(code) ((code) >= QK_LAYER_TAP && (code) <= QK_LAYER_TAP_MAX) +#define IS_QK_LAYER_MOD(code) ((code) >= QK_LAYER_MOD && (code) <= QK_LAYER_MOD_MAX) +#define IS_QK_TO(code) ((code) >= QK_TO && (code) <= QK_TO_MAX) +#define IS_QK_MOMENTARY(code) ((code) >= QK_MOMENTARY && (code) <= QK_MOMENTARY_MAX) +#define IS_QK_DEF_LAYER(code) ((code) >= QK_DEF_LAYER && (code) <= QK_DEF_LAYER_MAX) +#define IS_QK_TOGGLE_LAYER(code) ((code) >= QK_TOGGLE_LAYER && (code) <= QK_TOGGLE_LAYER_MAX) +#define IS_QK_ONE_SHOT_LAYER(code) ((code) >= QK_ONE_SHOT_LAYER && (code) <= QK_ONE_SHOT_LAYER_MAX) +#define IS_QK_ONE_SHOT_MOD(code) ((code) >= QK_ONE_SHOT_MOD && (code) <= QK_ONE_SHOT_MOD_MAX) +#define IS_QK_LAYER_TAP_TOGGLE(code) ((code) >= QK_LAYER_TAP_TOGGLE && (code) <= QK_LAYER_TAP_TOGGLE_MAX) +#define IS_QK_SWAP_HANDS(code) ((code) >= QK_SWAP_HANDS && (code) <= QK_SWAP_HANDS_MAX) +#define IS_QK_TAP_DANCE(code) ((code) >= QK_TAP_DANCE && (code) <= QK_TAP_DANCE_MAX) +#define IS_QK_MAGIC(code) ((code) >= QK_MAGIC && (code) <= QK_MAGIC_MAX) +#define IS_QK_MIDI(code) ((code) >= QK_MIDI && (code) <= QK_MIDI_MAX) +#define IS_QK_SEQUENCER(code) ((code) >= QK_SEQUENCER && (code) <= QK_SEQUENCER_MAX) +#define IS_QK_JOYSTICK(code) ((code) >= QK_JOYSTICK && (code) <= QK_JOYSTICK_MAX) +#define IS_QK_PROGRAMMABLE_BUTTON(code) ((code) >= QK_PROGRAMMABLE_BUTTON && (code) <= QK_PROGRAMMABLE_BUTTON_MAX) +#define IS_QK_AUDIO(code) ((code) >= QK_AUDIO && (code) <= QK_AUDIO_MAX) +#define IS_QK_STENO(code) ((code) >= QK_STENO && (code) <= QK_STENO_MAX) +#define IS_QK_MACRO(code) ((code) >= QK_MACRO && (code) <= QK_MACRO_MAX) +#define IS_QK_LIGHTING(code) ((code) >= QK_LIGHTING && (code) <= QK_LIGHTING_MAX) +#define IS_QK_QUANTUM(code) ((code) >= QK_QUANTUM && (code) <= QK_QUANTUM_MAX) +#define IS_QK_KB(code) ((code) >= QK_KB && (code) <= QK_KB_MAX) +#define IS_QK_USER(code) ((code) >= QK_USER && (code) <= QK_USER_MAX) +#define IS_QK_UNICODE(code) ((code) >= QK_UNICODE && (code) <= QK_UNICODE_MAX) + +// Group Helpers +#define IS_INTERNAL_KEYCODE(code) ((code) >= KC_NO && (code) <= KC_TRANSPARENT) +#define IS_BASIC_KEYCODE(code) ((code) >= KC_A && (code) <= KC_EXSEL) +#define IS_SYSTEM_KEYCODE(code) ((code) >= KC_SYSTEM_POWER && (code) <= KC_SYSTEM_WAKE) +#define IS_MEDIA_KEYCODE(code) ((code) >= KC_AUDIO_MUTE && (code) <= KC_ASSISTANT) +#define IS_MOUSE_KEYCODE(code) ((code) >= KC_MS_UP && (code) <= KC_MS_ACCEL2) +#define IS_MODIFIERS_KEYCODE(code) ((code) >= KC_LEFT_CTRL && (code) <= KC_RIGHT_GUI) +#define IS_SWAP_HANDS_KEYCODE(code) ((code) >= SH_TG && (code) <= SH_OS) +#define IS_MAGIC_KEYCODE(code) ((code) >= MAGIC_SWAP_CONTROL_CAPSLOCK && (code) <= MAGIC_TOGGLE_ESCAPE_CAPSLOCK) +#define IS_MIDI_KEYCODE(code) ((code) >= MI_ON && (code) <= MI_BENDU) +#define IS_SEQUENCER_KEYCODE(code) ((code) >= SQ_ON && (code) <= SQ_SCLR) +#define IS_JOYSTICK_KEYCODE(code) ((code) >= QK_JOYSTICK_BUTTON_0 && (code) <= QK_JOYSTICK_BUTTON_31) +#define IS_PROGRAMMABLE_BUTTON_KEYCODE(code) ((code) >= QK_PROGRAMMABLE_BUTTON_1 && (code) <= QK_PROGRAMMABLE_BUTTON_32) +#define IS_AUDIO_KEYCODE(code) ((code) >= AU_ON && (code) <= MUV_DE) +#define IS_STENO_KEYCODE(code) ((code) >= QK_STENO_BOLT && (code) <= QK_STENO_COMB_MAX) +#define IS_MACRO_KEYCODE(code) ((code) >= MACRO_0 && (code) <= MACRO_31) +#define IS_BACKLIGHT_KEYCODE(code) ((code) >= BL_ON && (code) <= BL_BRTG) +#define IS_RGB_KEYCODE(code) ((code) >= RGB_TOG && (code) <= RGB_MODE_TWINKLE) +#define IS_QUANTUM_KEYCODE(code) ((code) >= QK_BOOTLOADER && (code) <= QK_AUTOCORRECT_TOGGLE) + diff --git a/quantum/keymap_common.c b/quantum/keymap_common.c index 50e581cd87..a5997711f2 100644 --- a/quantum/keymap_common.c +++ b/quantum/keymap_common.c @@ -109,7 +109,7 @@ action_t action_for_keycode(uint16_t keycode) { break; case QK_ONE_SHOT_MOD ... QK_ONE_SHOT_MOD_MAX:; // OSM(mod) - One-shot mod - mod = mod_config(keycode & 0xFF); + mod = mod_config(keycode & 0x1F); action.code = ACTION_MODS_ONESHOT(mod); break; #endif @@ -118,8 +118,8 @@ action_t action_for_keycode(uint16_t keycode) { action.code = ACTION_LAYER_TAP_TOGGLE(keycode & 0xFF); break; case QK_LAYER_MOD ... QK_LAYER_MOD_MAX: - mod = mod_config(keycode & 0xF); - action_layer = (keycode >> 4) & 0xF; + mod = mod_config(keycode & 0x1F); + action_layer = (keycode >> 5) & 0xF; action.code = ACTION_LAYER_MODS(action_layer, mod); break; #endif diff --git a/quantum/process_keycode/process_joystick.c b/quantum/process_keycode/process_joystick.c index c4c6fb59a8..43067b81db 100644 --- a/quantum/process_keycode/process_joystick.c +++ b/quantum/process_keycode/process_joystick.c @@ -19,11 +19,11 @@ bool process_joystick(uint16_t keycode, keyrecord_t *record) { switch (keycode) { - case QK_JOYSTICK_BUTTON_MIN ... QK_JOYSTICK_BUTTON_MAX: + case QK_JOYSTICK ... QK_JOYSTICK_MAX: if (record->event.pressed) { - register_joystick_button(keycode - QK_JOYSTICK_BUTTON_MIN); + register_joystick_button(keycode - QK_JOYSTICK); } else { - unregister_joystick_button(keycode - QK_JOYSTICK_BUTTON_MIN); + unregister_joystick_button(keycode - QK_JOYSTICK); } return false; } diff --git a/quantum/process_keycode/process_magic.c b/quantum/process_keycode/process_magic.c index 50816c5261..72332b20d7 100644 --- a/quantum/process_keycode/process_magic.c +++ b/quantum/process_keycode/process_magic.c @@ -40,158 +40,152 @@ float cg_swap_song[][2] = CG_SWAP_SONG; bool process_magic(uint16_t keycode, keyrecord_t *record) { // skip anything that isn't a keyup if (record->event.pressed) { - switch (keycode) { - case MAGIC_SWAP_CONTROL_CAPSLOCK ... MAGIC_TOGGLE_ALT_GUI: - case MAGIC_SWAP_LCTL_LGUI ... MAGIC_EE_HANDS_RIGHT: - case MAGIC_TOGGLE_GUI: - case MAGIC_TOGGLE_CONTROL_CAPSLOCK: - case MAGIC_TOGGLE_BACKSLASH_BACKSPACE: - case MAGIC_SWAP_ESCAPE_CAPSLOCK ... MAGIC_TOGGLE_ESCAPE_CAPSLOCK: - /* keymap config */ - keymap_config.raw = eeconfig_read_keymap(); - switch (keycode) { - case MAGIC_SWAP_CONTROL_CAPSLOCK: - keymap_config.swap_control_capslock = true; - break; - case MAGIC_SWAP_ESCAPE_CAPSLOCK: - keymap_config.swap_escape_capslock = true; - break; - case MAGIC_CAPSLOCK_TO_CONTROL: - keymap_config.capslock_to_control = true; - break; - case MAGIC_SWAP_LALT_LGUI: - keymap_config.swap_lalt_lgui = true; - break; - case MAGIC_SWAP_RALT_RGUI: - keymap_config.swap_ralt_rgui = true; - break; - case MAGIC_SWAP_LCTL_LGUI: - keymap_config.swap_lctl_lgui = true; - break; - case MAGIC_SWAP_RCTL_RGUI: - keymap_config.swap_rctl_rgui = true; - break; - case MAGIC_NO_GUI: - keymap_config.no_gui = true; - break; - case MAGIC_SWAP_GRAVE_ESC: - keymap_config.swap_grave_esc = true; - break; - case MAGIC_SWAP_BACKSLASH_BACKSPACE: - keymap_config.swap_backslash_backspace = true; - break; - case MAGIC_HOST_NKRO: - clear_keyboard(); // clear first buffer to prevent stuck keys - keymap_config.nkro = true; - break; - case MAGIC_SWAP_ALT_GUI: - keymap_config.swap_lalt_lgui = keymap_config.swap_ralt_rgui = true; + if (IS_MAGIC_KEYCODE(keycode)) { + /* keymap config */ + keymap_config.raw = eeconfig_read_keymap(); + switch (keycode) { + case MAGIC_SWAP_CONTROL_CAPSLOCK: + keymap_config.swap_control_capslock = true; + break; + case MAGIC_SWAP_ESCAPE_CAPSLOCK: + keymap_config.swap_escape_capslock = true; + break; + case MAGIC_CAPSLOCK_TO_CONTROL: + keymap_config.capslock_to_control = true; + break; + case MAGIC_SWAP_LALT_LGUI: + keymap_config.swap_lalt_lgui = true; + break; + case MAGIC_SWAP_RALT_RGUI: + keymap_config.swap_ralt_rgui = true; + break; + case MAGIC_SWAP_LCTL_LGUI: + keymap_config.swap_lctl_lgui = true; + break; + case MAGIC_SWAP_RCTL_RGUI: + keymap_config.swap_rctl_rgui = true; + break; + case MAGIC_NO_GUI: + keymap_config.no_gui = true; + break; + case MAGIC_SWAP_GRAVE_ESC: + keymap_config.swap_grave_esc = true; + break; + case MAGIC_SWAP_BACKSLASH_BACKSPACE: + keymap_config.swap_backslash_backspace = true; + break; + case MAGIC_HOST_NKRO: + clear_keyboard(); // clear first buffer to prevent stuck keys + keymap_config.nkro = true; + break; + case MAGIC_SWAP_ALT_GUI: + keymap_config.swap_lalt_lgui = keymap_config.swap_ralt_rgui = true; #ifdef AUDIO_ENABLE - PLAY_SONG(ag_swap_song); + PLAY_SONG(ag_swap_song); #endif - break; - case MAGIC_SWAP_CTL_GUI: - keymap_config.swap_lctl_lgui = keymap_config.swap_rctl_rgui = true; + break; + case MAGIC_SWAP_CTL_GUI: + keymap_config.swap_lctl_lgui = keymap_config.swap_rctl_rgui = true; #ifdef AUDIO_ENABLE - PLAY_SONG(cg_swap_song); + PLAY_SONG(cg_swap_song); #endif - break; - case MAGIC_UNSWAP_CONTROL_CAPSLOCK: - keymap_config.swap_control_capslock = false; - break; - case MAGIC_UNSWAP_ESCAPE_CAPSLOCK: - keymap_config.swap_escape_capslock = false; - break; - case MAGIC_UNCAPSLOCK_TO_CONTROL: - keymap_config.capslock_to_control = false; - break; - case MAGIC_UNSWAP_LALT_LGUI: - keymap_config.swap_lalt_lgui = false; - break; - case MAGIC_UNSWAP_RALT_RGUI: - keymap_config.swap_ralt_rgui = false; - break; - case MAGIC_UNSWAP_LCTL_LGUI: - keymap_config.swap_lctl_lgui = false; - break; - case MAGIC_UNSWAP_RCTL_RGUI: - keymap_config.swap_rctl_rgui = false; - break; - case MAGIC_UNNO_GUI: - keymap_config.no_gui = false; - break; - case MAGIC_UNSWAP_GRAVE_ESC: - keymap_config.swap_grave_esc = false; - break; - case MAGIC_UNSWAP_BACKSLASH_BACKSPACE: - keymap_config.swap_backslash_backspace = false; - break; - case MAGIC_UNHOST_NKRO: - clear_keyboard(); // clear first buffer to prevent stuck keys - keymap_config.nkro = false; - break; - case MAGIC_UNSWAP_ALT_GUI: - keymap_config.swap_lalt_lgui = keymap_config.swap_ralt_rgui = false; + break; + case MAGIC_UNSWAP_CONTROL_CAPSLOCK: + keymap_config.swap_control_capslock = false; + break; + case MAGIC_UNSWAP_ESCAPE_CAPSLOCK: + keymap_config.swap_escape_capslock = false; + break; + case MAGIC_UNCAPSLOCK_TO_CONTROL: + keymap_config.capslock_to_control = false; + break; + case MAGIC_UNSWAP_LALT_LGUI: + keymap_config.swap_lalt_lgui = false; + break; + case MAGIC_UNSWAP_RALT_RGUI: + keymap_config.swap_ralt_rgui = false; + break; + case MAGIC_UNSWAP_LCTL_LGUI: + keymap_config.swap_lctl_lgui = false; + break; + case MAGIC_UNSWAP_RCTL_RGUI: + keymap_config.swap_rctl_rgui = false; + break; + case MAGIC_UNNO_GUI: + keymap_config.no_gui = false; + break; + case MAGIC_UNSWAP_GRAVE_ESC: + keymap_config.swap_grave_esc = false; + break; + case MAGIC_UNSWAP_BACKSLASH_BACKSPACE: + keymap_config.swap_backslash_backspace = false; + break; + case MAGIC_UNHOST_NKRO: + clear_keyboard(); // clear first buffer to prevent stuck keys + keymap_config.nkro = false; + break; + case MAGIC_UNSWAP_ALT_GUI: + keymap_config.swap_lalt_lgui = keymap_config.swap_ralt_rgui = false; #ifdef AUDIO_ENABLE - PLAY_SONG(ag_norm_song); + PLAY_SONG(ag_norm_song); #endif - break; - case MAGIC_UNSWAP_CTL_GUI: - keymap_config.swap_lctl_lgui = keymap_config.swap_rctl_rgui = false; + break; + case MAGIC_UNSWAP_CTL_GUI: + keymap_config.swap_lctl_lgui = keymap_config.swap_rctl_rgui = false; #ifdef AUDIO_ENABLE - PLAY_SONG(cg_norm_song); + PLAY_SONG(cg_norm_song); #endif - break; - case MAGIC_TOGGLE_ALT_GUI: - keymap_config.swap_lalt_lgui = !keymap_config.swap_lalt_lgui; - keymap_config.swap_ralt_rgui = keymap_config.swap_lalt_lgui; + break; + case MAGIC_TOGGLE_ALT_GUI: + keymap_config.swap_lalt_lgui = !keymap_config.swap_lalt_lgui; + keymap_config.swap_ralt_rgui = keymap_config.swap_lalt_lgui; #ifdef AUDIO_ENABLE - if (keymap_config.swap_ralt_rgui) { - PLAY_SONG(ag_swap_song); - } else { - PLAY_SONG(ag_norm_song); - } + if (keymap_config.swap_ralt_rgui) { + PLAY_SONG(ag_swap_song); + } else { + PLAY_SONG(ag_norm_song); + } #endif - break; - case MAGIC_TOGGLE_CTL_GUI: - keymap_config.swap_lctl_lgui = !keymap_config.swap_lctl_lgui; - keymap_config.swap_rctl_rgui = keymap_config.swap_lctl_lgui; + break; + case MAGIC_TOGGLE_CTL_GUI: + keymap_config.swap_lctl_lgui = !keymap_config.swap_lctl_lgui; + keymap_config.swap_rctl_rgui = keymap_config.swap_lctl_lgui; #ifdef AUDIO_ENABLE - if (keymap_config.swap_rctl_rgui) { - PLAY_SONG(cg_swap_song); - } else { - PLAY_SONG(cg_norm_song); - } + if (keymap_config.swap_rctl_rgui) { + PLAY_SONG(cg_swap_song); + } else { + PLAY_SONG(cg_norm_song); + } #endif - break; - case MAGIC_TOGGLE_BACKSLASH_BACKSPACE: - keymap_config.swap_backslash_backspace = !keymap_config.swap_backslash_backspace; - break; - case MAGIC_TOGGLE_NKRO: - clear_keyboard(); // clear first buffer to prevent stuck keys - keymap_config.nkro = !keymap_config.nkro; - break; - case MAGIC_EE_HANDS_LEFT: - eeconfig_update_handedness(true); - break; - case MAGIC_EE_HANDS_RIGHT: - eeconfig_update_handedness(false); - break; - case MAGIC_TOGGLE_GUI: - keymap_config.no_gui = !keymap_config.no_gui; - break; - case MAGIC_TOGGLE_CONTROL_CAPSLOCK: - keymap_config.swap_control_capslock = !keymap_config.swap_control_capslock; - break; - case MAGIC_TOGGLE_ESCAPE_CAPSLOCK: - keymap_config.swap_escape_capslock = !keymap_config.swap_escape_capslock; - break; - } + break; + case MAGIC_TOGGLE_BACKSLASH_BACKSPACE: + keymap_config.swap_backslash_backspace = !keymap_config.swap_backslash_backspace; + break; + case MAGIC_TOGGLE_NKRO: + clear_keyboard(); // clear first buffer to prevent stuck keys + keymap_config.nkro = !keymap_config.nkro; + break; + case MAGIC_EE_HANDS_LEFT: + eeconfig_update_handedness(true); + break; + case MAGIC_EE_HANDS_RIGHT: + eeconfig_update_handedness(false); + break; + case MAGIC_TOGGLE_GUI: + keymap_config.no_gui = !keymap_config.no_gui; + break; + case MAGIC_TOGGLE_CONTROL_CAPSLOCK: + keymap_config.swap_control_capslock = !keymap_config.swap_control_capslock; + break; + case MAGIC_TOGGLE_ESCAPE_CAPSLOCK: + keymap_config.swap_escape_capslock = !keymap_config.swap_escape_capslock; + break; + } - eeconfig_update_keymap(keymap_config.raw); - clear_keyboard(); // clear to prevent stuck keys + eeconfig_update_keymap(keymap_config.raw); + clear_keyboard(); // clear to prevent stuck keys - return false; + return false; } } diff --git a/quantum/process_keycode/process_programmable_button.c b/quantum/process_keycode/process_programmable_button.c index d6a14e120c..03034edb61 100644 --- a/quantum/process_keycode/process_programmable_button.c +++ b/quantum/process_keycode/process_programmable_button.c @@ -19,8 +19,8 @@ along with this program. If not, see . #include "programmable_button.h" bool process_programmable_button(uint16_t keycode, keyrecord_t *record) { - if (keycode >= QK_PROGRAMMABLE_BUTTON_MIN && keycode <= QK_PROGRAMMABLE_BUTTON_MAX) { - uint8_t button = keycode - QK_PROGRAMMABLE_BUTTON_MIN + 1; + if (IS_QK_PROGRAMMABLE_BUTTON(keycode)) { + uint8_t button = keycode - QK_PROGRAMMABLE_BUTTON + 1; if (record->event.pressed) { programmable_button_register(button); } else { diff --git a/quantum/quantum_keycodes.h b/quantum/quantum_keycodes.h index 2df733fe1f..ec69fadbab 100644 --- a/quantum/quantum_keycodes.h +++ b/quantum/quantum_keycodes.h @@ -16,610 +16,28 @@ #pragma once -#include "sequencer.h" - -// Fillers to make layering more clear -#define _______ KC_TRANSPARENT -#define XXXXXXX KC_NO - -enum quantum_keycodes { - // Ranges used in shortcuts - not to be used directly - QK_BASIC = 0x0000, - QK_BASIC_MAX = 0x00FF, - QK_MODS = 0x0100, - QK_LCTL = 0x0100, - QK_LSFT = 0x0200, - QK_LALT = 0x0400, - QK_LGUI = 0x0800, - QK_RMODS_MIN = 0x1000, - QK_RCTL = 0x1100, - QK_RSFT = 0x1200, - QK_RALT = 0x1400, - QK_RGUI = 0x1800, - QK_MODS_MAX = 0x1FFF, - QK_LAYER_TAP = 0x4000, - QK_LAYER_TAP_MAX = 0x4FFF, - QK_TO = 0x5000, - QK_TO_MAX = 0x50FF, - QK_MOMENTARY = 0x5100, - QK_MOMENTARY_MAX = 0x51FF, - QK_DEF_LAYER = 0x5200, - QK_DEF_LAYER_MAX = 0x52FF, - QK_TOGGLE_LAYER = 0x5300, - QK_TOGGLE_LAYER_MAX = 0x53FF, - QK_ONE_SHOT_LAYER = 0x5400, - QK_ONE_SHOT_LAYER_MAX = 0x54FF, - QK_ONE_SHOT_MOD = 0x5500, - QK_ONE_SHOT_MOD_MAX = 0x55FF, - QK_SWAP_HANDS = 0x5600, - QK_SWAP_HANDS_MAX = 0x56FF, - QK_TAP_DANCE = 0x5700, - QK_TAP_DANCE_MAX = 0x57FF, - QK_LAYER_TAP_TOGGLE = 0x5800, - QK_LAYER_TAP_TOGGLE_MAX = 0x58FF, - QK_LAYER_MOD = 0x5900, - QK_LAYER_MOD_MAX = 0x59FF, - QK_STENO = 0x5A00, - QK_STENO_BOLT = 0x5A30, - QK_STENO_GEMINI = 0x5A31, - QK_STENO_COMB = 0x5A32, - QK_STENO_COMB_MAX = 0x5A3C, - QK_STENO_MAX = 0x5A3F, - // 0x5C00 - 0x5FFF are reserved, see below - QK_MOD_TAP = 0x6000, - QK_MOD_TAP_MAX = 0x7FFF, - QK_UNICODE = 0x8000, - QK_UNICODE_MAX = 0xFFFF, - QK_UNICODEMAP = 0x8000, - QK_UNICODEMAP_MAX = 0xBFFF, - QK_UNICODEMAP_PAIR = 0xC000, - QK_UNICODEMAP_PAIR_MAX = 0xFFFF, - - // Loose keycodes - to be used directly - QK_BOOTLOADER = 0x5C00, - QK_DEBUG_TOGGLE, // 5C01 - - // Magic - MAGIC_SWAP_CONTROL_CAPSLOCK, // 5C02 - MAGIC_CAPSLOCK_TO_CONTROL, // 5C03 - MAGIC_SWAP_LALT_LGUI, // 5C04 - MAGIC_SWAP_RALT_RGUI, // 5C05 - MAGIC_NO_GUI, // 5C06 - MAGIC_SWAP_GRAVE_ESC, // 5C07 - MAGIC_SWAP_BACKSLASH_BACKSPACE, // 5C08 - MAGIC_HOST_NKRO, // 5C09 - MAGIC_SWAP_ALT_GUI, // 5C0A - MAGIC_UNSWAP_CONTROL_CAPSLOCK, // 5C0B - MAGIC_UNCAPSLOCK_TO_CONTROL, // 5C0C - MAGIC_UNSWAP_LALT_LGUI, // 5C0D - MAGIC_UNSWAP_RALT_RGUI, // 5C0E - MAGIC_UNNO_GUI, // 5C0F - MAGIC_UNSWAP_GRAVE_ESC, // 5C10 - MAGIC_UNSWAP_BACKSLASH_BACKSPACE, // 5C11 - MAGIC_UNHOST_NKRO, // 5C12 - MAGIC_UNSWAP_ALT_GUI, // 5C13 - MAGIC_TOGGLE_NKRO, // 5C14 - MAGIC_TOGGLE_ALT_GUI, // 5C15 - - // Grave Escape - QK_GRAVE_ESCAPE, // 5C16 - - // Auto Shift - QK_AUTO_SHIFT_UP, // 5C17 - QK_AUTO_SHIFT_DOWN, // 5C18 - QK_AUTO_SHIFT_REPORT, // 5C19 - QK_AUTO_SHIFT_TOGGLE, // 5C1A - QK_AUTO_SHIFT_ON, // 5C1B - QK_AUTO_SHIFT_OFF, // 5C1C - - // Audio - AU_ON, // 5C1D - AU_OFF, // 5C1E - AU_TOG, // 5C1F - - // Audio Clicky - CLICKY_TOGGLE, // 5C20 - CLICKY_ENABLE, // 5C21 - CLICKY_DISABLE, // 5C22 - CLICKY_UP, // 5C23 - CLICKY_DOWN, // 5C24 - CLICKY_RESET, // 5C25 - - // Music mode - MU_ON, // 5C26 - MU_OFF, // 5C27 - MU_TOG, // 5C28 - MU_MOD, // 5C29 - MUV_IN, // 5C2A - MUV_DE, // 5C2B - - // MIDI - MI_ON, // 5C2C - MI_OFF, // 5C2D - MI_TOG, // 5C2E - - MI_C, // 5C2F - MI_Cs, // 5C30 - MI_Db = MI_Cs, - MI_D, // 5C31 - MI_Ds, // 5C32 - MI_Eb = MI_Ds, - MI_E, // 5C33 - MI_F, // 5C34 - MI_Fs, // 5C35 - MI_Gb = MI_Fs, - MI_G, // 5C36 - MI_Gs, // 5C37 - MI_Ab = MI_Gs, - MI_A, // 5C38 - MI_As, // 5C39 - MI_Bb = MI_As, - MI_B, // 5C3A - - MI_C_1, // 5C3B - MI_Cs_1, // 5C3C - MI_Db_1 = MI_Cs_1, - MI_D_1, // 5C3D - MI_Ds_1, // 5C3E - MI_Eb_1 = MI_Ds_1, - MI_E_1, // 5C3F - MI_F_1, // 5C40 - MI_Fs_1, // 5C41 - MI_Gb_1 = MI_Fs_1, - MI_G_1, // 5C42 - MI_Gs_1, // 5C43 - MI_Ab_1 = MI_Gs_1, - MI_A_1, // 5C44 - MI_As_1, // 5C45 - MI_Bb_1 = MI_As_1, - MI_B_1, // 5C46 - - MI_C_2, // 5C47 - MI_Cs_2, // 5C48 - MI_Db_2 = MI_Cs_2, - MI_D_2, // 5C49 - MI_Ds_2, // 5C4A - MI_Eb_2 = MI_Ds_2, - MI_E_2, // 5C4B - MI_F_2, // 5C4C - MI_Fs_2, // 5C4D - MI_Gb_2 = MI_Fs_2, - MI_G_2, // 5C4E - MI_Gs_2, // 5C4F - MI_Ab_2 = MI_Gs_2, - MI_A_2, // 5C50 - MI_As_2, // 5C51 - MI_Bb_2 = MI_As_2, - MI_B_2, // 5C52 - - MI_C_3, // 5C53 - MI_Cs_3, // 5C54 - MI_Db_3 = MI_Cs_3, - MI_D_3, // 5C55 - MI_Ds_3, // 5C56 - MI_Eb_3 = MI_Ds_3, - MI_E_3, // 5C57 - MI_F_3, // 5C58 - MI_Fs_3, // 5C59 - MI_Gb_3 = MI_Fs_3, - MI_G_3, // 5C5A - MI_Gs_3, // 5C5B - MI_Ab_3 = MI_Gs_3, - MI_A_3, // 5C5C - MI_As_3, // 5C5D - MI_Bb_3 = MI_As_3, - MI_B_3, // 5C5E - - MI_C_4, // 5C5F - MI_Cs_4, // 5C60 - MI_Db_4 = MI_Cs_4, - MI_D_4, // 5C61 - MI_Ds_4, // 5C62 - MI_Eb_4 = MI_Ds_4, - MI_E_4, // 5C63 - MI_F_4, // 5C64 - MI_Fs_4, // 5C65 - MI_Gb_4 = MI_Fs_4, - MI_G_4, // 5C66 - MI_Gs_4, // 5C67 - MI_Ab_4 = MI_Gs_4, - MI_A_4, // 5C68 - MI_As_4, // 5C69 - MI_Bb_4 = MI_As_4, - MI_B_4, // 5C6A - - MI_C_5, // 5C6B - MI_Cs_5, // 5C6C - MI_Db_5 = MI_Cs_5, - MI_D_5, // 5C6D - MI_Ds_5, // 5C6E - MI_Eb_5 = MI_Ds_5, - MI_E_5, // 5C6F - MI_F_5, // 5C70 - MI_Fs_5, // 5C71 - MI_Gb_5 = MI_Fs_5, - MI_G_5, // 5C72 - MI_Gs_5, // 5C73 - MI_Ab_5 = MI_Gs_5, - MI_A_5, // 5C74 - MI_As_5, // 5C75 - MI_Bb_5 = MI_As_5, - MI_B_5, // 5C76 - - MI_OCT_N2, // 5C77 - MI_OCT_N1, // 5C78 - MI_OCT_0, // 5C79 - MI_OCT_1, // 5C7A - MI_OCT_2, // 5C7B - MI_OCT_3, // 5C7C - MI_OCT_4, // 5C7D - MI_OCT_5, // 5C7E - MI_OCT_6, // 5C7F - MI_OCT_7, // 5C80 - MI_OCTD, // 5C81 - MI_OCTU, // 5C82 - - MI_TRNS_N6, // 5C83 - MI_TRNS_N5, // 5C84 - MI_TRNS_N4, // 5C85 - MI_TRNS_N3, // 5C86 - MI_TRNS_N2, // 5C87 - MI_TRNS_N1, // 5C88 - MI_TRNS_0, // 5C89 - MI_TRNS_1, // 5C8A - MI_TRNS_2, // 5C8B - MI_TRNS_3, // 5C8C - MI_TRNS_4, // 5C8D - MI_TRNS_5, // 5C8E - MI_TRNS_6, // 5C8F - MI_TRNSD, // 5C90 - MI_TRNSU, // 5C91 - - MI_VEL_0, // 5C92 -#ifdef VIA_ENABLE - MI_VEL_1 = MI_VEL_0, -#else - MI_VEL_1, // 5C93 -#endif - MI_VEL_2, // 5C94 - MI_VEL_3, // 5C95 - MI_VEL_4, // 5C96 - MI_VEL_5, // 5C97 - MI_VEL_6, // 5C98 - MI_VEL_7, // 5C99 - MI_VEL_8, // 5C9A - MI_VEL_9, // 5C9B - MI_VEL_10, // 5C9C - MI_VELD, // 5C9D - MI_VELU, // 5C9E - - MI_CH1, // 5C9F - MI_CH2, // 5CA0 - MI_CH3, // 5CA1 - MI_CH4, // 5CA2 - MI_CH5, // 5CA3 - MI_CH6, // 5CA4 - MI_CH7, // 5CA5 - MI_CH8, // 5CA6 - MI_CH9, // 5CA7 - MI_CH10, // 5CA8 - MI_CH11, // 5CA9 - MI_CH12, // 5CAA - MI_CH13, // 5CAB - MI_CH14, // 5CAC - MI_CH15, // 5CAD - MI_CH16, // 5CAE - MI_CHD, // 5CAF - MI_CHU, // 5CB0 - - MI_ALLOFF, // 5CB1 - - MI_SUS, // 5CB2 - MI_PORT, // 5CB3 - MI_SOST, // 5CB4 - MI_SOFT, // 5CB5 - MI_LEG, // 5CB6 - - MI_MOD, // 5CB7 - MI_MODSD, // 5CB8 - MI_MODSU, // 5CB9 - - MI_BENDD, // 5CBA - MI_BENDU, // 5CBB - - // Backlight - BL_ON, // 5CBC - BL_OFF, // 5CBD - BL_DEC, // 5CBE - BL_INC, // 5CBF - BL_TOGG, // 5CC0 - BL_STEP, // 5CC1 - BL_BRTG, // 5CC2 - - // RGB underglow/matrix - RGB_TOG, // 5CC3 - RGB_MODE_FORWARD, // 5CC4 - RGB_MODE_REVERSE, // 5CC5 - RGB_HUI, // 5CC6 - RGB_HUD, // 5CC7 - RGB_SAI, // 5CC8 - RGB_SAD, // 5CC9 - RGB_VAI, // 5CCA - RGB_VAD, // 5CCB - RGB_SPI, // 5CCC - RGB_SPD, // 5CCD - RGB_MODE_PLAIN, // 5CCE - RGB_MODE_BREATHE, // 5CCF - RGB_MODE_RAINBOW, // 5CD0 - RGB_MODE_SWIRL, // 5CD1 - RGB_MODE_SNAKE, // 5CD2 - RGB_MODE_KNIGHT, // 5CD3 - RGB_MODE_XMAS, // 5CD4 - RGB_MODE_GRADIENT, // 5CD5 - RGB_MODE_RGBTEST, // 5CD6 - - // Velocikey - QK_VELOCIKEY_TOGGLE, // 5CD7 - - // Space Cadet - QK_SPACE_CADET_LEFT_SHIFT_PARENTHESIS_OPEN, // 5CD8 - QK_SPACE_CADET_RIGHT_SHIFT_PARENTHESIS_CLOSE, // 5CD9 - QK_SPACE_CADET_RIGHT_SHIFT_ENTER, // 5CDA - - // Thermal Printer - PRINT_ON, // 5CDB - PRINT_OFF, // 5CDC - - // Bluetooth: output selection - OUT_AUTO, // 5CDD - OUT_USB, // 5CDE - - // Clear EEPROM - QK_CLEAR_EEPROM, // 5CDF - - // Unicode - QK_UNICODE_MODE_NEXT, // 5CE0 - QK_UNICODE_MODE_PREVIOUS, // 5CE1 - QK_UNICODE_MODE_MACOS, // 5CE2 - QK_UNICODE_MODE_LINUX, // 5CE3 - QK_UNICODE_MODE_WINDOWS, // 5CE4 - QK_UNICODE_MODE_BSD, // 5CE5 - QK_UNICODE_MODE_WINCOMPOSE, // 5CE6 - - // Haptic - HPT_ON, // 5CE7 - HPT_OFF, // 5CE8 - HPT_TOG, // 5CE9 - HPT_RST, // 5CEA - HPT_FBK, // 5CEB - HPT_BUZ, // 5CEC - HPT_MODI, // 5CED - HPT_MODD, // 5CEE - HPT_CONT, // 5CEF - HPT_CONI, // 5CF0 - HPT_COND, // 5CF1 - HPT_DWLI, // 5CF2 - HPT_DWLD, // 5CF3 - - // Space Cadet (continued) - QK_SPACE_CADET_LEFT_CTRL_PARENTHESIS_OPEN, // 5CF4 - QK_SPACE_CADET_RIGHT_CTRL_PARENTHESIS_CLOSE, // 5CF5 - QK_SPACE_CADET_LEFT_ALT_PARENTHESIS_OPEN, // 5CF6 - QK_SPACE_CADET_RIGHT_ALT_PARENTHESIS_CLOSE, // 5CF7 - - // Combos - QK_COMBO_ON, // 5CF8 - QK_COMBO_OFF, // 5CF9 - QK_COMBO_TOGGLE, // 5CFA - - // Magic (continued) - MAGIC_SWAP_LCTL_LGUI, // 5CFB - MAGIC_SWAP_RCTL_RGUI, // 5CFC - MAGIC_UNSWAP_LCTL_LGUI, // 5CFD - MAGIC_UNSWAP_RCTL_RGUI, // 5CFE - MAGIC_SWAP_CTL_GUI, // 5CFF - MAGIC_UNSWAP_CTL_GUI, // 5D00 - MAGIC_TOGGLE_CTL_GUI, // 5D01 - MAGIC_EE_HANDS_LEFT, // 5D02 - MAGIC_EE_HANDS_RIGHT, // 5D03 - - // Dynamic Macros - QK_DYNAMIC_MACRO_RECORD_START_1, // 5D04 - QK_DYNAMIC_MACRO_RECORD_START_2, // 5D05 - QK_DYNAMIC_MACRO_RECORD_STOP, // 5D06 - QK_DYNAMIC_MACRO_PLAY_1, // 5D07 - QK_DYNAMIC_MACRO_PLAY_2, // 5D08 - - // Joystick - QK_JOYSTICK_BUTTON_0, // 5D09 - QK_JOYSTICK_BUTTON_1, // 5D0A - QK_JOYSTICK_BUTTON_2, // 5D0B - QK_JOYSTICK_BUTTON_3, // 5D0C - QK_JOYSTICK_BUTTON_4, // 5D0D - QK_JOYSTICK_BUTTON_5, // 5D0E - QK_JOYSTICK_BUTTON_6, // 5D0F - QK_JOYSTICK_BUTTON_7, // 5D10 - QK_JOYSTICK_BUTTON_8, // 5D11 - QK_JOYSTICK_BUTTON_9, // 5D12 - QK_JOYSTICK_BUTTON_10, // 5D13 - QK_JOYSTICK_BUTTON_11, // 5D14 - QK_JOYSTICK_BUTTON_12, // 5D15 - QK_JOYSTICK_BUTTON_13, // 5D16 - QK_JOYSTICK_BUTTON_14, // 5D17 - QK_JOYSTICK_BUTTON_15, // 5D18 - QK_JOYSTICK_BUTTON_16, // 5D19 - QK_JOYSTICK_BUTTON_17, // 5D1A - QK_JOYSTICK_BUTTON_18, // 5D1B - QK_JOYSTICK_BUTTON_19, // 5D1C - QK_JOYSTICK_BUTTON_20, // 5D1D - QK_JOYSTICK_BUTTON_21, // 5D1E - QK_JOYSTICK_BUTTON_22, // 5D1F - QK_JOYSTICK_BUTTON_23, // 5D20 - QK_JOYSTICK_BUTTON_24, // 5D21 - QK_JOYSTICK_BUTTON_25, // 5D22 - QK_JOYSTICK_BUTTON_26, // 5D23 - QK_JOYSTICK_BUTTON_27, // 5D24 - QK_JOYSTICK_BUTTON_28, // 5D25 - QK_JOYSTICK_BUTTON_29, // 5D26 - QK_JOYSTICK_BUTTON_30, // 5D27 - QK_JOYSTICK_BUTTON_31, // 5D28 - - // Leader Key - QK_LEADER, // 5D29 - - // Bluetooth: output selection (continued) - OUT_BT, // 5D2A - - // Lock Key - QK_LOCK, // 5D2B - - // Unused slots - UNUSED_000, // 5D2C - UNUSED_001, // 5D2D - - // Sequencer - SQ_ON, // 5D2E - SQ_OFF, // 5D2F - SQ_TOG, // 5D30 - - SQ_TMPD, // 5D31 - SQ_TMPU, // 5D32 - - SQ_RESD, // 5D33 - SQ_RESU, // 5D34 - - SQ_SALL, // 5D35 - SQ_SCLR, // 5D36 - - SEQUENCER_STEP_MIN, // 5D37 - SEQUENCER_STEP_MAX = SEQUENCER_STEP_MIN + SEQUENCER_STEPS, - - SEQUENCER_RESOLUTION_MIN, - SEQUENCER_RESOLUTION_MAX = SEQUENCER_RESOLUTION_MIN + SEQUENCER_RESOLUTIONS, - - SEQUENCER_TRACK_MIN, - SEQUENCER_TRACK_MAX = SEQUENCER_TRACK_MIN + SEQUENCER_TRACKS, +// Pull in dd keycodes to maintain header compatibility +#include "keycodes.h" -#define SQ_S(n) (n < SEQUENCER_STEPS ? SEQUENCER_STEP_MIN + n : KC_NO) -#define SQ_R(n) (n < SEQUENCER_RESOLUTIONS ? SEQUENCER_RESOLUTION_MIN + n : KC_NO) -#define SQ_T(n) (n < SEQUENCER_TRACKS ? SEQUENCER_TRACK_MIN + n : KC_NO) +// US ANSI shifted keycode aliases +#include "keymap_us.h" - // One Shot - QK_ONE_SHOT_ON, - QK_ONE_SHOT_OFF, - QK_ONE_SHOT_TOGGLE, - - // RGB underglow/matrix (continued) - RGB_MODE_TWINKLE, - - // Key Overrides - QK_KEY_OVERRIDE_TOGGLE, - QK_KEY_OVERRIDE_ON, - QK_KEY_OVERRIDE_OFF, - - // Additional magic key - MAGIC_TOGGLE_GUI, - - // Adjust tapping term on the fly - DT_PRNT, - DT_UP, - DT_DOWN, - - // Programmable Button - QK_PROGRAMMABLE_BUTTON_1, - QK_PROGRAMMABLE_BUTTON_2, - QK_PROGRAMMABLE_BUTTON_3, - QK_PROGRAMMABLE_BUTTON_4, - QK_PROGRAMMABLE_BUTTON_5, - QK_PROGRAMMABLE_BUTTON_6, - QK_PROGRAMMABLE_BUTTON_7, - QK_PROGRAMMABLE_BUTTON_8, - QK_PROGRAMMABLE_BUTTON_9, - QK_PROGRAMMABLE_BUTTON_10, - QK_PROGRAMMABLE_BUTTON_11, - QK_PROGRAMMABLE_BUTTON_12, - QK_PROGRAMMABLE_BUTTON_13, - QK_PROGRAMMABLE_BUTTON_14, - QK_PROGRAMMABLE_BUTTON_15, - QK_PROGRAMMABLE_BUTTON_16, - QK_PROGRAMMABLE_BUTTON_17, - QK_PROGRAMMABLE_BUTTON_18, - QK_PROGRAMMABLE_BUTTON_19, - QK_PROGRAMMABLE_BUTTON_20, - QK_PROGRAMMABLE_BUTTON_21, - QK_PROGRAMMABLE_BUTTON_22, - QK_PROGRAMMABLE_BUTTON_23, - QK_PROGRAMMABLE_BUTTON_24, - QK_PROGRAMMABLE_BUTTON_25, - QK_PROGRAMMABLE_BUTTON_26, - QK_PROGRAMMABLE_BUTTON_27, - QK_PROGRAMMABLE_BUTTON_28, - QK_PROGRAMMABLE_BUTTON_29, - QK_PROGRAMMABLE_BUTTON_30, - QK_PROGRAMMABLE_BUTTON_31, - QK_PROGRAMMABLE_BUTTON_32, - - // Dedicated macro keys for Configurator and VIA - MACRO_0, - MACRO_1, - MACRO_2, - MACRO_3, - MACRO_4, - MACRO_5, - MACRO_6, - MACRO_7, - MACRO_8, - MACRO_9, - MACRO_10, - MACRO_11, - MACRO_12, - MACRO_13, - MACRO_14, - MACRO_15, - MACRO_16, - MACRO_17, - MACRO_18, - MACRO_19, - MACRO_20, - MACRO_21, - MACRO_22, - MACRO_23, - MACRO_24, - MACRO_25, - MACRO_26, - MACRO_27, - MACRO_28, - MACRO_29, - MACRO_30, - MACRO_31, - - MAGIC_TOGGLE_CONTROL_CAPSLOCK, - - QK_MAKE, - QK_REBOOT, - - QK_SECURE_LOCK, - QK_SECURE_UNLOCK, - QK_SECURE_TOGGLE, - QK_SECURE_REQUEST, - - QK_CAPS_WORD_TOGGLE, - - MAGIC_SWAP_ESCAPE_CAPSLOCK, - MAGIC_UNSWAP_ESCAPE_CAPSLOCK, - MAGIC_TOGGLE_ESCAPE_CAPSLOCK, - - QK_UNICODE_MODE_EMACS, - - QK_AUTOCORRECT_ON, - QK_AUTOCORRECT_OFF, - QK_AUTOCORRECT_TOGGLE, - - MAGIC_TOGGLE_BACKSLASH_BACKSPACE, - - // Start of custom keycode range for keyboards and keymaps - always leave at the end - SAFE_RANGE -}; +// TODO: sub-ranges? +// clang-format off +#define QK_LCTL 0x0100 +#define QK_LSFT 0x0200 +#define QK_LALT 0x0400 +#define QK_LGUI 0x0800 +#define QK_RMODS_MIN 0x1000 +#define QK_RCTL 0x1100 +#define QK_RSFT 0x1200 +#define QK_RALT 0x1400 +#define QK_RGUI 0x1800 +#define QK_UNICODEMAP 0x8000 +#define QK_UNICODEMAP_MAX 0xBFFF +#define QK_UNICODEMAP_PAIR 0xC000 +#define QK_UNICODEMAP_PAIR_MAX 0xFFFF +// clang-format on // Keycode modifiers & aliases #define LCTL(kc) (QK_LCTL | (kc)) @@ -654,122 +72,35 @@ enum quantum_keycodes { #define RCS(kc) (QK_RCTL | QK_RSFT | (kc)) #define SAGR(kc) RSA(kc) -#define MOD_HYPR 0xF -#define MOD_MEH 0x7 - -// US ANSI shifted keycode aliases -#include "keymap_us.h" - // Modified keycode aliases #define C(kc) LCTL(kc) #define S(kc) LSFT(kc) #define A(kc) LALT(kc) #define G(kc) LGUI(kc) -#define QK_GESC QK_GRAVE_ESCAPE - -#define QK_BOOT QK_BOOTLOADER -#define DB_TOGG QK_DEBUG_TOGGLE -#define EE_CLR QK_CLEAR_EEPROM -#define QK_RBT QK_REBOOT - -// Audio Clicky aliases -#define CK_TOGG CLICKY_TOGGLE -#define CK_RST CLICKY_RESET -#define CK_UP CLICKY_UP -#define CK_DOWN CLICKY_DOWN -#define CK_ON CLICKY_ENABLE -#define CK_OFF CLICKY_DISABLE - -// RGB aliases -#define RGB_MOD RGB_MODE_FORWARD -#define RGB_RMOD RGB_MODE_REVERSE -#define RGB_M_P RGB_MODE_PLAIN -#define RGB_M_B RGB_MODE_BREATHE -#define RGB_M_R RGB_MODE_RAINBOW -#define RGB_M_SW RGB_MODE_SWIRL -#define RGB_M_SN RGB_MODE_SNAKE -#define RGB_M_K RGB_MODE_KNIGHT -#define RGB_M_X RGB_MODE_XMAS -#define RGB_M_G RGB_MODE_GRADIENT -#define RGB_M_T RGB_MODE_RGBTEST -#define RGB_M_TW RGB_MODE_TWINKLE - -// Magic aliases -#define CL_SWAP MAGIC_SWAP_CONTROL_CAPSLOCK -#define CL_NORM MAGIC_UNSWAP_CONTROL_CAPSLOCK -#define CL_CTRL MAGIC_CAPSLOCK_TO_CONTROL -#define CL_CAPS MAGIC_UNCAPSLOCK_TO_CONTROL -#define CL_TOGG MAGIC_TOGGLE_CONTROL_CAPSLOCK - -#define EC_SWAP MAGIC_SWAP_ESCAPE_CAPSLOCK -#define EC_NORM MAGIC_UNSWAP_ESCAPE_CAPSLOCK -#define EC_TOGG MAGIC_TOGGLE_ESCAPE_CAPSLOCK - -#define LCG_SWP MAGIC_SWAP_LCTL_LGUI -#define LCG_NRM MAGIC_UNSWAP_LCTL_LGUI -#define RCG_SWP MAGIC_SWAP_RCTL_RGUI -#define RCG_NRM MAGIC_UNSWAP_RCTL_RGUI -#define CG_SWAP MAGIC_SWAP_CTL_GUI -#define CG_NORM MAGIC_UNSWAP_CTL_GUI -#define CG_TOGG MAGIC_TOGGLE_CTL_GUI - -#define LAG_SWP MAGIC_SWAP_LALT_LGUI -#define LAG_NRM MAGIC_UNSWAP_LALT_LGUI -#define RAG_SWP MAGIC_SWAP_RALT_RGUI -#define RAG_NRM MAGIC_UNSWAP_RALT_RGUI -#define AG_SWAP MAGIC_SWAP_ALT_GUI -#define AG_NORM MAGIC_UNSWAP_ALT_GUI -#define AG_TOGG MAGIC_TOGGLE_ALT_GUI - -#define GUI_OFF MAGIC_NO_GUI -#define GUI_ON MAGIC_UNNO_GUI -#define GUI_TOG MAGIC_TOGGLE_GUI - -#define GE_SWAP MAGIC_SWAP_GRAVE_ESC -#define GE_NORM MAGIC_UNSWAP_GRAVE_ESC - -#define BS_SWAP MAGIC_SWAP_BACKSLASH_BACKSPACE -#define BS_NORM MAGIC_UNSWAP_BACKSLASH_BACKSPACE -#define BS_TOGG MAGIC_TOGGLE_BACKSLASH_BACKSPACE - -#define NK_ON MAGIC_HOST_NKRO -#define NK_OFF MAGIC_UNHOST_NKRO -#define NK_TOGG MAGIC_TOGGLE_NKRO - -#define EH_LEFT MAGIC_EE_HANDS_LEFT -#define EH_RGHT MAGIC_EE_HANDS_RIGHT - -#define AC_ON QK_AUTOCORRECT_ON -#define AC_OFF QK_AUTOCORRECT_OFF -#define AC_TOGG QK_AUTOCORRECT_TOGGLE - -// Velocikey -#define VK_TOGG QK_VELOCIKEY_TOGGLE - -// GOTO layer - 256 layer max -#define TO(layer) (QK_TO | ((layer)&0xFF)) - -// Momentary switch layer - 256 layer max -#define MO(layer) (QK_MOMENTARY | ((layer)&0xFF)) - -// Set default layer - 256 layer max -#define DF(layer) (QK_DEF_LAYER | ((layer)&0xFF)) - -// Toggle to layer - 256 layer max -#define TG(layer) (QK_TOGGLE_LAYER | ((layer)&0xFF)) - -// One-shot layer - 256 layer max -#define OSL(layer) (QK_ONE_SHOT_LAYER | ((layer)&0xFF)) - -// L-ayer M-od: Momentary switch layer with modifiers active - 16 layer max, left mods only -#define LM(layer, mod) (QK_LAYER_MOD | (((layer)&0xF) << 4) | ((mod)&0xF)) +// GOTO layer - 32 layer max +#define TO(layer) (QK_TO | ((layer)&0x1F)) + +// Momentary switch layer - 32 layer max +#define MO(layer) (QK_MOMENTARY | ((layer)&0x1F)) + +// Set default layer - 32 layer max +#define DF(layer) (QK_DEF_LAYER | ((layer)&0x1F)) + +// Toggle to layer - 32 layer max +#define TG(layer) (QK_TOGGLE_LAYER | ((layer)&0x1F)) + +// One-shot layer - 32 layer max +#define OSL(layer) (QK_ONE_SHOT_LAYER | ((layer)&0x1F)) + +// L-ayer M-od: Momentary switch layer with modifiers active - 16 layer max +#define LM(layer, mod) (QK_LAYER_MOD | (((layer)&0xF) << 5) | ((mod)&0x1F)) // One-shot mod -#define OSM(mod) (QK_ONE_SHOT_MOD | ((mod)&0xFF)) +#define OSM(mod) (QK_ONE_SHOT_MOD | ((mod)&0x1F)) -// Layer tap-toggle -#define TT(layer) (QK_LAYER_TAP_TOGGLE | ((layer)&0xFF)) +// Layer tap-toggle - 32 layer max +#define TT(layer) (QK_LAYER_TAP_TOGGLE | ((layer)&0x1F)) // L-ayer, T-ap - 256 keycode max, 16 layer max #define LT(layer, kc) (QK_LAYER_TAP | (((layer)&0xF) << 8) | ((kc)&0xFF)) @@ -834,64 +165,8 @@ enum quantum_keycodes { #define X(i) (QK_UNICODEMAP | (i)) #define XP(i, j) (QK_UNICODEMAP_PAIR | ((i)&0x7F) | (((j)&0x7F) << 7)) // 127 max i and j -#define UC_NEXT QK_UNICODE_MODE_NEXT -#define UC_PREV QK_UNICODE_MODE_PREVIOUS - -#define UC_MAC QK_UNICODE_MODE_MACOS -#define UC_LINX QK_UNICODE_MODE_LINUX -#define UC_WIN QK_UNICODE_MODE_WINDOWS -#define UC_BSD QK_UNICODE_MODE_BSD -#define UC_WINC QK_UNICODE_MODE_WINCOMPOSE -#define UC_EMAC QK_UNICODE_MODE_EMACS - -// Auto Shift -#define AS_UP QK_AUTO_SHIFT_UP -#define AS_DOWN QK_AUTO_SHIFT_DOWN -#define AS_RPT QK_AUTO_SHIFT_REPORT -#define AS_TOGG QK_AUTO_SHIFT_TOGGLE -#define AS_ON QK_AUTO_SHIFT_ON -#define AS_OFF QK_AUTO_SHIFT_OFF - -// Leader key -#define QK_LEAD QK_LEADER - -// Caps Word -#define CW_TOGG QK_CAPS_WORD_TOGGLE - -// Key Overrides -#define KO_TOGG QK_KEY_OVERRIDE_TOGGLE -#define KO_ON QK_KEY_OVERRIDE_ON -#define KO_OFF QK_KEY_OVERRIDE_OFF - -// Secure -#define SE_LOCK QK_SECURE_LOCK -#define SE_UNLK QK_SECURE_UNLOCK -#define SE_TOGG QK_SECURE_TOGGLE -#define SE_REQ QK_SECURE_REQUEST - -// Space Cadet -#define SC_LSPO QK_SPACE_CADET_LEFT_SHIFT_PARENTHESIS_OPEN -#define SC_RSPC QK_SPACE_CADET_RIGHT_SHIFT_PARENTHESIS_CLOSE -#define SC_LCPO QK_SPACE_CADET_LEFT_CTRL_PARENTHESIS_OPEN -#define SC_RCPC QK_SPACE_CADET_RIGHT_CTRL_PARENTHESIS_CLOSE -#define SC_LAPO QK_SPACE_CADET_LEFT_ALT_PARENTHESIS_OPEN -#define SC_RAPC QK_SPACE_CADET_RIGHT_ALT_PARENTHESIS_CLOSE -#define SC_SENT QK_SPACE_CADET_RIGHT_SHIFT_ENTER - -// Combos -#define CM_ON QK_COMBO_ON -#define CM_OFF QK_COMBO_OFF -#define CM_TOGG QK_COMBO_TOGGLE - // Swap Hands #define SH_T(kc) (QK_SWAP_HANDS | (kc)) -#define SH_TG (QK_SWAP_HANDS | OP_SH_TOGGLE) -#define SH_TT (QK_SWAP_HANDS | OP_SH_TAP_TOGGLE) -#define SH_OS (QK_SWAP_HANDS | OP_SH_ONESHOT) -#define SH_MON (QK_SWAP_HANDS | OP_SH_ON_OFF) -#define SH_MOFF (QK_SWAP_HANDS | OP_SH_OFF_ON) -#define SH_ON (QK_SWAP_HANDS | OP_SH_ON) -#define SH_OFF (QK_SWAP_HANDS | OP_SH_OFF) // MIDI aliases #define MIDI_TONE_MIN MI_C @@ -905,88 +180,20 @@ enum quantum_keycodes { #define MIDI_CHANNEL_MIN MI_CH1 #define MIDI_CHANNEL_MAX MI_CH16 -// Dynamic Macros aliases -#define DM_REC1 QK_DYNAMIC_MACRO_RECORD_START_1 -#define DM_REC2 QK_DYNAMIC_MACRO_RECORD_START_2 -#define DM_RSTP QK_DYNAMIC_MACRO_RECORD_STOP -#define DM_PLY1 QK_DYNAMIC_MACRO_PLAY_1 -#define DM_PLY2 QK_DYNAMIC_MACRO_PLAY_2 - -// Joystick aliases -#define JS_0 QK_JOYSTICK_BUTTON_0 -#define JS_1 QK_JOYSTICK_BUTTON_1 -#define JS_2 QK_JOYSTICK_BUTTON_2 -#define JS_3 QK_JOYSTICK_BUTTON_3 -#define JS_4 QK_JOYSTICK_BUTTON_4 -#define JS_5 QK_JOYSTICK_BUTTON_5 -#define JS_6 QK_JOYSTICK_BUTTON_6 -#define JS_7 QK_JOYSTICK_BUTTON_7 -#define JS_8 QK_JOYSTICK_BUTTON_8 -#define JS_9 QK_JOYSTICK_BUTTON_9 -#define JS_10 QK_JOYSTICK_BUTTON_10 -#define JS_11 QK_JOYSTICK_BUTTON_11 -#define JS_12 QK_JOYSTICK_BUTTON_12 -#define JS_13 QK_JOYSTICK_BUTTON_13 -#define JS_14 QK_JOYSTICK_BUTTON_14 -#define JS_15 QK_JOYSTICK_BUTTON_15 -#define JS_16 QK_JOYSTICK_BUTTON_16 -#define JS_17 QK_JOYSTICK_BUTTON_17 -#define JS_18 QK_JOYSTICK_BUTTON_18 -#define JS_19 QK_JOYSTICK_BUTTON_19 -#define JS_20 QK_JOYSTICK_BUTTON_20 -#define JS_21 QK_JOYSTICK_BUTTON_21 -#define JS_22 QK_JOYSTICK_BUTTON_22 -#define JS_23 QK_JOYSTICK_BUTTON_23 -#define JS_24 QK_JOYSTICK_BUTTON_24 -#define JS_25 QK_JOYSTICK_BUTTON_25 -#define JS_26 QK_JOYSTICK_BUTTON_26 -#define JS_27 QK_JOYSTICK_BUTTON_27 -#define JS_28 QK_JOYSTICK_BUTTON_28 -#define JS_29 QK_JOYSTICK_BUTTON_29 -#define JS_30 QK_JOYSTICK_BUTTON_30 -#define JS_31 QK_JOYSTICK_BUTTON_31 -#define QK_JOYSTICK_BUTTON_MIN QK_JOYSTICK_BUTTON_0 -#define QK_JOYSTICK_BUTTON_MAX QK_JOYSTICK_BUTTON_31 - -// One Shot aliases -#define OS_TOGG QK_ONE_SHOT_TOGGLE -#define OS_ON QK_ONE_SHOT_ON -#define OS_OFF QK_ONE_SHOT_OFF - -// Programmable Button aliases -#define PB_1 QK_PROGRAMMABLE_BUTTON_1 -#define PB_2 QK_PROGRAMMABLE_BUTTON_2 -#define PB_3 QK_PROGRAMMABLE_BUTTON_3 -#define PB_4 QK_PROGRAMMABLE_BUTTON_4 -#define PB_5 QK_PROGRAMMABLE_BUTTON_5 -#define PB_6 QK_PROGRAMMABLE_BUTTON_6 -#define PB_7 QK_PROGRAMMABLE_BUTTON_7 -#define PB_8 QK_PROGRAMMABLE_BUTTON_8 -#define PB_9 QK_PROGRAMMABLE_BUTTON_9 -#define PB_10 QK_PROGRAMMABLE_BUTTON_10 -#define PB_11 QK_PROGRAMMABLE_BUTTON_11 -#define PB_12 QK_PROGRAMMABLE_BUTTON_12 -#define PB_13 QK_PROGRAMMABLE_BUTTON_13 -#define PB_14 QK_PROGRAMMABLE_BUTTON_14 -#define PB_15 QK_PROGRAMMABLE_BUTTON_15 -#define PB_16 QK_PROGRAMMABLE_BUTTON_16 -#define PB_17 QK_PROGRAMMABLE_BUTTON_17 -#define PB_18 QK_PROGRAMMABLE_BUTTON_18 -#define PB_19 QK_PROGRAMMABLE_BUTTON_19 -#define PB_20 QK_PROGRAMMABLE_BUTTON_20 -#define PB_21 QK_PROGRAMMABLE_BUTTON_21 -#define PB_22 QK_PROGRAMMABLE_BUTTON_22 -#define PB_23 QK_PROGRAMMABLE_BUTTON_23 -#define PB_24 QK_PROGRAMMABLE_BUTTON_24 -#define PB_25 QK_PROGRAMMABLE_BUTTON_25 -#define PB_26 QK_PROGRAMMABLE_BUTTON_26 -#define PB_27 QK_PROGRAMMABLE_BUTTON_27 -#define PB_28 QK_PROGRAMMABLE_BUTTON_28 -#define PB_29 QK_PROGRAMMABLE_BUTTON_29 -#define PB_30 QK_PROGRAMMABLE_BUTTON_30 -#define PB_31 QK_PROGRAMMABLE_BUTTON_31 -#define PB_32 QK_PROGRAMMABLE_BUTTON_32 -#define QK_PROGRAMMABLE_BUTTON_MIN QK_PROGRAMMABLE_BUTTON_1 -#define QK_PROGRAMMABLE_BUTTON_MAX QK_PROGRAMMABLE_BUTTON_32 +// TODO: somehow migrate sequencer to DD? +#include "sequencer.h" + +#define SEQUENCER_STEP_MIN (QK_SEQUENCER + 0xF) +#define SEQUENCER_STEP_MAX (SEQUENCER_STEP_MIN + SEQUENCER_STEPS) + +#define SEQUENCER_RESOLUTION_MIN (SEQUENCER_STEP_MAX + 1) +#define SEQUENCER_RESOLUTION_MAX (SEQUENCER_RESOLUTION_MIN + SEQUENCER_RESOLUTIONS) + +#define SEQUENCER_TRACK_MIN (SEQUENCER_RESOLUTION_MAX + 1) +#define SEQUENCER_TRACK_MAX (SEQUENCER_TRACK_MIN + SEQUENCER_TRACKS) + +#define SQ_S(n) (n < SEQUENCER_STEPS ? SEQUENCER_STEP_MIN + n : KC_NO) +#define SQ_R(n) (n < SEQUENCER_RESOLUTIONS ? SEQUENCER_RESOLUTION_MIN + n : KC_NO) +#define SQ_T(n) (n < SEQUENCER_TRACKS ? SEQUENCER_TRACK_MIN + n : KC_NO) #include "quantum_keycodes_legacy.h" diff --git a/quantum/send_string/send_string_keycodes.h b/quantum/send_string/send_string_keycodes.h index f9e1c101ff..54b8382053 100644 --- a/quantum/send_string/send_string_keycodes.h +++ b/quantum/send_string/send_string_keycodes.h @@ -389,48 +389,25 @@ #define X_ASSISTANT c0 /* Mouse Buttons (unallocated range in HID spec) */ -#ifdef VIA_ENABLE -#define X_MS_UP f0 -#define X_MS_DOWN f1 -#define X_MS_LEFT f2 -#define X_MS_RIGHT f3 -#define X_MS_BTN1 f4 -#define X_MS_BTN2 f5 -#define X_MS_BTN3 f6 -#define X_MS_BTN4 f7 -#define X_MS_BTN5 f8 -#define X_MS_BTN6 f8 -#define X_MS_BTN7 f8 -#define X_MS_BTN8 f8 -#define X_MS_WH_UP f9 -#define X_MS_WH_DOWN fa -#define X_MS_WH_LEFT fb -#define X_MS_WH_RIGHT fc -#define X_MS_ACCEL0 fd -#define X_MS_ACCEL1 fe -#define X_MS_ACCEL2 ff -#else -#define X_MS_UP cd -#define X_MS_DOWN ce -#define X_MS_LEFT cf -#define X_MS_RIGHT d0 -#define X_MS_BTN1 d1 -#define X_MS_BTN2 d2 -#define X_MS_BTN3 d3 -#define X_MS_BTN4 d4 -#define X_MS_BTN5 d5 -#define X_MS_BTN6 d6 -#define X_MS_BTN7 d7 -#define X_MS_BTN8 d8 -#define X_MS_WH_UP d9 -#define X_MS_WH_DOWN da -#define X_MS_WH_LEFT db -#define X_MS_WH_RIGHT dc -#define X_MS_ACCEL0 dd -#define X_MS_ACCEL1 de -#define X_MS_ACCEL2 df -#endif - +#define X_MS_UP cd +#define X_MS_DOWN ce +#define X_MS_LEFT cf +#define X_MS_RIGHT d0 +#define X_MS_BTN1 d1 +#define X_MS_BTN2 d2 +#define X_MS_BTN3 d3 +#define X_MS_BTN4 d4 +#define X_MS_BTN5 d5 +#define X_MS_BTN6 d6 +#define X_MS_BTN7 d7 +#define X_MS_BTN8 d8 +#define X_MS_WH_UP d9 +#define X_MS_WH_DOWN da +#define X_MS_WH_LEFT db +#define X_MS_WH_RIGHT dc +#define X_MS_ACCEL0 dd +#define X_MS_ACCEL1 de +#define X_MS_ACCEL2 df // Send string macros #define STRINGIZE(z) #z diff --git a/quantum/via.c b/quantum/via.c index 37e2046a10..5afbee5a30 100644 --- a/quantum/via.c +++ b/quantum/via.c @@ -50,7 +50,6 @@ #include "dynamic_keymap.h" #include "eeprom.h" #include "version.h" // for QMK_BUILDDATE used in EEPROM magic -#include "via_ensure_keycode.h" // Forward declare some helpers. #if defined(VIA_QMK_BACKLIGHT_ENABLE) diff --git a/quantum/via.h b/quantum/via.h index 558ae95de4..84b264903f 100644 --- a/quantum/via.h +++ b/quantum/via.h @@ -58,7 +58,7 @@ // This is changed only when the command IDs change, // so VIA Configurator can detect compatible firmware. -#define VIA_PROTOCOL_VERSION 0x000A +#define VIA_PROTOCOL_VERSION 0x000B enum via_command_id { id_get_protocol_version = 0x01, // always 0x01 @@ -103,13 +103,8 @@ enum via_lighting_value { id_qmk_rgblight_color = 0x83, }; -// Can't use SAFE_RANGE here, it might change if someone adds -// new values to enum quantum_keycodes. -// Need to keep checking 0x5F10 is still in the safe range. -// TODO: merge this into quantum_keycodes -// Backlight keycodes are in range 0x5F00-0x5F0F enum via_keycodes { - FN_MO13 = 0x5F10, + FN_MO13 = QK_MACRO, FN_MO23, MACRO00, MACRO01, @@ -130,7 +125,7 @@ enum via_keycodes { }; enum user_keycodes { - USER00 = 0x5F80, + USER00 = QK_USER, USER01, USER02, USER03, diff --git a/quantum/via_ensure_keycode.h b/quantum/via_ensure_keycode.h deleted file mode 100644 index 48e611d0fa..0000000000 --- a/quantum/via_ensure_keycode.h +++ /dev/null @@ -1,344 +0,0 @@ -#pragma once - -#include "quantum.h" -#include "via.h" - -#ifndef VIA_HAS_BROKEN_KEYCODES - -// clang-format off - -_Static_assert(KC_NO == 0x0000, ""); -_Static_assert(KC_TRANSPARENT == 0x0001, ""); - -_Static_assert(KC_A == 0x0004, ""); -_Static_assert(KC_B == 0x0005, ""); -_Static_assert(KC_C == 0x0006, ""); -_Static_assert(KC_D == 0x0007, ""); -_Static_assert(KC_E == 0x0008, ""); -_Static_assert(KC_F == 0x0009, ""); -_Static_assert(KC_G == 0x000A, ""); -_Static_assert(KC_H == 0x000B, ""); -_Static_assert(KC_I == 0x000C, ""); -_Static_assert(KC_J == 0x000D, ""); -_Static_assert(KC_K == 0x000E, ""); -_Static_assert(KC_L == 0x000F, ""); -_Static_assert(KC_M == 0x0010, ""); -_Static_assert(KC_N == 0x0011, ""); -_Static_assert(KC_O == 0x0012, ""); -_Static_assert(KC_P == 0x0013, ""); -_Static_assert(KC_Q == 0x0014, ""); -_Static_assert(KC_R == 0x0015, ""); -_Static_assert(KC_S == 0x0016, ""); -_Static_assert(KC_T == 0x0017, ""); -_Static_assert(KC_U == 0x0018, ""); -_Static_assert(KC_V == 0x0019, ""); -_Static_assert(KC_W == 0x001A, ""); -_Static_assert(KC_X == 0x001B, ""); -_Static_assert(KC_Y == 0x001C, ""); -_Static_assert(KC_Z == 0x001D, ""); -_Static_assert(KC_1 == 0x001E, ""); -_Static_assert(KC_2 == 0x001F, ""); -_Static_assert(KC_3 == 0x0020, ""); -_Static_assert(KC_4 == 0x0021, ""); -_Static_assert(KC_5 == 0x0022, ""); -_Static_assert(KC_6 == 0x0023, ""); -_Static_assert(KC_7 == 0x0024, ""); -_Static_assert(KC_8 == 0x0025, ""); -_Static_assert(KC_9 == 0x0026, ""); -_Static_assert(KC_0 == 0x0027, ""); -_Static_assert(KC_ENTER == 0x0028, ""); -_Static_assert(KC_ESCAPE == 0x0029, ""); -_Static_assert(KC_BACKSPACE == 0x002A, ""); -_Static_assert(KC_TAB == 0x002B, ""); -_Static_assert(KC_SPACE == 0x002C, ""); -_Static_assert(KC_MINUS == 0x002D, ""); -_Static_assert(KC_EQUAL == 0x002E, ""); -_Static_assert(KC_LEFT_BRACKET == 0x002F, ""); -_Static_assert(KC_RIGHT_BRACKET == 0x0030, ""); -_Static_assert(KC_BACKSLASH == 0x0031, ""); -_Static_assert(KC_NONUS_HASH == 0x0032, ""); -_Static_assert(KC_SEMICOLON == 0x0033, ""); -_Static_assert(KC_QUOTE == 0x0034, ""); -_Static_assert(KC_GRAVE == 0x0035, ""); -_Static_assert(KC_COMMA == 0x0036, ""); -_Static_assert(KC_DOT == 0x0037, ""); -_Static_assert(KC_SLASH == 0x0038, ""); -_Static_assert(KC_CAPS_LOCK == 0x0039, ""); -_Static_assert(KC_F1 == 0x003A, ""); -_Static_assert(KC_F2 == 0x003B, ""); -_Static_assert(KC_F3 == 0x003C, ""); -_Static_assert(KC_F4 == 0x003D, ""); -_Static_assert(KC_F5 == 0x003E, ""); -_Static_assert(KC_F6 == 0x003F, ""); -_Static_assert(KC_F7 == 0x0040, ""); -_Static_assert(KC_F8 == 0x0041, ""); -_Static_assert(KC_F9 == 0x0042, ""); -_Static_assert(KC_F10 == 0x0043, ""); -_Static_assert(KC_F11 == 0x0044, ""); -_Static_assert(KC_F12 == 0x0045, ""); -_Static_assert(KC_PRINT_SCREEN == 0x0046, ""); -_Static_assert(KC_SCROLL_LOCK == 0x0047, ""); -_Static_assert(KC_PAUSE == 0x0048, ""); -_Static_assert(KC_INSERT == 0x0049, ""); -_Static_assert(KC_HOME == 0x004A, ""); -_Static_assert(KC_PAGE_UP == 0x004B, ""); -_Static_assert(KC_DELETE == 0x004C, ""); -_Static_assert(KC_END == 0x004D, ""); -_Static_assert(KC_PAGE_DOWN == 0x004E, ""); -_Static_assert(KC_RIGHT == 0x004F, ""); -_Static_assert(KC_LEFT == 0x0050, ""); -_Static_assert(KC_DOWN == 0x0051, ""); -_Static_assert(KC_UP == 0x0052, ""); -_Static_assert(KC_NUM_LOCK == 0x0053, ""); -_Static_assert(KC_KP_SLASH == 0x0054, ""); -_Static_assert(KC_KP_ASTERISK == 0x0055, ""); -_Static_assert(KC_KP_MINUS == 0x0056, ""); -_Static_assert(KC_KP_PLUS == 0x0057, ""); -_Static_assert(KC_KP_ENTER == 0x0058, ""); -_Static_assert(KC_KP_1 == 0x0059, ""); -_Static_assert(KC_KP_2 == 0x005A, ""); -_Static_assert(KC_KP_3 == 0x005B, ""); -_Static_assert(KC_KP_4 == 0x005C, ""); -_Static_assert(KC_KP_5 == 0x005D, ""); -_Static_assert(KC_KP_6 == 0x005E, ""); -_Static_assert(KC_KP_7 == 0x005F, ""); -_Static_assert(KC_KP_8 == 0x0060, ""); -_Static_assert(KC_KP_9 == 0x0061, ""); -_Static_assert(KC_KP_0 == 0x0062, ""); -_Static_assert(KC_KP_DOT == 0x0063, ""); -_Static_assert(KC_NONUS_BACKSLASH == 0x0064, ""); -_Static_assert(KC_APPLICATION == 0x0065, ""); -_Static_assert(KC_KB_POWER == 0x0066, ""); -_Static_assert(KC_KP_EQUAL == 0x0067, ""); -_Static_assert(KC_F13 == 0x0068, ""); -_Static_assert(KC_F14 == 0x0069, ""); -_Static_assert(KC_F15 == 0x006A, ""); -_Static_assert(KC_F16 == 0x006B, ""); -_Static_assert(KC_F17 == 0x006C, ""); -_Static_assert(KC_F18 == 0x006D, ""); -_Static_assert(KC_F19 == 0x006E, ""); -_Static_assert(KC_F20 == 0x006F, ""); -_Static_assert(KC_F21 == 0x0070, ""); -_Static_assert(KC_F22 == 0x0071, ""); -_Static_assert(KC_F23 == 0x0072, ""); -_Static_assert(KC_F24 == 0x0073, ""); -_Static_assert(KC_EXECUTE == 0x0074, ""); -_Static_assert(KC_HELP == 0x0075, ""); -_Static_assert(KC_MENU == 0x0076, ""); -_Static_assert(KC_SELECT == 0x0077, ""); -_Static_assert(KC_STOP == 0x0078, ""); -_Static_assert(KC_AGAIN == 0x0079, ""); -_Static_assert(KC_UNDO == 0x007A, ""); -_Static_assert(KC_CUT == 0x007B, ""); -_Static_assert(KC_COPY == 0x007C, ""); -_Static_assert(KC_PASTE == 0x007D, ""); -_Static_assert(KC_FIND == 0x007E, ""); - -_Static_assert(KC_LOCKING_CAPS_LOCK == 0x0082, ""); -_Static_assert(KC_LOCKING_NUM_LOCK == 0x0083, ""); -_Static_assert(KC_LOCKING_SCROLL_LOCK == 0x0084, ""); -_Static_assert(KC_KP_COMMA == 0x0085, ""); -_Static_assert(KC_KP_EQUAL_AS400 == 0x0086, ""); -_Static_assert(KC_INTERNATIONAL_1 == 0x0087, ""); -_Static_assert(KC_INTERNATIONAL_2 == 0x0088, ""); -_Static_assert(KC_INTERNATIONAL_3 == 0x0089, ""); -_Static_assert(KC_INTERNATIONAL_4 == 0x008A, ""); -_Static_assert(KC_INTERNATIONAL_5 == 0x008B, ""); -_Static_assert(KC_INTERNATIONAL_6 == 0x008C, ""); -_Static_assert(KC_INTERNATIONAL_7 == 0x008D, ""); -_Static_assert(KC_INTERNATIONAL_8 == 0x008E, ""); -_Static_assert(KC_INTERNATIONAL_9 == 0x008F, ""); -_Static_assert(KC_LANGUAGE_1 == 0x0090, ""); -_Static_assert(KC_LANGUAGE_2 == 0x0091, ""); -_Static_assert(KC_LANGUAGE_3 == 0x0092, ""); -_Static_assert(KC_LANGUAGE_4 == 0x0093, ""); -_Static_assert(KC_LANGUAGE_5 == 0x0094, ""); -_Static_assert(KC_LANGUAGE_6 == 0x0095, ""); -_Static_assert(KC_LANGUAGE_7 == 0x0096, ""); -_Static_assert(KC_LANGUAGE_8 == 0x0097, ""); -_Static_assert(KC_LANGUAGE_9 == 0x0098, ""); -_Static_assert(KC_ALTERNATE_ERASE == 0x0099, ""); -_Static_assert(KC_SYSTEM_REQUEST == 0x009A, ""); -_Static_assert(KC_CANCEL == 0x009B, ""); -_Static_assert(KC_CLEAR == 0x009C, ""); -_Static_assert(KC_PRIOR == 0x009D, ""); - -_Static_assert(KC_OUT == 0x00A0, ""); -_Static_assert(KC_OPER == 0x00A1, ""); -_Static_assert(KC_CLEAR_AGAIN == 0x00A2, ""); -_Static_assert(KC_CRSEL == 0x00A3, ""); -_Static_assert(KC_EXSEL == 0x00A4, ""); - -_Static_assert(KC_PWR == 0x00A5, ""); -_Static_assert(KC_SLEP == 0x00A6, ""); -_Static_assert(KC_WAKE == 0x00A7, ""); -_Static_assert(KC_MUTE == 0x00A8, ""); -_Static_assert(KC_VOLU == 0x00A9, ""); -_Static_assert(KC_VOLD == 0x00AA, ""); -_Static_assert(KC_MNXT == 0x00AB, ""); -_Static_assert(KC_MPRV == 0x00AC, ""); -_Static_assert(KC_MSTP == 0x00AD, ""); -_Static_assert(KC_MPLY == 0x00AE, ""); -_Static_assert(KC_MSEL == 0x00AF, ""); -_Static_assert(KC_EJCT == 0x00B0, ""); -_Static_assert(KC_MAIL == 0x00B1, ""); -_Static_assert(KC_CALC == 0x00B2, ""); -_Static_assert(KC_MYCM == 0x00B3, ""); -_Static_assert(KC_WSCH == 0x00B4, ""); -_Static_assert(KC_WHOM == 0x00B5, ""); -_Static_assert(KC_WBAK == 0x00B6, ""); -_Static_assert(KC_WFWD == 0x00B7, ""); -_Static_assert(KC_WSTP == 0x00B8, ""); -_Static_assert(KC_WREF == 0x00B9, ""); -_Static_assert(KC_WFAV == 0x00BA, ""); -_Static_assert(KC_MFFD == 0x00BB, ""); -_Static_assert(KC_MRWD == 0x00BC, ""); -_Static_assert(KC_BRIU == 0x00BD, ""); -_Static_assert(KC_BRID == 0x00BE, ""); -_Static_assert(KC_CPNL == 0x00BF, ""); -_Static_assert(KC_ASST == 0x00C0, ""); - -_Static_assert(KC_LEFT_CTRL == 0x00E0, ""); -_Static_assert(KC_LEFT_SHIFT == 0x00E1, ""); -_Static_assert(KC_LEFT_ALT == 0x00E2, ""); -_Static_assert(KC_LEFT_GUI == 0x00E3, ""); -_Static_assert(KC_RIGHT_CTRL == 0x00E4, ""); -_Static_assert(KC_RIGHT_SHIFT == 0x00E5, ""); -_Static_assert(KC_RIGHT_ALT == 0x00E6, ""); -_Static_assert(KC_RIGHT_GUI == 0x00E7, ""); - -_Static_assert(KC_MS_U == 0x00F0, ""); -_Static_assert(KC_MS_D == 0x00F1, ""); -_Static_assert(KC_MS_L == 0x00F2, ""); -_Static_assert(KC_MS_R == 0x00F3, ""); -_Static_assert(KC_BTN1 == 0x00F4, ""); -_Static_assert(KC_BTN2 == 0x00F5, ""); -_Static_assert(KC_BTN3 == 0x00F6, ""); -_Static_assert(KC_BTN4 == 0x00F7, ""); -_Static_assert(KC_BTN5 == 0x00F8, ""); -_Static_assert(KC_WH_U == 0x00F9, ""); -_Static_assert(KC_WH_D == 0x00FA, ""); -_Static_assert(KC_WH_L == 0x00FB, ""); -_Static_assert(KC_WH_R == 0x00FC, ""); -_Static_assert(KC_ACL0 == 0x00FD, ""); -_Static_assert(KC_ACL1 == 0x00FE, ""); -_Static_assert(KC_ACL2 == 0x00FF, ""); - -_Static_assert(KC_EXLM == 0x021E, ""); -_Static_assert(KC_AT == 0x021F, ""); -_Static_assert(KC_HASH == 0x0220, ""); -_Static_assert(KC_DLR == 0x0221, ""); -_Static_assert(KC_PERC == 0x0222, ""); -_Static_assert(KC_CIRC == 0x0223, ""); -_Static_assert(KC_AMPR == 0x0224, ""); -_Static_assert(KC_ASTR == 0x0225, ""); -_Static_assert(KC_LPRN == 0x0226, ""); -_Static_assert(KC_RPRN == 0x0227, ""); -_Static_assert(KC_UNDS == 0x022D, ""); -_Static_assert(KC_PLUS == 0x022E, ""); -_Static_assert(KC_LCBR == 0x022F, ""); -_Static_assert(KC_RCBR == 0x0230, ""); -_Static_assert(KC_PIPE == 0x0231, ""); -_Static_assert(KC_COLN == 0x0233, ""); -_Static_assert(KC_DQUO == 0x0234, ""); -_Static_assert(KC_TILD == 0x0235, ""); -_Static_assert(KC_LT == 0x0236, ""); -_Static_assert(KC_GT == 0x0237, ""); -_Static_assert(KC_QUES == 0x0238, ""); - -_Static_assert(QK_BOOTLOADER == 0x5C00, ""); -_Static_assert(QK_DEBUG_TOGGLE == 0x5C01, ""); - -_Static_assert(MAGIC_TOGGLE_NKRO == 0x5C14, ""); - -_Static_assert(QK_GRAVE_ESCAPE == 0x5C16, ""); - -_Static_assert(AU_ON == 0x5C1D, ""); -_Static_assert(AU_OFF == 0x5C1E, ""); -_Static_assert(AU_TOG == 0x5C1F, ""); - -_Static_assert(CLICKY_TOGGLE == 0x5C20, ""); -_Static_assert(CLICKY_ENABLE == 0x5C21, ""); -_Static_assert(CLICKY_DISABLE == 0x5C22, ""); -_Static_assert(CLICKY_UP == 0x5C23, ""); -_Static_assert(CLICKY_DOWN == 0x5C24, ""); -_Static_assert(CLICKY_RESET == 0x5C25, ""); -_Static_assert(MU_ON == 0x5C26, ""); -_Static_assert(MU_OFF == 0x5C27, ""); -_Static_assert(MU_TOG == 0x5C28, ""); -_Static_assert(MU_MOD == 0x5C29, ""); - -_Static_assert(BL_ON == 0x5CBB, ""); -_Static_assert(BL_OFF == 0x5CBC, ""); -_Static_assert(BL_DEC == 0x5CBD, ""); -_Static_assert(BL_INC == 0x5CBE, ""); -_Static_assert(BL_TOGG == 0x5CBF, ""); -_Static_assert(BL_STEP == 0x5CC0, ""); -_Static_assert(BL_BRTG == 0x5CC1, ""); -_Static_assert(RGB_TOG == 0x5CC2, ""); -_Static_assert(RGB_MOD == 0x5CC3, ""); -_Static_assert(RGB_RMOD == 0x5CC4, ""); -_Static_assert(RGB_HUI == 0x5CC5, ""); -_Static_assert(RGB_HUD == 0x5CC6, ""); -_Static_assert(RGB_SAI == 0x5CC7, ""); -_Static_assert(RGB_SAD == 0x5CC8, ""); -_Static_assert(RGB_VAI == 0x5CC9, ""); -_Static_assert(RGB_VAD == 0x5CCA, ""); -_Static_assert(RGB_SPI == 0x5CCB, ""); -_Static_assert(RGB_SPD == 0x5CCC, ""); -_Static_assert(RGB_M_P == 0x5CCD, ""); -_Static_assert(RGB_M_B == 0x5CCE, ""); -_Static_assert(RGB_M_R == 0x5CCF, ""); -_Static_assert(RGB_M_SW == 0x5CD0, ""); -_Static_assert(RGB_M_SN == 0x5CD1, ""); -_Static_assert(RGB_M_K == 0x5CD2, ""); -_Static_assert(RGB_M_X == 0x5CD3, ""); -_Static_assert(RGB_M_G == 0x5CD4, ""); -_Static_assert(RGB_M_T == 0x5CD5, ""); - -_Static_assert(SC_LSPO == 0x5CD7, ""); -_Static_assert(SC_RSPC == 0x5CD8, ""); -_Static_assert(SC_SENT == 0x5CD9, ""); - -_Static_assert(SC_LCPO == 0x5CF3, ""); -_Static_assert(SC_RCPC == 0x5CF4, ""); -_Static_assert(SC_LAPO == 0x5CF5, ""); -_Static_assert(SC_RAPC == 0x5CF6, ""); - -_Static_assert(FN_MO13 == 0x5F10, ""); -_Static_assert(FN_MO23 == 0x5F11, ""); -_Static_assert(MACRO00 == 0x5F12, ""); -_Static_assert(MACRO01 == 0x5F13, ""); -_Static_assert(MACRO02 == 0x5F14, ""); -_Static_assert(MACRO03 == 0x5F15, ""); -_Static_assert(MACRO04 == 0x5F16, ""); -_Static_assert(MACRO05 == 0x5F17, ""); -_Static_assert(MACRO06 == 0x5F18, ""); -_Static_assert(MACRO07 == 0x5F19, ""); -_Static_assert(MACRO08 == 0x5F1A, ""); -_Static_assert(MACRO09 == 0x5F1B, ""); -_Static_assert(MACRO10 == 0x5F1C, ""); -_Static_assert(MACRO11 == 0x5F1D, ""); -_Static_assert(MACRO12 == 0x5F1E, ""); -_Static_assert(MACRO13 == 0x5F1F, ""); -_Static_assert(MACRO14 == 0x5F20, ""); -_Static_assert(MACRO15 == 0x5F21, ""); - -_Static_assert(USER00 == 0x5F80, ""); -_Static_assert(USER01 == 0x5F81, ""); -_Static_assert(USER02 == 0x5F82, ""); -_Static_assert(USER03 == 0x5F83, ""); -_Static_assert(USER04 == 0x5F84, ""); -_Static_assert(USER05 == 0x5F85, ""); -_Static_assert(USER06 == 0x5F86, ""); -_Static_assert(USER07 == 0x5F87, ""); -_Static_assert(USER08 == 0x5F88, ""); -_Static_assert(USER09 == 0x5F89, ""); -_Static_assert(USER10 == 0x5F8A, ""); -_Static_assert(USER11 == 0x5F8B, ""); -_Static_assert(USER12 == 0x5F8C, ""); -_Static_assert(USER13 == 0x5F8D, ""); -_Static_assert(USER14 == 0x5F8E, ""); -_Static_assert(USER15 == 0x5F8F, ""); - -#endif -- cgit 1.4.1 From 4d33f356a62c195f5498ed2fe8dd3ea434d5a689 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Sat, 5 Nov 2022 23:22:11 +1100 Subject: Macro keycode name refactoring (#18958) --- data/constants/keycodes/keycodes_0.0.1_macro.hjson | 162 ++++++++++++++++----- docs/ChangeLog/20211127.md | 10 +- docs/configurator_default_keymaps.md | 36 ++--- docs/feature_macros.md | 6 +- docs/zh-cn/configurator_default_keymaps.md | 36 ++--- .../pytest/macro/keymaps/default/keymap.json | 2 +- .../work_louder/work_board/keymaps/via/keymap.c | 2 +- lib/python/qmk/keymap.py | 2 +- lib/python/qmk/tests/test_cli_commands.py | 4 +- quantum/keycodes.h | 99 ++++++++----- 10 files changed, 243 insertions(+), 116 deletions(-) (limited to 'lib/python') diff --git a/data/constants/keycodes/keycodes_0.0.1_macro.hjson b/data/constants/keycodes/keycodes_0.0.1_macro.hjson index 70b9ecf154..409853fed9 100644 --- a/data/constants/keycodes/keycodes_0.0.1_macro.hjson +++ b/data/constants/keycodes/keycodes_0.0.1_macro.hjson @@ -3,131 +3,227 @@ "0x7700": { "group": "macro", - "key": "MACRO_0" + "key": "QK_MACRO_0", + "aliases": [ + "MC_0" + ] }, "0x7701": { "group": "macro", - "key": "MACRO_1" + "key": "QK_MACRO_1", + "aliases": [ + "MC_1" + ] }, "0x7702": { "group": "macro", - "key": "MACRO_2" + "key": "QK_MACRO_2", + "aliases": [ + "MC_2" + ] }, "0x7703": { "group": "macro", - "key": "MACRO_3" + "key": "QK_MACRO_3", + "aliases": [ + "MC_3" + ] }, "0x7704": { "group": "macro", - "key": "MACRO_4" + "key": "QK_MACRO_4", + "aliases": [ + "MC_4" + ] }, "0x7705": { "group": "macro", - "key": "MACRO_5" + "key": "QK_MACRO_5", + "aliases": [ + "MC_5" + ] }, "0x7706": { "group": "macro", - "key": "MACRO_6" + "key": "QK_MACRO_6", + "aliases": [ + "MC_6" + ] }, "0x7707": { "group": "macro", - "key": "MACRO_7" + "key": "QK_MACRO_7", + "aliases": [ + "MC_7" + ] }, "0x7708": { "group": "macro", - "key": "MACRO_8" + "key": "QK_MACRO_8", + "aliases": [ + "MC_8" + ] }, "0x7709": { "group": "macro", - "key": "MACRO_9" + "key": "QK_MACRO_9", + "aliases": [ + "MC_9" + ] }, "0x770A": { "group": "macro", - "key": "MACRO_10" + "key": "QK_MACRO_10", + "aliases": [ + "MC_10" + ] }, "0x770B": { "group": "macro", - "key": "MACRO_11" + "key": "QK_MACRO_11", + "aliases": [ + "MC_11" + ] }, "0x770C": { "group": "macro", - "key": "MACRO_12" + "key": "QK_MACRO_12", + "aliases": [ + "MC_12" + ] }, "0x770D": { "group": "macro", - "key": "MACRO_13" + "key": "QK_MACRO_13", + "aliases": [ + "MC_13" + ] }, "0x770E": { "group": "macro", - "key": "MACRO_14" + "key": "QK_MACRO_14", + "aliases": [ + "MC_14" + ] }, "0x770F": { "group": "macro", - "key": "MACRO_15" + "key": "QK_MACRO_15", + "aliases": [ + "MC_15" + ] }, "0x7710": { "group": "macro", - "key": "MACRO_16" + "key": "QK_MACRO_16", + "aliases": [ + "MC_16" + ] }, "0x7711": { "group": "macro", - "key": "MACRO_17" + "key": "QK_MACRO_17", + "aliases": [ + "MC_17" + ] }, "0x7712": { "group": "macro", - "key": "MACRO_18" + "key": "QK_MACRO_18", + "aliases": [ + "MC_18" + ] }, "0x7713": { "group": "macro", - "key": "MACRO_19" + "key": "QK_MACRO_19", + "aliases": [ + "MC_19" + ] }, "0x7714": { "group": "macro", - "key": "MACRO_20" + "key": "QK_MACRO_20", + "aliases": [ + "MC_20" + ] }, "0x7715": { "group": "macro", - "key": "MACRO_21" + "key": "QK_MACRO_21", + "aliases": [ + "MC_21" + ] }, "0x7716": { "group": "macro", - "key": "MACRO_22" + "key": "QK_MACRO_22", + "aliases": [ + "MC_22" + ] }, "0x7717": { "group": "macro", - "key": "MACRO_23" + "key": "QK_MACRO_23", + "aliases": [ + "MC_23" + ] }, "0x7718": { "group": "macro", - "key": "MACRO_24" + "key": "QK_MACRO_24", + "aliases": [ + "MC_24" + ] }, "0x7719": { "group": "macro", - "key": "MACRO_25" + "key": "QK_MACRO_25", + "aliases": [ + "MC_25" + ] }, "0x771A": { "group": "macro", - "key": "MACRO_26" + "key": "QK_MACRO_26", + "aliases": [ + "MC_26" + ] }, "0x771B": { "group": "macro", - "key": "MACRO_27" + "key": "QK_MACRO_27", + "aliases": [ + "MC_27" + ] }, "0x771C": { "group": "macro", - "key": "MACRO_28" + "key": "QK_MACRO_28", + "aliases": [ + "MC_28" + ] }, "0x771D": { "group": "macro", - "key": "MACRO_29" + "key": "QK_MACRO_29", + "aliases": [ + "MC_29" + ] }, "0x771E": { "group": "macro", - "key": "MACRO_30" + "key": "QK_MACRO_30", + "aliases": [ + "MC_30" + ] }, "0x771F": { "group": "macro", - "key": "MACRO_31" + "key": "QK_MACRO_31", + "aliases": [ + "MC_31" + ] } } -} \ No newline at end of file +} diff --git a/docs/ChangeLog/20211127.md b/docs/ChangeLog/20211127.md index d954bb9f61..0780ab6a44 100644 --- a/docs/ChangeLog/20211127.md +++ b/docs/ChangeLog/20211127.md @@ -56,19 +56,19 @@ You can now define up to 32 macros in your `keymap.json` file, as used by [QMK C "keyboard": "handwired/my_macropad", "keymap": "my_keymap", "macros": [ - [ // first listed is MACRO_0... + [ // first listed is QK_MACRO_0... {"action":"down", "keycodes": ["LSFT"]}, "hello world1", {"action": "up","keycodes": ["LSFT"]} ], - [ // ...then MACRO_1... + [ // ...then QK_MACRO_1... {"action":"tap", "keycodes": ["LCTL", "LALT", "DEL"]} ], - [ // ...then MACRO_2... + [ // ...then QK_MACRO_2... "ding!", {"action":"beep"} ], - [ // ...and MACRO_3. + [ // ...and QK_MACRO_3. {"action":"tap", "keycodes": ["F1"]}, {"action":"delay", "duration": "1000"}, {"action":"tap", "keycodes": ["PGDN"]} @@ -76,7 +76,7 @@ You can now define up to 32 macros in your `keymap.json` file, as used by [QMK C ], "layout": "LAYOUT_all", "layers": [ - ["MACRO_0", "MACRO_1", "MACRO_2", "MACRO_3"] + ["QK_MACRO_0", "QK_MACRO_1", "QK_MACRO_2", "QK_MACRO_3"] ] } ``` diff --git a/docs/configurator_default_keymaps.md b/docs/configurator_default_keymaps.md index 3fea15166a..d08ec29539 100644 --- a/docs/configurator_default_keymaps.md +++ b/docs/configurator_default_keymaps.md @@ -122,26 +122,26 @@ There is a way to support custom keycodes: if the logic for a custom keycode is ```c enum custom_keycodes { - MACRO_1 = SAFE_RANGE, - MACRO_2, - MACRO_3 + CUSTOM_1 = SAFE_RANGE, + CUSTOM_2, + CUSTOM_3 }; ... bool process_record_user(uint16_t keycode, keyrecord_t *record) { switch(keycode) { - case MACRO_1: + case CUSTOM_1: if (record->event.pressed) { - SEND_STRING("This is macro #1."); + SEND_STRING("This is custom keycode #1."); } return false; - case MACRO_2: + case CUSTOM_2: if (record->event.pressed) { - SEND_STRING("This is macro #2."); + SEND_STRING("This is custom keycode #2."); } return false; - case MACRO_3: + case CUSTOM_3: if (record->event.pressed) { - SEND_STRING("This is macro #3."); + SEND_STRING("This is custom keycode #3."); } return false; } @@ -153,9 +153,9 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { ```c enum keyboard_keycodes { - MACRO_1 = SAFE_RANGE, - MACRO_2, - MACRO_3, + CUSTOM_1 = SAFE_RANGE, + CUSTOM_2, + CUSTOM_3, NEW_SAFE_RANGE // Important! }; ``` @@ -165,19 +165,19 @@ enum keyboard_keycodes { ```c bool process_record_kb(uint16_t keycode, keyrecord_t *record) { switch(keycode) { - case MACRO_1: + case CUSTOM_1: if (record->event.pressed) { - SEND_STRING("This is macro #1."); + SEND_STRING("This is custom keycode #1."); } return false; - case MACRO_2: + case CUSTOM_2: if (record->event.pressed) { - SEND_STRING("This is macro #2."); + SEND_STRING("This is custom keycode #2."); } return false; - case MACRO_3: + case CUSTOM_3: if (record->event.pressed) { - SEND_STRING("This is macro #3."); + SEND_STRING("This is custom keycode #3."); } return false; } diff --git a/docs/feature_macros.md b/docs/feature_macros.md index 63b7223db9..08310555fb 100644 --- a/docs/feature_macros.md +++ b/docs/feature_macros.md @@ -33,7 +33,7 @@ You can define up to 32 macros in a `keymap.json` file, as used by [Configurator ], "layout": "LAYOUT_all", "layers": [ - ["MACRO_0", "MACRO_1", "MACRO_2", "MACRO_3"] + ["QK_MACRO_0", "QK_MACRO_1", "QK_MACRO_2", "QK_MACRO_3"] ] } ``` @@ -52,7 +52,7 @@ If you type in a language other than English, or use a non-QWERTY layout like Co ], "layout": "LAYOUT_all", "layers": [ - ["MACRO_0"] + ["QK_MACRO_0"] ] } ``` @@ -199,7 +199,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { #### Advanced Macros -In addition to the `process_record_user()` function, is the `post_process_record_user()` function. This runs after `process_record` and can be used to do things after a keystroke has been sent. This is useful if you want to have a key pressed before and released after a normal key, for instance. +In addition to the `process_record_user()` function, is the `post_process_record_user()` function. This runs after `process_record` and can be used to do things after a keystroke has been sent. This is useful if you want to have a key pressed before and released after a normal key, for instance. In this example, we modify most normal keypresses so that `F22` is pressed before the keystroke is normally sent, and release it __only after__ it's been released. diff --git a/docs/zh-cn/configurator_default_keymaps.md b/docs/zh-cn/configurator_default_keymaps.md index 82e4ca818d..c446a45714 100644 --- a/docs/zh-cn/configurator_default_keymaps.md +++ b/docs/zh-cn/configurator_default_keymaps.md @@ -127,26 +127,26 @@ enum layer_names { ```c enum custom_keycodes { - MACRO_1 = SAFE_RANGE, - MACRO_2, - MACRO_3 + CUSTOM_1 = SAFE_RANGE, + CUSTOM_2, + CUSTOM_3 }; ... bool process_record_user(uint16_t keycode, keyrecord_t *record) { switch(keycode) { - case MACRO_1: + case CUSTOM_1: if (record->event.pressed) { - SEND_STRING("This is macro #1."); + SEND_STRING("This is custom keycode #1."); } return false; - case MACRO_2: + case CUSTOM_2: if (record->event.pressed) { - SEND_STRING("This is macro #2."); + SEND_STRING("This is custom keycode #2."); } return false; - case MACRO_3: + case CUSTOM_3: if (record->event.pressed) { - SEND_STRING("This is macro #3."); + SEND_STRING("This is custom keycode #3."); } return false; } @@ -158,9 +158,9 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { ```c enum keyboard_keycodes { - MACRO_1 = SAFE_RANGE, - MACRO_2, - MACRO_3, + CUSTOM_1 = SAFE_RANGE, + CUSTOM_2, + CUSTOM_3, NEW_SAFE_RANGE // 重要! }; ``` @@ -170,19 +170,19 @@ enum keyboard_keycodes { ```c bool process_record_kb(uint16_t keycode, keyrecord_t *record) { switch(keycode) { - case MACRO_1: + case CUSTOM_1: if (record->event.pressed) { - SEND_STRING("This is macro #1."); + SEND_STRING("This is custom keycode #1."); } return false; - case MACRO_2: + case CUSTOM_2: if (record->event.pressed) { - SEND_STRING("This is macro #2."); + SEND_STRING("This is custom keycode #2."); } return false; - case MACRO_3: + case CUSTOM_3: if (record->event.pressed) { - SEND_STRING("This is macro #3."); + SEND_STRING("This is custom keycode #3."); } return false; } diff --git a/keyboards/handwired/pytest/macro/keymaps/default/keymap.json b/keyboards/handwired/pytest/macro/keymaps/default/keymap.json index f319d862d8..23c371aa34 100644 --- a/keyboards/handwired/pytest/macro/keymaps/default/keymap.json +++ b/keyboards/handwired/pytest/macro/keymaps/default/keymap.json @@ -2,7 +2,7 @@ "keyboard": "handwired/pytest/basic", "keymap": "default_json", "layout": "LAYOUT_ortho_1x1", - "layers": [["MACRO_0"]], + "layers": [["QK_MACRO_0"]], "macros": [ [ "Hello, World!", diff --git a/keyboards/work_louder/work_board/keymaps/via/keymap.c b/keyboards/work_louder/work_board/keymaps/via/keymap.c index d39c5f405d..0ffdd8b494 100644 --- a/keyboards/work_louder/work_board/keymaps/via/keymap.c +++ b/keyboards/work_louder/work_board/keymaps/via/keymap.c @@ -42,7 +42,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, _______, KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, S(KC_NUHS),S(KC_NUBS),KC_HOME, KC_END, _______, - _______, _______, _______, MACRO_1, _______, MACRO_0, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY + _______, _______, _______, MC_1, _______, MC_0, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY ), [_RAISE] = LAYOUT( KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, _______, diff --git a/lib/python/qmk/keymap.py b/lib/python/qmk/keymap.py index fc1421962f..315af35b73 100644 --- a/lib/python/qmk/keymap.py +++ b/lib/python/qmk/keymap.py @@ -266,7 +266,7 @@ def generate_c(keymap_json): new_macro = "".join(macro) new_macro = new_macro.replace('""', '') - macro_txt.append(f' case MACRO_{i}:') + macro_txt.append(f' case QK_MACRO_{i}:') macro_txt.append(f' SEND_STRING({new_macro});') macro_txt.append(' return false;') diff --git a/lib/python/qmk/tests/test_cli_commands.py b/lib/python/qmk/tests/test_cli_commands.py index 9bfc5a0a79..e598b281a6 100644 --- a/lib/python/qmk/tests/test_cli_commands.py +++ b/lib/python/qmk/tests/test_cli_commands.py @@ -150,8 +150,8 @@ def test_json2c(): def test_json2c_macros(): result = check_subcommand("json2c", 'keyboards/handwired/pytest/macro/keymaps/default/keymap.json') check_returncode(result) - assert 'LAYOUT_ortho_1x1(MACRO_0)' in result.stdout - assert 'case MACRO_0:' in result.stdout + assert 'LAYOUT_ortho_1x1(QK_MACRO_0)' in result.stdout + assert 'case QK_MACRO_0:' in result.stdout assert 'SEND_STRING("Hello, World!"SS_TAP(X_ENTER));' in result.stdout diff --git a/quantum/keycodes.h b/quantum/keycodes.h index 6772bb6a4a..e3c9321d16 100644 --- a/quantum/keycodes.h +++ b/quantum/keycodes.h @@ -582,38 +582,38 @@ enum qk_keycode_defines { QK_STENO_GEMINI = 0x74F1, QK_STENO_COMB = 0x74F2, QK_STENO_COMB_MAX = 0x74FC, - MACRO_0 = 0x7700, - MACRO_1 = 0x7701, - MACRO_2 = 0x7702, - MACRO_3 = 0x7703, - MACRO_4 = 0x7704, - MACRO_5 = 0x7705, - MACRO_6 = 0x7706, - MACRO_7 = 0x7707, - MACRO_8 = 0x7708, - MACRO_9 = 0x7709, - MACRO_10 = 0x770A, - MACRO_11 = 0x770B, - MACRO_12 = 0x770C, - MACRO_13 = 0x770D, - MACRO_14 = 0x770E, - MACRO_15 = 0x770F, - MACRO_16 = 0x7710, - MACRO_17 = 0x7711, - MACRO_18 = 0x7712, - MACRO_19 = 0x7713, - MACRO_20 = 0x7714, - MACRO_21 = 0x7715, - MACRO_22 = 0x7716, - MACRO_23 = 0x7717, - MACRO_24 = 0x7718, - MACRO_25 = 0x7719, - MACRO_26 = 0x771A, - MACRO_27 = 0x771B, - MACRO_28 = 0x771C, - MACRO_29 = 0x771D, - MACRO_30 = 0x771E, - MACRO_31 = 0x771F, + QK_MACRO_0 = 0x7700, + QK_MACRO_1 = 0x7701, + QK_MACRO_2 = 0x7702, + QK_MACRO_3 = 0x7703, + QK_MACRO_4 = 0x7704, + QK_MACRO_5 = 0x7705, + QK_MACRO_6 = 0x7706, + QK_MACRO_7 = 0x7707, + QK_MACRO_8 = 0x7708, + QK_MACRO_9 = 0x7709, + QK_MACRO_10 = 0x770A, + QK_MACRO_11 = 0x770B, + QK_MACRO_12 = 0x770C, + QK_MACRO_13 = 0x770D, + QK_MACRO_14 = 0x770E, + QK_MACRO_15 = 0x770F, + QK_MACRO_16 = 0x7710, + QK_MACRO_17 = 0x7711, + QK_MACRO_18 = 0x7712, + QK_MACRO_19 = 0x7713, + QK_MACRO_20 = 0x7714, + QK_MACRO_21 = 0x7715, + QK_MACRO_22 = 0x7716, + QK_MACRO_23 = 0x7717, + QK_MACRO_24 = 0x7718, + QK_MACRO_25 = 0x7719, + QK_MACRO_26 = 0x771A, + QK_MACRO_27 = 0x771B, + QK_MACRO_28 = 0x771C, + QK_MACRO_29 = 0x771D, + QK_MACRO_30 = 0x771E, + QK_MACRO_31 = 0x771F, BL_ON = 0x7800, BL_OFF = 0x7801, BL_DEC = 0x7802, @@ -1000,6 +1000,38 @@ enum qk_keycode_defines { CK_UP = CLICKY_UP, CK_DOWN = CLICKY_DOWN, CK_RST = CLICKY_RESET, + MC_0 = QK_MACRO_0, + MC_1 = QK_MACRO_1, + MC_2 = QK_MACRO_2, + MC_3 = QK_MACRO_3, + MC_4 = QK_MACRO_4, + MC_5 = QK_MACRO_5, + MC_6 = QK_MACRO_6, + MC_7 = QK_MACRO_7, + MC_8 = QK_MACRO_8, + MC_9 = QK_MACRO_9, + MC_10 = QK_MACRO_10, + MC_11 = QK_MACRO_11, + MC_12 = QK_MACRO_12, + MC_13 = QK_MACRO_13, + MC_14 = QK_MACRO_14, + MC_15 = QK_MACRO_15, + MC_16 = QK_MACRO_16, + MC_17 = QK_MACRO_17, + MC_18 = QK_MACRO_18, + MC_19 = QK_MACRO_19, + MC_20 = QK_MACRO_20, + MC_21 = QK_MACRO_21, + MC_22 = QK_MACRO_22, + MC_23 = QK_MACRO_23, + MC_24 = QK_MACRO_24, + MC_25 = QK_MACRO_25, + MC_26 = QK_MACRO_26, + MC_27 = QK_MACRO_27, + MC_28 = QK_MACRO_28, + MC_29 = QK_MACRO_29, + MC_30 = QK_MACRO_30, + MC_31 = QK_MACRO_31, RGB_MOD = RGB_MODE_FORWARD, RGB_RMOD = RGB_MODE_REVERSE, RGB_M_P = RGB_MODE_PLAIN, @@ -1108,8 +1140,7 @@ enum qk_keycode_defines { #define IS_PROGRAMMABLE_BUTTON_KEYCODE(code) ((code) >= QK_PROGRAMMABLE_BUTTON_1 && (code) <= QK_PROGRAMMABLE_BUTTON_32) #define IS_AUDIO_KEYCODE(code) ((code) >= AU_ON && (code) <= MUV_DE) #define IS_STENO_KEYCODE(code) ((code) >= QK_STENO_BOLT && (code) <= QK_STENO_COMB_MAX) -#define IS_MACRO_KEYCODE(code) ((code) >= MACRO_0 && (code) <= MACRO_31) +#define IS_MACRO_KEYCODE(code) ((code) >= QK_MACRO_0 && (code) <= QK_MACRO_31) #define IS_BACKLIGHT_KEYCODE(code) ((code) >= BL_ON && (code) <= BL_BRTG) #define IS_RGB_KEYCODE(code) ((code) >= RGB_TOG && (code) <= RGB_MODE_TWINKLE) #define IS_QUANTUM_KEYCODE(code) ((code) >= QK_BOOTLOADER && (code) <= QK_AUTOCORRECT_TOGGLE) - -- cgit 1.4.1 From 479d8de622674b6667295bda344145a69aa042bd Mon Sep 17 00:00:00 2001 From: Ryan Date: Tue, 8 Nov 2022 12:05:08 +1100 Subject: Format DD mappings and schemas (#18924) --- data/mappings/defaults.hjson | 77 ++ data/mappings/defaults.json | 77 -- data/mappings/info_config.hjson | 130 ++++ data/mappings/info_config.json | 130 ---- data/mappings/info_rules.hjson | 44 ++ data/mappings/info_rules.json | 44 -- data/mappings/keyboard_aliases.hjson | 1252 ++++++++++++++++++++++++++++++ data/mappings/keyboard_aliases.json | 1285 ------------------------------- data/schemas/keyboard.jsonschema | 5 +- docs/data_driven_config.md | 2 +- lib/python/qmk/cli/generate/api.py | 2 +- lib/python/qmk/cli/generate/config_h.py | 2 +- lib/python/qmk/cli/generate/rules_mk.py | 2 +- lib/python/qmk/cli/new/keyboard.py | 2 +- lib/python/qmk/commands.py | 2 +- lib/python/qmk/info.py | 6 +- lib/python/qmk/keyboard.py | 2 +- 17 files changed, 1517 insertions(+), 1547 deletions(-) create mode 100644 data/mappings/defaults.hjson delete mode 100644 data/mappings/defaults.json create mode 100644 data/mappings/info_config.hjson delete mode 100644 data/mappings/info_config.json create mode 100644 data/mappings/info_rules.hjson delete mode 100644 data/mappings/info_rules.json create mode 100644 data/mappings/keyboard_aliases.hjson delete mode 100644 data/mappings/keyboard_aliases.json (limited to 'lib/python') diff --git a/data/mappings/defaults.hjson b/data/mappings/defaults.hjson new file mode 100644 index 0000000000..ea9f6972c5 --- /dev/null +++ b/data/mappings/defaults.hjson @@ -0,0 +1,77 @@ +{ + "development_board": { + "promicro": { + "processor": "atmega32u4", + "bootloader": "caterina", + "pin_compatible": "promicro" + }, + "elite_c": { + "processor": "atmega32u4", + "bootloader": "atmel-dfu", + "pin_compatible": "promicro" + }, + "elite_pi": { + "processor": "RP2040", + "bootloader": "rp2040", + "board": "QMK_PM2040", + "pin_compatible": "promicro" + }, + "proton_c": { + "processor": "STM32F303", + "bootloader": "stm32-dfu", + "board": "QMK_PROTON_C", + "pin_compatible": "promicro" + }, + "kb2040": { + "processor": "RP2040", + "bootloader": "rp2040", + "board": "QMK_PM2040", + "pin_compatible": "promicro" + }, + "promicro_rp2040": { + "processor": "RP2040", + "bootloader": "rp2040", + "board": "QMK_PM2040", + "pin_compatible": "promicro" + }, + "blok": { + "processor": "RP2040", + "bootloader": "rp2040", + "board": "QMK_PM2040", + "pin_compatible": "promicro" + }, + "bit_c_pro": { + "processor": "RP2040", + "bootloader": "rp2040", + "board": "QMK_PM2040", + "pin_compatible": "promicro" + }, + "bluepill": { + "processor": "STM32F103", + "bootloader": "stm32duino", + "board": "STM32_F103_STM32DUINO" + }, + "blackpill_f401": { + "processor": "STM32F401", + "bootloader": "stm32-dfu", + "board": "BLACKPILL_STM32_F401" + }, + "blackpill_f411": { + "processor": "STM32F411", + "bootloader": "stm32-dfu", + "board": "BLACKPILL_STM32_F411" + }, + "stemcell": { + "processor": "STM32F411", + "bootloader": "tinyuf2", + "board": "STEMCELL", + "pin_compatible": "promicro" + }, + "bonsai_c4": { + "processor": "STM32F411", + "bootloader": "stm32-dfu", + "board": "GENERIC_STM32_F411XE", + "pin_compatible": "promicro" + } + } +} diff --git a/data/mappings/defaults.json b/data/mappings/defaults.json deleted file mode 100644 index ea9f6972c5..0000000000 --- a/data/mappings/defaults.json +++ /dev/null @@ -1,77 +0,0 @@ -{ - "development_board": { - "promicro": { - "processor": "atmega32u4", - "bootloader": "caterina", - "pin_compatible": "promicro" - }, - "elite_c": { - "processor": "atmega32u4", - "bootloader": "atmel-dfu", - "pin_compatible": "promicro" - }, - "elite_pi": { - "processor": "RP2040", - "bootloader": "rp2040", - "board": "QMK_PM2040", - "pin_compatible": "promicro" - }, - "proton_c": { - "processor": "STM32F303", - "bootloader": "stm32-dfu", - "board": "QMK_PROTON_C", - "pin_compatible": "promicro" - }, - "kb2040": { - "processor": "RP2040", - "bootloader": "rp2040", - "board": "QMK_PM2040", - "pin_compatible": "promicro" - }, - "promicro_rp2040": { - "processor": "RP2040", - "bootloader": "rp2040", - "board": "QMK_PM2040", - "pin_compatible": "promicro" - }, - "blok": { - "processor": "RP2040", - "bootloader": "rp2040", - "board": "QMK_PM2040", - "pin_compatible": "promicro" - }, - "bit_c_pro": { - "processor": "RP2040", - "bootloader": "rp2040", - "board": "QMK_PM2040", - "pin_compatible": "promicro" - }, - "bluepill": { - "processor": "STM32F103", - "bootloader": "stm32duino", - "board": "STM32_F103_STM32DUINO" - }, - "blackpill_f401": { - "processor": "STM32F401", - "bootloader": "stm32-dfu", - "board": "BLACKPILL_STM32_F401" - }, - "blackpill_f411": { - "processor": "STM32F411", - "bootloader": "stm32-dfu", - "board": "BLACKPILL_STM32_F411" - }, - "stemcell": { - "processor": "STM32F411", - "bootloader": "tinyuf2", - "board": "STEMCELL", - "pin_compatible": "promicro" - }, - "bonsai_c4": { - "processor": "STM32F411", - "bootloader": "stm32-dfu", - "board": "GENERIC_STM32_F411XE", - "pin_compatible": "promicro" - } - } -} diff --git a/data/mappings/info_config.hjson b/data/mappings/info_config.hjson new file mode 100644 index 0000000000..a013e98b34 --- /dev/null +++ b/data/mappings/info_config.hjson @@ -0,0 +1,130 @@ +// This file maps keys between `config.h` and `info.json`. It is used by QMK +// to correctly and consistently map back and forth between the two systems. +{ + // Format: + // : {"info_key": , ["value_type": ], ["to_json": ], ["to_c": ]} + // value_type: one of "array", "array.int", "bool", "int", "hex", "list", "mapping", "str", "raw" + // to_json: Default `true`. Set to `false` to exclude this mapping from info.json + // to_c: Default `true`. Set to `false` to exclude this mapping from config.h + // warn_duplicate: Default `true`. Set to `false` to turn off warning when a value exists in both places + // deprecated: Default `false`. Set to `true` to turn on warning when a value exists + // invalid: Default `false`. Set to `true` to generate errors when a value exists + // replace_with: use with a key marked deprecated or invalid to designate a replacement + "AUDIO_VOICES": {"info_key": "audio.voices", "value_type": "bool"}, + "BACKLIGHT_BREATHING": {"info_key": "backlight.breathing", "value_type": "bool"}, + "BREATHING_PERIOD": {"info_key": "backlight.breathing_period", "value_type": "int"}, + "BACKLIGHT_LEVELS": {"info_key": "backlight.levels", "value_type": "int"}, + "BACKLIGHT_ON_STATE": {"info_key": "backlight.on_state", "value_type": "int"}, + "BACKLIGHT_PIN": {"info_key": "backlight.pin"}, + "BOTH_SHIFTS_TURNS_ON_CAPS_WORD": {"info_key": "caps_word.both_shifts_turns_on", "value_type": "bool"}, + "CAPS_WORD_IDLE_TIMEOUT": {"info_key": "caps_word.idle_timeout", "value_type": "int"}, + "COMBO_COUNT": {"info_key": "combo.count", "value_type": "int"}, + "COMBO_TERM": {"info_key": "combo.term", "value_type": "int"}, + "DEBOUNCE": {"info_key": "debounce", "value_type": "int"}, + "DEVICE_VER": {"info_key": "usb.device_version", "value_type": "bcd_version"}, + "DIODE_DIRECTION": {"info_key": "diode_direction"}, + "DOUBLE_TAP_SHIFT_TURNS_ON_CAPS_WORD": {"info_key": "caps_word.double_tap_shift_turns_on", "value_type": "bool"}, + "FORCE_NKRO": {"info_key": "usb.force_nkro", "value_type": "bool"}, + "DYNAMIC_KEYMAP_EEPROM_MAX_ADDR": {"info_key": "dynamic_keymap.eeprom_max_addr", "value_type": "int"}, + "DYNAMIC_KEYMAP_LAYER_COUNT": {"info_key": "dynamic_keymap.layer_count", "value_type": "int"}, + "IGNORE_MOD_TAP_INTERRUPT": {"info_key": "tapping.ignore_mod_tap_interrupt", "value_type": "bool"}, + "IGNORE_MOD_TAP_INTERRUPT_PER_KEY": {"info_key": "tapping.ignore_mod_tap_interrupt_per_key", "value_type": "bool"}, + "HOLD_ON_OTHER_KEY_PRESS": {"info_key": "tapping.hold_on_other_key_press", "value_type": "bool"}, + "HOLD_ON_OTHER_KEY_PRESS_PER_KEY": {"info_key": "tapping.hold_on_other_key_press_per_key", "value_type": "bool"}, + "LAYOUTS": {"info_key": "layout_aliases", "value_type": "mapping"}, + "LEADER_PER_KEY_TIMING": {"info_key": "leader_key.timing", "value_type": "bool"}, + "LEADER_KEY_STRICT_KEY_PROCESSING": {"info_key": "leader_key.strict_processing", "value_type": "bool"}, + "LEADER_TIMEOUT": {"info_key": "leader_key.timeout", "value_type": "int"}, + "LED_CAPS_LOCK_PIN": {"info_key": "indicators.caps_lock"}, + "LED_NUM_LOCK_PIN": {"info_key": "indicators.num_lock"}, + "LED_SCROLL_LOCK_PIN": {"info_key": "indicators.scroll_lock"}, + "LED_COMPOSE_PIN": {"info_key": "indicators.compose"}, + "LED_KANA_PIN": {"info_key": "indicators.kana"}, + "LED_PIN_ON_STATE": {"info_key": "indicators.on_state", "value_type": "int"}, + "LED_MATRIX_CENTER": {"info_key": "led_matrix.center_point", "value_type": "array.int"}, + "LED_MATRIX_MAXIMUM_BRIGHTNESS": {"info_key": "led_matrix.max_brightness", "value_type": "int"}, + "LED_MATRIX_SPLIT": {"info_key": "led_matrix.split_count", "value_type": "array.int"}, + "LED_MATRIX_TIMEOUT": {"info_key": "led_matrix.timeout", "value_type": "int"}, + "LED_MATRIX_HUE_STEP": {"info_key": "led_matrix.hue_steps", "value_type": "int"}, + "LED_MATRIX_SAT_STEP": {"info_key": "led_matrix.sat_steps", "value_type": "int"}, + "LED_MATRIX_VAL_STEP": {"info_key": "led_matrix.val_steps", "value_type": "int"}, + "LED_MATRIX_SPD_STEP": {"info_key": "led_matrix.speed_steps", "value_type": "int"}, + "MANUFACTURER": {"info_key": "manufacturer", "value_type": "str"}, + "MATRIX_HAS_GHOST": {"info_key": "matrix_pins.ghost", "value_type": "bool"}, + "MATRIX_IO_DELAY": {"info_key": "matrix_pins.io_delay", "value_type": "int"}, + "MOUSEKEY_DELAY": {"info_key": "mousekey.delay", "value_type": "int"}, + "MOUSEKEY_INTERVAL": {"info_key": "mousekey.interval", "value_type": "int"}, + "MOUSEKEY_MAX_SPEED": {"info_key": "mousekey.max_speed", "value_type": "int"}, + "MOUSEKEY_TIME_TO_MAX": {"info_key": "mousekey.time_to_max", "value_type": "int"}, + "MOUSEKEY_WHEEL_DELAY": {"info_key": "mousekey.wheel_delay", "value_type": "int"}, + "ONESHOT_TIMEOUT": {"info_key": "oneshot.timeout", "value_type": "int"}, + "ONESHOT_TAP_TOGGLE": {"info_key": "oneshot.tap_toggle", "value_type": "int"}, + "PERMISSIVE_HOLD": {"info_key": "tapping.permissive_hold", "value_type": "bool"}, + "PERMISSIVE_HOLD_PER_KEY": {"info_key": "tapping.permissive_hold_per_key", "value_type": "bool"}, + "PS2_CLOCK_PIN": {"info_key": "ps2.clock_pin"}, + "PS2_DATA_PIN": {"info_key": "ps2.data_pin"}, + "RETRO_TAPPING": {"info_key": "tapping.retro", "value_type": "bool"}, + "RETRO_TAPPING_PER_KEY": {"info_key": "tapping.retro_per_key", "value_type": "bool"}, + "RGB_DI_PIN": {"info_key": "rgblight.pin"}, + "RGBLED_NUM": {"info_key": "rgblight.led_count", "value_type": "int"}, + "RGBLED_SPLIT": {"info_key": "rgblight.split_count", "value_type": "array.int"}, + "RGBLIGHT_LAYER_BLINK": {"info_key": "rgblight.layers.blink", "value_type": "bool"}, + "RGBLIGHT_LAYERS": {"info_key": "rgblight.layers.enabled", "value_type": "bool"}, + "RGBLIGHT_LAYERS_OVERRIDE_RGB_OFF": {"info_key": "rgblight.layers.override_rgb", "value_type": "bool"}, + "RGBLIGHT_LIMIT_VAL": {"info_key": "rgblight.max_brightness", "value_type": "int"}, + "RGBLIGHT_MAX_LAYERS": {"info_key": "rgblight.layers.max", "value_type": "int"}, + "RGBLIGHT_HUE_STEP": {"info_key": "rgblight.hue_steps", "value_type": "int"}, + "RGBLIGHT_SAT_STEP": {"info_key": "rgblight.saturation_steps", "value_type": "int"}, + "RGBLIGHT_VAL_STEP": {"info_key": "rgblight.brightness_steps", "value_type": "int"}, + "RGBLIGHT_SLEEP": {"info_key": "rgblight.sleep", "value_type": "bool"}, + "RGBLIGHT_SPLIT": {"info_key": "rgblight.split", "value_type": "bool"}, + "RGB_MATRIX_CENTER": {"info_key": "rgb_matrix.center_point", "value_type": "array.int"}, + "RGB_MATRIX_MAXIMUM_BRIGHTNESS": {"info_key": "rgb_matrix.max_brightness", "value_type": "int"}, + "RGB_MATRIX_SPLIT": {"info_key": "rgb_matrix.split_count", "value_type": "array.int"}, + "RGB_MATRIX_TIMEOUT": {"info_key": "rgb_matrix.timeout", "value_type": "int"}, + "RGB_MATRIX_HUE_STEP": {"info_key": "rgb_matrix.hue_steps", "value_type": "int"}, + "RGB_MATRIX_SAT_STEP": {"info_key": "rgb_matrix.sat_steps", "value_type": "int"}, + "RGB_MATRIX_VAL_STEP": {"info_key": "rgb_matrix.val_steps", "value_type": "int"}, + "RGB_MATRIX_SPD_STEP": {"info_key": "rgb_matrix.speed_steps", "value_type": "int"}, + "RGBW": {"info_key": "rgblight.rgbw", "value_type": "bool"}, + "PRODUCT": {"info_key": "keyboard_name", "warn_duplicate": false, "value_type": "str"}, + "PRODUCT_ID": {"info_key": "usb.pid", "value_type": "hex"}, + "VENDOR_ID": {"info_key": "usb.vid", "value_type": "hex"}, + "QMK_ESC_OUTPUT": {"info_key": "qmk_lufa_bootloader.esc_output"}, + "QMK_ESC_INPUT": {"info_key": "qmk_lufa_bootloader.esc_input"}, + "QMK_LED": {"info_key": "qmk_lufa_bootloader.led"}, + "QMK_SPEAKER": {"info_key": "qmk_lufa_bootloader.speaker"}, + "SECURE_UNLOCK_SEQUENCE": {"info_key": "secure.unlock_sequence", "value_type": "array.array.int", "to_json": false}, + "SECURE_UNLOCK_TIMEOUT": {"info_key": "secure.unlock_timeout", "value_type": "int"}, + "SECURE_IDLE_TIMEOUT": {"info_key": "secure.idle_timeout", "value_type": "int"}, + "SENDSTRING_BELL": {"info_key": "audio.macro_beep", "value_type": "bool"}, + "SPLIT_MODS_ENABLE": {"info_key": "split.transport.sync_modifiers", "value_type": "bool"}, + "SPLIT_TRANSPORT_MIRROR": {"info_key": "split.transport.sync_matrix_state", "value_type": "bool"}, + "SPLIT_USB_DETECT": {"info_key": "split.usb_detect.enabled", "value_type": "bool"}, + "SPLIT_USB_TIMEOUT": {"info_key": "split.usb_detect.timeout", "value_type": "int"}, + "SPLIT_USB_TIMEOUT_POLL": {"info_key": "split.usb_detect.polling_interval", "value_type": "int"}, + "SPLIT_WATCHDOG_ENABLE": {"info_key": "split.transport.watchdog", "value_type": "bool"}, + "SPLIT_WATCHDOG_TIMEOUT": {"info_key": "split.transport.watchdog_timeout", "value_type": "int"}, + "SOFT_SERIAL_PIN": {"info_key": "split.soft_serial_pin"}, + "SOFT_SERIAL_SPEED": {"info_key": "split.soft_serial_speed"}, + "TAP_CODE_DELAY": {"info_key": "qmk.tap_keycode_delay", "value_type": "int"}, + "TAP_HOLD_CAPS_DELAY": {"info_key": "qmk.tap_capslock_delay", "value_type": "int"}, + "TAPPING_FORCE_HOLD": {"info_key": "tapping.force_hold", "value_type": "bool"}, + "TAPPING_FORCE_HOLD_PER_KEY": {"info_key": "tapping.force_hold_per_key", "value_type": "bool"}, + "TAPPING_TERM": {"info_key": "tapping.term", "value_type": "int"}, + "TAPPING_TERM_PER_KEY": {"info_key": "tapping.term_per_key", "value_type": "bool"}, + "TAPPING_TOGGLE": {"info_key": "tapping.toggle", "value_type": "int"}, + "USB_MAX_POWER_CONSUMPTION": {"info_key": "usb.max_power", "value_type": "int"}, + "USB_POLLING_INTERVAL_MS": {"info_key": "usb.polling_interval", "value_type": "int"}, + "USB_SUSPEND_WAKEUP_DELAY": {"info_key": "usb.suspend_wakeup_delay", "value_type": "int"}, + + // Items we want flagged in lint + "NO_ACTION_MACRO": {"info_key": "_invalid.no_action_macro", "invalid": true}, + "NO_ACTION_FUNCTION": {"info_key": "_invalid.no_action_function", "invalid": true}, + "DESCRIPTION": {"info_key": "_invalid.usb_description", "invalid": true}, + "DEBOUNCING_DELAY": {"info_key": "_invalid.debouncing_delay", "invalid": true, "replace_with": "DEBOUNCE"}, + "PREVENT_STUCK_MODIFIERS": {"info_key": "_invalid.prevent_stuck_mods", "invalid": true}, + "UNUSED_PINS": {"info_key": "_invalid.unused_pins", "deprecated": true}, + "RGBLIGHT_ANIMATIONS": {"info_key": "rgblight.animations.all", "value_type": "bool", "deprecated": true}, + "QMK_KEYS_PER_SCAN": {"info_key": "qmk.keys_per_scan", "value_type": "int", "deprecated": true} +} diff --git a/data/mappings/info_config.json b/data/mappings/info_config.json deleted file mode 100644 index 01f39540d0..0000000000 --- a/data/mappings/info_config.json +++ /dev/null @@ -1,130 +0,0 @@ -# This file maps keys between `config.h` and `info.json`. It is used by QMK -# to correctly and consistently map back and forth between the two systems. -{ - # Format: - # : {"info_key": , ["value_type": ], ["to_json": ], ["to_c": ]} - # value_type: one of "array", "array.int", "bool", "int", "hex", "list", "mapping", "str", "raw" - # to_json: Default `true`. Set to `false` to exclude this mapping from info.json - # to_c: Default `true`. Set to `false` to exclude this mapping from config.h - # warn_duplicate: Default `true`. Set to `false` to turn off warning when a value exists in both places - # deprecated: Default `false`. Set to `true` to turn on warning when a value exists - # invalid: Default `false`. Set to `true` to generate errors when a value exists - # replace_with: use with a key marked deprecated or invalid to designate a replacement - "AUDIO_VOICES": {"info_key": "audio.voices", "value_type": "bool"}, - "BACKLIGHT_BREATHING": {"info_key": "backlight.breathing", "value_type": "bool"}, - "BREATHING_PERIOD": {"info_key": "backlight.breathing_period", "value_type": "int"}, - "BACKLIGHT_LEVELS": {"info_key": "backlight.levels", "value_type": "int"}, - "BACKLIGHT_ON_STATE": {"info_key": "backlight.on_state", "value_type": "int"}, - "BACKLIGHT_PIN": {"info_key": "backlight.pin"}, - "BOTH_SHIFTS_TURNS_ON_CAPS_WORD": {"info_key": "caps_word.both_shifts_turns_on", "value_type": "bool"}, - "CAPS_WORD_IDLE_TIMEOUT": {"info_key": "caps_word.idle_timeout", "value_type": "int"}, - "COMBO_COUNT": {"info_key": "combo.count", "value_type": "int"}, - "COMBO_TERM": {"info_key": "combo.term", "value_type": "int"}, - "DEBOUNCE": {"info_key": "debounce", "value_type": "int"}, - "DEVICE_VER": {"info_key": "usb.device_version", "value_type": "bcd_version"}, - "DIODE_DIRECTION": {"info_key": "diode_direction"}, - "DOUBLE_TAP_SHIFT_TURNS_ON_CAPS_WORD": {"info_key": "caps_word.double_tap_shift_turns_on", "value_type": "bool"}, - "FORCE_NKRO": {"info_key": "usb.force_nkro", "value_type": "bool"}, - "DYNAMIC_KEYMAP_EEPROM_MAX_ADDR": {"info_key": "dynamic_keymap.eeprom_max_addr", "value_type": "int"}, - "DYNAMIC_KEYMAP_LAYER_COUNT": {"info_key": "dynamic_keymap.layer_count", "value_type": "int"}, - "IGNORE_MOD_TAP_INTERRUPT": {"info_key": "tapping.ignore_mod_tap_interrupt", "value_type": "bool"}, - "IGNORE_MOD_TAP_INTERRUPT_PER_KEY": {"info_key": "tapping.ignore_mod_tap_interrupt_per_key", "value_type": "bool"}, - "HOLD_ON_OTHER_KEY_PRESS": {"info_key": "tapping.hold_on_other_key_press", "value_type": "bool"}, - "HOLD_ON_OTHER_KEY_PRESS_PER_KEY": {"info_key": "tapping.hold_on_other_key_press_per_key", "value_type": "bool"}, - "LAYOUTS": {"info_key": "layout_aliases", "value_type": "mapping"}, - "LEADER_PER_KEY_TIMING": {"info_key": "leader_key.timing", "value_type": "bool"}, - "LEADER_KEY_STRICT_KEY_PROCESSING": {"info_key": "leader_key.strict_processing", "value_type": "bool"}, - "LEADER_TIMEOUT": {"info_key": "leader_key.timeout", "value_type": "int"}, - "LED_CAPS_LOCK_PIN": {"info_key": "indicators.caps_lock"}, - "LED_NUM_LOCK_PIN": {"info_key": "indicators.num_lock"}, - "LED_SCROLL_LOCK_PIN": {"info_key": "indicators.scroll_lock"}, - "LED_COMPOSE_PIN": {"info_key": "indicators.compose"}, - "LED_KANA_PIN": {"info_key": "indicators.kana"}, - "LED_PIN_ON_STATE": {"info_key": "indicators.on_state", "value_type": "int"}, - "LED_MATRIX_CENTER": {"info_key": "led_matrix.center_point", "value_type": "array.int"}, - "LED_MATRIX_MAXIMUM_BRIGHTNESS": {"info_key": "led_matrix.max_brightness", "value_type": "int"}, - "LED_MATRIX_SPLIT": {"info_key": "led_matrix.split_count", "value_type": "array.int"}, - "LED_MATRIX_TIMEOUT": {"info_key": "led_matrix.timeout", "value_type": "int"}, - "LED_MATRIX_HUE_STEP": {"info_key": "led_matrix.hue_steps", "value_type": "int"}, - "LED_MATRIX_SAT_STEP": {"info_key": "led_matrix.sat_steps", "value_type": "int"}, - "LED_MATRIX_VAL_STEP": {"info_key": "led_matrix.val_steps", "value_type": "int"}, - "LED_MATRIX_SPD_STEP": {"info_key": "led_matrix.speed_steps", "value_type": "int"}, - "MANUFACTURER": {"info_key": "manufacturer", "value_type": "str"}, - "MATRIX_HAS_GHOST": {"info_key": "matrix_pins.ghost", "value_type": "bool"}, - "MATRIX_IO_DELAY": {"info_key": "matrix_pins.io_delay", "value_type": "int"}, - "MOUSEKEY_DELAY": {"info_key": "mousekey.delay", "value_type": "int"}, - "MOUSEKEY_INTERVAL": {"info_key": "mousekey.interval", "value_type": "int"}, - "MOUSEKEY_MAX_SPEED": {"info_key": "mousekey.max_speed", "value_type": "int"}, - "MOUSEKEY_TIME_TO_MAX": {"info_key": "mousekey.time_to_max", "value_type": "int"}, - "MOUSEKEY_WHEEL_DELAY": {"info_key": "mousekey.wheel_delay", "value_type": "int"}, - "ONESHOT_TIMEOUT": {"info_key": "oneshot.timeout", "value_type": "int"}, - "ONESHOT_TAP_TOGGLE": {"info_key": "oneshot.tap_toggle", "value_type": "int"}, - "PERMISSIVE_HOLD": {"info_key": "tapping.permissive_hold", "value_type": "bool"}, - "PERMISSIVE_HOLD_PER_KEY": {"info_key": "tapping.permissive_hold_per_key", "value_type": "bool"}, - "PS2_CLOCK_PIN": {"info_key": "ps2.clock_pin"}, - "PS2_DATA_PIN": {"info_key": "ps2.data_pin"}, - "RETRO_TAPPING": {"info_key": "tapping.retro", "value_type": "bool"}, - "RETRO_TAPPING_PER_KEY": {"info_key": "tapping.retro_per_key", "value_type": "bool"}, - "RGB_DI_PIN": {"info_key": "rgblight.pin"}, - "RGBLED_NUM": {"info_key": "rgblight.led_count", "value_type": "int"}, - "RGBLED_SPLIT": {"info_key": "rgblight.split_count", "value_type": "array.int"}, - "RGBLIGHT_LAYER_BLINK": {"info_key": "rgblight.layers.blink", "value_type": "bool"}, - "RGBLIGHT_LAYERS": {"info_key": "rgblight.layers.enabled", "value_type": "bool"}, - "RGBLIGHT_LAYERS_OVERRIDE_RGB_OFF": {"info_key": "rgblight.layers.override_rgb", "value_type": "bool"}, - "RGBLIGHT_LIMIT_VAL": {"info_key": "rgblight.max_brightness", "value_type": "int"}, - "RGBLIGHT_MAX_LAYERS": {"info_key": "rgblight.layers.max", "value_type": "int"}, - "RGBLIGHT_HUE_STEP": {"info_key": "rgblight.hue_steps", "value_type": "int"}, - "RGBLIGHT_SAT_STEP": {"info_key": "rgblight.saturation_steps", "value_type": "int"}, - "RGBLIGHT_VAL_STEP": {"info_key": "rgblight.brightness_steps", "value_type": "int"}, - "RGBLIGHT_SLEEP": {"info_key": "rgblight.sleep", "value_type": "bool"}, - "RGBLIGHT_SPLIT": {"info_key": "rgblight.split", "value_type": "bool"}, - "RGB_MATRIX_CENTER": {"info_key": "rgb_matrix.center_point", "value_type": "array.int"}, - "RGB_MATRIX_MAXIMUM_BRIGHTNESS": {"info_key": "rgb_matrix.max_brightness", "value_type": "int"}, - "RGB_MATRIX_SPLIT": {"info_key": "rgb_matrix.split_count", "value_type": "array.int"}, - "RGB_MATRIX_TIMEOUT": {"info_key": "rgb_matrix.timeout", "value_type": "int"}, - "RGB_MATRIX_HUE_STEP": {"info_key": "rgb_matrix.hue_steps", "value_type": "int"}, - "RGB_MATRIX_SAT_STEP": {"info_key": "rgb_matrix.sat_steps", "value_type": "int"}, - "RGB_MATRIX_VAL_STEP": {"info_key": "rgb_matrix.val_steps", "value_type": "int"}, - "RGB_MATRIX_SPD_STEP": {"info_key": "rgb_matrix.speed_steps", "value_type": "int"}, - "RGBW": {"info_key": "rgblight.rgbw", "value_type": "bool"}, - "PRODUCT": {"info_key": "keyboard_name", "warn_duplicate": false, "value_type": "str"}, - "PRODUCT_ID": {"info_key": "usb.pid", "value_type": "hex"}, - "VENDOR_ID": {"info_key": "usb.vid", "value_type": "hex"}, - "QMK_ESC_OUTPUT": {"info_key": "qmk_lufa_bootloader.esc_output"}, - "QMK_ESC_INPUT": {"info_key": "qmk_lufa_bootloader.esc_input"}, - "QMK_LED": {"info_key": "qmk_lufa_bootloader.led"}, - "QMK_SPEAKER": {"info_key": "qmk_lufa_bootloader.speaker"}, - "SECURE_UNLOCK_SEQUENCE": {"info_key": "secure.unlock_sequence", "value_type": "array.array.int", "to_json": false}, - "SECURE_UNLOCK_TIMEOUT": {"info_key": "secure.unlock_timeout", "value_type": "int"}, - "SECURE_IDLE_TIMEOUT": {"info_key": "secure.idle_timeout", "value_type": "int"}, - "SENDSTRING_BELL": {"info_key": "audio.macro_beep", "value_type": "bool"}, - "SPLIT_MODS_ENABLE": {"info_key": "split.transport.sync_modifiers", "value_type": "bool"}, - "SPLIT_TRANSPORT_MIRROR": {"info_key": "split.transport.sync_matrix_state", "value_type": "bool"}, - "SPLIT_USB_DETECT": {"info_key": "split.usb_detect.enabled", "value_type": "bool"}, - "SPLIT_USB_TIMEOUT": {"info_key": "split.usb_detect.timeout", "value_type": "int"}, - "SPLIT_USB_TIMEOUT_POLL": {"info_key": "split.usb_detect.polling_interval", "value_type": "int"}, - "SPLIT_WATCHDOG_ENABLE": {"info_key": "split.transport.watchdog", "value_type": "bool"}, - "SPLIT_WATCHDOG_TIMEOUT": {"info_key": "split.transport.watchdog_timeout", "value_type": "int"}, - "SOFT_SERIAL_PIN": {"info_key": "split.soft_serial_pin"}, - "SOFT_SERIAL_SPEED": {"info_key": "split.soft_serial_speed"}, - "TAP_CODE_DELAY": {"info_key": "qmk.tap_keycode_delay", "value_type": "int"}, - "TAP_HOLD_CAPS_DELAY": {"info_key": "qmk.tap_capslock_delay", "value_type": "int"}, - "TAPPING_FORCE_HOLD": {"info_key": "tapping.force_hold", "value_type": "bool"}, - "TAPPING_FORCE_HOLD_PER_KEY": {"info_key": "tapping.force_hold_per_key", "value_type": "bool"}, - "TAPPING_TERM": {"info_key": "tapping.term", "value_type": "int"}, - "TAPPING_TERM_PER_KEY": {"info_key": "tapping.term_per_key", "value_type": "bool"}, - "TAPPING_TOGGLE": {"info_key": "tapping.toggle", "value_type": "int"}, - "USB_MAX_POWER_CONSUMPTION": {"info_key": "usb.max_power", "value_type": "int"}, - "USB_POLLING_INTERVAL_MS": {"info_key": "usb.polling_interval", "value_type": "int"}, - "USB_SUSPEND_WAKEUP_DELAY": {"info_key": "usb.suspend_wakeup_delay", "value_type": "int"}, - - # Items we want flagged in lint - "NO_ACTION_MACRO": {"info_key": "_invalid.no_action_macro", "invalid": true}, - "NO_ACTION_FUNCTION": {"info_key": "_invalid.no_action_function", "invalid": true}, - "DESCRIPTION": {"info_key": "_invalid.usb_description", "invalid": true}, - "DEBOUNCING_DELAY": {"info_key": "_invalid.debouncing_delay", "invalid": true, "replace_with": "DEBOUNCE"}, - "PREVENT_STUCK_MODIFIERS": {"info_key": "_invalid.prevent_stuck_mods", "invalid": true}, - "UNUSED_PINS": {"info_key": "_invalid.unused_pins", "deprecated": true}, - "RGBLIGHT_ANIMATIONS": {"info_key": "rgblight.animations.all", "value_type": "bool", "deprecated": true}, - "QMK_KEYS_PER_SCAN": {"info_key": "qmk.keys_per_scan", "value_type": "int", "deprecated": true} -} diff --git a/data/mappings/info_rules.hjson b/data/mappings/info_rules.hjson new file mode 100644 index 0000000000..2f8656c4bf --- /dev/null +++ b/data/mappings/info_rules.hjson @@ -0,0 +1,44 @@ +// This file maps keys between `rules.mk` and `info.json`. It is used by QMK +// to correctly and consistently map back and forth between the two systems. +{ + // Format: + // : {"info_key": , ["value_type": ], ["to_json": ], ["to_c": ]} + // value_type: one of "array", "array.int", "bool", "int", "list", "hex", "mapping", "str", "raw" + // to_json: Default `true`. Set to `false` to exclude this mapping from info.json + // to_c: Default `true`. Set to `false` to exclude this mapping from rules.mk + // warn_duplicate: Default `true`. Set to `false` to turn off warning when a value exists in both places + // deprecated: Default `false`. Set to `true` to turn on warning when a value exists + // invalid: Default `false`. Set to `true` to generate errors when a value exists + // replace_with: use with a key marked deprecated or invalid to designate a replacement + "BOARD": {"info_key": "board"}, + "BOOTLOADER": {"info_key": "bootloader", "warn_duplicate": false}, + "BLUETOOTH_DRIVER": {"info_key": "bluetooth.driver"}, + "CAPS_WORD_ENABLE": {"info_key": "caps_word.enabled", "value_type": "bool"}, + "DEBOUNCE_TYPE": {"info_key": "build.debounce_type"}, + "ENCODER_ENABLE": {"info_key": "encoder.enabled", "value_type": "bool"}, + "FIRMWARE_FORMAT": {"info_key": "build.firmware_format"}, + "KEYBOARD_SHARED_EP": {"info_key": "usb.shared_endpoint.keyboard", "value_type": "bool"}, + "MOUSE_SHARED_EP": {"info_key": "usb.shared_endpoint.mouse", "value_type": "bool"}, + "LAYOUTS": {"info_key": "community_layouts", "value_type": "list"}, + "LED_MATRIX_DRIVER": {"info_key": "led_matrix.driver"}, + "RGB_MATRIX_DRIVER": {"info_key": "rgb_matrix.driver"}, + "LTO_ENABLE": {"info_key": "build.lto", "value_type": "bool"}, + "MCU": {"info_key": "processor", "warn_duplicate": false}, + "MOUSEKEY_ENABLE": {"info_key": "mouse_key.enabled", "value_type": "bool"}, + "NO_USB_STARTUP_CHECK": {"info_key": "usb.no_startup_check", "value_type": "bool"}, + "PIN_COMPATIBLE": {"info_key": "pin_compatible"}, + "SECURE_ENABLE": {"info_key": "secure.enabled", "value_type": "bool"}, + "SPLIT_KEYBOARD": {"info_key": "split.enabled", "value_type": "bool"}, + "SPLIT_TRANSPORT": {"info_key": "split.transport.protocol", "to_c": false}, + "WAIT_FOR_USB": {"info_key": "usb.wait_for", "value_type": "bool"}, + "STENO_ENABLE": {"info_key": "stenography.enabled", "value_type": "bool"}, + "STENO_PROTOCOL": {"info_key": "stenography.protocol"}, + "PS2_ENABLE": {"info_key": "ps2.enabled", "value_type": "bool"}, + "PS2_MOUSE_ENABLE": {"info_key": "ps2.mouse_enabled", "value_type": "bool"}, + "PS2_DRIVER": {"info_key": "ps2.driver"}, + + // Items we want flagged in lint + "CTPC": {"info_key": "_deprecated.ctpc", "deprecated": true, "replace_with": "CONVERT_TO=proton_c"}, + "CONVERT_TO_PROTON_C": {"info_key": "_deprecated.ctpc", "deprecated": true, "replace_with": "CONVERT_TO=proton_c"}, + "VIAL_ENABLE": {"info_key": "_invalid.vial", "invalid": true} +} diff --git a/data/mappings/info_rules.json b/data/mappings/info_rules.json deleted file mode 100644 index 6bf933bfb8..0000000000 --- a/data/mappings/info_rules.json +++ /dev/null @@ -1,44 +0,0 @@ -# This file maps keys between `rules.mk` and `info.json`. It is used by QMK -# to correctly and consistently map back and forth between the two systems. -{ - # Format: - # : {"info_key": , ["value_type": ], ["to_json": ], ["to_c": ]} - # value_type: one of "array", "array.int", "bool", "int", "list", "hex", "mapping", "str", "raw" - # to_json: Default `true`. Set to `false` to exclude this mapping from info.json - # to_c: Default `true`. Set to `false` to exclude this mapping from rules.mk - # warn_duplicate: Default `true`. Set to `false` to turn off warning when a value exists in both places - # deprecated: Default `false`. Set to `true` to turn on warning when a value exists - # invalid: Default `false`. Set to `true` to generate errors when a value exists - # replace_with: use with a key marked deprecated or invalid to designate a replacement - "BOARD": {"info_key": "board"}, - "BOOTLOADER": {"info_key": "bootloader", "warn_duplicate": false}, - "BLUETOOTH_DRIVER": {"info_key": "bluetooth.driver"}, - "CAPS_WORD_ENABLE": {"info_key": "caps_word.enabled", "value_type": "bool"}, - "DEBOUNCE_TYPE": {"info_key": "build.debounce_type"}, - "ENCODER_ENABLE": {"info_key": "encoder.enabled", "value_type": "bool"}, - "FIRMWARE_FORMAT": {"info_key": "build.firmware_format"}, - "KEYBOARD_SHARED_EP": {"info_key": "usb.shared_endpoint.keyboard", "value_type": "bool"}, - "MOUSE_SHARED_EP": {"info_key": "usb.shared_endpoint.mouse", "value_type": "bool"}, - "LAYOUTS": {"info_key": "community_layouts", "value_type": "list"}, - "LED_MATRIX_DRIVER": {"info_key": "led_matrix.driver"}, - "RGB_MATRIX_DRIVER": {"info_key": "rgb_matrix.driver"}, - "LTO_ENABLE": {"info_key": "build.lto", "value_type": "bool"}, - "MCU": {"info_key": "processor", "warn_duplicate": false}, - "MOUSEKEY_ENABLE": {"info_key": "mouse_key.enabled", "value_type": "bool"}, - "NO_USB_STARTUP_CHECK": {"info_key": "usb.no_startup_check", "value_type": "bool"}, - "PIN_COMPATIBLE": {"info_key": "pin_compatible"}, - "SECURE_ENABLE": {"info_key": "secure.enabled", "value_type": "bool"}, - "SPLIT_KEYBOARD": {"info_key": "split.enabled", "value_type": "bool"}, - "SPLIT_TRANSPORT": {"info_key": "split.transport.protocol", "to_c": false}, - "WAIT_FOR_USB": {"info_key": "usb.wait_for", "value_type": "bool"}, - "STENO_ENABLE": {"info_key": "stenography.enabled", "value_type": "bool"}, - "STENO_PROTOCOL": {"info_key": "stenography.protocol"}, - "PS2_ENABLE": {"info_key": "ps2.enabled", "value_type": "bool"}, - "PS2_MOUSE_ENABLE": {"info_key": "ps2.mouse_enabled", "value_type": "bool"}, - "PS2_DRIVER": {"info_key": "ps2.driver"}, - - # Items we want flagged in lint - "CTPC": {"info_key": "_deprecated.ctpc", "deprecated": true, "replace_with": "CONVERT_TO=proton_c"}, - "CONVERT_TO_PROTON_C": {"info_key": "_deprecated.ctpc", "deprecated": true, "replace_with": "CONVERT_TO=proton_c"}, - "VIAL_ENABLE": {"info_key": "_invalid.vial", "invalid": true} -} diff --git a/data/mappings/keyboard_aliases.hjson b/data/mappings/keyboard_aliases.hjson new file mode 100644 index 0000000000..78a85ef6e7 --- /dev/null +++ b/data/mappings/keyboard_aliases.hjson @@ -0,0 +1,1252 @@ +{ + // Format for each entry: + // "": { + // "target": "", + // "layouts": { + // "": "" + // } + // } + // + // Both target and layouts are optional. + "2_milk": { + "target": "spaceman/2_milk" + }, + "absinthe": { + "target": "keyhive/absinthe" + }, + "aeboards/constellation": { + "target": "aeboards/constellation/rev1" + }, + "aeboards/ext65": { + "target": "aeboards/ext65/rev1" + }, + "ai03/equinox": { + "target": "ai03/equinox/rev1" + }, + "alice": { + "target": "tgr/alice" + }, + "amj40": { + "target": "amjkeyboard/amj40" + }, + "amj60": { + "target": "amjkeyboard/amj60" + }, + "amj96": { + "target": "amjkeyboard/amj96" + }, + "amjpad": { + "target": "amjkeyboard/amjpad" + }, + "angel64": { + "target": "angel64/alpha" + }, + "at101_blackheart": { + "target": "viktus/at101_bh" + }, + "at101_bh": { + "target": "viktus/at101_bh" + }, + "atom47/rev2": { + "target": "maartenwut/atom47/rev2" + }, + "atom47/rev3": { + "target": "maartenwut/atom47/rev3" + }, + "bakeneko60": { + "target": "kkatano/bakeneko60" + }, + "bakeneko65": { + "target": "kkatano/bakeneko65/rev2" + }, + "bakeneko80": { + "target": "kkatano/bakeneko80" + }, + "bear_face": { + "target": "bear_face/v1" + }, + "bm16a": { + "target": "kprepublic/bm16a" + }, + "bm16s": { + "target": "kprepublic/bm16s" + }, + "bm40hsrgb": { + "target": "kprepublic/bm40hsrgb" + }, + "bm43a": { + "target": "kprepublic/bm43a" + }, + "bm60poker": { + "target": "kprepublic/bm60poker" + }, + "bm60rgb": { + "target": "kprepublic/bm60rgb" + }, + "bm60rgb_iso": { + "target": "kprepublic/bm60rgb_iso" + }, + "bm68rgb": { + "target": "kprepublic/bm68rgb" + }, + "bpiphany/pegasushoof": { + "target": "bpiphany/pegasushoof/2013" + }, + "chavdai40": { + "target": "chavdai40/rev1" + }, + "candybar/lefty": { + "target": "tkc/candybar/lefty" + }, + "candybar/righty": { + "target": "tkc/candybar/righty" + }, + "canoe": { + "target": "percent/canoe" + }, + "clawsome/gamebuddy": { + "target": "clawsome/gamebuddy/v1_0" + }, + "cmm_studio/saka68": { + "target": "cmm_studio/saka68/solder" + }, + "cospad": { + "target": "kprepublic/cospad" + }, + "crkbd/rev1/legacy": { + "target": "crkbd/rev1" + }, + "crkbd/rev1/common": { + "target": "crkbd/rev1" + }, + "custommk/genesis": { + "target": "custommk/genesis/rev1" + }, + "daisy": { + "target": "ktec/daisy" + }, + "doro67/multi": { + "layouts": { + "LAYOUT_ansi": "LAYOUT_65_ansi_blocker" + } + }, + "doro67/regular": { + "layouts": { + "LAYOUT": "LAYOUT_65_ansi_blocker" + } + }, + "doro67/rgb": { + "layouts": { + "LAYOUT": "LAYOUT_65_ansi_blocker" + } + }, + "drakon": { + "target": "jagdpietr/drakon" + }, + "durgod/k320": { + "target": "durgod/k3x0/k320" + }, + "dztech/dz60rgb": { + "target": "dztech/dz60rgb/v1" + }, + "dztech/dz60rgb_ansi": { + "target": "dztech/dz60rgb_ansi/v1" + }, + "dztech/dz60rgb_wkl": { + "target": "dztech/dz60rgb_wkl/v1" + }, + "dztech/dz65rgb": { + "target": "dztech/dz65rgb/v1" + }, + "dztech/volcano660": { + "target": "ilumkb/volcano660" + }, + "eek": { + "target": "eek/silk_down" + }, + "ergodone": { + "target": "ktec/ergodone" + }, + "ergoinu": { + "target": "dm9records/ergoinu" + }, + "ergosaurus": { + "target": "keyhive/ergosaurus" + }, + "exclusive/e85": { + "target": "exclusive/e85/hotswap" + }, + "gh60": { + "target": "gh60/revc" + }, + "gmmk/pro": { + "target": "gmmk/pro/rev1/ansi" + }, + "gmmk/pro/ansi": { + "target": "gmmk/pro/rev1/ansi" + }, + "gmmk/pro/iso": { + "target": "gmmk/pro/rev1/iso" + }, + "handwired/ferris": { + "target": "ferris/0_1" + }, + "handwired/p1800fl": { + "target": "team0110/p1800fl" + }, + "helix/pico/sc/back": { + "target": "helix/pico/sc" + }, + "helix/pico/sc/under": { + "target": "helix/pico/sc" + }, + "helix/rev2/back/oled": { + "target": "helix/rev2/back" + }, + "helix/rev2/oled": { + "target": "helix/rev2" + }, + "helix/rev2/oled/back": { + "target": "helix/rev2/back" + }, + "helix/rev2/oled/under": { + "target": "helix/rev2/under" + }, + "helix/rev2/sc/back": { + "target": "helix/rev2/sc" + }, + "helix/rev2/sc/oled": { + "target": "helix/rev2/sc" + }, + "helix/rev2/sc/oledback": { + "target": "helix/rev2/sc" + }, + "helix/rev2/sc/oledunder": { + "target": "helix/rev2/sc" + }, + "helix/rev2/sc/under": { + "target": "helix/rev2/sc" + }, + "helix/rev2/under": { + "target": "helix/rev2/sc" + }, + "helix/rev2/under/oled": { + "target": "helix/rev2/under" + }, + "honeycomb": { + "target": "keyhive/honeycomb" + }, + "idb_60": { + "target": "idb/idb_60", + "layouts": { + "LAYOUT": "LAYOUT_all" + } + }, + "idobo": { + "target": "idobao/id75" + }, + "jj40": { + "target": "kprepublic/jj40" + }, + "jj4x4": { + "target": "kprepublic/jj4x4" + }, + "jj50": { + "target": "kprepublic/jj50" + }, + "jones": { + "target": "jones/v03_1" + }, + "katana60": { + "target": "rominronin/katana60/rev1" + }, + "kbdfans/kbd67mkiirgb": { + "target": "kbdfans/kbd67/mkiirgb", + "layouts": { + "LAYOUT": "LAYOUT_65_ansi_blocker" + } + }, + "kbdfans/kbd67/mkiirgb": { + "target": "kbdfans/kbd67/mkiirgb/v1" + }, + "keebio/dsp40": { + "target": "keebio/dsp40/rev1" + }, + "keycapsss/plaid_pad": { + "target": "keycapsss/plaid_pad/rev1" + }, + "kudox": { + "target": "kudox/rev1" + }, + "kyria": { + "target": "splitkb/kyria" + }, + "lattice60": { + "target": "keyhive/lattice60" + }, + "lazydesigners/the60": { + "target": "lazydesigners/the60/rev1" + }, + "lfkeyboards/lfk78": { + "target": "lfkeyboards/lfk78/revj" + }, + "lfkeyboards/smk65": { + "target": "lfkeyboards/smk65/revb" + }, + "m3v3van": { + "target": "matthewdias/m3n3van" + }, + "maartenwut/atom47/rev2": { + "target": "evyd13/atom47/rev2" + }, + "maartenwut/atom47/rev3": { + "target": "evyd13/atom47/rev3" + }, + "maartenwut/eon40": { + "target": "evyd13/eon40" + }, + "maartenwut/eon65": { + "target": "evyd13/eon65" + }, + "maartenwut/eon75": { + "target": "evyd13/eon75" + }, + "maartenwut/eon87": { + "target": "evyd13/eon87" + }, + "maartenwut/eon95": { + "target": "evyd13/eon95" + }, + "maartenwut/gh80_1800": { + "target": "evyd13/gh80_1800" + }, + "maartenwut/gh80_3700": { + "target": "evyd13/gh80_3700" + }, + "maartenwut/minitomic": { + "target": "evyd13/minitomic" + }, + "maartenwut/mx5160": { + "target": "evyd13/mx5160" + }, + "maartenwut/nt660": { + "target": "evyd13/nt660" + }, + "maartenwut/omrontkl": { + "target": "evyd13/omrontkl" + }, + "maartenwut/plain60": { + "target": "evyd13/plain60" + }, + "maartenwut/pockettype": { + "target": "evyd13/pockettype" + }, + "maartenwut/quackfire": { + "target": "evyd13/quackfire" + }, + "maartenwut/solheim68": { + "target": "evyd13/solheim68" + }, + "maartenwut/ta65": { + "target": "evyd13/ta65" + }, + "maartenwut/wasdat": { + "target": "evyd13/wasdat" + }, + "maartenwut/wasdat_code": { + "target": "evyd13/wasdat_code" + }, + "maartenwut/wonderland": { + "target": "evyd13/wonderland" + }, + "matrix/m12og": { + "target": "matrix/m12og/rev1" + }, + "mechlovin/hannah910": { + "target": "mechlovin/hannah910/rev1" + }, + "mechlovin/adelais/rgb_led": { + "target": "mechlovin/adelais/rgb_led/rev1" + }, + "mechlovin/adelais/standard_led": { + "target": "mechlovin/adelais/standard_led/rev2" + }, + "mechlovin/delphine": { + "target": "mechlovin/delphine/mono_led" + }, + "mechlovin/hannah60rgb": { + "target": "mechlovin/hannah60rgb/rev1" + }, + "mechlovin/hannah65/mechlovin9": { + "target": "mechlovin/mechlovin9/rev1" + }, + "mechlovin/hex4b": { + "target": "mechlovin/hex4b/rev1" + }, + "melgeek/z70ultra": { + "target": "melgeek/z70ultra/rev1" + }, + "mechlovin/hannah65": { + "target": "mechlovin/hannah65/rev1" + }, + "minim": { + "target": "matthewdias/minim" + }, + "model01": { + "target": "keyboardio/model01" + }, + "model_v": { + "target": "matthewdias/model_v" + }, + "m0lly": { + "target": "tkc/m0lly" + }, + "montsinger/rebound": { + "target": "montsinger/rebound/rev1" + }, + "noxary/268_2": { + "layouts": { + "LAYOUT": "LAYOUT_65_ansi_blocker" + } + }, + "oddball": { + "target": "oddball/v1" + }, + "omnikey_blackheart": { + "target": "viktus/omnikey_bh" + }, + "omnikey_bh": { + "target": "viktus/omnikey_bh" + }, + "opus": { + "target": "keyhive/opus" + }, + "pabile/p20": { + "target": "pabile/p20/ver1" + }, + "pancake/feather": { + "target": "spaceman/pancake/feather" + }, + "pancake/promicro": { + "target": "spaceman/pancake/promicro" + }, + "peiorisboards/ixora": { + "target": "coarse/ixora" + }, + "percent/canoe": { + "layouts": { + "LAYOUT_iso": "LAYOUT_65_iso_blocker" + } + }, + "plaid": { + "target": "dm9records/plaid" + }, + "plain60": { + "target": "maartenwut/plain60" + }, + "ploopyco/trackball": { + "target": "ploopyco/trackball/rev1_005" + }, + "polilla": { + "target": "polilla/rev1" + }, + "preonic/rev1": { + "layouts": { + "LAYOUT_preonic_grid": "LAYOUT_ortho_5x12" + } + }, + "preonic/rev2": { + "layouts": { + "LAYOUT_preonic_grid": "LAYOUT_ortho_5x12" + } + }, + "preonic/rev3": { + "layouts": { + "LAYOUT_preonic_grid": "LAYOUT_ortho_5x12" + } + }, + "primekb/prime_l": { + "target": "primekb/prime_l/v1" + }, + "primekb/prime_l_v2": { + "target": "primekb/prime_l/v2" + }, + "projectkb/alice": { + "target": "projectkb/alice/rev1" + }, + "rama/koyu": { + "target": "wilba_tech/rama_works_koyu" + }, + "rama/m6_a": { + "target": "wilba_tech/rama_works_m6_a" + }, + "rama/m6_b": { + "target": "wilba_tech/rama_works_m6_b" + }, + "rama/m10_b": { + "target": "wilba_tech/rama_works_m10_b" + }, + "rama/m60_a": { + "target": "wilba_tech/rama_works_m60_a" + }, + "rama/u80_a": { + "target": "wilba_tech/rama_works_u80_a" + }, + "ramonimbao/herringbone": { + "target": "ramonimbao/herringbone/v1" + }, + "ramonimbao/mona": { + "target": "ramonimbao/mona/v1" + }, + "rgbkb/pan": { + "target": "rgbkb/pan/rev1/32a" + }, + "rgbkb/pan/rev1": { + "target": "rgbkb/pan/rev1/32a" + }, + "romac": { + "target": "kingly_keys/romac" + }, + "ropro": { + "target": "kingly_keys/ropro" + }, + "satan": { + "target": "gh60/satan" + }, + "skog": { + "target": "percent/skog" + }, + "smallice": { + "target": "keyhive/smallice" + }, + "southpole": { + "target": "keyhive/southpole" + }, + "speedo": { + "target": "cozykeys/speedo/v2" + }, + "staryu": { + "target": "ktec/staryu" + }, + "stoutgat": { + "target": "tkw/stoutgat/v1" + }, + "suihankey": { + "target": "suihankey/split/alpha" + }, + "ta65": { + "target": "maartenwut/ta65" + }, + "tartan": { + "target": "dm9records/tartan" + }, + "tkc1800": { + "target": "tkc/tkc1800" + }, + "tkw/stoutgat/v2": { + "target": "tkw/stoutgat/v2/f411" + }, + "tokyo60": { + "target": "tokyokeyboard/tokyo60" + }, + "txuu": { + "target": "matthewdias/txuu" + }, + "underscore33": { + "target": "underscore33/rev1" + }, + "vinta": { + "target": "coarse/vinta", + "layouts": { + "LAYOUT_67_ansi": "LAYOUT_65_ansi_blocker" + } + }, + "wasdat": { + "target": "maartenwut/wasdat" + }, + "westfoxtrot/cypher": { + "target": "westfoxtrot/cypher/rev1" + }, + "whale/sk": { + "target": "whale/sk/v3" + }, + "xd002": { + "target": "xiudi/xd002" + }, + "xd004": { + "target": "xiudi/xd004" + }, + "xd60": { + "target": "xiudi/xd60" + }, + "xd68": { + "target": "xiudi/xd68" + }, + "xd75": { + "target": "xiudi/xd75" + }, + "xd84": { + "target": "xiudi/xd84" + }, + "xd84pro": { + "target": "xiudi/xd84pro" + }, + "xd87": { + "target": "xiudi/xd87" + }, + "xd96": { + "target": "xiudi/xd96" + }, + "xelus/dawn60": { + "target": "xelus/dawn60/rev1" + }, + "xelus/valor": { + "target": "xelus/valor/rev1" + }, + "z150_blackheart": { + "target": "viktus/z150_bh" + }, + "z150_bh":{ + "target": "viktus/z150_bh" + }, + "zeal60": { + "target": "wilba_tech/zeal60" + }, + "zeal65": { + "target": "wilba_tech/zeal65" + }, + // Moved during 2022 Q1 cycle + "6ball": { + "target": "maple_computing/6ball" + }, + "7skb": { + "target": "salicylic_acid3/7skb" + }, + "7splus": { + "target": "salicylic_acid3/7splus" + }, + "acr60": { + "target": "mechkeys/acr60" + }, + "adalyn": { + "target": "tominabox1/adalyn" + }, + "ajisai74": { + "target": "salicylic_acid3/ajisai74" + }, + "aleth42": { + "target": "25keys/aleth42" + }, + "alicia_cook": { + "target": "ibnuda/alicia_cook" + }, + "allison": { + "target": "prototypist/allison" + }, + "allison_numpad": { + "target": "prototypist/allison_numpad" + }, + "alu84": { + "target": "mechkeys/alu84" + }, + "angel17": { + "target": "kakunpc/angel17" + }, + "angel64/alpha": { + "target": "kakunpc/angel64/alpha" + }, + "angel64/rev1": { + "target": "kakunpc/angel64/rev1" + }, + "arch_36": { + "target": "obosob/arch_36" + }, + "bakeneko65/rev2": { + "target": "kkatano/bakeneko65/rev2" + }, + "bakeneko65/rev3": { + "target": "kkatano/bakeneko65/rev3" + }, + "barleycorn": { + "target": "yiancardesigns/barleycorn" + }, + "bat43/rev1": { + "target": "dailycraft/bat43/rev1" + }, + "bat43/rev2": { + "target": "dailycraft/bat43/rev2" + }, + "bigseries/1key": { + "target": "woodkeys/bigseries/1key" + }, + "bigseries/2key": { + "target": "woodkeys/bigseries/2key" + }, + "bigseries/3key": { + "target": "woodkeys/bigseries/3key" + }, + "bigseries/4key": { + "target": "woodkeys/bigseries/4key" + }, + "bkf": { + "target": "drhigsby/bkf" + }, + "business_card/alpha": { + "target": "kakunpc/business_card/alpha" + }, + "business_card/beta": { + "target": "kakunpc/business_card/beta" + }, + "butterstick": { + "target": "gboards/butterstick" + }, + "c39": { + "target": "maple_computing/c39" + }, + "cassette42": { + "target": "25keys/cassette42" + }, + "chidori": { + "target": "kagizaraya/chidori" + }, + "chili": { + "target": "ydkb/chili" + }, + "chimera_ergo": { + "target": "glenpickle/chimera_ergo" + }, + "chimera_ls": { + "target": "glenpickle/chimera_ls" + }, + "chimera_ortho": { + "target": "glenpickle/chimera_ortho" + }, + "chimera_ortho_plus": { + "target": "glenpickle/chimera_ortho_plus" + }, + "choc_taro": { + "target": "kakunpc/choc_taro" + }, + "choco60": { + "target": "recompile_keys/choco60" + }, + "christmas_tree": { + "target": "maple_computing/christmas_tree" + }, + "claw44/rev1": { + "target": "dailycraft/claw44/rev1" + }, + "cocoa40": { + "target": "recompile_keys/cocoa40" + }, + "comet46": { + "target": "satt/comet46" + }, + "cu24": { + "target": "capsunlocked/cu24" + }, + "cu75": { + "target": "capsunlocked/cu75" + }, + "cu80": { + "target": "capsunlocked/cu80/v1" + }, + "delilah": { + "target": "rainkeebs/delilah" + }, + "diverge3": { + "target": "unikeyboard/diverge3" + }, + "divergetm2": { + "target": "unikeyboard/divergetm2" + }, + "dozen0": { + "target": "yynmt/dozen0" + }, + "dubba175": { + "target": "drhigsby/dubba175" + }, + "eggman": { + "target": "qpockets/eggman" + }, + "ergo42": { + "target": "biacco42/ergo42" + }, + "ergoarrows": { + "target": "salicylic_acid3/ergoarrows" + }, + "ergodash/mini": { + "target": "omkbd/ergodash/mini" + }, + "ergodash/rev1": { + "target": "omkbd/ergodash/rev1" + }, + "ergodox_infinity": { + "target": "input_club/ergodox_infinity" + }, + "ergotaco": { + "target": "gboards/ergotaco" + }, + "espectro": { + "target": "mechkeys/espectro" + }, + "felix": { + "target": "unikeyboard/felix" + }, + "four_banger": { + "target": "bpiphany/four_banger" + }, + "freyr": { + "target": "hnahkb/freyr" + }, + "geminate60": { + "target": "weirdo/geminate60" + }, + "gentleman65": { + "target": "jkeys_design/gentleman65" + }, + "georgi": { + "target": "gboards/georgi" + }, + "gergo": { + "target": "gboards/gergo" + }, + "getta25": { + "target": "salicylic_acid3/getta25" + }, + "gingham": { + "target": "yiancardesigns/gingham" + }, + "gurindam": { + "target": "ibnuda/gurindam" + }, + "halberd": { + "target": "kagizaraya/halberd" + }, + "handwired/hillside/0_1": { + "target": "handwired/hillside/48" + }, + "hecomi/alpha": { + "target": "takashiski/hecomi/alpha" + }, + "hid_liber": { + "target": "bpiphany/hid_liber" + }, + "id67/default_rgb": { + "target": "idobao/id67/default_rgb" + }, + "id67/rgb": { + "target": "idobao/id67/rgb" + }, + "id80": { + "target": "idobao/id80/v2/ansi" + }, + "idobao/id80/v1/ansi": { + "target": "idobao/id80/v2/ansi" + }, + "idobao/id80/v1/iso": { + "target": "idobao/id80/v2/iso" + }, + "id87": { + "target": "idobao/id87/v1" + }, + "infinity60": { + "target": "input_club/infinity60" + }, + "ivy/rev1": { + "target": "maple_computing/ivy/rev1" + }, + "jisplit89": { + "target": "salicylic_acid3/jisplit89" + }, + "jnao": { + "target": "maple_computing/jnao" + }, + "just60": { + "target": "ydkb/just60" + }, + "k_type": { + "target": "input_club/k_type" + }, + "kagamidget": { + "target": "yynmt/kagamidget" + }, + "kelowna/rgb64": { + "target": "weirdo/kelowna/rgb64" + }, + "kprepublic/bm65hsrgb_iso": { + "target": "kprepublic/bm65hsrgb_iso/rev1" + }, + "kprepublic/bm68hsrgb": { + "target": "kprepublic/bm68hsrgb/rev1" + }, + "latin17rgb": { + "target": "latincompass/latin17rgb" + }, + "latin47ble": { + "target": "latincompass/latin47ble" + }, + "latin60rgb": { + "target": "latincompass/latin60rgb" + }, + "latin64ble": { + "target": "latincompass/latin64ble" + }, + "latin6rgb": { + "target": "latincompass/latin6rgb" + }, + "latinpad": { + "target": "latincompass/latinpad" + }, + "latinpadble": { + "target": "latincompass/latinpadble" + }, + "launchpad/rev1": { + "target": "maple_computing/launchpad/rev1" + }, + "lck75": { + "target": "lyso1/lck75" + }, + "le_chiffre": { + "target": "tominabox1/le_chiffre" + }, + "lefishe": { + "target": "lyso1/lefishe" + }, + "lets_split_eh/eh": { + "target": "maple_computing/lets_split_eh/eh" + }, + "ls_60": { + "target": "weirdo/ls_60" + }, + "m3n3van": { + "target": "matthewdias/m3n3van" + }, + "mechmini/v1": { + "target": "mechkeys/mechmini/v1" + }, + "mechmini/v2": { + "target": "mechkeys/mechmini/v2" + }, + "meira": { + "target": "woodkeys/meira" + }, + "meishi": { + "target": "biacco42/meishi" + }, + "meishi2": { + "target": "biacco42/meishi2" + }, + "melody96": { + "target": "ymdk/melody96" + }, + "minidox/rev1": { + "target": "maple_computing/minidox/rev1" + }, + "mio": { + "target": "recompile_keys/mio" + }, + "montex": { + "target": "idobao/montex/v1" + }, + "mt40": { + "target": "mt/mt40" + }, + "mt64rgb": { + "target": "mt/mt64rgb" + }, + "mt84": { + "target": "mt/mt84" + }, + "mt980": { + "target": "mt/mt980" + }, + "nafuda": { + "target": "salicylic_acid3/nafuda" + }, + "naiping/np64": { + "target": "weirdo/naiping/np64" + }, + "naiping/nphhkb": { + "target": "weirdo/naiping/nphhkb" + }, + "naiping/npminila": { + "target": "weirdo/naiping/npminila" + }, + "naked48": { + "target": "salicylic_acid3/naked48" + }, + "naked60": { + "target": "salicylic_acid3/naked60" + }, + "naked64": { + "target": "salicylic_acid3/naked64" + }, + "namecard2x4": { + "target": "takashiski/namecard2x4" + }, + "navi10": { + "target": "keyhive/navi10" + }, + "nebula12": { + "target": "spaceholdings/nebula12" + }, + "nebula68": { + "target": "spaceholdings/nebula68" + }, + "nebula68b": { + "target": "spaceholdings/nebula68b" + }, + "niu_mini": { + "target": "kbdfans/niu_mini" + }, + "nk1": { + "target": "novelkeys/nk1" + }, + "nk65": { + "target": "novelkeys/nk65" + }, + "nk87": { + "target": "novelkeys/nk87" + }, + "nknl7en": { + "target": "salicylic_acid3/nknl7en" + }, + "nknl7jp": { + "target": "salicylic_acid3/nknl7jp" + }, + "nomu30": { + "target": "recompile_keys/nomu30" + }, + "novelpad": { + "target": "novelkeys/novelpad" + }, + "ogurec": { + "target": "drhigsby/ogurec" + }, + "otaku_split/rev0": { + "target": "takashiski/otaku_split/rev0" + }, + "otaku_split/rev1": { + "target": "takashiski/otaku_split/rev1" + }, + "owl8": { + "target": "dailycraft/owl8" + }, + "packrat": { + "target": "drhigsby/packrat" + }, + "pistachio": { + "target": "rate/pistachio" + }, + "pistachio_mp": { + "target": "rate/pistachio_mp" + }, + "pistachio_pro": { + "target": "rate/pistachio_pro" + }, + "plexus75": { + "target": "checkerboards/plexus75" + }, + "pursuit40": { + "target": "checkerboards/pursuit40" + }, + "qaz": { + "target": "tominabox1/qaz" + }, + "quark": { + "target": "checkerboards/quark" + }, + "rabbit_capture_plan": { + "target": "kakunpc/rabbit_capture_plan" + }, + "rainkeeb": { + "target": "rainkeebs/rainkeeb" + }, + "reviung33": { + "target": "reviung/reviung33" + }, + "reviung34": { + "target": "reviung/reviung34" + }, + "reviung39": { + "target": "reviung/reviung39" + }, + "reviung41": { + "target": "reviung/reviung41" + }, + "reviung5": { + "target": "reviung/reviung5" + }, + "reviung53": { + "target": "reviung/reviung53" + }, + "reviung61": { + "target": "reviung/reviung61" + }, + "runner3680/3x6": { + "target": "omkbd/runner3680/3x6" + }, + "runner3680/3x7": { + "target": "omkbd/runner3680/3x7" + }, + "runner3680/3x8": { + "target": "omkbd/runner3680/3x8" + }, + "runner3680/4x6": { + "target": "omkbd/runner3680/4x6" + }, + "runner3680/4x7": { + "target": "omkbd/runner3680/4x7" + }, + "runner3680/4x8": { + "target": "omkbd/runner3680/4x8" + }, + "runner3680/5x6": { + "target": "omkbd/runner3680/5x6" + }, + "runner3680/5x6_5x8": { + "target": "omkbd/runner3680/5x6_5x8" + }, + "runner3680/5x7": { + "target": "omkbd/runner3680/5x7" + }, + "runner3680/5x8": { + "target": "omkbd/runner3680/5x8" + }, + "scarletbandana": { + "target": "woodkeys/scarletbandana" + }, + "scythe": { + "target": "kagizaraya/scythe" + }, + "seigaiha": { + "target": "yiancardesigns/seigaiha" + }, + "setta21": { + "target": "salicylic_acid3/setta21" + }, + "space_space/rev1": { + "target": "qpockets/space_space/rev1" + }, + "space_space/rev2": { + "target": "qpockets/space_space/rev2" + }, + "spiderisland/winry25tc": { + "target": "winry/winry25tc" + }, + "splitreus62": { + "target": "nacly/splitreus62" + }, + "squiggle/rev1": { + "target": "ibnuda/squiggle/rev1" + }, + "standaside": { + "target": "edi/standaside" + }, + "steal_this_keyboard": { + "target": "obosob/steal_this_keyboard" + }, + "stella": { + "target": "hnahkb/stella" + }, + "suihankey/alpha": { + "target": "kakunpc/suihankey/alpha" + }, + "suihankey/rev1": { + "target": "kakunpc/suihankey/rev1" + }, + "suihankey/split": { + "target": "kakunpc/suihankey/split" + }, + "the_ruler": { + "target": "maple_computing/the_ruler" + }, + "thedogkeyboard": { + "target": "kakunpc/thedogkeyboard" + }, + "tiger910": { + "target": "weirdo/tiger910" + }, + "treadstone32": { + "target": "marksard/treadstone32" + }, + "treadstone48/rev1": { + "target": "marksard/treadstone48/rev1" + }, + "treadstone48/rev2": { + "target": "marksard/treadstone48/rev2" + }, + "ua62": { + "target": "nacly/ua62" + }, + "underscore33/rev1": { + "target": "tominabox1/underscore33/rev1" + }, + "underscore33/rev2": { + "target": "tominabox1/underscore33/rev2" + }, + "uno": { + "target": "keyhive/uno" + }, + "ut472": { + "target": "keyhive/ut472" + }, + "vn66": { + "target": "hnahkb/vn66" + }, + "wallaby": { + "target": "kkatano/wallaby" + }, + "wanten": { + "target": "qpockets/wanten" + }, + "wheatfield/blocked65": { + "target": "mt/blocked65" + }, + "wheatfield/split75": { + "target": "mt/split75" + }, + "whitefox": { + "target": "input_club/whitefox" + }, + "wings42/rev1": { + "target": "dailycraft/wings42/rev1" + }, + "wings42/rev1_extkeys": { + "target": "dailycraft/wings42/rev1_extkeys" + }, + "wings42/rev2": { + "target": "dailycraft/wings42/rev2" + }, + "yasui": { + "target": "rainkeebs/yasui" + }, + "yd60mq": { + "target": "ymdk/yd60mq" + }, + "yd68": { + "target": "ydkb/yd68" + }, + "ymd75": { + "target": "ymdk/ymd75" + }, + "ymd96": { + "target": "ymdk/ymd96" + }, + "ymdk_np21": { + "target": "ymdk/np21" + }, + "yurei": { + "target": "kkatano/yurei" + }, + "zinc": { + "target": "25keys/zinc" + }, + "zinc/rev1": { + "target": "25keys/zinc/rev1" + }, + "zinc/reva": { + "target": "25keys/zinc/reva" + } +} diff --git a/data/mappings/keyboard_aliases.json b/data/mappings/keyboard_aliases.json deleted file mode 100644 index 3e96451086..0000000000 --- a/data/mappings/keyboard_aliases.json +++ /dev/null @@ -1,1285 +0,0 @@ -{ - # Format for each entry: - # : { - # target: , - # layouts: { - # : - # } - # } - # - # Both target and layouts are optional. - '2_milk': { - target: 'spaceman/2_milk' - }, - 'absinthe': { - target: 'keyhive/absinthe' - }, - 'aeboards/constellation': { - target: 'aeboards/constellation/rev1' - }, - 'aeboards/ext65': { - target: 'aeboards/ext65/rev1' - }, - 'ai03/equinox': { - target: 'ai03/equinox/rev1' - }, - aleth42: { - target: 'aleth42/rev1' - }, - alice: { - target: 'tgr/alice' - }, - amj40: { - target: 'amjkeyboard/amj40' - }, - amj60: { - target: 'amjkeyboard/amj60' - }, - amj96: { - target: 'amjkeyboard/amj96' - }, - amjpad: { - target: 'amjkeyboard/amjpad' - }, - angel17: { - target: 'angel17/alpha' - }, - angel64: { - target: 'angel64/alpha' - }, - at101_blackheart: { - target: 'viktus/at101_bh' - }, - at101_bh: { - target: 'viktus/at101_bh' - }, - 'atom47/rev2': { - target: 'maartenwut/atom47/rev2' - }, - 'atom47/rev3': { - target: 'maartenwut/atom47/rev3' - }, - bakeneko60: { - target: 'kkatano/bakeneko60' - }, - bakeneko65: { - target: 'kkatano/bakeneko65/rev2' - }, - bakeneko80: { - target: 'kkatano/bakeneko80' - }, - bear_face: { - target: 'bear_face/v1' - }, - bm16a: { - target: 'kprepublic/bm16a' - }, - bm16s: { - target: 'kprepublic/bm16s' - }, - bm40hsrgb: { - target: 'kprepublic/bm40hsrgb' - }, - bm43a: { - target: 'kprepublic/bm43a' - }, - bm60poker: { - target: 'kprepublic/bm60poker' - }, - bm60rgb: { - target: 'kprepublic/bm60rgb' - }, - bm60rgb_iso: { - target: 'kprepublic/bm60rgb_iso' - }, - bm68rgb: { - target: 'kprepublic/bm68rgb' - }, - 'bpiphany/pegasushoof': { - target: 'bpiphany/pegasushoof/2013' - }, - chavdai40: { - target: 'chavdai40/rev1' - }, - 'candybar/lefty': { - target: 'tkc/candybar/lefty' - }, - 'candybar/righty': { - target: 'tkc/candybar/righty' - }, - canoe: { - target: 'percent/canoe' - }, - 'clawsome/gamebuddy': { - target: 'clawsome/gamebuddy/v1_0' - }, - 'cmm_studio/saka68': { - target: 'cmm_studio/saka68/solder' - }, - 'cospad': { - target: 'kprepublic/cospad' - }, - 'crkbd/rev1/legacy': { - target: 'crkbd/rev1' - }, - 'crkbd/rev1/common': { - target: 'crkbd/rev1' - }, - 'custommk/genesis': { - target: 'custommk/genesis/rev1' - }, - 'daisy': { - target: 'ktec/daisy' - }, - 'doro67/multi': { - layouts: { - LAYOUT_ansi: 'LAYOUT_65_ansi_blocker' - } - }, - 'doro67/regular': { - layouts: { - LAYOUT: 'LAYOUT_65_ansi_blocker' - } - }, - 'doro67/rgb': { - layouts: { - LAYOUT: 'LAYOUT_65_ansi_blocker' - } - }, - drakon: { - target: 'jagdpietr/drakon' - }, - 'durgod/k320': { - target: 'durgod/k3x0/k320' - }, - 'dztech/dz60rgb': { - target: 'dztech/dz60rgb/v1' - }, - 'dztech/dz60rgb_ansi': { - target: 'dztech/dz60rgb_ansi/v1' - }, - 'dztech/dz60rgb_wkl': { - target: 'dztech/dz60rgb_wkl/v1' - }, - 'dztech/dz65rgb': { - target: 'dztech/dz65rgb/v1' - }, - 'dztech/volcano660': { - target: 'ilumkb/volcano660' - }, - eek: { - target: 'eek/silk_down' - }, - 'ergodone': { - target: 'ktec/ergodone' - }, - ergoinu: { - target: 'dm9records/ergoinu' - }, - ergosaurus: { - target: 'keyhive/ergosaurus' - }, - 'exclusive/e85': { - target: 'exclusive/e85/hotswap' - }, - gh60: { - target: 'gh60/revc' - }, - 'gmmk/pro': { - target: 'gmmk/pro/rev1/ansi' - }, - 'gmmk/pro/ansi': { - target: 'gmmk/pro/rev1/ansi' - }, - 'gmmk/pro/iso': { - target: 'gmmk/pro/rev1/iso' - }, - 'handwired/ferris': { - target: 'ferris/0_1' - }, - 'handwired/p1800fl': { - target: 'team0110/p1800fl' - }, - 'helix/pico/sc/back': { - target: 'helix/pico/sc' - }, - 'helix/pico/sc/under': { - target: 'helix/pico/sc' - }, - 'helix/rev2/back/oled': { - target: 'helix/rev2/back' - }, - 'helix/rev2/oled': { - target: 'helix/rev2' - }, - 'helix/rev2/oled/back': { - target: 'helix/rev2/back' - }, - 'helix/rev2/oled/under': { - target: 'helix/rev2/under' - }, - 'helix/rev2/sc/back': { - target: 'helix/rev2/sc' - }, - 'helix/rev2/sc/oled': { - target: 'helix/rev2/sc' - }, - 'helix/rev2/sc/oledback': { - target: 'helix/rev2/sc' - }, - 'helix/rev2/sc/oledunder': { - target: 'helix/rev2/sc' - }, - 'helix/rev2/sc/under': { - target: 'helix/rev2/sc' - }, - 'helix/rev2/under': { - target: 'helix/rev2/sc' - }, - 'helix/rev2/under/oled': { - target: 'helix/rev2/under' - }, - honeycomb: { - target: 'keyhive/honeycomb' - }, - idb_60: { - target: 'idb/idb_60', - layouts: { - LAYOUT: 'LAYOUT_all' - } - }, - idobo: { - target: 'idobao/id75' - }, - 'jj40': { - target: 'kprepublic/jj40' - }, - 'jj4x4': { - target: 'kprepublic/jj4x4' - }, - 'jj50': { - target: 'kprepublic/jj50' - }, - jones: { - target: 'jones/v03_1' - }, - katana60: { - target: 'rominronin/katana60/rev1' - }, - 'kbdfans/kbd67mkiirgb': { - target: 'kbdfans/kbd67/mkiirgb', - layouts: { - LAYOUT: 'LAYOUT_65_ansi_blocker' - } - }, - 'kbdfans/kbd67/mkiirgb': { - target: 'kbdfans/kbd67/mkiirgb/v1' - }, - 'keebio/dsp40': { - target: 'keebio/dsp40/rev1' - }, - 'keycapsss/plaid_pad': { - target: 'keycapsss/plaid_pad/rev1' - }, - kudox: { - target: 'kudox/rev1' - }, - 'kyria': { - target: 'splitkb/kyria' - }, - lattice60: { - target: 'keyhive/lattice60' - }, - 'lazydesigners/the60': { - target: 'lazydesigners/the60/rev1' - }, - 'lfkeyboards/lfk78': { - target: 'lfkeyboards/lfk78/revj' - }, - 'lfkeyboards/smk65': { - target: 'lfkeyboards/smk65/revb' - }, - m3v3van: { - target: 'matthewdias/m3n3van' - }, - 'maartenwut/atom47/rev2': { - target: 'evyd13/atom47/rev2' - }, - 'maartenwut/atom47/rev3': { - target: 'evyd13/atom47/rev3' - }, - 'maartenwut/eon40': { - target: 'evyd13/eon40' - }, - 'maartenwut/eon65': { - target: 'evyd13/eon65' - }, - 'maartenwut/eon75': { - target: 'evyd13/eon75' - }, - 'maartenwut/eon87': { - target: 'evyd13/eon87' - }, - 'maartenwut/eon95': { - target: 'evyd13/eon95' - }, - 'maartenwut/gh80_1800': { - target: 'evyd13/gh80_1800' - }, - 'maartenwut/gh80_3700': { - target: 'evyd13/gh80_3700' - }, - 'maartenwut/minitomic': { - target: 'evyd13/minitomic' - }, - 'maartenwut/mx5160': { - target: 'evyd13/mx5160' - }, - 'maartenwut/nt660': { - target: 'evyd13/nt660' - }, - 'maartenwut/omrontkl': { - target: 'evyd13/omrontkl' - }, - 'maartenwut/plain60': { - target: 'evyd13/plain60' - }, - 'maartenwut/pockettype': { - target: 'evyd13/pockettype' - }, - 'maartenwut/quackfire': { - target: 'evyd13/quackfire' - }, - 'maartenwut/solheim68': { - target: 'evyd13/solheim68' - }, - 'maartenwut/ta65': { - target: 'evyd13/ta65' - }, - 'maartenwut/wasdat': { - target: 'evyd13/wasdat' - }, - 'maartenwut/wasdat_code': { - target: 'evyd13/wasdat_code' - }, - 'maartenwut/wonderland': { - target: 'evyd13/wonderland' - }, - 'matrix/m12og': { - target: 'matrix/m12og/rev1' - }, - 'mechlovin/hannah910': { - target: 'mechlovin/hannah910/rev1' - }, - 'mechlovin/adelais/rgb_led': { - target: 'mechlovin/adelais/rgb_led/rev1' - }, - 'mechlovin/adelais/standard_led': { - target: 'mechlovin/adelais/standard_led/rev2' - }, - 'mechlovin/delphine': { - target: 'mechlovin/delphine/mono_led' - }, - 'mechlovin/hannah60rgb': { - target: 'mechlovin/hannah60rgb/rev1' - }, - 'mechlovin/hannah65/mechlovin9': { - target: 'mechlovin/mechlovin9/rev1' - }, - 'mechlovin/hex4b': { - target: 'mechlovin/hex4b/rev1' - }, - 'melgeek/z70ultra': { - target: 'melgeek/z70ultra/rev1' - }, - 'mechlovin/hannah65': { - target: 'mechlovin/hannah65/rev1' - }, - minim: { - target: 'matthewdias/minim' - }, - model01: { - target: 'keyboardio/model01' - }, - model_v: { - target: 'matthewdias/model_v' - }, - m0lly: { - target: 'tkc/m0lly' - }, - 'montsinger/rebound': { - target: 'montsinger/rebound/rev1' - }, - nomu30: { - target: 'nomu30/rev1' - }, - 'noxary/268_2': { - layouts: { - LAYOUT: 'LAYOUT_65_ansi_blocker' - } - }, - oddball: { - target: 'oddball/v1' - }, - omnikey_blackheart: { - target: 'viktus/omnikey_bh' - }, - omnikey_bh: { - target: 'viktus/omnikey_bh' - }, - opus: { - target: 'keyhive/opus' - }, - 'pabile/p20': { - target: 'pabile/p20/ver1' - }, - 'pancake/feather': { - target: 'spaceman/pancake/feather' - }, - 'pancake/promicro': { - target: 'spaceman/pancake/promicro' - }, - 'peiorisboards/ixora': { - target: 'coarse/ixora' - }, - 'percent/canoe': { - layouts: { - LAYOUT_iso: 'LAYOUT_65_iso_blocker' - } - }, - plaid: { - target: 'dm9records/plaid' - }, - plain60: { - target: 'maartenwut/plain60' - }, - 'ploopyco/trackball': { - target: 'ploopyco/trackball/rev1_005' - }, - polilla: { - target: 'polilla/rev1' - }, - 'preonic/rev1': { - layouts: { - LAYOUT_preonic_grid: 'LAYOUT_ortho_5x12' - } - }, - 'preonic/rev2': { - layouts: { - LAYOUT_preonic_grid: 'LAYOUT_ortho_5x12' - } - }, - 'preonic/rev3': { - layouts: { - LAYOUT_preonic_grid: 'LAYOUT_ortho_5x12' - } - }, - 'primekb/prime_l': { - target: 'primekb/prime_l/v1' - }, - 'primekb/prime_l_v2': { - target: 'primekb/prime_l/v2' - }, - 'projectkb/alice': { - target: 'projectkb/alice/rev1' - }, - 'rama/koyu': { - target: 'wilba_tech/rama_works_koyu' - }, - 'rama/m6_a': { - target: 'wilba_tech/rama_works_m6_a' - }, - 'rama/m6_b': { - target: 'wilba_tech/rama_works_m6_b' - }, - 'rama/m10_b': { - target: 'wilba_tech/rama_works_m10_b' - }, - 'rama/m60_a': { - target: 'wilba_tech/rama_works_m60_a' - }, - 'rama/u80_a': { - target: 'wilba_tech/rama_works_u80_a' - }, - 'ramonimbao/herringbone': { - target: 'ramonimbao/herringbone/v1' - }, - 'ramonimbao/mona': { - target: 'ramonimbao/mona/v1' - }, - 'rgbkb/pan': { - target: 'rgbkb/pan/rev1/32a' - }, - 'rgbkb/pan/rev1': { - target: 'rgbkb/pan/rev1/32a' - }, - romac: { - target: 'kingly_keys/romac' - }, - ropro: { - target: 'kingly_keys/ropro' - }, - satan: { - target: 'gh60/satan' - }, - skog: { - target: 'percent/skog' - }, - smallice: { - target: 'keyhive/smallice' - }, - southpole: { - target: 'keyhive/southpole' - }, - speedo: { - target: 'cozykeys/speedo/v2' - }, - 'staryu': { - target: 'ktec/staryu' - }, - stoutgat: { - target: 'tkw/stoutgat/v1' - }, - suihankey: { - target: 'suihankey/split/alpha' - }, - ta65: { - target: 'maartenwut/ta65' - }, - tartan: { - target: 'dm9records/tartan' - }, - tkc1800: { - target: 'tkc/tkc1800' - }, - 'tkw/stoutgat/v2': { - target: 'tkw/stoutgat/v2/f411' - }, - 'tokyo60': { - target: 'tokyokeyboard/tokyo60' - }, - 'txuu': { - target: 'matthewdias/txuu' - }, - underscore33: { - target: 'underscore33/rev1' - }, - vinta: { - target: 'coarse/vinta', - layouts: { - LAYOUT_67_ansi: 'LAYOUT_65_ansi_blocker' - } - }, - wasdat: { - target: 'maartenwut/wasdat' - }, - 'westfoxtrot/cypher': { - target: 'westfoxtrot/cypher/rev1' - }, - 'whale/sk': { - target: 'whale/sk/v3' - }, - 'xd002': { - target: 'xiudi/xd002' - }, - 'xd004': { - target: 'xiudi/xd004' - }, - 'xd60': { - target: 'xiudi/xd60' - }, - 'xd68': { - target: 'xiudi/xd68' - }, - 'xd75': { - target: 'xiudi/xd75' - }, - 'xd84': { - target: 'xiudi/xd84' - }, - 'xd84pro': { - target: 'xiudi/xd84pro' - }, - 'xd87': { - target: 'xiudi/xd87' - }, - 'xd96': { - target: 'xiudi/xd96' - }, - 'xelus/dawn60': { - target: 'xelus/dawn60/rev1' - }, - 'xelus/valor': { - target: 'xelus/valor/rev1' - }, - yd60mq: { - target: 'ymdk/yd60mq/12led' - }, - ymd75: { - target: 'ymd75/rev1' - }, - z150_blackheart: { - target: 'viktus/z150_bh' - }, - z150_bh:{ - target: 'viktus/z150_bh' - }, - zeal60: { - target: 'wilba_tech/zeal60' - }, - zeal65: { - target: 'wilba_tech/zeal65' - }, - # Moved during 2022 Q1 cycle - 6ball: { - target: 'maple_computing/6ball' - }, - 7skb: { - target: 'salicylic_acid3/7skb' - }, - 7splus: { - target: 'salicylic_acid3/7splus' - }, - acr60: { - target: 'mechkeys/acr60' - }, - adalyn: { - target: 'tominabox1/adalyn' - }, - ajisai74: { - target: 'salicylic_acid3/ajisai74' - }, - aleth42: { - target: '25keys/aleth42' - }, - alicia_cook: { - target: 'ibnuda/alicia_cook' - }, - allison: { - target: 'prototypist/allison' - }, - allison_numpad: { - target: 'prototypist/allison_numpad' - }, - alu84: { - target: 'mechkeys/alu84' - }, - angel17: { - target: 'kakunpc/angel17' - }, - angel64/alpha: { - target: 'kakunpc/angel64/alpha' - }, - angel64/rev1: { - target: 'kakunpc/angel64/rev1' - }, - arch_36: { - target: 'obosob/arch_36' - }, - bakeneko60: { - target: 'kkatano/bakeneko60' - }, - bakeneko65/rev2: { - target: 'kkatano/bakeneko65/rev2' - }, - bakeneko65/rev3: { - target: 'kkatano/bakeneko65/rev3' - }, - bakeneko80: { - target: 'kkatano/bakeneko80' - }, - barleycorn: { - target: 'yiancardesigns/barleycorn' - }, - bat43/rev1: { - target: 'dailycraft/bat43/rev1' - }, - bat43/rev2: { - target: 'dailycraft/bat43/rev2' - }, - bigseries/1key: { - target: 'woodkeys/bigseries/1key' - }, - bigseries/2key: { - target: 'woodkeys/bigseries/2key' - }, - bigseries/3key: { - target: 'woodkeys/bigseries/3key' - }, - bigseries/4key: { - target: 'woodkeys/bigseries/4key' - }, - bkf: { - target: 'drhigsby/bkf' - }, - business_card/alpha: { - target: 'kakunpc/business_card/alpha' - }, - business_card/beta: { - target: 'kakunpc/business_card/beta' - }, - butterstick: { - target: 'gboards/butterstick' - }, - c39: { - target: 'maple_computing/c39' - }, - cassette42: { - target: '25keys/cassette42' - }, - chidori: { - target: 'kagizaraya/chidori' - }, - chili: { - target: 'ydkb/chili' - }, - chimera_ergo: { - target: 'glenpickle/chimera_ergo' - }, - chimera_ls: { - target: 'glenpickle/chimera_ls' - }, - chimera_ortho: { - target: 'glenpickle/chimera_ortho' - }, - chimera_ortho_plus: { - target: 'glenpickle/chimera_ortho_plus' - }, - choc_taro: { - target: 'kakunpc/choc_taro' - }, - choco60: { - target: 'recompile_keys/choco60' - }, - christmas_tree: { - target: 'maple_computing/christmas_tree' - }, - claw44/rev1: { - target: 'dailycraft/claw44/rev1' - }, - cocoa40: { - target: 'recompile_keys/cocoa40' - }, - comet46: { - target: 'satt/comet46' - }, - cu24: { - target: 'capsunlocked/cu24' - }, - cu75: { - target: 'capsunlocked/cu75' - }, - cu80: { - target: 'capsunlocked/cu80/v1' - }, - delilah: { - target: 'rainkeebs/delilah' - }, - diverge3: { - target: 'unikeyboard/diverge3' - }, - divergetm2: { - target: 'unikeyboard/divergetm2' - }, - dozen0: { - target: 'yynmt/dozen0' - }, - dubba175: { - target: 'drhigsby/dubba175' - }, - eggman: { - target: 'qpockets/eggman' - }, - ergo42: { - target: 'biacco42/ergo42' - }, - ergoarrows: { - target: 'salicylic_acid3/ergoarrows' - }, - ergodash/mini: { - target: 'omkbd/ergodash/mini' - }, - ergodash/rev1: { - target: 'omkbd/ergodash/rev1' - }, - ergodox_infinity: { - target: 'input_club/ergodox_infinity' - }, - ergotaco: { - target: 'gboards/ergotaco' - }, - espectro: { - target: 'mechkeys/espectro' - }, - felix: { - target: 'unikeyboard/felix' - }, - four_banger: { - target: 'bpiphany/four_banger' - }, - freyr: { - target: 'hnahkb/freyr' - }, - geminate60: { - target: 'weirdo/geminate60' - }, - gentleman65: { - target: 'jkeys_design/gentleman65' - }, - georgi: { - target: 'gboards/georgi' - }, - gergo: { - target: 'gboards/gergo' - }, - getta25: { - target: 'salicylic_acid3/getta25' - }, - gingham: { - target: 'yiancardesigns/gingham' - }, - gurindam: { - target: 'ibnuda/gurindam' - }, - halberd: { - target: 'kagizaraya/halberd' - }, - handwired/hillside/0_1: { - target: 'handwired/hillside/48' - } - hecomi/alpha: { - target: 'takashiski/hecomi/alpha' - }, - hid_liber: { - target: 'bpiphany/hid_liber' - }, - id67/default_rgb: { - target: 'idobao/id67/default_rgb' - }, - id67/rgb: { - target: 'idobao/id67/rgb' - }, - id80: { - target: 'idobao/id80/v2/ansi' - }, - idobao/id80/v1/ansi: { - target: 'idobao/id80/v2/ansi' - }, - idobao/id80/v1/iso: { - target: 'idobao/id80/v2/iso' - }, - id87: { - target: 'idobao/id87/v1' - }, - idobo: { - target: 'idobao/id75/v1' - }, - infinity60: { - target: 'input_club/infinity60' - }, - ivy/rev1: { - target: 'maple_computing/ivy/rev1' - }, - jisplit89: { - target: 'salicylic_acid3/jisplit89' - }, - jnao: { - target: 'maple_computing/jnao' - }, - just60: { - target: 'ydkb/just60' - }, - k_type: { - target: 'input_club/k_type' - }, - kagamidget: { - target: 'yynmt/kagamidget' - }, - kelowna/rgb64: { - target: 'weirdo/kelowna/rgb64' - }, - kprepublic/bm65hsrgb_iso: { - target: 'kprepublic/bm65hsrgb_iso/rev1' - }, - kprepublic/bm68hsrgb: { - target: 'kprepublic/bm68hsrgb/rev1' - }, - latin17rgb: { - target: 'latincompass/latin17rgb' - }, - latin47ble: { - target: 'latincompass/latin47ble' - }, - latin60rgb: { - target: 'latincompass/latin60rgb' - }, - latin64ble: { - target: 'latincompass/latin64ble' - }, - latin6rgb: { - target: 'latincompass/latin6rgb' - }, - latinpad: { - target: 'latincompass/latinpad' - }, - latinpadble: { - target: 'latincompass/latinpadble' - }, - launchpad/rev1: { - target: 'maple_computing/launchpad/rev1' - }, - lck75: { - target: 'lyso1/lck75' - }, - le_chiffre: { - target: 'tominabox1/le_chiffre' - }, - lefishe: { - target: 'lyso1/lefishe' - }, - lets_split_eh/eh: { - target: 'maple_computing/lets_split_eh/eh' - }, - ls_60: { - target: 'weirdo/ls_60' - }, - m3n3van: { - target: 'matthewdias/m3n3van' - }, - mechmini/v1: { - target: 'mechkeys/mechmini/v1' - }, - mechmini/v2: { - target: 'mechkeys/mechmini/v2' - }, - meira: { - target: 'woodkeys/meira' - }, - meishi: { - target: 'biacco42/meishi' - }, - meishi2: { - target: 'biacco42/meishi2' - }, - melody96: { - target: 'ymdk/melody96' - }, - minidox/rev1: { - target: 'maple_computing/minidox/rev1' - }, - minim: { - target: 'matthewdias/minim' - }, - mio: { - target: 'recompile_keys/mio' - }, - model_v: { - target: 'matthewdias/model_v' - }, - montex: { - target: 'idobao/montex/v1' - }, - mt40: { - target: 'mt/mt40' - }, - mt64rgb: { - target: 'mt/mt64rgb' - }, - mt84: { - target: 'mt/mt84' - }, - mt980: { - target: 'mt/mt980' - }, - nafuda: { - target: 'salicylic_acid3/nafuda' - }, - naiping/np64: { - target: 'weirdo/naiping/np64' - }, - naiping/nphhkb: { - target: 'weirdo/naiping/nphhkb' - }, - naiping/npminila: { - target: 'weirdo/naiping/npminila' - }, - naked48: { - target: 'salicylic_acid3/naked48' - }, - naked60: { - target: 'salicylic_acid3/naked60' - }, - naked64: { - target: 'salicylic_acid3/naked64' - }, - namecard2x4: { - target: 'takashiski/namecard2x4' - }, - navi10: { - target: 'keyhive/navi10' - }, - nebula12: { - target: 'spaceholdings/nebula12' - }, - nebula68: { - target: 'spaceholdings/nebula68' - }, - nebula68b: { - target: 'spaceholdings/nebula68b' - }, - niu_mini: { - target: 'kbdfans/niu_mini' - }, - nk1: { - target: 'novelkeys/nk1' - }, - nk65: { - target: 'novelkeys/nk65' - }, - nk87: { - target: 'novelkeys/nk87' - }, - nknl7en: { - target: 'salicylic_acid3/nknl7en' - }, - nknl7jp: { - target: 'salicylic_acid3/nknl7jp' - }, - nomu30: { - target: 'recompile_keys/nomu30' - }, - novelpad: { - target: 'novelkeys/novelpad' - }, - ogurec: { - target: 'drhigsby/ogurec' - }, - otaku_split/rev0: { - target: 'takashiski/otaku_split/rev0' - }, - otaku_split/rev1: { - target: 'takashiski/otaku_split/rev1' - }, - owl8: { - target: 'dailycraft/owl8' - }, - packrat: { - target: 'drhigsby/packrat' - }, - pistachio: { - target: 'rate/pistachio' - }, - pistachio_mp: { - target: 'rate/pistachio_mp' - }, - pistachio_pro: { - target: 'rate/pistachio_pro' - }, - plexus75: { - target: 'checkerboards/plexus75' - }, - pursuit40: { - target: 'checkerboards/pursuit40' - }, - qaz: { - target: 'tominabox1/qaz' - }, - quark: { - target: 'checkerboards/quark' - }, - rabbit_capture_plan: { - target: 'kakunpc/rabbit_capture_plan' - }, - rainkeeb: { - target: 'rainkeebs/rainkeeb' - }, - reviung33: { - target: 'reviung/reviung33' - }, - reviung34: { - target: 'reviung/reviung34' - }, - reviung39: { - target: 'reviung/reviung39' - }, - reviung41: { - target: 'reviung/reviung41' - }, - reviung5: { - target: 'reviung/reviung5' - }, - reviung53: { - target: 'reviung/reviung53' - }, - reviung61: { - target: 'reviung/reviung61' - }, - runner3680/3x6: { - target: 'omkbd/runner3680/3x6' - }, - runner3680/3x7: { - target: 'omkbd/runner3680/3x7' - }, - runner3680/3x8: { - target: 'omkbd/runner3680/3x8' - }, - runner3680/4x6: { - target: 'omkbd/runner3680/4x6' - }, - runner3680/4x7: { - target: 'omkbd/runner3680/4x7' - }, - runner3680/4x8: { - target: 'omkbd/runner3680/4x8' - }, - runner3680/5x6: { - target: 'omkbd/runner3680/5x6' - }, - runner3680/5x6_5x8: { - target: 'omkbd/runner3680/5x6_5x8' - }, - runner3680/5x7: { - target: 'omkbd/runner3680/5x7' - }, - runner3680/5x8: { - target: 'omkbd/runner3680/5x8' - }, - scarletbandana: { - target: 'woodkeys/scarletbandana' - }, - scythe: { - target: 'kagizaraya/scythe' - }, - seigaiha: { - target: 'yiancardesigns/seigaiha' - }, - setta21: { - target: 'salicylic_acid3/setta21' - }, - space_space/rev1: { - target: 'qpockets/space_space/rev1' - }, - space_space/rev2: { - target: 'qpockets/space_space/rev2' - }, - spiderisland/winry25tc: { - target: 'winry/winry25tc' - }, - splitreus62: { - target: 'nacly/splitreus62' - }, - squiggle/rev1: { - target: 'ibnuda/squiggle/rev1' - }, - standaside: { - target: 'edi/standaside' - }, - steal_this_keyboard: { - target: 'obosob/steal_this_keyboard' - }, - stella: { - target: 'hnahkb/stella' - }, - suihankey/alpha: { - target: 'kakunpc/suihankey/alpha' - }, - suihankey/rev1: { - target: 'kakunpc/suihankey/rev1' - }, - suihankey/split: { - target: 'kakunpc/suihankey/split' - }, - the_ruler: { - target: 'maple_computing/the_ruler' - }, - thedogkeyboard: { - target: 'kakunpc/thedogkeyboard' - }, - tiger910: { - target: 'weirdo/tiger910' - }, - treadstone32: { - target: 'marksard/treadstone32' - }, - treadstone48/rev1: { - target: 'marksard/treadstone48/rev1' - }, - treadstone48/rev2: { - target: 'marksard/treadstone48/rev2' - }, - txuu: { - target: 'matthewdias/txuu' - }, - ua62: { - target: 'nacly/ua62' - }, - underscore33/rev1: { - target: 'tominabox1/underscore33/rev1' - }, - underscore33/rev2: { - target: 'tominabox1/underscore33/rev2' - }, - uno: { - target: 'keyhive/uno' - }, - ut472: { - target: 'keyhive/ut472' - }, - vn66: { - target: 'hnahkb/vn66' - }, - wallaby: { - target: 'kkatano/wallaby' - }, - wanten: { - target: 'qpockets/wanten' - }, - 'wheatfield/blocked65': { - target: 'mt/blocked65' - }, - 'wheatfield/split75': { - target: 'mt/split75' - }, - whitefox: { - target: 'input_club/whitefox' - }, - wings42/rev1: { - target: 'dailycraft/wings42/rev1' - }, - wings42/rev1_extkeys: { - target: 'dailycraft/wings42/rev1_extkeys' - }, - wings42/rev2: { - target: 'dailycraft/wings42/rev2' - }, - yasui: { - target: 'rainkeebs/yasui' - }, - yd60mq: { - target: 'ymdk/yd60mq' - }, - yd68: { - target: 'ydkb/yd68' - }, - ymd75: { - target: 'ymdk/ymd75' - }, - ymd96: { - target: 'ymdk/ymd96' - }, - ymdk_np21: { - target: 'ymdk/np21' - }, - yurei: { - target: 'kkatano/yurei' - }, - zinc: { - target: '25keys/zinc' - }, - zinc/rev1: { - target: '25keys/zinc/rev1' - }, - zinc/reva: { - target: '25keys/zinc/reva' - } -} diff --git a/data/schemas/keyboard.jsonschema b/data/schemas/keyboard.jsonschema index bc07eaf5fb..daf54141a8 100644 --- a/data/schemas/keyboard.jsonschema +++ b/data/schemas/keyboard.jsonschema @@ -601,7 +601,10 @@ "type": "object", "additionalProperties": false, "properties": { - "device_ver": {"$ref": "qmk.definitions.v1#/hex_number_4d"}, # Deprecated + "device_ver": { + "$ref": "qmk.definitions.v1#/hex_number_4d", + "$comment": "Deprecated: use device_version instead" + }, "device_version": {"$ref": "qmk.definitions.v1#/bcd_version"}, "force_nkro": {"type": "boolean"}, "pid": {"$ref": "qmk.definitions.v1#/hex_number_4d"}, diff --git a/docs/data_driven_config.md b/docs/data_driven_config.md index 1a2e4ca54a..ba287f5688 100644 --- a/docs/data_driven_config.md +++ b/docs/data_driven_config.md @@ -41,7 +41,7 @@ In other cases you should group like options together in an `object`. This is pa ### Add a mapping -In most cases you can add a simple mapping. These are maintained as JSON files in `data/mappings/info_config.json` and `data/mappings/info_rules.json`, and control mapping for `config.h` and `rules.mk`, respectively. Each mapping is keyed by the `config.h` or `rules.mk` variable, and the value is a hash with the following keys: +In most cases you can add a simple mapping. These are maintained as JSON files in `data/mappings/info_config.hjson` and `data/mappings/info_rules.hjson`, and control mapping for `config.h` and `rules.mk`, respectively. Each mapping is keyed by the `config.h` or `rules.mk` variable, and the value is a hash with the following keys: * `info_key`: (required) The location within `info.json` for this value. See below. * `value_type`: (optional) Default `raw`. The format for this variable's value. See below. diff --git a/lib/python/qmk/cli/generate/api.py b/lib/python/qmk/cli/generate/api.py index 0f29cd2327..ddb3a0772e 100755 --- a/lib/python/qmk/cli/generate/api.py +++ b/lib/python/qmk/cli/generate/api.py @@ -98,7 +98,7 @@ def generate_api(cli): # Generate data for the global files keyboard_list = sorted(kb_all) - keyboard_aliases = json_load(Path('data/mappings/keyboard_aliases.json')) + keyboard_aliases = json_load(Path('data/mappings/keyboard_aliases.hjson')) keyboard_metadata = { 'last_updated': current_datetime(), 'keyboards': keyboard_list, diff --git a/lib/python/qmk/cli/generate/config_h.py b/lib/python/qmk/cli/generate/config_h.py index f64daba134..31b8d70635 100755 --- a/lib/python/qmk/cli/generate/config_h.py +++ b/lib/python/qmk/cli/generate/config_h.py @@ -70,7 +70,7 @@ def generate_matrix_size(kb_info_json, config_h_lines): def generate_config_items(kb_info_json, config_h_lines): """Iterate through the info_config map to generate basic config values. """ - info_config_map = json_load(Path('data/mappings/info_config.json')) + info_config_map = json_load(Path('data/mappings/info_config.hjson')) for config_key, info_dict in info_config_map.items(): info_key = info_dict['info_key'] diff --git a/lib/python/qmk/cli/generate/rules_mk.py b/lib/python/qmk/cli/generate/rules_mk.py index 1d708f371e..fc272da6c6 100755 --- a/lib/python/qmk/cli/generate/rules_mk.py +++ b/lib/python/qmk/cli/generate/rules_mk.py @@ -62,7 +62,7 @@ def generate_rules_mk(cli): cli.subcommands['generate-rules-mk'].print_help() return False - info_rules_map = json_load(Path('data/mappings/info_rules.json')) + info_rules_map = json_load(Path('data/mappings/info_rules.hjson')) rules_mk_lines = [GPL2_HEADER_SH_LIKE, GENERATED_HEADER_SH_LIKE] # Iterate through the info_rules map to generate basic rules diff --git a/lib/python/qmk/cli/new/keyboard.py b/lib/python/qmk/cli/new/keyboard.py index 8d4def1bef..251ad919dd 100644 --- a/lib/python/qmk/cli/new/keyboard.py +++ b/lib/python/qmk/cli/new/keyboard.py @@ -210,7 +210,7 @@ def new_keyboard(cli): # Preprocess any development_board presets if mcu in dev_boards: - defaults_map = json_load(Path('data/mappings/defaults.json')) + defaults_map = json_load(Path('data/mappings/defaults.hjson')) board = defaults_map['development_board'][mcu] mcu = board['processor'] diff --git a/lib/python/qmk/commands.py b/lib/python/qmk/commands.py index 07826a4866..5561a354c5 100644 --- a/lib/python/qmk/commands.py +++ b/lib/python/qmk/commands.py @@ -214,7 +214,7 @@ def parse_configurator_json(configurator_file): exit(1) orig_keyboard = user_keymap['keyboard'] - aliases = json_load(Path('data/mappings/keyboard_aliases.json')) + aliases = json_load(Path('data/mappings/keyboard_aliases.hjson')) if orig_keyboard in aliases: if 'target' in aliases[orig_keyboard]: diff --git a/lib/python/qmk/info.py b/lib/python/qmk/info.py index 5ca282b2d3..5dc8b9c5fe 100644 --- a/lib/python/qmk/info.py +++ b/lib/python/qmk/info.py @@ -483,7 +483,7 @@ def _extract_config_h(info_data, config_c): """ # Pull in data from the json map dotty_info = dotty(info_data) - info_config_map = json_load(Path('data/mappings/info_config.json')) + info_config_map = json_load(Path('data/mappings/info_config.hjson')) for config_key, info_dict in info_config_map.items(): info_key = info_dict['info_key'] @@ -529,7 +529,7 @@ def _extract_config_h(info_data, config_c): def _process_defaults(info_data): """Process any additional defaults based on currently discovered information """ - defaults_map = json_load(Path('data/mappings/defaults.json')) + defaults_map = json_load(Path('data/mappings/defaults.hjson')) for default_type in defaults_map.keys(): thing_map = defaults_map[default_type] if default_type in info_data: @@ -555,7 +555,7 @@ def _extract_rules_mk(info_data, rules): # Pull in data from the json map dotty_info = dotty(info_data) - info_rules_map = json_load(Path('data/mappings/info_rules.json')) + info_rules_map = json_load(Path('data/mappings/info_rules.hjson')) for rules_key, info_dict in info_rules_map.items(): info_key = info_dict['info_key'] diff --git a/lib/python/qmk/keyboard.py b/lib/python/qmk/keyboard.py index 686d4fc403..6ddbba8fa5 100644 --- a/lib/python/qmk/keyboard.py +++ b/lib/python/qmk/keyboard.py @@ -69,7 +69,7 @@ def keyboard_folder(keyboard): This checks aliases and DEFAULT_FOLDER to resolve the actual path for a keyboard. """ - aliases = json_load(Path('data/mappings/keyboard_aliases.json')) + aliases = json_load(Path('data/mappings/keyboard_aliases.hjson')) if keyboard in aliases: keyboard = aliases[keyboard].get('target', keyboard) -- cgit 1.4.1 From 7666c966d54522aabad8be135a5793bd432e78eb Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Tue, 8 Nov 2022 03:03:02 +0000 Subject: Publish hjson files as json (#18996) --- lib/python/qmk/cli/generate/api.py | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) (limited to 'lib/python') diff --git a/lib/python/qmk/cli/generate/api.py b/lib/python/qmk/cli/generate/api.py index ddb3a0772e..a98a12b628 100755 --- a/lib/python/qmk/cli/generate/api.py +++ b/lib/python/qmk/cli/generate/api.py @@ -27,6 +27,23 @@ def _resolve_keycode_specs(output_folder): output_file = output_folder / f'constants/keycodes_{version}.json' output_file.write_text(json.dumps(overall, indent=4), encoding='utf-8') + # Purge files consumed by 'load_spec' + shutil.rmtree(output_folder / 'constants/keycodes/') + + +def _filtered_copy(src, dst): + src = Path(src) + dst = Path(dst) + + if dst.suffix == '.hjson': + data = json_load(src) + + dst = dst.with_suffix('.json') + dst.write_text(json.dumps(data, indent=4), encoding='utf-8') + return dst + + return shutil.copy2(src, dst) + def _filtered_keyboard_list(): """Perform basic filtering of list_keyboards @@ -58,7 +75,7 @@ def generate_api(cli): shutil.rmtree(BUILD_API_PATH) shutil.copytree(TEMPLATE_PATH, BUILD_API_PATH) - shutil.copytree(DATA_PATH, v1_dir) + shutil.copytree(DATA_PATH, v1_dir, copy_function=_filtered_copy) # Filter down when required keyboard_list = _filtered_keyboard_list() -- cgit 1.4.1 From 9daf77b59373196839d022d621f015e074aa427a Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Wed, 9 Nov 2022 02:47:07 +1100 Subject: Add raw output option for QGF/QFF files. (#18998) --- docs/quantum_painter.md | 10 ++++++---- lib/python/qmk/cli/painter/convert_graphics.py | 7 +++++++ lib/python/qmk/cli/painter/make_font.py | 12 ++++++++++-- 3 files changed, 23 insertions(+), 6 deletions(-) (limited to 'lib/python') diff --git a/docs/quantum_painter.md b/docs/quantum_painter.md index ed9cec171b..781b467a45 100644 --- a/docs/quantum_painter.md +++ b/docs/quantum_painter.md @@ -55,10 +55,11 @@ This command converts images to a format usable by QMK, i.e. the QGF File Format **Usage**: ``` -usage: qmk painter-convert-graphics [-h] [-d] [-r] -f FORMAT [-o OUTPUT] -i INPUT [-v] +usage: qmk painter-convert-graphics [-h] [-w] [-d] [-r] -f FORMAT [-o OUTPUT] -i INPUT [-v] -optional arguments: +options: -h, --help show this help message and exit + -w, --raw Writes out the QGF file as raw data instead of c/h combo. -d, --no-deltas Disables the use of delta frames when encoding animations. -r, --no-rle Disables the use of RLE when encoding images. -f FORMAT, --format FORMAT @@ -146,10 +147,11 @@ This command expects an image that conforms to the following format: **Usage**: ``` -usage: qmk painter-convert-font-image [-h] [-r] -f FORMAT [-u UNICODE_GLYPHS] [-n] [-o OUTPUT] [-i INPUT] +usage: qmk painter-convert-font-image [-h] [-w] [-r] -f FORMAT [-u UNICODE_GLYPHS] [-n] [-o OUTPUT] [-i INPUT] -optional arguments: +options: -h, --help show this help message and exit + -w, --raw Writes out the QFF file as raw data instead of c/h combo. -r, --no-rle Disable the use of RLE to minimise converted image size. -f FORMAT, --format FORMAT Output format, valid types: pal256, pal16, pal4, pal2, mono256, mono16, mono4, mono2 diff --git a/lib/python/qmk/cli/painter/convert_graphics.py b/lib/python/qmk/cli/painter/convert_graphics.py index bbc30d26ff..2519c49b25 100644 --- a/lib/python/qmk/cli/painter/convert_graphics.py +++ b/lib/python/qmk/cli/painter/convert_graphics.py @@ -15,6 +15,7 @@ from PIL import Image @cli.argument('-f', '--format', required=True, help='Output format, valid types: %s' % (', '.join(valid_formats.keys()))) @cli.argument('-r', '--no-rle', arg_only=True, action='store_true', help='Disables the use of RLE when encoding images.') @cli.argument('-d', '--no-deltas', arg_only=True, action='store_true', help='Disables the use of delta frames when encoding animations.') +@cli.argument('-w', '--raw', arg_only=True, action='store_true', help='Writes out the QGF file as raw data instead of c/h combo.') @cli.subcommand('Converts an input image to something QMK understands') def painter_convert_graphics(cli): """Converts an image file to a format that Quantum Painter understands. @@ -53,6 +54,12 @@ def painter_convert_graphics(cli): input_img.save(out_data, "QGF", use_deltas=(not cli.args.no_deltas), use_rle=(not cli.args.no_rle), qmk_format=format, verbose=cli.args.verbose) out_bytes = out_data.getvalue() + if cli.args.raw: + raw_file = cli.args.output / (cli.args.input.stem + ".qgf") + with open(raw_file, 'wb') as raw: + raw.write(out_bytes) + return + # Work out the text substitutions for rendering the output data subs = { 'generated_type': 'image', diff --git a/lib/python/qmk/cli/painter/make_font.py b/lib/python/qmk/cli/painter/make_font.py index 0762843fd3..c0189920d2 100644 --- a/lib/python/qmk/cli/painter/make_font.py +++ b/lib/python/qmk/cli/painter/make_font.py @@ -33,6 +33,7 @@ def painter_make_font_image(cli): @cli.argument('-u', '--unicode-glyphs', default='', help='Also generate the specified unicode glyphs.') @cli.argument('-f', '--format', required=True, help='Output format, valid types: %s' % (', '.join(valid_formats.keys()))) @cli.argument('-r', '--no-rle', arg_only=True, action='store_true', help='Disable the use of RLE to minimise converted image size.') +@cli.argument('-w', '--raw', arg_only=True, action='store_true', help='Writes out the QFF file as raw data instead of c/h combo.') @cli.subcommand('Converts an input font image to something QMK firmware understands') def painter_convert_font_image(cli): # Work out the format @@ -53,6 +54,13 @@ def painter_convert_font_image(cli): # Render out the data out_data = BytesIO() font.save_to_qff(format, (False if cli.args.no_rle else True), out_data) + out_bytes = out_data.getvalue() + + if cli.args.raw: + raw_file = cli.args.output / (cli.args.input.stem + ".qff") + with open(raw_file, 'wb') as raw: + raw.write(out_bytes) + return # Work out the text substitutions for rendering the output data subs = { @@ -62,8 +70,8 @@ def painter_convert_font_image(cli): 'year': datetime.date.today().strftime("%Y"), 'input_file': cli.args.input.name, 'sane_name': re.sub(r"[^a-zA-Z0-9]", "_", cli.args.input.stem), - 'byte_count': out_data.getbuffer().nbytes, - 'bytes_lines': render_bytes(out_data.getbuffer().tobytes()), + 'byte_count': len(out_bytes), + 'bytes_lines': render_bytes(out_bytes), 'format': cli.args.format, } -- cgit 1.4.1 From d789b4b7d9872112dc3389c9f6afe39f537c3723 Mon Sep 17 00:00:00 2001 From: Ryan Date: Thu, 10 Nov 2022 01:02:44 +1100 Subject: Improve LED config parsing error messages (#19007) --- lib/python/qmk/c_parse.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'lib/python') diff --git a/lib/python/qmk/c_parse.py b/lib/python/qmk/c_parse.py index c14eb490fa..3d73e66091 100644 --- a/lib/python/qmk/c_parse.py +++ b/lib/python/qmk/c_parse.py @@ -216,9 +216,9 @@ def _validate_led_config(matrix, matrix_rows, matrix_indexes, position, position if len(matrix) != matrix_rows and len(matrix) != (matrix_rows / 2): raise ValueError("Unable to parse g_led_config matrix data") if len(position) != len(flags): - raise ValueError("Unable to parse g_led_config position data") + raise ValueError(f"Number of g_led_config physical positions ({len(position)}) does not match number of flags ({len(flags)})") if len(matrix_indexes) and (max(matrix_indexes) >= len(flags)): - raise ValueError("OOB within g_led_config matrix data") + raise ValueError(f"LED index {max(matrix_indexes)} is OOB in g_led_config - should be < {len(flags)}") if not all(isinstance(n, int) for n in matrix_indexes): raise ValueError("matrix indexes are not all ints") if (len(position_raw) % 2) != 0: -- cgit 1.4.1 From dc9162438d8b16c7534b82b6ead42d104f823ffb Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Wed, 9 Nov 2022 15:50:43 +0000 Subject: Reject json with duplicate keys? (#18108) --- lib/python/qmk/json_schema.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) (limited to 'lib/python') diff --git a/lib/python/qmk/json_schema.py b/lib/python/qmk/json_schema.py index 01175146b5..934e2f841f 100644 --- a/lib/python/qmk/json_schema.py +++ b/lib/python/qmk/json_schema.py @@ -10,7 +10,18 @@ import jsonschema from milc import cli -def json_load(json_file): +def _dict_raise_on_duplicates(ordered_pairs): + """Reject duplicate keys.""" + d = {} + for k, v in ordered_pairs: + if k in d: + raise ValueError("duplicate key: %r" % (k,)) + else: + d[k] = v + return d + + +def json_load(json_file, strict=True): """Load a json file from disk. Note: file must be a Path object. @@ -20,7 +31,7 @@ def json_load(json_file): # Not necessary if the data is provided via stdin if isinstance(json_file, Path): json_file = json_file.open(encoding='utf-8') - return hjson.load(json_file) + return hjson.load(json_file, object_pairs_hook=_dict_raise_on_duplicates if strict else None) except (json.decoder.JSONDecodeError, hjson.HjsonDecodeError) as e: cli.log.error('Invalid JSON encountered attempting to load {fg_cyan}%s{fg_reset}:\n\t{fg_red}%s', json_file, e) -- cgit 1.4.1 From d3073ef4943c70a3942ac91bb46fdc1a90f9e566 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Sun, 13 Nov 2022 08:05:46 -0800 Subject: Add pointing device support to data driven config (#18215) Co-authored-by: Joel Challis --- data/mappings/info_config.hjson | 18 ++++++++++ data/mappings/info_rules.hjson | 2 ++ data/schemas/keyboard.jsonschema | 63 +++++++++++++++++++++++++++++++++ lib/python/qmk/cli/generate/config_h.py | 13 +++++++ 4 files changed, 96 insertions(+) (limited to 'lib/python') diff --git a/data/mappings/info_config.hjson b/data/mappings/info_config.hjson index a013e98b34..a80d5cff6f 100644 --- a/data/mappings/info_config.hjson +++ b/data/mappings/info_config.hjson @@ -11,6 +11,10 @@ // invalid: Default `false`. Set to `true` to generate errors when a value exists // replace_with: use with a key marked deprecated or invalid to designate a replacement "AUDIO_VOICES": {"info_key": "audio.voices", "value_type": "bool"}, + "AUTO_MOUSE_DEFAULT_LAYER": {"info_key": "pointing_device.auto_mouse.default_layer"}, + "AUTO_MOUSE_TIME": {"info_key": "pointing_device.auto_mouse.time"}, + "AUTO_MOUSE_DELAY": {"info_key": "pointing_device.auto_mouse.delay"}, + "AUTO_MOUSE_DEBOUNCE": {"info_key": "pointing_device.auto_mouse.debounce"}, "BACKLIGHT_BREATHING": {"info_key": "backlight.breathing", "value_type": "bool"}, "BREATHING_PERIOD": {"info_key": "backlight.breathing_period", "value_type": "int"}, "BACKLIGHT_LEVELS": {"info_key": "backlight.levels", "value_type": "int"}, @@ -87,6 +91,19 @@ "RGB_MATRIX_VAL_STEP": {"info_key": "rgb_matrix.val_steps", "value_type": "int"}, "RGB_MATRIX_SPD_STEP": {"info_key": "rgb_matrix.speed_steps", "value_type": "int"}, "RGBW": {"info_key": "rgblight.rgbw", "value_type": "bool"}, + "POINTING_DEVICE_AUTO_MOUSE_ENABLE": {"info_key": "pointing_device.auto_mouse.enabled"}, + "POINTING_DEVICE_CS_PIN": {"info_key": "pointing_device.pins.cs"}, + "POINTING_DEVICE_INVERT_X": {"info_key": "pointing_device.invert_x", "value_type": "bool"}, + "POINTING_DEVICE_INVERT_X_RIGHT": {"info_key": "split.pointing_device.right.invert_x", "value_type": "bool"}, + "POINTING_DEVICE_INVERT_Y": {"info_key": "pointing_device.invert_y", "value_type": "bool"}, + "POINTING_DEVICE_INVERT_Y_RIGHT": {"info_key": "split.pointing_device.right.invert_y", "value_type": "bool"}, + "POINTING_DEVICE_MOTION_PIN": {"info_key": "pointing_device.pins.motion"}, + "POINTING_DEVICE_SDIO_PIN": {"info_key": "pointing_device.pins.sdio"}, + "POINTING_DEVICE_SCLK_PIN": {"info_key": "pointing_device.pins.sclk"}, + "POINTING_DEVICE_TASK_THROTTLE_MS": {"info_key": "pointing_device.throttle", "value_type": "int"}, + "POINTING_DEVICE_GESTURES_CURSOR_GLIDE_ENABLE": {"info_key": "pointing_device.gestures.cursor_glide", "value_type": "bool"}, + "POINTING_DEVICE_GESTURES_SCROLL_ENABLE": {"info_key": "pointing_device.gestures.scroll", "value_type": "bool"}, + "PRODUCT": {"info_key": "keyboard_name", "warn_duplicate": false, "value_type": "str"}, "PRODUCT_ID": {"info_key": "usb.pid", "value_type": "hex"}, "VENDOR_ID": {"info_key": "usb.vid", "value_type": "hex"}, @@ -99,6 +116,7 @@ "SECURE_IDLE_TIMEOUT": {"info_key": "secure.idle_timeout", "value_type": "int"}, "SENDSTRING_BELL": {"info_key": "audio.macro_beep", "value_type": "bool"}, "SPLIT_MODS_ENABLE": {"info_key": "split.transport.sync_modifiers", "value_type": "bool"}, + "SPLIT_POINTING_ENABLE": {"info_key": "split.transport.sync_pointing", "value_type": "bool"}, "SPLIT_TRANSPORT_MIRROR": {"info_key": "split.transport.sync_matrix_state", "value_type": "bool"}, "SPLIT_USB_DETECT": {"info_key": "split.usb_detect.enabled", "value_type": "bool"}, "SPLIT_USB_TIMEOUT": {"info_key": "split.usb_detect.timeout", "value_type": "int"}, diff --git a/data/mappings/info_rules.hjson b/data/mappings/info_rules.hjson index 2f8656c4bf..2cc465f30d 100644 --- a/data/mappings/info_rules.hjson +++ b/data/mappings/info_rules.hjson @@ -36,6 +36,8 @@ "PS2_ENABLE": {"info_key": "ps2.enabled", "value_type": "bool"}, "PS2_MOUSE_ENABLE": {"info_key": "ps2.mouse_enabled", "value_type": "bool"}, "PS2_DRIVER": {"info_key": "ps2.driver"}, + "POINTING_DEVICE_ENABLE": {"info_key": "pointing_device.enabled", "value_type": "bool"}, + "POINTING_DEVICE_DRIVER": {"info_key": "pointing_device.driver"}, // Items we want flagged in lint "CTPC": {"info_key": "_deprecated.ctpc", "deprecated": true, "replace_with": "CONVERT_TO=proton_c"}, diff --git a/data/schemas/keyboard.jsonschema b/data/schemas/keyboard.jsonschema index daf54141a8..d5f4f392d7 100644 --- a/data/schemas/keyboard.jsonschema +++ b/data/schemas/keyboard.jsonschema @@ -363,6 +363,48 @@ } } }, + "pointing_device": { + "type": "object", + "properties": { + "enabled": {"type": "boolean"}, + "driver": {"type": "string"}, + "auto_mouse": { + "type": "object", + "properties": { + "enabled": {"type": "boolean"}, + "default_layer": {"type": "qmk.definitions.v1#/unsigned_int_8"}, + "time": {"type": "qmk.definitions.v1#/unsigned_int"}, + "delay": {"type": "qmk.definitions.v1#/unsigned_int"}, + "debounce": {"type": "qmk.definitions.v1#/unsigned_int"} + } + } + "pins": { + "type": "object", + "additionalProperties": false, + "properties": { + "motion": {"$ref": "qmk.definitions.v1#/mcu_pin"}, + "cs": {"$ref": "qmk.definitions.v1#/mcu_pin"}, + "sdio": {"$ref": "qmk.definitions.v1#/mcu_pin"}, + "sclk": {"$ref": "qmk.definitions.v1#/mcu_pin"} + } + }, + "throttle": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}, + "invert_x": {"type": "boolean"}, + "invert_y": {"type": "boolean"}, + "gestures": { + "type": "object", + "properties": { + "cursor_glide": {"type": "boolean"}, + "scroll": {"type": "boolean"} + } + }, + "rotation": { + "type": "integer", + "minimum": 0, + "enum": [0, 90, 180, 270] + } + } + }, "rgb_matrix": { "type": "object", "properties": { @@ -544,6 +586,26 @@ "type": "string", "enum": ["eeprom", "left", "matrix_grid", "pin", "right"] }, + "pointing_device": { + "right": { + "type": "object", + "additionalProperties": false, + "type": "object", + "properties": { + "side": { + "type": "string", + "enum": ["left", "right", "combined"] + }, + "invert_x": {"type": "boolean"}, + "invert_y": {"type": "boolean"}, + "rotation": { + "type": "integer", + "minimum": 0, + "enum": [0, 90, 180, 270] + } + } + } + }, "soft_serial_pin": {"$ref": "qmk.definitions.v1#/mcu_pin"}, "soft_serial_speed": { "type": "integer", @@ -560,6 +622,7 @@ }, "sync_matrix_state": {"type": "boolean"}, "sync_modifiers": {"type": "boolean"}, + "sync_pointing": {"type": "boolean"}, "watchdog": {"type": "boolean"}, "watchdog_timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"} } diff --git a/lib/python/qmk/cli/generate/config_h.py b/lib/python/qmk/cli/generate/config_h.py index 31b8d70635..51051ef610 100755 --- a/lib/python/qmk/cli/generate/config_h.py +++ b/lib/python/qmk/cli/generate/config_h.py @@ -126,6 +126,13 @@ def generate_encoder_config(encoder_json, config_h_lines, postfix=''): config_h_lines.append(generate_define(f'ENCODER_RESOLUTIONS{postfix}', f'{{ {", ".join(map(str,resolutions))} }}')) +def generate_pointing_device_config(pointing_device_json, config_h_lines, postfix=''): + + rotation = pointing_device_json.get('rotation', 0) + + generate_define(f'POINTING_DEVICE_ROTATION_{rotation}{postfix}') + + def generate_split_config(kb_info_json, config_h_lines): """Generate the config.h lines for split boards.""" if 'primary' in kb_info_json['split']: @@ -156,6 +163,9 @@ def generate_split_config(kb_info_json, config_h_lines): if 'right' in kb_info_json['split'].get('encoder', {}): generate_encoder_config(kb_info_json['split']['encoder']['right'], config_h_lines, '_RIGHT') + if 'right' in kb_info_json['split'].get('pointing_device', {}): + generate_pointing_device_config(kb_info_json['split']['pointing_device']['right'], config_h_lines, '_RIGHT') + def generate_led_animations_config(led_feature_json, config_h_lines, prefix): for animation in led_feature_json.get('animations', {}): @@ -207,5 +217,8 @@ def generate_config_h(cli): if 'rgblight' in kb_info_json: generate_led_animations_config(kb_info_json['rgblight'], config_h_lines, 'RGBLIGHT_EFFECT_') + if 'pointing_device' in kb_info_json: + generate_pointing_device_config(kb_info_json['pointing_device'], config_h_lines) + # Show the results dump_lines(cli.args.output, config_h_lines, cli.args.quiet) -- cgit 1.4.1 From 1a3f2130d5feeeccada90ebb1d96cde5232459e0 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 14 Nov 2022 22:44:09 -0800 Subject: Revert "Add pointing device support to data driven config (#18215)" (#19063) --- data/mappings/info_config.hjson | 18 ---------- data/mappings/info_rules.hjson | 2 -- data/schemas/keyboard.jsonschema | 62 --------------------------------- lib/python/qmk/cli/generate/config_h.py | 13 ------- 4 files changed, 95 deletions(-) (limited to 'lib/python') diff --git a/data/mappings/info_config.hjson b/data/mappings/info_config.hjson index a80d5cff6f..a013e98b34 100644 --- a/data/mappings/info_config.hjson +++ b/data/mappings/info_config.hjson @@ -11,10 +11,6 @@ // invalid: Default `false`. Set to `true` to generate errors when a value exists // replace_with: use with a key marked deprecated or invalid to designate a replacement "AUDIO_VOICES": {"info_key": "audio.voices", "value_type": "bool"}, - "AUTO_MOUSE_DEFAULT_LAYER": {"info_key": "pointing_device.auto_mouse.default_layer"}, - "AUTO_MOUSE_TIME": {"info_key": "pointing_device.auto_mouse.time"}, - "AUTO_MOUSE_DELAY": {"info_key": "pointing_device.auto_mouse.delay"}, - "AUTO_MOUSE_DEBOUNCE": {"info_key": "pointing_device.auto_mouse.debounce"}, "BACKLIGHT_BREATHING": {"info_key": "backlight.breathing", "value_type": "bool"}, "BREATHING_PERIOD": {"info_key": "backlight.breathing_period", "value_type": "int"}, "BACKLIGHT_LEVELS": {"info_key": "backlight.levels", "value_type": "int"}, @@ -91,19 +87,6 @@ "RGB_MATRIX_VAL_STEP": {"info_key": "rgb_matrix.val_steps", "value_type": "int"}, "RGB_MATRIX_SPD_STEP": {"info_key": "rgb_matrix.speed_steps", "value_type": "int"}, "RGBW": {"info_key": "rgblight.rgbw", "value_type": "bool"}, - "POINTING_DEVICE_AUTO_MOUSE_ENABLE": {"info_key": "pointing_device.auto_mouse.enabled"}, - "POINTING_DEVICE_CS_PIN": {"info_key": "pointing_device.pins.cs"}, - "POINTING_DEVICE_INVERT_X": {"info_key": "pointing_device.invert_x", "value_type": "bool"}, - "POINTING_DEVICE_INVERT_X_RIGHT": {"info_key": "split.pointing_device.right.invert_x", "value_type": "bool"}, - "POINTING_DEVICE_INVERT_Y": {"info_key": "pointing_device.invert_y", "value_type": "bool"}, - "POINTING_DEVICE_INVERT_Y_RIGHT": {"info_key": "split.pointing_device.right.invert_y", "value_type": "bool"}, - "POINTING_DEVICE_MOTION_PIN": {"info_key": "pointing_device.pins.motion"}, - "POINTING_DEVICE_SDIO_PIN": {"info_key": "pointing_device.pins.sdio"}, - "POINTING_DEVICE_SCLK_PIN": {"info_key": "pointing_device.pins.sclk"}, - "POINTING_DEVICE_TASK_THROTTLE_MS": {"info_key": "pointing_device.throttle", "value_type": "int"}, - "POINTING_DEVICE_GESTURES_CURSOR_GLIDE_ENABLE": {"info_key": "pointing_device.gestures.cursor_glide", "value_type": "bool"}, - "POINTING_DEVICE_GESTURES_SCROLL_ENABLE": {"info_key": "pointing_device.gestures.scroll", "value_type": "bool"}, - "PRODUCT": {"info_key": "keyboard_name", "warn_duplicate": false, "value_type": "str"}, "PRODUCT_ID": {"info_key": "usb.pid", "value_type": "hex"}, "VENDOR_ID": {"info_key": "usb.vid", "value_type": "hex"}, @@ -116,7 +99,6 @@ "SECURE_IDLE_TIMEOUT": {"info_key": "secure.idle_timeout", "value_type": "int"}, "SENDSTRING_BELL": {"info_key": "audio.macro_beep", "value_type": "bool"}, "SPLIT_MODS_ENABLE": {"info_key": "split.transport.sync_modifiers", "value_type": "bool"}, - "SPLIT_POINTING_ENABLE": {"info_key": "split.transport.sync_pointing", "value_type": "bool"}, "SPLIT_TRANSPORT_MIRROR": {"info_key": "split.transport.sync_matrix_state", "value_type": "bool"}, "SPLIT_USB_DETECT": {"info_key": "split.usb_detect.enabled", "value_type": "bool"}, "SPLIT_USB_TIMEOUT": {"info_key": "split.usb_detect.timeout", "value_type": "int"}, diff --git a/data/mappings/info_rules.hjson b/data/mappings/info_rules.hjson index 2cc465f30d..2f8656c4bf 100644 --- a/data/mappings/info_rules.hjson +++ b/data/mappings/info_rules.hjson @@ -36,8 +36,6 @@ "PS2_ENABLE": {"info_key": "ps2.enabled", "value_type": "bool"}, "PS2_MOUSE_ENABLE": {"info_key": "ps2.mouse_enabled", "value_type": "bool"}, "PS2_DRIVER": {"info_key": "ps2.driver"}, - "POINTING_DEVICE_ENABLE": {"info_key": "pointing_device.enabled", "value_type": "bool"}, - "POINTING_DEVICE_DRIVER": {"info_key": "pointing_device.driver"}, // Items we want flagged in lint "CTPC": {"info_key": "_deprecated.ctpc", "deprecated": true, "replace_with": "CONVERT_TO=proton_c"}, diff --git a/data/schemas/keyboard.jsonschema b/data/schemas/keyboard.jsonschema index 353d9469d1..daf54141a8 100644 --- a/data/schemas/keyboard.jsonschema +++ b/data/schemas/keyboard.jsonschema @@ -363,48 +363,6 @@ } } }, - "pointing_device": { - "type": "object", - "properties": { - "enabled": {"type": "boolean"}, - "driver": {"type": "string"}, - "auto_mouse": { - "type": "object", - "properties": { - "enabled": {"type": "boolean"}, - "default_layer": {"type": "qmk.definitions.v1#/unsigned_int_8"}, - "time": {"type": "qmk.definitions.v1#/unsigned_int"}, - "delay": {"type": "qmk.definitions.v1#/unsigned_int"}, - "debounce": {"type": "qmk.definitions.v1#/unsigned_int"} - } - } - "pins": { - "type": "object", - "additionalProperties": false, - "properties": { - "motion": {"$ref": "qmk.definitions.v1#/mcu_pin"}, - "cs": {"$ref": "qmk.definitions.v1#/mcu_pin"}, - "sdio": {"$ref": "qmk.definitions.v1#/mcu_pin"}, - "sclk": {"$ref": "qmk.definitions.v1#/mcu_pin"} - } - }, - "throttle": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}, - "invert_x": {"type": "boolean"}, - "invert_y": {"type": "boolean"}, - "gestures": { - "type": "object", - "properties": { - "cursor_glide": {"type": "boolean"}, - "scroll": {"type": "boolean"} - } - }, - "rotation": { - "type": "integer", - "minimum": 0, - "enum": [0, 90, 180, 270] - } - } - }, "rgb_matrix": { "type": "object", "properties": { @@ -586,25 +544,6 @@ "type": "string", "enum": ["eeprom", "left", "matrix_grid", "pin", "right"] }, - "pointing_device": { - "right": { - "type": "object", - "additionalProperties": false, - "properties": { - "side": { - "type": "string", - "enum": ["left", "right", "combined"] - }, - "invert_x": {"type": "boolean"}, - "invert_y": {"type": "boolean"}, - "rotation": { - "type": "integer", - "minimum": 0, - "enum": [0, 90, 180, 270] - } - } - } - }, "soft_serial_pin": {"$ref": "qmk.definitions.v1#/mcu_pin"}, "soft_serial_speed": { "type": "integer", @@ -621,7 +560,6 @@ }, "sync_matrix_state": {"type": "boolean"}, "sync_modifiers": {"type": "boolean"}, - "sync_pointing": {"type": "boolean"}, "watchdog": {"type": "boolean"}, "watchdog_timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"} } diff --git a/lib/python/qmk/cli/generate/config_h.py b/lib/python/qmk/cli/generate/config_h.py index 51051ef610..31b8d70635 100755 --- a/lib/python/qmk/cli/generate/config_h.py +++ b/lib/python/qmk/cli/generate/config_h.py @@ -126,13 +126,6 @@ def generate_encoder_config(encoder_json, config_h_lines, postfix=''): config_h_lines.append(generate_define(f'ENCODER_RESOLUTIONS{postfix}', f'{{ {", ".join(map(str,resolutions))} }}')) -def generate_pointing_device_config(pointing_device_json, config_h_lines, postfix=''): - - rotation = pointing_device_json.get('rotation', 0) - - generate_define(f'POINTING_DEVICE_ROTATION_{rotation}{postfix}') - - def generate_split_config(kb_info_json, config_h_lines): """Generate the config.h lines for split boards.""" if 'primary' in kb_info_json['split']: @@ -163,9 +156,6 @@ def generate_split_config(kb_info_json, config_h_lines): if 'right' in kb_info_json['split'].get('encoder', {}): generate_encoder_config(kb_info_json['split']['encoder']['right'], config_h_lines, '_RIGHT') - if 'right' in kb_info_json['split'].get('pointing_device', {}): - generate_pointing_device_config(kb_info_json['split']['pointing_device']['right'], config_h_lines, '_RIGHT') - def generate_led_animations_config(led_feature_json, config_h_lines, prefix): for animation in led_feature_json.get('animations', {}): @@ -217,8 +207,5 @@ def generate_config_h(cli): if 'rgblight' in kb_info_json: generate_led_animations_config(kb_info_json['rgblight'], config_h_lines, 'RGBLIGHT_EFFECT_') - if 'pointing_device' in kb_info_json: - generate_pointing_device_config(kb_info_json['pointing_device'], config_h_lines) - # Show the results dump_lines(cli.args.output, config_h_lines, cli.args.quiet) -- cgit 1.4.1 From dfa53900dcc7e67db70c9ef7bdb14e4a423349f9 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Wed, 23 Nov 2022 18:01:07 +0000 Subject: Publish constants metadata to API (#19143) * Publish metadata * Ensure content is sorted --- lib/python/qmk/cli/generate/api.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'lib/python') diff --git a/lib/python/qmk/cli/generate/api.py b/lib/python/qmk/cli/generate/api.py index a98a12b628..8650a36b84 100755 --- a/lib/python/qmk/cli/generate/api.py +++ b/lib/python/qmk/cli/generate/api.py @@ -18,6 +18,23 @@ TEMPLATE_PATH = DATA_PATH / 'templates/api/' BUILD_API_PATH = Path('.build/api_data/') +def _list_constants(output_folder): + """Produce a map of available constants + """ + ret = {} + for file in (output_folder / 'constants').glob('**/*_[0-9].[0-9].[0-9].json'): + name, version = file.stem.rsplit('_', 1) + if name not in ret: + ret[name] = [] + ret[name].append(version) + + # Ensure content is sorted + for name in ret: + ret[name] = sorted(ret[name]) + + return ret + + def _resolve_keycode_specs(output_folder): """To make it easier for consumers, publish pre-merged spec files """ @@ -69,6 +86,7 @@ def generate_api(cli): keyboard_list_file = v1_dir / 'keyboard_list.json' # A simple list of keyboard targets keyboard_aliases_file = v1_dir / 'keyboard_aliases.json' # A list of historical keyboard names and their new name keyboard_metadata_file = v1_dir / 'keyboard_metadata.json' # All the data configurator/via needs for initialization + constants_metadata_file = v1_dir / 'constants_metadata.json' # Metadata for available constants usb_file = v1_dir / 'usb.json' # A mapping of USB VID/PID -> keyboard target if BUILD_API_PATH.exists(): @@ -132,6 +150,7 @@ def generate_api(cli): keyboard_list_json = json.dumps({'last_updated': current_datetime(), 'keyboards': keyboard_list}, cls=InfoJSONEncoder) keyboard_aliases_json = json.dumps({'last_updated': current_datetime(), 'keyboard_aliases': keyboard_aliases}, cls=InfoJSONEncoder) keyboard_metadata_json = json.dumps(keyboard_metadata, cls=InfoJSONEncoder) + constants_metadata_json = json.dumps({'last_updated': current_datetime(), 'constants': _list_constants(v1_dir)}) if not cli.args.dry_run: keyboard_all_file.write_text(keyboard_all_json) @@ -139,3 +158,4 @@ def generate_api(cli): keyboard_list_file.write_text(keyboard_list_json) keyboard_aliases_file.write_text(keyboard_aliases_json) keyboard_metadata_file.write_text(keyboard_metadata_json) + constants_metadata_file.write_text(constants_metadata_json) -- cgit 1.4.1 From af6aa225ebfc64caf571601b3e3390614daad54f Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Wed, 23 Nov 2022 18:48:22 +0000 Subject: Additional DD backlight config (#19124) * Additional dd backlight config * Update docs --- data/mappings/info_config.hjson | 2 ++ data/schemas/keyboard.jsonschema | 2 ++ docs/reference_info_json.md | 7 +++++++ lib/python/qmk/info.py | 2 +- 4 files changed, 12 insertions(+), 1 deletion(-) (limited to 'lib/python') diff --git a/data/mappings/info_config.hjson b/data/mappings/info_config.hjson index a013e98b34..a576df892e 100644 --- a/data/mappings/info_config.hjson +++ b/data/mappings/info_config.hjson @@ -14,8 +14,10 @@ "BACKLIGHT_BREATHING": {"info_key": "backlight.breathing", "value_type": "bool"}, "BREATHING_PERIOD": {"info_key": "backlight.breathing_period", "value_type": "int"}, "BACKLIGHT_LEVELS": {"info_key": "backlight.levels", "value_type": "int"}, + "BACKLIGHT_LIMIT_VAL": {"info_key": "backlight.max_brightness", "value_type": "int"}, "BACKLIGHT_ON_STATE": {"info_key": "backlight.on_state", "value_type": "int"}, "BACKLIGHT_PIN": {"info_key": "backlight.pin"}, + "BACKLIGHT_PINS": {"info_key": "backlight.pins", "value_type": "array"}, "BOTH_SHIFTS_TURNS_ON_CAPS_WORD": {"info_key": "caps_word.both_shifts_turns_on", "value_type": "bool"}, "CAPS_WORD_IDLE_TIMEOUT": {"info_key": "caps_word.idle_timeout", "value_type": "int"}, "COMBO_COUNT": {"info_key": "combo.count", "value_type": "int"}, diff --git a/data/schemas/keyboard.jsonschema b/data/schemas/keyboard.jsonschema index daf54141a8..91110b06a0 100644 --- a/data/schemas/keyboard.jsonschema +++ b/data/schemas/keyboard.jsonschema @@ -115,7 +115,9 @@ "minimum": 1, "maximum": 31 }, + "max_brightness": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}, "pin": {"$ref": "qmk.definitions.v1#/mcu_pin"}, + "pins": {"$ref": "qmk.definitions.v1#/mcu_pin_array"}, "on_state": {"$ref": "qmk.definitions.v1#/bit"} } }, diff --git a/docs/reference_info_json.md b/docs/reference_info_json.md index 05d4ef1113..c872bcb696 100644 --- a/docs/reference_info_json.md +++ b/docs/reference_info_json.md @@ -132,8 +132,15 @@ Enable by setting * The length of one backlight “breath” in seconds * `levels` * The number of brightness levels (maximum 31, excluding off) +* `max_brightness` + * The maximum duty cycle of the backlight LED(s) (0-255) * `pin` * The pin that controls the backlight LED(s) +* `pins` + * Array of pins that controls the backlight LED(s) (See [Multiple Backlight Pins](feature_backlight.md#multiple-backlight-pins)) +* `on_state` + * The state of the indicator pins when the LED is "on" - `1` for high, `0` for low + * Default: `1` Example: diff --git a/lib/python/qmk/info.py b/lib/python/qmk/info.py index 5dc8b9c5fe..51b7fb6421 100644 --- a/lib/python/qmk/info.py +++ b/lib/python/qmk/info.py @@ -451,7 +451,7 @@ def _config_to_json(key_type, config_value): if array_type == 'int': return list(map(int, config_value.split(','))) else: - return config_value.split(',') + return list(map(str.strip, config_value.split(','))) elif key_type == 'bool': return config_value in true_values -- cgit 1.4.1