Merge branch 'develop'

This commit is contained in:
zvecr 2026-06-01 07:51:54 +01:00
commit f0c79ee455
218 changed files with 2389 additions and 3601 deletions

View file

@ -300,6 +300,7 @@ endef
define BUILD_TEST define BUILD_TEST
TEST_PATH := $1 TEST_PATH := $1
TEST_NAME := $$(notdir $$(TEST_PATH)) TEST_NAME := $$(notdir $$(TEST_PATH))
TEST_ID := $$(patsubst ./tests/%,%,$$(TEST_PATH))
TEST_FULL_NAME := $$(subst /,_,$$(patsubst $$(ROOT_DIR)tests/%,%,$$(TEST_PATH))) TEST_FULL_NAME := $$(subst /,_,$$(patsubst $$(ROOT_DIR)tests/%,%,$$(TEST_PATH)))
MAKE_TARGET := $2 MAKE_TARGET := $2
COMMAND := $1 COMMAND := $1
@ -313,7 +314,7 @@ define BUILD_TEST
TEST_MSG := $$(MSG_TEST) TEST_MSG := $$(MSG_TEST)
$$(TEST_FULL_NAME)_COMMAND := \ $$(TEST_FULL_NAME)_COMMAND := \
printf "$$(TEST_MSG)\n"; \ printf "$$(TEST_MSG)\n"; \
$$(TEST_EXECUTABLE); \ $$(TEST_EXECUTABLE) --gtest_color=$$(COLOR); \
if [ $$$$? -gt 0 ]; \ if [ $$$$? -gt 0 ]; \
then error_occurred=1; \ then error_occurred=1; \
fi; \ fi; \

View file

@ -125,7 +125,7 @@ ifeq ($(strip $(MOUSEKEY_ENABLE)), yes)
MOUSE_ENABLE := yes MOUSE_ENABLE := yes
endif endif
VALID_POINTING_DEVICE_DRIVER_TYPES := adns5050 adns9800 analog_joystick azoteq_iqs5xx cirque_pinnacle_i2c cirque_pinnacle_spi paw3204 paw3222 pmw3320 pmw3360 pmw3389 pimoroni_trackball custom VALID_POINTING_DEVICE_DRIVER_TYPES := adns5050 adns9800 analog_joystick azoteq_iqs5xx cirque_pinnacle_i2c cirque_pinnacle_spi paw3204 paw3222 pmw3320 pmw3325 pmw3360 pmw3389 pimoroni_trackball custom
ifeq ($(strip $(POINTING_DEVICE_ENABLE)), yes) ifeq ($(strip $(POINTING_DEVICE_ENABLE)), yes)
ifeq ($(filter $(POINTING_DEVICE_DRIVER),$(VALID_POINTING_DEVICE_DRIVER_TYPES)),) ifeq ($(filter $(POINTING_DEVICE_DRIVER),$(VALID_POINTING_DEVICE_DRIVER_TYPES)),)
$(call CATASTROPHIC_ERROR,Invalid POINTING_DEVICE_DRIVER,POINTING_DEVICE_DRIVER="$(POINTING_DEVICE_DRIVER)" is not a valid pointing device type) $(call CATASTROPHIC_ERROR,Invalid POINTING_DEVICE_DRIVER,POINTING_DEVICE_DRIVER="$(POINTING_DEVICE_DRIVER)" is not a valid pointing device type)
@ -159,6 +159,8 @@ ifeq ($(strip $(POINTING_DEVICE_ENABLE)), yes)
SRC += $(QUANTUM_DIR)/pointing_device/pointing_device_gestures.c SRC += $(QUANTUM_DIR)/pointing_device/pointing_device_gestures.c
else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), paw3222) else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), paw3222)
SPI_DRIVER_REQUIRED = yes SPI_DRIVER_REQUIRED = yes
else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), pmw3325)
SPI_DRIVER_REQUIRED = yes
else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), pimoroni_trackball) else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), pimoroni_trackball)
I2C_DRIVER_REQUIRED = yes I2C_DRIVER_REQUIRED = yes
else ifneq ($(filter $(strip $(POINTING_DEVICE_DRIVER)),pmw3360 pmw3389),) else ifneq ($(filter $(strip $(POINTING_DEVICE_DRIVER)),pmw3360 pmw3389),)

View file

@ -50,10 +50,14 @@ ifeq ($(strip $(DEBUG_ENABLE)),yes)
CFLAGS += -ggdb3 CFLAGS += -ggdb3
CXXFLAGS += -ggdb3 CXXFLAGS += -ggdb3
ASFLAGS += -ggdb3 ASFLAGS += -ggdb3
# Create a map file when debugging
LDFLAGS += -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref
endif endif
# Create a map file to see what was compiled and where, unless disabled
# (e.g. test builds, which use the host linker — Apple's ld does not accept
# -Map=/--cref).
ifneq ($(strip $(CREATE_MAP)), no)
LDFLAGS += -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref
endif
#---------------- C Compiler Options ---------------- #---------------- C Compiler Options ----------------
@ -66,9 +70,9 @@ CFLAGS += $(CDEFS)
CFLAGS += -O$(OPT) CFLAGS += -O$(OPT)
# add color # add color
ifeq ($(COLOR),true) ifeq ($(COLOR),true)
ifeq ("$(shell echo "int main(){}" | $(CC) -fdiagnostics-color -x c - -o /dev/null 2>&1)", "") CFLAGS+= -fdiagnostics-color=always
CFLAGS+= -fdiagnostics-color else
endif CFLAGS+= -fdiagnostics-color=never
endif endif
CFLAGS += -Wall CFLAGS += -Wall
CFLAGS += -Wstrict-prototypes CFLAGS += -Wstrict-prototypes

View file

