Merge branch 'develop'

This commit is contained in:
zvecr
2026-06-01 07:51:54 +01:00
218 changed files with 2325 additions and 3537 deletions
+2 -1
View File
@@ -300,6 +300,7 @@ endef
define BUILD_TEST
TEST_PATH := $1
TEST_NAME := $$(notdir $$(TEST_PATH))
TEST_ID := $$(patsubst ./tests/%,%,$$(TEST_PATH))
TEST_FULL_NAME := $$(subst /,_,$$(patsubst $$(ROOT_DIR)tests/%,%,$$(TEST_PATH)))
MAKE_TARGET := $2
COMMAND := $1
@@ -313,7 +314,7 @@ define BUILD_TEST
TEST_MSG := $$(MSG_TEST)
$$(TEST_FULL_NAME)_COMMAND := \
printf "$$(TEST_MSG)\n"; \
$$(TEST_EXECUTABLE); \
$$(TEST_EXECUTABLE) --gtest_color=$$(COLOR); \
if [ $$$$? -gt 0 ]; \
then error_occurred=1; \
fi; \
+3 -1
View File
@@ -125,7 +125,7 @@ ifeq ($(strip $(MOUSEKEY_ENABLE)), yes)
MOUSE_ENABLE := yes
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 ($(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)
@@ -159,6 +159,8 @@ ifeq ($(strip $(POINTING_DEVICE_ENABLE)), yes)
SRC += $(QUANTUM_DIR)/pointing_device/pointing_device_gestures.c
else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), paw3222)
SPI_DRIVER_REQUIRED = yes
else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), pmw3325)
SPI_DRIVER_REQUIRED = yes
else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), pimoroni_trackball)
I2C_DRIVER_REQUIRED = yes
else ifneq ($(filter $(strip $(POINTING_DEVICE_DRIVER)),pmw3360 pmw3389),)
+9 -5
View File
@@ -50,10 +50,14 @@ ifeq ($(strip $(DEBUG_ENABLE)),yes)
CFLAGS += -ggdb3
CXXFLAGS += -ggdb3
ASFLAGS += -ggdb3
# Create a map file when debugging
LDFLAGS += -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref
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 ----------------
@@ -66,9 +70,9 @@ CFLAGS += $(CDEFS)
CFLAGS += -O$(OPT)
# add color
ifeq ($(COLOR),true)
ifeq ("$(shell echo "int main(){}" | $(CC) -fdiagnostics-color -x c - -o /dev/null 2>&1)", "")
CFLAGS+= -fdiagnostics-color
endif
CFLAGS+= -fdiagnostics-color=always
else
CFLAGS+= -fdiagnostics-color=never
endif
CFLAGS += -Wall
CFLAGS += -Wstrict-prototypes
+2 -4
View File
@@ -1,10 +1,8 @@
{
"license": "GPL-2.0-or-later",
"devDependencies": {
"vite": "^5.4.21",
"vitepress": "^1.1.0",
"vitepress-plugin-tabs": "^0.5.0",
"vue": "^3.4.24"
"vitepress": "^1.6.4",
"vitepress-plugin-tabs": "^0.8.0"
},
"scripts": {
"docs:dev": "vitepress dev --host 0.0.0.0",
File diff suppressed because it is too large Load Diff
+2 -2
View File
@@ -77,13 +77,13 @@ define GENERATE_MSG_MAKE_KB
endef
MSG_MAKE_KB = $(eval $(call GENERATE_MSG_MAKE_KB))$(MSG_MAKE_KB_ACTUAL)
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),)
MSG_MAKE_TEST_ACTUAL += with target $(BOLD)$$(MAKE_TARGET)$(NO_COLOR)
endif
endef
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
MSG_AVAILABLE_KEYMAPS_ACTUAL := Available keymaps for $(BOLD)$$(CURRENT_KB)$(NO_COLOR):
endef
+3 -1
View File
@@ -225,6 +225,8 @@
"RETRO_TAPPING": {"info_key": "tapping.retro", "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_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_HOLD_CAPS_DELAY": {"info_key": "qmk.tap_capslock_delay", "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_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"},
"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
"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_UNLOCK_COMBO_COLS": {"info_key": "_invalid.vial_unlock_cols", "invalid": true},
"VIAL_UNLOCK_COMBO_ROWS": {"info_key": "_invalid.vial_unlock_rows", "invalid": true}
+6 -1
View File
@@ -46,7 +46,8 @@
"manufacturer": {"$ref": "./definitions.jsonschema#/text_identifier"},
"url": {
"type": "string",
"format": "uri"
"format": "uri",
"minLength": 1
},
"development_board": {
"type": "string",
@@ -992,6 +993,7 @@
"type": "object",
"properties": {
"chordal_hold": {"type": "boolean"},
"flow_tap_term": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"force_hold": {"type": "boolean"},
"force_hold_per_key": {"type": "boolean"},
"ignore_mod_tap_interrupt": {"type": "boolean"},
@@ -1001,6 +1003,9 @@
"permissive_hold_per_key": {"type": "boolean"},
"retro": {"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_per_key": {"type": "boolean"},
"toggle": {"$ref": "./definitions.jsonschema#/unsigned_int"}
+122
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))
+1 -1
View File
@@ -214,7 +214,7 @@
{ "text": "My Pull Request Was Flagged", "link": "/breaking_changes_instructions" },
{
"text": "Most Recent ChangeLog",
"link": "/ChangeLog/20260222"
"link": "/ChangeLog/20260531"
},
{ "text": "Past Breaking Changes", "link": "/breaking_changes_history" },
{ "text": "Deprecation Policy", "link": "/support_deprecation_policy" }
+10 -10
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?
* [2026 May 31](ChangeLog/20260531)
* [2026 Feb 22](ChangeLog/20260222)
* [2025 Nov 30](ChangeLog/20251130)
* [2025 Aug 31](ChangeLog/20250831)
* [Older Breaking Changes](breaking_changes_history)
## 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
* 2025 Feb 22 - `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 May 3 - Call for testers.
* 2026 May 17 - 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 May 29 - `master` is locked, no PRs merged.
* 2026 May 31 - Merge `develop` to `master`.
* 2026 May 31 - `master` is unlocked. PRs can be merged again.
* 2025 May 31 - `develop` is tagged with a new release version. Each push to `master` is subsequently merged to `develop` by GitHub actions.
* 2026 Aug 2 - `develop` closed to new PRs.
* 2026 Aug 2 - Call for testers.
* 2026 Aug 16 - Last day for merges -- after this point `develop` is locked for testing and accepts only bugfixes
* 2026 Aug 23 - `develop` is locked, only critical bugfix PRs merged.
* 2026 Aug 28 - `master` is locked, no PRs merged.
* 2026 Aug 30 - Merge `develop` to `master`.
* 2026 Aug 30 - `master` is unlocked. PRs can be merged again.
## What changes will be included?
+1
View File
@@ -2,6 +2,7 @@
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
* [2025 Nov 30](ChangeLog/20251130) - version 0.31.0
* [2025 Aug 31](ChangeLog/20250831) - version 0.30.0
-18
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.
* `#define AUDIO_VOICES`
* 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`
* pin of the backlight
* `#define BACKLIGHT_LEVELS 3`
+17
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.
### 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
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).
+8 -5
View File
@@ -8,9 +8,9 @@ There are some limitations to this feature. Because there is no "standard" metho
## 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
UNICODE_COMMON = yes
@@ -18,22 +18,25 @@ UNICODE_COMMON = yes
## 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 |
|------------------------|------------------|--------------------------------------------------------------------------------|
|`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_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_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}
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 |
|-------------------|-------|-----------------------------------------------------------|
+1 -1
View File
@@ -91,7 +91,7 @@ Enables your LED to breath while your computer is sleeping. Timer1 is being used
`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`
+24 -1
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?
+173
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
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)))
-1
View File
@@ -3,7 +3,6 @@
#pragma once
#define OLED_DISPLAY_128X32
#define I2C1_SCL_PIN GP17
#define I2C1_SDA_PIN GP16
#define I2C_DRIVER I2CD0
-25
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
+5
View File
@@ -14,6 +14,11 @@
"command": true,
"nkro": true
},
"host": {
"default": {
"nkro": true
}
},
"qmk": {
"locking": {
"enabled": true,
-27
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_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;
}
}
@@ -4,7 +4,6 @@ This layout replaces the stock layout on the Vortex Race 3.
- Caps Lock indicator LED is enabled by default
- 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
* Might be a good place for a macro, or to put your PC to sleep, etc.
@@ -4,7 +4,6 @@ This layout replaces the stock layout on the Vortex Race 3.
- Caps Lock indicator LED is enabled by default
- 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
* Might be a good place for a macro, or to put your PC to sleep, etc.
@@ -4,7 +4,6 @@ This layout replaces the stock layout on the Vortex Race 3.
- Caps Lock indicator LED is enabled by default
- 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
* Might be a good place for a macro, or to put your PC to sleep, etc.
@@ -4,7 +4,6 @@ This layout replaces the stock layout on the Vortex Race 3.
- Caps Lock indicator LED is enabled by default
- 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
* Might be a good place for a macro, or to put your PC to sleep, etc.
@@ -4,7 +4,6 @@ This layout replaces the stock layout on the Vortex Race 3.
- Caps Lock indicator LED is enabled by default
- 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
* Might be a good place for a macro, or to put your PC to sleep, etc.
-1
View File
@@ -19,6 +19,5 @@
// OLED driver
#ifdef OLED_DRIVER_ENABLE
#define OLED_DISPLAY_128X32
#define OLED_TIMEOUT 30000
#endif
-4
View File
@@ -3,10 +3,6 @@
#pragma once
#ifdef OLED_ENABLE
#define OLED_DISPLAY_128X32
#endif
#ifdef PS2_DRIVER_INTERRUPT
#define PS2_CLOCK_PIN E6
#define PS2_DATA_PIN D7
-29
View File
@@ -157,32 +157,3 @@ bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) {
}
#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;
}
}
+1 -1
View File
@@ -17,7 +17,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#pragma once
#define B7_AUDIO
#define AUDIO_PIN B7
/* 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).
+1 -1
View File
@@ -17,7 +17,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#pragma once
#define B7_AUDIO
#define AUDIO_PIN B7
/* 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).
-26
View File
@@ -6,32 +6,6 @@
#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) {
if (!rgb_matrix_indicators_user()) {
return false;
-1
View File
@@ -18,5 +18,4 @@
#define IS31FL3733_I2C_ADDRESS_2 IS31FL3733_I2C_ADDRESS_VCC_VCC
#define IS31FL3733_PWM_FREQUENCY IS31FL3733_PWM_FREQUENCY_26K7_HZ
#define RGB_MATRIX_CYCLE_ZONES_ENABLE
#define RGB_MATRIX_CAPS_LOCK_INDEX 30
-1
View File
@@ -18,5 +18,4 @@
#define IS31FL3733_I2C_ADDRESS_2 IS31FL3733_I2C_ADDRESS_VCC_VCC
#define IS31FL3733_PWM_FREQUENCY IS31FL3733_PWM_FREQUENCY_26K7_HZ
#define RGB_MATRIX_CYCLE_ZONES_ENABLE
#define RGB_MATRIX_CAPS_LOCK_INDEX 50
-31
View File
@@ -19,35 +19,4 @@ bool rgb_matrix_indicators_kb(void) {
return true;
}
# 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
-1
View File
@@ -13,5 +13,4 @@
#define IS31FL3733_I2C_ADDRESS_2 IS31FL3733_I2C_ADDRESS_VCC_VCC
#define IS31FL3733_PWM_FREQUENCY IS31FL3733_PWM_FREQUENCY_26K7_HZ
#define RGB_MATRIX_CYCLE_ZONES_ENABLE
#define RGB_MATRIX_CAPS_LOCK_INDEX 62
-2
View File
@@ -18,5 +18,3 @@
#define IS31FL3733_I2C_ADDRESS_2 IS31FL3733_I2C_ADDRESS_VCC_VCC
#define IS31FL3733_I2C_ADDRESS_3 IS31FL3733_I2C_ADDRESS_GND_GND
#define IS31FL3733_PWM_FREQUENCY IS31FL3733_PWM_FREQUENCY_26K7_HZ
#define RGB_MATRIX_CYCLE_ZONES_ENABLE
@@ -8,7 +8,7 @@
#undef PERMISSIVE_HOLD
#define FORCE_NKRO
#define NKRO_DEFAULT_ON true
#ifndef TAPPING_TOGGLE
#define TAPPING_TOGGLE 1
+5
View File
@@ -15,6 +15,11 @@
"nkro": true,
"rgblight": true
},
"host": {
"default": {
"nkro": true
}
},
"qmk": {
"locking": {
"enabled": true,
@@ -16,4 +16,3 @@
#pragma once
#define ONESHOT_TIMEOUT 2000
#define FORCE_NKRO
@@ -7,6 +7,5 @@
#define I2C1_SCL_PIN GP27
#define I2C1_SDA_PIN GP26
#define I2C_DRIVER I2CD1
#define OLED_DISPLAY_128X32
#define OLED_BRIGHTNESS 128
#endif
@@ -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) {
rgb_matrix_set_color(46, 0, 0, 0);
rgb_matrix_set_color(104, 0, 0, 0);
-32
View File
@@ -25,38 +25,6 @@
#include <math.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) {
if (!rgb_matrix_indicators_user()) {
return false;
@@ -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}
]
}
}
}
@@ -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
@@ -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
@@ -13,6 +13,11 @@
"mousekey": true,
"nkro": true
},
"host": {
"default": {
"nkro": true
}
},
"matrix_pins": {
"cols": ["C7", "C6", "B6", "B5", "B4", "D7", "D6", "D4"],
"rows": ["D5", "D3", "D2", "D1", "D0", "B7"]
@@ -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
@@ -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
@@ -11,7 +11,6 @@
#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
#define OLED_DISPLAY_128X32
#define I2C_DRIVER I2CD0
#define I2C1_SDA_PIN GP12
#define I2C1_SCL_PIN GP13
@@ -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)
};
@@ -0,0 +1,5 @@
{
"modules": [
"qmk/split_data_sync"
]
}
@@ -31,8 +31,6 @@ enum layer_names {
_FN,
};
// enum layer_keycodes { };
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) {
hsv_t hsv = rgb_matrix_config.hsv;
uint8_t time = scale16by8(g_rgb_timer, qadd8(32, 1));
@@ -44,20 +44,6 @@ typedef struct {
bool reflected;
} 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 {
//Custom Gradient control keycode
G1_HUI = SAFE_RANGE, //Custom gradient color 1 hue increase
@@ -80,20 +66,6 @@ enum layer_keycodes {
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) {
process_record_user_oled(keycode, record);
@@ -229,25 +201,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
}
}
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;
}
-56
View File
@@ -17,52 +17,6 @@
#include "quantum.h"
#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) {
if (!rgb_matrix_indicators_user()) {
@@ -76,14 +30,4 @@ bool rgb_matrix_indicators_kb(void) {
}
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
-28
View File
@@ -164,31 +164,3 @@ bool dip_switch_update_kb(uint8_t index, bool active) {
}
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;
}
}
-2
View File
@@ -2,8 +2,6 @@
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#define OLED_DISPLAY_128X32
#ifdef RGBLIGHT_ENABLE
#define RGBLIGHT_EFFECT_BREATHING
#define RGBLIGHT_EFFECT_RAINBOW_MOOD
@@ -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) {
led_t host_leds = host_keyboard_led_state();
if (host_leds.caps_lock) {
-26
View File
@@ -123,32 +123,6 @@ const snled27351_led_t PROGMEM g_snled27351_leds[SNLED27351_LED_COUNT] = {
// 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) {
if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) {
return false;
@@ -123,32 +123,6 @@ const snled27351_led_t PROGMEM g_snled27351_leds[SNLED27351_LED_COUNT] = {
// 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) {
if (!led_matrix_indicators_advanced_user(led_min, led_max)) {
return false;
-48
View File
@@ -28,54 +28,6 @@ bool dip_switch_update_kb(uint8_t index, bool active) {
}
#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) {
gpio_set_pin_output_push_pull(LED_MAC_OS_PIN);
gpio_set_pin_output_push_pull(LED_WIN_OS_PIN);
-44
View File
@@ -31,64 +31,20 @@ bool dip_switch_update_kb(uint8_t index, bool active) {
#endif // DIP_SWITCH_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_USER rgb_matrix_indicators_user
# 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_BLACK 0, 0, 0
# endif
# 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_USER led_matrix_indicators_user
# 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_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) {
if (!LED_MATRIX_INDICATORS_USER()) {
return false;
-48
View File
@@ -28,54 +28,6 @@ bool dip_switch_update_kb(uint8_t index, bool active) {
}
#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) {
gpio_set_pin_output_push_pull(LED_MAC_OS_PIN);
gpio_set_pin_output_push_pull(LED_WIN_OS_PIN);
-38
View File
@@ -41,44 +41,6 @@ bool process_record_kb(uint16_t keycode, keyrecord_t *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
case KC_OSSW:
if (record->event.pressed) {
// Switches default layer between `MAC_BASE` and `WIN_BASE` (0 and 2)
-24
View File
@@ -18,30 +18,6 @@
#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) {
if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) {
return false;
-28
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)
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) {
if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) {
return false;
-25
View File
@@ -29,31 +29,6 @@ bool dip_switch_update_kb(uint8_t index, bool active) {
#endif
#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) {
if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) {
-25
View File
@@ -29,31 +29,6 @@ bool dip_switch_update_kb(uint8_t index, bool active) {
#endif
#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) {
if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) {
-26
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)
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) {
if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { return false; }
// RGB_MATRIX_INDICATOR_SET_COLOR(index, red, green, blue);
-28
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)
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) {
if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) {
return false;
-24
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)
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) {
if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { return false; }
// RGB_MATRIX_INDICATOR_SET_COLOR(index, red, green, blue);
-26
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)
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) {
if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { return false; }
// RGB_MATRIX_INDICATOR_SET_COLOR(index, red, green, blue);
-25
View File
@@ -29,31 +29,6 @@ bool dip_switch_update_kb(uint8_t index, bool active) {
#endif // DIP_SWITCH_ENABLE
#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) {
if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) {
-28
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))
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) {
if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { return false; }
// RGB_MATRIX_INDICATOR_SET_COLOR(index, red, green, blue);
-26
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))
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) {
if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) {
return false;
-26
View File
@@ -31,32 +31,6 @@ bool dip_switch_update_kb(uint8_t index, bool active) {
// clang-format on
#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) {
if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { return false; }
// RGB_MATRIX_INDICATOR_SET_COLOR(index, red, green, blue);
-26
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)
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) {
if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { return false; }
// RGB_MATRIX_INDICATOR_SET_COLOR(index, red, green, blue);
-26
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)
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) {
if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) {
return false;
-26
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)
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) {
if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { return false; }
// RGB_MATRIX_INDICATOR_SET_COLOR(index, red, green, blue);
-26
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)
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) {
if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) {
return false;
-52
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)
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) {
if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { return false; }
// 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)
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) {
if (!led_matrix_indicators_advanced_user(led_min, led_max)) { return false; }
-26
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)
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) {
if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { return false; }
// RGB_MATRIX_INDICATOR_SET_COLOR(index, red, green, blue);
-26
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)
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) {
if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) {
return false;
-25
View File
@@ -29,31 +29,6 @@ bool dip_switch_update_kb(uint8_t index, bool active) {
#endif // DIP_SWITCH_ENABLE
#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) {
if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { return false; }
-26
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)
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) {
if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { return false; }
// RGB_MATRIX_INDICATOR_SET_COLOR(index, red, green, blue);
-26
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)
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) {
if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { return false; }
// RGB_MATRIX_INDICATOR_SET_COLOR(index, red, green, blue);
-26
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))
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) {
if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { return false; }
// RGB_MATRIX_INDICATOR_SET_COLOR(index, red, green, blue);
-26
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))
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) {
if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) {
return false;
-26
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)
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) {
if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { return false; }
// RGB_MATRIX_INDICATOR_SET_COLOR(index, red, green, blue);
-26
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)
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) {
if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { return false; }
// RGB_MATRIX_INDICATOR_SET_COLOR(index, red, green, blue);
+1 -1
View File
@@ -19,4 +19,4 @@
#define IS31FL3731_I2C_ADDRESS_1 IS31FL3731_I2C_ADDRESS_GND
#define B7_AUDIO
#define AUDIO_PIN B7
@@ -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
),
};
+1 -1
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");
you may not use this file except in compliance with the License.
+1 -1
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");
you may not use this file except in compliance with the License.
@@ -1,3 +0,0 @@
#pragma once
#define TAPPING_TOGGLE 2
@@ -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;
}
@@ -1,2 +0,0 @@
TAP_DANCE_ENABLE = yes
DYNAMIC_MACRO_ENABLE = yes
+1 -1
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");
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