mirror of
https://github.com/qmk/qmk_firmware.git
synced 2026-06-21 06:44:27 -04:00
Compare commits
331 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| fd624d016b | |||
| 6741f9dc26 | |||
| f8910d3a60 | |||
| c638100030 | |||
| 1d2f52e407 | |||
| 746eff22db | |||
| d36397fdd4 | |||
| 8522bb342d | |||
| 721affff7b | |||
| 4f6c5d2745 | |||
| 92dc82ae08 | |||
| b64014d5df | |||
| 0d401d1182 | |||
| 6ada0933db | |||
| 85886db43b | |||
| 0515002e7d | |||
| d8c8872753 | |||
| 7f702d2262 | |||
| 520b726b5c | |||
| 6a0e2a8868 | |||
| 4dc0a6e9e3 | |||
| 90082403de | |||
| 7b30455a93 | |||
| cffafbbdc7 | |||
| 1ef87578e2 | |||
| 55be8f2c2b | |||
| f34bc9a6bc | |||
| df94ffcc66 | |||
| 486f01f513 | |||
| ee74da3a4d | |||
| c53dd0fbb6 | |||
| 480d808683 | |||
| 11abc31420 | |||
| 62a8db33a3 | |||
| f0c79ee455 | |||
| 6b54261fa5 | |||
| 58d4decf48 | |||
| a9efff322c | |||
| 7b51d7e665 | |||
| 613d63aa66 | |||
| 5b630f7a08 | |||
| 286bc43459 | |||
| 2ea1a0192f | |||
| 25f641f2ff | |||
| 1620390d67 | |||
| 781b8ff406 | |||
| 05c4322c65 | |||
| 462556f4de | |||
| d19204824d | |||
| 2fa6ed6631 | |||
| c20d0a83b5 | |||
| 719b03f9c1 | |||
| 3c338996f0 | |||
| 06c24a811e | |||
| e56d518fc9 | |||
| 3a8ea37a13 | |||
| fdcf53854a | |||
| f8aec1f50c | |||
| 47fd58e63e | |||
| 2604a49cda | |||
| e3b26fa6ba | |||
| c701efbb53 | |||
| 88cf7d87ec | |||
| d9bf44c7a9 | |||
| f31df2ed6b | |||
| e4bf68ca94 | |||
| 393d3a5b21 | |||
| 5e3985024d | |||
| 459542a255 | |||
| 12e5b7db97 | |||
| 9879063f8c | |||
| 316fc06d8c | |||
| 4d25dfae32 | |||
| a033e172b9 | |||
| e9ee03983e | |||
| a187ebeec6 | |||
| e173b4020d | |||
| ffe57097eb | |||
| 6ee28ac86f | |||
| a3caec1580 | |||
| 99a67d1172 | |||
| 08d91c3d4e | |||
| 7e9c4508c8 | |||
| 9d47119457 | |||
| 4b19065f7b | |||
| ed0d5fde7b | |||
| cf2dcd6e24 | |||
| 62d25f02a4 | |||
| 0269eea2c9 | |||
| 078ec10e42 | |||
| 1836382f66 | |||
| 0efd817f42 | |||
| ce4f342ceb | |||
| 2b88b7b20a | |||
| 1a56fbece2 | |||
| a498daf627 | |||
| 5db9f2fb41 | |||
| c9f942e43c | |||
| 8d8cd1ca61 | |||
| f0622da7a8 | |||
| 504533b3b4 | |||
| c5391ca2d6 | |||
| ba9642c83d | |||
| 4a962d7679 | |||
| c2f7a5b5c5 | |||
| e2c7d621a1 | |||
| 0c5e36d056 | |||
| 7d40a3328f | |||
| 21c193f77b | |||
| 1182760a7c | |||
| 60638d3043 | |||
| ccc6c6ce0b | |||
| cc291cff7f | |||
| 70694abdfe | |||
| 1daa191e09 | |||
| 2ddd7c0667 | |||
| 2dc7d991b1 | |||
| c93ef27143 | |||
| 3a7e4d933e | |||
| 15e8658e81 | |||
| 710e041c39 | |||
| c6475e0476 | |||
| d99f3acd8c | |||
| 3001d81e3d | |||
| 84cd973c49 | |||
| 407e6e242e | |||
| 2c98f3782a | |||
| 18ed7c6caf | |||
| cbb8d156b0 | |||
| 92c0e2cee1 | |||
| ded30bb42e | |||
| 6a11370434 | |||
| dd74b2326f | |||
| fbb0acdaa0 | |||
| a34c3b915e | |||
| 2bd8e43256 | |||
| 915edc3a3f | |||
| 933cb8cc35 | |||
| 50a411c95e | |||
| 1426eedfc1 | |||
| 7b4565a409 | |||
| e4b998ccb0 | |||
| 4dd01f4331 | |||
| b5af7a3390 | |||
| 593cd168c6 | |||
| c31ebfeb0a | |||
| ed80e21858 | |||
| 6f4a45e392 | |||
| 53e1f9e0bd | |||
| 9d24bc8a33 | |||
| 534f59a169 | |||
| 7382c0a6f2 | |||
| 43a27da296 | |||
| 3d0ccbb1d5 | |||
| a20facf8ec | |||
| c7fde3d8cc | |||
| 941b63c9a9 | |||
| 0fdb5df94d | |||
| d340f3396f | |||
| bd500ae092 | |||
| 12f92db5d9 | |||
| fec01edaa4 | |||
| 9da27a3dcf | |||
| 7619e991cf | |||
| a3529e1c25 | |||
| 627ad33233 | |||
| 1f96f890fa | |||
| 1a3728db21 | |||
| 2cbcd76ef0 | |||
| 322e673bcb | |||
| c27e3aee19 | |||
| 4be8880177 | |||
| 86fbc9efe0 | |||
| c0bbf2f0f9 | |||
| f63d01d786 | |||
| 709628dfb2 | |||
| f01698b3f8 | |||
| 53c0e30e96 | |||
| 2afc217124 | |||
| e4de46b3b0 | |||
| b6ff72cb03 | |||
| cd78765edc | |||
| 71b6b46534 | |||
| e5faeea94d | |||
| 263d56ce7e | |||
| 7ec819eb22 | |||
| f7a77c8b70 | |||
| 53953f4229 | |||
| 7785e87029 | |||
| 4b3b32e173 | |||
| afb5335bf3 | |||
| e83672fdc4 | |||
| af6b953b2c | |||
| 9fd72b352b | |||
| 59e1a0d437 | |||
| 7fe0c9c746 | |||
| 311e915d96 | |||
| 5629ecf5ff | |||
| e2f62925d9 | |||
| 01e30d407c | |||
| d87e72a9b3 | |||
| acdc8a1374 | |||
| d73c91f19b | |||
| dfb6158c62 | |||
| 40e81ad893 | |||
| a1a2e3a390 | |||
| 3dcdf41d1c | |||
| 6d7589e249 | |||
| d55d65b77f | |||
| a56496640e | |||
| 032c2aa974 | |||
| 1874bc94e2 | |||
| 9e8199c411 | |||
| 4733a2df16 | |||
| 2d46c96732 | |||
| 3b99406d50 | |||
| 7bea08cb12 | |||
| 5591a68b65 | |||
| a0166fef43 | |||
| e52319b751 | |||
| cde41cf611 | |||
| 878fafeeb8 | |||
| 1ba0300da7 | |||
| f8daa3cc40 | |||
| bef076f23e | |||
| 3ac6f603a8 | |||
| 63a3fc3591 | |||
| 036c6100bd | |||
| 403211f7f8 | |||
| 888d42d64c | |||
| 6b2a2ab7ac | |||
| edd2e3d354 | |||
| 6b423c98e5 | |||
| 36cdac8fd3 | |||
| 59cc10451b | |||
| 031277c6d3 | |||
| 45ccd2e935 | |||
| 4f7a7873c8 | |||
| 5ad6d44e18 | |||
| fac1210609 | |||
| a170e6f191 | |||
| db4d8823d6 | |||
| 9aec0e2c9f | |||
| 08a064c56d | |||
| b01ed7d34f | |||
| 85d4736930 | |||
| a7f524f264 | |||
| 98f05c0136 | |||
| 5dd5d4dd60 | |||
| cf4e526063 | |||
| 8a6c081c4a | |||
| 005b778164 | |||
| b6d46cdc47 | |||
| efafbacb49 | |||
| 6729379041 | |||
| 02b49f2949 | |||
| 38815db760 | |||
| b00bdd0354 | |||
| 863b308519 | |||
| b2b8e54b23 | |||
| 127c664647 | |||
| 87a4c6ab25 | |||
| c72581474e | |||
| 7d66c11f37 | |||
| adbd077b15 | |||
| e5d1cf0105 | |||
| e391793f73 | |||
| bfc1b2b1cf | |||
| 70c36c6c97 | |||
| fb27ce6bb2 | |||
| fe1c3fc835 | |||
| f8d65460c2 | |||
| 4ba8da2ebb | |||
| 56a2e332e1 | |||
| df93bfb750 | |||
| 2b6ed67db4 | |||
| e31384babf | |||
| 536a0a78b4 | |||
| a0b15d08bc | |||
| e1c41f1b08 | |||
| f749cf9940 | |||
| 3d591a2000 | |||
| 259320ca27 | |||
| 85b79cc578 | |||
| 743c8a229f | |||
| c5795dd8d7 | |||
| e159fbefc5 | |||
| 3dc83cd244 | |||
| 1051fae08d | |||
| 0d08ebb70a | |||
| 389ec6df82 | |||
| 4f451a76f2 | |||
| e05516d817 | |||
| ae05baf08b | |||
| c1161a7a32 | |||
| f82d4d8680 | |||
| d420bcad33 | |||
| 7f9c8429e4 | |||
| 41c2a7b070 | |||
| bc8218371e | |||
| 27c2960320 | |||
| 42a7969d4a | |||
| 13f3f189b4 | |||
| 63a1d506a0 | |||
| ca8105eac0 | |||
| f39fc08338 | |||
| 1be7cde61f | |||
| 6585a244fb | |||
| e37a611977 | |||
| a5d7e04c66 | |||
| 6faca4d663 | |||
| 34c2e99fb3 | |||
| 064d8e9b62 | |||
| 10faca0b85 | |||
| c1b8b3dc6a | |||
| 89cf023d89 | |||
| b68cc43094 | |||
| 2b61ca078d | |||
| d3d025c337 | |||
| d7c7421784 | |||
| b08704f078 | |||
| 1f4110d742 | |||
| 57b284dfa9 | |||
| 5b94990c5a | |||
| debba50c33 | |||
| 511f1ed9de | |||
| a71a34eb52 | |||
| 655883a965 | |||
| a201bf9398 | |||
| c2eeeba2e9 | |||
| a4320e4890 |
@@ -0,0 +1,243 @@
|
||||
---
|
||||
applyTo: "keyboards/**"
|
||||
excludeAgent:
|
||||
- "coding-agent"
|
||||
---
|
||||
# GitHub Copilot Instructions for QMK Pull Request Review
|
||||
This document provides automated review guidance based on the [QMK PR Checklist](https://docs.qmk.fm/pr_checklist) and it is intended only for use by GitHub Copilot code-review agent during pull request reviews.
|
||||
|
||||
> **Scope**: This review applies **only to changes within the `keyboards/` folder**. Changes outside `keyboards/` (e.g., core code, quantum, platforms, drivers) must be flagged and deferred to a QMK Collaborator — do not review them.
|
||||
|
||||
## General PR Requirements
|
||||
|
||||
### Branch and Submission Standards
|
||||
- **Source Branch Policy**: Verify PR is NOT submitted from submitter's own `master` branch
|
||||
- Flag if submitter is using their own `master` branch as source
|
||||
- Suggest using feature branches instead for cleaner fork management
|
||||
- **Target Branch Policy**:
|
||||
- **New keyboard additions** → `master` branch (new folders under `keyboards/`)
|
||||
- **All other changes** → `develop` branch:
|
||||
- Keyboard updates, refactors, or moves
|
||||
- Core code changes
|
||||
- Data-driven configuration migrations
|
||||
- Any modifications to existing keyboards
|
||||
- **PR Scope**: PRs should contain the smallest set of modifications for a single change
|
||||
- Flag PRs that modify multiple keyboards simultaneously
|
||||
- Suggest splitting large PRs into focused, incremental changes
|
||||
- **Merge Conflicts**: Check for unresolved merge conflicts
|
||||
|
||||
### File Naming and Structure
|
||||
- **Lowercase Requirement**: All new directories and filenames must be lowercase
|
||||
- Exception: Upstream sources with original uppercase (LUFA, ChibiOS)
|
||||
- Exception: Core files with valid justification
|
||||
- **Reject**: Board designer preference for uppercase is NOT valid justification
|
||||
|
||||
### License Headers
|
||||
- **Required**: Valid license headers on all `*.c` and `*.h` files
|
||||
- **Recommended**: GPL2/GPL3 for consistency
|
||||
- **Format**: Check for proper GPL2+ header or SPDX identifier
|
||||
```c
|
||||
// Copyright 2024 Your Name (@yourgithub)
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
```
|
||||
- **Exception**: Simple assignment-only `rules.mk` files don't need headers
|
||||
- **Flag**: Missing or ambiguous license headers (blocks merge)
|
||||
|
||||
---
|
||||
|
||||
## Keymap PR Reviews
|
||||
|
||||
**Scope**: These rules apply to files within `keyboards/*/keymaps/*` subdirectories.
|
||||
|
||||
### Note on Non-Default Keymaps
|
||||
- Any keymap folder named something other than `default` (e.g., `default_clueboard`, `via`) is a non-default keymap
|
||||
- **Do not review the content** of non-default keymaps — flag their presence and note that a QMK Collaborator must review them
|
||||
|
||||
### Keymap Code Standards
|
||||
- **Includes**: `#include QMK_KEYBOARD_H` preferred over specific board files
|
||||
- **Enums**: Suggest using layer enums instead of `#define`s for layers (soft suggestion only)
|
||||
- **Custom Keycodes**: First entry must be `QK_USER`
|
||||
- **VIA**: Keymaps should NOT enable VIA
|
||||
- VIA keymaps belong in [VIA QMK Userspace](https://github.com/the-via/qmk_userspace_via)
|
||||
|
||||
---
|
||||
|
||||
## Keyboard PR Reviews
|
||||
|
||||
**Scope**: These rules apply to keyboard-level files in `keyboards/*` directories, excluding files within the `keymaps/` subdirectories. This includes:
|
||||
- `info.json` or `keyboard.json` (keyboard root or variant level)
|
||||
- `readme.md` (keyboard level)
|
||||
- `rules.mk` (keyboard level)
|
||||
- `config.h` (keyboard level, not keymap level)
|
||||
- `<keyboard>.c` and `<keyboard>.h` files
|
||||
- Hardware configuration files (`halconf.h`, `mcuconf.h`, `chconf.h`)
|
||||
|
||||
### Branch Targeting
|
||||
- **New Keyboards**: Target `master` branch
|
||||
- New additions to `keyboards/` folder submit to `master`
|
||||
- **Keyboard Moves**: Must target `develop` branch
|
||||
- Check `data/mappings/keyboard_aliases.hjson` is updated for moves
|
||||
- **Keyboard Updates/Refactors**: Must target `develop` to reduce merge conflicts
|
||||
- **Data Driven Migration**: Must target `develop`
|
||||
|
||||
### info.json and keyboard.json Requirements
|
||||
- **Schema Validation**: Verify that `info.json` and `keyboard.json` files are valid JSON (no syntax errors, no trailing commas, properly closed brackets)
|
||||
- **Mandatory Elements**:
|
||||
- `url` field is present and begins with `http://` or `https://`
|
||||
- `maintainer` field is present and non-empty
|
||||
- `usb.vid` and `usb.pid` fields are present and match the `0x` hexadecimal format (e.g. `"vid": "0x1234"`, `"pid": "0xFEED"`)
|
||||
- `usb.device_version` field is present
|
||||
- Each key entry in every `layout` array must include a `"matrix"` property (e.g. `{"label": "L01", "matrix": [0, 0], "x": 0, "y": 0}`)
|
||||
- Microcontroller and bootloader specified
|
||||
- Diode direction (if not using direct pins)
|
||||
- **Layout Naming**:
|
||||
- Single layout: Must be named `LAYOUT` or match `LAYOUT_*` pattern
|
||||
- Multiple layouts: Must include `LAYOUT_all` plus at least one alternate name
|
||||
|
||||
### readme.md Requirements
|
||||
- **Template**: Must follow [official template](https://github.com/qmk/qmk_firmware/blob/master/data/templates/keyboard/readme.md)
|
||||
- **Flash Command**: Present with `:flash` at end
|
||||
- **Hardware Link**: Valid availability link (unless handwired)
|
||||
- Private groupbuys acceptable
|
||||
- Open-source should link to files
|
||||
- **Reset Instructions**: Bootloader reset instructions must be present (non-empty)
|
||||
- **Images**: A keyboard image is preferred but not mandatory
|
||||
- If present, images must not be hosted in the repository
|
||||
- If an imgur URL is used, it must link directly to the image (i.e. `https://i.imgur.com/<id>.<ext>`), not the preview page (i.e. not `https://imgur.com/<id>`)
|
||||
|
||||
### rules.mk Standards
|
||||
- **Removed Items**:
|
||||
- Size comments like `(-/+size)`
|
||||
|
||||
### config.h Standards (Keyboard Level)
|
||||
- **Prohibited**:
|
||||
- `#define DESCRIPTION`
|
||||
- Comment blocks explaining features
|
||||
- Commented-out unused defines
|
||||
- `#include "config_common.h"`
|
||||
- **No Vial**: Vial-related files/changes not accepted
|
||||
|
||||
### Keyboard Implementation Files
|
||||
|
||||
#### `<keyboard>.c`
|
||||
- **Advanced Code Flag**: ⚠️ If a `<keyboard>.c` file is present in the PR, flag it as possible advanced code requiring QMK Collaborator review
|
||||
|
||||
#### `<keyboard>.h`
|
||||
- **Include**: `#include "quantum.h"` at top
|
||||
- **Layout Macros**: If `LAYOUT` macros are present, suggest moving them to `info.json` or `keyboard.json`
|
||||
|
||||
### Default Keymap Standards
|
||||
|
||||
**Scope**: These rules specifically apply to files within `keyboards/*/keymaps/default/` directories.
|
||||
|
||||
- **Pristine Requirement**: Bare minimum clean slate
|
||||
- ⚠️ If `keymap.c` contains anything beyond the `keymaps[]` array, or if the `default` keymap folder contains additional `.c` or `.h` files, flag this as possible advanced code requiring QMK Collaborator review
|
||||
- **Removed Examples**: Delete `QMKBEST`/`QMKURL` macros
|
||||
- **Tri Layer**: Use Tri Layer feature instead of manual `layer_on/off()` + `update_tri_layer()`
|
||||
- **Encoder Map**: Use encoder map feature, `encoder_update_user()` may not be present
|
||||
- **No VIA**: Default keymap should not enable VIA
|
||||
|
||||
### Prohibited Files
|
||||
- **No VIA JSON**: Belongs in [VIA Keyboard Repo](https://github.com/the-via/keyboards)
|
||||
- **No KLE JSON**: Not used within QMK
|
||||
- **Single Keyboard Per PR**: A PR must not modify more than one `keyboards/<folder>/` directory
|
||||
- Flag PRs that touch multiple top-level keyboard folders (e.g., both `keyboards/mykeyboard1/` and `keyboards/mykeyboard2/`) — each keyboard must be a separate PR
|
||||
- **No Cross-Keyboard Sources**: Don't include files from other keyboard vendors
|
||||
- Exception: Core files (e.g., `drivers/sensors/pmw3360.c`)
|
||||
- Use of vendor-specific code (e.g., `wilba_tech/wt_main.c`) only when keyboard exists in the same enclosing vendor folder (e.g. a `wilba_tech` keyboard)
|
||||
|
||||
---
|
||||
|
||||
## Review Response Templates
|
||||
|
||||
### For source master branch usage:
|
||||
```
|
||||
⚠️ This PR appears to be submitted from your own `master` branch. For future PRs, we recommend using feature branches instead of committing to your `master`. This makes it easier to keep your fork updated and manage multiple PRs.
|
||||
|
||||
See: [Best Practices: Your Fork's Master](https://docs.qmk.fm/newbs_git_using_your_master_branch)
|
||||
```
|
||||
|
||||
### For incorrect target branch:
|
||||
```
|
||||
❌ This PR targets the wrong branch:
|
||||
- **New keyboard additions** should target `master`
|
||||
- **Keyboard updates/refactors/moves** should target `develop`
|
||||
|
||||
Please change the target branch accordingly.
|
||||
```
|
||||
|
||||
### For missing license headers:
|
||||
```
|
||||
❌ Missing GPL-compatible license headers on the following files:
|
||||
- [list files]
|
||||
|
||||
Please add GPL2+ headers (GPL2/GPL3 recommended). Example:
|
||||
\`\`\`c
|
||||
// Copyright 2024 Your Name (@yourgithub)
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
\`\`\`
|
||||
```
|
||||
|
||||
### For non-lowercase filenames:
|
||||
```
|
||||
❌ The following files/directories must be lowercase:
|
||||
- [list files]
|
||||
|
||||
Exception: Only valid if from upstream sources (LUFA, ChibiOS) or justified by core consistency.
|
||||
```
|
||||
|
||||
### For config.h violations:
|
||||
```
|
||||
⚠️ Found prohibited config.h elements:
|
||||
- [list specific issues: `#define DESCRIPTION`, `#include "config_common.h"`, comment blocks, commented-out defines]
|
||||
|
||||
Please remove these and refer to [Data Driven Configuration](https://docs.qmk.fm/data_driven_config).
|
||||
```
|
||||
|
||||
### For info.json or keyboard.json issues:
|
||||
```
|
||||
⚠️ info.json or keyboard.json needs attention:
|
||||
- [list missing mandatory fields]
|
||||
- Please run: \`qmk format-json -i path/to/info.json\` (or keyboard.json)
|
||||
- Validate with: \`qmk lint -kb <keyboard_name>\`
|
||||
```
|
||||
|
||||
### For non-pristine default keymap:
|
||||
```
|
||||
⚠️ Default keymap requires collaborator review:
|
||||
The default `keymap.c` contains code beyond the `keymaps[]` array. The following was detected:
|
||||
- [describe: extra functions/definitions in keymap.c, or additional .c/.h files in the default keymap folder]
|
||||
|
||||
A QMK Collaborator must review this before merging.
|
||||
```
|
||||
|
||||
### For non-default keymaps:
|
||||
```
|
||||
⚠️ Non-default keymap detected: `keyboards/[path]/keymaps/[name]/`
|
||||
|
||||
This keymap requires a QMK Collaborator to review its content. No automated review of its code was performed.
|
||||
```
|
||||
|
||||
### For `<keyboard>.c` detected:
|
||||
```
|
||||
⚠️ `<keyboard>.c` file detected: `keyboards/[path]/[keyboard].c`
|
||||
|
||||
This file may contain advanced hardware configuration. A QMK Collaborator must review this before merging.
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Constraints and Conduct
|
||||
|
||||
- **Scope**: Only review changes within the `keyboards/` folder. Flag any changes outside `keyboards/` and defer to a QMK Collaborator without reviewing them.
|
||||
- Focus reviews on **objective checklist items** that can be automatically verified
|
||||
- Flag **definite violations** with ❌
|
||||
- Suggest improvements for **recommendations** with ⚠️
|
||||
- **Provide specific file/line references** when flagging issues
|
||||
- **Link to relevant QMK documentation** for each issue
|
||||
- **Prioritize blocking issues** (license, merge conflicts, branch policy)
|
||||
- **Be constructive**: Suggest fixes, not just problems
|
||||
- **Do not review non-default keymaps** — flag their presence and defer to a QMK Collaborator
|
||||
- **Do not review `<keyboard>.c` content in detail** — flag its presence and defer to a QMK Collaborator
|
||||
|
||||
This is meant as a **first-pass review** to catch common issues before human review. Complex architectural decisions, code quality, and subjective assessments still require human QMK Collaborator review.
|
||||
@@ -25,7 +25,7 @@ jobs:
|
||||
if: github.repository == 'qmk/qmk_firmware'
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v7
|
||||
with:
|
||||
fetch-depth: 1
|
||||
persist-credentials: false
|
||||
|
||||
@@ -28,7 +28,7 @@ jobs:
|
||||
if: github.repository == 'qmk/qmk_firmware'
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v7
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
|
||||
@@ -49,14 +49,14 @@ jobs:
|
||||
- debian:11
|
||||
- debian:12
|
||||
- debian:13
|
||||
- ubuntu:20.04
|
||||
- ubuntu:22.04
|
||||
- ubuntu:24.04
|
||||
- ubuntu:26.04
|
||||
|
||||
# RHEL/CentOS/Fedora based
|
||||
- fedora:41
|
||||
- fedora:42
|
||||
- fedora:43
|
||||
- fedora:44
|
||||
- rockylinux:8
|
||||
- rockylinux:9
|
||||
- rockylinux/rockylinux:10
|
||||
@@ -64,7 +64,7 @@ jobs:
|
||||
- almalinux:9
|
||||
- almalinux:10
|
||||
|
||||
# OpenSUSE based (we skip Tumbleweed as it has issues with package versions between pattern installs and other dependencies preinstalled into the base container)
|
||||
# OpenSUSE based (we skip Tumbleweed as it has issues with package mirrors regularly being out of date)
|
||||
- opensuse/leap:latest
|
||||
|
||||
# Gentoo-based
|
||||
@@ -96,7 +96,7 @@ jobs:
|
||||
;;
|
||||
*suse*)
|
||||
zypper --non-interactive refresh
|
||||
zypper --non-interactive install sudo git shadow findutils # findutils=xargs
|
||||
zypper --non-interactive install sudo git shadow findutils tar # findutils=xargs
|
||||
;;
|
||||
*gentoo*)
|
||||
emerge-webrsync
|
||||
@@ -123,7 +123,7 @@ jobs:
|
||||
echo 'Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"' >> /etc/sudoers
|
||||
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v6
|
||||
uses: actions/checkout@v7
|
||||
with:
|
||||
fetch-depth: 1
|
||||
submodules: recursive
|
||||
@@ -201,7 +201,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v6
|
||||
uses: actions/checkout@v7
|
||||
with:
|
||||
fetch-depth: 1
|
||||
submodules: recursive
|
||||
@@ -258,7 +258,7 @@ jobs:
|
||||
git:
|
||||
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v6
|
||||
uses: actions/checkout@v7
|
||||
with:
|
||||
fetch-depth: 1
|
||||
submodules: recursive
|
||||
|
||||
@@ -32,6 +32,7 @@ jobs:
|
||||
container: ghcr.io/qmk/qmk_cli
|
||||
|
||||
outputs:
|
||||
keymaps: ${{ steps.generate_slice_length.outputs.keymaps }}
|
||||
slice_length: ${{ steps.generate_slice_length.outputs.slice_length }}
|
||||
|
||||
steps:
|
||||
@@ -40,19 +41,27 @@ jobs:
|
||||
git config --global --add safe.directory '*'
|
||||
|
||||
- name: Checkout QMK Firmware
|
||||
uses: actions/checkout@v6
|
||||
uses: actions/checkout@v7
|
||||
|
||||
- name: Install dependencies
|
||||
run: pip3 install -r requirements-dev.txt
|
||||
|
||||
- name: Determine concurrency
|
||||
id: generate_slice_length
|
||||
shell: 'bash {0}'
|
||||
run: |
|
||||
target_count=$( {
|
||||
qmk find -km default 2>/dev/null
|
||||
qmk find -km xap 2>/dev/null
|
||||
} | sort | uniq | wc -l)
|
||||
targets=()
|
||||
target_count=0
|
||||
for target in "default" "xap"; do
|
||||
count=$(qmk find -km $target 2>/dev/null | wc -l)
|
||||
if [ $count -gt 0 ]; then
|
||||
target_count=$(($target_count + $count))
|
||||
targets+=($target)
|
||||
fi
|
||||
done
|
||||
keymaps=$(jq -c -n '$ARGS.positional' --args "${targets[@]}")
|
||||
slice_length=$((target_count / ($CONCURRENT_JOBS - 1))) # Err on the side of caution
|
||||
echo "keymaps=$keymaps" >> $GITHUB_OUTPUT
|
||||
echo "slice_length=$slice_length" >> $GITHUB_OUTPUT
|
||||
|
||||
build_targets:
|
||||
@@ -61,7 +70,7 @@ jobs:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
keymap: [default, xap]
|
||||
keymap: ${{ fromJson(needs.determine_concurrency.outputs.keymaps) }}
|
||||
uses: ./.github/workflows/ci_build_major_branch_keymap.yml
|
||||
with:
|
||||
branch: ${{ inputs.branch || github.ref_name }}
|
||||
@@ -80,12 +89,12 @@ jobs:
|
||||
git config --global --add safe.directory '*'
|
||||
|
||||
- name: Checkout QMK Firmware
|
||||
uses: actions/checkout@v6
|
||||
uses: actions/checkout@v7
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Download firmwares
|
||||
uses: actions/download-artifact@v7
|
||||
uses: actions/download-artifact@v8
|
||||
with:
|
||||
pattern: firmware-*
|
||||
path: .
|
||||
@@ -123,14 +132,7 @@ jobs:
|
||||
SOURCE_DIR: .
|
||||
DEST_DIR: ${{ inputs.branch || github.ref_name }}/latest
|
||||
|
||||
- name: Check if failure marker file exists
|
||||
id: check_failure_marker
|
||||
uses: andstor/file-existence-action@v3
|
||||
with:
|
||||
files: ./.failed
|
||||
|
||||
- name: Fail build if needed
|
||||
if: steps.check_failure_marker.outputs.files_exists == 'true'
|
||||
run: |
|
||||
# Exit with failure if the compilation stage failed
|
||||
exit 1
|
||||
[ ! -e .failed ] || exit 1
|
||||
|
||||
@@ -32,23 +32,24 @@ jobs:
|
||||
git config --global --add safe.directory '*'
|
||||
|
||||
- name: Checkout QMK Firmware
|
||||
uses: actions/checkout@v6
|
||||
uses: actions/checkout@v7
|
||||
|
||||
- name: Install dependencies
|
||||
run: pip3 install -r requirements-dev.txt
|
||||
|
||||
- name: Generate build targets
|
||||
shell: 'bash {0}'
|
||||
id: generate_targets
|
||||
run: |
|
||||
{ # Intentionally use `shuf` here so that we share manufacturers across all build groups -- some have a lot of ARM-based boards which inherently take longer
|
||||
counter=0
|
||||
echo -n '{'
|
||||
qmk find -km ${{ inputs.keymap }} 2>/dev/null | sort | uniq | shuf | xargs -L${{ inputs.slice_length }} | while IFS=$'\n' read target ; do
|
||||
qmk find -km ${{ inputs.keymap }} 2>/dev/null | sort | uniq | shuf --random-source=<(openssl enc -aes-256-ctr -pass pass:qmk -nosalt </dev/zero 2>/dev/null) | xargs -L${{ inputs.slice_length }} | while IFS=$'\n' read target ; do
|
||||
if [ $counter -gt 0 ]; then
|
||||
echo -n ','
|
||||
fi
|
||||
counter=$((counter+1))
|
||||
printf "\"group %02d\":{" $counter
|
||||
printf "\"group-%02d\":{" $counter
|
||||
echo -n '"targets":"'
|
||||
echo $target | tr ' ' '\n' | sort | uniq | xargs echo -n
|
||||
echo -n '"}'
|
||||
@@ -60,7 +61,7 @@ jobs:
|
||||
echo "targets=$(jq -c 'keys' targets.json)" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Upload targets json
|
||||
uses: actions/upload-artifact@v6
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: targets-${{ inputs.keymap }}
|
||||
path: targets.json
|
||||
@@ -72,6 +73,9 @@ jobs:
|
||||
container: ghcr.io/qmk/qmk_cli
|
||||
continue-on-error: true
|
||||
|
||||
env:
|
||||
CCACHE_CONFIGPATH: ~/.cache
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
target: ${{ fromJson(needs.generate_targets.outputs.targets) }}
|
||||
@@ -82,38 +86,63 @@ jobs:
|
||||
git config --global --add safe.directory '*'
|
||||
|
||||
- name: Checkout QMK Firmware
|
||||
uses: actions/checkout@v6
|
||||
uses: actions/checkout@v7
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- name: Install dependencies
|
||||
run: pip3 install -r requirements-dev.txt
|
||||
|
||||
- name: Get target definitions
|
||||
uses: actions/download-artifact@v7
|
||||
uses: actions/download-artifact@v8
|
||||
with:
|
||||
name: targets-${{ inputs.keymap }}
|
||||
path: .
|
||||
|
||||
- name: Deploy submodules
|
||||
run: |
|
||||
qmk git-submodule -f
|
||||
|
||||
- name: Dump targets
|
||||
run: |
|
||||
jq -r '.["${{ matrix.target }}"].targets' targets.json | tr ' ' '\n' | sort
|
||||
|
||||
- name: Restore Cache
|
||||
id: cache
|
||||
uses: actions/cache/restore@v5
|
||||
with:
|
||||
path: ${{ env.CCACHE_CONFIGPATH }}
|
||||
key: compile-${{ inputs.keymap }}-${{ matrix.target }}
|
||||
|
||||
- name: Build targets
|
||||
continue-on-error: true
|
||||
run: |
|
||||
export NCPUS=$(( $(nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || getconf _NPROCESSORS_ONLN 2>/dev/null) -1 ))
|
||||
targets=$(jq -r '.["${{ matrix.target }}"].targets' targets.json | tr ' ' '\n' | sort)
|
||||
if [ -z "${targets}" ]; then
|
||||
echo "Zero build targets detected"
|
||||
exit 0
|
||||
fi
|
||||
qmk mass-compile -t -j $NCPUS -e DUMP_CI_METADATA=yes $targets || touch .failed
|
||||
qmk mass-compile -t -j $(nproc) -e DUMP_CI_METADATA=yes -e USE_CCACHE=yes $targets || touch .failed
|
||||
|
||||
- name: Dump ccache stats
|
||||
run: |
|
||||
ccache -s
|
||||
|
||||
# Delete the old cache on hit to emulate a cache update. See https://github.com/actions/cache/issues/342.
|
||||
- name: Delete old cache
|
||||
env:
|
||||
GH_TOKEN: ${{ github.token }}
|
||||
if: steps.cache.outputs.cache-hit
|
||||
run: |
|
||||
count=$(gh cache list --ref ${{ github.ref }} --key ${{ steps.cache.outputs.cache-primary-key }} --json id | jq length)
|
||||
if [ $count -gt 0 ]; then
|
||||
gh cache delete --ref ${{ github.ref }} ${{ steps.cache.outputs.cache-primary-key }}
|
||||
fi
|
||||
|
||||
- name: Save Cache
|
||||
uses: actions/cache/save@v5
|
||||
with:
|
||||
path: ${{ env.CCACHE_CONFIGPATH }}
|
||||
key: compile-${{ inputs.keymap }}-${{ matrix.target }}
|
||||
|
||||
- name: Upload binaries
|
||||
uses: actions/upload-artifact@v6
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: firmware-${{ inputs.keymap }}-${{ matrix.target }}
|
||||
if-no-files-found: ignore
|
||||
@@ -137,17 +166,17 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout QMK Firmware
|
||||
uses: actions/checkout@v6
|
||||
uses: actions/checkout@v7
|
||||
|
||||
- name: Download firmwares
|
||||
uses: actions/download-artifact@v7
|
||||
uses: actions/download-artifact@v8
|
||||
with:
|
||||
pattern: firmware-${{ inputs.keymap }}-*
|
||||
path: .
|
||||
merge-multiple: true
|
||||
|
||||
- name: Upload all firmwares
|
||||
uses: actions/upload-artifact@v6
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: firmware-${{ inputs.keymap }}
|
||||
if-no-files-found: ignore
|
||||
@@ -166,7 +195,7 @@ jobs:
|
||||
truncate --size='<960K' $GITHUB_STEP_SUMMARY || true
|
||||
|
||||
- name: Delete temporary build artifacts
|
||||
uses: geekyeggo/delete-artifact@v5
|
||||
uses: geekyeggo/delete-artifact@v6
|
||||
with:
|
||||
name: |
|
||||
firmware-${{ inputs.keymap }}-*
|
||||
|
||||
@@ -24,7 +24,7 @@ jobs:
|
||||
- name: Disable safe.directory check
|
||||
run : git config --global --add safe.directory '*'
|
||||
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v7
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@ jobs:
|
||||
steps:
|
||||
- name: Deploy Develop
|
||||
if: ${{ github.repository == 'qmk/qmk_firmware' }}
|
||||
uses: actions/github-script@v8
|
||||
uses: actions/github-script@v9
|
||||
with:
|
||||
github-token: ${{ secrets.QMK_BOT_TOKEN }}
|
||||
script: |
|
||||
|
||||
@@ -15,7 +15,7 @@ jobs:
|
||||
if: github.repository == 'qmk/qmk_firmware'
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v7
|
||||
with:
|
||||
token: ${{ secrets.QMK_BOT_TOKEN }}
|
||||
fetch-depth: 0
|
||||
|
||||
@@ -30,7 +30,7 @@ jobs:
|
||||
container: ghcr.io/qmk/qmk_cli
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v7
|
||||
with:
|
||||
fetch-depth: 1
|
||||
|
||||
@@ -57,7 +57,7 @@ jobs:
|
||||
|
||||
- name: Deploy
|
||||
if: ${{ github.event_name == 'push' && github.repository == 'qmk/qmk_firmware' }}
|
||||
uses: JamesIves/github-pages-deploy-action@v4.7.6
|
||||
uses: JamesIves/github-pages-deploy-action@v4.8.0
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
branch: gh-pages
|
||||
|
||||
@@ -21,7 +21,7 @@ jobs:
|
||||
- riot
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v7
|
||||
with:
|
||||
token: ${{ secrets.QMK_BOT_TOKEN }}
|
||||
fetch-depth: 0
|
||||
|
||||
@@ -26,7 +26,7 @@ jobs:
|
||||
- name: Disable safe.directory check
|
||||
run : git config --global --add safe.directory '*'
|
||||
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v7
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ jobs:
|
||||
- name: Disable safe.directory check
|
||||
run : git config --global --add safe.directory '*'
|
||||
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v7
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ jobs:
|
||||
- name: Disable safe.directory check
|
||||
run : git config --global --add safe.directory '*'
|
||||
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v7
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
@@ -31,7 +31,7 @@ jobs:
|
||||
with:
|
||||
use_rest_api: true
|
||||
|
||||
- name: Print info
|
||||
- name: Print git info
|
||||
run: |
|
||||
git rev-parse --short HEAD
|
||||
echo ${{ github.event.pull_request.base.sha }}
|
||||
@@ -57,7 +57,7 @@ jobs:
|
||||
if [[ $KEYMAP_ONLY -gt 0 ]]; then
|
||||
echo "linting ${KB}"
|
||||
|
||||
qmk lint --keyboard ${KB} && qmk info -l --keyboard ${KB}
|
||||
qmk lint --strict --keyboard ${KB} && qmk info -l --keyboard ${KB}
|
||||
exit_code=$(($exit_code + $?))
|
||||
fi
|
||||
done
|
||||
@@ -78,10 +78,21 @@ jobs:
|
||||
fi
|
||||
exit $exit_code
|
||||
|
||||
- name: Verify keyboard aliases
|
||||
- name: Reset git repo
|
||||
if: always()
|
||||
shell: 'bash {0}'
|
||||
run: |
|
||||
git reset --hard
|
||||
git clean -xfd
|
||||
|
||||
- name: Verify keyboard targets
|
||||
if: always()
|
||||
shell: 'bash {0}'
|
||||
run: |
|
||||
qmk ci-validate-keyboard-targets
|
||||
|
||||
- name: Verify keyboard aliases
|
||||
if: always()
|
||||
shell: 'bash {0}'
|
||||
run: |
|
||||
qmk ci-validate-aliases
|
||||
|
||||
@@ -8,6 +8,9 @@ on:
|
||||
paths:
|
||||
- 'data/constants/**'
|
||||
- 'lib/python/**'
|
||||
- 'quantum/rgblight/rgblight_breathe_table.h'
|
||||
- 'quantum/keycodes.h'
|
||||
- 'quantum/keymap_extras/**'
|
||||
|
||||
jobs:
|
||||
regen:
|
||||
@@ -19,7 +22,7 @@ jobs:
|
||||
- name: Disable safe.directory check
|
||||
run : git config --global --add safe.directory '*'
|
||||
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v7
|
||||
|
||||
- name: Install dependencies
|
||||
run: pip3 install -r requirements-dev.txt
|
||||
|
||||
@@ -19,7 +19,7 @@ jobs:
|
||||
- name: Disable safe.directory check
|
||||
run : git config --global --add safe.directory '*'
|
||||
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v7
|
||||
|
||||
- name: Install dependencies
|
||||
run: pip3 install -r requirements-dev.txt
|
||||
|
||||
@@ -11,6 +11,7 @@ on:
|
||||
pull_request:
|
||||
paths:
|
||||
- 'builddefs/**'
|
||||
- '!builddefs/docsgen/**'
|
||||
- 'quantum/**'
|
||||
- 'platforms/**'
|
||||
- 'tmk_core/**'
|
||||
@@ -26,7 +27,7 @@ jobs:
|
||||
container: ghcr.io/qmk/qmk_cli
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v7
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
@@ -34,4 +35,4 @@ jobs:
|
||||
run: pip3 install -r requirements-dev.txt
|
||||
|
||||
- name: Run tests
|
||||
run: qmk test-c
|
||||
run: qmk test-c -j $(nproc)
|
||||
|
||||
@@ -38,14 +38,17 @@ $(info QMK Firmware $(QMK_VERSION))
|
||||
endif
|
||||
endif
|
||||
|
||||
# Try to determine userspace from qmk config, if set.
|
||||
ifeq ($(QMK_USERSPACE),)
|
||||
QMK_USERSPACE = $(shell qmk config -ro user.overlay_dir | cut -d= -f2 | sed -e 's@^None$$@@g')
|
||||
endif
|
||||
|
||||
# Determine which qmk cli to use
|
||||
QMK_BIN := qmk
|
||||
|
||||
# Try to determine userspace from qmk config, if set. Handle direct query on qmk_cli>=1.1.7
|
||||
# falling back to legacy method of only supporting user.overlay_dir config
|
||||
# sort is used to buffer 'qmk env' output and avoid BrokenPipeError errors
|
||||
export override QMK_USERSPACE := $(shell \
|
||||
$(QMK_BIN) env | sort | grep -q QMK_USERSPACE \
|
||||
&& $(QMK_BIN) env QMK_USERSPACE \
|
||||
|| $(QMK_BIN) config -ro user.overlay_dir | cut -d= -f2 | sed -e 's@^None$$@@g')
|
||||
|
||||
# avoid 'Entering|Leaving directory' messages
|
||||
MAKEFLAGS += --no-print-directory
|
||||
|
||||
@@ -115,7 +118,7 @@ endef
|
||||
TRY_TO_MATCH_RULE_FROM_LIST = $(eval $(call TRY_TO_MATCH_RULE_FROM_LIST_HELPER,$1))$(RULE_FOUND)
|
||||
|
||||
# As TRY_TO_MATCH_RULE_FROM_LIST_HELPER, but with additional
|
||||
# resolution of keyboard_aliases.hjson for provided rule
|
||||
# resolution of keyboard_aliases.hjson for provided rule
|
||||
define TRY_TO_MATCH_RULE_FROM_LIST_HELPER_KB
|
||||
# Split on ":", padding with empty strings to avoid indexing issues
|
||||
TOKEN1:=$$(shell python3 -c "import sys; print((sys.argv[1].split(':',1)+[''])[0])" $$(RULE))
|
||||
@@ -190,41 +193,9 @@ endef
|
||||
# Parses a rule in the format <keymap>:<target>
|
||||
# the keyboard is already known when entering this function
|
||||
define PARSE_KEYBOARD
|
||||
# If we want to compile the default subproject, then we need to
|
||||
# include the correct makefile to determine the actual name of it
|
||||
CURRENT_KB := $1
|
||||
|
||||
# 5/4/3/2/1
|
||||
KEYBOARD_FOLDER_PATH_1 := $$(CURRENT_KB)
|
||||
KEYBOARD_FOLDER_PATH_2 := $$(patsubst %/,%,$$(dir $$(KEYBOARD_FOLDER_PATH_1)))
|
||||
KEYBOARD_FOLDER_PATH_3 := $$(patsubst %/,%,$$(dir $$(KEYBOARD_FOLDER_PATH_2)))
|
||||
KEYBOARD_FOLDER_PATH_4 := $$(patsubst %/,%,$$(dir $$(KEYBOARD_FOLDER_PATH_3)))
|
||||
KEYBOARD_FOLDER_PATH_5 := $$(patsubst %/,%,$$(dir $$(KEYBOARD_FOLDER_PATH_4)))
|
||||
|
||||
KEYMAPS :=
|
||||
# get a list of all keymaps
|
||||
KEYMAPS += $$(notdir $$(patsubst %/.,%,$$(wildcard $(ROOT_DIR)/keyboards/$$(KEYBOARD_FOLDER_PATH_1)/keymaps/*/.)))
|
||||
KEYMAPS += $$(notdir $$(patsubst %/.,%,$$(wildcard $(ROOT_DIR)/keyboards/$$(KEYBOARD_FOLDER_PATH_2)/keymaps/*/.)))
|
||||
KEYMAPS += $$(notdir $$(patsubst %/.,%,$$(wildcard $(ROOT_DIR)/keyboards/$$(KEYBOARD_FOLDER_PATH_3)/keymaps/*/.)))
|
||||
KEYMAPS += $$(notdir $$(patsubst %/.,%,$$(wildcard $(ROOT_DIR)/keyboards/$$(KEYBOARD_FOLDER_PATH_4)/keymaps/*/.)))
|
||||
KEYMAPS += $$(notdir $$(patsubst %/.,%,$$(wildcard $(ROOT_DIR)/keyboards/$$(KEYBOARD_FOLDER_PATH_5)/keymaps/*/.)))
|
||||
|
||||
ifneq ($(QMK_USERSPACE),)
|
||||
KEYMAPS += $$(notdir $$(patsubst %/.,%,$$(wildcard $(QMK_USERSPACE)/keyboards/$$(KEYBOARD_FOLDER_PATH_1)/keymaps/*/.)))
|
||||
KEYMAPS += $$(notdir $$(patsubst %/.,%,$$(wildcard $(QMK_USERSPACE)/keyboards/$$(KEYBOARD_FOLDER_PATH_2)/keymaps/*/.)))
|
||||
KEYMAPS += $$(notdir $$(patsubst %/.,%,$$(wildcard $(QMK_USERSPACE)/keyboards/$$(KEYBOARD_FOLDER_PATH_3)/keymaps/*/.)))
|
||||
KEYMAPS += $$(notdir $$(patsubst %/.,%,$$(wildcard $(QMK_USERSPACE)/keyboards/$$(KEYBOARD_FOLDER_PATH_4)/keymaps/*/.)))
|
||||
KEYMAPS += $$(notdir $$(patsubst %/.,%,$$(wildcard $(QMK_USERSPACE)/keyboards/$$(KEYBOARD_FOLDER_PATH_5)/keymaps/*/.)))
|
||||
endif
|
||||
|
||||
KEYBOARD_LAYOUTS := $(shell $(QMK_BIN) list-layouts --keyboard $1)
|
||||
LAYOUT_KEYMAPS :=
|
||||
$$(foreach LAYOUT,$$(KEYBOARD_LAYOUTS),$$(eval LAYOUT_KEYMAPS += $$(notdir $$(patsubst %/.,%,$$(wildcard $(ROOT_DIR)/layouts/*/$$(LAYOUT)/*/.)))))
|
||||
ifneq ($(QMK_USERSPACE),)
|
||||
$$(foreach LAYOUT,$$(KEYBOARD_LAYOUTS),$$(eval LAYOUT_KEYMAPS += $$(notdir $$(patsubst %/.,%,$$(wildcard $(QMK_USERSPACE)/layouts/$$(LAYOUT)/*/.)))))
|
||||
endif
|
||||
|
||||
KEYMAPS := $$(sort $$(KEYMAPS) $$(LAYOUT_KEYMAPS))
|
||||
KEYMAPS := $(shell $(QMK_BIN) list-keymaps --keyboard $1)
|
||||
|
||||
# if the rule after removing the start of it is empty (we haven't specified a kemap or target)
|
||||
# compile all the keymaps
|
||||
@@ -329,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
|
||||
@@ -342,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; \
|
||||
@@ -480,16 +452,17 @@ distclean_userspace: clean
|
||||
endif
|
||||
|
||||
# Extra targets for formatting and/or pytest, running within the qmk/qmk_cli container to match GHA.
|
||||
CONTAINER_PREAMBLE := export HOME="/tmp"; export PATH="/tmp/.local/bin:\$$PATH"; python3 -m pip install --upgrade pip; python3 -m pip install -r requirements-dev.txt
|
||||
|
||||
.PHONY: format-core
|
||||
format-core:
|
||||
RUNTIME=docker ./util/docker_cmd.sh bash -lic "$(CONTAINER_PREAMBLE); qmk format-c --core-only -a && qmk format-python -a"
|
||||
RUNTIME=docker ./util/docker_cmd.sh qmk format-c --core-only -a
|
||||
RUNTIME=docker ./util/docker_cmd.sh qmk format-python -a
|
||||
|
||||
.PHONY: pytest
|
||||
pytest:
|
||||
RUNTIME=docker ./util/docker_cmd.sh bash -lic "$(CONTAINER_PREAMBLE); qmk pytest"
|
||||
RUNTIME=docker ./util/docker_cmd.sh qmk pytest
|
||||
|
||||
.PHONY: format-and-pytest
|
||||
format-and-pytest:
|
||||
RUNTIME=docker ./util/docker_cmd.sh bash -lic "$(CONTAINER_PREAMBLE); qmk format-c --core-only -a && qmk format-python -a && qmk pytest"
|
||||
RUNTIME=docker ./util/docker_cmd.sh qmk format-c --core-only -a
|
||||
RUNTIME=docker ./util/docker_cmd.sh qmk format-python -a
|
||||
RUNTIME=docker ./util/docker_cmd.sh qmk pytest
|
||||
|
||||
@@ -1,36 +0,0 @@
|
||||
# Look for a json keymap file
|
||||
ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_5)/keymap.json)","")
|
||||
KEYMAP_JSON := $(MAIN_KEYMAP_PATH_5)/keymap.json
|
||||
KEYMAP_JSON_PATH := $(MAIN_KEYMAP_PATH_5)
|
||||
else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_4)/keymap.json)","")
|
||||
KEYMAP_JSON := $(MAIN_KEYMAP_PATH_4)/keymap.json
|
||||
KEYMAP_JSON_PATH := $(MAIN_KEYMAP_PATH_4)
|
||||
else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_3)/keymap.json)","")
|
||||
KEYMAP_JSON := $(MAIN_KEYMAP_PATH_3)/keymap.json
|
||||
KEYMAP_JSON_PATH := $(MAIN_KEYMAP_PATH_3)
|
||||
else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_2)/keymap.json)","")
|
||||
KEYMAP_JSON := $(MAIN_KEYMAP_PATH_2)/keymap.json
|
||||
KEYMAP_JSON_PATH := $(MAIN_KEYMAP_PATH_2)
|
||||
else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_1)/keymap.json)","")
|
||||
KEYMAP_JSON := $(MAIN_KEYMAP_PATH_1)/keymap.json
|
||||
KEYMAP_JSON_PATH := $(MAIN_KEYMAP_PATH_1)
|
||||
endif
|
||||
|
||||
ifneq ($(QMK_USERSPACE),)
|
||||
ifneq ("$(wildcard $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_5)/keymap.json)","")
|
||||
KEYMAP_JSON := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_5)/keymap.json
|
||||
KEYMAP_JSON_PATH := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_5)
|
||||
else ifneq ("$(wildcard $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_4)/keymap.json)","")
|
||||
KEYMAP_JSON := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_4)/keymap.json
|
||||
KEYMAP_JSON_PATH := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_4)
|
||||
else ifneq ("$(wildcard $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_3)/keymap.json)","")
|
||||
KEYMAP_JSON := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_3)/keymap.json
|
||||
KEYMAP_JSON_PATH := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_3)
|
||||
else ifneq ("$(wildcard $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_2)/keymap.json)","")
|
||||
KEYMAP_JSON := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_2)/keymap.json
|
||||
KEYMAP_JSON_PATH := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_2)
|
||||
else ifneq ("$(wildcard $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_1)/keymap.json)","")
|
||||
KEYMAP_JSON := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_1)/keymap.json
|
||||
KEYMAP_JSON_PATH := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_1)
|
||||
endif
|
||||
endif
|
||||
+18
-73
@@ -138,75 +138,12 @@ ifneq ("$(wildcard $(KEYBOARD_PATH_5)/keyboard.json)","")
|
||||
DD_CONFIG_FILES += $(KEYBOARD_PATH_5)/keyboard.json
|
||||
endif
|
||||
|
||||
MAIN_KEYMAP_PATH_1 := $(KEYBOARD_PATH_1)/keymaps/$(KEYMAP)
|
||||
MAIN_KEYMAP_PATH_2 := $(KEYBOARD_PATH_2)/keymaps/$(KEYMAP)
|
||||
MAIN_KEYMAP_PATH_3 := $(KEYBOARD_PATH_3)/keymaps/$(KEYMAP)
|
||||
MAIN_KEYMAP_PATH_4 := $(KEYBOARD_PATH_4)/keymaps/$(KEYMAP)
|
||||
MAIN_KEYMAP_PATH_5 := $(KEYBOARD_PATH_5)/keymaps/$(KEYMAP)
|
||||
|
||||
# Pull in rules from DD keyboard config
|
||||
INFO_RULES_MK = $(shell $(QMK_BIN) generate-rules-mk --quiet --escape --keyboard $(KEYBOARD) --output $(INTERMEDIATE_OUTPUT)/src/info_rules.mk)
|
||||
include $(INFO_RULES_MK)
|
||||
|
||||
# Check for keymap.json first, so we can regenerate keymap.c
|
||||
include $(BUILDDEFS_PATH)/build_json.mk
|
||||
|
||||
# Pull in keymap level rules.mk
|
||||
ifeq ("$(wildcard $(KEYMAP_PATH))", "")
|
||||
# Look through the possible keymap folders until we find a matching keymap.c
|
||||
ifneq ($(QMK_USERSPACE),)
|
||||
ifneq ("$(wildcard $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_1)/keymap.c)","")
|
||||
-include $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_1)/rules.mk
|
||||
KEYMAP_C := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_1)/keymap.c
|
||||
KEYMAP_PATH := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_1)
|
||||
else ifneq ("$(wildcard $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_2)/keymap.c)","")
|
||||
-include $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_2)/rules.mk
|
||||
KEYMAP_C := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_2)/keymap.c
|
||||
KEYMAP_PATH := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_2)
|
||||
else ifneq ("$(wildcard $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_3)/keymap.c)","")
|
||||
-include $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_3)/rules.mk
|
||||
KEYMAP_C := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_3)/keymap.c
|
||||
KEYMAP_PATH := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_3)
|
||||
else ifneq ("$(wildcard $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_4)/keymap.c)","")
|
||||
-include $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_4)/rules.mk
|
||||
KEYMAP_C := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_4)/keymap.c
|
||||
KEYMAP_PATH := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_4)
|
||||
else ifneq ("$(wildcard $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_5)/keymap.c)","")
|
||||
-include $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_5)/rules.mk
|
||||
KEYMAP_C := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_5)/keymap.c
|
||||
KEYMAP_PATH := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_5)
|
||||
endif
|
||||
endif
|
||||
ifeq ($(KEYMAP_PATH),)
|
||||
ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_1)/keymap.c)","")
|
||||
-include $(MAIN_KEYMAP_PATH_1)/rules.mk
|
||||
KEYMAP_C := $(MAIN_KEYMAP_PATH_1)/keymap.c
|
||||
KEYMAP_PATH := $(MAIN_KEYMAP_PATH_1)
|
||||
else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_2)/keymap.c)","")
|
||||
-include $(MAIN_KEYMAP_PATH_2)/rules.mk
|
||||
KEYMAP_C := $(MAIN_KEYMAP_PATH_2)/keymap.c
|
||||
KEYMAP_PATH := $(MAIN_KEYMAP_PATH_2)
|
||||
else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_3)/keymap.c)","")
|
||||
-include $(MAIN_KEYMAP_PATH_3)/rules.mk
|
||||
KEYMAP_C := $(MAIN_KEYMAP_PATH_3)/keymap.c
|
||||
KEYMAP_PATH := $(MAIN_KEYMAP_PATH_3)
|
||||
else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_4)/keymap.c)","")
|
||||
-include $(MAIN_KEYMAP_PATH_4)/rules.mk
|
||||
KEYMAP_C := $(MAIN_KEYMAP_PATH_4)/keymap.c
|
||||
KEYMAP_PATH := $(MAIN_KEYMAP_PATH_4)
|
||||
else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_5)/keymap.c)","")
|
||||
-include $(MAIN_KEYMAP_PATH_5)/rules.mk
|
||||
KEYMAP_C := $(MAIN_KEYMAP_PATH_5)/keymap.c
|
||||
KEYMAP_PATH := $(MAIN_KEYMAP_PATH_5)
|
||||
else ifneq ($(LAYOUTS),)
|
||||
# If we haven't found a keymap yet fall back to community layouts
|
||||
include $(BUILDDEFS_PATH)/build_layout.mk
|
||||
else ifeq ("$(wildcard $(KEYMAP_JSON_PATH))", "") # Not finding keymap.c is fine if we found a keymap.json
|
||||
$(call CATASTROPHIC_ERROR,Invalid keymap,Could not find keymap)
|
||||
# this state should never be reached
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
include $(BUILDDEFS_PATH)/locate_keymap.mk
|
||||
-include $(KEYMAP_PATH)/rules.mk
|
||||
|
||||
# Have we found a keymap.json?
|
||||
ifneq ("$(wildcard $(KEYMAP_JSON))", "")
|
||||
@@ -217,16 +154,9 @@ ifneq ("$(wildcard $(KEYMAP_JSON))", "")
|
||||
OPT_DEFS += -DOTHER_KEYMAP_C=\"$(OTHER_KEYMAP_C)\"
|
||||
endif
|
||||
|
||||
KEYMAP_PATH := $(KEYMAP_JSON_PATH)
|
||||
|
||||
KEYMAP_C := $(INTERMEDIATE_OUTPUT)/src/keymap.c
|
||||
KEYMAP_H := $(INTERMEDIATE_OUTPUT)/src/config.h
|
||||
|
||||
ifeq ($(OTHER_KEYMAP_C),)
|
||||
# Load the keymap-level rules.mk if exists (and we havent already loaded it for keymap.c)
|
||||
-include $(KEYMAP_PATH)/rules.mk
|
||||
endif
|
||||
|
||||
# Load any rules.mk content from keymap.json
|
||||
INFO_RULES_MK = $(shell $(QMK_BIN) generate-rules-mk --quiet --escape --output $(INTERMEDIATE_OUTPUT)/src/rules.mk $(KEYMAP_JSON))
|
||||
include $(INFO_RULES_MK)
|
||||
@@ -257,6 +187,11 @@ include $(COMMUNITY_RULES_MK)
|
||||
|
||||
ifneq ($(COMMUNITY_MODULES),)
|
||||
|
||||
$(INTERMEDIATE_OUTPUT)/src/community_post_config.h: $(KEYMAP_JSON) $(DD_CONFIG_FILES)
|
||||
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
|
||||
$(eval CMD=$(QMK_BIN) generate-community-post-config-h -kb $(KEYBOARD) --quiet --output $(INTERMEDIATE_OUTPUT)/src/community_post_config.h $(KEYMAP_JSON))
|
||||
@$(BUILD_CMD)
|
||||
|
||||
$(INTERMEDIATE_OUTPUT)/src/community_modules.h: $(KEYMAP_JSON) $(DD_CONFIG_FILES)
|
||||
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
|
||||
$(eval CMD=$(QMK_BIN) generate-community-modules-h -kb $(KEYBOARD) --quiet --output $(INTERMEDIATE_OUTPUT)/src/community_modules.h $(KEYMAP_JSON))
|
||||
@@ -287,9 +222,15 @@ $(INTERMEDIATE_OUTPUT)/src/rgb_matrix_community_modules.inc: $(KEYMAP_JSON) $(DD
|
||||
$(eval CMD=$(QMK_BIN) generate-rgb-matrix-community-modules-inc -kb $(KEYBOARD) --quiet --output $(INTERMEDIATE_OUTPUT)/src/rgb_matrix_community_modules.inc $(KEYMAP_JSON))
|
||||
@$(BUILD_CMD)
|
||||
|
||||
$(INTERMEDIATE_OUTPUT)/src/split_transaction_id_community_modules.inc: $(KEYMAP_JSON) $(DD_CONFIG_FILES)
|
||||
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
|
||||
$(eval CMD=$(QMK_BIN) generate-split-transaction-id-community-modules-inc -kb $(KEYBOARD) --quiet --output $(INTERMEDIATE_OUTPUT)/src/split_transaction_id_community_modules.inc $(KEYMAP_JSON))
|
||||
@$(BUILD_CMD)
|
||||
|
||||
COMMUNITY_POST_CONFIG_H = $(INTERMEDIATE_OUTPUT)/src/community_post_config.h
|
||||
SRC += $(INTERMEDIATE_OUTPUT)/src/community_modules.c
|
||||
|
||||
generated-files: $(INTERMEDIATE_OUTPUT)/src/community_modules.h $(INTERMEDIATE_OUTPUT)/src/community_modules.c $(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.c $(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.h $(INTERMEDIATE_OUTPUT)/src/led_matrix_community_modules.inc $(INTERMEDIATE_OUTPUT)/src/rgb_matrix_community_modules.inc
|
||||
generated-files: $(INTERMEDIATE_OUTPUT)/src/community_post_config.h $(INTERMEDIATE_OUTPUT)/src/community_modules.h $(INTERMEDIATE_OUTPUT)/src/community_modules.c $(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.c $(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.h $(INTERMEDIATE_OUTPUT)/src/led_matrix_community_modules.inc $(INTERMEDIATE_OUTPUT)/src/rgb_matrix_community_modules.inc $(INTERMEDIATE_OUTPUT)/src/split_transaction_id_community_modules.inc
|
||||
|
||||
endif
|
||||
|
||||
@@ -431,6 +372,10 @@ ifneq ("$(wildcard $(KEYBOARD_PATH_5)/post_config.h)","")
|
||||
POST_CONFIG_H += $(KEYBOARD_PATH_5)/post_config.h
|
||||
endif
|
||||
|
||||
ifneq ($(COMMUNITY_POST_CONFIG_H),)
|
||||
POST_CONFIG_H += $(COMMUNITY_POST_CONFIG_H)
|
||||
endif
|
||||
|
||||
CONFIG_H += $(INTERMEDIATE_OUTPUT)/src/info_config.h
|
||||
KEYBOARD_SRC += $(INTERMEDIATE_OUTPUT)/src/default_keyboard.c
|
||||
|
||||
|
||||
@@ -1,36 +0,0 @@
|
||||
LAYOUTS_PATH := layouts
|
||||
LAYOUTS_REPOS := $(patsubst %/,%,$(sort $(dir $(wildcard $(LAYOUTS_PATH)/*/))))
|
||||
|
||||
ifneq ($(QMK_USERSPACE),)
|
||||
LAYOUTS_REPOS += $(patsubst %/,%,$(QMK_USERSPACE)/$(LAYOUTS_PATH))
|
||||
endif
|
||||
|
||||
define SEARCH_LAYOUTS_REPO
|
||||
LAYOUT_KEYMAP_PATH := $$(LAYOUTS_REPO)/$$(LAYOUT)/$$(KEYMAP)
|
||||
LAYOUT_KEYMAP_JSON := $$(LAYOUT_KEYMAP_PATH)/keymap.json
|
||||
LAYOUT_KEYMAP_C := $$(LAYOUT_KEYMAP_PATH)/keymap.c
|
||||
ifneq ("$$(wildcard $$(LAYOUT_KEYMAP_JSON))","")
|
||||
KEYMAP_JSON := $$(LAYOUT_KEYMAP_JSON)
|
||||
KEYMAP_JSON_PATH := $$(LAYOUT_KEYMAP_PATH)
|
||||
endif
|
||||
ifneq ("$$(wildcard $$(LAYOUT_KEYMAP_C))","")
|
||||
-include $$(LAYOUT_KEYMAP_PATH)/rules.mk
|
||||
KEYMAP_C := $$(LAYOUT_KEYMAP_C)
|
||||
KEYMAP_PATH := $$(LAYOUT_KEYMAP_PATH)
|
||||
endif
|
||||
endef
|
||||
|
||||
define SEARCH_LAYOUTS
|
||||
$$(foreach LAYOUTS_REPO,$$(LAYOUTS_REPOS),$$(eval $$(call SEARCH_LAYOUTS_REPO)))
|
||||
endef
|
||||
|
||||
ifneq ($(FORCE_LAYOUT),)
|
||||
ifneq (,$(findstring $(FORCE_LAYOUT),$(LAYOUTS)))
|
||||
$(info Forcing layout: $(FORCE_LAYOUT))
|
||||
LAYOUTS := $(FORCE_LAYOUT)
|
||||
else
|
||||
$(call CATASTROPHIC_ERROR,Invalid layout,Forced layout does not exist)
|
||||
endif
|
||||
endif
|
||||
|
||||
$(foreach LAYOUT,$(LAYOUTS),$(eval $(call SEARCH_LAYOUTS)))
|
||||
@@ -98,6 +98,7 @@ endif
|
||||
|
||||
VALID_STENO_PROTOCOL_TYPES := geminipr txbolt all
|
||||
STENO_PROTOCOL ?= all
|
||||
|
||||
ifeq ($(strip $(STENO_ENABLE)), yes)
|
||||
ifeq ($(filter $(STENO_PROTOCOL),$(VALID_STENO_PROTOCOL_TYPES)),)
|
||||
$(call CATASTROPHIC_ERROR,Invalid STENO_PROTOCOL,STENO_PROTOCOL="$(STENO_PROTOCOL)" is not a valid stenography protocol)
|
||||
@@ -125,7 +126,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 +160,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),)
|
||||
|
||||
@@ -50,15 +50,19 @@ 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 ----------------
|
||||
|
||||
ifeq ($(strip $(LTO_ENABLE)), yes)
|
||||
CDEFS += -flto
|
||||
CDEFS += -flto=auto
|
||||
CDEFS += -DLTO_ENABLE
|
||||
endif
|
||||
|
||||
@@ -66,12 +70,14 @@ 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
|
||||
CFLAGS += $(call cc-option,-Wunused-but-set-variable=1,-Wunused-but-set-variable)
|
||||
CFLAGS += $(call cc-option,-Wunused-but-set-parameter=1,-Wunused-but-set-parameter)
|
||||
ifneq ($(strip $(ALLOW_WARNINGS)), yes)
|
||||
CFLAGS += -Werror
|
||||
endif
|
||||
@@ -89,7 +95,8 @@ CXXFLAGS += -O$(OPT)
|
||||
CXXFLAGS += -w
|
||||
CXXFLAGS += -Wall
|
||||
CXXFLAGS += -Wundef
|
||||
|
||||
CXXFLAGS += $(call cc-option,-Wunused-but-set-variable=1,-Wunused-but-set-variable)
|
||||
CXXFLAGS += $(call cc-option,-Wunused-but-set-parameter=1,-Wunused-but-set-parameter)
|
||||
ifneq ($(strip $(ALLOW_WARNINGS)), yes)
|
||||
CXXFLAGS += -Werror
|
||||
endif
|
||||
|
||||
@@ -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",
|
||||
|
||||
+891
-493
File diff suppressed because it is too large
Load Diff
@@ -45,6 +45,7 @@ GENERIC_FEATURES = \
|
||||
MOUSEKEY \
|
||||
MUSIC \
|
||||
OS_DETECTION \
|
||||
PLOVER_HID \
|
||||
PROGRAMMABLE_BUTTON \
|
||||
REPEAT_KEY \
|
||||
SECURE \
|
||||
|
||||
@@ -0,0 +1,64 @@
|
||||
MAIN_KEYMAP_PATH_1 := $(KEYBOARD_PATH_1)/keymaps/$(KEYMAP)
|
||||
MAIN_KEYMAP_PATH_2 := $(KEYBOARD_PATH_2)/keymaps/$(KEYMAP)
|
||||
MAIN_KEYMAP_PATH_3 := $(KEYBOARD_PATH_3)/keymaps/$(KEYMAP)
|
||||
MAIN_KEYMAP_PATH_4 := $(KEYBOARD_PATH_4)/keymaps/$(KEYMAP)
|
||||
MAIN_KEYMAP_PATH_5 := $(KEYBOARD_PATH_5)/keymaps/$(KEYMAP)
|
||||
|
||||
POTENTIAL_KEYMAP_PATHS += $(MAIN_KEYMAP_PATH_1)
|
||||
POTENTIAL_KEYMAP_PATHS += $(MAIN_KEYMAP_PATH_2)
|
||||
POTENTIAL_KEYMAP_PATHS += $(MAIN_KEYMAP_PATH_3)
|
||||
POTENTIAL_KEYMAP_PATHS += $(MAIN_KEYMAP_PATH_4)
|
||||
POTENTIAL_KEYMAP_PATHS += $(MAIN_KEYMAP_PATH_5)
|
||||
|
||||
ifneq ($(QMK_USERSPACE),)
|
||||
POTENTIAL_KEYMAP_PATHS += $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_1)
|
||||
POTENTIAL_KEYMAP_PATHS += $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_2)
|
||||
POTENTIAL_KEYMAP_PATHS += $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_3)
|
||||
POTENTIAL_KEYMAP_PATHS += $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_4)
|
||||
POTENTIAL_KEYMAP_PATHS += $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_5)
|
||||
endif
|
||||
|
||||
define SEARCH_POTENTIAL_LOCATION
|
||||
POTENTIAL_DIR := $1
|
||||
ifeq ("$$(wildcard $$(KEYMAP_PATH))", "")
|
||||
POTENTIAL_KEYMAP_JSON := $$(POTENTIAL_DIR)/keymap.json
|
||||
POTENTIAL_KEYMAP_C := $$(POTENTIAL_DIR)/keymap.c
|
||||
ifneq ("$$(wildcard $$(POTENTIAL_KEYMAP_JSON))","")
|
||||
KEYMAP_JSON := $$(POTENTIAL_KEYMAP_JSON)
|
||||
KEYMAP_PATH := $$(POTENTIAL_DIR)
|
||||
endif
|
||||
ifneq ("$$(wildcard $$(POTENTIAL_KEYMAP_C))","")
|
||||
KEYMAP_C := $$(POTENTIAL_KEYMAP_C)
|
||||
KEYMAP_PATH := $$(POTENTIAL_DIR)
|
||||
endif
|
||||
endif
|
||||
endef
|
||||
|
||||
$(foreach KM_DIR,$(POTENTIAL_KEYMAP_PATHS),$(eval $(call SEARCH_POTENTIAL_LOCATION, $(KM_DIR))))
|
||||
|
||||
LAYOUTS_PATH := layouts
|
||||
LAYOUTS_REPOS := $(patsubst %/,%,$(sort $(dir $(wildcard $(LAYOUTS_PATH)/*/))))
|
||||
|
||||
ifneq ($(QMK_USERSPACE),)
|
||||
LAYOUTS_REPOS += $(patsubst %/,%,$(QMK_USERSPACE)/$(LAYOUTS_PATH))
|
||||
endif
|
||||
|
||||
define SEARCH_LAYOUTS
|
||||
$$(foreach LAYOUTS_REPO,$$(LAYOUTS_REPOS),$$(eval $$(call SEARCH_POTENTIAL_LOCATION,$$(LAYOUTS_REPO)/$$(LAYOUT)/$$(KEYMAP))))
|
||||
endef
|
||||
|
||||
ifneq ($(FORCE_LAYOUT),)
|
||||
ifneq (,$(findstring $(FORCE_LAYOUT),$(LAYOUTS)))
|
||||
$(info Forcing layout: $(FORCE_LAYOUT))
|
||||
LAYOUTS := $(FORCE_LAYOUT)
|
||||
else
|
||||
$(call CATASTROPHIC_ERROR,Invalid layout,Forced layout does not exist)
|
||||
endif
|
||||
endif
|
||||
|
||||
$(foreach LAYOUT,$(LAYOUTS),$(eval $(call SEARCH_LAYOUTS)))
|
||||
|
||||
ifeq ("$$(wildcard $$(KEYMAP_PATH))", "")
|
||||
$(call CATASTROPHIC_ERROR,Invalid keymap,Could not find keymap)
|
||||
# this state should never be reached
|
||||
endif
|
||||
@@ -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
|
||||
|
||||
@@ -63,6 +63,7 @@ OTHER_OPTION_NAMES = \
|
||||
LCD_BACKLIGHT_ENABLE \
|
||||
MACROS_ENABLED \
|
||||
PS2_ENABLE \
|
||||
PLOVER_HID_ENABLE \
|
||||
PS2_MOUSE_ENABLE \
|
||||
PS2_DRIVER \
|
||||
RAW_ENABLE \
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
# $(2) = option to use if $(1) is not supported
|
||||
# $(3) = additional arguments to pass to the compiler during the test, but aren't contained in the output
|
||||
cc-option = $(shell \
|
||||
if { echo 'int main(){return 0;}' | $(CC) $(1) $(3) -o /dev/null -x c /dev/null >/dev/null 2>&1; }; \
|
||||
if { echo 'int main(){return 0;}' | $(CC) $(1) $(3) -Wl,--unresolved-symbols=ignore-all -o /dev/null -x c /dev/null >/dev/null 2>&1; }; \
|
||||
then echo "$(1)"; else echo "$(2)"; fi)
|
||||
|
||||
# Helper to pass comma character to make functions (use with `$(,)` to pass in `$(call ...)` arguments)
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
"0x7480": {
|
||||
"group": "audio",
|
||||
"key": "QK_AUDIO_ON",
|
||||
"label": "Audio On",
|
||||
"aliases": [
|
||||
"AU_ON"
|
||||
]
|
||||
@@ -10,6 +11,7 @@
|
||||
"0x7481": {
|
||||
"group": "audio",
|
||||
"key": "QK_AUDIO_OFF",
|
||||
"label": "Audio Off",
|
||||
"aliases": [
|
||||
"AU_OFF"
|
||||
]
|
||||
@@ -17,6 +19,7 @@
|
||||
"0x7482": {
|
||||
"group": "audio",
|
||||
"key": "QK_AUDIO_TOGGLE",
|
||||
"label": "Toggle Audio",
|
||||
"aliases": [
|
||||
"AU_TOGG"
|
||||
]
|
||||
@@ -25,6 +28,7 @@
|
||||
"0x748A": {
|
||||
"group": "audio",
|
||||
"key": "QK_AUDIO_CLICKY_TOGGLE",
|
||||
"label": "Toggle Audio Clicky",
|
||||
"aliases": [
|
||||
"CK_TOGG"
|
||||
]
|
||||
@@ -32,6 +36,7 @@
|
||||
"0x748B": {
|
||||
"group": "audio",
|
||||
"key": "QK_AUDIO_CLICKY_ON",
|
||||
"label": "Audio Clicky On",
|
||||
"aliases": [
|
||||
"CK_ON"
|
||||
]
|
||||
@@ -39,6 +44,7 @@
|
||||
"0x748C": {
|
||||
"group": "audio",
|
||||
"key": "QK_AUDIO_CLICKY_OFF",
|
||||
"label": "Audio Clicky Off",
|
||||
"aliases": [
|
||||
"CK_OFF"
|
||||
]
|
||||
@@ -46,6 +52,7 @@
|
||||
"0x748D": {
|
||||
"group": "audio",
|
||||
"key": "QK_AUDIO_CLICKY_UP",
|
||||
"label": "Audio Clicky Up",
|
||||
"aliases": [
|
||||
"CK_UP"
|
||||
]
|
||||
@@ -53,6 +60,7 @@
|
||||
"0x748E": {
|
||||
"group": "audio",
|
||||
"key": "QK_AUDIO_CLICKY_DOWN",
|
||||
"label": "Audio Clicky Down",
|
||||
"aliases": [
|
||||
"CK_DOWN"
|
||||
]
|
||||
@@ -60,6 +68,7 @@
|
||||
"0x748F": {
|
||||
"group": "audio",
|
||||
"key": "QK_AUDIO_CLICKY_RESET",
|
||||
"label": "Audio Clicky Reset",
|
||||
"aliases": [
|
||||
"CK_RST"
|
||||
]
|
||||
@@ -68,6 +77,7 @@
|
||||
"0x7490": {
|
||||
"group": "audio",
|
||||
"key": "QK_MUSIC_ON",
|
||||
"label": "Music On",
|
||||
"aliases": [
|
||||
"MU_ON"
|
||||
]
|
||||
@@ -75,6 +85,7 @@
|
||||
"0x7491": {
|
||||
"group": "audio",
|
||||
"key": "QK_MUSIC_OFF",
|
||||
"label": "Music Off",
|
||||
"aliases": [
|
||||
"MU_OFF"
|
||||
]
|
||||
@@ -82,6 +93,7 @@
|
||||
"0x7492": {
|
||||
"group": "audio",
|
||||
"key": "QK_MUSIC_TOGGLE",
|
||||
"label": "Toggle Music",
|
||||
"aliases": [
|
||||
"MU_TOGG"
|
||||
]
|
||||
@@ -89,6 +101,7 @@
|
||||
"0x7493": {
|
||||
"group": "audio",
|
||||
"key": "QK_MUSIC_MODE_NEXT",
|
||||
"label": "Music Next",
|
||||
"aliases": [
|
||||
"MU_NEXT"
|
||||
]
|
||||
@@ -97,6 +110,7 @@
|
||||
"0x7494": {
|
||||
"group": "audio",
|
||||
"key": "QK_AUDIO_VOICE_NEXT",
|
||||
"label": "Audio Voice Next",
|
||||
"aliases": [
|
||||
"AU_NEXT"
|
||||
]
|
||||
@@ -104,6 +118,7 @@
|
||||
"0x7495": {
|
||||
"group": "audio",
|
||||
"key": "QK_AUDIO_VOICE_PREVIOUS",
|
||||
"label": "Audio Voice Previous",
|
||||
"aliases": [
|
||||
"AU_PREV"
|
||||
]
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"0x0000": {
|
||||
"group": "internal",
|
||||
"key": "KC_NO",
|
||||
"label": "",
|
||||
"label": "N/A",
|
||||
"aliases": [
|
||||
"XXXXXXX"
|
||||
]
|
||||
@@ -11,7 +11,7 @@
|
||||
"0x0001": {
|
||||
"group": "internal",
|
||||
"key": "KC_TRANSPARENT",
|
||||
"label": "",
|
||||
"label": "Transparent",
|
||||
"aliases": [
|
||||
"_______",
|
||||
"KC_TRNS"
|
||||
@@ -634,7 +634,7 @@
|
||||
"0x0065": {
|
||||
"group": "basic",
|
||||
"key": "KC_APPLICATION",
|
||||
"label": "Application",
|
||||
"label": "App",
|
||||
"aliases": [
|
||||
"KC_APP"
|
||||
]
|
||||
@@ -642,7 +642,7 @@
|
||||
"0x0066": {
|
||||
"group": "basic",
|
||||
"key": "KC_KB_POWER",
|
||||
"label": "Application"
|
||||
"label": "Power"
|
||||
},
|
||||
"0x0067": {
|
||||
"group": "basic",
|
||||
@@ -1068,7 +1068,7 @@
|
||||
"0x00A5": {
|
||||
"group": "system",
|
||||
"key": "KC_SYSTEM_POWER",
|
||||
"label": "System Power Down",
|
||||
"label": "Power",
|
||||
"aliases": [
|
||||
"KC_PWR"
|
||||
]
|
||||
@@ -1076,7 +1076,7 @@
|
||||
"0x00A6": {
|
||||
"group": "system",
|
||||
"key": "KC_SYSTEM_SLEEP",
|
||||
"label": "System Sleep",
|
||||
"label": "Sleep",
|
||||
"aliases": [
|
||||
"KC_SLEP"
|
||||
]
|
||||
@@ -1084,7 +1084,7 @@
|
||||
"0x00A7": {
|
||||
"group": "system",
|
||||
"key": "KC_SYSTEM_WAKE",
|
||||
"label": "System Wake",
|
||||
"label": "Wake",
|
||||
"aliases": [
|
||||
"KC_WAKE"
|
||||
]
|
||||
@@ -1140,7 +1140,7 @@
|
||||
"0x00AE": {
|
||||
"group": "media",
|
||||
"key": "KC_MEDIA_PLAY_PAUSE",
|
||||
"label": "Play/Pause Track",
|
||||
"label": "Play/Pause",
|
||||
"aliases": [
|
||||
"KC_MPLY"
|
||||
]
|
||||
@@ -1148,7 +1148,7 @@
|
||||
"0x00AF": {
|
||||
"group": "media",
|
||||
"key": "KC_MEDIA_SELECT",
|
||||
"label": "Launch Player",
|
||||
"label": "Media",
|
||||
"aliases": [
|
||||
"KC_MSEL"
|
||||
]
|
||||
@@ -1164,12 +1164,12 @@
|
||||
"0x00B1": {
|
||||
"group": "media",
|
||||
"key": "KC_MAIL",
|
||||
"label": "Launch Mail"
|
||||
"label": "Mail",
|
||||
},
|
||||
"0x00B2": {
|
||||
"group": "media",
|
||||
"key": "KC_CALCULATOR",
|
||||
"label": "Launch Calculator",
|
||||
"label": "Calculator",
|
||||
"aliases": [
|
||||
"KC_CALC"
|
||||
]
|
||||
@@ -1177,7 +1177,7 @@
|
||||
"0x00B3": {
|
||||
"group": "media",
|
||||
"key": "KC_MY_COMPUTER",
|
||||
"label": "Launch My Computer",
|
||||
"label": "My Computer",
|
||||
"aliases": [
|
||||
"KC_MYCM"
|
||||
]
|
||||
@@ -1185,7 +1185,7 @@
|
||||
"0x00B4": {
|
||||
"group": "media",
|
||||
"key": "KC_WWW_SEARCH",
|
||||
"label": "Browser Search",
|
||||
"label": "Search",
|
||||
"aliases": [
|
||||
"KC_WSCH"
|
||||
]
|
||||
@@ -1193,7 +1193,7 @@
|
||||
"0x00B5": {
|
||||
"group": "media",
|
||||
"key": "KC_WWW_HOME",
|
||||
"label": "Browser Home",
|
||||
"label": "Home",
|
||||
"aliases": [
|
||||
"KC_WHOM"
|
||||
]
|
||||
@@ -1201,7 +1201,7 @@
|
||||
"0x00B6": {
|
||||
"group": "media",
|
||||
"key": "KC_WWW_BACK",
|
||||
"label": "Browser Back",
|
||||
"label": "Back",
|
||||
"aliases": [
|
||||
"KC_WBAK"
|
||||
]
|
||||
@@ -1209,7 +1209,7 @@
|
||||
"0x00B7": {
|
||||
"group": "media",
|
||||
"key": "KC_WWW_FORWARD",
|
||||
"label": "Browser Forward",
|
||||
"label": "Forward",
|
||||
"aliases": [
|
||||
"KC_WFWD"
|
||||
]
|
||||
@@ -1217,7 +1217,7 @@
|
||||
"0x00B8": {
|
||||
"group": "media",
|
||||
"key": "KC_WWW_STOP",
|
||||
"label": "Browser Stop",
|
||||
"label": "Stop",
|
||||
"aliases": [
|
||||
"KC_WSTP"
|
||||
]
|
||||
@@ -1225,7 +1225,7 @@
|
||||
"0x00B9": {
|
||||
"group": "media",
|
||||
"key": "KC_WWW_REFRESH",
|
||||
"label": "Browser Refresh",
|
||||
"label": "Refresh",
|
||||
"aliases": [
|
||||
"KC_WREF"
|
||||
]
|
||||
@@ -1233,7 +1233,7 @@
|
||||
"0x00BA": {
|
||||
"group": "media",
|
||||
"key": "KC_WWW_FAVORITES",
|
||||
"label": "Browser Favorites",
|
||||
"label": "Favorites",
|
||||
"aliases": [
|
||||
"KC_WFAV"
|
||||
]
|
||||
@@ -1241,7 +1241,7 @@
|
||||
"0x00BB": {
|
||||
"group": "media",
|
||||
"key": "KC_MEDIA_FAST_FORWARD",
|
||||
"label": "Next Track",
|
||||
"label": "Fast Forward",
|
||||
"aliases": [
|
||||
"KC_MFFD"
|
||||
]
|
||||
@@ -1249,7 +1249,7 @@
|
||||
"0x00BC": {
|
||||
"group": "media",
|
||||
"key": "KC_MEDIA_REWIND",
|
||||
"label": "Previous Track",
|
||||
"label": "Rewind",
|
||||
"aliases": [
|
||||
"KC_MRWD"
|
||||
]
|
||||
@@ -1273,7 +1273,7 @@
|
||||
"0x00BF": {
|
||||
"group": "media",
|
||||
"key": "KC_CONTROL_PANEL",
|
||||
"label": "Open Control Panel",
|
||||
"label": "Control Panel",
|
||||
"aliases": [
|
||||
"KC_CPNL"
|
||||
]
|
||||
@@ -1281,7 +1281,7 @@
|
||||
"0x00C0": {
|
||||
"group": "media",
|
||||
"key": "KC_ASSISTANT",
|
||||
"label": "Launch Assistant",
|
||||
"label": "Assistant",
|
||||
"aliases": [
|
||||
"KC_ASST"
|
||||
]
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
"0x7400": {
|
||||
"group": "joystick",
|
||||
"key": "QK_JOYSTICK_BUTTON_0",
|
||||
"label": "Button 0",
|
||||
"aliases": [
|
||||
"JS_0"
|
||||
]
|
||||
@@ -10,6 +11,7 @@
|
||||
"0x7401": {
|
||||
"group": "joystick",
|
||||
"key": "QK_JOYSTICK_BUTTON_1",
|
||||
"label": "Button 1",
|
||||
"aliases": [
|
||||
"JS_1"
|
||||
]
|
||||
@@ -17,6 +19,7 @@
|
||||
"0x7402": {
|
||||
"group": "joystick",
|
||||
"key": "QK_JOYSTICK_BUTTON_2",
|
||||
"label": "Button 2",
|
||||
"aliases": [
|
||||
"JS_2"
|
||||
]
|
||||
@@ -24,6 +27,7 @@
|
||||
"0x7403": {
|
||||
"group": "joystick",
|
||||
"key": "QK_JOYSTICK_BUTTON_3",
|
||||
"label": "Button 3",
|
||||
"aliases": [
|
||||
"JS_3"
|
||||
]
|
||||
@@ -31,6 +35,7 @@
|
||||
"0x7404": {
|
||||
"group": "joystick",
|
||||
"key": "QK_JOYSTICK_BUTTON_4",
|
||||
"label": "Button 4",
|
||||
"aliases": [
|
||||
"JS_4"
|
||||
]
|
||||
@@ -38,6 +43,7 @@
|
||||
"0x7405": {
|
||||
"group": "joystick",
|
||||
"key": "QK_JOYSTICK_BUTTON_5",
|
||||
"label": "Button 5",
|
||||
"aliases": [
|
||||
"JS_5"
|
||||
]
|
||||
@@ -45,6 +51,7 @@
|
||||
"0x7406": {
|
||||
"group": "joystick",
|
||||
"key": "QK_JOYSTICK_BUTTON_6",
|
||||
"label": "Button 6",
|
||||
"aliases": [
|
||||
"JS_6"
|
||||
]
|
||||
@@ -52,6 +59,7 @@
|
||||
"0x7407": {
|
||||
"group": "joystick",
|
||||
"key": "QK_JOYSTICK_BUTTON_7",
|
||||
"label": "Button 7",
|
||||
"aliases": [
|
||||
"JS_7"
|
||||
]
|
||||
@@ -59,6 +67,7 @@
|
||||
"0x7408": {
|
||||
"group": "joystick",
|
||||
"key": "QK_JOYSTICK_BUTTON_8",
|
||||
"label": "Button 8",
|
||||
"aliases": [
|
||||
"JS_8"
|
||||
]
|
||||
@@ -66,6 +75,7 @@
|
||||
"0x7409": {
|
||||
"group": "joystick",
|
||||
"key": "QK_JOYSTICK_BUTTON_9",
|
||||
"label": "Button 9",
|
||||
"aliases": [
|
||||
"JS_9"
|
||||
]
|
||||
@@ -73,6 +83,7 @@
|
||||
"0x740A": {
|
||||
"group": "joystick",
|
||||
"key": "QK_JOYSTICK_BUTTON_10",
|
||||
"label": "Button 10",
|
||||
"aliases": [
|
||||
"JS_10"
|
||||
]
|
||||
@@ -80,6 +91,7 @@
|
||||
"0x740B": {
|
||||
"group": "joystick",
|
||||
"key": "QK_JOYSTICK_BUTTON_11",
|
||||
"label": "Button 11",
|
||||
"aliases": [
|
||||
"JS_11"
|
||||
]
|
||||
@@ -87,6 +99,7 @@
|
||||
"0x740C": {
|
||||
"group": "joystick",
|
||||
"key": "QK_JOYSTICK_BUTTON_12",
|
||||
"label": "Button 12",
|
||||
"aliases": [
|
||||
"JS_12"
|
||||
]
|
||||
@@ -94,6 +107,7 @@
|
||||
"0x740D": {
|
||||
"group": "joystick",
|
||||
"key": "QK_JOYSTICK_BUTTON_13",
|
||||
"label": "Button 13",
|
||||
"aliases": [
|
||||
"JS_13"
|
||||
]
|
||||
@@ -101,6 +115,7 @@
|
||||
"0x740E": {
|
||||
"group": "joystick",
|
||||
"key": "QK_JOYSTICK_BUTTON_14",
|
||||
"label": "Button 14",
|
||||
"aliases": [
|
||||
"JS_14"
|
||||
]
|
||||
@@ -108,6 +123,7 @@
|
||||
"0x740F": {
|
||||
"group": "joystick",
|
||||
"key": "QK_JOYSTICK_BUTTON_15",
|
||||
"label": "Button 15",
|
||||
"aliases": [
|
||||
"JS_15"
|
||||
]
|
||||
@@ -115,6 +131,7 @@
|
||||
"0x7410": {
|
||||
"group": "joystick",
|
||||
"key": "QK_JOYSTICK_BUTTON_16",
|
||||
"label": "Button 16",
|
||||
"aliases": [
|
||||
"JS_16"
|
||||
]
|
||||
@@ -122,6 +139,7 @@
|
||||
"0x7411": {
|
||||
"group": "joystick",
|
||||
"key": "QK_JOYSTICK_BUTTON_17",
|
||||
"label": "Button 17",
|
||||
"aliases": [
|
||||
"JS_17"
|
||||
]
|
||||
@@ -129,6 +147,7 @@
|
||||
"0x7412": {
|
||||
"group": "joystick",
|
||||
"key": "QK_JOYSTICK_BUTTON_18",
|
||||
"label": "Button 18",
|
||||
"aliases": [
|
||||
"JS_18"
|
||||
]
|
||||
@@ -136,6 +155,7 @@
|
||||
"0x7413": {
|
||||
"group": "joystick",
|
||||
"key": "QK_JOYSTICK_BUTTON_19",
|
||||
"label": "Button 19",
|
||||
"aliases": [
|
||||
"JS_19"
|
||||
]
|
||||
@@ -143,6 +163,7 @@
|
||||
"0x7414": {
|
||||
"group": "joystick",
|
||||
"key": "QK_JOYSTICK_BUTTON_20",
|
||||
"label": "Button 20",
|
||||
"aliases": [
|
||||
"JS_20"
|
||||
]
|
||||
@@ -150,6 +171,7 @@
|
||||
"0x7415": {
|
||||
"group": "joystick",
|
||||
"key": "QK_JOYSTICK_BUTTON_21",
|
||||
"label": "Button 21",
|
||||
"aliases": [
|
||||
"JS_21"
|
||||
]
|
||||
@@ -157,6 +179,7 @@
|
||||
"0x7416": {
|
||||
"group": "joystick",
|
||||
"key": "QK_JOYSTICK_BUTTON_22",
|
||||
"label": "Button 22",
|
||||
"aliases": [
|
||||
"JS_22"
|
||||
]
|
||||
@@ -164,6 +187,7 @@
|
||||
"0x7417": {
|
||||
"group": "joystick",
|
||||
"key": "QK_JOYSTICK_BUTTON_23",
|
||||
"label": "Button 23",
|
||||
"aliases": [
|
||||
"JS_23"
|
||||
]
|
||||
@@ -171,6 +195,7 @@
|
||||
"0x7418": {
|
||||
"group": "joystick",
|
||||
"key": "QK_JOYSTICK_BUTTON_24",
|
||||
"label": "Button 24",
|
||||
"aliases": [
|
||||
"JS_24"
|
||||
]
|
||||
@@ -178,6 +203,7 @@
|
||||
"0x7419": {
|
||||
"group": "joystick",
|
||||
"key": "QK_JOYSTICK_BUTTON_25",
|
||||
"label": "Button 25",
|
||||
"aliases": [
|
||||
"JS_25"
|
||||
]
|
||||
@@ -185,6 +211,7 @@
|
||||
"0x741A": {
|
||||
"group": "joystick",
|
||||
"key": "QK_JOYSTICK_BUTTON_26",
|
||||
"label": "Button 26",
|
||||
"aliases": [
|
||||
"JS_26"
|
||||
]
|
||||
@@ -192,6 +219,7 @@
|
||||
"0x741B": {
|
||||
"group": "joystick",
|
||||
"key": "QK_JOYSTICK_BUTTON_27",
|
||||
"label": "Button 27",
|
||||
"aliases": [
|
||||
"JS_27"
|
||||
]
|
||||
@@ -199,6 +227,7 @@
|
||||
"0x741C": {
|
||||
"group": "joystick",
|
||||
"key": "QK_JOYSTICK_BUTTON_28",
|
||||
"label": "Button 28",
|
||||
"aliases": [
|
||||
"JS_28"
|
||||
]
|
||||
@@ -206,6 +235,7 @@
|
||||
"0x741D": {
|
||||
"group": "joystick",
|
||||
"key": "QK_JOYSTICK_BUTTON_29",
|
||||
"label": "Button 29",
|
||||
"aliases": [
|
||||
"JS_29"
|
||||
]
|
||||
@@ -213,6 +243,7 @@
|
||||
"0x741E": {
|
||||
"group": "joystick",
|
||||
"key": "QK_JOYSTICK_BUTTON_30",
|
||||
"label": "Button 30",
|
||||
"aliases": [
|
||||
"JS_30"
|
||||
]
|
||||
@@ -220,6 +251,7 @@
|
||||
"0x741F": {
|
||||
"group": "joystick",
|
||||
"key": "QK_JOYSTICK_BUTTON_31",
|
||||
"label": "Button 31",
|
||||
"aliases": [
|
||||
"JS_31"
|
||||
]
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
"0x7800": {
|
||||
"group": "backlight",
|
||||
"key": "QK_BACKLIGHT_ON",
|
||||
"label": "Backlight On",
|
||||
"aliases": [
|
||||
"BL_ON"
|
||||
]
|
||||
@@ -10,6 +11,7 @@
|
||||
"0x7801": {
|
||||
"group": "backlight",
|
||||
"key": "QK_BACKLIGHT_OFF",
|
||||
"label": "Backlight Off",
|
||||
"aliases": [
|
||||
"BL_OFF"
|
||||
]
|
||||
@@ -17,6 +19,7 @@
|
||||
"0x7802": {
|
||||
"group": "backlight",
|
||||
"key": "QK_BACKLIGHT_TOGGLE",
|
||||
"label": "Toggle Backlight",
|
||||
"aliases": [
|
||||
"BL_TOGG"
|
||||
]
|
||||
@@ -24,6 +27,7 @@
|
||||
"0x7803": {
|
||||
"group": "backlight",
|
||||
"key": "QK_BACKLIGHT_DOWN",
|
||||
"label": "Backlight Down",
|
||||
"aliases": [
|
||||
"BL_DOWN"
|
||||
]
|
||||
@@ -31,6 +35,7 @@
|
||||
"0x7804": {
|
||||
"group": "backlight",
|
||||
"key": "QK_BACKLIGHT_UP",
|
||||
"label": "Backlight Up",
|
||||
"aliases": [
|
||||
"BL_UP"
|
||||
]
|
||||
@@ -38,6 +43,7 @@
|
||||
"0x7805": {
|
||||
"group": "backlight",
|
||||
"key": "QK_BACKLIGHT_STEP",
|
||||
"label": "Backlight Step",
|
||||
"aliases": [
|
||||
"BL_STEP"
|
||||
]
|
||||
@@ -45,6 +51,7 @@
|
||||
"0x7806": {
|
||||
"group": "backlight",
|
||||
"key": "QK_BACKLIGHT_TOGGLE_BREATHING",
|
||||
"label": "Toggle Breathing",
|
||||
"aliases": [
|
||||
"BL_BRTG"
|
||||
]
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
{
|
||||
"keycodes": {
|
||||
|
||||
"0x7700": {
|
||||
"group": "macro",
|
||||
"key": "QK_MACRO_0",
|
||||
"label": "Macro 0",
|
||||
"aliases": [
|
||||
"MC_0"
|
||||
]
|
||||
@@ -11,6 +11,7 @@
|
||||
"0x7701": {
|
||||
"group": "macro",
|
||||
"key": "QK_MACRO_1",
|
||||
"label": "Macro 1",
|
||||
"aliases": [
|
||||
"MC_1"
|
||||
]
|
||||
@@ -18,6 +19,7 @@
|
||||
"0x7702": {
|
||||
"group": "macro",
|
||||
"key": "QK_MACRO_2",
|
||||
"label": "Macro 2",
|
||||
"aliases": [
|
||||
"MC_2"
|
||||
]
|
||||
@@ -25,6 +27,7 @@
|
||||
"0x7703": {
|
||||
"group": "macro",
|
||||
"key": "QK_MACRO_3",
|
||||
"label": "Macro 3",
|
||||
"aliases": [
|
||||
"MC_3"
|
||||
]
|
||||
@@ -32,6 +35,7 @@
|
||||
"0x7704": {
|
||||
"group": "macro",
|
||||
"key": "QK_MACRO_4",
|
||||
"label": "Macro 4",
|
||||
"aliases": [
|
||||
"MC_4"
|
||||
]
|
||||
@@ -39,6 +43,7 @@
|
||||
"0x7705": {
|
||||
"group": "macro",
|
||||
"key": "QK_MACRO_5",
|
||||
"label": "Macro 5",
|
||||
"aliases": [
|
||||
"MC_5"
|
||||
]
|
||||
@@ -46,6 +51,7 @@
|
||||
"0x7706": {
|
||||
"group": "macro",
|
||||
"key": "QK_MACRO_6",
|
||||
"label": "Macro 6",
|
||||
"aliases": [
|
||||
"MC_6"
|
||||
]
|
||||
@@ -53,6 +59,7 @@
|
||||
"0x7707": {
|
||||
"group": "macro",
|
||||
"key": "QK_MACRO_7",
|
||||
"label": "Macro 7",
|
||||
"aliases": [
|
||||
"MC_7"
|
||||
]
|
||||
@@ -60,6 +67,7 @@
|
||||
"0x7708": {
|
||||
"group": "macro",
|
||||
"key": "QK_MACRO_8",
|
||||
"label": "Macro 8",
|
||||
"aliases": [
|
||||
"MC_8"
|
||||
]
|
||||
@@ -67,6 +75,7 @@
|
||||
"0x7709": {
|
||||
"group": "macro",
|
||||
"key": "QK_MACRO_9",
|
||||
"label": "Macro 9",
|
||||
"aliases": [
|
||||
"MC_9"
|
||||
]
|
||||
@@ -74,6 +83,7 @@
|
||||
"0x770A": {
|
||||
"group": "macro",
|
||||
"key": "QK_MACRO_10",
|
||||
"label": "Macro 10",
|
||||
"aliases": [
|
||||
"MC_10"
|
||||
]
|
||||
@@ -81,6 +91,7 @@
|
||||
"0x770B": {
|
||||
"group": "macro",
|
||||
"key": "QK_MACRO_11",
|
||||
"label": "Macro 11",
|
||||
"aliases": [
|
||||
"MC_11"
|
||||
]
|
||||
@@ -88,6 +99,7 @@
|
||||
"0x770C": {
|
||||
"group": "macro",
|
||||
"key": "QK_MACRO_12",
|
||||
"label": "Macro 12",
|
||||
"aliases": [
|
||||
"MC_12"
|
||||
]
|
||||
@@ -95,6 +107,7 @@
|
||||
"0x770D": {
|
||||
"group": "macro",
|
||||
"key": "QK_MACRO_13",
|
||||
"label": "Macro 13",
|
||||
"aliases": [
|
||||
"MC_13"
|
||||
]
|
||||
@@ -102,6 +115,7 @@
|
||||
"0x770E": {
|
||||
"group": "macro",
|
||||
"key": "QK_MACRO_14",
|
||||
"label": "Macro 14",
|
||||
"aliases": [
|
||||
"MC_14"
|
||||
]
|
||||
@@ -109,6 +123,7 @@
|
||||
"0x770F": {
|
||||
"group": "macro",
|
||||
"key": "QK_MACRO_15",
|
||||
"label": "Macro 15",
|
||||
"aliases": [
|
||||
"MC_15"
|
||||
]
|
||||
@@ -116,6 +131,7 @@
|
||||
"0x7710": {
|
||||
"group": "macro",
|
||||
"key": "QK_MACRO_16",
|
||||
"label": "Macro 16",
|
||||
"aliases": [
|
||||
"MC_16"
|
||||
]
|
||||
@@ -123,6 +139,7 @@
|
||||
"0x7711": {
|
||||
"group": "macro",
|
||||
"key": "QK_MACRO_17",
|
||||
"label": "Macro 17",
|
||||
"aliases": [
|
||||
"MC_17"
|
||||
]
|
||||
@@ -130,6 +147,7 @@
|
||||
"0x7712": {
|
||||
"group": "macro",
|
||||
"key": "QK_MACRO_18",
|
||||
"label": "Macro 18",
|
||||
"aliases": [
|
||||
"MC_18"
|
||||
]
|
||||
@@ -137,6 +155,7 @@
|
||||
"0x7713": {
|
||||
"group": "macro",
|
||||
"key": "QK_MACRO_19",
|
||||
"label": "Macro 19",
|
||||
"aliases": [
|
||||
"MC_19"
|
||||
]
|
||||
@@ -144,6 +163,7 @@
|
||||
"0x7714": {
|
||||
"group": "macro",
|
||||
"key": "QK_MACRO_20",
|
||||
"label": "Macro 20",
|
||||
"aliases": [
|
||||
"MC_20"
|
||||
]
|
||||
@@ -151,6 +171,7 @@
|
||||
"0x7715": {
|
||||
"group": "macro",
|
||||
"key": "QK_MACRO_21",
|
||||
"label": "Macro 21",
|
||||
"aliases": [
|
||||
"MC_21"
|
||||
]
|
||||
@@ -158,6 +179,7 @@
|
||||
"0x7716": {
|
||||
"group": "macro",
|
||||
"key": "QK_MACRO_22",
|
||||
"label": "Macro 22",
|
||||
"aliases": [
|
||||
"MC_22"
|
||||
]
|
||||
@@ -165,6 +187,7 @@
|
||||
"0x7717": {
|
||||
"group": "macro",
|
||||
"key": "QK_MACRO_23",
|
||||
"label": "Macro 23",
|
||||
"aliases": [
|
||||
"MC_23"
|
||||
]
|
||||
@@ -172,6 +195,7 @@
|
||||
"0x7718": {
|
||||
"group": "macro",
|
||||
"key": "QK_MACRO_24",
|
||||
"label": "Macro 24",
|
||||
"aliases": [
|
||||
"MC_24"
|
||||
]
|
||||
@@ -179,6 +203,7 @@
|
||||
"0x7719": {
|
||||
"group": "macro",
|
||||
"key": "QK_MACRO_25",
|
||||
"label": "Macro 25",
|
||||
"aliases": [
|
||||
"MC_25"
|
||||
]
|
||||
@@ -186,6 +211,7 @@
|
||||
"0x771A": {
|
||||
"group": "macro",
|
||||
"key": "QK_MACRO_26",
|
||||
"label": "Macro 26",
|
||||
"aliases": [
|
||||
"MC_26"
|
||||
]
|
||||
@@ -193,6 +219,7 @@
|
||||
"0x771B": {
|
||||
"group": "macro",
|
||||
"key": "QK_MACRO_27",
|
||||
"label": "Macro 27",
|
||||
"aliases": [
|
||||
"MC_27"
|
||||
]
|
||||
@@ -200,6 +227,7 @@
|
||||
"0x771C": {
|
||||
"group": "macro",
|
||||
"key": "QK_MACRO_28",
|
||||
"label": "Macro 28",
|
||||
"aliases": [
|
||||
"MC_28"
|
||||
]
|
||||
@@ -207,6 +235,7 @@
|
||||
"0x771D": {
|
||||
"group": "macro",
|
||||
"key": "QK_MACRO_29",
|
||||
"label": "Macro 29",
|
||||
"aliases": [
|
||||
"MC_29"
|
||||
]
|
||||
@@ -214,6 +243,7 @@
|
||||
"0x771E": {
|
||||
"group": "macro",
|
||||
"key": "QK_MACRO_30",
|
||||
"label": "Macro 30",
|
||||
"aliases": [
|
||||
"MC_30"
|
||||
]
|
||||
@@ -221,6 +251,7 @@
|
||||
"0x771F": {
|
||||
"group": "macro",
|
||||
"key": "QK_MACRO_31",
|
||||
"label": "Macro 31",
|
||||
"aliases": [
|
||||
"MC_31"
|
||||
]
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
"0x7440": {
|
||||
"group": "programmable_button",
|
||||
"key": "QK_PROGRAMMABLE_BUTTON_1",
|
||||
"label": "Button 1",
|
||||
"aliases": [
|
||||
"PB_1"
|
||||
]
|
||||
@@ -10,6 +11,7 @@
|
||||
"0x7441": {
|
||||
"group": "programmable_button",
|
||||
"key": "QK_PROGRAMMABLE_BUTTON_2",
|
||||
"label": "Button 2",
|
||||
"aliases": [
|
||||
"PB_2"
|
||||
]
|
||||
@@ -17,6 +19,7 @@
|
||||
"0x7442": {
|
||||
"group": "programmable_button",
|
||||
"key": "QK_PROGRAMMABLE_BUTTON_3",
|
||||
"label": "Button 3",
|
||||
"aliases": [
|
||||
"PB_3"
|
||||
]
|
||||
@@ -24,6 +27,7 @@
|
||||
"0x7443": {
|
||||
"group": "programmable_button",
|
||||
"key": "QK_PROGRAMMABLE_BUTTON_4",
|
||||
"label": "Button 4",
|
||||
"aliases": [
|
||||
"PB_4"
|
||||
]
|
||||
@@ -31,6 +35,7 @@
|
||||
"0x7444": {
|
||||
"group": "programmable_button",
|
||||
"key": "QK_PROGRAMMABLE_BUTTON_5",
|
||||
"label": "Button 5",
|
||||
"aliases": [
|
||||
"PB_5"
|
||||
]
|
||||
@@ -38,6 +43,7 @@
|
||||
"0x7445": {
|
||||
"group": "programmable_button",
|
||||
"key": "QK_PROGRAMMABLE_BUTTON_6",
|
||||
"label": "Button 6",
|
||||
"aliases": [
|
||||
"PB_6"
|
||||
]
|
||||
@@ -45,6 +51,7 @@
|
||||
"0x7446": {
|
||||
"group": "programmable_button",
|
||||
"key": "QK_PROGRAMMABLE_BUTTON_7",
|
||||
"label": "Button 7",
|
||||
"aliases": [
|
||||
"PB_7"
|
||||
]
|
||||
@@ -52,6 +59,7 @@
|
||||
"0x7447": {
|
||||
"group": "programmable_button",
|
||||
"key": "QK_PROGRAMMABLE_BUTTON_8",
|
||||
"label": "Button 8",
|
||||
"aliases": [
|
||||
"PB_8"
|
||||
]
|
||||
@@ -59,6 +67,7 @@
|
||||
"0x7448": {
|
||||
"group": "programmable_button",
|
||||
"key": "QK_PROGRAMMABLE_BUTTON_9",
|
||||
"label": "Button 9",
|
||||
"aliases": [
|
||||
"PB_9"
|
||||
]
|
||||
@@ -66,6 +75,7 @@
|
||||
"0x7449": {
|
||||
"group": "programmable_button",
|
||||
"key": "QK_PROGRAMMABLE_BUTTON_10",
|
||||
"label": "Button 10",
|
||||
"aliases": [
|
||||
"PB_10"
|
||||
]
|
||||
@@ -73,6 +83,7 @@
|
||||
"0x744A": {
|
||||
"group": "programmable_button",
|
||||
"key": "QK_PROGRAMMABLE_BUTTON_11",
|
||||
"label": "Button 11",
|
||||
"aliases": [
|
||||
"PB_11"
|
||||
]
|
||||
@@ -80,6 +91,7 @@
|
||||
"0x744B": {
|
||||
"group": "programmable_button",
|
||||
"key": "QK_PROGRAMMABLE_BUTTON_12",
|
||||
"label": "Button 12",
|
||||
"aliases": [
|
||||
"PB_12"
|
||||
]
|
||||
@@ -87,6 +99,7 @@
|
||||
"0x744C": {
|
||||
"group": "programmable_button",
|
||||
"key": "QK_PROGRAMMABLE_BUTTON_13",
|
||||
"label": "Button 13",
|
||||
"aliases": [
|
||||
"PB_13"
|
||||
]
|
||||
@@ -94,6 +107,7 @@
|
||||
"0x744D": {
|
||||
"group": "programmable_button",
|
||||
"key": "QK_PROGRAMMABLE_BUTTON_14",
|
||||
"label": "Button 14",
|
||||
"aliases": [
|
||||
"PB_14"
|
||||
]
|
||||
@@ -101,6 +115,7 @@
|
||||
"0x744E": {
|
||||
"group": "programmable_button",
|
||||
"key": "QK_PROGRAMMABLE_BUTTON_15",
|
||||
"label": "Button 15",
|
||||
"aliases": [
|
||||
"PB_15"
|
||||
]
|
||||
@@ -108,6 +123,7 @@
|
||||
"0x744F": {
|
||||
"group": "programmable_button",
|
||||
"key": "QK_PROGRAMMABLE_BUTTON_16",
|
||||
"label": "Button 16",
|
||||
"aliases": [
|
||||
"PB_16"
|
||||
]
|
||||
@@ -115,6 +131,7 @@
|
||||
"0x7450": {
|
||||
"group": "programmable_button",
|
||||
"key": "QK_PROGRAMMABLE_BUTTON_17",
|
||||
"label": "Button 17",
|
||||
"aliases": [
|
||||
"PB_17"
|
||||
]
|
||||
@@ -122,6 +139,7 @@
|
||||
"0x7451": {
|
||||
"group": "programmable_button",
|
||||
"key": "QK_PROGRAMMABLE_BUTTON_18",
|
||||
"label": "Button 18",
|
||||
"aliases": [
|
||||
"PB_18"
|
||||
]
|
||||
@@ -129,6 +147,7 @@
|
||||
"0x7452": {
|
||||
"group": "programmable_button",
|
||||
"key": "QK_PROGRAMMABLE_BUTTON_19",
|
||||
"label": "Button 19",
|
||||
"aliases": [
|
||||
"PB_19"
|
||||
]
|
||||
@@ -136,6 +155,7 @@
|
||||
"0x7453": {
|
||||
"group": "programmable_button",
|
||||
"key": "QK_PROGRAMMABLE_BUTTON_20",
|
||||
"label": "Button 20",
|
||||
"aliases": [
|
||||
"PB_20"
|
||||
]
|
||||
@@ -143,6 +163,7 @@
|
||||
"0x7454": {
|
||||
"group": "programmable_button",
|
||||
"key": "QK_PROGRAMMABLE_BUTTON_21",
|
||||
"label": "Button 21",
|
||||
"aliases": [
|
||||
"PB_21"
|
||||
]
|
||||
@@ -150,6 +171,7 @@
|
||||
"0x7455": {
|
||||
"group": "programmable_button",
|
||||
"key": "QK_PROGRAMMABLE_BUTTON_22",
|
||||
"label": "Button 22",
|
||||
"aliases": [
|
||||
"PB_22"
|
||||
]
|
||||
@@ -157,6 +179,7 @@
|
||||
"0x7456": {
|
||||
"group": "programmable_button",
|
||||
"key": "QK_PROGRAMMABLE_BUTTON_23",
|
||||
"label": "Button 23",
|
||||
"aliases": [
|
||||
"PB_23"
|
||||
]
|
||||
@@ -164,6 +187,7 @@
|
||||
"0x7457": {
|
||||
"group": "programmable_button",
|
||||
"key": "QK_PROGRAMMABLE_BUTTON_24",
|
||||
"label": "Button 24",
|
||||
"aliases": [
|
||||
"PB_24"
|
||||
]
|
||||
@@ -171,6 +195,7 @@
|
||||
"0x7458": {
|
||||
"group": "programmable_button",
|
||||
"key": "QK_PROGRAMMABLE_BUTTON_25",
|
||||
"label": "Button 25",
|
||||
"aliases": [
|
||||
"PB_25"
|
||||
]
|
||||
@@ -178,6 +203,7 @@
|
||||
"0x7459": {
|
||||
"group": "programmable_button",
|
||||
"key": "QK_PROGRAMMABLE_BUTTON_26",
|
||||
"label": "Button 26",
|
||||
"aliases": [
|
||||
"PB_26"
|
||||
]
|
||||
@@ -185,6 +211,7 @@
|
||||
"0x745A": {
|
||||
"group": "programmable_button",
|
||||
"key": "QK_PROGRAMMABLE_BUTTON_27",
|
||||
"label": "Button 27",
|
||||
"aliases": [
|
||||
"PB_27"
|
||||
]
|
||||
@@ -192,6 +219,7 @@
|
||||
"0x745B": {
|
||||
"group": "programmable_button",
|
||||
"key": "QK_PROGRAMMABLE_BUTTON_28",
|
||||
"label": "Button 28",
|
||||
"aliases": [
|
||||
"PB_28"
|
||||
]
|
||||
@@ -199,6 +227,7 @@
|
||||
"0x745C": {
|
||||
"group": "programmable_button",
|
||||
"key": "QK_PROGRAMMABLE_BUTTON_29",
|
||||
"label": "Button 29",
|
||||
"aliases": [
|
||||
"PB_29"
|
||||
]
|
||||
@@ -206,6 +235,7 @@
|
||||
"0x745D": {
|
||||
"group": "programmable_button",
|
||||
"key": "QK_PROGRAMMABLE_BUTTON_30",
|
||||
"label": "Button 30",
|
||||
"aliases": [
|
||||
"PB_30"
|
||||
]
|
||||
@@ -213,6 +243,7 @@
|
||||
"0x745E": {
|
||||
"group": "programmable_button",
|
||||
"key": "QK_PROGRAMMABLE_BUTTON_31",
|
||||
"label": "Button 31",
|
||||
"aliases": [
|
||||
"PB_31"
|
||||
]
|
||||
@@ -220,6 +251,7 @@
|
||||
"0x745F": {
|
||||
"group": "programmable_button",
|
||||
"key": "QK_PROGRAMMABLE_BUTTON_32",
|
||||
"label": "Button 32",
|
||||
"aliases": [
|
||||
"PB_32"
|
||||
]
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
"0x7C00": {
|
||||
"group": "quantum",
|
||||
"key": "QK_BOOTLOADER",
|
||||
"label": "Bootloader",
|
||||
"aliases": [
|
||||
"QK_BOOT"
|
||||
]
|
||||
@@ -10,6 +11,7 @@
|
||||
"0x7C01": {
|
||||
"group": "quantum",
|
||||
"key": "QK_REBOOT",
|
||||
"label": "Reboot",
|
||||
"aliases": [
|
||||
"QK_RBT"
|
||||
]
|
||||
@@ -17,6 +19,7 @@
|
||||
"0x7C02": {
|
||||
"group": "quantum",
|
||||
"key": "QK_DEBUG_TOGGLE",
|
||||
"label": "Toggle Debug",
|
||||
"aliases": [
|
||||
"DB_TOGG"
|
||||
]
|
||||
@@ -24,18 +27,21 @@
|
||||
"0x7C03": {
|
||||
"group": "quantum",
|
||||
"key": "QK_CLEAR_EEPROM",
|
||||
"label": "Clear EEPROM",
|
||||
"aliases": [
|
||||
"EE_CLR"
|
||||
]
|
||||
},
|
||||
"0x7C04": {
|
||||
"group": "quantum",
|
||||
"key": "QK_MAKE"
|
||||
"key": "QK_MAKE",
|
||||
"label": "Make"
|
||||
},
|
||||
|
||||
"0x7C10": {
|
||||
"group": "quantum",
|
||||
"key": "QK_AUTO_SHIFT_DOWN",
|
||||
"label": "Auto Shift Down",
|
||||
"aliases": [
|
||||
"AS_DOWN"
|
||||
]
|
||||
@@ -43,6 +49,7 @@
|
||||
"0x7C11": {
|
||||
"group": "quantum",
|
||||
"key": "QK_AUTO_SHIFT_UP",
|
||||
"label": "Auto Shift Up",
|
||||
"aliases": [
|
||||
"AS_UP"
|
||||
]
|
||||
@@ -50,6 +57,7 @@
|
||||
"0x7C12": {
|
||||
"group": "quantum",
|
||||
"key": "QK_AUTO_SHIFT_REPORT",
|
||||
"label": "Auto Shift Report",
|
||||
"aliases": [
|
||||
"AS_RPT"
|
||||
]
|
||||
@@ -57,6 +65,7 @@
|
||||
"0x7C13": {
|
||||
"group": "quantum",
|
||||
"key": "QK_AUTO_SHIFT_ON",
|
||||
"label": "Auto Shift On",
|
||||
"aliases": [
|
||||
"AS_ON"
|
||||
]
|
||||
@@ -64,6 +73,7 @@
|
||||
"0x7C14": {
|
||||
"group": "quantum",
|
||||
"key": "QK_AUTO_SHIFT_OFF",
|
||||
"label": "Auto Shift Off",
|
||||
"aliases": [
|
||||
"AS_OFF"
|
||||
]
|
||||
@@ -71,6 +81,7 @@
|
||||
"0x7C15": {
|
||||
"group": "quantum",
|
||||
"key": "QK_AUTO_SHIFT_TOGGLE",
|
||||
"label": "Toggle Auto Shift",
|
||||
"aliases": [
|
||||
"AS_TOGG"
|
||||
]
|
||||
@@ -79,6 +90,7 @@
|
||||
"0x7C16": {
|
||||
"group": "quantum",
|
||||
"key": "QK_GRAVE_ESCAPE",
|
||||
"label": "Grave Esc",
|
||||
"aliases": [
|
||||
"QK_GESC"
|
||||
]
|
||||
@@ -95,6 +107,7 @@
|
||||
"0x7C18": {
|
||||
"group": "quantum",
|
||||
"key": "QK_SPACE_CADET_LEFT_CTRL_PARENTHESIS_OPEN",
|
||||
"label": "LCtl/(",
|
||||
"aliases": [
|
||||
"SC_LCPO"
|
||||
]
|
||||
@@ -102,6 +115,7 @@
|
||||
"0x7C19": {
|
||||
"group": "quantum",
|
||||
"key": "QK_SPACE_CADET_RIGHT_CTRL_PARENTHESIS_CLOSE",
|
||||
"label": "RCtl/)",
|
||||
"aliases": [
|
||||
"SC_RCPC"
|
||||
]
|
||||
@@ -109,6 +123,7 @@
|
||||
"0x7C1A": {
|
||||
"group": "quantum",
|
||||
"key": "QK_SPACE_CADET_LEFT_SHIFT_PARENTHESIS_OPEN",
|
||||
"label": "LSft/)",
|
||||
"aliases": [
|
||||
"SC_LSPO"
|
||||
]
|
||||
@@ -116,6 +131,7 @@
|
||||
"0x7C1B": {
|
||||
"group": "quantum",
|
||||
"key": "QK_SPACE_CADET_RIGHT_SHIFT_PARENTHESIS_CLOSE",
|
||||
"label": "RSft/)",
|
||||
"aliases": [
|
||||
"SC_RSPC"
|
||||
]
|
||||
@@ -123,6 +139,7 @@
|
||||
"0x7C1C": {
|
||||
"group": "quantum",
|
||||
"key": "QK_SPACE_CADET_LEFT_ALT_PARENTHESIS_OPEN",
|
||||
"label": "LAlt/(",
|
||||
"aliases": [
|
||||
"SC_LAPO"
|
||||
]
|
||||
@@ -130,6 +147,7 @@
|
||||
"0x7C1D": {
|
||||
"group": "quantum",
|
||||
"key": "QK_SPACE_CADET_RIGHT_ALT_PARENTHESIS_CLOSE",
|
||||
"label": "RAlt/)",
|
||||
"aliases": [
|
||||
"SC_RAPC"
|
||||
]
|
||||
@@ -137,6 +155,7 @@
|
||||
"0x7C1E": {
|
||||
"group": "quantum",
|
||||
"key": "QK_SPACE_CADET_RIGHT_SHIFT_ENTER",
|
||||
"label": "RSft/Ent",
|
||||
"aliases": [
|
||||
"SC_SENT"
|
||||
]
|
||||
@@ -167,6 +186,7 @@
|
||||
"0x7C30": {
|
||||
"group": "quantum",
|
||||
"key": "QK_UNICODE_MODE_NEXT",
|
||||
"label": "Unicode Mode Next",
|
||||
"aliases": [
|
||||
"UC_NEXT"
|
||||
]
|
||||
@@ -174,6 +194,7 @@
|
||||
"0x7C31": {
|
||||
"group": "quantum",
|
||||
"key": "QK_UNICODE_MODE_PREVIOUS",
|
||||
"label": "Unicode Mode Previous",
|
||||
"aliases": [
|
||||
"UC_PREV"
|
||||
]
|
||||
@@ -181,6 +202,7 @@
|
||||
"0x7C32": {
|
||||
"group": "quantum",
|
||||
"key": "QK_UNICODE_MODE_MACOS",
|
||||
"label": "Unicode Mode macOS",
|
||||
"aliases": [
|
||||
"UC_MAC"
|
||||
]
|
||||
@@ -188,6 +210,7 @@
|
||||
"0x7C33": {
|
||||
"group": "quantum",
|
||||
"key": "QK_UNICODE_MODE_LINUX",
|
||||
"label": "Unicode Mode Linux",
|
||||
"aliases": [
|
||||
"UC_LINX"
|
||||
]
|
||||
@@ -195,6 +218,7 @@
|
||||
"0x7C34": {
|
||||
"group": "quantum",
|
||||
"key": "QK_UNICODE_MODE_WINDOWS",
|
||||
"label": "Unicode Mode Windows",
|
||||
"aliases": [
|
||||
"UC_WIN"
|
||||
]
|
||||
@@ -202,6 +226,7 @@
|
||||
"0x7C35": {
|
||||
"group": "quantum",
|
||||
"key": "QK_UNICODE_MODE_BSD",
|
||||
"label": "Unicode Mode BSD",
|
||||
"aliases": [
|
||||
"UC_BSD"
|
||||
]
|
||||
@@ -209,6 +234,7 @@
|
||||
"0x7C36": {
|
||||
"group": "quantum",
|
||||
"key": "QK_UNICODE_MODE_WINCOMPOSE",
|
||||
"label": "Unicode Mode WinCompose",
|
||||
"aliases": [
|
||||
"UC_WINC"
|
||||
]
|
||||
@@ -216,6 +242,7 @@
|
||||
"0x7C37": {
|
||||
"group": "quantum",
|
||||
"key": "QK_UNICODE_MODE_EMACS",
|
||||
"label": "Unicode Mode emacs",
|
||||
"aliases": [
|
||||
"UC_EMAC"
|
||||
]
|
||||
@@ -224,6 +251,7 @@
|
||||
"0x7C40": {
|
||||
"group": "quantum",
|
||||
"key": "QK_HAPTIC_ON",
|
||||
"label": "Haptic On",
|
||||
"aliases": [
|
||||
"HF_ON"
|
||||
]
|
||||
@@ -231,6 +259,7 @@
|
||||
"0x7C41": {
|
||||
"group": "quantum",
|
||||
"key": "QK_HAPTIC_OFF",
|
||||
"label": "Haptic Off",
|
||||
"aliases": [
|
||||
"HF_OFF"
|
||||
]
|
||||
@@ -238,6 +267,7 @@
|
||||
"0x7C42": {
|
||||
"group": "quantum",
|
||||
"key": "QK_HAPTIC_TOGGLE",
|
||||
"label": "Toggle Haptic",
|
||||
"aliases": [
|
||||
"HF_TOGG"
|
||||
]
|
||||
@@ -245,6 +275,7 @@
|
||||
"0x7C43": {
|
||||
"group": "quantum",
|
||||
"key": "QK_HAPTIC_RESET",
|
||||
"label": "Haptic Reset",
|
||||
"aliases": [
|
||||
"HF_RST"
|
||||
]
|
||||
@@ -252,6 +283,7 @@
|
||||
"0x7C44": {
|
||||
"group": "quantum",
|
||||
"key": "QK_HAPTIC_FEEDBACK_TOGGLE",
|
||||
"label": "Toggle Haptic Feedback",
|
||||
"aliases": [
|
||||
"HF_FDBK"
|
||||
]
|
||||
@@ -259,6 +291,7 @@
|
||||
"0x7C45": {
|
||||
"group": "quantum",
|
||||
"key": "QK_HAPTIC_BUZZ_TOGGLE",
|
||||
"label": "Toggle Haptic Buzz",
|
||||
"aliases": [
|
||||
"HF_BUZZ"
|
||||
]
|
||||
@@ -266,6 +299,7 @@
|
||||
"0x7C46": {
|
||||
"group": "quantum",
|
||||
"key": "QK_HAPTIC_MODE_NEXT",
|
||||
"label": "Haptic Mode Next",
|
||||
"aliases": [
|
||||
"HF_NEXT"
|
||||
]
|
||||
@@ -273,6 +307,7 @@
|
||||
"0x7C47": {
|
||||
"group": "quantum",
|
||||
"key": "QK_HAPTIC_MODE_PREVIOUS",
|
||||
"label": "Haptic Mode Previous",
|
||||
"aliases": [
|
||||
"HF_PREV"
|
||||
]
|
||||
@@ -280,6 +315,7 @@
|
||||
"0x7C48": {
|
||||
"group": "quantum",
|
||||
"key": "QK_HAPTIC_CONTINUOUS_TOGGLE",
|
||||
"label": "Toggle Haptic Continuous",
|
||||
"aliases": [
|
||||
"HF_CONT"
|
||||
]
|
||||
@@ -287,6 +323,7 @@
|
||||
"0x7C49": {
|
||||
"group": "quantum",
|
||||
"key": "QK_HAPTIC_CONTINUOUS_UP",
|
||||
"label": "Haptic Continuous Up",
|
||||
"aliases": [
|
||||
"HF_CONU"
|
||||
]
|
||||
@@ -294,6 +331,7 @@
|
||||
"0x7C4A": {
|
||||
"group": "quantum",
|
||||
"key": "QK_HAPTIC_CONTINUOUS_DOWN",
|
||||
"label": "Haptic Continuous Down",
|
||||
"aliases": [
|
||||
"HF_COND"
|
||||
]
|
||||
@@ -301,6 +339,7 @@
|
||||
"0x7C4B": {
|
||||
"group": "quantum",
|
||||
"key": "QK_HAPTIC_DWELL_UP",
|
||||
"label": "Haptic Dwell Up",
|
||||
"aliases": [
|
||||
"HF_DWLU"
|
||||
]
|
||||
@@ -308,6 +347,7 @@
|
||||
"0x7C4C": {
|
||||
"group": "quantum",
|
||||
"key": "QK_HAPTIC_DWELL_DOWN",
|
||||
"label": "Haptic Dwell Down",
|
||||
"aliases": [
|
||||
"HF_DWLD"
|
||||
]
|
||||
@@ -316,6 +356,7 @@
|
||||
"0x7C50": {
|
||||
"group": "quantum",
|
||||
"key": "QK_COMBO_ON",
|
||||
"label": "Combo On",
|
||||
"aliases": [
|
||||
"CM_ON"
|
||||
]
|
||||
@@ -323,6 +364,7 @@
|
||||
"0x7C51": {
|
||||
"group": "quantum",
|
||||
"key": "QK_COMBO_OFF",
|
||||
"label": "Combo Off",
|
||||
"aliases": [
|
||||
"CM_OFF"
|
||||
]
|
||||
@@ -330,6 +372,7 @@
|
||||
"0x7C52": {
|
||||
"group": "quantum",
|
||||
"key": "QK_COMBO_TOGGLE",
|
||||
"label": "Toggle Combo",
|
||||
"aliases": [
|
||||
"CM_TOGG"
|
||||
]
|
||||
@@ -338,6 +381,7 @@
|
||||
"0x7C53": {
|
||||
"group": "quantum",
|
||||
"key": "QK_DYNAMIC_MACRO_RECORD_START_1",
|
||||
"label": "Dynamic Macro Record 1",
|
||||
"aliases": [
|
||||
"DM_REC1"
|
||||
]
|
||||
@@ -345,6 +389,7 @@
|
||||
"0x7C54": {
|
||||
"group": "quantum",
|
||||
"key": "QK_DYNAMIC_MACRO_RECORD_START_2",
|
||||
"label": "Dynamic Macro Record 2",
|
||||
"aliases": [
|
||||
"DM_REC2"
|
||||
]
|
||||
@@ -352,6 +397,7 @@
|
||||
"0x7C55": {
|
||||
"group": "quantum",
|
||||
"key": "QK_DYNAMIC_MACRO_RECORD_STOP",
|
||||
"label": "Dynamic Macro Stop Recording",
|
||||
"aliases": [
|
||||
"DM_RSTP"
|
||||
]
|
||||
@@ -359,6 +405,7 @@
|
||||
"0x7C56": {
|
||||
"group": "quantum",
|
||||
"key": "QK_DYNAMIC_MACRO_PLAY_1",
|
||||
"label": "Dynamic Macro Play 1",
|
||||
"aliases": [
|
||||
"DM_PLY1"
|
||||
]
|
||||
@@ -366,6 +413,7 @@
|
||||
"0x7C57": {
|
||||
"group": "quantum",
|
||||
"key": "QK_DYNAMIC_MACRO_PLAY_2",
|
||||
"label": "Dynamic Macro Play 2",
|
||||
"aliases": [
|
||||
"DM_PLY2"
|
||||
]
|
||||
@@ -374,6 +422,7 @@
|
||||
"0x7C58": {
|
||||
"group": "quantum",
|
||||
"key": "QK_LEADER",
|
||||
"label": "Leader",
|
||||
"aliases": [
|
||||
"QK_LEAD"
|
||||
]
|
||||
@@ -381,12 +430,14 @@
|
||||
|
||||
"0x7C59": {
|
||||
"group": "quantum",
|
||||
"key": "QK_LOCK"
|
||||
"key": "QK_LOCK",
|
||||
"label": "Lock"
|
||||
},
|
||||
|
||||
"0x7C5A": {
|
||||
"group": "quantum",
|
||||
"key": "QK_ONE_SHOT_ON",
|
||||
"label": "One Shot On",
|
||||
"aliases": [
|
||||
"OS_ON"
|
||||
]
|
||||
@@ -394,6 +445,7 @@
|
||||
"0x7C5B": {
|
||||
"group": "quantum",
|
||||
"key": "QK_ONE_SHOT_OFF",
|
||||
"label": "One Shot Off",
|
||||
"aliases": [
|
||||
"OS_OFF"
|
||||
]
|
||||
@@ -401,6 +453,7 @@
|
||||
"0x7C5C": {
|
||||
"group": "quantum",
|
||||
"key": "QK_ONE_SHOT_TOGGLE",
|
||||
"label": "Toggle One Shot",
|
||||
"aliases": [
|
||||
"OS_TOGG"
|
||||
]
|
||||
@@ -409,6 +462,7 @@
|
||||
"0x7C5D": {
|
||||
"group": "quantum",
|
||||
"key": "QK_KEY_OVERRIDE_TOGGLE",
|
||||
"label": "Toggle Key Overrides",
|
||||
"aliases": [
|
||||
"KO_TOGG"
|
||||
]
|
||||
@@ -416,6 +470,7 @@
|
||||
"0x7C5E": {
|
||||
"group": "quantum",
|
||||
"key": "QK_KEY_OVERRIDE_ON",
|
||||
"label": "Key Overrides On",
|
||||
"aliases": [
|
||||
"KO_ON"
|
||||
]
|
||||
@@ -423,6 +478,7 @@
|
||||
"0x7C5F": {
|
||||
"group": "quantum",
|
||||
"key": "QK_KEY_OVERRIDE_OFF",
|
||||
"label": "Key Overrides Off",
|
||||
"aliases": [
|
||||
"KO_OFF"
|
||||
]
|
||||
@@ -431,6 +487,7 @@
|
||||
"0x7C60": {
|
||||
"group": "quantum",
|
||||
"key": "QK_SECURE_LOCK",
|
||||
"label": "Lock",
|
||||
"aliases": [
|
||||
"SE_LOCK"
|
||||
]
|
||||
@@ -438,6 +495,7 @@
|
||||
"0x7C61": {
|
||||
"group": "quantum",
|
||||
"key": "QK_SECURE_UNLOCK",
|
||||
"label": "Unlock",
|
||||
"aliases": [
|
||||
"SE_UNLK"
|
||||
]
|
||||
@@ -445,6 +503,7 @@
|
||||
"0x7C62": {
|
||||
"group": "quantum",
|
||||
"key": "QK_SECURE_TOGGLE",
|
||||
"label": "Toggle Lock",
|
||||
"aliases": [
|
||||
"SE_TOGG"
|
||||
]
|
||||
@@ -452,6 +511,7 @@
|
||||
"0x7C63": {
|
||||
"group": "quantum",
|
||||
"key": "QK_SECURE_REQUEST",
|
||||
"label": "Request Unlock",
|
||||
"aliases": [
|
||||
"SE_REQ"
|
||||
]
|
||||
@@ -460,6 +520,7 @@
|
||||
"0x7C70": {
|
||||
"group": "quantum",
|
||||
"key": "QK_DYNAMIC_TAPPING_TERM_PRINT",
|
||||
"label": "Print Dynamic Tapping Term",
|
||||
"aliases": [
|
||||
"DT_PRNT"
|
||||
]
|
||||
@@ -467,6 +528,7 @@
|
||||
"0x7C71": {
|
||||
"group": "quantum",
|
||||
"key": "QK_DYNAMIC_TAPPING_TERM_UP",
|
||||
"label": "Dynamic Tapping Term Up",
|
||||
"aliases": [
|
||||
"DT_UP"
|
||||
]
|
||||
@@ -474,6 +536,7 @@
|
||||
"0x7C72": {
|
||||
"group": "quantum",
|
||||
"key": "QK_DYNAMIC_TAPPING_TERM_DOWN",
|
||||
"label": "Dynamic Tapping Term Down",
|
||||
"aliases": [
|
||||
"DT_DOWN"
|
||||
]
|
||||
@@ -482,6 +545,7 @@
|
||||
"0x7C73": {
|
||||
"group": "quantum",
|
||||
"key": "QK_CAPS_WORD_TOGGLE",
|
||||
"label": "Toggle Caps Word",
|
||||
"aliases": [
|
||||
"CW_TOGG"
|
||||
]
|
||||
@@ -490,6 +554,7 @@
|
||||
"0x7C74": {
|
||||
"group": "quantum",
|
||||
"key": "QK_AUTOCORRECT_ON",
|
||||
"label": "Autocorrect On",
|
||||
"aliases": [
|
||||
"AC_ON"
|
||||
]
|
||||
@@ -497,6 +562,7 @@
|
||||
"0x7C75": {
|
||||
"group": "quantum",
|
||||
"key": "QK_AUTOCORRECT_OFF",
|
||||
"label": "Autocorrect Off",
|
||||
"aliases": [
|
||||
"AC_OFF"
|
||||
]
|
||||
@@ -504,6 +570,7 @@
|
||||
"0x7C76": {
|
||||
"group": "quantum",
|
||||
"key": "QK_AUTOCORRECT_TOGGLE",
|
||||
"label": "Toggle Autocorrect",
|
||||
"aliases": [
|
||||
"AC_TOGG"
|
||||
]
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"0x00C1": {
|
||||
"group": "media",
|
||||
"key": "KC_MISSION_CONTROL",
|
||||
"label": "Open Mission Control",
|
||||
"label": "Mission Control",
|
||||
"aliases": [
|
||||
"KC_MCTL"
|
||||
]
|
||||
@@ -11,7 +11,7 @@
|
||||
"0x00C2": {
|
||||
"group": "media",
|
||||
"key": "KC_LAUNCHPAD",
|
||||
"label": "Open Launchpad",
|
||||
"label": "Launchpad",
|
||||
"aliases": [
|
||||
"KC_LPAD"
|
||||
]
|
||||
|
||||
@@ -2,131 +2,163 @@
|
||||
"keycodes": {
|
||||
"0x7E00": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_0"
|
||||
"key": "QK_KB_0",
|
||||
"label": "Keyboard 0"
|
||||
},
|
||||
"0x7E01": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_1"
|
||||
"key": "QK_KB_1",
|
||||
"label": "Keyboard 1"
|
||||
},
|
||||
"0x7E02": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_2"
|
||||
"key": "QK_KB_2",
|
||||
"label": "Keyboard 2"
|
||||
},
|
||||
"0x7E03": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_3"
|
||||
"key": "QK_KB_3",
|
||||
"label": "Keyboard 3"
|
||||
},
|
||||
"0x7E04": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_4"
|
||||
"key": "QK_KB_4",
|
||||
"label": "Keyboard 4"
|
||||
},
|
||||
"0x7E05": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_5"
|
||||
"key": "QK_KB_5",
|
||||
"label": "Keyboard 5"
|
||||
},
|
||||
"0x7E06": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_6"
|
||||
"key": "QK_KB_6",
|
||||
"label": "Keyboard 6"
|
||||
},
|
||||
"0x7E07": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_7"
|
||||
"key": "QK_KB_7",
|
||||
"label": "Keyboard 7"
|
||||
},
|
||||
"0x7E08": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_8"
|
||||
"key": "QK_KB_8",
|
||||
"label": "Keyboard 8"
|
||||
},
|
||||
"0x7E09": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_9"
|
||||
"key": "QK_KB_9",
|
||||
"label": "Keyboard 9"
|
||||
},
|
||||
"0x7E0A": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_10"
|
||||
"key": "QK_KB_10",
|
||||
"label": "Keyboard 10"
|
||||
},
|
||||
"0x7E0B": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_11"
|
||||
"key": "QK_KB_11",
|
||||
"label": "Keyboard 11"
|
||||
},
|
||||
"0x7E0C": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_12"
|
||||
"key": "QK_KB_12",
|
||||
"label": "Keyboard 12"
|
||||
},
|
||||
"0x7E0D": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_13"
|
||||
"key": "QK_KB_13",
|
||||
"label": "Keyboard 13"
|
||||
},
|
||||
"0x7E0E": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_14"
|
||||
"key": "QK_KB_14",
|
||||
"label": "Keyboard 14"
|
||||
},
|
||||
"0x7E0F": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_15"
|
||||
"key": "QK_KB_15",
|
||||
"label": "Keyboard 15"
|
||||
},
|
||||
"0x7E10": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_16"
|
||||
"key": "QK_KB_16",
|
||||
"label": "Keyboard 16"
|
||||
},
|
||||
"0x7E11": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_17"
|
||||
"key": "QK_KB_17",
|
||||
"label": "Keyboard 17"
|
||||
},
|
||||
"0x7E12": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_18"
|
||||
"key": "QK_KB_18",
|
||||
"label": "Keyboard 18"
|
||||
},
|
||||
"0x7E13": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_19"
|
||||
"key": "QK_KB_19",
|
||||
"label": "Keyboard 19"
|
||||
},
|
||||
"0x7E14": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_20"
|
||||
"key": "QK_KB_20",
|
||||
"label": "Keyboard 20"
|
||||
},
|
||||
"0x7E15": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_21"
|
||||
"key": "QK_KB_21",
|
||||
"label": "Keyboard 21"
|
||||
},
|
||||
"0x7E16": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_22"
|
||||
"key": "QK_KB_22",
|
||||
"label": "Keyboard 22"
|
||||
},
|
||||
"0x7E17": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_23"
|
||||
"key": "QK_KB_23",
|
||||
"label": "Keyboard 23"
|
||||
},
|
||||
"0x7E18": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_24"
|
||||
"key": "QK_KB_24",
|
||||
"label": "Keyboard 24"
|
||||
},
|
||||
"0x7E19": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_25"
|
||||
"key": "QK_KB_25",
|
||||
"label": "Keyboard 25"
|
||||
},
|
||||
"0x7E1A": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_26"
|
||||
"key": "QK_KB_26",
|
||||
"label": "Keyboard 26"
|
||||
},
|
||||
"0x7E1B": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_27"
|
||||
"key": "QK_KB_27",
|
||||
"label": "Keyboard 27"
|
||||
},
|
||||
"0x7E1C": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_28"
|
||||
"key": "QK_KB_28",
|
||||
"label": "Keyboard 28"
|
||||
},
|
||||
"0x7E1D": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_29"
|
||||
"key": "QK_KB_29",
|
||||
"label": "Keyboard 29"
|
||||
},
|
||||
"0x7E1E": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_30"
|
||||
"key": "QK_KB_30",
|
||||
"label": "Keyboard 30"
|
||||
},
|
||||
"0x7E1F": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_31"
|
||||
"key": "QK_KB_31",
|
||||
"label": "Keyboard 31"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
"0x7000": {
|
||||
"group": "magic",
|
||||
"key": "QK_MAGIC_SWAP_CONTROL_CAPS_LOCK",
|
||||
"label": "Swap LCtl⇄Caps",
|
||||
"aliases": [
|
||||
"CL_SWAP"
|
||||
]
|
||||
@@ -12,6 +13,7 @@
|
||||
"0x7001": {
|
||||
"group": "magic",
|
||||
"key": "QK_MAGIC_UNSWAP_CONTROL_CAPS_LOCK",
|
||||
"label": "Unswap LCtl⇄Caps",
|
||||
"aliases": [
|
||||
"CL_NORM"
|
||||
]
|
||||
@@ -19,6 +21,7 @@
|
||||
"0x7002": {
|
||||
"group": "magic",
|
||||
"key": "QK_MAGIC_TOGGLE_CONTROL_CAPS_LOCK",
|
||||
"label": "Toggle LCtl⇄Caps",
|
||||
"aliases": [
|
||||
"CL_TOGG"
|
||||
]
|
||||
@@ -26,6 +29,7 @@
|
||||
"0x7003": {
|
||||
"group": "magic",
|
||||
"key": "QK_MAGIC_CAPS_LOCK_AS_CONTROL_OFF",
|
||||
"label": "Caps≠LCtl",
|
||||
"aliases": [
|
||||
"CL_CAPS"
|
||||
]
|
||||
@@ -33,6 +37,7 @@
|
||||
"0x7004": {
|
||||
"group": "magic",
|
||||
"key": "QK_MAGIC_CAPS_LOCK_AS_CONTROL_ON",
|
||||
"label": "Caps=LCtl",
|
||||
"aliases": [
|
||||
"CL_CTRL"
|
||||
]
|
||||
@@ -40,6 +45,7 @@
|
||||
"0x7005": {
|
||||
"group": "magic",
|
||||
"key": "QK_MAGIC_SWAP_LALT_LGUI",
|
||||
"label": "Swap LAlt⇄LGUI",
|
||||
"aliases": [
|
||||
"AG_LSWP"
|
||||
]
|
||||
@@ -47,6 +53,7 @@
|
||||
"0x7006": {
|
||||
"group": "magic",
|
||||
"key": "QK_MAGIC_UNSWAP_LALT_LGUI",
|
||||
"label": "Unswap LAlt⇄LGUI",
|
||||
"aliases": [
|
||||
"AG_LNRM"
|
||||
]
|
||||
@@ -54,6 +61,7 @@
|
||||
"0x7007": {
|
||||
"group": "magic",
|
||||
"key": "QK_MAGIC_SWAP_RALT_RGUI",
|
||||
"label": "Swap RAlt⇄RGUI",
|
||||
"aliases": [
|
||||
"AG_RSWP"
|
||||
]
|
||||
@@ -61,6 +69,7 @@
|
||||
"0x7008": {
|
||||
"group": "magic",
|
||||
"key": "QK_MAGIC_UNSWAP_RALT_RGUI",
|
||||
"label": "Unswap RAlt⇄RGUI",
|
||||
"aliases": [
|
||||
"AG_RNRM"
|
||||
]
|
||||
@@ -68,6 +77,7 @@
|
||||
"0x7009": {
|
||||
"group": "magic",
|
||||
"key": "QK_MAGIC_GUI_ON",
|
||||
"label": "GUI On",
|
||||
"aliases": [
|
||||
"GU_ON"
|
||||
]
|
||||
@@ -75,6 +85,7 @@
|
||||
"0x700A": {
|
||||
"group": "magic",
|
||||
"key": "QK_MAGIC_GUI_OFF",
|
||||
"label": "GUI Off",
|
||||
"aliases": [
|
||||
"GU_OFF"
|
||||
]
|
||||
@@ -82,6 +93,7 @@
|
||||
"0x700B": {
|
||||
"group": "magic",
|
||||
"key": "QK_MAGIC_TOGGLE_GUI",
|
||||
"label": "Toggle GUI",
|
||||
"aliases": [
|
||||
"GU_TOGG"
|
||||
]
|
||||
@@ -89,6 +101,7 @@
|
||||
"0x700C": {
|
||||
"group": "magic",
|
||||
"key": "QK_MAGIC_SWAP_GRAVE_ESC",
|
||||
"label": "Swap `⇄Esc",
|
||||
"aliases": [
|
||||
"GE_SWAP"
|
||||
]
|
||||
@@ -96,6 +109,7 @@
|
||||
"0x700D": {
|
||||
"group": "magic",
|
||||
"key": "QK_MAGIC_UNSWAP_GRAVE_ESC",
|
||||
"label": "Unswap `⇄Esc",
|
||||
"aliases": [
|
||||
"GE_NORM"
|
||||
]
|
||||
@@ -103,6 +117,7 @@
|
||||
"0x700E": {
|
||||
"group": "magic",
|
||||
"key": "QK_MAGIC_SWAP_BACKSLASH_BACKSPACE",
|
||||
"label": "Swap \\⇄Bspc",
|
||||
"aliases": [
|
||||
"BS_SWAP"
|
||||
]
|
||||
@@ -110,6 +125,7 @@
|
||||
"0x700F": {
|
||||
"group": "magic",
|
||||
"key": "QK_MAGIC_UNSWAP_BACKSLASH_BACKSPACE",
|
||||
"label": "Unswap \\⇄Bspc",
|
||||
"aliases": [
|
||||
"BS_NORM"
|
||||
]
|
||||
@@ -117,6 +133,7 @@
|
||||
"0x7010": {
|
||||
"group": "magic",
|
||||
"key": "QK_MAGIC_TOGGLE_BACKSLASH_BACKSPACE",
|
||||
"label": "Toggle \\⇄Bspc",
|
||||
"aliases": [
|
||||
"BS_TOGG"
|
||||
]
|
||||
@@ -124,6 +141,7 @@
|
||||
"0x7011": {
|
||||
"group": "magic",
|
||||
"key": "QK_MAGIC_NKRO_ON",
|
||||
"label": "NKRO On",
|
||||
"aliases": [
|
||||
"NK_ON"
|
||||
]
|
||||
@@ -131,6 +149,7 @@
|
||||
"0x7012": {
|
||||
"group": "magic",
|
||||
"key": "QK_MAGIC_NKRO_OFF",
|
||||
"label": "NKRO Off",
|
||||
"aliases": [
|
||||
"NK_OFF"
|
||||
]
|
||||
@@ -138,6 +157,7 @@
|
||||
"0x7013": {
|
||||
"group": "magic",
|
||||
"key": "QK_MAGIC_TOGGLE_NKRO",
|
||||
"label": "Toggle NKRO",
|
||||
"aliases": [
|
||||
"NK_TOGG"
|
||||
]
|
||||
@@ -145,6 +165,7 @@
|
||||
"0x7014": {
|
||||
"group": "magic",
|
||||
"key": "QK_MAGIC_SWAP_ALT_GUI",
|
||||
"label": "Swap Alt⇄GUI",
|
||||
"aliases": [
|
||||
"AG_SWAP"
|
||||
]
|
||||
@@ -152,6 +173,7 @@
|
||||
"0x7015": {
|
||||
"group": "magic",
|
||||
"key": "QK_MAGIC_UNSWAP_ALT_GUI",
|
||||
"label": "Unswap Alt⇄GUI",
|
||||
"aliases": [
|
||||
"AG_NORM"
|
||||
]
|
||||
@@ -159,6 +181,7 @@
|
||||
"0x7016": {
|
||||
"group": "magic",
|
||||
"key": "QK_MAGIC_TOGGLE_ALT_GUI",
|
||||
"label": "Toggle Alt⇄GUI",
|
||||
"aliases": [
|
||||
"AG_TOGG"
|
||||
]
|
||||
@@ -166,6 +189,7 @@
|
||||
"0x7017": {
|
||||
"group": "magic",
|
||||
"key": "QK_MAGIC_SWAP_LCTL_LGUI",
|
||||
"label": "Swap LCtl⇄LGUI",
|
||||
"aliases": [
|
||||
"CG_LSWP"
|
||||
]
|
||||
@@ -173,6 +197,7 @@
|
||||
"0x7018": {
|
||||
"group": "magic",
|
||||
"key": "QK_MAGIC_UNSWAP_LCTL_LGUI",
|
||||
"label": "Unswap LCtl⇄LGUI",
|
||||
"aliases": [
|
||||
"CG_LNRM"
|
||||
]
|
||||
@@ -180,6 +205,7 @@
|
||||
"0x7019": {
|
||||
"group": "magic",
|
||||
"key": "QK_MAGIC_SWAP_RCTL_RGUI",
|
||||
"label": "Swap RCtl⇄RGUI",
|
||||
"aliases": [
|
||||
"CG_RSWP"
|
||||
]
|
||||
@@ -187,6 +213,7 @@
|
||||
"0x701A": {
|
||||
"group": "magic",
|
||||
"key": "QK_MAGIC_UNSWAP_RCTL_RGUI",
|
||||
"label": "Unswap RCtl⇄RGUI",
|
||||
"aliases": [
|
||||
"CG_RNRM"
|
||||
]
|
||||
@@ -194,6 +221,7 @@
|
||||
"0x701B": {
|
||||
"group": "magic",
|
||||
"key": "QK_MAGIC_SWAP_CTL_GUI",
|
||||
"label": "Swap Ctl⇄GUI",
|
||||
"aliases": [
|
||||
"CG_SWAP"
|
||||
]
|
||||
@@ -201,6 +229,7 @@
|
||||
"0x701C": {
|
||||
"group": "magic",
|
||||
"key": "QK_MAGIC_UNSWAP_CTL_GUI",
|
||||
"label": "Unswap Ctl⇄GUI",
|
||||
"aliases": [
|
||||
"CG_NORM"
|
||||
]
|
||||
@@ -208,6 +237,7 @@
|
||||
"0x701D": {
|
||||
"group": "magic",
|
||||
"key": "QK_MAGIC_TOGGLE_CTL_GUI",
|
||||
"label": "Toggle Ctl⇄GUI",
|
||||
"aliases": [
|
||||
"CG_TOGG"
|
||||
]
|
||||
@@ -215,6 +245,7 @@
|
||||
"0x701E": {
|
||||
"group": "magic",
|
||||
"key": "QK_MAGIC_EE_HANDS_LEFT",
|
||||
"label": "EE Hands Left",
|
||||
"aliases": [
|
||||
"EH_LEFT"
|
||||
]
|
||||
@@ -222,6 +253,7 @@
|
||||
"0x701F": {
|
||||
"group": "magic",
|
||||
"key": "QK_MAGIC_EE_HANDS_RIGHT",
|
||||
"label": "EE Hands Right",
|
||||
"aliases": [
|
||||
"EH_RGHT"
|
||||
]
|
||||
@@ -229,6 +261,7 @@
|
||||
"0x7020": {
|
||||
"group": "magic",
|
||||
"key": "QK_MAGIC_SWAP_ESCAPE_CAPS_LOCK",
|
||||
"label": "Swap Esc⇄Caps",
|
||||
"aliases": [
|
||||
"EC_SWAP"
|
||||
]
|
||||
@@ -236,6 +269,7 @@
|
||||
"0x7021": {
|
||||
"group": "magic",
|
||||
"key": "QK_MAGIC_UNSWAP_ESCAPE_CAPS_LOCK",
|
||||
"label": "Unswap Esc⇄Caps",
|
||||
"aliases": [
|
||||
"EC_NORM"
|
||||
]
|
||||
@@ -243,6 +277,7 @@
|
||||
"0x7022": {
|
||||
"group": "magic",
|
||||
"key": "QK_MAGIC_TOGGLE_ESCAPE_CAPS_LOCK",
|
||||
"label": "Toggle Esc⇄Caps",
|
||||
"aliases": [
|
||||
"EC_TOGG"
|
||||
]
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -3,6 +3,7 @@
|
||||
"0x7C77": {
|
||||
"group": "quantum",
|
||||
"key": "QK_TRI_LAYER_LOWER",
|
||||
"label": "Lower",
|
||||
"aliases": [
|
||||
"TL_LOWR"
|
||||
]
|
||||
@@ -10,6 +11,7 @@
|
||||
"0x7C78": {
|
||||
"group": "quantum",
|
||||
"key": "QK_TRI_LAYER_UPPER",
|
||||
"label": "Upper",
|
||||
"aliases": [
|
||||
"TL_UPPR"
|
||||
]
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
"0x7200": {
|
||||
"group": "sequencer",
|
||||
"key": "QK_SEQUENCER_ON",
|
||||
"label": "Sequencer On",
|
||||
"aliases": [
|
||||
"SQ_ON"
|
||||
]
|
||||
@@ -12,6 +13,7 @@
|
||||
"0x7201": {
|
||||
"group": "sequencer",
|
||||
"key": "QK_SEQUENCER_OFF",
|
||||
"label": "Sequencer Off",
|
||||
"aliases": [
|
||||
"SQ_OFF"
|
||||
]
|
||||
@@ -19,6 +21,7 @@
|
||||
"0x7202": {
|
||||
"group": "sequencer",
|
||||
"key": "QK_SEQUENCER_TOGGLE",
|
||||
"label": "Toggle Sequencer",
|
||||
"aliases": [
|
||||
"SQ_TOGG"
|
||||
]
|
||||
@@ -26,6 +29,7 @@
|
||||
"0x7203": {
|
||||
"group": "sequencer",
|
||||
"key": "QK_SEQUENCER_TEMPO_DOWN",
|
||||
"label": "Tempo Down",
|
||||
"aliases": [
|
||||
"SQ_TMPD"
|
||||
]
|
||||
@@ -33,6 +37,7 @@
|
||||
"0x7204": {
|
||||
"group": "sequencer",
|
||||
"key": "QK_SEQUENCER_TEMPO_UP",
|
||||
"label": "Tempo Up",
|
||||
"aliases": [
|
||||
"SQ_TMPU"
|
||||
]
|
||||
@@ -40,6 +45,7 @@
|
||||
"0x7205": {
|
||||
"group": "sequencer",
|
||||
"key": "QK_SEQUENCER_RESOLUTION_DOWN",
|
||||
"label": "Resolution Down",
|
||||
"aliases": [
|
||||
"SQ_RESD"
|
||||
]
|
||||
@@ -47,6 +53,7 @@
|
||||
"0x7206": {
|
||||
"group": "sequencer",
|
||||
"key": "QK_SEQUENCER_RESOLUTION_UP",
|
||||
"label": "Resolution Up",
|
||||
"aliases": [
|
||||
"SQ_RESU"
|
||||
]
|
||||
@@ -54,6 +61,7 @@
|
||||
"0x7207": {
|
||||
"group": "sequencer",
|
||||
"key": "QK_SEQUENCER_STEPS_ALL",
|
||||
"label": "All Steps",
|
||||
"aliases": [
|
||||
"SQ_SALL"
|
||||
]
|
||||
@@ -61,6 +69,7 @@
|
||||
"0x7208": {
|
||||
"group": "sequencer",
|
||||
"key": "QK_SEQUENCER_STEPS_CLEAR",
|
||||
"label": "Clear Steps",
|
||||
"aliases": [
|
||||
"SQ_SCLR"
|
||||
]
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
"0x56F0": {
|
||||
"group": "swap_hands",
|
||||
"key": "QK_SWAP_HANDS_TOGGLE",
|
||||
"label": "Toggle Swap Hands",
|
||||
"aliases": [
|
||||
"SH_TOGG"
|
||||
]
|
||||
@@ -10,6 +11,7 @@
|
||||
"0x56F1": {
|
||||
"group": "swap_hands",
|
||||
"key": "QK_SWAP_HANDS_TAP_TOGGLE",
|
||||
"label": "Swap Hands Tap Toggle",
|
||||
"aliases": [
|
||||
"SH_TT"
|
||||
]
|
||||
@@ -17,6 +19,7 @@
|
||||
"0x56F2": {
|
||||
"group": "swap_hands",
|
||||
"key": "QK_SWAP_HANDS_MOMENTARY_ON",
|
||||
"label": "Swap Hands Momentary On",
|
||||
"aliases": [
|
||||
"SH_MON"
|
||||
]
|
||||
@@ -24,6 +27,7 @@
|
||||
"0x56F3": {
|
||||
"group": "swap_hands",
|
||||
"key": "QK_SWAP_HANDS_MOMENTARY_OFF",
|
||||
"label": "Swap Hands Momentary Off",
|
||||
"aliases": [
|
||||
"SH_MOFF"
|
||||
]
|
||||
@@ -31,6 +35,7 @@
|
||||
"0x56F4": {
|
||||
"group": "swap_hands",
|
||||
"key": "QK_SWAP_HANDS_OFF",
|
||||
"label": "Unswap Hands",
|
||||
"aliases": [
|
||||
"SH_OFF"
|
||||
]
|
||||
@@ -38,6 +43,7 @@
|
||||
"0x56F5": {
|
||||
"group": "swap_hands",
|
||||
"key": "QK_SWAP_HANDS_ON",
|
||||
"label": "Swap Hands",
|
||||
"aliases": [
|
||||
"SH_ON"
|
||||
]
|
||||
@@ -45,6 +51,7 @@
|
||||
"0x56F6": {
|
||||
"group": "swap_hands",
|
||||
"key": "QK_SWAP_HANDS_ONE_SHOT",
|
||||
"label": "Swap Hands One Shot",
|
||||
"aliases": [
|
||||
"SH_OS"
|
||||
]
|
||||
|
||||
@@ -2,131 +2,163 @@
|
||||
"keycodes": {
|
||||
"0x7E40": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_0"
|
||||
"key": "QK_USER_0",
|
||||
"label": "User 0"
|
||||
},
|
||||
"0x7E41": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_1"
|
||||
"key": "QK_USER_1",
|
||||
"label": "User 1"
|
||||
},
|
||||
"0x7E42": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_2"
|
||||
"key": "QK_USER_2",
|
||||
"label": "User 2"
|
||||
},
|
||||
"0x7E43": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_3"
|
||||
"key": "QK_USER_3",
|
||||
"label": "User 3"
|
||||
},
|
||||
"0x7E44": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_4"
|
||||
"key": "QK_USER_4",
|
||||
"label": "User 4"
|
||||
},
|
||||
"0x7E45": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_5"
|
||||
"key": "QK_USER_5",
|
||||
"label": "User 5"
|
||||
},
|
||||
"0x7E46": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_6"
|
||||
"key": "QK_USER_6",
|
||||
"label": "User 6"
|
||||
},
|
||||
"0x7E47": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_7"
|
||||
"key": "QK_USER_7",
|
||||
"label": "User 7"
|
||||
},
|
||||
"0x7E48": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_8"
|
||||
"key": "QK_USER_8",
|
||||
"label": "User 8"
|
||||
},
|
||||
"0x7E49": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_9"
|
||||
"key": "QK_USER_9",
|
||||
"label": "User 9"
|
||||
},
|
||||
"0x7E4A": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_10"
|
||||
"key": "QK_USER_10",
|
||||
"label": "User 10"
|
||||
},
|
||||
"0x7E4B": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_11"
|
||||
"key": "QK_USER_11",
|
||||
"label": "User 11"
|
||||
},
|
||||
"0x7E4C": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_12"
|
||||
"key": "QK_USER_12",
|
||||
"label": "User 12"
|
||||
},
|
||||
"0x7E4D": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_13"
|
||||
"key": "QK_USER_13",
|
||||
"label": "User 13"
|
||||
},
|
||||
"0x7E4E": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_14"
|
||||
"key": "QK_USER_14",
|
||||
"label": "User 14"
|
||||
},
|
||||
"0x7E4F": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_15"
|
||||
"key": "QK_USER_15",
|
||||
"label": "User 15"
|
||||
},
|
||||
"0x7E50": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_16"
|
||||
"key": "QK_USER_16",
|
||||
"label": "User 16"
|
||||
},
|
||||
"0x7E51": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_17"
|
||||
"key": "QK_USER_17",
|
||||
"label": "User 17"
|
||||
},
|
||||
"0x7E52": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_18"
|
||||
"key": "QK_USER_18",
|
||||
"label": "User 18"
|
||||
},
|
||||
"0x7E53": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_19"
|
||||
"key": "QK_USER_19",
|
||||
"label": "User 19"
|
||||
},
|
||||
"0x7E54": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_20"
|
||||
"key": "QK_USER_20",
|
||||
"label": "User 20"
|
||||
},
|
||||
"0x7E55": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_21"
|
||||
"key": "QK_USER_21",
|
||||
"label": "User 21"
|
||||
},
|
||||
"0x7E56": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_22"
|
||||
"key": "QK_USER_22",
|
||||
"label": "User 22"
|
||||
},
|
||||
"0x7E57": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_23"
|
||||
"key": "QK_USER_23",
|
||||
"label": "User 23"
|
||||
},
|
||||
"0x7E58": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_24"
|
||||
"key": "QK_USER_24",
|
||||
"label": "User 24"
|
||||
},
|
||||
"0x7E59": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_25"
|
||||
"key": "QK_USER_25",
|
||||
"label": "User 25"
|
||||
},
|
||||
"0x7E5A": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_26"
|
||||
"key": "QK_USER_26",
|
||||
"label": "User 26"
|
||||
},
|
||||
"0x7E5B": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_27"
|
||||
"key": "QK_USER_27",
|
||||
"label": "User 27"
|
||||
},
|
||||
"0x7E5C": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_28"
|
||||
"key": "QK_USER_28",
|
||||
"label": "User 28"
|
||||
},
|
||||
"0x7E5D": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_29"
|
||||
"key": "QK_USER_29",
|
||||
"label": "User 29"
|
||||
},
|
||||
"0x7E5E": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_30"
|
||||
"key": "QK_USER_30",
|
||||
"label": "User 30"
|
||||
},
|
||||
"0x7E5F": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_31"
|
||||
"key": "QK_USER_31",
|
||||
"label": "User 31"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
"0x7C79": {
|
||||
"group": "quantum",
|
||||
"key": "QK_REPEAT_KEY",
|
||||
"label": "Repeat",
|
||||
"aliases": [
|
||||
"QK_REP"
|
||||
]
|
||||
@@ -10,6 +11,7 @@
|
||||
"0x7C7A": {
|
||||
"group": "quantum",
|
||||
"key": "QK_ALT_REPEAT_KEY",
|
||||
"label": "Repeat Alternate",
|
||||
"aliases": [
|
||||
"QK_AREP"
|
||||
]
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
"0x7810": {
|
||||
"group": "led_matrix",
|
||||
"key": "QK_LED_MATRIX_ON",
|
||||
"label": "LED Matrix On",
|
||||
"aliases": [
|
||||
"LM_ON"
|
||||
]
|
||||
@@ -10,6 +11,7 @@
|
||||
"0x7811": {
|
||||
"group": "led_matrix",
|
||||
"key": "QK_LED_MATRIX_OFF",
|
||||
"label": "LED Matrix Off",
|
||||
"aliases": [
|
||||
"LM_OFF"
|
||||
]
|
||||
@@ -17,6 +19,7 @@
|
||||
"0x7812": {
|
||||
"group": "led_matrix",
|
||||
"key": "QK_LED_MATRIX_TOGGLE",
|
||||
"label": "Toggle LED Matrix",
|
||||
"aliases": [
|
||||
"LM_TOGG"
|
||||
]
|
||||
@@ -24,6 +27,7 @@
|
||||
"0x7813": {
|
||||
"group": "led_matrix",
|
||||
"key": "QK_LED_MATRIX_MODE_NEXT",
|
||||
"label": "LED Matrix Next",
|
||||
"aliases": [
|
||||
"LM_NEXT"
|
||||
]
|
||||
@@ -31,6 +35,7 @@
|
||||
"0x7814": {
|
||||
"group": "led_matrix",
|
||||
"key": "QK_LED_MATRIX_MODE_PREVIOUS",
|
||||
"label": "LED Matrix Previous",
|
||||
"aliases": [
|
||||
"LM_PREV"
|
||||
]
|
||||
@@ -38,6 +43,7 @@
|
||||
"0x7815": {
|
||||
"group": "led_matrix",
|
||||
"key": "QK_LED_MATRIX_BRIGHTNESS_UP",
|
||||
"label": "LED Matrix Brightness Up",
|
||||
"aliases": [
|
||||
"LM_BRIU"
|
||||
]
|
||||
@@ -45,6 +51,7 @@
|
||||
"0x7816": {
|
||||
"group": "led_matrix",
|
||||
"key": "QK_LED_MATRIX_BRIGHTNESS_DOWN",
|
||||
"label": "LED Matrix Brightness Down",
|
||||
"aliases": [
|
||||
"LM_BRID"
|
||||
]
|
||||
@@ -52,6 +59,7 @@
|
||||
"0x7817": {
|
||||
"group": "led_matrix",
|
||||
"key": "QK_LED_MATRIX_SPEED_UP",
|
||||
"label": "LED Matrix Speed Up",
|
||||
"aliases": [
|
||||
"LM_SPDU"
|
||||
]
|
||||
@@ -59,6 +67,7 @@
|
||||
"0x7818": {
|
||||
"group": "led_matrix",
|
||||
"key": "QK_LED_MATRIX_SPEED_DOWN",
|
||||
"label": "LED Matrix Speed Down",
|
||||
"aliases": [
|
||||
"LM_SPDD"
|
||||
]
|
||||
@@ -67,6 +76,7 @@
|
||||
"0x7820": {
|
||||
"group": "underglow",
|
||||
"key": "QK_UNDERGLOW_TOGGLE",
|
||||
"label": "Toggle RGB Underglow",
|
||||
"aliases": [
|
||||
"UG_TOGG"
|
||||
]
|
||||
@@ -74,6 +84,7 @@
|
||||
"0x7821": {
|
||||
"group": "underglow",
|
||||
"key": "QK_UNDERGLOW_MODE_NEXT",
|
||||
"label": "RGB Underglow Next",
|
||||
"aliases": [
|
||||
"!reset!",
|
||||
"UG_NEXT"
|
||||
@@ -82,6 +93,7 @@
|
||||
"0x7822": {
|
||||
"group": "underglow",
|
||||
"key": "QK_UNDERGLOW_MODE_PREVIOUS",
|
||||
"label": "RGB Underglow Previous",
|
||||
"aliases": [
|
||||
"!reset!",
|
||||
"UG_PREV"
|
||||
@@ -90,6 +102,7 @@
|
||||
"0x7823": {
|
||||
"group": "underglow",
|
||||
"key": "QK_UNDERGLOW_HUE_UP",
|
||||
"label": "RGB Underglow Hue Up",
|
||||
"aliases": [
|
||||
"UG_HUEU"
|
||||
]
|
||||
@@ -97,6 +110,7 @@
|
||||
"0x7824": {
|
||||
"group": "underglow",
|
||||
"key": "QK_UNDERGLOW_HUE_DOWN",
|
||||
"label": "RGB Underglow Hue Down",
|
||||
"aliases": [
|
||||
"UG_HUED"
|
||||
]
|
||||
@@ -104,6 +118,7 @@
|
||||
"0x7825": {
|
||||
"group": "underglow",
|
||||
"key": "QK_UNDERGLOW_SATURATION_UP",
|
||||
"label": "RGB Underglow Saturation Up",
|
||||
"aliases": [
|
||||
"UG_SATU"
|
||||
]
|
||||
@@ -111,6 +126,7 @@
|
||||
"0x7826": {
|
||||
"group": "underglow",
|
||||
"key": "QK_UNDERGLOW_SATURATION_DOWN",
|
||||
"label": "RGB Underglow Saturation Down",
|
||||
"aliases": [
|
||||
"UG_SATD"
|
||||
]
|
||||
@@ -118,6 +134,7 @@
|
||||
"0x7827": {
|
||||
"group": "underglow",
|
||||
"key": "QK_UNDERGLOW_VALUE_UP",
|
||||
"label": "RGB Underglow Value Up",
|
||||
"aliases": [
|
||||
"UG_VALU"
|
||||
]
|
||||
@@ -125,6 +142,7 @@
|
||||
"0x7828": {
|
||||
"group": "underglow",
|
||||
"key": "QK_UNDERGLOW_VALUE_DOWN",
|
||||
"label": "RGB Underglow Value Down",
|
||||
"aliases": [
|
||||
"UG_VALD"
|
||||
]
|
||||
@@ -132,6 +150,7 @@
|
||||
"0x7829": {
|
||||
"group": "underglow",
|
||||
"key": "QK_UNDERGLOW_SPEED_UP",
|
||||
"label": "RGB Underglow Speed Up",
|
||||
"aliases": [
|
||||
"UG_SPDU"
|
||||
]
|
||||
@@ -139,6 +158,7 @@
|
||||
"0x782A": {
|
||||
"group": "underglow",
|
||||
"key": "QK_UNDERGLOW_SPEED_DOWN",
|
||||
"label": "RGB Underglow Speed Down",
|
||||
"aliases": [
|
||||
"UG_SPDD"
|
||||
]
|
||||
@@ -147,6 +167,7 @@
|
||||
"0x7840": {
|
||||
"group": "rgb_matrix",
|
||||
"key": "QK_RGB_MATRIX_ON",
|
||||
"label": "RGB Matrix On",
|
||||
"aliases": [
|
||||
"RM_ON"
|
||||
]
|
||||
@@ -154,6 +175,7 @@
|
||||
"0x7841": {
|
||||
"group": "rgb_matrix",
|
||||
"key": "QK_RGB_MATRIX_OFF",
|
||||
"label": "RGB Matrix Off"
|
||||
"aliases": [
|
||||
"RM_OFF"
|
||||
]
|
||||
@@ -161,6 +183,7 @@
|
||||
"0x7842": {
|
||||
"group": "rgb_matrix",
|
||||
"key": "QK_RGB_MATRIX_TOGGLE",
|
||||
"label": "Toggle RGB Matrix",
|
||||
"aliases": [
|
||||
"RM_TOGG"
|
||||
]
|
||||
@@ -168,6 +191,7 @@
|
||||
"0x7843": {
|
||||
"group": "rgb_matrix",
|
||||
"key": "QK_RGB_MATRIX_MODE_NEXT",
|
||||
"label": "RGB Matrix Next",
|
||||
"aliases": [
|
||||
"RM_NEXT"
|
||||
]
|
||||
@@ -175,6 +199,7 @@
|
||||
"0x7844": {
|
||||
"group": "rgb_matrix",
|
||||
"key": "QK_RGB_MATRIX_MODE_PREVIOUS",
|
||||
"label": "RGB Matrix Previous",
|
||||
"aliases": [
|
||||
"RM_PREV"
|
||||
]
|
||||
@@ -182,6 +207,7 @@
|
||||
"0x7845": {
|
||||
"group": "rgb_matrix",
|
||||
"key": "QK_RGB_MATRIX_HUE_UP",
|
||||
"label": "RGB Matrix Hue Up",
|
||||
"aliases": [
|
||||
"RM_HUEU"
|
||||
]
|
||||
@@ -189,6 +215,7 @@
|
||||
"0x7846": {
|
||||
"group": "rgb_matrix",
|
||||
"key": "QK_RGB_MATRIX_HUE_DOWN",
|
||||
"label": "RGB Matrix Hue Down",
|
||||
"aliases": [
|
||||
"RM_HUED"
|
||||
]
|
||||
@@ -196,6 +223,7 @@
|
||||
"0x7847": {
|
||||
"group": "rgb_matrix",
|
||||
"key": "QK_RGB_MATRIX_SATURATION_UP",
|
||||
"label": "RGB Matrix Saturation Up",
|
||||
"aliases": [
|
||||
"RM_SATU"
|
||||
]
|
||||
@@ -203,6 +231,7 @@
|
||||
"0x7848": {
|
||||
"group": "rgb_matrix",
|
||||
"key": "QK_RGB_MATRIX_SATURATION_DOWN",
|
||||
"label": "RGB Matrix Saturation Down",
|
||||
"aliases": [
|
||||
"RM_SATD"
|
||||
]
|
||||
@@ -210,6 +239,7 @@
|
||||
"0x7849": {
|
||||
"group": "rgb_matrix",
|
||||
"key": "QK_RGB_MATRIX_VALUE_UP",
|
||||
"label": "RGB Matrix Value Up",
|
||||
"aliases": [
|
||||
"RM_VALU"
|
||||
]
|
||||
@@ -217,6 +247,7 @@
|
||||
"0x784A": {
|
||||
"group": "rgb_matrix",
|
||||
"key": "QK_RGB_MATRIX_VALUE_DOWN",
|
||||
"label": "RGB Matrix Value Down",
|
||||
"aliases": [
|
||||
"RM_VALD"
|
||||
]
|
||||
@@ -224,6 +255,7 @@
|
||||
"0x784B": {
|
||||
"group": "rgb_matrix",
|
||||
"key": "QK_RGB_MATRIX_SPEED_UP",
|
||||
"label": "RGB Matrix Speed Up",
|
||||
"aliases": [
|
||||
"RM_SPDU"
|
||||
]
|
||||
@@ -231,6 +263,7 @@
|
||||
"0x784C": {
|
||||
"group": "rgb_matrix",
|
||||
"key": "QK_RGB_MATRIX_SPEED_DOWN",
|
||||
"label": "RGB Matrix Speed Down",
|
||||
"aliases": [
|
||||
"RM_SPDD"
|
||||
]
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"0x00CD": {
|
||||
"group": "mouse",
|
||||
"key": "QK_MOUSE_CURSOR_UP",
|
||||
"label": "Mouse cursor up",
|
||||
"label": "Mouse Up",
|
||||
"aliases": [
|
||||
"!reset!",
|
||||
"MS_UP"
|
||||
@@ -12,7 +12,7 @@
|
||||
"0x00CE": {
|
||||
"group": "mouse",
|
||||
"key": "QK_MOUSE_CURSOR_DOWN",
|
||||
"label": "Mouse cursor down",
|
||||
"label": "Mouse Down",
|
||||
"aliases": [
|
||||
"!reset!",
|
||||
"MS_DOWN"
|
||||
@@ -21,7 +21,7 @@
|
||||
"0x00CF": {
|
||||
"group": "mouse",
|
||||
"key": "QK_MOUSE_CURSOR_LEFT",
|
||||
"label": "Mouse cursor left",
|
||||
"label": "Mouse Left",
|
||||
"aliases": [
|
||||
"!reset!",
|
||||
"MS_LEFT"
|
||||
@@ -30,7 +30,7 @@
|
||||
"0x00D0": {
|
||||
"group": "mouse",
|
||||
"key": "QK_MOUSE_CURSOR_RIGHT",
|
||||
"label": "Mouse cursor right",
|
||||
"label": "Mouse Right",
|
||||
"aliases": [
|
||||
"!reset!",
|
||||
"MS_RGHT"
|
||||
@@ -39,7 +39,7 @@
|
||||
"0x00D1": {
|
||||
"group": "mouse",
|
||||
"key": "QK_MOUSE_BUTTON_1",
|
||||
"label": "Mouse button 1",
|
||||
"label": "Mouse Button 1",
|
||||
"aliases": [
|
||||
"!reset!",
|
||||
"MS_BTN1"
|
||||
@@ -48,7 +48,7 @@
|
||||
"0x00D2": {
|
||||
"group": "mouse",
|
||||
"key": "QK_MOUSE_BUTTON_2",
|
||||
"label": "Mouse button 2",
|
||||
"label": "Mouse Button 2",
|
||||
"aliases": [
|
||||
"!reset!",
|
||||
"MS_BTN2"
|
||||
@@ -57,7 +57,7 @@
|
||||
"0x00D3": {
|
||||
"group": "mouse",
|
||||
"key": "QK_MOUSE_BUTTON_3",
|
||||
"label": "Mouse button 3",
|
||||
"label": "Mouse Button 3",
|
||||
"aliases": [
|
||||
"!reset!",
|
||||
"MS_BTN3"
|
||||
@@ -66,7 +66,7 @@
|
||||
"0x00D4": {
|
||||
"group": "mouse",
|
||||
"key": "QK_MOUSE_BUTTON_4",
|
||||
"label": "Mouse button 4",
|
||||
"label": "Mouse Button 4",
|
||||
"aliases": [
|
||||
"!reset!",
|
||||
"MS_BTN4"
|
||||
@@ -75,7 +75,7 @@
|
||||
"0x00D5": {
|
||||
"group": "mouse",
|
||||
"key": "QK_MOUSE_BUTTON_5",
|
||||
"label": "Mouse button 5",
|
||||
"label": "Mouse Button 5",
|
||||
"aliases": [
|
||||
"!reset!",
|
||||
"MS_BTN5"
|
||||
@@ -84,7 +84,7 @@
|
||||
"0x00D6": {
|
||||
"group": "mouse",
|
||||
"key": "QK_MOUSE_BUTTON_6",
|
||||
"label": "Mouse button 6",
|
||||
"label": "Mouse Button 6",
|
||||
"aliases": [
|
||||
"!reset!",
|
||||
"MS_BTN6"
|
||||
@@ -93,7 +93,7 @@
|
||||
"0x00D7": {
|
||||
"group": "mouse",
|
||||
"key": "QK_MOUSE_BUTTON_7",
|
||||
"label": "Mouse button 7",
|
||||
"label": "Mouse Button 7",
|
||||
"aliases": [
|
||||
"!reset!",
|
||||
"MS_BTN7"
|
||||
@@ -102,7 +102,7 @@
|
||||
"0x00D8": {
|
||||
"group": "mouse",
|
||||
"key": "QK_MOUSE_BUTTON_8",
|
||||
"label": "Mouse button 8",
|
||||
"label": "Mouse Button 8",
|
||||
"aliases": [
|
||||
"!reset!",
|
||||
"MS_BTN8"
|
||||
@@ -111,7 +111,7 @@
|
||||
"0x00D9": {
|
||||
"group": "mouse",
|
||||
"key": "QK_MOUSE_WHEEL_UP",
|
||||
"label": "Mouse wheel up",
|
||||
"label": "Mouse Wheel Up",
|
||||
"aliases": [
|
||||
"!reset!",
|
||||
"MS_WHLU"
|
||||
@@ -120,7 +120,7 @@
|
||||
"0x00DA": {
|
||||
"group": "mouse",
|
||||
"key": "QK_MOUSE_WHEEL_DOWN",
|
||||
"label": "Mouse wheel down",
|
||||
"label": "Mouse Wheel Down",
|
||||
"aliases": [
|
||||
"!reset!",
|
||||
"MS_WHLD"
|
||||
@@ -129,7 +129,7 @@
|
||||
"0x00DB": {
|
||||
"group": "mouse",
|
||||
"key": "QK_MOUSE_WHEEL_LEFT",
|
||||
"label": "Mouse wheel left",
|
||||
"label": "Mouse Wheel Left",
|
||||
"aliases": [
|
||||
"!reset!",
|
||||
"MS_WHLL"
|
||||
@@ -138,7 +138,7 @@
|
||||
"0x00DC": {
|
||||
"group": "mouse",
|
||||
"key": "QK_MOUSE_WHEEL_RIGHT",
|
||||
"label": "Mouse wheel right",
|
||||
"label": "Mouse Wheel Right",
|
||||
"aliases": [
|
||||
"!reset!",
|
||||
"MS_WHLR"
|
||||
@@ -147,7 +147,7 @@
|
||||
"0x00DD": {
|
||||
"group": "mouse",
|
||||
"key": "QK_MOUSE_ACCELERATION_0",
|
||||
"label": "Set mouse acceleration to 0",
|
||||
"label": "Acceleration 0",
|
||||
"aliases": [
|
||||
"!reset!",
|
||||
"MS_ACL0"
|
||||
@@ -156,7 +156,7 @@
|
||||
"0x00DE": {
|
||||
"group": "mouse",
|
||||
"key": "QK_MOUSE_ACCELERATION_1",
|
||||
"label": "Set mouse acceleration to 1",
|
||||
"label": "Acceleration 1",
|
||||
"aliases": [
|
||||
"!reset!",
|
||||
"MS_ACL1"
|
||||
@@ -165,7 +165,7 @@
|
||||
"0x00DF": {
|
||||
"group": "mouse",
|
||||
"key": "QK_MOUSE_ACCELERATION_2",
|
||||
"label": "Set mouse acceleration to 2",
|
||||
"label": "Acceleration 2",
|
||||
"aliases": [
|
||||
"!reset!",
|
||||
"MS_ACL2"
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
"0x7780": {
|
||||
"group": "connection",
|
||||
"key": "QK_OUTPUT_AUTO",
|
||||
"label": "Output Auto",
|
||||
"aliases": [
|
||||
"OU_AUTO"
|
||||
]
|
||||
@@ -15,6 +16,7 @@
|
||||
"0x7781": {
|
||||
"group": "connection",
|
||||
"key": "QK_OUTPUT_NEXT",
|
||||
"label": "Next Output",
|
||||
"aliases": [
|
||||
"OU_NEXT"
|
||||
]
|
||||
@@ -22,6 +24,7 @@
|
||||
"0x7782": {
|
||||
"group": "connection",
|
||||
"key": "QK_OUTPUT_PREV",
|
||||
"label": "Previous Output",
|
||||
"aliases": [
|
||||
"OU_PREV"
|
||||
]
|
||||
@@ -29,6 +32,7 @@
|
||||
"0x7783": {
|
||||
"group": "connection",
|
||||
"key": "QK_OUTPUT_NONE",
|
||||
"label": "None",
|
||||
"aliases": [
|
||||
"OU_NONE"
|
||||
]
|
||||
@@ -36,6 +40,7 @@
|
||||
"0x7784": {
|
||||
"group": "connection",
|
||||
"key": "QK_OUTPUT_USB",
|
||||
"label": "USB",
|
||||
"aliases": [
|
||||
"OU_USB"
|
||||
]
|
||||
@@ -43,6 +48,7 @@
|
||||
"0x7785": {
|
||||
"group": "connection",
|
||||
"key": "QK_OUTPUT_2P4GHZ",
|
||||
"label": "2.4GHz",
|
||||
"aliases": [
|
||||
"OU_2P4G"
|
||||
]
|
||||
@@ -50,6 +56,7 @@
|
||||
"0x7786": {
|
||||
"group": "connection",
|
||||
"key": "QK_OUTPUT_BLUETOOTH",
|
||||
"label": "Bluetooth",
|
||||
"aliases": [
|
||||
"OU_BT"
|
||||
]
|
||||
@@ -58,6 +65,7 @@
|
||||
"0x7790": {
|
||||
"group": "connection",
|
||||
"key": "QK_BLUETOOTH_PROFILE_NEXT",
|
||||
"label": "Bluetooth Profile Next",
|
||||
"aliases": [
|
||||
"BT_NEXT"
|
||||
]
|
||||
@@ -65,6 +73,7 @@
|
||||
"0x7791": {
|
||||
"group": "connection",
|
||||
"key": "QK_BLUETOOTH_PROFILE_PREV",
|
||||
"label": "Bluetooth Profile Previous",
|
||||
"aliases": [
|
||||
"BT_PREV"
|
||||
]
|
||||
@@ -72,6 +81,7 @@
|
||||
"0x7792": {
|
||||
"group": "connection",
|
||||
"key": "QK_BLUETOOTH_UNPAIR",
|
||||
"label": "Unpair",
|
||||
"aliases": [
|
||||
"BT_UNPR"
|
||||
]
|
||||
@@ -79,6 +89,7 @@
|
||||
"0x7793": {
|
||||
"group": "connection",
|
||||
"key": "QK_BLUETOOTH_PROFILE1",
|
||||
"label": "Bluetooth Profile 1",
|
||||
"aliases": [
|
||||
"BT_PRF1"
|
||||
]
|
||||
@@ -86,6 +97,7 @@
|
||||
"0x7794": {
|
||||
"group": "connection",
|
||||
"key": "QK_BLUETOOTH_PROFILE2",
|
||||
"label": "Bluetooth Profile 2",
|
||||
"aliases": [
|
||||
"BT_PRF2"
|
||||
]
|
||||
@@ -93,6 +105,7 @@
|
||||
"0x7795": {
|
||||
"group": "connection",
|
||||
"key": "QK_BLUETOOTH_PROFILE3",
|
||||
"label": "Bluetooth Profile 3",
|
||||
"aliases": [
|
||||
"BT_PRF3"
|
||||
]
|
||||
@@ -100,6 +113,7 @@
|
||||
"0x7796": {
|
||||
"group": "connection",
|
||||
"key": "QK_BLUETOOTH_PROFILE4",
|
||||
"label": "Bluetooth Profile 4",
|
||||
"aliases": [
|
||||
"BT_PRF4"
|
||||
]
|
||||
@@ -107,6 +121,7 @@
|
||||
"0x7797": {
|
||||
"group": "connection",
|
||||
"key": "QK_BLUETOOTH_PROFILE5",
|
||||
"label": "Bluetooth Profile 5",
|
||||
"aliases": [
|
||||
"BT_PRF5"
|
||||
]
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
"0x7C7B": {
|
||||
"group": "quantum",
|
||||
"key": "QK_LAYER_LOCK",
|
||||
"label": "Layer Lock",
|
||||
"aliases": [
|
||||
"QK_LLCK"
|
||||
]
|
||||
|
||||
@@ -0,0 +1,265 @@
|
||||
{
|
||||
"ranges": {
|
||||
"0x5A40/0x003F": {
|
||||
"define": "QK_PLOVER_HID"
|
||||
}
|
||||
},
|
||||
"keycodes": {
|
||||
"0x5A40": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_S1"
|
||||
},
|
||||
"0x5A41": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_TL"
|
||||
},
|
||||
"0x5A42": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_KL"
|
||||
},
|
||||
"0x5A43": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_PL"
|
||||
},
|
||||
"0x5A44": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_WL"
|
||||
},
|
||||
"0x5A45": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_HL"
|
||||
},
|
||||
"0x5A46": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_RL"
|
||||
},
|
||||
"0x5A47": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_A"
|
||||
},
|
||||
"0x5A48": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_O"
|
||||
},
|
||||
"0x5A49": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_ST1"
|
||||
},
|
||||
"0x5A4A": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_E"
|
||||
},
|
||||
"0x5A4B": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_U"
|
||||
},
|
||||
"0x5A4C": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_FR"
|
||||
},
|
||||
"0x5A4D": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_RR"
|
||||
},
|
||||
"0x5A4E": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_PR"
|
||||
},
|
||||
"0x5A4F": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_BR"
|
||||
},
|
||||
"0x5A50": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_LR"
|
||||
},
|
||||
"0x5A51": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_GR"
|
||||
},
|
||||
"0x5A52": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_TR"
|
||||
},
|
||||
"0x5A53": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_SR"
|
||||
},
|
||||
"0x5A54": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_DR"
|
||||
},
|
||||
"0x5A55": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_ZR"
|
||||
},
|
||||
"0x5A56": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_N1"
|
||||
},
|
||||
"0x5A57": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_S2"
|
||||
},
|
||||
"0x5A58": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_ST2"
|
||||
},
|
||||
"0x5A59": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_ST3"
|
||||
},
|
||||
"0x5A5A": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_ST4"
|
||||
},
|
||||
"0x5A5B": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_N2"
|
||||
},
|
||||
"0x5A5C": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_N3"
|
||||
},
|
||||
"0x5A5D": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_N4"
|
||||
},
|
||||
"0x5A5E": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_N5"
|
||||
},
|
||||
"0x5A5F": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_N6"
|
||||
},
|
||||
"0x5A60": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_N7"
|
||||
},
|
||||
"0x5A61": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_N8"
|
||||
},
|
||||
"0x5A62": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_N9"
|
||||
},
|
||||
"0x5A63": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_NA"
|
||||
},
|
||||
"0x5A64": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_NB"
|
||||
},
|
||||
"0x5A65": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_NC"
|
||||
},
|
||||
"0x5A66": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_X1"
|
||||
},
|
||||
"0x5A67": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_X2"
|
||||
},
|
||||
"0x5A68": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_X3"
|
||||
},
|
||||
"0x5A69": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_X4"
|
||||
},
|
||||
"0x5A6A": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_X5"
|
||||
},
|
||||
"0x5A6B": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_X6"
|
||||
},
|
||||
"0x5A6C": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_X7"
|
||||
},
|
||||
"0x5A6D": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_X8"
|
||||
},
|
||||
"0x5A6E": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_X9"
|
||||
},
|
||||
"0x5A6F": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_X10"
|
||||
},
|
||||
"0x5A70": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_X11"
|
||||
},
|
||||
"0x5A71": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_X12"
|
||||
},
|
||||
"0x5A72": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_X13"
|
||||
},
|
||||
"0x5A73": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_X14"
|
||||
},
|
||||
"0x5A74": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_X15"
|
||||
},
|
||||
"0x5A75": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_X16"
|
||||
},
|
||||
"0x5A76": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_X17"
|
||||
},
|
||||
"0x5A77": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_X18"
|
||||
},
|
||||
"0x5A78": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_X19"
|
||||
},
|
||||
"0x5A79": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_X20"
|
||||
},
|
||||
"0x5A7A": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_X21"
|
||||
},
|
||||
"0x5A7B": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_X22"
|
||||
},
|
||||
"0x5A7C": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_X23"
|
||||
},
|
||||
"0x5A7D": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_X24"
|
||||
},
|
||||
"0x5A7E": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_X25"
|
||||
},
|
||||
"0x5A7F": {
|
||||
"group": "plover_hid",
|
||||
"key": "PLV_X26"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
{
|
||||
// This version exists to signify addition of split data sync support.
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
{
|
||||
// This version exists to signify addition of eeconfig support.
|
||||
}
|
||||
@@ -19,6 +19,8 @@
|
||||
// Audio
|
||||
"AUDIO_DEFAULT_ON": {"info_key": "audio.default.on", "value_type": "bool"},
|
||||
"AUDIO_DEFAULT_CLICKY_ON": {"info_key": "audio.default.clicky", "value_type": "bool"},
|
||||
"AUDIO_PIN": {"info_key": "audio.pins.0"},
|
||||
"AUDIO_PIN_ALT": {"info_key": "audio.pins.1"},
|
||||
"AUDIO_POWER_CONTROL_PIN": {"info_key": "audio.power_control.pin"},
|
||||
"AUDIO_POWER_CONTROL_PIN_ON_STATE": {"info_key": "audio.power_control.on_state", "value_type": "int" },
|
||||
"AUDIO_VOICES": {"info_key": "audio.voices", "value_type": "flag"},
|
||||
@@ -196,7 +198,7 @@
|
||||
|
||||
// Split Keyboard
|
||||
"SOFT_SERIAL_PIN": {"info_key": "split.serial.pin"},
|
||||
"SELECT_SOFT_SERIAL_SPEED": {"info_key": "split.serial.speed"},
|
||||
"SELECT_SOFT_SERIAL_SPEED": {"info_key": "split.serial.speed", "value_type": "int"},
|
||||
"SPLIT_HAND_MATRIX_GRID": {"info_key": "split.handedness.matrix_grid", "value_type": "array", "to_c": false},
|
||||
"SPLIT_HAND_PIN": {"info_key": "split.handedness.pin"},
|
||||
"SPLIT_USB_DETECT": {"info_key": "split.usb_detect.enabled", "value_type": "flag"},
|
||||
@@ -225,6 +227,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 +273,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}
|
||||
|
||||
@@ -11,6 +11,9 @@
|
||||
"on_state": 1
|
||||
},
|
||||
"debounce": 5,
|
||||
"dynamic_keymap": {
|
||||
"layer_count": 4
|
||||
},
|
||||
"features": {
|
||||
"command": false,
|
||||
"console": false
|
||||
|
||||
@@ -46,7 +46,8 @@
|
||||
"manufacturer": {"$ref": "./definitions.jsonschema#/text_identifier"},
|
||||
"url": {
|
||||
"type": "string",
|
||||
"format": "uri"
|
||||
"format": "uri",
|
||||
"minLength": 1
|
||||
},
|
||||
"development_board": {
|
||||
"type": "string",
|
||||
@@ -333,6 +334,17 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"dynamic_keymap": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"eeprom_max_addr": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||
"layer_count": {
|
||||
"type": "integer",
|
||||
"minimum": 1,
|
||||
"maximum": 32
|
||||
}
|
||||
}
|
||||
},
|
||||
"eeprom": {
|
||||
"properties": {
|
||||
"driver": {"type": "string"},
|
||||
@@ -981,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"},
|
||||
@@ -990,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"}
|
||||
|
||||
@@ -0,0 +1,75 @@
|
||||
# QMK Breaking Changes - 2026 Feb 22 Changelog
|
||||
|
||||
## Deprecation Notices
|
||||
|
||||
### Removal of deprecated GPIO defines ([#26028](https://github.com/qmk/qmk_firmware/pull/26028))
|
||||
|
||||
QMK has long used Arduino-style GPIO naming conventions. This has been confusing for users, as over time they've had new variations added, as well as users mistakenly thinking that QMK supports the rest of the Arduino ecosystem.
|
||||
|
||||
The decision was made to rename the GPIO manipulation functions with ones matching QMK Firmware's code styling.
|
||||
|
||||
Previous backwards compatibility has now been removed. see the [GPIO Control](../drivers/gpio#macros) documentation for more information.
|
||||
|
||||
### Removal of deprecated isLeftHand ([25897](https://github.com/qmk/qmk_firmware/pull/25897))
|
||||
|
||||
Users should 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;
|
||||
}
|
||||
```
|
||||
|
||||
The deprecated variable `isLeftHand` will be removed in a future breaking changes cycle.
|
||||
|
||||
## Full changelist
|
||||
|
||||
Core:
|
||||
* Refactor Makefile logic for locating keymaps ([#25808](https://github.com/qmk/qmk_firmware/pull/25808))
|
||||
* Move shutdown delay to audio feature ([#25859](https://github.com/qmk/qmk_firmware/pull/25859))
|
||||
* Refactor core use of deprecated `isLeftHand` ([#25888](https://github.com/qmk/qmk_firmware/pull/25888))
|
||||
* Allow custom data sync for community modules ([#25955](https://github.com/qmk/qmk_firmware/pull/25955))
|
||||
* Remove an unreachable break statement ([#26006](https://github.com/qmk/qmk_firmware/pull/26006))
|
||||
* Remove duplicate host.h ([#26007](https://github.com/qmk/qmk_firmware/pull/26007))
|
||||
* Remove redundant EEPROM update ([#26008](https://github.com/qmk/qmk_firmware/pull/26008))
|
||||
* Remove redundant unsigned comparison in apa102_set_brightness ([#26010](https://github.com/qmk/qmk_firmware/pull/26010))
|
||||
* Remove unused headers ([#26011](https://github.com/qmk/qmk_firmware/pull/26011))
|
||||
* Return INVALID_DEFERRED_TOKEN on allocation failure ([#26012](https://github.com/qmk/qmk_firmware/pull/26012))
|
||||
* Remove deprecated GPIO defines ([#26028](https://github.com/qmk/qmk_firmware/pull/26028))
|
||||
|
||||
CLI:
|
||||
* Enforce EOL when formatting files ([#24989](https://github.com/qmk/qmk_firmware/pull/24989))
|
||||
* Allow keymap.json to disable config flags ([#25502](https://github.com/qmk/qmk_firmware/pull/25502))
|
||||
* Remove unused `qmk.keymap.write_file`/`qmk.keymap.write_json` ([#25854](https://github.com/qmk/qmk_firmware/pull/25854))
|
||||
* Include userspace version (QMK_USERSPACE_VERSION) in version.h ([#25882](https://github.com/qmk/qmk_firmware/pull/25882))
|
||||
* Lint out-of-bounds bootmagic config ([#25899](https://github.com/qmk/qmk_firmware/pull/25899))
|
||||
* Report permission issues in `qmk doctor` ([#25931](https://github.com/qmk/qmk_firmware/pull/25931))
|
||||
* Minor alignment of CLI formatting commands ([#25946](https://github.com/qmk/qmk_firmware/pull/25946))
|
||||
* Update lint to validate keymap names ([#25969](https://github.com/qmk/qmk_firmware/pull/25969))
|
||||
* Add 'none of the above' to `new-keyboard` dev board prompt ([#25998](https://github.com/qmk/qmk_firmware/pull/25998))
|
||||
* Remove `config_h_features` from generated `info.json` ([#26024](https://github.com/qmk/qmk_firmware/pull/26024))
|
||||
* Promote duplication of defaults check to error ([#26025](https://github.com/qmk/qmk_firmware/pull/26025))
|
||||
|
||||
Keyboards:
|
||||
* Add Soldered Macro Pad ([#25834](https://github.com/qmk/qmk_firmware/pull/25834))
|
||||
* Remove redundant URLs from `.json` ([#25856](https://github.com/qmk/qmk_firmware/pull/25856))
|
||||
* Guard encoder behaviour on `projectcain/vault*` ([#25864](https://github.com/qmk/qmk_firmware/pull/25864))
|
||||
* Refactor keyboard/keymap use of deprecated `isLeftHand` ([#25891](https://github.com/qmk/qmk_firmware/pull/25891))
|
||||
* Remove some unnecessary matrix externs ([#25975](https://github.com/qmk/qmk_firmware/pull/25975))
|
||||
* Migrate ROW_SHIFTER to core MATRIX_ROW_SHIFTER ([#25977](https://github.com/qmk/qmk_firmware/pull/25977))
|
||||
|
||||
Keyboard fixes:
|
||||
* Fix out-of-bounds bootmagic config ([#25898](https://github.com/qmk/qmk_firmware/pull/25898))
|
||||
* Fix incorrect `matrix_scan_custom` implementations ([#25999](https://github.com/qmk/qmk_firmware/pull/25999))
|
||||
|
||||
Others:
|
||||
* Add missing labels to DD keycode definitions ([#25503](https://github.com/qmk/qmk_firmware/pull/25503))
|
||||
* Copilot instructions for pull requests ([#25857](https://github.com/qmk/qmk_firmware/pull/25857))
|
||||
|
||||
Bugs:
|
||||
* Fix flash wear leveling sector calculation ([#24776](https://github.com/qmk/qmk_firmware/pull/24776))
|
||||
* [Bugfix] WS2812 indexing in split boards ([#25407](https://github.com/qmk/qmk_firmware/pull/25407))
|
||||
* Correctly resolve keyboard alias during 'qmk new-keymap' ([#25570](https://github.com/qmk/qmk_firmware/pull/25570))
|
||||
* Fixes for is31fl3729 LED matrix driver off-by-one errors ([#25902](https://github.com/qmk/qmk_firmware/pull/25902))
|
||||
* Match Key override index type to bounds type to prevent overflow ([#25939](https://github.com/qmk/qmk_firmware/pull/25939))
|
||||
@@ -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
@@ -214,7 +214,7 @@
|
||||
{ "text": "My Pull Request Was Flagged", "link": "/breaking_changes_instructions" },
|
||||
{
|
||||
"text": "Most Recent ChangeLog",
|
||||
"link": "/ChangeLog/20251130"
|
||||
"link": "/ChangeLog/20260531"
|
||||
},
|
||||
{ "text": "Past Breaking Changes", "link": "/breaking_changes_history" },
|
||||
{ "text": "Deprecation Policy", "link": "/support_deprecation_policy" }
|
||||
|
||||
+11
-11
@@ -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)
|
||||
* [2025 May 25](ChangeLog/20250525)
|
||||
* [Older Breaking Changes](breaking_changes_history)
|
||||
|
||||
## When is the next Breaking Change?
|
||||
|
||||
The next Breaking Change is scheduled for February 22, 2026.
|
||||
The next Breaking Change is scheduled for Aug 30, 2026.
|
||||
|
||||
### Important Dates
|
||||
|
||||
* 2025 Nov 30 - `develop` is tagged with a new release version. Each push to `master` is subsequently merged to `develop` by GitHub actions.
|
||||
* 2026 Jan 25 - `develop` closed to new PRs.
|
||||
* 2026 Jan 25 - Call for testers.
|
||||
* 2026 Feb 8 - Last day for merges -- after this point `develop` is locked for testing and accepts only bugfixes
|
||||
* 2026 Feb 15 - `develop` is locked, only critical bugfix PRs merged.
|
||||
* 2026 Feb 20 - `master` is locked, no PRs merged.
|
||||
* 2026 Feb 22 - Merge `develop` to `master`.
|
||||
* 2026 Feb 22 - `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?
|
||||
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
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
|
||||
* [2025 May 25](ChangeLog/20250525) - version 0.29.0
|
||||
|
||||
+6
-35
@@ -4,47 +4,18 @@
|
||||
|
||||
The QMK CLI (command line interface) makes building and working with QMK keyboards easier. We have provided a number of commands to simplify and streamline tasks such as obtaining and compiling the QMK firmware, creating keymaps, and more.
|
||||
|
||||
### Requirements {#requirements}
|
||||
### Installation {#installation}
|
||||
|
||||
QMK requires Python 3.9 or greater. We try to keep the number of requirements small but you will also need to install the packages listed in [`requirements.txt`](https://github.com/qmk/qmk_firmware/blob/master/requirements.txt). These are installed automatically when you install the QMK CLI.
|
||||
|
||||
### Install Using Homebrew (macOS, some Linux) {#install-using-homebrew}
|
||||
|
||||
If you have installed [Homebrew](https://brew.sh) you can tap and install QMK:
|
||||
The recommended way to install the QMK CLI and all necessary dependencies (toolchains, flashing utilities, udev rules on Linux) is to use the bootstrapper script:
|
||||
|
||||
```
|
||||
brew install qmk/qmk/qmk
|
||||
export QMK_HOME='~/qmk_firmware' # Optional, set the location for `qmk_firmware`
|
||||
qmk setup # This will clone `qmk/qmk_firmware` and optionally set up your build environment
|
||||
curl -fsSL https://install.qmk.fm | sh
|
||||
```
|
||||
|
||||
### Install Using uv {#install-using-uv}
|
||||
|
||||
If you have installed [uv](https://docs.astral.sh/uv/), the QMK CLI can be installed and managed as a uv tool:
|
||||
For more options, run:
|
||||
|
||||
```
|
||||
uv tool install qmk
|
||||
export QMK_HOME='~/qmk_firmware' # Optional, set the location for `qmk_firmware`
|
||||
qmk setup # This will clone `qmk/qmk_firmware` and optionally set up your build environment
|
||||
curl -fsSL https://install.qmk.fm | sh -s -- --help
|
||||
```
|
||||
|
||||
This installation can be updated via `uv tool upgrade qmk`. See [Upgrading tools](https://docs.astral.sh/uv/guides/tools/#upgrading-tools) for more information.
|
||||
|
||||
### Install Using pip {#install-using-easy_install-or-pip}
|
||||
|
||||
If your system is not listed above you can install QMK manually. First ensure that you have Python 3.9 (or later) installed and have installed pip. Then install QMK with this command:
|
||||
|
||||
```
|
||||
python3 -m pip install qmk
|
||||
export QMK_HOME='~/qmk_firmware' # Optional, set the location for `qmk_firmware`
|
||||
qmk setup # This will clone `qmk/qmk_firmware` and optionally set up your build environment
|
||||
```
|
||||
|
||||
### Packaging For Other Operating Systems {#packaging-for-other-operating-systems}
|
||||
|
||||
We are looking for people to create and maintain a `qmk` package for more operating systems. If you would like to create a package for your OS please follow these guidelines:
|
||||
|
||||
* Follow best practices for your OS when they conflict with these guidelines
|
||||
* Document why in a comment when you do deviate
|
||||
* Install using a virtualenv
|
||||
* Instruct the user to set the environment variable `QMK_HOME` to have the firmware source checked out somewhere other than `~/qmk_firmware`.
|
||||
For detailed setup instructions, see [Setting Up Your QMK Environment](newbs_getting_started#set-up-your-environment).
|
||||
|
||||
@@ -12,11 +12,11 @@ If you intend to maintain keyboards and/or contribute to QMK, you can enable the
|
||||
|
||||
`qmk config user.developer=True`
|
||||
|
||||
This will allow you to see all available subcommands.
|
||||
**Note:** You will have to install additional requirements:
|
||||
```
|
||||
python3 -m pip install -r requirements-dev.txt
|
||||
```
|
||||
This will allow you to see all available subcommands.
|
||||
|
||||
::: tip
|
||||
If you installed QMK using the bootstrapper (`curl -fsSL https://install.qmk.fm | sh`), the development requirements are already installed.
|
||||
:::
|
||||
|
||||
# Subcommands
|
||||
|
||||
|
||||
@@ -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`
|
||||
|
||||
@@ -14,6 +14,10 @@ Example:
|
||||
This page covers my super cool feature. You can use this feature to make coffee, squeeze fresh oj, and have an egg mcmuffin and hashbrowns delivered from your local macca's by drone.
|
||||
```
|
||||
|
||||
# Paragraphs
|
||||
|
||||
Do not use hard line breaks within the raw Markdown for each paragraph. These are optional in Markdown, and have no effect on the rendered output. This means each raw paragraph will be a single long line in your editor (best viewed with line wrapping enabled).
|
||||
|
||||
# Headings
|
||||
|
||||
Your page should generally have multiple "H1" headings. Only H1 and H2 headings will included in the Table of Contents, so plan them out appropriately. Excess width should be avoided in H1 and H2 headings to prevent the Table of Contents from getting too wide.
|
||||
|
||||
+2
-5
@@ -19,13 +19,10 @@ Note that running `make` with `sudo` is generally ***not*** a good idea, and you
|
||||
|
||||
### Linux `udev` Rules {#linux-udev-rules}
|
||||
|
||||
On Linux, you'll need proper privileges to communicate with the bootloader device. You can either use `sudo` when flashing firmware (not recommended), or place [this file](https://github.com/qmk/qmk_firmware/tree/master/util/udev/50-qmk.rules) into `/etc/udev/rules.d/`.
|
||||
|
||||
Once added, run the following:
|
||||
On Linux, you'll need proper privileges to communicate with the bootloader device. You can either use `sudo` when flashing firmware (not recommended), or install the udev rules from the [qmk_udev](https://github.com/qmk/qmk_udev) repository by running:
|
||||
|
||||
```
|
||||
sudo udevadm control --reload-rules
|
||||
sudo udevadm trigger
|
||||
util/install_udev.sh
|
||||
```
|
||||
|
||||
**Note:** With older versions of ModemManager (< 1.12), filtering only works when not in strict mode. The following commands can update that setting:
|
||||
|
||||
+114
-6
@@ -1,14 +1,20 @@
|
||||
# Persistent Configuration (EEPROM)
|
||||
|
||||
This allows you to configure persistent settings for your keyboard. These settings are stored in the EEPROM of your controller, and are retained even after power loss. The settings can be read with `eeconfig_read_kb` and `eeconfig_read_user`, and can be written to using `eeconfig_update_kb` and `eeconfig_update_user`. This is useful for features that you want to be able to toggle (like toggling rgb layer indication). Additionally, you can use `eeconfig_init_kb` and `eeconfig_init_user` to set the default values for the EEPROM.
|
||||
|
||||
The complicated part here, is that there are a bunch of ways that you can store and access data via EEPROM, and there is no "correct" way to do this. However, you only have a DWORD (4 bytes) for each function.
|
||||
This allows you to configure persistent settings for your keyboard. These settings are stored in the EEPROM of your controller, and are retained even after power loss.
|
||||
|
||||
Keep in mind that EEPROM has a limited number of writes. While this is very high, it's not the only thing writing to the EEPROM, and if you write too often, you can potentially drastically shorten the life of your MCU.
|
||||
|
||||
* If you don't understand the example, then you may want to avoid using this feature, as it is rather complicated.
|
||||
::: tip
|
||||
If you don't understand the examples, then you may want to avoid using this feature, as it is rather complicated.
|
||||
:::
|
||||
|
||||
## Example Implementation
|
||||
## Basic
|
||||
|
||||
The settings can be read with `eeconfig_read_kb` and `eeconfig_read_user`, and can be written to using `eeconfig_update_kb` and `eeconfig_update_user`. This is useful for features that you want to be able to toggle (like toggling rgb layer indication). Additionally, you can use `eeconfig_init_kb` and `eeconfig_init_user` to set the default values for the EEPROM.
|
||||
|
||||
The complicated part here, is that there are a bunch of ways that you can store and access data via EEPROM, and there is no "correct" way to do this. However, you only have a DWORD (4 bytes) for each function.
|
||||
|
||||
### Example Implementation
|
||||
|
||||
This is an example of how to add settings, and read and write it. We're using the user keymap for the example here. This is a complex function, and has a lot going on. In fact, it uses a lot of the above functions to work!
|
||||
|
||||
@@ -126,9 +132,111 @@ void eeconfig_init_user(void) { // EEPROM is getting reset!
|
||||
|
||||
And you're done. The RGB layer indication will only work if you want it to. And it will be saved, even after unplugging the board. And if you use any of the RGB codes, it will disable the layer indication, so that it stays on the mode and color that you set it to.
|
||||
|
||||
## 'EECONFIG' Function Documentation
|
||||
### Basic API
|
||||
|
||||
* Keyboard/Revision: `void eeconfig_init_kb(void)`, `uint32_t eeconfig_read_kb(void)` and `void eeconfig_update_kb(uint32_t val)`
|
||||
* Keymap: `void eeconfig_init_user(void)`, `uint32_t eeconfig_read_user(void)` and `void eeconfig_update_user(uint32_t val)`
|
||||
|
||||
The `val` is the value of the data that you want to write to EEPROM. And the `eeconfig_read_*` function return a 32 bit (DWORD) value from the EEPROM.
|
||||
|
||||
## Datablock {#datablock}
|
||||
|
||||
An extended form exists that allows larger blocks of data to be allocated.
|
||||
|
||||
::: info
|
||||
When using datablock, the [basic API](#eeconfig-function-documentation) is unavailable.
|
||||
:::
|
||||
|
||||
:::::tabs
|
||||
|
||||
==== keyboard
|
||||
|
||||
In `config.h`, define the size required, and optionally a version number:
|
||||
|
||||
| Define | Default | Description |
|
||||
|------------------------------|---------------------------|------------------------------------------------------------------|
|
||||
| `EECONFIG_KB_DATA_SIZE` | `0` | Size in bytes for the persistent block of data |
|
||||
| `EECONFIG_KB_DATA_VERSION` | `EECONFIG_KB_DATA_SIZE` | Version number that can be incremented to invalidate stored data |
|
||||
|
||||
Which exposes the following API:
|
||||
|
||||
```c
|
||||
bool eeconfig_is_kb_datablock_valid(void);
|
||||
uint32_t eeconfig_read_kb_datablock(void *data, uint32_t offset, uint32_t length) __attribute__((nonnull));
|
||||
uint32_t eeconfig_update_kb_datablock(const void *data, uint32_t offset, uint32_t length) __attribute__((nonnull));
|
||||
void eeconfig_init_kb_datablock(void);
|
||||
# define eeconfig_read_kb_datablock_field(__object, __field) eeconfig_read_kb_datablock(&(__object.__field), offsetof(typeof(__object), __field), sizeof(__object.__field))
|
||||
# define eeconfig_update_kb_datablock_field(__object, __field) eeconfig_update_kb_datablock(&(__object.__field), offsetof(typeof(__object), __field), sizeof(__object.__field))
|
||||
```
|
||||
|
||||
==== keymap
|
||||
|
||||
In `config.h`, define the size required, and optionally a version number:
|
||||
|
||||
| Define | Default | Description |
|
||||
|------------------------------|---------------------------|------------------------------------------------------------------|
|
||||
| `EECONFIG_USER_DATA_SIZE` | `0` | Size in bytes for the persistent block of data |
|
||||
| `EECONFIG_USER_DATA_VERSION` | `EECONFIG_USER_DATA_SIZE` | Version number that can be incremented to invalidate stored data |
|
||||
|
||||
Which exposes the following API:
|
||||
|
||||
```c
|
||||
bool eeconfig_is_user_datablock_valid(void);
|
||||
uint32_t eeconfig_read_user_datablock(void *data, uint32_t offset, uint32_t length) __attribute__((nonnull));
|
||||
uint32_t eeconfig_update_user_datablock(const void *data, uint32_t offset, uint32_t length) __attribute__((nonnull));
|
||||
void eeconfig_init_user_datablock(void);
|
||||
# define eeconfig_read_user_datablock_field(__object, __field) eeconfig_read_user_datablock(&(__object.__field), offsetof(typeof(__object), __field), sizeof(__object.__field))
|
||||
# define eeconfig_update_user_datablock_field(__object, __field) eeconfig_update_user_datablock(&(__object.__field), offsetof(typeof(__object), __field), sizeof(__object.__field))
|
||||
```
|
||||
|
||||
:::::
|
||||
|
||||
### Example
|
||||
|
||||
This is an example of how to add settings, and read and write it. We're using the user keymap for the example here.
|
||||
|
||||
In your `config.h` add:
|
||||
|
||||
```c
|
||||
#define EECONFIG_USER_DATA_SIZE 8
|
||||
```
|
||||
|
||||
In your keymap.c file, add:
|
||||
|
||||
```c
|
||||
#include "debug.h"
|
||||
#include "timer.h"
|
||||
#include "eeconfig.h"
|
||||
|
||||
typedef struct my_config_t {
|
||||
uint64_t data;
|
||||
} my_config_t;
|
||||
|
||||
static my_config_t config;
|
||||
|
||||
void keyboard_post_init_user(void) {
|
||||
if (!eeconfig_is_user_datablock_valid()) {
|
||||
eeconfig_init_user_datablock();
|
||||
}
|
||||
|
||||
eeconfig_read_user_datablock(&config, 0, sizeof(my_config_t));
|
||||
}
|
||||
|
||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
if (!record->event.pressed) {
|
||||
config.data += 1;
|
||||
eeconfig_update_user_datablock(&config, 0, sizeof(my_config_t));
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void housekeeping_task_user(void) {
|
||||
static uint32_t last_sync = 0;
|
||||
if (timer_elapsed32(last_sync) > 1000) {
|
||||
last_sync = timer_read32();
|
||||
|
||||
dprintf("Config: %ld\n", config.data);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
@@ -51,7 +51,7 @@ Sometimes you need more than one base layer. For example, if you want to switch
|
||||
|
||||
### Advanced Users {#advanced-users}
|
||||
|
||||
Once you have a good feel for how layers work and what you can do, you can get more creative. The rules listed in the beginner section will help you be successful by avoiding some of the tricker details but they can be constraining, especially for ultra-compact keyboard users. Understanding how layers work will allow you to use them in more advanced ways.
|
||||
Once you have a good feel for how layers work and what you can do, you can get more creative. The rules listed in the beginner section will help you be successful by avoiding some of the trickier details but they can be constraining, especially for ultra-compact keyboard users. Understanding how layers work will allow you to use them in more advanced ways.
|
||||
|
||||
Layers stack on top of each other in numerical order. When determining what a keypress does, QMK scans the layers from the top down, stopping when it reaches the first active layer that is not set to `KC_TRNS`. As a result if you activate a layer that is numerically lower than your current layer, and your current layer (or another layer that is active and higher than your target layer) has something other than `KC_TRNS`, that is the key that will be sent, not the key on the layer you just activated. This is the cause of most people's "why doesn't my layer get switched" problem.
|
||||
|
||||
|
||||
@@ -95,6 +95,10 @@ The use of `features` matches the definition normally provided within `keyboard.
|
||||
|
||||
The `keycodes` array allows a module to provide new keycodes (as well as corresponding aliases) to a keymap.
|
||||
|
||||
### `config.h`
|
||||
|
||||
This file will be automatically added to the build as if it were present in the keyboard or keymap.
|
||||
|
||||
### `rules.mk` / `post_rules.mk`
|
||||
|
||||
These two files follows standard QMK build system logic, allowing for `Makefile`-style customisation as if it were present in the keyboard or keymap.
|
||||
@@ -131,24 +135,45 @@ This file defines LED matrix effects in the same form as used with `led_matrix_k
|
||||
|
||||
This file defines RGB matrix effects in the same form as used with `rgb_matrix_kb.inc` and `rgb_matrix_user.inc` (see [Custom RGB Matrix Effects](rgb_matrix#custom-rgb-matrix-effects)). Effect mode names are prepended with `RGB_MATRIX_COMMUNITY_MODULE_`.
|
||||
|
||||
### Additional Customization
|
||||
|
||||
#### Split Keyboard Data Sync
|
||||
|
||||
Defines follow the convention, `SPLIT_TRANSACTION_IDS_MODULE_<MODULE>` (see [Custom data sync](split_keyboard#custom-data-sync)).
|
||||
|
||||
#### Persistent Configuration
|
||||
|
||||
Defines follow the convention, `EECONFIG_MODULE_<MODULE>_DATA_SIZE` and `EECONFIG_MODULE_<MODULE>_DATA_VERSION` (see [Custom Persistent Configuration](../feature_eeprom#datablock)).
|
||||
|
||||
When configured, the following APIs are available:
|
||||
|
||||
| API Format | Example (`hello_world` module) | API Version |
|
||||
|--------------------------------------------|-----------------------------------------------|-------------|
|
||||
| `eeconfig_is_<module>_datablock_valid` | `eeconfig_is_hello_world_datablock_valid` | `1.1.3` |
|
||||
| `eeconfig_read_<module>_datablock` | `eeconfig_read_hello_world_datablock` | `1.1.3` |
|
||||
| `eeconfig_update_<module>_datablock` | `eeconfig_update_hello_world_datablock` | `1.1.3` |
|
||||
| `eeconfig_init_<module>_datablock` | `eeconfig_init_hello_world_datablock` | `1.1.3` |
|
||||
| `eeconfig_read_<module>_datablock_field` | `eeconfig_read_hello_world_datablock_field` | `1.1.3` |
|
||||
| `eeconfig_update_<module>_datablock_field` | `eeconfig_update_hello_world_datablock_field` | `1.1.3` |
|
||||
|
||||
### Compatible APIs
|
||||
|
||||
Community Modules may provide specializations for the following APIs:
|
||||
|
||||
| Base API | API Format | Example (`hello_world` module) | API Version |
|
||||
|----------------------------------|-------------------------------------------|---------------------------------------------|-------------|
|
||||
| `keyboard_pre_init` | `keyboard_pre_init_<module>` | `keyboard_pre_init_hello_world` | `0.1.0` |
|
||||
| `keyboard_post_init` | `keyboard_post_init_<module>` | `keyboard_post_init_hello_world` | `0.1.0` |
|
||||
| `pre_process_record` | `pre_process_record_<module>` | `pre_process_record_hello_world` | `0.1.0` |
|
||||
| `process_record` | `process_record_<module>` | `process_record_hello_world` | `0.1.0` |
|
||||
| `post_process_record` | `post_process_record_<module>` | `post_process_record_hello_world` | `0.1.0` |
|
||||
| `housekeeping_task` | `housekeeping_task_<module>` | `housekeeping_task_hello_world` | `1.0.0` |
|
||||
| `suspend_power_down` | `suspend_power_down_<module>` | `suspend_power_down_hello_world` | `1.0.0` |
|
||||
| `suspend_wakeup_init` | `suspend_wakeup_init_<module>` | `suspend_wakeup_init_hello_world` | `1.0.0` |
|
||||
| `shutdown` | `shutdown_<module>` | `shutdown_hello_world` | `1.0.0` |
|
||||
| `process_detected_host_os` | `process_detected_host_os_<module>` | `process_detected_host_os_hello_world` | `1.0.0` |
|
||||
| `default_layer_state_set` | `default_layer_state_set_<module>` | `default_layer_state_set_hello_world` | `1.1.0` |
|
||||
| `layer_state_set` | `layer_state_set_<module>` | `layer_state_set_hello_world` | `1.1.0` |
|
||||
| Base API | API Format | Example (`hello_world` module) | API Version |
|
||||
|----------------------------------|-------------------------------------------|----------------------------------------------|-------------|
|
||||
| `keyboard_pre_init` | `keyboard_pre_init_<module>` | `keyboard_pre_init_hello_world` | `0.1.0` |
|
||||
| `keyboard_post_init` | `keyboard_post_init_<module>` | `keyboard_post_init_hello_world` | `0.1.0` |
|
||||
| `pre_process_record` | `pre_process_record_<module>` | `pre_process_record_hello_world` | `0.1.0` |
|
||||
| `process_record` | `process_record_<module>` | `process_record_hello_world` | `0.1.0` |
|
||||
| `post_process_record` | `post_process_record_<module>` | `post_process_record_hello_world` | `0.1.0` |
|
||||
| `housekeeping_task` | `housekeeping_task_<module>` | `housekeeping_task_hello_world` | `1.0.0` |
|
||||
| `suspend_power_down` | `suspend_power_down_<module>` | `suspend_power_down_hello_world` | `1.0.0` |
|
||||
| `suspend_wakeup_init` | `suspend_wakeup_init_<module>` | `suspend_wakeup_init_hello_world` | `1.0.0` |
|
||||
| `shutdown` | `shutdown_<module>` | `shutdown_hello_world` | `1.0.0` |
|
||||
| `process_detected_host_os` | `process_detected_host_os_<module>` | `process_detected_host_os_hello_world` | `1.0.0` |
|
||||
| `default_layer_state_set` | `default_layer_state_set_<module>` | `default_layer_state_set_hello_world` | `1.1.0` |
|
||||
| `layer_state_set` | `layer_state_set_<module>` | `layer_state_set_hello_world` | `1.1.0` |
|
||||
| `led_matrix_indicators` | `led_matrix_indicators_<module>` | `led_matrix_indicators_hello_world` | `1.1.0` |
|
||||
| `led_matrix_indicators_advanced` | `led_matrix_indicators_advanced_<module>` | `led_matrix_indicators_advanced_hello_world` | `1.1.0` |
|
||||
| `rgb_matrix_indicators` | `rgb_matrix_indicators_<module>` | `rgb_matrix_indicators_hello_world` | `1.1.0` |
|
||||
@@ -156,7 +181,6 @@ Community Modules may provide specializations for the following APIs:
|
||||
| `pointing_device_init` | `pointing_device_init_<module>` | `pointing_device_init_hello_world` | `1.1.0` |
|
||||
| `pointing_device_task` | `pointing_device_task_<module>` | `pointing_device_task_hello_world` | `1.1.0` |
|
||||
|
||||
|
||||
::: info
|
||||
An unspecified API is disregarded if a Community Module does not provide a specialization for it.
|
||||
:::
|
||||
|
||||
@@ -47,6 +47,17 @@ const key_override_t *key_overrides[] = {
|
||||
};
|
||||
```
|
||||
|
||||
This second example inverts or swaps semicolon and colon on ANSI and many other layouts. That means pressing the key alone sends `shift` + `semicolon` giving `colon` (`S(KP_SCLN)` aka `KC_COLN`), but when pressing the key with shift, the shift modifier is suppressed (see `suppressed_mods` below), sending only `semicolon` (`KC_SCLN`):
|
||||
|
||||
```c
|
||||
const key_override_t semicolon_colon_key_override = ko_make_basic(MOD_MASK_SHIFT, KC_COLN, KC_SCLN);
|
||||
|
||||
// This globally defines all key overrides to be used
|
||||
const key_override_t *key_overrides[] = {
|
||||
&semicolon_colon_key_override
|
||||
};
|
||||
```
|
||||
|
||||
## Intermediate Difficulty Examples {#intermediate-difficulty-examples}
|
||||
|
||||
### Media Controls & Screen Brightness {#media-controls-amp-screen-brightness}
|
||||
|
||||
@@ -77,6 +77,7 @@ Tips:
|
||||
* For smoother cursor movements, lower the value of `MOUSEKEY_INTERVAL`. If the refresh rate of your display is 60Hz, you could set it to `16` (1/60). As this raises the cursor speed significantly, you may want to lower `MOUSEKEY_MAX_SPEED`.
|
||||
* Setting `MOUSEKEY_TIME_TO_MAX` or `MOUSEKEY_WHEEL_TIME_TO_MAX` to `0` will disable acceleration for the cursor or scrolling respectively. This way you can make one of them constant while keeping the other accelerated, which is not possible in constant speed mode.
|
||||
* Setting `MOUSEKEY_WHEEL_INTERVAL` too low will make scrolling too fast. Setting it too high will make scrolling too slow when the wheel key is held down.
|
||||
* `MS_ACL0`, `MS_ACL1` and `MS_ACL2` change the cursor and scroll speed to 1/4, 1/2, and the maximum speed, respectively.
|
||||
|
||||
Cursor acceleration uses the same algorithm as the X Window System MouseKeysAccel feature. You can read more about it [on Wikipedia](https://en.wikipedia.org/wiki/Mouse_keys).
|
||||
|
||||
|
||||
@@ -136,12 +136,19 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
print_stored_setups();
|
||||
}
|
||||
return false;
|
||||
default:
|
||||
return true; // Process all other keycodes normally
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Then please open an issue on Github with this information and tell what OS was not detected correctly and if you have any intermediate devices between keyboard and your computer.
|
||||
Add both `STORE_SETUPS` and `PRINT_SETUPS` to your keyboard's keymap. Connect the keyboard to the device where the OS was not recognised, and press the `STORE_SETUPS` key to capture and store the fingerprint. On your development computer, run one of the suggested [console debugging tools](/faq_debug#debugging-tools), connect the keyboard, and press the `PRINT_SETUPS` key. The console should display multiple lines of data from the most recent `STORE_SETUPS` run.
|
||||
|
||||
Open an issue on GitHub and paste the console output into the issue. Also tell us which OS (including the version, if possible) was not detected correctly and whether any intermediate devices, such as a USB hub, were used between the keyboard and the target device.
|
||||
|
||||
::: tip
|
||||
If `STORE_SETUPS` has not been used previously, `PRINT_SETUPS` will report whatever values are already present in the controller's EEPROM. These may appear as random numbers.
|
||||
:::
|
||||
|
||||
## Credits
|
||||
|
||||
|
||||
@@ -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).
|
||||
|
||||
@@ -166,7 +166,7 @@ In your keyboard config.h:
|
||||
|
||||
The `PIO` subsystem is a Raspberry Pi RP2040 specific implementation, using the integrated PIO peripheral and is therefore only available on this MCU.
|
||||
|
||||
There are strict requirements for pin ordering but any pair of GPIO pins can be used. The GPIO used for clock must be directly after data, see the included info.json snippet for an example of correct order.
|
||||
The GPIOs used for clock and data must be consecutive (in either order).
|
||||
|
||||
You may optionally switch the PIO peripheral used with the following define in config.h:
|
||||
```c
|
||||
|
||||
@@ -6,11 +6,12 @@ The [Open Steno Project](https://www.openstenoproject.org/) has built an open-so
|
||||
|
||||
## Steno Support in QMK
|
||||
|
||||
There are three ways that QMK keyboards can support steno, with varying degrees of configuration required:
|
||||
There are four ways that QMK keyboards can support steno, with varying degrees of configuration required:
|
||||
|
||||
1. Plover with [Arpeggiation](https://plover.wiki/index.php/Glossary#Arpeggiate) requires no changes to any keyboard and is supported by QMK as well as any other QWERTY keyboard.
|
||||
2. Plover with [NKRO](https://plover.wiki/index.php/Using_a_standard_keyboard_with_Plover#NKRO). If your keyboard supports NKRO in hardware and you have NKRO enabled as a USB endpoint, you can chord with the keyboard. Many devices will arrive stock like this and will require no changes.
|
||||
3. Steno Machine Protocols. This requires the most configuration, but this has the advantage of allowing you to use your keyboard keys normally (either on another layer or another piece of hardware) without enabling and disabling your steno software.
|
||||
4. Plover HID Protocol. This is a custom HID protocol that Plover can understand, but does not require a COM port. It is robust to device disconnects and saves an interface over the COM-based alternatives.
|
||||
|
||||
## Plover with QWERTY Keyboard {#plover-with-qwerty-keyboard}
|
||||
|
||||
@@ -92,6 +93,22 @@ Examples of steno strokes and the associated packet:
|
||||
- `WAZ` = `10000000 00000010 00100000 00000000 00000000 00000001`
|
||||
- `PHAPBGS` = `10000000 00000101 00100000 00000000 01101010 00000000`
|
||||
|
||||
## Plover HID Protocol {#plover-hid-protocol}
|
||||
|
||||
This mode operates independently of the other Steno "official" machine protocols. Like any other mouse or keyboard, it uses the USB HID protocol to communicate with Plover by sending an 8 byte (64 bit) packet representing a bitfield for all the possible keys on a steno machine plus a number of additional general purpose keys for custom use. This protocol is only understood by Plover as of [5.1.0](https://github.com/opensteno/plover/releases/tag/v5.1.0).
|
||||
|
||||
Add
|
||||
|
||||
```make
|
||||
PLOVER_HID_ENABLE = yes
|
||||
```
|
||||
|
||||
to your `rules.mk` file. This does **not** require `STENO_ENABLE` to be set.
|
||||
|
||||
All of the possible keycodes are defined with the `PLV_` prefix and are available without any additional includes.
|
||||
|
||||
More details can be found here: https://github.com/dnaq/plover-machine-hid
|
||||
|
||||
### Switching protocols on the fly {#switching-protocols-on-the-fly}
|
||||
|
||||
If you wish to switch the serial protocol used to transfer the steno chords without having to recompile your keyboard firmware every time, you can press the `QK_STENO_BOLT` and `QK_STENO_GEMINI` keycodes in order to switch protocols on the fly.
|
||||
|
||||
@@ -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 |
|
||||
|-------------------|-------|-----------------------------------------------------------|
|
||||
|
||||
+2
-2
@@ -217,8 +217,8 @@ To generate this bootloader, use the `bootloader` target, eg. `make planck/rev4:
|
||||
|
||||
Compatible flashers:
|
||||
|
||||
* TBD
|
||||
* Currently, you need to either use the [Python script](https://github.com/qmk/lufa/tree/master/Bootloaders/HID/HostLoaderApp_python), or compile [`hid_bootloader_cli`](https://github.com/qmk/lufa/tree/master/Bootloaders/HID/HostLoaderApp), from the LUFA repo. Homebrew may (will) have support for this directly (via `brew install qmk/qmk/hid_bootloader_cli`).
|
||||
* [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases) (recommended GUI)
|
||||
* [hid_bootloader_cli](https://github.com/qmk/lufa/tree/master/Bootloaders/HID/HostLoaderApp) / `:qmk-hid` target in QMK (recommended command line)
|
||||
|
||||
Flashing sequence:
|
||||
|
||||
|
||||
@@ -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`
|
||||
|
||||
|
||||
@@ -33,11 +33,13 @@ If you own a board from one of the following vendors already, consider asking th
|
||||
| iLovBee | Official 30-day copyright source code request issued Sep 11 2024 due to deception on PR, no response received. Ambiguity on PRs -- marketing says wireless, PR author said wired-only, then included wireless code anyway. Seemingly intentionally deceptive. |
|
||||
| KiiBOOM | Seems to use the same OEM as Epomaker, same problems. |
|
||||
| kprepublic | Makes no attempt to release source code, all boards in QMK are reverse-engineered, created, and supported by the community. New board variants magically appear without telling customers they're incompatible with existing QMK versions, in some cases bricking boards or requiring ISP flashing. |
|
||||
| Lofree | Selling tri-mode boards based on QMK without sources, just `via.json` provided. |
|
||||
| Luminkey | Selling tri-mode boards based on QMK without sources, just `via.json` provided. |
|
||||
| Meletrix | Selling tri-mode boards based on QMK without sources, just `via.json` provided. |
|
||||
| mmd / Smartmmd / i-game.tech | Ambiguity on PRs -- marketing says wireless, PR author said wired-only, then included wireless code anyway. Seemingly intentionally deceptive. |
|
||||
| MyKeyClub | Community-supported JRIS75, vendor was contacted by community members and refused to cooperate. |
|
||||
| owlab | Selling wired based on QMK without sources, just `via.json` provided. Ambiguous as to whether or not wireless firmware is based on QMK, given that their configuration tool looks very similar to VIA. |
|
||||
| PMO Lab | Selling tri-mode boards based on QMK without sources, just `via.json` provided. |
|
||||
| pressplayid | Selling wired and tri-mode boards based on QMK without sources, just `via.json` provided |
|
||||
| qwertykeys | Selling wired and tri-mode boards based on QMK without sources, just `via.json` provided. |
|
||||
| Redragon | Selling tri-mode boards based on QMK without sources, attempted upstreaming crippled firmware without wireless. |
|
||||
|
||||
@@ -75,6 +75,8 @@ curl -fsSL https://install.qmk.fm | sh
|
||||
|
||||
::: info
|
||||
Many Linux distributions are supported, but not all. Mainstream distributions will have best success -- if possible, choose either Debian or its derivatives (such as Ubuntu, or Mint), CentOS or its derivatives (such as Fedora, or Rocky Linux), and Arch or its derivatives (such as Manjaro, or CachyOS).
|
||||
|
||||
**The standard QMK build environment installed below does not support `musl`-based Linux distributions.**
|
||||
:::
|
||||
|
||||
Install the QMK CLI by running:
|
||||
|
||||
File diff suppressed because one or more lines are too long
|
Before Width: | Height: | Size: 6.4 KiB After Width: | Height: | Size: 6.4 KiB |
File diff suppressed because one or more lines are too long
|
Before Width: | Height: | Size: 6.2 KiB After Width: | Height: | Size: 6.2 KiB |
+24
-1
@@ -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?
|
||||
|
||||
|
||||
@@ -2,65 +2,68 @@
|
||||
// A simple ringbuffer holding Size elements of type T
|
||||
template <typename T, uint8_t Size>
|
||||
class RingBuffer {
|
||||
protected:
|
||||
T buf_[Size];
|
||||
uint8_t head_{0}, tail_{0};
|
||||
public:
|
||||
inline uint8_t nextPosition(uint8_t position) {
|
||||
return (position + 1) % Size;
|
||||
}
|
||||
protected:
|
||||
T buf_[Size];
|
||||
uint8_t head_{0}, tail_{0};
|
||||
|
||||
inline uint8_t prevPosition(uint8_t position) {
|
||||
if (position == 0) {
|
||||
return Size - 1;
|
||||
}
|
||||
return position - 1;
|
||||
}
|
||||
|
||||
inline bool enqueue(const T &item) {
|
||||
static_assert(Size > 1, "RingBuffer size must be > 1");
|
||||
uint8_t next = nextPosition(head_);
|
||||
if (next == tail_) {
|
||||
// Full
|
||||
return false;
|
||||
public:
|
||||
inline uint8_t nextPosition(uint8_t position) {
|
||||
return (position + 1) % Size;
|
||||
}
|
||||
|
||||
buf_[head_] = item;
|
||||
head_ = next;
|
||||
return true;
|
||||
}
|
||||
|
||||
inline bool get(T &dest, bool commit = true) {
|
||||
auto tail = tail_;
|
||||
if (tail == head_) {
|
||||
// No more data
|
||||
return false;
|
||||
inline uint8_t prevPosition(uint8_t position) {
|
||||
if (position == 0) {
|
||||
return Size - 1;
|
||||
}
|
||||
return position - 1;
|
||||
}
|
||||
|
||||
dest = buf_[tail];
|
||||
tail = nextPosition(tail);
|
||||
inline bool enqueue(const T &item) {
|
||||
static_assert(Size > 1, "RingBuffer size must be > 1");
|
||||
uint8_t next = nextPosition(head_);
|
||||
if (next == tail_) {
|
||||
// Full
|
||||
return false;
|
||||
}
|
||||
|
||||
if (commit) {
|
||||
tail_ = tail;
|
||||
buf_[head_] = item;
|
||||
head_ = next;
|
||||
return true;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
inline bool empty() const { return head_ == tail_; }
|
||||
inline bool get(T &dest, bool commit = true) {
|
||||
auto tail = tail_;
|
||||
if (tail == head_) {
|
||||
// No more data
|
||||
return false;
|
||||
}
|
||||
|
||||
inline uint8_t size() const {
|
||||
int diff = head_ - tail_;
|
||||
if (diff >= 0) {
|
||||
return diff;
|
||||
dest = buf_[tail];
|
||||
tail = nextPosition(tail);
|
||||
|
||||
if (commit) {
|
||||
tail_ = tail;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return Size + diff;
|
||||
}
|
||||
|
||||
inline T& front() {
|
||||
return buf_[tail_];
|
||||
}
|
||||
inline bool empty() const {
|
||||
return head_ == tail_;
|
||||
}
|
||||
|
||||
inline bool peek(T &item) {
|
||||
return get(item, false);
|
||||
}
|
||||
inline uint8_t size() const {
|
||||
int diff = head_ - tail_;
|
||||
if (diff >= 0) {
|
||||
return diff;
|
||||
}
|
||||
return Size + diff;
|
||||
}
|
||||
|
||||
inline T &front() {
|
||||
return buf_[tail_];
|
||||
}
|
||||
|
||||
inline bool peek(T &item) {
|
||||
return get(item, false);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -27,8 +27,6 @@
|
||||
# define ENCODER_DEFAULT_PIN_API_IMPL
|
||||
#endif
|
||||
|
||||
extern volatile bool isLeftHand;
|
||||
|
||||
__attribute__((weak)) void encoder_quadrature_init_pin(uint8_t index, bool pad_b);
|
||||
__attribute__((weak)) uint8_t encoder_quadrature_read_pin(uint8_t index, bool pad_b);
|
||||
|
||||
@@ -108,10 +106,10 @@ void encoder_quadrature_post_init(void) {
|
||||
|
||||
void encoder_driver_init(void) {
|
||||
#ifdef SPLIT_KEYBOARD
|
||||
thisHand = isLeftHand ? 0 : NUM_ENCODERS_LEFT;
|
||||
thisHand = is_keyboard_left() ? 0 : NUM_ENCODERS_LEFT;
|
||||
thatHand = NUM_ENCODERS_LEFT - thisHand;
|
||||
thisCount = isLeftHand ? NUM_ENCODERS_LEFT : NUM_ENCODERS_RIGHT;
|
||||
thatCount = isLeftHand ? NUM_ENCODERS_RIGHT : NUM_ENCODERS_LEFT;
|
||||
thisCount = is_keyboard_left() ? NUM_ENCODERS_LEFT : NUM_ENCODERS_RIGHT;
|
||||
thatCount = is_keyboard_left() ? NUM_ENCODERS_RIGHT : NUM_ENCODERS_LEFT;
|
||||
#else // SPLIT_KEYBOARD
|
||||
thisCount = NUM_ENCODERS;
|
||||
#endif
|
||||
@@ -133,7 +131,7 @@ void encoder_driver_init(void) {
|
||||
|
||||
#if defined(SPLIT_KEYBOARD) && defined(ENCODER_A_PINS_RIGHT) && defined(ENCODER_B_PINS_RIGHT)
|
||||
// Re-initialise the pads if it's the right-hand side
|
||||
if (!isLeftHand) {
|
||||
if (!is_keyboard_left()) {
|
||||
const pin_t encoders_pad_a_right[] = ENCODER_A_PINS_RIGHT;
|
||||
const pin_t encoders_pad_b_right[] = ENCODER_B_PINS_RIGHT;
|
||||
for (uint8_t i = 0; i < thisCount; i++) {
|
||||
|
||||
@@ -145,8 +145,6 @@ void apa102_flush(void) {
|
||||
void apa102_set_brightness(uint8_t brightness) {
|
||||
if (brightness > APA102_MAX_BRIGHTNESS) {
|
||||
apa102_led_brightness = APA102_MAX_BRIGHTNESS;
|
||||
} else if (brightness < 0) {
|
||||
apa102_led_brightness = 0;
|
||||
} else {
|
||||
apa102_led_brightness = brightness;
|
||||
}
|
||||
|
||||
@@ -107,7 +107,7 @@ void is31fl3729_write_pwm_buffer(uint8_t index) {
|
||||
// Transmit PWM registers in 11 transfers of 13 bytes.
|
||||
|
||||
// Iterate over the pwm_buffer contents at 13 byte intervals.
|
||||
for (uint8_t i = 0; i <= IS31FL3729_PWM_REGISTER_COUNT; i += 13) {
|
||||
for (uint8_t i = 0; i < IS31FL3729_PWM_REGISTER_COUNT; i += 13) {
|
||||
#if IS31FL3729_I2C_PERSISTENCE > 0
|
||||
for (uint8_t j = 0; j < IS31FL3729_I2C_PERSISTENCE; j++) {
|
||||
if (i2c_write_register(i2c_addresses[index] << 1, IS31FL3729_REG_PWM + i, driver_buffers[index].pwm_buffer + i, 13, IS31FL3729_I2C_TIMEOUT) == I2C_STATUS_SUCCESS) break;
|
||||
@@ -182,7 +182,7 @@ void is31fl3729_set_scaling_register(uint8_t index, uint8_t value) {
|
||||
// need to do a bit of checking here since 3729 scaling is per CS pin.
|
||||
// not the usual per single LED key as per other ISSI drivers
|
||||
// only enable them, since they should be default disabled
|
||||
int cs_value = (led.v & 0x0F) - 1;
|
||||
int cs_value = (led.v & 0x0F);
|
||||
|
||||
driver_buffers[led.driver].scaling_buffer[cs_value] = value;
|
||||
driver_buffers[led.driver].scaling_buffer_dirty = true;
|
||||
|
||||
@@ -107,7 +107,7 @@ void is31fl3729_write_pwm_buffer(uint8_t index) {
|
||||
// Transmit PWM registers in 11 transfers of 13 bytes.
|
||||
|
||||
// Iterate over the pwm_buffer contents at 13 byte intervals.
|
||||
for (uint8_t i = 0; i <= IS31FL3729_PWM_REGISTER_COUNT; i += 13) {
|
||||
for (uint8_t i = 0; i < IS31FL3729_PWM_REGISTER_COUNT; i += 13) {
|
||||
#if IS31FL3729_I2C_PERSISTENCE > 0
|
||||
for (uint8_t j = 0; j < IS31FL3729_I2C_PERSISTENCE; j++) {
|
||||
if (i2c_write_register(i2c_addresses[index] << 1, IS31FL3729_REG_PWM + i, driver_buffers[index].pwm_buffer + i, 13, IS31FL3729_I2C_TIMEOUT) == I2C_STATUS_SUCCESS) break;
|
||||
@@ -184,9 +184,9 @@ void is31fl3729_set_scaling_register(uint8_t index, uint8_t red, uint8_t green,
|
||||
// need to do a bit of checking here since 3729 scaling is per CS pin.
|
||||
// not the usual per RGB key as per other ISSI drivers
|
||||
// only enable them, since they should be default disabled
|
||||
int cs_red = (led.r & 0x0F) - 1;
|
||||
int cs_green = (led.g & 0x0F) - 1;
|
||||
int cs_blue = (led.b & 0x0F) - 1;
|
||||
int cs_red = (led.r & 0x0F);
|
||||
int cs_green = (led.g & 0x0F);
|
||||
int cs_blue = (led.b & 0x0F);
|
||||
|
||||
driver_buffers[led.driver].scaling_buffer[cs_red] = red;
|
||||
driver_buffers[led.driver].scaling_buffer[cs_green] = green;
|
||||
|
||||
@@ -101,8 +101,7 @@ void ps2_mouse_task(void) {
|
||||
# endif
|
||||
} else {
|
||||
if (debug_mouse) print("ps2_mouse: fail to get mouse packet\n");
|
||||
/* return here to avoid updating the mouse button state */
|
||||
return;
|
||||
// Continue processing anyway to ensure mouse button state is still updated
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@@ -354,7 +354,7 @@ bool azoteq_iqs5xx_init(void) {
|
||||
};
|
||||
|
||||
report_mouse_t azoteq_iqs5xx_get_report(report_mouse_t mouse_report) {
|
||||
report_mouse_t temp_report = {0};
|
||||
report_mouse_t temp_report = {.buttons = mouse_report.buttons};
|
||||
|
||||
azoteq_iqs5xx_base_data_t base_data = {0};
|
||||
i2c_status_t status = azoteq_iqs5xx_get_base_data(&base_data);
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
#include "gpio.h"
|
||||
#include "pointing_device_internal.h"
|
||||
|
||||
const pointing_device_driver_t pmw3320_pointing_device_drivera = {
|
||||
const pointing_device_driver_t pmw3320_pointing_device_driver = {
|
||||
.init = pmw3320_init,
|
||||
.get_report = pmw3320_get_report,
|
||||
.set_cpi = pmw3320_set_cpi,
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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)))
|
||||
@@ -31,4 +31,4 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_DEL, KC_END, KC_PGDN, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, QK_LOCK, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, C(A(KC_DEL))
|
||||
)
|
||||
};
|
||||
};
|
||||
|
||||
@@ -26,4 +26,4 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
KC_1, KC_2, KC_3, KC_4,
|
||||
KC_5, KC_6, KC_7, KC_8
|
||||
)
|
||||
};
|
||||
};
|
||||
|
||||
@@ -103,4 +103,4 @@ bool oled_task_kb(void) {
|
||||
return false;
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -1 +1 @@
|
||||
ENCODER_MAP_ENABLE = yes
|
||||
ENCODER_MAP_ENABLE = yes
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#define OLED_DISPLAY_128X32
|
||||
#define I2C1_SCL_PIN GP17
|
||||
#define I2C1_SDA_PIN GP16
|
||||
#define I2C_DRIVER I2CD0
|
||||
|
||||
@@ -4,4 +4,4 @@
|
||||
|
||||
#define HAL_USE_I2C TRUE
|
||||
|
||||
#include_next <halconf.h>
|
||||
#include_next <halconf.h>
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user