@ -1,10 +1,8 @@
{ {
"license": "GPL-2.0-or-later", "license": "GPL-2.0-or-later",
"devDependencies": { "devDependencies": {
"vite": "^5.4.21", "vitepress": "^1.6.4",
"vitepress": "^1.1.0", "vitepress-plugin-tabs": "^0.8.0"
"vitepress-plugin-tabs": "^0.5.0",
"vue": "^3.4.24"
}, },
"scripts": { "scripts": {
"docs:dev": "vitepress dev --host 0.0.0.0", "docs:dev": "vitepress dev --host 0.0.0.0",

File diff suppressed because it is too large Load diff

View file

@ -77,13 +77,13 @@ define GENERATE_MSG_MAKE_KB
endef endef
MSG_MAKE_KB = $(eval $(call GENERATE_MSG_MAKE_KB))$(MSG_MAKE_KB_ACTUAL) MSG_MAKE_KB = $(eval $(call GENERATE_MSG_MAKE_KB))$(MSG_MAKE_KB_ACTUAL)
define GENERATE_MSG_MAKE_TEST define GENERATE_MSG_MAKE_TEST
MSG_MAKE_TEST_ACTUAL := Making test $(BOLD)$(TEST_NAME)$(NO_COLOR) MSG_MAKE_TEST_ACTUAL := Making test $(BOLD)$(TEST_ID)$(NO_COLOR)
ifneq ($$(MAKE_TARGET),) ifneq ($$(MAKE_TARGET),)
MSG_MAKE_TEST_ACTUAL += with target $(BOLD)$$(MAKE_TARGET)$(NO_COLOR) MSG_MAKE_TEST_ACTUAL += with target $(BOLD)$$(MAKE_TARGET)$(NO_COLOR)
endif endif
endef endef
MSG_MAKE_TEST = $(eval $(call GENERATE_MSG_MAKE_TEST))$(MSG_MAKE_TEST_ACTUAL) MSG_MAKE_TEST = $(eval $(call GENERATE_MSG_MAKE_TEST))$(MSG_MAKE_TEST_ACTUAL)
MSG_TEST = Testing $(BOLD)$(TEST_NAME)$(NO_COLOR) MSG_TEST = Testing $(BOLD)$(TEST_ID)$(NO_COLOR)
define GENERATE_MSG_AVAILABLE_KEYMAPS define GENERATE_MSG_AVAILABLE_KEYMAPS
MSG_AVAILABLE_KEYMAPS_ACTUAL := Available keymaps for $(BOLD)$$(CURRENT_KB)$(NO_COLOR): MSG_AVAILABLE_KEYMAPS_ACTUAL := Available keymaps for $(BOLD)$$(CURRENT_KB)$(NO_COLOR):
endef endef

View file

@ -225,6 +225,8 @@
"RETRO_TAPPING": {"info_key": "tapping.retro", "value_type": "flag"}, "RETRO_TAPPING": {"info_key": "tapping.retro", "value_type": "flag"},
"RETRO_TAPPING_PER_KEY": {"info_key": "tapping.retro_per_key", "value_type": "flag"}, "RETRO_TAPPING_PER_KEY": {"info_key": "tapping.retro_per_key", "value_type": "flag"},
"SPECULATIVE_HOLD": {"info_key": "tapping.speculative_hold", "value_type": "flag"}, "SPECULATIVE_HOLD": {"info_key": "tapping.speculative_hold", "value_type": "flag"},
"SPECULATIVE_HOLD_FLOW_TERM": {"info_key": "tapping.speculative_hold_flow_term", "value_type": "int"},
"SPECULATIVE_HOLD_ONE_KEY": {"info_key": "tapping.speculative_hold_one_key", "value_type": "flag"},
"TAP_CODE_DELAY": {"info_key": "qmk.tap_keycode_delay", "value_type": "int"}, "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"}, "TAP_HOLD_CAPS_DELAY": {"info_key": "qmk.tap_capslock_delay", "value_type": "int"},
"TAPPING_TERM": {"info_key": "tapping.term", "value_type": "int"}, "TAPPING_TERM": {"info_key": "tapping.term", "value_type": "int"},
@ -269,9 +271,9 @@
"PRODUCT": {"info_key": "keyboard_name", "warn_duplicate": false, "value_type": "str", "deprecated": true, "replace_with": "`keyboard_name` in info.json"}, "PRODUCT": {"info_key": "keyboard_name", "warn_duplicate": false, "value_type": "str", "deprecated": true, "replace_with": "`keyboard_name` in info.json"},
"PRODUCT_ID": {"info_key": "usb.pid", "value_type": "hex", "deprecated": true, "replace_with": "`usb.pid` in info.json"}, "PRODUCT_ID": {"info_key": "usb.pid", "value_type": "hex", "deprecated": true, "replace_with": "`usb.pid` in info.json"},
"VENDOR_ID": {"info_key": "usb.vid", "value_type": "hex", "deprecated": true, "replace_with": "`usb.vid` in info.json"}, "VENDOR_ID": {"info_key": "usb.vid", "value_type": "hex", "deprecated": true, "replace_with": "`usb.vid` in info.json"},
"FORCE_NKRO": {"info_key": "usb.force_nkro", "value_type": "flag", "deprecated": true, "replace_with": "`host.default.nkro` in info.json"},
// Items we want flagged in lint // Items we want flagged in lint
"FORCE_NKRO": {"info_key": "usb.force_nkro", "value_type": "flag", "invalid": true, "replace_with": "`host.default.nkro` in info.json"},
"VIAL_KEYBOARD_UID": {"info_key": "_invalid.vial_uid", "invalid": true}, "VIAL_KEYBOARD_UID": {"info_key": "_invalid.vial_uid", "invalid": true},
"VIAL_UNLOCK_COMBO_COLS": {"info_key": "_invalid.vial_unlock_cols", "invalid": true}, "VIAL_UNLOCK_COMBO_COLS": {"info_key": "_invalid.vial_unlock_cols", "invalid": true},
"VIAL_UNLOCK_COMBO_ROWS": {"info_key": "_invalid.vial_unlock_rows", "invalid": true} "VIAL_UNLOCK_COMBO_ROWS": {"info_key": "_invalid.vial_unlock_rows", "invalid": true}

View file

@ -46,7 +46,8 @@
"manufacturer": {"$ref": "./definitions.jsonschema#/text_identifier"}, "manufacturer": {"$ref": "./definitions.jsonschema#/text_identifier"},
"url": { "url": {
"type": "string", "type": "string",
"format": "uri" "format": "uri",
"minLength": 1
}, },
"development_board": { "development_board": {
"type": "string", "type": "string",
@ -992,6 +993,7 @@
"type": "object", "type": "object",
"properties": { "properties": {
"chordal_hold": {"type": "boolean"}, "chordal_hold": {"type": "boolean"},
"flow_tap_term": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"force_hold": {"type": "boolean"}, "force_hold": {"type": "boolean"},
"force_hold_per_key": {"type": "boolean"}, "force_hold_per_key": {"type": "boolean"},
"ignore_mod_tap_interrupt": {"type": "boolean"}, "ignore_mod_tap_interrupt": {"type": "boolean"},
@ -1001,6 +1003,9 @@
"permissive_hold_per_key": {"type": "boolean"}, "permissive_hold_per_key": {"type": "boolean"},
"retro": {"type": "boolean"}, "retro": {"type": "boolean"},
"retro_per_key": {"type": "boolean"}, "retro_per_key": {"type": "boolean"},
"speculative_hold": {"type": "boolean"},
"speculative_hold_flow_term": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"speculative_hold_one_key": {"type": "boolean"},
"term": {"$ref": "./definitions.jsonschema#/unsigned_int"}, "term": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"term_per_key": {"type": "boolean"}, "term_per_key": {"type": "boolean"},
"toggle": {"$ref": "./definitions.jsonschema#/unsigned_int"} "toggle": {"$ref": "./definitions.jsonschema#/unsigned_int"}

122
docs/ChangeLog/20260531.md Normal file
View file

@ -0,0 +1,122 @@
# QMK Breaking Changes - 2026 May 31 Changelog
## Notable Changes {#notable-changes}
## Deprecation Notices
In line with the [notice period](../support_deprecation_policy#how-much-advance-notice-will-be-given), deprecation notices for larger items are listed here.
### Removal of deprecated isLeftHand ([25897](https://github.com/qmk/qmk_firmware/pull/25897))
Users must migrate to `is_keyboard_left()` found in `split_util.h` instead. For example:
```diff
oled_rotation_t oled_init_user(oled_rotation_t rotation) {
- return isLeftHand ? OLED_ROTATION_180 : OLED_ROTATION_0;
+ return is_keyboard_left() ? OLED_ROTATION_180 : OLED_ROTATION_0;
}
```
### Removal of `usb.force_nkro`/`FORCE_NKRO` ([#25262](https://github.com/qmk/qmk_firmware/pull/25262))
Unpicking the assumption that only USB can do NKRO, forcing of NKRO on every boot has been deprecated. As this setting persists, it produces unnecessary user confusion when the various NKRO keycodes (for example `NK_TOGG`) do not behave as expected.
The new defaults can be configured in the following ways:
:::::tabs
==== keyboard.json
```json [keyboard.json]
{
"host": { // [!code focus]
"default": { // [!code focus]
"nkro": true // [!code focus]
} // [!code focus]
} // [!code focus]
}
```
==== keymap.json
```json [keymap.json]
{
"config": {
"host": { // [!code focus]
"default": { // [!code focus]
"nkro": true // [!code focus]
} // [!code focus]
} // [!code focus]
}
}
```
==== config.h
```c [config.h]
#pragma once
#define NKRO_DEFAULT_ON true // [!code focus]
```
:::::
## Full changelist
Core:
* Remove deprecated `isLeftHand` ([#25897](https://github.com/qmk/qmk_firmware/pull/25897))
* Either output Unicode or insert in Leader sequence ([#25940](https://github.com/qmk/qmk_firmware/pull/25940))
* Add resolution information to digitizer ([#25958](https://github.com/qmk/qmk_firmware/pull/25958))
* Always generate .map files. ([#25961](https://github.com/qmk/qmk_firmware/pull/25961))
* Add an `mcu_reset` impl for the kiibohd bootloader. ([#25963](https://github.com/qmk/qmk_firmware/pull/25963))
* VIA v13 ([#26001](https://github.com/qmk/qmk_firmware/pull/26001))
* Added PixArt PMW-3325 mouse sensor driver ([#26065](https://github.com/qmk/qmk_firmware/pull/26065))
* Update WL backing store from 16 to 32-bit for AT32 ([#26066](https://github.com/qmk/qmk_firmware/pull/26066))
* Refactor Pixel Fractal effect ([#26071](https://github.com/qmk/qmk_firmware/pull/26071))
* Minor combo code optimisation ([#26073](https://github.com/qmk/qmk_firmware/pull/26073))
* Options to constrain Speculative Hold: `SPECULATIVE_HOLD_ONE_KEY` and `SPECULATIVE_HOLD_FLOW_TERM`. ([#26099](https://github.com/qmk/qmk_firmware/pull/26099))
* Add includes for std::setw ([#26153](https://github.com/qmk/qmk_firmware/pull/26153))
* Bind gtest colour to QMKs 'COLOR' variable ([#26159](https://github.com/qmk/qmk_firmware/pull/26159))
* Print correct test names ([#26160](https://github.com/qmk/qmk_firmware/pull/26160))
* Ignore Uninteresting test warnings during test teardown ([#26161](https://github.com/qmk/qmk_firmware/pull/26161))
* Remove FORCE_NKRO ([#26206](https://github.com/qmk/qmk_firmware/pull/26206))
CLI:
* Update lint to check all keymaps within the repo ([#25970](https://github.com/qmk/qmk_firmware/pull/25970))
* Fail when a duplicate module name is detected ([#26238](https://github.com/qmk/qmk_firmware/pull/26238))
Submodule updates:
* Update ChibiOS, ChibiOS-Contrib. ([#25730](https://github.com/qmk/qmk_firmware/pull/25730))
* Revert "Update ChibiOS, ChibiOS-Contrib." ([#26074](https://github.com/qmk/qmk_firmware/pull/26074))
* ChibiOS, ChibiOS-Contrib updates (redux) ([#26079](https://github.com/qmk/qmk_firmware/pull/26079))
* Bump googletest to v1.16.0 ([#26154](https://github.com/qmk/qmk_firmware/pull/26154))
Keyboards:
* Require "url" field to not be empty ([#25152](https://github.com/qmk/qmk_firmware/pull/25152))
* Add nomis/rpi_pico_25x1 macropad ([#25346](https://github.com/qmk/qmk_firmware/pull/25346))
* Remove override of QK_{LED,RGB}_MATRIX_TOGGLE keycode ([#25672](https://github.com/qmk/qmk_firmware/pull/25672))
* Add reverse layout to SouthPad v2 ([#25707](https://github.com/qmk/qmk_firmware/pull/25707))
* Adding Handwired Bouvet Macropad ([#26040](https://github.com/qmk/qmk_firmware/pull/26040))
* Remove blockader user keymap ([#26075](https://github.com/qmk/qmk_firmware/pull/26075))
* Remove deprecated audio pin defines ([#26111](https://github.com/qmk/qmk_firmware/pull/26111))
* Remove `OLED_DISPLAY_128X32` config ([#26190](https://github.com/qmk/qmk_firmware/pull/26190))
* Migrate SPLIT_OLED_ENABLE ([#26194](https://github.com/qmk/qmk_firmware/pull/26194))
* Add API version assertion for split_data_sync module ([#26237](https://github.com/qmk/qmk_firmware/pull/26237))
Others:
* Bump vitepress to 1.6.4 ([#26067](https://github.com/qmk/qmk_firmware/pull/26067))
* Add usage clarifications to docs/features/unicode.md ([#26156](https://github.com/qmk/qmk_firmware/pull/26156))
Bugs:
* Fix `USER_PRINT` stripping out `uprintf` ([#25919](https://github.com/qmk/qmk_firmware/pull/25919))
* Fix possible repeat key infinite recursion ([#25926](https://github.com/qmk/qmk_firmware/pull/25926))
* Fix `cc-option` on arm-none-eabi-gcc ([#26114](https://github.com/qmk/qmk_firmware/pull/26114))
* Fix color diagnostics for arm-none-eabi-gcc ([#26115](https://github.com/qmk/qmk_firmware/pull/26115))
* Mask out active mods when unregistering after retro tapping ([#26127](https://github.com/qmk/qmk_firmware/pull/26127))
* fix `make test:all` failures seen on macOS Tahoe ([#26136](https://github.com/qmk/qmk_firmware/pull/26136))
* Add workaround for undefined reference to weak function under mingw ([#26167](https://github.com/qmk/qmk_firmware/pull/26167))
* fix(ws2812-pwm): allow WS2812_PWM_TICK_FREQUENCY override ([#26186](https://github.com/qmk/qmk_firmware/pull/26186))
* Clip mouse report values to the logical range from the USB descriptor. ([#26195](https://github.com/qmk/qmk_firmware/pull/26195))
* Align Mouse USB descriptor ([#26230](https://github.com/qmk/qmk_firmware/pull/26230))

View file

@ -214,7 +214,7 @@
{ "text": "My Pull Request Was Flagged", "link": "/breaking_changes_instructions" }, { "text": "My Pull Request Was Flagged", "link": "/breaking_changes_instructions" },
{ {
"text": "Most Recent ChangeLog", "text": "Most Recent ChangeLog",
"link": "/ChangeLog/20260222" "link": "/ChangeLog/20260531"
}, },
{ "text": "Past Breaking Changes", "link": "/breaking_changes_history" }, { "text": "Past Breaking Changes", "link": "/breaking_changes_history" },
{ "text": "Deprecation Policy", "link": "/support_deprecation_policy" } { "text": "Deprecation Policy", "link": "/support_deprecation_policy" }

View file

@ -10,25 +10,25 @@ Practically, this means QMK merges the `develop` branch into the `master` branch
## What has been included in past Breaking Changes? ## What has been included in past Breaking Changes?
* [2026 May 31](ChangeLog/20260531)
* [2026 Feb 22](ChangeLog/20260222) * [2026 Feb 22](ChangeLog/20260222)
* [2025 Nov 30](ChangeLog/20251130) * [2025 Nov 30](ChangeLog/20251130)
* [2025 Aug 31](ChangeLog/20250831)
* [Older Breaking Changes](breaking_changes_history) * [Older Breaking Changes](breaking_changes_history)
## When is the next Breaking Change? ## When is the next Breaking Change?
The next Breaking Change is scheduled for May 31, 2026. The next Breaking Change is scheduled for Aug 30, 2026.
### Important Dates ### Important Dates
* 2025 Feb 22 - `develop` is tagged with a new release version. Each push to `master` is subsequently merged to `develop` by GitHub actions. * 2025 May 31 - `develop` is tagged with a new release version. Each push to `master` is subsequently merged to `develop` by GitHub actions.
* 2026 May 3 - `develop` closed to new PRs. * 2026 Aug 2 - `develop` closed to new PRs.
* 2026 May 3 - Call for testers. * 2026 Aug 2 - Call for testers.
* 2026 May 17 - Last day for merges -- after this point `develop` is locked for testing and accepts only bugfixes * 2026 Aug 16 - Last day for merges -- after this point `develop` is locked for testing and accepts only bugfixes
* 2026 May 24 - `develop` is locked, only critical bugfix PRs merged. * 2026 Aug 23 - `develop` is locked, only critical bugfix PRs merged.
* 2026 May 29 - `master` is locked, no PRs merged. * 2026 Aug 28 - `master` is locked, no PRs merged.
* 2026 May 31 - Merge `develop` to `master`. * 2026 Aug 30 - Merge `develop` to `master`.
* 2026 May 31 - `master` is unlocked. PRs can be merged again. * 2026 Aug 30 - `master` is unlocked. PRs can be merged again.
## What changes will be included? ## What changes will be included?

View file

@ -2,6 +2,7 @@
This page links to all previous changelogs from the QMK Breaking Changes process. This page links to all previous changelogs from the QMK Breaking Changes process.
* [2026 May 31](ChangeLog/20260531) - version 0.33.0
* [2026 Feb 22](ChangeLog/20260222) - version 0.32.0 * [2026 Feb 22](ChangeLog/20260222) - version 0.32.0
* [2025 Nov 30](ChangeLog/20251130) - version 0.31.0 * [2025 Nov 30](ChangeLog/20251130) - version 0.31.0
* [2025 Aug 31](ChangeLog/20250831) - version 0.30.0 * [2025 Aug 31](ChangeLog/20250831) - version 0.30.0

View file

@ -74,24 +74,6 @@ This is a C header file that is one of the first things included, and will persi
* pins mapped to rows and columns, from left to right. Defines a matrix where each switch is connected to a separate pin and ground. * pins mapped to rows and columns, from left to right. Defines a matrix where each switch is connected to a separate pin and ground.
* `#define AUDIO_VOICES` * `#define AUDIO_VOICES`
* turns on the alternate audio voices (to cycle through) * turns on the alternate audio voices (to cycle through)
* `#define C4_AUDIO`
* enables audio on pin C4
* Deprecated. Use `#define AUDIO_PIN C4`
* `#define C5_AUDIO`
* enables audio on pin C5
* Deprecated. Use `#define AUDIO_PIN C5`
* `#define C6_AUDIO`
* enables audio on pin C6
* Deprecated. Use `#define AUDIO_PIN C6`
* `#define B5_AUDIO`
* enables audio on pin B5 (duophony is enabled if one of B pins is enabled along with one of C pins)
* Deprecated. Use `#define AUDIO_PIN B5`, or use `#define AUDIO_PIN_ALT B5` if a `C` pin is enabled with `AUDIO_PIN`
* `#define B6_AUDIO`
* enables audio on pin B6 (duophony is enabled if one of B pins is enabled along with one of C pins)
* Deprecated. Use `#define AUDIO_PIN B6`, or use `#define AUDIO_PIN_ALT B6` if a `C` pin is enabled with `AUDIO_PIN`
* `#define B7_AUDIO`
* enables audio on pin B7 (duophony is enabled if one of B pins is enabled along with one of C pins)
* Deprecated. Use `#define AUDIO_PIN B7`, or use `#define AUDIO_PIN_ALT B7` if a `C` pin is enabled with `AUDIO_PIN`
* `#define BACKLIGHT_PIN B7` * `#define BACKLIGHT_PIN B7`
* pin of the backlight * pin of the backlight
* `#define BACKLIGHT_LEVELS 3` * `#define BACKLIGHT_LEVELS 3`

View file

@ -320,6 +320,23 @@ The PMW3320 sensor uses a serial type protocol for communication, and requires a
The CPI range is 500-3500, in increments of 250. Defaults to 1000 CPI. The CPI range is 500-3500, in increments of 250. Defaults to 1000 CPI.
### PMW-3325 Sensor
To use the PMW-3325 sensor, add this to your `rules.mk`:
```make
POINTING_DEVICE_DRIVER = pmw3325
```
The following pins must be defined in `config.h`:
| Setting (`config.h`) | Description | Default |
| --------------------- | ------------------------------------------------------------------ | ---------------------------- |
| `PMW3325_CS_PIN` | (Required) The pin connected to the chip select pin of the sensor. | `POINTING_DEVICE_CS_PIN` |
| `PMW3325_SPI_DIVISOR` | (Required) The SPI clock divisor. This is dependent on your MCU. | _not defined_ |
The CPI range is 100-5000, in increments of 100. Defaults to 2000 CPI.
### PMW 3360 and PMW 3389 Sensor ### PMW 3360 and PMW 3389 Sensor
This drivers supports both the PMW 3360 and PMW 3389 sensor as well as multiple sensors of the same type _per_ controller, so 2 can be attached at the same side for split keyboards (or unsplit keyboards). This drivers supports both the PMW 3360 and PMW 3389 sensor as well as multiple sensors of the same type _per_ controller, so 2 can be attached at the same side for split keyboards (or unsplit keyboards).

View file

@ -8,9 +8,9 @@ There are some limitations to this feature. Because there is no "standard" metho
## Usage {#usage} ## Usage {#usage}
The core Unicode API can be used purely programmatically. However, there are also additional subsystems which build on top of it and come with keycodes to make things easier. See below for more details. The core Unicode API can be used purely programmatically. However, there are also additional subsystems which build on top of it and come with keycodes to make things easier. See [below](#input-subsystems) for more details.
Add the following to your keymap's `rules.mk`: To start, add the following to your keymap's `rules.mk`:
```make ```make
UNICODE_COMMON = yes UNICODE_COMMON = yes
@ -18,22 +18,25 @@ UNICODE_COMMON = yes
## Basic Configuration {#basic-configuration} ## Basic Configuration {#basic-configuration}
Add the following to your `config.h`: The following options can be set or overridden in your `config.h`:
|Define |Default |Description | |Define |Default |Description |
|------------------------|------------------|--------------------------------------------------------------------------------| |------------------------|------------------|--------------------------------------------------------------------------------|
|`UNICODE_KEY_MAC` |`KC_LEFT_ALT` |The key to hold when beginning a Unicode sequence with the macOS input mode | |`UNICODE_KEY_MAC` |`KC_LEFT_ALT` |The key to hold when beginning a Unicode sequence with the macOS input mode |
|`UNICODE_KEY_LNX` |`LCTL(LSFT(KC_U))`|The key to tap when beginning a Unicode sequence with the Linux input mode | |`UNICODE_KEY_LNX` |`LCTL(LSFT(KC_U))`|The key to tap when beginning a Unicode sequence with the Linux input mode |
|`UNICODE_KEY_WINC` |`KC_RIGHT_ALT` |The key to hold when beginning a Unicode sequence with the WinCompose input mode| |`UNICODE_KEY_WINC` |`KC_RIGHT_ALT` |The key to hold when beginning a Unicode sequence with the WinCompose input mode|
|`UNICODE_SELECTED_MODES`|`-1` |A comma separated list of input modes for cycling through | |`UNICODE_SELECTED_MODES`|*n/a* |A comma separated list of input modes for cycling through |
|`UNICODE_CYCLE_PERSIST` |`true` |Whether to persist the current Unicode input mode to EEPROM | |`UNICODE_CYCLE_PERSIST` |`true` |Whether to persist the current Unicode input mode to EEPROM |
|`UNICODE_TYPE_DELAY` |`10` |The amount of time to wait, in milliseconds, between Unicode sequence keystrokes| |`UNICODE_TYPE_DELAY` |`10` |The amount of time to wait, in milliseconds, between Unicode sequence keystrokes|
The default values work well for most use cases, so users usually only need to define `UNICODE_SELECTED_MODES` to set their desired input modes.
However, if you plan on switching input modes manually (see [keycodes](#keycodes) below) and don't plan on cycling through them, this definition can be omitted.
### Audio Feedback {#audio-feedback} ### Audio Feedback {#audio-feedback}
If you have the [Audio](audio) feature enabled on your board, you can configure it to play sounds when the input mode is changed. If you have the [Audio](audio) feature enabled on your board, you can configure it to play sounds when the input mode is changed.
Add the following to your `config.h`: Add one or more of the following definitions to your `config.h`:
|Define |Default|Description | |Define |Default|Description |
|-------------------|-------|-----------------------------------------------------------| |-------------------|-------|-----------------------------------------------------------|

View file

@ -91,7 +91,7 @@ Enables your LED to breath while your computer is sleeping. Timer1 is being used
`NKRO_ENABLE` `NKRO_ENABLE`
This allows the keyboard to tell the host OS that up to 248 keys are held down at once (default without NKRO is 6). NKRO is off by default, even if `NKRO_ENABLE` is set. NKRO can be forced by adding `#define FORCE_NKRO` to your config.h or by binding `MAGIC_TOGGLE_NKRO` to a key and then hitting the key. This allows the keyboard to tell the host OS that up to 248 keys are held down at once (default without NKRO is 6). NKRO is off by default, even if `NKRO_ENABLE` is set. NKRO can be toggled by binding `NK_TOGG` to a key and then hitting the key.
`BACKLIGHT_ENABLE` `BACKLIGHT_ENABLE`

View file

@ -824,7 +824,30 @@ bool get_speculative_hold(uint16_t keycode, keyrecord_t* record) {
} }
``` ```
Some operating systems or applications assign actions to tapping a modifier key by itself, e.g., tapping GUI to open a start menu. Because Speculative Hold sends a lone modifier key press in some cases, it can falsely trigger these actions. To prevent this, set `DUMMY_MOD_NEUTRALIZER_KEYCODE` (and optionally `MODS_TO_NEUTRALIZE`) in your `config.h` in the same way as described above for [Retro Tapping](#retro-tapping). Some operating systems or applications assign actions to tapping a modifier key by itself, e.g., tapping GUI to open a start menu. Because Speculative Hold sometimes sends a lone modifier key press, it can falsely trigger these actions (known as the "flashing mods" problem). How such an input is handled depends on the OS and application, so unfortunately, there is no universal solution.
To mitigate this issue, you can set `DUMMY_MOD_NEUTRALIZER_KEYCODE` (and optionally `MODS_TO_NEUTRALIZE`) in your `config.h`, as described above for [Retro Tapping](#retro-tapping).
You can further prevent flashing mods by restricting when Speculative Hold is allowed to trigger. There are several options for this:
* Constrain Speculative Hold to one key at a time. Add to your config.h:
```c
#define SPECULATIVE_HOLD_ONE_KEY
```
With this option, Speculative Hold does not apply when any mods are already active. Mod combinations across multiple keys can still be made after the mod-tap keys settle.
* Disable Speculative Hold during the flow of fast typing. Add to your config.h:
```c
#define SPECULATIVE_HOLD_FLOW_TERM 200
```
This value specifies a duration in milliseconds. Speculative Hold does not apply if a key is pressed within this threshold of the previous key. The effect is similar to [Flow Tap](#flow-tap); however, `SPECULATIVE_HOLD_FLOW_TERM` only restricts when speculation is allowed, without affecting how the key settles.
* Use the Flow Tap option. In the fast flow of typing, the mod-tap key is immediately settled, and therefore no speculation occurs. See [Flow Tap](#flow-tap) for details.
## Why do we include the key record for the per key functions? ## Why do we include the key record for the per key functions?

173
drivers/sensors/pmw3325.c Normal file
View file

@ -0,0 +1,173 @@
// Copyright 2024 Colin Lam (Ploopy Corporation)
// Copyright 2026 HorrorTroll <https://github.com/HorrorTroll>
// SPDX-License-Identifier: GPL-2.0-or-later
#include "pmw3325.h"
#include "wait.h"
#include "gpio.h"
#include "spi_master.h"
#include "pointing_device_internal.h"
#define MSB1 0x80
#define MSB0 0x7F
const pointing_device_driver_t pmw3325_pointing_device_driver = {
.init = pmw3325_init,
.get_report = pmw3325_get_report,
.set_cpi = pmw3325_set_cpi,
.get_cpi = pmw3325_get_cpi,
};
// Convert a 16-bit twos complement binary-represented number into a
// signed 16-bit integer.
static int16_t convert_twoscomp_16(uint8_t high, uint8_t low) {
uint16_t data = (high << 8) | low;
if ((data & 0x8000) == 0x8000) {
return -32768 + (data & 0x7FFF);
} else {
return data;
}
}
void pmw3325_write(uint8_t reg_addr, uint8_t data) {
spi_start(PMW3325_CS_PIN, false, 3, PMW3325_SPI_DIVISOR);
wait_us(1); // tNCS_SCLK
spi_write(reg_addr | MSB1);
wait_us(180); // tSRAD
spi_write(data);
wait_us(1); // tSCLK_NCS
spi_stop();
wait_us(20); // tSRR
}
uint8_t pmw3325_read(uint8_t reg_addr) {
spi_start(PMW3325_CS_PIN, false, 3, PMW3325_SPI_DIVISOR);
wait_us(1); // tNCS_SCLK
spi_write(reg_addr & MSB0);
wait_us(180); // tSRAD
uint8_t data = spi_read();
wait_us(1); // tSCLK_NCS
spi_stop();
wait_us(20); // tSRR
return data;
}
bool pmw3325_init(void) {
wait_ms(50);
gpio_set_pin_output(PMW3325_CS_PIN);
// CS must be kept high at power-up stage for at least 1ms
gpio_write_pin_low(PMW3325_CS_PIN);
wait_ms(10);
gpio_write_pin_high(PMW3325_CS_PIN);
spi_init();
// reboot
pmw3325_write(0x3A, 0x5A);
wait_ms(10);
pmw3325_write(0x18, 0x39);
if (!pmw3325_check_signature()) {
return false;
}
// read a burst, then discard
pmw3325_read(0x02);
pmw3325_read(0x03);
pmw3325_read(0x04);
pmw3325_read(0x05);
pmw3325_read(0x06);
// initialize
pmw3325_write(0x78, 0x80);
pmw3325_write(0x79, 0x80);
pmw3325_write(0x14, 0x80);
pmw3325_write(0x20, 0x40);
pmw3325_write(0x1A, 0x40);
pmw3325_write(0x47, 0x00);
pmw3325_write(0x48, 0x01);
pmw3325_write(0x60, 0x01);
pmw3325_write(0x69, 0x03);
pmw3325_write(0x1D, 0x90);
pmw3325_write(0x1B, 0x2E);
pmw3325_write(0x24, 0x05);
pmw3325_write(0x56, 0x00);
pmw3325_write(0x2C, 0x8A);
pmw3325_write(0x2D, 0x58);
pmw3325_write(0x40, 0x80);
pmw3325_write(0x7F, 0x01);
pmw3325_write(0x7A, 0x32);
pmw3325_write(0x6A, 0x93);
pmw3325_write(0x6B, 0x68);
pmw3325_write(0x6C, 0x71);
pmw3325_write(0x6D, 0x50);
pmw3325_write(0x7F, 0x00);
pmw3325_write(0x7F, 0x02);
pmw3325_write(0x29, 0x1C);
pmw3325_write(0x2A, 0x1A);
pmw3325_write(0x2B, 0x90);
pmw3325_write(0x40, 0x80);
pmw3325_write(0x7F, 0x00);
return true;
}
report_pmw3325_t pmw3325_read_burst(void) {
report_pmw3325_t report = {0};
uint8_t motion = pmw3325_read(0x02);
if ((motion & MSB1) == MSB1) {
// Motion detected
uint8_t dx_l = pmw3325_read(0x03);
uint8_t dx_h = pmw3325_read(0x04);
uint8_t dy_l = pmw3325_read(0x05);
uint8_t dy_h = pmw3325_read(0x06);
report.dx = convert_twoscomp_16(dx_h, dx_l);
report.dy = convert_twoscomp_16(dy_h, dy_l);
}
return report;
}
static const uint8_t pmw3325_cpi_lut[50] = {0x02, 0x04, 0x06, 0x08, 0x0B, 0x0D, 0x0F, 0x12, 0x14, 0x16, 0x19, 0x1B, 0x1D, 0x20, 0x22, 0x24, 0x27, 0x29, 0x2B, 0x2E, 0x30, 0x32, 0x34, 0x37, 0x39, 0x3B, 0x3E, 0x40, 0x42, 0x45, 0x47, 0x49, 0x4C, 0x4E, 0x50, 0x53, 0x55, 0x57, 0x5A, 0x5C, 0x5E, 0x61, 0x63, 0x65, 0x68, 0x6A, 0x6C, 0x6F, 0x71, 0x73};
void pmw3325_set_cpi(uint16_t cpi) {
uint8_t cpival = CONSTRAIN((cpi / PMW3325_CPI_STEP), (PMW3325_CPI_MIN / PMW3325_CPI_STEP), (PMW3325_CPI_MAX / PMW3325_CPI_STEP)) - 1U;
pmw3325_write(0x1B, pmw3325_cpi_lut[cpival]);
}
uint16_t pmw3325_get_cpi(void) {
uint8_t cpival = pmw3325_read(0x1B);
for (uint8_t cpi = 0; cpi < 50; cpi++) {
if (pmw3325_cpi_lut[cpi] == cpival) {
return (cpi + 1) * PMW3325_CPI_STEP;
}
}
return 0;
}
report_mouse_t pmw3325_get_report(report_mouse_t mouse_report) {
report_pmw3325_t data = pmw3325_read_burst();
if (data.dx != 0 || data.dy != 0) {
pd_dprintf("Raw ] X: %d, Y: %d\n", data.dx, data.dy);
mouse_report.x = CONSTRAIN_HID_XY(data.dx);
mouse_report.y = CONSTRAIN_HID_XY(data.dy);
}
return mouse_report;
}
bool pmw3325_check_signature(void) {
uint8_t checkval_1 = pmw3325_read(0x00);
uint8_t checkval_2 = pmw3325_read(0x3F);
return (checkval_1 == 0x43 && checkval_2 == 0xBC);
}

44
drivers/sensors/pmw3325.h Normal file
View file

@ -0,0 +1,44 @@
// Copyright 2021 Colin Lam (Ploopy Corporation)
// Copyright 2026 HorrorTroll <https://github.com/HorrorTroll>
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#include <stdbool.h>
#include <stdint.h>
#include "pointing_device.h"
#ifndef PMW3325_CS_PIN
# ifdef POINTING_DEVICE_CS_PIN
# define PMW3325_CS_PIN POINTING_DEVICE_CS_PIN
# else
# error "No chip select pin defined -- missing POINTING_DEVICE_CS_PIN or PMW3325_CS_PIN define"
# endif
#endif
#ifndef PMW3325_SPI_DIVISOR
# error "No PMW3325 SPI divisor defined -- missing PMW3325_SPI_DIVISOR"
#endif
typedef struct {
int16_t dx;
int16_t dy;
} report_pmw3325_t;
extern const pointing_device_driver_t pmw3325_pointing_device_driver;
bool pmw3325_init(void);
report_pmw3325_t pmw3325_read_burst(void);
void pmw3325_set_cpi(uint16_t cpi);
uint16_t pmw3325_get_cpi(void);
report_mouse_t pmw3325_get_report(report_mouse_t mouse_report);
bool pmw3325_check_signature(void);
#if !defined(PMW3325_CPI)
# define PMW3325_CPI 2000
#endif
#define PMW3325_CPI_MIN 100
#define PMW3325_CPI_MAX 5000
#define PMW3325_CPI_STEP 100
#define CONSTRAIN(amt, low, high) ((amt) < (low) ? (low) : ((amt) > (high) ? (high) : (amt)))

View file

@ -3,7 +3,6 @@
#pragma once #pragma once
#define OLED_DISPLAY_128X32
#define I2C1_SCL_PIN GP17 #define I2C1_SCL_PIN GP17
#define I2C1_SDA_PIN GP16 #define I2C1_SDA_PIN GP16
#define I2C_DRIVER I2CD0 #define I2C_DRIVER I2CD0

View file

@ -1,25 +0,0 @@
/*
This is the c configuration file for the keymap
Copyright 2012 Jun Wako <wakojun@gmail.com>
Copyright 2015 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 <http://www.gnu.org/licenses/>.
*/
#pragma once
//#define USE_I2C
#define FORCE_NKRO

View file

@ -14,6 +14,11 @@
"command": true, "command": true,
"nkro": true "nkro": true
}, },
"host": {
"default": {
"nkro": true
}
},
"qmk": { "qmk": {
"locking": { "locking": {
"enabled": true, "enabled": true,

View file

@ -140,30 +140,3 @@ void housekeeping_task_kb(void){
gpio_write_pin(LED_MAC_OS_PIN, (get_highest_layer(default_layer_state) == 3)); gpio_write_pin(LED_MAC_OS_PIN, (get_highest_layer(default_layer_state) == 3));
gpio_write_pin(LED_WIN_LOCK_PIN, keymap_config.no_gui); gpio_write_pin(LED_WIN_LOCK_PIN, keymap_config.no_gui);
} }
bool process_record_kb(uint16_t keycode, keyrecord_t* record) {
if (!process_record_user(keycode, record)) {
return false;
}
switch (keycode) {
case QK_RGB_MATRIX_TOGGLE:
if (record->event.pressed) {
switch (rgb_matrix_get_flags()) {
case LED_FLAG_ALL: {
rgb_matrix_set_flags(LED_FLAG_NONE);
rgb_matrix_set_color_all(0, 0, 0);
} break;
default: {
rgb_matrix_set_flags(LED_FLAG_ALL);
} break;
}
}
if (!rgb_matrix_is_enabled()) {
rgb_matrix_set_flags(LED_FLAG_ALL);
rgb_matrix_enable();
}
return false;
default:
return true;
}
}

View file

@ -4,7 +4,6 @@ This layout replaces the stock layout on the Vortex Race 3.
- Caps Lock indicator LED is enabled by default - Caps Lock indicator LED is enabled by default
- Layer Tap on Caps Lock (tap for Caps Lock, hold for _FN1) - Layer Tap on Caps Lock (tap for Caps Lock, hold for _FN1)
- FORCE_NKRO enabled by default
- Pn key is set to 'KC_NO' by default - Pn key is set to 'KC_NO' by default
* Might be a good place for a macro, or to put your PC to sleep, etc. * Might be a good place for a macro, or to put your PC to sleep, etc.

View file

@ -4,7 +4,6 @@ This layout replaces the stock layout on the Vortex Race 3.
- Caps Lock indicator LED is enabled by default - Caps Lock indicator LED is enabled by default
- Layer Tap on Caps Lock (tap for Caps Lock, hold for _FN1) - Layer Tap on Caps Lock (tap for Caps Lock, hold for _FN1)
- FORCE_NKRO enabled by default
- Pn key is set to 'KC_NO' by default - Pn key is set to 'KC_NO' by default
* Might be a good place for a macro, or to put your PC to sleep, etc. * Might be a good place for a macro, or to put your PC to sleep, etc.

View file

@ -4,7 +4,6 @@ This layout replaces the stock layout on the Vortex Race 3.
- Caps Lock indicator LED is enabled by default - Caps Lock indicator LED is enabled by default
- Layer Tap on Caps Lock (tap for Caps Lock, hold for _FN1) - Layer Tap on Caps Lock (tap for Caps Lock, hold for _FN1)
- FORCE_NKRO enabled by default
- Pn key is set to 'KC_NO' by default - Pn key is set to 'KC_NO' by default
* Might be a good place for a macro, or to put your PC to sleep, etc. * Might be a good place for a macro, or to put your PC to sleep, etc.

View file

@ -4,7 +4,6 @@ This layout replaces the stock layout on the Vortex Race 3.
- Caps Lock indicator LED is enabled by default - Caps Lock indicator LED is enabled by default
- Layer Tap on Caps Lock (tap for Caps Lock, hold for _FN1) - Layer Tap on Caps Lock (tap for Caps Lock, hold for _FN1)
- FORCE_NKRO enabled by default
- Pn key is set to 'KC_NO' by default - Pn key is set to 'KC_NO' by default
* Might be a good place for a macro, or to put your PC to sleep, etc. * Might be a good place for a macro, or to put your PC to sleep, etc.

View file

@ -4,7 +4,6 @@ This layout replaces the stock layout on the Vortex Race 3.
- Caps Lock indicator LED is enabled by default - Caps Lock indicator LED is enabled by default
- Layer Tap on Caps Lock (tap for Caps Lock, hold for _FN1) - Layer Tap on Caps Lock (tap for Caps Lock, hold for _FN1)
- FORCE_NKRO enabled by default
- Pn key is set to 'KC_NO' by default - Pn key is set to 'KC_NO' by default
* Might be a good place for a macro, or to put your PC to sleep, etc. * Might be a good place for a macro, or to put your PC to sleep, etc.

View file

@ -19,6 +19,5 @@
// OLED driver // OLED driver
#ifdef OLED_DRIVER_ENABLE #ifdef OLED_DRIVER_ENABLE
#define OLED_DISPLAY_128X32
#define OLED_TIMEOUT 30000 #define OLED_TIMEOUT 30000
#endif #endif

View file

@ -3,10 +3,6 @@
#pragma once #pragma once
#ifdef OLED_ENABLE
#define OLED_DISPLAY_128X32
#endif
#ifdef PS2_DRIVER_INTERRUPT #ifdef PS2_DRIVER_INTERRUPT
#define PS2_CLOCK_PIN E6 #define PS2_CLOCK_PIN E6
#define PS2_DATA_PIN D7 #define PS2_DATA_PIN D7

View file

@ -157,32 +157,3 @@ bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) {
} }
#endif #endif
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
if (!process_record_user(keycode, record)) {
return false;
}
switch (keycode) {
#ifdef RGB_MATRIX_ENABLE
case QK_RGB_MATRIX_TOGGLE:
if (record->event.pressed) {
switch (rgb_matrix_get_flags()) {
case LED_FLAG_ALL: {
rgb_matrix_set_flags(LED_FLAG_NONE);
rgb_matrix_set_color_all(0, 0, 0);
} break;
default: {
rgb_matrix_set_flags(LED_FLAG_ALL);
} break;
}
}
if (!rgb_matrix_is_enabled()) {
rgb_matrix_set_flags(LED_FLAG_ALL);
rgb_matrix_enable();
}
return false;
#endif
default:
return true;
}
}

View file

@ -17,7 +17,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#pragma once #pragma once
#define B7_AUDIO #define AUDIO_PIN B7
/* If defined, GRAVE_ESC will always act as ESC when CTRL is held. /* If defined, GRAVE_ESC will always act as ESC when CTRL is held.
* This is useful for the Windows task manager shortcut (ctrl+shift+esc). * This is useful for the Windows task manager shortcut (ctrl+shift+esc).

View file

@ -17,7 +17,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#pragma once #pragma once
#define B7_AUDIO #define AUDIO_PIN B7
/* If defined, GRAVE_ESC will always act as ESC when CTRL is held. /* If defined, GRAVE_ESC will always act as ESC when CTRL is held.
* This is useful for the Windows task manager shortcut (ctrl+shift+esc). * This is useful for the Windows task manager shortcut (ctrl+shift+esc).

View file

@ -6,32 +6,6 @@
#ifdef RGB_MATRIX_ENABLE #ifdef RGB_MATRIX_ENABLE
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
if (!process_record_user(keycode, record)) {
return false;
}
switch (keycode) {
case RM_TOGG:
if (record->event.pressed) {
switch (rgb_matrix_get_flags()) {
case LED_FLAG_ALL: {
rgb_matrix_set_flags(LED_FLAG_NONE);
rgb_matrix_set_color_all(0, 0, 0);
} break;
default: {
rgb_matrix_set_flags(LED_FLAG_ALL);
} break;
}
}
if (!rgb_matrix_is_enabled()) {
rgb_matrix_set_flags(LED_FLAG_ALL);
rgb_matrix_enable();
}
return false;
}
return true;
}
bool rgb_matrix_indicators_kb(void) { bool rgb_matrix_indicators_kb(void) {
if (!rgb_matrix_indicators_user()) { if (!rgb_matrix_indicators_user()) {
return false; return false;

View file

@ -18,5 +18,4 @@
#define IS31FL3733_I2C_ADDRESS_2 IS31FL3733_I2C_ADDRESS_VCC_VCC #define IS31FL3733_I2C_ADDRESS_2 IS31FL3733_I2C_ADDRESS_VCC_VCC
#define IS31FL3733_PWM_FREQUENCY IS31FL3733_PWM_FREQUENCY_26K7_HZ #define IS31FL3733_PWM_FREQUENCY IS31FL3733_PWM_FREQUENCY_26K7_HZ
#define RGB_MATRIX_CYCLE_ZONES_ENABLE
#define RGB_MATRIX_CAPS_LOCK_INDEX 30 #define RGB_MATRIX_CAPS_LOCK_INDEX 30

View file

@ -18,5 +18,4 @@
#define IS31FL3733_I2C_ADDRESS_2 IS31FL3733_I2C_ADDRESS_VCC_VCC #define IS31FL3733_I2C_ADDRESS_2 IS31FL3733_I2C_ADDRESS_VCC_VCC
#define IS31FL3733_PWM_FREQUENCY IS31FL3733_PWM_FREQUENCY_26K7_HZ #define IS31FL3733_PWM_FREQUENCY IS31FL3733_PWM_FREQUENCY_26K7_HZ
#define RGB_MATRIX_CYCLE_ZONES_ENABLE
#define RGB_MATRIX_CAPS_LOCK_INDEX 50 #define RGB_MATRIX_CAPS_LOCK_INDEX 50

View file

@ -19,35 +19,4 @@ bool rgb_matrix_indicators_kb(void) {
return true; return true;
} }
# endif # endif
# ifdef RGB_MATRIX_CYCLE_ZONES_ENABLE
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
if (!process_record_user(keycode, record)) {
return false;
}
if (!record->event.pressed) {
switch (keycode) {
case QK_RGB_MATRIX_TOGGLE:
switch (rgb_matrix_get_flags()) {
case LED_FLAG_ALL:
rgb_matrix_set_flags(LED_FLAG_KEYLIGHT | LED_FLAG_MODIFIER | LED_FLAG_INDICATOR);
break;
case (LED_FLAG_KEYLIGHT | LED_FLAG_MODIFIER | LED_FLAG_INDICATOR):
rgb_matrix_set_flags(LED_FLAG_UNDERGLOW);
break;
case LED_FLAG_UNDERGLOW:
rgb_matrix_set_flags(LED_FLAG_NONE);
break;
default:
rgb_matrix_set_flags(LED_FLAG_ALL);
break;
}
return false;
}
}
return true;
};
# endif
#endif #endif

View file

@ -13,5 +13,4 @@
#define IS31FL3733_I2C_ADDRESS_2 IS31FL3733_I2C_ADDRESS_VCC_VCC #define IS31FL3733_I2C_ADDRESS_2 IS31FL3733_I2C_ADDRESS_VCC_VCC
#define IS31FL3733_PWM_FREQUENCY IS31FL3733_PWM_FREQUENCY_26K7_HZ #define IS31FL3733_PWM_FREQUENCY IS31FL3733_PWM_FREQUENCY_26K7_HZ
#define RGB_MATRIX_CYCLE_ZONES_ENABLE
#define RGB_MATRIX_CAPS_LOCK_INDEX 62 #define RGB_MATRIX_CAPS_LOCK_INDEX 62

View file

@ -18,5 +18,3 @@
#define IS31FL3733_I2C_ADDRESS_2 IS31FL3733_I2C_ADDRESS_VCC_VCC #define IS31FL3733_I2C_ADDRESS_2 IS31FL3733_I2C_ADDRESS_VCC_VCC
#define IS31FL3733_I2C_ADDRESS_3 IS31FL3733_I2C_ADDRESS_GND_GND #define IS31FL3733_I2C_ADDRESS_3 IS31FL3733_I2C_ADDRESS_GND_GND
#define IS31FL3733_PWM_FREQUENCY IS31FL3733_PWM_FREQUENCY_26K7_HZ #define IS31FL3733_PWM_FREQUENCY IS31FL3733_PWM_FREQUENCY_26K7_HZ
#define RGB_MATRIX_CYCLE_ZONES_ENABLE

View file

@ -8,7 +8,7 @@
#undef PERMISSIVE_HOLD #undef PERMISSIVE_HOLD
#define FORCE_NKRO #define NKRO_DEFAULT_ON true
#ifndef TAPPING_TOGGLE #ifndef TAPPING_TOGGLE
#define TAPPING_TOGGLE 1 #define TAPPING_TOGGLE 1

View file

@ -15,6 +15,11 @@
"nkro": true, "nkro": true,
"rgblight": true "rgblight": true
}, },
"host": {
"default": {
"nkro": true
}
},
"qmk": { "qmk": {
"locking": { "locking": {
"enabled": true, "enabled": true,

View file

@ -16,4 +16,3 @@
#pragma once #pragma once
#define ONESHOT_TIMEOUT 2000 #define ONESHOT_TIMEOUT 2000
#define FORCE_NKRO

View file

@ -7,6 +7,5 @@
#define I2C1_SCL_PIN GP27 #define I2C1_SCL_PIN GP27
#define I2C1_SDA_PIN GP26 #define I2C1_SDA_PIN GP26
#define I2C_DRIVER I2CD1 #define I2C_DRIVER I2CD1
#define OLED_DISPLAY_128X32
#define OLED_BRIGHTNESS 128 #define OLED_BRIGHTNESS 128
#endif #endif

View file

@ -101,39 +101,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
), ),
}; };
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case QK_RGB_MATRIX_TOGGLE:
if (record->event.pressed) {
switch (rgb_matrix_get_flags()) {
case LED_FLAG_ALL: {
rgb_matrix_set_flags(LED_FLAG_KEYLIGHT | LED_FLAG_MODIFIER | LED_FLAG_INDICATOR);
rgb_matrix_set_color_all(0, 0, 0);
}
break;
case (LED_FLAG_KEYLIGHT | LED_FLAG_MODIFIER | LED_FLAG_INDICATOR): {
rgb_matrix_set_flags(LED_FLAG_UNDERGLOW);
rgb_matrix_set_color_all(0, 0, 0);
}
break;
case (LED_FLAG_UNDERGLOW): {
rgb_matrix_set_flags(LED_FLAG_NONE);
rgb_matrix_set_color_all(0, 0, 0);
}
break;
default: {
rgb_matrix_set_flags(LED_FLAG_ALL);
rgb_matrix_enable_noeeprom();
}
break;
}
}
return false;
}
return true;
}
bool rgb_matrix_indicators_user(void) { bool rgb_matrix_indicators_user(void) {
rgb_matrix_set_color(46, 0, 0, 0); rgb_matrix_set_color(46, 0, 0, 0);
rgb_matrix_set_color(104, 0, 0, 0); rgb_matrix_set_color(104, 0, 0, 0);

View file

@ -25,38 +25,6 @@
#include <math.h> #include <math.h>
#include <lib/lib8tion/lib8tion.h> #include <lib/lib8tion/lib8tion.h>
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case QK_RGB_MATRIX_TOGGLE:
if (record->event.pressed) {
switch (rgb_matrix_get_flags()) {
case LED_FLAG_ALL: {
rgb_matrix_set_flags(LED_FLAG_KEYLIGHT | LED_FLAG_MODIFIER | LED_FLAG_INDICATOR);
rgb_matrix_set_color_all(0, 0, 0);
}
break;
case (LED_FLAG_KEYLIGHT | LED_FLAG_MODIFIER | LED_FLAG_INDICATOR): {
rgb_matrix_set_flags(LED_FLAG_UNDERGLOW);
rgb_matrix_set_color_all(0, 0, 0);
}
break;
case (LED_FLAG_UNDERGLOW): {
rgb_matrix_set_flags(LED_FLAG_NONE);
rgb_matrix_set_color_all(0, 0, 0);
}
break;
default: {
rgb_matrix_set_flags(LED_FLAG_ALL);
rgb_matrix_enable_noeeprom();
}
break;
}
}
return false;
}
return process_record_user(keycode, record);
}
bool rgb_matrix_indicators_kb(void) { bool rgb_matrix_indicators_kb(void) {
if (!rgb_matrix_indicators_user()) { if (!rgb_matrix_indicators_user()) {
return false; return false;

View file

@ -0,0 +1,51 @@
{
"manufacturer": "Kenneth Fossen",
"keyboard_name": "Bouvet Macropad v1",
"maintainer": "spydx",
"development_board": "promicro",
"diode_direction": "COL2ROW",
"features": {
"extrakey": true,
"mousekey": true,
"nkro": true
},
"matrix_pins": {
"cols": ["D7","E6","B4","B5"],
"rows": ["B1", "B3", "B2", "B6"]
},
"encoders": {
"rotary": [
{"pin_a": "C6", "pin_b": "D4"},
{"pin_a": "F6", "pin_b": "F7"}
]
},
"url": "https://kefo.no",
"usb": {
"device_version": "1.0.0",
"pid": "0x0000",
"vid": "0xFEED"
},
"layouts": {
"LAYOUT": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [0, 1], "x": 1, "y": 0},
{"matrix": [0, 2], "x": 2, "y": 0},
{"matrix": [0, 3], "x": 3, "y": 0},
{"matrix": [1, 0], "x": 0, "y": 1},
{"matrix": [1, 1], "x": 1, "y": 1},
{"matrix": [1, 2], "x": 2, "y": 1},
{"matrix": [1, 3], "x": 3, "y": 1},
{"matrix": [2, 0], "x": 0, "y": 2},
{"matrix": [2, 1], "x": 1, "y": 2},
{"matrix": [2, 2], "x": 2, "y": 2},
{"matrix": [2, 3], "x": 3, "y": 2},
{"matrix": [3, 1], "x": 1, "y": 3},
{"matrix": [3, 2], "x": 2, "y": 3}
]
}
}
}

View file

@ -0,0 +1,19 @@
// Copyright 2026 Kenneth Fossen
// SPDX-License-Identifier: GPL-2.0-or-later
#include QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT(
KC_MCTL, LCS(KC_TAB), C(KC_TAB), KC_MPLY,
KC_P4, KC_P5, KC_P6, KC_PAST,
KC_P1, KC_P2, KC_P3, KC_PENT,
LCMD(KC_C), LCMD(KC_V)
)
};
#if defined(ENCODER_MAP_ENABLE)
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
[0] = { ENCODER_CCW_CW(KC_MPRV, KC_MNXT), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }
};
#endif

View file

@ -0,0 +1,27 @@
# bouvet/macropad/v1
![bouvet/macropad/v1](https://www.kefo.no/assets/macropad/macropad_v1.png)
Small macropad, with two rotary encoder buttons and 14 keys.
Optional OLED 128x16 screen, small learning and sharing project.
* Keyboard Maintainer: [Kenneth Fossen](https://github.com/spydx)
* Hardware Supported: Bouvet Macropad
* Hardware Availability: [Shop](https://www.kefo.no/macropad)
Make example for this keyboard (after setting up your build environment):
make handwired/bouvet/macropad/v1:default
Flashing example for this keyboard:
make handwired/bouvet/macropad/v1:default:flash
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
## Bootloader
Enter the bootloader in 3 ways:
* **Bootmagic reset**: Hold down the key at (0,0) in the matrix (usually the top left key or Escape) and plug in the keyboard
* **Physical reset button**: Briefly press the button on the back of the PCB - some may have pads you must short instead
* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available

View file

@ -13,6 +13,11 @@
"mousekey": true, "mousekey": true,
"nkro": true "nkro": true
}, },
"host": {
"default": {
"nkro": true
}
},
"matrix_pins": { "matrix_pins": {
"cols": ["C7", "C6", "B6", "B5", "B4", "D7", "D6", "D4"], "cols": ["C7", "C6", "B6", "B5", "B4", "D7", "D6", "D4"],
"rows": ["D5", "D3", "D2", "D1", "D0", "B7"] "rows": ["D5", "D3", "D2", "D1", "D0", "B7"]

View file

@ -1,21 +0,0 @@
/*
Copyright 2020 Ckat <ckat@teknik.io>
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 <http://www.gnu.org/licenses/>.
*/
#pragma once
/* ensure NKRO is on */
#define FORCE_NKRO

View file

@ -1,21 +0,0 @@
/*
Copyright 2020 Ckat <ckat@teknik.io>
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 <http://www.gnu.org/licenses/>.
*/
#pragma once
/* ensure NKRO is on */
#define FORCE_NKRO

View file

@ -11,7 +11,6 @@
#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 500U #define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 500U
// settings for the oled keyboard demo with Adafruit 0.91" OLED display on the Stemma QT port // settings for the oled keyboard demo with Adafruit 0.91" OLED display on the Stemma QT port
#define OLED_DISPLAY_128X32
#define I2C_DRIVER I2CD0 #define I2C_DRIVER I2CD0
#define I2C1_SDA_PIN GP12 #define I2C1_SDA_PIN GP12
#define I2C1_SCL_PIN GP13 #define I2C1_SCL_PIN GP13

View file

@ -0,0 +1,8 @@
// Copyright 2022 QMK
// SPDX-License-Identifier: GPL-2.0-or-later
#include QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT(KC_L, KC_R)
};

View file

@ -0,0 +1,5 @@
{
"modules": [
"qmk/split_data_sync"
]
}

View file

@ -31,8 +31,6 @@ enum layer_names {
_FN, _FN,
}; };
// enum layer_keycodes { };
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* /*
@ -91,38 +89,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
), ),
}; };
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case QK_RGB_MATRIX_TOGGLE:
if (record->event.pressed) {
switch (rgb_matrix_get_flags()) {
case LED_FLAG_ALL: {
rgb_matrix_set_flags(LED_FLAG_KEYLIGHT | LED_FLAG_MODIFIER | LED_FLAG_INDICATOR);
rgb_matrix_set_color_all(0, 0, 0);
}
break;
case (LED_FLAG_KEYLIGHT | LED_FLAG_MODIFIER | LED_FLAG_INDICATOR): {
rgb_matrix_set_flags(LED_FLAG_UNDERGLOW);
rgb_matrix_set_color_all(0, 0, 0);
}
break;
case (LED_FLAG_UNDERGLOW): {
rgb_matrix_set_flags(LED_FLAG_NONE);
rgb_matrix_set_color_all(0, 0, 0);
}
break;
default: {
rgb_matrix_set_flags(LED_FLAG_ALL);
rgb_matrix_enable_noeeprom();
}
break;
}
}
return false;
}
return true;
}
bool rgb_matrix_indicators_user(void) { bool rgb_matrix_indicators_user(void) {
hsv_t hsv = rgb_matrix_config.hsv; hsv_t hsv = rgb_matrix_config.hsv;
uint8_t time = scale16by8(g_rgb_timer, qadd8(32, 1)); uint8_t time = scale16by8(g_rgb_timer, qadd8(32, 1));

View file

@ -44,20 +44,6 @@ typedef struct {
bool reflected; bool reflected;
} CUSTOM_PRESETS; } CUSTOM_PRESETS;
enum user_rgb_mode {
RGB_MODE_ALL,
RGB_MODE_NONE,
};
typedef union {
uint32_t raw;
struct {
uint8_t rgb_mode :8;
};
} user_config_t;
user_config_t user_config;
enum layer_keycodes { enum layer_keycodes {
//Custom Gradient control keycode //Custom Gradient control keycode
G1_HUI = SAFE_RANGE, //Custom gradient color 1 hue increase G1_HUI = SAFE_RANGE, //Custom gradient color 1 hue increase
@ -80,20 +66,6 @@ enum layer_keycodes {
RGB_C_E, //Cycle user effect RGB_C_E, //Cycle user effect
}; };
void keyboard_post_init_user(void) {
user_config.raw = eeconfig_read_user();
switch (user_config.rgb_mode) {
case RGB_MODE_ALL:
rgb_matrix_set_flags(LED_FLAG_ALL);
rgb_matrix_enable_noeeprom();
break;
case RGB_MODE_NONE:
rgb_matrix_set_flags(LED_FLAG_NONE);
rgb_matrix_set_color_all(0, 0, 0);
break;
}
}
bool process_record_user(uint16_t keycode, keyrecord_t *record) { bool process_record_user(uint16_t keycode, keyrecord_t *record) {
process_record_user_oled(keycode, record); process_record_user_oled(keycode, record);
@ -229,25 +201,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
} }
} }
return false; return false;
case QK_RGB_MATRIX_TOGGLE:
if (record->event.pressed) {
switch (rgb_matrix_get_flags()) {
case LED_FLAG_ALL: {
rgb_matrix_set_flags(LED_FLAG_NONE);
rgb_matrix_set_color_all(0, 0, 0);
user_config.rgb_mode = RGB_MODE_NONE;
}
break;
default: {
rgb_matrix_set_flags(LED_FLAG_ALL);
rgb_matrix_enable_noeeprom();
user_config.rgb_mode = RGB_MODE_ALL;
}
break;
}
eeconfig_update_user(user_config.raw);
}
return false;
} }
return true; return true;
} }

View file

@ -17,52 +17,6 @@
#include "quantum.h" #include "quantum.h"
#ifdef RGB_MATRIX_ENABLE #ifdef RGB_MATRIX_ENABLE
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case QK_RGB_MATRIX_TOGGLE:
if (record->event.pressed) {
switch (rgb_matrix_get_flags()) {
case LED_FLAG_ALL: {
rgb_matrix_set_flags(LED_FLAG_NONE);
rgb_matrix_set_color_all(0, 0, 0);
}
break;
default: {
rgb_matrix_set_flags(LED_FLAG_ALL);
rgb_matrix_enable_noeeprom();
}
break;
}
}
return false;
case QK_RGB_MATRIX_MODE_NEXT:
if (record->event.pressed) {
switch (rgb_matrix_get_mode()) {
case RGB_MATRIX_SOLID_MULTISPLASH:
rgb_matrix_mode(RGB_MATRIX_SOLID_COLOR);
return false;
default:
rgb_matrix_step();
return false;
}
}
return false;
case QK_RGB_MATRIX_MODE_PREVIOUS:
if (record->event.pressed) {
switch (rgb_matrix_get_mode()) {
case RGB_MATRIX_SOLID_COLOR:
rgb_matrix_mode(RGB_MATRIX_SOLID_MULTISPLASH);
return false;
default:
rgb_matrix_step_reverse();
return false;
}
}
return false;
}
return process_record_user(keycode, record);
}
bool rgb_matrix_indicators_kb(void) { bool rgb_matrix_indicators_kb(void) {
if (!rgb_matrix_indicators_user()) { if (!rgb_matrix_indicators_user()) {
@ -76,14 +30,4 @@ bool rgb_matrix_indicators_kb(void) {
} }
return true; return true;
} }
void keyboard_post_init_kb(void) {
if (!(rgb_matrix_get_flags() & LED_FLAG_ALL)) {
rgb_matrix_set_color_all(0, 0, 0);
} else {
rgb_matrix_mode_noeeprom(RGB_MATRIX_CUSTOM_STARTUP_SWIRL_ANIM);
}
keyboard_post_init_user();
}
#endif #endif

View file

@ -164,31 +164,3 @@ bool dip_switch_update_kb(uint8_t index, bool active) {
} }
return true; return true;
} }
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
if (!process_record_user(keycode, record)) {
return false;
}
switch (keycode) {
case QK_RGB_MATRIX_TOGGLE:
if (record->event.pressed) {
switch (rgb_matrix_get_flags()) {
case LED_FLAG_ALL: {
rgb_matrix_set_flags(LED_FLAG_NONE);
rgb_matrix_set_color_all(0, 0, 0);
} break;
default: {
rgb_matrix_set_flags(LED_FLAG_ALL);
} break;
}
}
if (!rgb_matrix_is_enabled()) {
rgb_matrix_set_flags(LED_FLAG_ALL);
rgb_matrix_enable();
}
return false;
default:
return true;
}
}

View file

@ -2,8 +2,6 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
#pragma once #pragma once
#define OLED_DISPLAY_128X32
#ifdef RGBLIGHT_ENABLE #ifdef RGBLIGHT_ENABLE
#define RGBLIGHT_EFFECT_BREATHING #define RGBLIGHT_EFFECT_BREATHING
#define RGBLIGHT_EFFECT_RAINBOW_MOOD #define RGBLIGHT_EFFECT_RAINBOW_MOOD

View file

@ -38,44 +38,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
) )
}; };
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case QK_RGB_MATRIX_TOGGLE:
if (record->event.pressed) {
switch (rgb_matrix_get_flags()) {
case LED_FLAG_ALL: {
rgb_matrix_set_flags(LED_FLAG_KEYLIGHT | LED_FLAG_MODIFIER);
rgb_matrix_set_color_all(0, 0, 0);
}
break;
case (LED_FLAG_KEYLIGHT | LED_FLAG_MODIFIER): {
rgb_matrix_set_flags(LED_FLAG_UNDERGLOW);
rgb_matrix_set_color_all(0, 0, 0);
}
break;
case LED_FLAG_UNDERGLOW: {
rgb_matrix_set_flags(LED_FLAG_INDICATOR);
rgb_matrix_set_color_all(0, 0, 0);
}
break;
case LED_FLAG_INDICATOR: {
rgb_matrix_set_flags(LED_FLAG_NONE);
rgb_matrix_disable_noeeprom();
}
break;
default: {
rgb_matrix_set_flags(LED_FLAG_ALL);
rgb_matrix_enable_noeeprom();
}
break;
}
}
return false;
default:
return true; //Process all other keycodes normally
}
}
bool rgb_matrix_indicators_user(void) { bool rgb_matrix_indicators_user(void) {
led_t host_leds = host_keyboard_led_state(); led_t host_leds = host_keyboard_led_state();
if (host_leds.caps_lock) { if (host_leds.caps_lock) {

View file

@ -123,32 +123,6 @@ const snled27351_led_t PROGMEM g_snled27351_leds[SNLED27351_LED_COUNT] = {
// clang-format on // clang-format on
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
if (!process_record_user(keycode, record)) {
return false;
}
switch (keycode) {
case QK_RGB_MATRIX_TOGGLE:
if (record->event.pressed) {
switch (rgb_matrix_get_flags()) {
case LED_FLAG_ALL: {
rgb_matrix_set_flags(LED_FLAG_NONE);
rgb_matrix_set_color_all(0, 0, 0);
} break;
default: {
rgb_matrix_set_flags(LED_FLAG_ALL);
} break;
}
}
if (!rgb_matrix_is_enabled()) {
rgb_matrix_set_flags(LED_FLAG_ALL);
rgb_matrix_enable();
}
return false;
}
return true;
}
bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) { bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) {
if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) {
return false; return false;

View file

@ -123,32 +123,6 @@ const snled27351_led_t PROGMEM g_snled27351_leds[SNLED27351_LED_COUNT] = {
// clang-format on // clang-format on
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
if (!process_record_user(keycode, record)) {
return false;
}
switch (keycode) {
case LM_TOGG:
if (record->event.pressed) {
switch (led_matrix_get_flags()) {
case LED_FLAG_ALL: {
led_matrix_set_flags(LED_FLAG_NONE);
led_matrix_set_value_all(0);
} break;
default: {
led_matrix_set_flags(LED_FLAG_ALL);
} break;
}
}
if (!led_matrix_is_enabled()) {
led_matrix_set_flags(LED_FLAG_ALL);
led_matrix_enable();
}
return false;
}
return true;
}
bool led_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) { bool led_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) {
if (!led_matrix_indicators_advanced_user(led_min, led_max)) { if (!led_matrix_indicators_advanced_user(led_min, led_max)) {
return false; return false;

View file

@ -28,54 +28,6 @@ bool dip_switch_update_kb(uint8_t index, bool active) {
} }
#endif #endif
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
if (!process_record_user(keycode, record)) {
return false;
}
switch (keycode) {
#ifdef RGB_MATRIX_ENABLE
case QK_RGB_MATRIX_TOGGLE:
if (record->event.pressed) {
switch (rgb_matrix_get_flags()) {
case LED_FLAG_ALL: {
rgb_matrix_set_flags(LED_FLAG_NONE);
rgb_matrix_set_color_all(0, 0, 0);
} break;
default: {
rgb_matrix_set_flags(LED_FLAG_ALL);
} break;
}
}
if (!rgb_matrix_is_enabled()) {
rgb_matrix_set_flags(LED_FLAG_ALL);
rgb_matrix_enable();
}
return false;
#endif
#ifdef LED_MATRIX_ENABLE
case QK_LED_MATRIX_TOGGLE:
if (record->event.pressed) {
switch (led_matrix_get_flags()) {
case LED_FLAG_ALL: {
led_matrix_set_flags(LED_FLAG_NONE);
led_matrix_set_value_all(0);
} break;
default: {
led_matrix_set_flags(LED_FLAG_ALL);
} break;
}
}
if (!led_matrix_is_enabled()) {
led_matrix_set_flags(LED_FLAG_ALL);
led_matrix_enable();
}
return false;
#endif
default:
return true;
}
}
void keyboard_post_init_kb(void) { void keyboard_post_init_kb(void) {
gpio_set_pin_output_push_pull(LED_MAC_OS_PIN); gpio_set_pin_output_push_pull(LED_MAC_OS_PIN);
gpio_set_pin_output_push_pull(LED_WIN_OS_PIN); gpio_set_pin_output_push_pull(LED_WIN_OS_PIN);

View file

@ -31,64 +31,20 @@ bool dip_switch_update_kb(uint8_t index, bool active) {
#endif // DIP_SWITCH_ENABLE #endif // DIP_SWITCH_ENABLE
# ifdef RGB_MATRIX_ENABLE # ifdef RGB_MATRIX_ENABLE
# define LED_TOGGLE_KEYCODE QK_RGB_MATRIX_TOGGLE
# define LED_SET_FLAGS rgb_matrix_set_flags
# define LED_GET_FLAGS rgb_matrix_get_flags
# define LED_SET_ALL_OFF rgb_matrix_set_color_all(COLOR_BLACK)
# define LED_IS_ENABLED rgb_matrix_is_enabled
# define LED_ENABLE rgb_matrix_enable
# define LED_MATRIX_INDICATORS_KB rgb_matrix_indicators_kb # define LED_MATRIX_INDICATORS_KB rgb_matrix_indicators_kb
# define LED_MATRIX_INDICATORS_USER rgb_matrix_indicators_user # define LED_MATRIX_INDICATORS_USER rgb_matrix_indicators_user
# define LED_MATRIX_SET_COLOR rgb_matrix_set_color # define LED_MATRIX_SET_COLOR rgb_matrix_set_color
# define LED_MATRIX_UPDATE_PWN_BUFFERS rgb_matrix_update_pwm_buffers
# define LED_MATRIX_INDICATORS_NONE_KB rgb_matrix_indicators_none_kb
# define LED_MATRIX_IS_ENABLED rgb_matrix_is_enabled
# define COLOR_WHITE 255, 255, 255 # define COLOR_WHITE 255, 255, 255
# define COLOR_BLACK 0, 0, 0 # define COLOR_BLACK 0, 0, 0
# endif # endif
# ifdef LED_MATRIX_ENABLE # ifdef LED_MATRIX_ENABLE
# define LED_TOGGLE_KEYCODE QK_LED_MATRIX_TOGGLE
# define LED_SET_FLAGS led_matrix_set_flags
# define LED_GET_FLAGS led_matrix_get_flags
# define LED_SET_ALL_OFF led_matrix_set_value_all(COLOR_BLACK)
# define LED_IS_ENABLED led_matrix_is_enabled
# define LED_ENABLE led_matrix_enable
# define LED_MATRIX_INDICATORS_KB led_matrix_indicators_kb # define LED_MATRIX_INDICATORS_KB led_matrix_indicators_kb
# define LED_MATRIX_INDICATORS_USER led_matrix_indicators_user # define LED_MATRIX_INDICATORS_USER led_matrix_indicators_user
# define LED_MATRIX_SET_COLOR led_matrix_set_value # define LED_MATRIX_SET_COLOR led_matrix_set_value
# define LED_MATRIX_UPDATE_PWN_BUFFERS led_matrix_update_pwm_buffers
# define LED_MATRIX_INDICATORS_NONE_KB led_matrix_indicators_none_kb
# define LED_MATRIX_IS_ENABLED led_matrix_is_enabled
# define COLOR_WHITE 255 # define COLOR_WHITE 255
# define COLOR_BLACK 0 # define COLOR_BLACK 0
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
if (!process_record_user(keycode, record)) {
return false;
}
switch (keycode) {
case LED_TOGGLE_KEYCODE:
if (record->event.pressed) {
switch (LED_GET_FLAGS()) {
case LED_FLAG_ALL: {
LED_SET_FLAGS(LED_FLAG_NONE);
LED_SET_ALL_OFF;
} break;
default: {
LED_SET_FLAGS(LED_FLAG_ALL);
} break;
}
}
if (!LED_IS_ENABLED()) {
LED_SET_FLAGS(LED_FLAG_ALL);
LED_ENABLE();
}
return false;
}
return true;
}
bool LED_MATRIX_INDICATORS_KB(void) { bool LED_MATRIX_INDICATORS_KB(void) {
if (!LED_MATRIX_INDICATORS_USER()) { if (!LED_MATRIX_INDICATORS_USER()) {
return false; return false;

View file

@ -28,54 +28,6 @@ bool dip_switch_update_kb(uint8_t index, bool active) {
} }
#endif #endif
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
if (!process_record_user(keycode, record)) {
return false;
}
switch (keycode) {
#ifdef RGB_MATRIX_ENABLE
case QK_RGB_MATRIX_TOGGLE:
if (record->event.pressed) {
switch (rgb_matrix_get_flags()) {
case LED_FLAG_ALL: {
rgb_matrix_set_flags(LED_FLAG_NONE);
rgb_matrix_set_color_all(0, 0, 0);
} break;
default: {
rgb_matrix_set_flags(LED_FLAG_ALL);
} break;
}
}
if (!rgb_matrix_is_enabled()) {
rgb_matrix_set_flags(LED_FLAG_ALL);
rgb_matrix_enable();
}
return false;
#endif
#ifdef LED_MATRIX_ENABLE
case QK_LED_MATRIX_TOGGLE:
if (record->event.pressed) {
switch (led_matrix_get_flags()) {
case LED_FLAG_ALL: {
led_matrix_set_flags(LED_FLAG_NONE);
led_matrix_set_value_all(0);
} break;
default: {
led_matrix_set_flags(LED_FLAG_ALL);
} break;
}
}
if (!led_matrix_is_enabled()) {
led_matrix_set_flags(LED_FLAG_ALL);
led_matrix_enable();
}
return false;
#endif
default:
return true;
}
}
void keyboard_post_init_kb(void) { void keyboard_post_init_kb(void) {
gpio_set_pin_output_push_pull(LED_MAC_OS_PIN); gpio_set_pin_output_push_pull(LED_MAC_OS_PIN);
gpio_set_pin_output_push_pull(LED_WIN_OS_PIN); gpio_set_pin_output_push_pull(LED_WIN_OS_PIN);

View file

@ -41,44 +41,6 @@ bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
return false; return false;
} }
switch (keycode) { switch (keycode) {
#ifdef RGB_MATRIX_ENABLE
case QK_RGB_MATRIX_TOGGLE:
if (record->event.pressed) {
switch (rgb_matrix_get_flags()) {
case LED_FLAG_ALL: {
rgb_matrix_set_flags(LED_FLAG_NONE);
rgb_matrix_set_color_all(0, 0, 0);
} break;
default: {
rgb_matrix_set_flags(LED_FLAG_ALL);
} break;
}
}
if (!rgb_matrix_is_enabled()) {
rgb_matrix_set_flags(LED_FLAG_ALL);
rgb_matrix_enable();
}
return false;
#endif
#ifdef LED_MATRIX_ENABLE
case QK_LED_MATRIX_TOGGLE:
if (record->event.pressed) {
switch (led_matrix_get_flags()) {
case LED_FLAG_ALL: {
led_matrix_set_flags(LED_FLAG_NONE);
led_matrix_set_value_all(0);
} break;
default: {
led_matrix_set_flags(LED_FLAG_ALL);
} break;
}
}
if (!led_matrix_is_enabled()) {
led_matrix_set_flags(LED_FLAG_ALL);
led_matrix_enable();
}
return false;
#endif
case KC_OSSW: case KC_OSSW:
if (record->event.pressed) { if (record->event.pressed) {
// Switches default layer between `MAC_BASE` and `WIN_BASE` (0 and 2) // Switches default layer between `MAC_BASE` and `WIN_BASE` (0 and 2)

View file

@ -18,30 +18,6 @@
#if defined(RGB_MATRIX_ENABLE) && defined(NUM_LOCK_LED_INDEX) #if defined(RGB_MATRIX_ENABLE) && defined(NUM_LOCK_LED_INDEX)
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
if (!process_record_user(keycode, record)) {
return false;
}
switch (keycode) {
# ifdef RGB_MATRIX_ENABLE
case QK_RGB_MATRIX_TOGGLE:
if (record->event.pressed) {
switch (rgb_matrix_get_flags()) {
case LED_FLAG_ALL: {
rgb_matrix_set_flags(LED_FLAG_NONE);
rgb_matrix_set_color_all(0, 0, 0);
} break;
default: {
rgb_matrix_set_flags(LED_FLAG_ALL);
} break;
}
}
return false;
# endif
}
return true;
}
bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) { bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) {
if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) {
return false; return false;

View file

@ -32,34 +32,6 @@ bool dip_switch_update_kb(uint8_t index, bool active) {
#if defined(RGB_MATRIX_ENABLE) && defined(CAPS_LOCK_LED_INDEX) #if defined(RGB_MATRIX_ENABLE) && defined(CAPS_LOCK_LED_INDEX)
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
if (!process_record_user(keycode, record)) {
return false;
}
switch (keycode) {
# ifdef RGB_MATRIX_ENABLE
case QK_RGB_MATRIX_TOGGLE:
if (record->event.pressed) {
switch (rgb_matrix_get_flags()) {
case LED_FLAG_ALL: {
rgb_matrix_set_flags(LED_FLAG_NONE);
rgb_matrix_set_color_all(0, 0, 0);
} break;
default: {
rgb_matrix_set_flags(LED_FLAG_ALL);
} break;
}
}
if (!rgb_matrix_is_enabled()) {
rgb_matrix_set_flags(LED_FLAG_ALL);
rgb_matrix_enable();
}
return false;
# endif
}
return true;
}
bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) { bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) {
if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) {
return false; return false;

View file

@ -29,31 +29,6 @@ bool dip_switch_update_kb(uint8_t index, bool active) {
#endif #endif
#if defined(RGB_MATRIX_ENABLE) && defined(CAPS_LOCK_LED_INDEX) #if defined(RGB_MATRIX_ENABLE) && defined(CAPS_LOCK_LED_INDEX)
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
if (!process_record_user(keycode, record)) {
return false;
}
switch (keycode) {
case QK_RGB_MATRIX_TOGGLE:
if (record->event.pressed) {
switch (rgb_matrix_get_flags()) {
case LED_FLAG_ALL: {
rgb_matrix_set_flags(LED_FLAG_NONE);
rgb_matrix_set_color_all(0, 0, 0);
} break;
default: {
rgb_matrix_set_flags(LED_FLAG_ALL);
} break;
}
}
if (!rgb_matrix_is_enabled()) {
rgb_matrix_set_flags(LED_FLAG_ALL);
rgb_matrix_enable();
}
return false;
}
return true;
}
bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) { bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) {
if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) {

View file

@ -29,31 +29,6 @@ bool dip_switch_update_kb(uint8_t index, bool active) {
#endif #endif
#if defined(RGB_MATRIX_ENABLE) && (defined(CAPS_LOCK_LED_INDEX) || defined(NUM_LOCK_LED_INDEX)) #if defined(RGB_MATRIX_ENABLE) && (defined(CAPS_LOCK_LED_INDEX) || defined(NUM_LOCK_LED_INDEX))
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
if (!process_record_user(keycode, record)) {
return false;
}
switch (keycode) {
case QK_RGB_MATRIX_TOGGLE:
if (record->event.pressed) {
switch (rgb_matrix_get_flags()) {
case LED_FLAG_ALL: {
rgb_matrix_set_flags(LED_FLAG_NONE);
rgb_matrix_set_color_all(0, 0, 0);
} break;
default: {
rgb_matrix_set_flags(LED_FLAG_ALL);
} break;
}
}
if (!rgb_matrix_is_enabled()) {
rgb_matrix_set_flags(LED_FLAG_ALL);
rgb_matrix_enable();
}
return false;
}
return true;
}
bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) { bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) {
if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) {

View file

@ -30,32 +30,6 @@ bool dip_switch_update_kb(uint8_t index, bool active) {
#if defined(RGB_MATRIX_ENABLE) && defined(CAPS_LOCK_LED_INDEX) #if defined(RGB_MATRIX_ENABLE) && defined(CAPS_LOCK_LED_INDEX)
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
if (!process_record_user(keycode, record)) { return false; }
switch (keycode) {
#ifdef RGB_MATRIX_ENABLE
case QK_RGB_MATRIX_TOGGLE:
if (record->event.pressed) {
switch (rgb_matrix_get_flags()) {
case LED_FLAG_ALL: {
rgb_matrix_set_flags(LED_FLAG_NONE);
rgb_matrix_set_color_all(0, 0, 0);
} break;
default: {
rgb_matrix_set_flags(LED_FLAG_ALL);
} break;
}
}
if (!rgb_matrix_is_enabled()) {
rgb_matrix_set_flags(LED_FLAG_ALL);
rgb_matrix_enable();
}
return false;
#endif
}
return true;
}
bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) { bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) {
if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { return false; } if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { return false; }
// RGB_MATRIX_INDICATOR_SET_COLOR(index, red, green, blue); // RGB_MATRIX_INDICATOR_SET_COLOR(index, red, green, blue);

View file

@ -30,34 +30,6 @@ bool dip_switch_update_kb(uint8_t index, bool active) {
#if defined(RGB_MATRIX_ENABLE) && defined(CAPS_LOCK_LED_INDEX) #if defined(RGB_MATRIX_ENABLE) && defined(CAPS_LOCK_LED_INDEX)
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
if (!process_record_user(keycode, record)) {
return false;
}
switch (keycode) {
# ifdef RGB_MATRIX_ENABLE
case QK_RGB_MATRIX_TOGGLE:
if (record->event.pressed) {
switch (rgb_matrix_get_flags()) {
case LED_FLAG_ALL: {
rgb_matrix_set_flags(LED_FLAG_NONE);
rgb_matrix_set_color_all(0, 0, 0);
} break;
default: {
rgb_matrix_set_flags(LED_FLAG_ALL);
} break;
}
}
if (!rgb_matrix_is_enabled()) {
rgb_matrix_set_flags(LED_FLAG_ALL);
rgb_matrix_enable();
}
return false;
# endif
}
return true;
}
bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) { bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) {
if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) {
return false; return false;

View file

@ -30,30 +30,6 @@ bool dip_switch_update_kb(uint8_t index, bool active) {
#if defined(RGB_MATRIX_ENABLE) && defined(CAPS_LOCK_LED_INDEX) #if defined(RGB_MATRIX_ENABLE) && defined(CAPS_LOCK_LED_INDEX)
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
if (!process_record_user(keycode, record)) { return false; }
switch (keycode) {
case QK_RGB_MATRIX_TOGGLE:
if (record->event.pressed) {
switch (rgb_matrix_get_flags()) {
case LED_FLAG_ALL: {
rgb_matrix_set_flags(LED_FLAG_NONE);
rgb_matrix_set_color_all(0, 0, 0);
} break;
default: {
rgb_matrix_set_flags(LED_FLAG_ALL);
} break;
}
}
if (!rgb_matrix_is_enabled()) {
rgb_matrix_set_flags(LED_FLAG_ALL);
rgb_matrix_enable();
}
return false;
}
return true;
}
bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) { bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) {
if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { return false; } if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { return false; }
// RGB_MATRIX_INDICATOR_SET_COLOR(index, red, green, blue); // RGB_MATRIX_INDICATOR_SET_COLOR(index, red, green, blue);

View file

@ -33,32 +33,6 @@ bool dip_switch_update_kb(uint8_t index, bool active) {
#if defined(RGB_MATRIX_ENABLE) && defined(CAPS_LOCK_LED_INDEX) #if defined(RGB_MATRIX_ENABLE) && defined(CAPS_LOCK_LED_INDEX)
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
if (!process_record_user(keycode, record)) { return false; }
switch (keycode) {
#ifdef RGB_MATRIX_ENABLE
case QK_RGB_MATRIX_TOGGLE:
if (record->event.pressed) {
switch (rgb_matrix_get_flags()) {
case LED_FLAG_ALL: {
rgb_matrix_set_flags(LED_FLAG_NONE);
rgb_matrix_set_color_all(0, 0, 0);
} break;
default: {
rgb_matrix_set_flags(LED_FLAG_ALL);
} break;
}
}
if (!rgb_matrix_is_enabled()) {
rgb_matrix_set_flags(LED_FLAG_ALL);
rgb_matrix_enable();
}
return false;
#endif
}
return true;
}
bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) { bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) {
if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { return false; } if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { return false; }
// RGB_MATRIX_INDICATOR_SET_COLOR(index, red, green, blue); // RGB_MATRIX_INDICATOR_SET_COLOR(index, red, green, blue);

View file

@ -29,31 +29,6 @@ bool dip_switch_update_kb(uint8_t index, bool active) {
#endif // DIP_SWITCH_ENABLE #endif // DIP_SWITCH_ENABLE
#if defined(RGB_MATRIX_ENABLE) && defined(CAPS_LOCK_LED_INDEX) #if defined(RGB_MATRIX_ENABLE) && defined(CAPS_LOCK_LED_INDEX)
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
if (!process_record_user(keycode, record)) { return false; }
switch (keycode) {
#ifdef RGB_MATRIX_ENABLE
case QK_RGB_MATRIX_TOGGLE:
if (record->event.pressed) {
switch (rgb_matrix_get_flags()) {
case LED_FLAG_ALL: {
rgb_matrix_set_flags(LED_FLAG_NONE);
rgb_matrix_set_color_all(0, 0, 0);
} break;
default: {
rgb_matrix_set_flags(LED_FLAG_ALL);
} break;
}
}
if (!rgb_matrix_is_enabled()) {
rgb_matrix_set_flags(LED_FLAG_ALL);
rgb_matrix_enable();
}
return false;
#endif
}
return true;
}
bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) { bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) {
if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) {

View file

@ -32,34 +32,6 @@ bool dip_switch_update_kb(uint8_t index, bool active) {
#if defined(RGB_MATRIX_ENABLE) && (defined(CAPS_LOCK_LED_INDEX) || defined(NUM_LOCK_LED_INDEX)) #if defined(RGB_MATRIX_ENABLE) && (defined(CAPS_LOCK_LED_INDEX) || defined(NUM_LOCK_LED_INDEX))
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
if (!process_record_user(keycode, record)) {
return false;
}
switch (keycode) {
# ifdef RGB_MATRIX_ENABLE
case QK_RGB_MATRIX_TOGGLE:
if (record->event.pressed) {
switch (rgb_matrix_get_flags()) {
case LED_FLAG_ALL: {
rgb_matrix_set_flags(LED_FLAG_NONE);
rgb_matrix_set_color_all(0, 0, 0);
} break;
default: {
rgb_matrix_set_flags(LED_FLAG_ALL);
} break;
}
}
if (!rgb_matrix_is_enabled()) {
rgb_matrix_set_flags(LED_FLAG_ALL);
rgb_matrix_enable();
}
return false;
# endif
}
return true;
}
bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) { bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) {
if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { return false; } if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { return false; }
// RGB_MATRIX_INDICATOR_SET_COLOR(index, red, green, blue); // RGB_MATRIX_INDICATOR_SET_COLOR(index, red, green, blue);

View file

@ -32,32 +32,6 @@ bool dip_switch_update_kb(uint8_t index, bool active) {
#if defined(RGB_MATRIX_ENABLE) && (defined(CAPS_LOCK_LED_INDEX) || defined(NUM_LOCK_LED_INDEX)) #if defined(RGB_MATRIX_ENABLE) && (defined(CAPS_LOCK_LED_INDEX) || defined(NUM_LOCK_LED_INDEX))
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
if (!process_record_user(keycode, record)) {
return false;
}
switch (keycode) {
case QK_RGB_MATRIX_TOGGLE:
if (record->event.pressed) {
switch (rgb_matrix_get_flags()) {
case LED_FLAG_ALL: {
rgb_matrix_set_flags(LED_FLAG_NONE);
rgb_matrix_set_color_all(0, 0, 0);
} break;
default: {
rgb_matrix_set_flags(LED_FLAG_ALL);
} break;
}
}
if (!rgb_matrix_is_enabled()) {
rgb_matrix_set_flags(LED_FLAG_ALL);
rgb_matrix_enable();
}
return false;
}
return true;
}
bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) { bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) {
if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) {
return false; return false;

View file

@ -31,32 +31,6 @@ bool dip_switch_update_kb(uint8_t index, bool active) {
// clang-format on // clang-format on
#if defined(RGB_MATRIX_ENABLE) && defined(CAPS_LOCK_LED_INDEX) #if defined(RGB_MATRIX_ENABLE) && defined(CAPS_LOCK_LED_INDEX)
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
if (!process_record_user(keycode, record)) { return false; }
switch (keycode) {
#ifdef RGB_MATRIX_ENABLE
case QK_RGB_MATRIX_TOGGLE:
if (record->event.pressed) {
switch (rgb_matrix_get_flags()) {
case LED_FLAG_ALL: {
rgb_matrix_set_flags(LED_FLAG_NONE);
rgb_matrix_set_color_all(0, 0, 0);
} break;
default: {
rgb_matrix_set_flags(LED_FLAG_ALL);
} break;
}
}
if (!rgb_matrix_is_enabled()) {
rgb_matrix_set_flags(LED_FLAG_ALL);
rgb_matrix_enable();
}
return false;
#endif
}
return true;
}
bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) { bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) {
if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { return false; } if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { return false; }
// RGB_MATRIX_INDICATOR_SET_COLOR(index, red, green, blue); // RGB_MATRIX_INDICATOR_SET_COLOR(index, red, green, blue);

View file

@ -30,32 +30,6 @@ bool dip_switch_update_kb(uint8_t index, bool active) {
#if defined(RGB_MATRIX_ENABLE) && defined(CAPS_LOCK_LED_INDEX) #if defined(RGB_MATRIX_ENABLE) && defined(CAPS_LOCK_LED_INDEX)
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
if (!process_record_user(keycode, record)) { return false; }
switch (keycode) {
#ifdef RGB_MATRIX_ENABLE
case QK_RGB_MATRIX_TOGGLE:
if (record->event.pressed) {
switch (rgb_matrix_get_flags()) {
case LED_FLAG_ALL: {
rgb_matrix_set_flags(LED_FLAG_NONE);
rgb_matrix_set_color_all(0, 0, 0);
} break;
default: {
rgb_matrix_set_flags(LED_FLAG_ALL);
} break;
}
}
if (!rgb_matrix_is_enabled()) {
rgb_matrix_set_flags(LED_FLAG_ALL);
rgb_matrix_enable();
}
return false;
#endif
}
return true;
}
bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) { bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) {
if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { return false; } if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { return false; }
// RGB_MATRIX_INDICATOR_SET_COLOR(index, red, green, blue); // RGB_MATRIX_INDICATOR_SET_COLOR(index, red, green, blue);

View file

@ -30,32 +30,6 @@ bool dip_switch_update_kb(uint8_t index, bool active) {
#if defined(RGB_MATRIX_ENABLE) && defined(CAPS_LOCK_LED_INDEX) #if defined(RGB_MATRIX_ENABLE) && defined(CAPS_LOCK_LED_INDEX)
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
if (!process_record_user(keycode, record)) {
return false;
}
switch (keycode) {
case QK_RGB_MATRIX_TOGGLE:
if (record->event.pressed) {
switch (rgb_matrix_get_flags()) {
case LED_FLAG_ALL: {
rgb_matrix_set_flags(LED_FLAG_NONE);
rgb_matrix_set_color_all(0, 0, 0);
} break;
default: {
rgb_matrix_set_flags(LED_FLAG_ALL);
} break;
}
}
if (!rgb_matrix_is_enabled()) {
rgb_matrix_set_flags(LED_FLAG_ALL);
rgb_matrix_enable();
}
return false;
}
return true;
}
bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) { bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) {
if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) {
return false; return false;

View file

@ -30,32 +30,6 @@ bool dip_switch_update_kb(uint8_t index, bool active) {
#if defined(RGB_MATRIX_ENABLE) && defined(CAPS_LOCK_LED_INDEX) #if defined(RGB_MATRIX_ENABLE) && defined(CAPS_LOCK_LED_INDEX)
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
if (!process_record_user(keycode, record)) { return false; }
switch (keycode) {
#ifdef RGB_MATRIX_ENABLE
case QK_RGB_MATRIX_TOGGLE:
if (record->event.pressed) {
switch (rgb_matrix_get_flags()) {
case LED_FLAG_ALL: {
rgb_matrix_set_flags(LED_FLAG_NONE);
rgb_matrix_set_color_all(0, 0, 0);
} break;
default: {
rgb_matrix_set_flags(LED_FLAG_ALL);
} break;
}
}
if (!rgb_matrix_is_enabled()) {
rgb_matrix_set_flags(LED_FLAG_ALL);
rgb_matrix_enable();
}
return false;
#endif
}
return true;
}
bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) { bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) {
if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { return false; } if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { return false; }
// RGB_MATRIX_INDICATOR_SET_COLOR(index, red, green, blue); // RGB_MATRIX_INDICATOR_SET_COLOR(index, red, green, blue);

View file

@ -30,32 +30,6 @@ bool dip_switch_update_kb(uint8_t index, bool active) {
#if defined(RGB_MATRIX_ENABLE) && defined(CAPS_LOCK_LED_INDEX) #if defined(RGB_MATRIX_ENABLE) && defined(CAPS_LOCK_LED_INDEX)
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
if (!process_record_user(keycode, record)) {
return false;
}
switch (keycode) {
case QK_RGB_MATRIX_TOGGLE:
if (record->event.pressed) {
switch (rgb_matrix_get_flags()) {
case LED_FLAG_ALL: {
rgb_matrix_set_flags(LED_FLAG_NONE);
rgb_matrix_set_color_all(0, 0, 0);
} break;
default: {
rgb_matrix_set_flags(LED_FLAG_ALL);
} break;
}
}
if (!rgb_matrix_is_enabled()) {
rgb_matrix_set_flags(LED_FLAG_ALL);
rgb_matrix_enable();
}
return false;
}
return true;
}
bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) { bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) {
if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) {
return false; return false;

View file

@ -30,32 +30,6 @@ bool dip_switch_update_kb(uint8_t index, bool active) {
#if defined(RGB_MATRIX_ENABLE) && defined(CAPS_LOCK_LED_INDEX) #if defined(RGB_MATRIX_ENABLE) && defined(CAPS_LOCK_LED_INDEX)
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
if (!process_record_user(keycode, record)) { return false; }
switch (keycode) {
#ifdef RGB_MATRIX_ENABLE
case QK_RGB_MATRIX_TOGGLE:
if (record->event.pressed) {
switch (rgb_matrix_get_flags()) {
case LED_FLAG_ALL: {
rgb_matrix_set_flags(LED_FLAG_NONE);
rgb_matrix_set_color_all(0, 0, 0);
} break;
default: {
rgb_matrix_set_flags(LED_FLAG_ALL);
} break;
}
}
if (!rgb_matrix_is_enabled()) {
rgb_matrix_set_flags(LED_FLAG_ALL);
rgb_matrix_enable();
}
return false;
#endif
}
return true;
}
bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) { bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) {
if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { return false; } if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { return false; }
// RGB_MATRIX_INDICATOR_SET_COLOR(index, red, green, blue); // RGB_MATRIX_INDICATOR_SET_COLOR(index, red, green, blue);
@ -74,32 +48,6 @@ bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) {
#if defined(LED_MATRIX_ENABLE) && defined(CAPS_LOCK_LED_INDEX) #if defined(LED_MATRIX_ENABLE) && defined(CAPS_LOCK_LED_INDEX)
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
if (!process_record_user(keycode, record)) { return false; }
switch (keycode) {
#ifdef LED_MATRIX_ENABLE
case LM_TOGG:
if (record->event.pressed) {
switch (led_matrix_get_flags()) {
case LED_FLAG_ALL: {
led_matrix_set_flags(LED_FLAG_NONE);
led_matrix_set_value_all(0);
} break;
default: {
led_matrix_set_flags(LED_FLAG_ALL);
} break;
}
}
if (!led_matrix_is_enabled()) {
led_matrix_set_flags(LED_FLAG_ALL);
led_matrix_enable();
}
return false;
#endif
}
return true;
}
bool led_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) { bool led_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) {
if (!led_matrix_indicators_advanced_user(led_min, led_max)) { return false; } if (!led_matrix_indicators_advanced_user(led_min, led_max)) { return false; }

View file

@ -32,32 +32,6 @@ bool dip_switch_update_kb(uint8_t index, bool active) {
#if defined(RGB_MATRIX_ENABLE) && defined(CAPS_LOCK_LED_INDEX) #if defined(RGB_MATRIX_ENABLE) && defined(CAPS_LOCK_LED_INDEX)
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
if (!process_record_user(keycode, record)) { return false; }
switch (keycode) {
#ifdef RGB_MATRIX_ENABLE
case QK_RGB_MATRIX_TOGGLE:
if (record->event.pressed) {
switch (rgb_matrix_get_flags()) {
case LED_FLAG_ALL: {
rgb_matrix_set_flags(LED_FLAG_NONE);
rgb_matrix_set_color_all(0, 0, 0);
} break;
default: {
rgb_matrix_set_flags(LED_FLAG_ALL);
} break;
}
}
if (!rgb_matrix_is_enabled()) {
rgb_matrix_set_flags(LED_FLAG_ALL);
rgb_matrix_enable();
}
return false;
#endif
}
return true;
}
bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) { bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) {
if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { return false; } if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { return false; }
// RGB_MATRIX_INDICATOR_SET_COLOR(index, red, green, blue); // RGB_MATRIX_INDICATOR_SET_COLOR(index, red, green, blue);

View file

@ -32,32 +32,6 @@ bool dip_switch_update_kb(uint8_t index, bool active) {
#if defined(RGB_MATRIX_ENABLE) && defined(CAPS_LOCK_LED_INDEX) #if defined(RGB_MATRIX_ENABLE) && defined(CAPS_LOCK_LED_INDEX)
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
if (!process_record_user(keycode, record)) {
return false;
}
switch (keycode) {
case QK_RGB_MATRIX_TOGGLE:
if (record->event.pressed) {
switch (rgb_matrix_get_flags()) {
case LED_FLAG_ALL: {
rgb_matrix_set_flags(LED_FLAG_NONE);
rgb_matrix_set_color_all(0, 0, 0);
} break;
default: {
rgb_matrix_set_flags(LED_FLAG_ALL);
} break;
}
}
if (!rgb_matrix_is_enabled()) {
rgb_matrix_set_flags(LED_FLAG_ALL);
rgb_matrix_enable();
}
return false;
}
return true;
}
bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) { bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) {
if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) {
return false; return false;

View file

@ -29,31 +29,6 @@ bool dip_switch_update_kb(uint8_t index, bool active) {
#endif // DIP_SWITCH_ENABLE #endif // DIP_SWITCH_ENABLE
#if defined(RGB_MATRIX_ENABLE) && defined(CAPS_LOCK_LED_INDEX) #if defined(RGB_MATRIX_ENABLE) && defined(CAPS_LOCK_LED_INDEX)
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
if (!process_record_user(keycode, record)) { return false; }
switch (keycode) {
#ifdef RGB_MATRIX_ENABLE
case QK_RGB_MATRIX_TOGGLE:
if (record->event.pressed) {
switch (rgb_matrix_get_flags()) {
case LED_FLAG_ALL: {
rgb_matrix_set_flags(LED_FLAG_NONE);
rgb_matrix_set_color_all(0, 0, 0);
} break;
default: {
rgb_matrix_set_flags(LED_FLAG_ALL);
} break;
}
}
if (!rgb_matrix_is_enabled()) {
rgb_matrix_set_flags(LED_FLAG_ALL);
rgb_matrix_enable();
}
return false;
#endif
}
return true;
}
bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) { bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) {
if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { return false; } if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { return false; }

View file

@ -32,32 +32,6 @@ bool dip_switch_update_kb(uint8_t index, bool active) {
#if defined(RGB_MATRIX_ENABLE) && defined(CAPS_LOCK_LED_INDEX) #if defined(RGB_MATRIX_ENABLE) && defined(CAPS_LOCK_LED_INDEX)
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
if (!process_record_user(keycode, record)) { return false; }
switch (keycode) {
#ifdef RGB_MATRIX_ENABLE
case QK_RGB_MATRIX_TOGGLE:
if (record->event.pressed) {
switch (rgb_matrix_get_flags()) {
case LED_FLAG_ALL: {
rgb_matrix_set_flags(LED_FLAG_NONE);
rgb_matrix_set_color_all(0, 0, 0);
} break;
default: {
rgb_matrix_set_flags(LED_FLAG_ALL);
} break;
}
}
if (!rgb_matrix_is_enabled()) {
rgb_matrix_set_flags(LED_FLAG_ALL);
rgb_matrix_enable();
}
return false;
#endif
}
return true;
}
bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) { bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) {
if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { return false; } if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { return false; }
// RGB_MATRIX_INDICATOR_SET_COLOR(index, red, green, blue); // RGB_MATRIX_INDICATOR_SET_COLOR(index, red, green, blue);

View file

@ -30,32 +30,6 @@ bool dip_switch_update_kb(uint8_t index, bool active) {
#if defined(RGB_MATRIX_ENABLE) && defined(CAPS_LOCK_LED_INDEX) #if defined(RGB_MATRIX_ENABLE) && defined(CAPS_LOCK_LED_INDEX)
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
if (!process_record_user(keycode, record)) { return false; }
switch (keycode) {
#ifdef RGB_MATRIX_ENABLE
case QK_RGB_MATRIX_TOGGLE:
if (record->event.pressed) {
switch (rgb_matrix_get_flags()) {
case LED_FLAG_ALL: {
rgb_matrix_set_flags(LED_FLAG_NONE);
rgb_matrix_set_color_all(0, 0, 0);
} break;
default: {
rgb_matrix_set_flags(LED_FLAG_ALL);
} break;
}
}
if (!rgb_matrix_is_enabled()) {
rgb_matrix_set_flags(LED_FLAG_ALL);
rgb_matrix_enable();
}
return false;
#endif
}
return true;
}
bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) { bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) {
if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { return false; } if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { return false; }
// RGB_MATRIX_INDICATOR_SET_COLOR(index, red, green, blue); // RGB_MATRIX_INDICATOR_SET_COLOR(index, red, green, blue);

View file

@ -32,32 +32,6 @@ bool dip_switch_update_kb(uint8_t index, bool active) {
#if defined(RGB_MATRIX_ENABLE) && (defined(CAPS_LOCK_LED_INDEX) || defined(NUM_LOCK_LED_INDEX)) #if defined(RGB_MATRIX_ENABLE) && (defined(CAPS_LOCK_LED_INDEX) || defined(NUM_LOCK_LED_INDEX))
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
if (!process_record_user(keycode, record)) { return false; }
switch (keycode) {
#ifdef RGB_MATRIX_ENABLE
case QK_RGB_MATRIX_TOGGLE:
if (record->event.pressed) {
switch (rgb_matrix_get_flags()) {
case LED_FLAG_ALL: {
rgb_matrix_set_flags(LED_FLAG_NONE);
rgb_matrix_set_color_all(0, 0, 0);
} break;
default: {
rgb_matrix_set_flags(LED_FLAG_ALL);
} break;
}
}
if (!rgb_matrix_is_enabled()) {
rgb_matrix_set_flags(LED_FLAG_ALL);
rgb_matrix_enable();
}
return false;
#endif
}
return true;
}
bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) { bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) {
if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { return false; } if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { return false; }
// RGB_MATRIX_INDICATOR_SET_COLOR(index, red, green, blue); // RGB_MATRIX_INDICATOR_SET_COLOR(index, red, green, blue);

View file

@ -36,32 +36,6 @@ bool dip_switch_update_kb(uint8_t index, bool active) {
#if defined(RGB_MATRIX_ENABLE) && (defined(CAPS_LOCK_LED_INDEX) || defined(NUM_LOCK_LED_INDEX)) #if defined(RGB_MATRIX_ENABLE) && (defined(CAPS_LOCK_LED_INDEX) || defined(NUM_LOCK_LED_INDEX))
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
if (!process_record_user(keycode, record)) {
return false;
}
switch (keycode) {
case QK_RGB_MATRIX_TOGGLE:
if (record->event.pressed) {
switch (rgb_matrix_get_flags()) {
case LED_FLAG_ALL: {
rgb_matrix_set_flags(LED_FLAG_NONE);
rgb_matrix_set_color_all(0, 0, 0);
} break;
default: {
rgb_matrix_set_flags(LED_FLAG_ALL);
} break;
}
}
if (!rgb_matrix_is_enabled()) {
rgb_matrix_set_flags(LED_FLAG_ALL);
rgb_matrix_enable();
}
return false;
}
return true;
}
bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) { bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) {
if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) {
return false; return false;

View file

@ -30,32 +30,6 @@ bool dip_switch_update_kb(uint8_t index, bool active) {
#if defined(RGB_MATRIX_ENABLE) && defined(CAPS_LOCK_LED_INDEX) #if defined(RGB_MATRIX_ENABLE) && defined(CAPS_LOCK_LED_INDEX)
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
if (!process_record_user(keycode, record)) { return false; }
switch (keycode) {
#ifdef RGB_MATRIX_ENABLE
case QK_RGB_MATRIX_TOGGLE:
if (record->event.pressed) {
switch (rgb_matrix_get_flags()) {
case LED_FLAG_ALL: {
rgb_matrix_set_flags(LED_FLAG_NONE);
rgb_matrix_set_color_all(0, 0, 0);
} break;
default: {
rgb_matrix_set_flags(LED_FLAG_ALL);
} break;
}
}
if (!rgb_matrix_is_enabled()) {
rgb_matrix_set_flags(LED_FLAG_ALL);
rgb_matrix_enable();
}
return false;
#endif
}
return true;
}
bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) { bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) {
if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { return false; } if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { return false; }
// RGB_MATRIX_INDICATOR_SET_COLOR(index, red, green, blue); // RGB_MATRIX_INDICATOR_SET_COLOR(index, red, green, blue);

View file

@ -30,32 +30,6 @@ bool dip_switch_update_kb(uint8_t index, bool active) {
#if defined(RGB_MATRIX_ENABLE) && defined(CAPS_LOCK_LED_INDEX) #if defined(RGB_MATRIX_ENABLE) && defined(CAPS_LOCK_LED_INDEX)
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
if (!process_record_user(keycode, record)) { return false; }
switch (keycode) {
#ifdef RGB_MATRIX_ENABLE
case QK_RGB_MATRIX_TOGGLE:
if (record->event.pressed) {
switch (rgb_matrix_get_flags()) {
case LED_FLAG_ALL: {
rgb_matrix_set_flags(LED_FLAG_NONE);
rgb_matrix_set_color_all(0, 0, 0);
} break;
default: {
rgb_matrix_set_flags(LED_FLAG_ALL);
} break;
}
}
if (!rgb_matrix_is_enabled()) {
rgb_matrix_set_flags(LED_FLAG_ALL);
rgb_matrix_enable();
}
return false;
#endif
}
return true;
}
bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) { bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) {
if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { return false; } if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { return false; }
// RGB_MATRIX_INDICATOR_SET_COLOR(index, red, green, blue); // RGB_MATRIX_INDICATOR_SET_COLOR(index, red, green, blue);

View file

@ -19,4 +19,4 @@
#define IS31FL3731_I2C_ADDRESS_1 IS31FL3731_I2C_ADDRESS_GND #define IS31FL3731_I2C_ADDRESS_1 IS31FL3731_I2C_ADDRESS_GND
#define B7_AUDIO #define AUDIO_PIN B7

View file

@ -0,0 +1,25 @@
/* Copyright 2023 Logan Butler*/
/* SPDX-License-Identifier: GPL-2.0-or-later */
#include QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT(
KC_BSPC, KC_EQL, LSFT(KC_9),LSFT(KC_0),
KC_PMNS, KC_PAST, KC_PSLS, TG(1),
KC_PPLS, KC_P7, KC_P8, KC_P9,
KC_P4, KC_P5, KC_P6,
KC_PENT, KC_P1, KC_P2, KC_P3,
KC_PDOT, KC_P0
),
[1] = LAYOUT(
_______, _______, _______, _______,
_______, _______, _______, _______,
_______, KC_PGUP, KC_UP, KC_HOME,
KC_LEFT, _______, KC_RGHT,
_______, KC_PGDN, KC_DOWN, KC_END,
KC_DEL, KC_INS
),
};

View file

@ -1,5 +1,5 @@
/* /*
ChibiOS - Copyright (C) 2006..2020 Giovanni Di Sirio ChibiOS - Copyright (C) 2006-2026 Giovanni Di Sirio.
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.

View file

@ -1,5 +1,5 @@
/* /*
ChibiOS - Copyright (C) 2006..2020 Giovanni Di Sirio ChibiOS - Copyright (C) 2006-2026 Giovanni Di Sirio.
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.

View file

@ -1,3 +0,0 @@
#pragma once
#define TAPPING_TOGGLE 2

View file

@ -1,652 +0,0 @@
#include QMK_KEYBOARD_H
enum {
LAYER_NORM_BASE,
LAYER_NORM_EXTENSION,
LAYER_RACE_BASE,
LAYER_RACE_EXTENSION,
LAYER_LEGACY_BASE,
LAYER_LEGACY_EXTENSION,
LAYER_CONTROL,
LAYER_WINDOW,
LAYER_DESKTOP,
NUMBER_OF_LAYERS,
};
bool temporary[NUMBER_OF_LAYERS] = {
[LAYER_NORM_BASE] = false,
[LAYER_NORM_EXTENSION] = true,
[LAYER_RACE_BASE] = false,
[LAYER_RACE_EXTENSION] = true,
[LAYER_LEGACY_BASE] = false,
[LAYER_LEGACY_EXTENSION] = true,
[LAYER_CONTROL] = false,
[LAYER_WINDOW] = true,
[LAYER_DESKTOP] = false,
};
#define KEY_FORWARD_LAYER(a) SAFE_RANGE + a
enum{
DANCE_PGDN_BOTTOM,
DANCE_PGUP_TOP,
};
tap_dance_action_t tap_dance_actions[] = {
[DANCE_PGDN_BOTTOM] = ACTION_TAP_DANCE_DOUBLE(KC_PGDN, LGUI(KC_DOWN)),
[DANCE_PGUP_TOP] = ACTION_TAP_DANCE_DOUBLE(KC_PGUP, LGUI(KC_UP)),
};
#define KEY_DANCE(a) TD(a)
enum custom_keycodes {
KEY_BACK_LAYER = SAFE_RANGE + NUMBER_OF_LAYERS,
KEY_INSERT_LINE_START,
KEY_INSERT_HERE,
KEY_INSERT_LINE_END,
KEY_CREATE_PREVIOUS_LINE,
KEY_CREATE_NEXT_LINE,
KEY_CUT_WORD,
KEY_CUT_LINE,
KEY_CUT_SELECTION,
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[LAYER_NORM_BASE] = LAYOUT_default_splitspace(
KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KEY_DANCE(DANCE_PGDN_BOTTOM), KEY_DANCE(DANCE_PGUP_TOP), KC_NO, KEY_CUT_LINE, KEY_FORWARD_LAYER(LAYER_RACE_BASE),
KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_LCBR, KC_RCBR, KC_BSLS, KEY_FORWARD_LAYER(LAYER_LEGACY_BASE),
KC_CAPS, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, KC_ENT, KEY_FORWARD_LAYER(LAYER_DESKTOP),
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_NO, LCTL(KC_LEFT),
KC_LCTL, KC_LGUI, KC_LALT, KEY_FORWARD_LAYER(LAYER_NORM_EXTENSION), KEY_FORWARD_LAYER(LAYER_CONTROL), KC_SPC, KC_RALT, KC_RGUI, KC_NO, KC_NO, LCTL(KC_RIGHT)),
[LAYER_NORM_EXTENSION] = LAYOUT_default_splitspace(
LGUI(LSFT(KC_4)), KC_NO, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_MPLY, KC_MUTE, KC_VOLD, KC_VOLU, KC_NO, LCTL(KC_C), KEY_FORWARD_LAYER(LAYER_RACE_BASE),
KEY_FORWARD_LAYER(LAYER_WINDOW), LGUI(KC_SPC), LCTL(KC_SPC), KC_ESC, KC_TILD, KC_EXLM, KC_PEQL, KC_PLUS, KC_MINUS, KC_PIPE, KC_COLN, KC_LCBR, KC_RCBR, KEY_CREATE_PREVIOUS_LINE, KEY_FORWARD_LAYER(LAYER_LEGACY_BASE),
KEY_CUT_WORD, LALT(KC_LEFT), LALT(KC_RIGHT), KC_BSPC, LGUI(KC_LEFT), LCTL(KC_E), KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, LGUI(KC_V), KC_DQUO, KEY_CREATE_NEXT_LINE, KEY_FORWARD_LAYER(LAYER_DESKTOP),
KC_LSFT, LGUI(KC_Z), KEY_CUT_SELECTION, KC_LPRN, KC_RPRN, KC_UNDS, KC_LBRC, KC_RBRC, KC_LT, KC_GT, KC_QUES, KC_RSFT, KC_NO, LCTL(KC_LEFT),
KC_LCTL, KC_LGUI, KC_LALT, KC_NO, KEY_FORWARD_LAYER(LAYER_CONTROL), KC_SPC, KC_RALT, KC_RGUI, KC_NO, QK_BOOT, LCTL(KC_RIGHT)),
[LAYER_RACE_BASE] = LAYOUT_default_splitspace(
KC_NO, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_NO, KC_NO, KC_NO, KC_NO, KEY_BACK_LAYER,
KC_NO, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_LCBR, KC_RCBR, KC_BSLS, KC_NO,
KC_CAPS, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, KC_ENT, KC_NO,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_NO, KC_NO,
KC_NO, KC_NO, KC_NO, KEY_FORWARD_LAYER(LAYER_RACE_EXTENSION), KC_NO, KC_SPC, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO),
[LAYER_RACE_EXTENSION] = LAYOUT_default_splitspace(
KC_NO, KC_1, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_9, KC_0, KC_NO, KC_NO, KC_NO, KEY_CUT_LINE, KEY_BACK_LAYER,
KC_NO, KC_Q, KC_W, KC_F, KC_TILD, KC_EXLM, KC_PEQL, KC_PLUS, KC_MINUS, KC_PIPE, KC_COLN, KC_LCBR, KC_RCBR, KC_BSLS, KC_NO,
KEY_CUT_LINE, KC_A, KC_R, KC_BSPC, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_DQUO, KC_ENT, KC_NO,
KC_LSFT, KC_Z, KC_X, KC_LPRN, KC_RPRN, KC_UNDS, KC_LBRC, KC_RBRC, KC_LT, KC_GT, KC_QUES, KC_RSFT, KC_NO, KC_NO,
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_SPC, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO),
[LAYER_LEGACY_BASE] = LAYOUT_default_splitspace(
KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KEY_DANCE(DANCE_PGDN_BOTTOM), KEY_DANCE(DANCE_PGUP_TOP), KC_NO, KEY_CUT_LINE, KC_NO,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LCBR, KC_RCBR, KC_BSLS, KEY_BACK_LAYER,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KEY_FORWARD_LAYER(LAYER_DESKTOP),
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_NO, LCTL(KC_LEFT),
KC_LCTL, KC_LGUI, KC_LALT, KEY_FORWARD_LAYER(LAYER_LEGACY_EXTENSION), KEY_FORWARD_LAYER(LAYER_CONTROL), KC_SPC, KC_RALT, KC_RGUI, KC_NO, KC_NO, LCTL(KC_RIGHT)),
[LAYER_LEGACY_EXTENSION] = LAYOUT_default_splitspace(
LGUI(LSFT(KC_4)), KC_NO, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_MPLY, KC_MUTE, KC_VOLD, KC_VOLU, KC_NO, LCTL(KC_C), KC_NO,
KEY_FORWARD_LAYER(LAYER_WINDOW), LGUI(KC_SPC), LCTL(KC_SPC), KC_ESC, KC_TILD, KC_EXLM, KC_PEQL, KC_PLUS, KC_MINUS, KC_PIPE, KC_COLN, KC_LCBR, KC_RCBR, KEY_CREATE_PREVIOUS_LINE, KEY_BACK_LAYER,
KEY_CUT_WORD, LALT(KC_LEFT), LALT(KC_RIGHT), KC_BSPC, LGUI(KC_LEFT), LCTL(KC_E), KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, LGUI(KC_V), KC_DQUO, KEY_CREATE_NEXT_LINE, KEY_FORWARD_LAYER(LAYER_DESKTOP),
KC_LSFT, LGUI(KC_Z), KEY_CUT_SELECTION, KC_LPRN, KC_RPRN, KC_UNDS, KC_LBRC, KC_RBRC, KC_LT, KC_GT, KC_QUES, KC_RSFT, KC_NO, LCTL(KC_LEFT),
KC_LCTL, KC_LGUI, KC_LALT, KC_NO, KEY_FORWARD_LAYER(LAYER_CONTROL), KC_SPC, KC_RALT, KC_RGUI, KC_NO, KC_NO, LCTL(KC_RIGHT)),
[LAYER_CONTROL] = LAYOUT_default_splitspace(
KC_NO, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KEY_INSERT_LINE_START, KEY_INSERT_HERE, KEY_INSERT_LINE_END, KC_NO, KC_NO, KC_NO, KEY_CREATE_PREVIOUS_LINE, KC_NO,
KEY_CUT_WORD, LALT(KC_LEFT), LALT(KC_RIGHT), KC_BSPC, LGUI(KC_LEFT), LCTL(KC_E), KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, LGUI(KC_V), KC_NO, KEY_CREATE_NEXT_LINE, KC_NO,
KC_LSFT, LGUI(KC_Z), KEY_CUT_SELECTION, LGUI(KC_C), LGUI(KC_V), KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_RSFT, KC_NO, KC_NO,
KC_NO, KC_NO, KC_NO, KC_NO, KEY_BACK_LAYER, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO),
[LAYER_WINDOW] = LAYOUT_default_splitspace(
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KEY_BACK_LAYER, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_NO, KC_NO, KEY_BACK_LAYER, KC_NO,
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KEY_BACK_LAYER, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO),
[LAYER_DESKTOP] = LAYOUT_default_splitspace(
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, LCTL(KC_LEFT), KC_NO, KC_NO, LCTL(KC_RIGHT), KC_NO, KC_NO, KEY_BACK_LAYER, KEY_BACK_LAYER,
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KEY_BACK_LAYER, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO),
};
int layers[16];
struct {
bool back;
} common_layer_data;
struct {
int operator, multiplier;
} layer_control_data;
struct {
int start_time;
} layer_window_data;
bool handle_layer_key(uint16_t key, keyrecord_t* record) {
switch (layers[layers[0] + 1]) {
case LAYER_CONTROL:
switch (key) {
case KC_0:
if (record->event.pressed) {
layer_control_data.multiplier = layer_control_data.multiplier * 10;
if (layer_control_data.multiplier < 0) layer_control_data.multiplier = 0;
}
return false;
case KC_1:
if (record->event.pressed) {
layer_control_data.multiplier = layer_control_data.multiplier * 10 + 1;
if (layer_control_data.multiplier < 0) layer_control_data.multiplier = 0;
}
return false;
case KC_2:
if (record->event.pressed) {
layer_control_data.multiplier = layer_control_data.multiplier * 10 + 2;
if (layer_control_data.multiplier < 0) layer_control_data.multiplier = 0;
}
return false;
case KC_3:
if (record->event.pressed) {
layer_control_data.multiplier = layer_control_data.multiplier * 10 + 3;
if (layer_control_data.multiplier < 0) layer_control_data.multiplier = 0;
}
return false;
case KC_4:
if (record->event.pressed) {
layer_control_data.multiplier = layer_control_data.multiplier * 10 + 4;
if (layer_control_data.multiplier < 0) layer_control_data.multiplier = 0;
}
return false;
case KC_5:
if (record->event.pressed) {
layer_control_data.multiplier = layer_control_data.multiplier * 10 + 5;
if (layer_control_data.multiplier < 0) layer_control_data.multiplier = 0;
}
return false;
case KC_6:
if (record->event.pressed) {
layer_control_data.multiplier = layer_control_data.multiplier * 10 + 6;
if (layer_control_data.multiplier < 0) layer_control_data.multiplier = 0;
}
return false;
case KC_7:
if (record->event.pressed) {
layer_control_data.multiplier = layer_control_data.multiplier * 10 + 7;
if (layer_control_data.multiplier < 0) layer_control_data.multiplier = 0;
}
return false;
case KC_8:
if (record->event.pressed) {
layer_control_data.multiplier = layer_control_data.multiplier * 10 + 8;
if (layer_control_data.multiplier < 0) layer_control_data.multiplier = 0;
}
return false;
case KC_9:
if (record->event.pressed) {
layer_control_data.multiplier = layer_control_data.multiplier * 10 + 9;
if (layer_control_data.multiplier < 0) layer_control_data.multiplier = 0;
}
return false;
case KEY_INSERT_LINE_START:
if (record->event.pressed) common_layer_data.back = true;
return true;
case KEY_INSERT_HERE:
if (record->event.pressed) common_layer_data.back = true;
return true;
case KEY_INSERT_LINE_END:
if (record->event.pressed) common_layer_data.back = true;
return true;
case KEY_CREATE_PREVIOUS_LINE:
if (record->event.pressed) common_layer_data.back = true;
return true;
case KEY_CUT_WORD:
if (record->event.pressed) {
if (layer_control_data.operator== - 1) {
register_code(KC_LALT);
tap_code(KC_LEFT);
tap_code(KC_RIGHT);
unregister_code(KC_LALT);
for (int i = 0; i < (layer_control_data.multiplier ? layer_control_data.multiplier : 1); ++i) tap_code16(LSFT(LALT(KC_LEFT)));
tap_code16(LGUI(KC_X));
}
layer_control_data.multiplier = 0;
layer_control_data.operator = - 1;
}
return false;
case LALT(KC_LEFT):
if (layer_control_data.operator== - 1 && layer_control_data.multiplier == 0) return true;
if (record->event.pressed) {
if (layer_control_data.operator== - 1)
for (int i = 0; i < (layer_control_data.multiplier ? layer_control_data.multiplier : 1); ++i) tap_code16(LALT(KC_LEFT));
else if (layer_control_data.operator== KC_BSPC) {
register_code(KC_LALT);
tap_code(KC_LEFT);
tap_code(KC_RIGHT);
unregister_code(KC_LALT);
for (int i = 0; i < (layer_control_data.multiplier ? layer_control_data.multiplier : 1); ++i) tap_code16(LSFT(LALT(KC_LEFT)));
tap_code16(LGUI(KC_X));
} else if (layer_control_data.operator== LGUI(KC_C)) {
register_code(KC_LALT);
tap_code(KC_LEFT);
tap_code(KC_RIGHT);
unregister_code(KC_LALT);
for (int i = 0; i < (layer_control_data.multiplier ? layer_control_data.multiplier : 1); ++i) tap_code16(LSFT(LALT(KC_LEFT)));
tap_code16(LGUI(KC_C));
tap_code(KC_RIGHT);
}
layer_control_data.multiplier = 0;
layer_control_data.operator = - 1;
}
return false;
case LALT(KC_RIGHT):
if (layer_control_data.operator== - 1 && layer_control_data.multiplier == 0) return true;
if (record->event.pressed) {
if (layer_control_data.operator== - 1)
for (int i = 0; i < (layer_control_data.multiplier ? layer_control_data.multiplier : 1); ++i) tap_code16(LALT(KC_RIGHT));
else if (layer_control_data.operator== KC_BSPC) {
register_code(KC_LALT);
tap_code(KC_RIGHT);
tap_code(KC_LEFT);
unregister_code(KC_LALT);
for (int i = 0; i < (layer_control_data.multiplier ? layer_control_data.multiplier : 1); ++i) tap_code16(LSFT(LALT(KC_RIGHT)));
tap_code16(LGUI(KC_X));
} else if (layer_control_data.operator== LGUI(KC_C)) {
register_code(KC_LALT);
tap_code(KC_RIGHT);
tap_code(KC_LEFT);
unregister_code(KC_LALT);
for (int i = 0; i < (layer_control_data.multiplier ? layer_control_data.multiplier : 1); ++i) tap_code16(LSFT(LALT(KC_RIGHT)));
tap_code16(LGUI(KC_C));
tap_code(KC_LEFT);
}
layer_control_data.multiplier = 0;
layer_control_data.operator = - 1;
}
return false;
case LGUI(KC_LEFT):
if (record->event.pressed) {
if (layer_control_data.operator== - 1)
tap_code16(LGUI(KC_LEFT));
else if (layer_control_data.operator== KC_BSPC) {
tap_code16(LSFT(LGUI(KC_LEFT)));
tap_code16(LGUI(KC_X));
} else if (layer_control_data.operator== LGUI(KC_C)) {
tap_code16(LSFT(LGUI(KC_LEFT)));
tap_code16(LGUI(KC_C));
tap_code(KC_RIGHT);
}
layer_control_data.multiplier = 0;
layer_control_data.operator = - 1;
}
return false;
case LCTL(KC_E):
if (record->event.pressed) {
if (layer_control_data.operator== - 1)
tap_code16(LCTL(KC_E));
else if (layer_control_data.operator== KC_BSPC) {
tap_code16(LSFT(LCTL(KC_E)));
tap_code16(LGUI(KC_X));
} else if (layer_control_data.operator== LGUI(KC_C)) {
tap_code16(LSFT(LCTL(KC_E)));
tap_code16(LGUI(KC_C));
tap_code(KC_LEFT);
}
layer_control_data.multiplier = 0;
layer_control_data.operator = - 1;
}
return false;
case KC_BSPC:
if (record->event.pressed) {
if (get_mods() & MOD_MASK_SHIFT) {
unregister_code(KC_LSFT);
tap_code16(LGUI(KC_X));
register_code(KC_LSFT);
layer_control_data.multiplier = 0;
layer_control_data.operator = - 1;
} else if (layer_control_data.operator== - 1)
layer_control_data.operator= KC_BSPC;
else {
if (layer_control_data.operator== KC_BSPC) {
tap_code16(LCTL(KC_A));
for (int i = 0; i < (layer_control_data.multiplier ? layer_control_data.multiplier : 1); ++i) tap_code16(LSFT(KC_DOWN));
tap_code16(LGUI(KC_X));
}
layer_control_data.multiplier = 0;
layer_control_data.operator = - 1;
}
}
return false;
case KC_LEFT:
if (layer_control_data.operator== - 1 && layer_control_data.multiplier == 0) return true;
if (record->event.pressed) {
if (layer_control_data.operator== - 1)
for (int i = 0; i < (layer_control_data.multiplier ? layer_control_data.multiplier : 1); ++i) tap_code(KC_LEFT);
else if (layer_control_data.operator== KC_BSPC) {
for (int i = 0; i < (layer_control_data.multiplier ? layer_control_data.multiplier : 1); ++i) tap_code16(LSFT(KC_LEFT));
tap_code16(LGUI(KC_X));
} else if (layer_control_data.operator== LGUI(KC_C)) {
for (int i = 0; i < (layer_control_data.multiplier ? layer_control_data.multiplier : 1); ++i) tap_code16(LSFT(KC_LEFT));
tap_code16(LGUI(KC_C));
tap_code(KC_RIGHT);
}
layer_control_data.multiplier = 0;
layer_control_data.operator = - 1;
}
return false;
case KC_DOWN:
if (layer_control_data.operator== - 1 && layer_control_data.multiplier == 0) return true;
if (record->event.pressed) {
if (layer_control_data.operator== - 1)
for (int i = 0; i < (layer_control_data.multiplier ? layer_control_data.multiplier : 1); ++i) tap_code(KC_DOWN);
else if (layer_control_data.operator== KC_BSPC) {
tap_code16(LCTL(KC_A));
for (int i = 0; i < (layer_control_data.multiplier ? layer_control_data.multiplier : 1); ++i) tap_code16(LSFT(KC_DOWN));
tap_code16(LGUI(KC_X));
} else if (layer_control_data.operator== LGUI(KC_C)) {
tap_code16(LCTL(KC_A));
for (int i = 0; i < (layer_control_data.multiplier ? layer_control_data.multiplier : 1); ++i) tap_code16(LSFT(KC_DOWN));
tap_code16(LGUI(KC_C));
tap_code(KC_LEFT);
}
layer_control_data.multiplier = 0;
layer_control_data.operator = - 1;
}
return false;
case KC_UP:
if (layer_control_data.operator== - 1 && layer_control_data.multiplier == 0) return true;
if (record->event.pressed) {
if (layer_control_data.operator== - 1)
for (int i = 0; i < (layer_control_data.multiplier ? layer_control_data.multiplier : 1); ++i) tap_code(KC_UP);
else if (layer_control_data.operator== KC_BSPC) {
tap_code16(LCTL(KC_E));
for (int i = 0; i < (layer_control_data.multiplier ? layer_control_data.multiplier : 1); ++i) tap_code16(LSFT(KC_UP));
tap_code16(LSFT(LCTL(KC_E)));
tap_code16(LGUI(KC_X));
} else if (layer_control_data.operator== LGUI(KC_C)) {
tap_code16(LCTL(KC_E));
for (int i = 0; i < (layer_control_data.multiplier ? layer_control_data.multiplier : 1); ++i) tap_code16(LSFT(KC_UP));
tap_code16(LSFT(LCTL(KC_E)));
tap_code16(LGUI(KC_C));
tap_code(KC_RIGHT);
}
layer_control_data.multiplier = 0;
layer_control_data.operator = - 1;
}
return false;
case KC_RIGHT:
if (layer_control_data.operator== - 1 && layer_control_data.multiplier == 0) return true;
if (record->event.pressed) {
if (layer_control_data.operator== - 1)
for (int i = 0; i < (layer_control_data.multiplier ? layer_control_data.multiplier : 1); ++i) tap_code(KC_RIGHT);
else if (layer_control_data.operator== KC_BSPC) {
for (int i = 0; i < (layer_control_data.multiplier ? layer_control_data.multiplier : 1); ++i) tap_code16(LSFT(KC_RIGHT));
tap_code16(LGUI(KC_X));
} else if (layer_control_data.operator== LGUI(KC_C)) {
for (int i = 0; i < (layer_control_data.multiplier ? layer_control_data.multiplier : 1); ++i) tap_code16(LSFT(KC_RIGHT));
tap_code16(LGUI(KC_C));
tap_code(KC_LEFT);
}
layer_control_data.multiplier = 0;
layer_control_data.operator = - 1;
}
return false;
case KEY_CREATE_NEXT_LINE:
if (record->event.pressed) common_layer_data.back = true;
return true;
case LGUI(KC_Z):
if (layer_control_data.operator== - 1 && layer_control_data.multiplier == 0) return true;
if (record->event.pressed) {
if (layer_control_data.operator== - 1)
for (int i = 0; i < (layer_control_data.multiplier ? layer_control_data.multiplier : 1); ++i) tap_code16(LGUI(KC_Z));
layer_control_data.multiplier = 0;
layer_control_data.operator = - 1;
}
return false;
case LGUI(KC_C):
if (record->event.pressed) {
if (get_mods() & MOD_MASK_SHIFT) {
unregister_code(KC_LSFT);
tap_code16(LGUI(KC_C));
register_code(KC_LSFT);
layer_control_data.multiplier = 0;
layer_control_data.operator = - 1;
} else if (layer_control_data.operator== - 1)
layer_control_data.operator= LGUI(KC_C);
else {
if (layer_control_data.operator== LGUI(KC_C)) {
tap_code16(LCTL(KC_A));
for (int i = 0; i < (layer_control_data.multiplier ? layer_control_data.multiplier : 1); ++i) tap_code16(LSFT(KC_DOWN));
tap_code16(LGUI(KC_C));
tap_code(KC_LEFT);
}
layer_control_data.multiplier = 0;
layer_control_data.operator = - 1;
}
}
return false;
case LGUI(KC_V):
if (record->event.pressed) {
if (get_mods() & MOD_MASK_SHIFT) {
unregister_code(KC_LSFT);
for (int i = 0; i < (layer_control_data.multiplier ? layer_control_data.multiplier : 1); ++i) tap_code16(LGUI(KC_V));
register_code(KC_LSFT);
layer_control_data.multiplier = 0;
layer_control_data.operator = - 1;
} else {
for (int i = 0; i < (layer_control_data.multiplier ? layer_control_data.multiplier : 1); ++i) tap_code16(LGUI(KC_V));
layer_control_data.multiplier = 0;
layer_control_data.operator = - 1;
}
}
return false;
}
layer_control_data.multiplier = 0;
layer_control_data.operator = - 1;
return true;
case LAYER_WINDOW:
switch (key) {
case SAFE_RANGE + LAYER_WINDOW:
if (!record->event.pressed) {
if (timer_elapsed(layer_window_data.start_time) < 200)
temporary[LAYER_WINDOW] = true;
else
temporary[LAYER_WINDOW] = false;
}
return true;
case KEY_BACK_LAYER:
if (record->event.pressed) tap_code(KC_ENTER);
return true;
}
return true;
case LAYER_DESKTOP:
switch (key) {
case KEY_BACK_LAYER:
if (record->event.pressed) tap_code16(LCTL(KC_UP));
return true;
}
return true;
}
return true;
}
void handle_layer_start(void) {
rgblight_disable_noeeprom();
switch (layers[layers[0] + 1]) {
case LAYER_RACE_BASE:
case LAYER_RACE_EXTENSION:
rgblight_enable_noeeprom();
rgblight_sethsv_noeeprom(HSV_GREEN);
rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT);
return;
case LAYER_LEGACY_BASE:
case LAYER_LEGACY_EXTENSION:
rgblight_enable_noeeprom();
rgblight_sethsv_noeeprom(HSV_RED);
rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT);
return;
case LAYER_CONTROL:
layer_control_data.operator = - 1;
layer_control_data.multiplier = 0;
rgblight_enable_noeeprom();
rgblight_sethsv_noeeprom(HSV_BLUE);
rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT);
return;
case LAYER_WINDOW:
register_code(KC_LGUI);
tap_code(KC_TAB);
layer_window_data.start_time = timer_read();
return;
case LAYER_DESKTOP:
tap_code16(LCTL(KC_UP));
return;
}
}
void handle_layer_return(void) {
rgblight_disable_noeeprom();
switch (layers[layers[0] + 1]) {
case LAYER_RACE_BASE:
case LAYER_RACE_EXTENSION:
rgblight_enable_noeeprom();
rgblight_sethsv_noeeprom(HSV_GREEN);
rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT);
return;
case LAYER_LEGACY_BASE:
case LAYER_LEGACY_EXTENSION:
rgblight_enable_noeeprom();
rgblight_sethsv_noeeprom(HSV_RED);
rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT);
return;
case LAYER_CONTROL:
layer_control_data.operator = - 1;
layer_control_data.multiplier = 0;
rgblight_enable_noeeprom();
rgblight_sethsv_noeeprom(HSV_BLUE);
rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT);
return;
}
}
void handle_layer_end(void) {
switch (layers[layers[0] + 1]) {
case LAYER_WINDOW:
unregister_code(KC_LGUI);
return;
}
}
void update_layer(void) {
layer_clear();
common_layer_data.back = false;
layer_on(layers[layers[0] + 1]);
}
bool handle_call_key(uint16_t key, keyrecord_t* record) {
switch (key) {
case KEY_BACK_LAYER:
if (record->event.pressed) {
if (layers[0]) {
handle_layer_end();
--layers[0];
update_layer();
handle_layer_return();
}
}
return false;
}
if (key >= SAFE_RANGE && key < SAFE_RANGE + NUMBER_OF_LAYERS) {
int new_layer = key - SAFE_RANGE;
if (record->event.pressed) {
if (layers[layers[0] + 1] != new_layer) {
if (temporary[layers[layers[0] + 1]]) {
handle_layer_end();
layers[layers[0] + 1] = new_layer;
} else
layers[++layers[0] + 1] = new_layer;
update_layer();
handle_layer_start();
}
} else {
if (layers[layers[0] + 1] == new_layer && temporary[layers[layers[0] + 1]]) {
handle_layer_end();
--layers[0];
update_layer();
handle_layer_return();
}
}
return false;
}
if (common_layer_data.back) {
if (layers[0]) {
handle_layer_end();
--layers[0];
update_layer();
handle_layer_return();
}
}
return true;
}
bool handle_common_key(uint16_t key, keyrecord_t* record) {
switch (key) {
case KEY_INSERT_LINE_START:
if (record->event.pressed) tap_code16(LGUI(KC_LEFT));
return false;
case KEY_INSERT_HERE:
return false;
case KEY_INSERT_LINE_END:
if (record->event.pressed) tap_code16(LGUI(KC_RIGHT));
return false;
case KEY_CREATE_PREVIOUS_LINE:
if (record->event.pressed) {
tap_code16(LGUI(KC_LEFT));
tap_code(KC_ENTER);
tap_code(KC_UP);
}
return false;
case KEY_CREATE_NEXT_LINE:
if (record->event.pressed) {
tap_code16(LGUI(KC_RIGHT));
tap_code(KC_ENTER);
}
return false;
case KEY_CUT_WORD:
if (record->event.pressed) {
register_code(KC_LALT);
tap_code(KC_LEFT);
tap_code(KC_RIGHT);
unregister_code(KC_LALT);
tap_code16(LSFT(LALT(KC_LEFT)));
tap_code16(LGUI(KC_X));
}
return false;
case KEY_CUT_LINE:
if (record->event.pressed) {
tap_code16(LGUI(KC_RIGHT));
tap_code16(LSFT(LGUI(KC_LEFT)));
tap_code16(LGUI(KC_X));
}
return false;
case KEY_CUT_SELECTION:
if (record->event.pressed) {
if (get_mods() & MOD_MASK_SHIFT) {
unregister_code(KC_LSFT);
tap_code16(LGUI(KC_X));
register_code(KC_LSFT);
} else
tap_code16(LGUI(KC_X));
}
return false;
}
return true;
}
bool process_record_user(uint16_t key, keyrecord_t* record) {
if (!handle_layer_key(key, record)) return false;
if (!handle_call_key(key, record)) return false;
return handle_common_key(key, record);
}
void keyboard_post_init_user(void) {
rgblight_disable_noeeprom();
rgb_matrix_disable();
common_layer_data.back = false;
}

View file

@ -1,2 +0,0 @@
TAP_DANCE_ENABLE = yes
DYNAMIC_MACRO_ENABLE = yes

View file

@ -1,5 +1,5 @@
/* /*
ChibiOS - Copyright (C) 2006..2020 Giovanni Di Sirio ChibiOS - Copyright (C) 2006-2026 Giovanni Di Sirio.
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.

Some files were not shown because too many files have changed in this diff Show more