summaryrefslogtreecommitdiff
path: root/docs
diff options
context:
space:
mode:
authorAlex Ong <the.onga@gmail.com>2019-01-26 11:36:28 +1100
committerAlex Ong <the.onga@gmail.com>2019-01-26 11:36:28 +1100
commitd977daa8dc9136746425f9e1414e1f93cb161877 (patch)
tree209ab8082580e5fdf37f1a8b7c1169250b7548c0 /docs
parent47c91fc7f75ae0a477e55b687aa0fc30da0a283c (diff)
parent0306e487e2cd6a77ad840d0a441b478747b7ccd0 (diff)
Merge branch 'master' of https://github.com/qmk/qmk_firmware
Diffstat (limited to 'docs')
-rw-r--r--docs/_sidebar.md100
-rw-r--r--docs/_summary.md2
-rw-r--r--docs/config_options.md15
-rw-r--r--docs/custom_quantum_functions.md45
-rw-r--r--docs/feature_advanced_keycodes.md66
-rw-r--r--docs/feature_encoders.md20
-rw-r--r--docs/feature_unicode.md47
-rw-r--r--docs/features.md1
-rw-r--r--docs/getting_started_build_tools.md6
-rw-r--r--docs/getting_started_make_guide.md28
-rw-r--r--docs/index.html2
-rw-r--r--docs/internals_gpio_control.md6
-rw-r--r--docs/isp_flashing_guide.md2
-rw-r--r--docs/keycodes.md480
-rw-r--r--docs/keycodes_basic.md100
-rw-r--r--docs/proton_c_conversion.md21
-rw-r--r--docs/understanding_qmk.md58
-rw-r--r--docs/zh/_summary.md (renamed from docs/zh/_sidebar.md)0
18 files changed, 488 insertions, 511 deletions
diff --git a/docs/_sidebar.md b/docs/_sidebar.md
deleted file mode 100644
index b209c5e0b8..0000000000
--- a/docs/_sidebar.md
+++ /dev/null
@@ -1,100 +0,0 @@
-* [Complete Newbs Guide](newbs.md)
- * [Getting Started](newbs_getting_started.md)
- * [Building Your First Firmware](newbs_building_firmware.md)
- * [Flashing Firmware](newbs_flashing.md)
- * [Testing and Debugging](newbs_testing_debugging.md)
- * [Best Practices](newbs_best_practices.md)
- * [Learning Resources](newbs_learn_more_resources.md)
-
-* [QMK Basics](README.md)
- * [QMK Introduction](getting_started_introduction.md)
- * [Contributing to QMK](contributing.md)
- * [How to Use Github](getting_started_github.md)
- * [Getting Help](getting_started_getting_help.md)
-
-* [FAQ](faq.md)
- * [General FAQ](faq_general.md)
- * [Build/Compile QMK](faq_build.md)
- * [Debugging/Troubleshooting QMK](faq_debug.md)
- * [Keymap](faq_keymap.md)
-
-* Detailed Guides
- * [Install Build Tools](getting_started_build_tools.md)
- * [Vagrant Guide](getting_started_vagrant.md)
- * [Build/Compile Instructions](getting_started_make_guide.md)
- * [Flashing Firmware](flashing.md)
- * [Customizing Functionality](custom_quantum_functions.md)
- * [Keymap Overview](keymap.md)
-
-* [Hardware](hardware.md)
- * [AVR Processors](hardware_avr.md)
- * [Drivers](hardware_drivers.md)
-
-* Reference
- * [Keyboard Guidelines](hardware_keyboard_guidelines.md)
- * [Config Options](config_options.md)
- * [Keycodes](keycodes.md)
- * [Documentation Best Practices](documentation_best_practices.md)
- * [Documentation Templates](documentation_templates.md)
- * [Glossary](reference_glossary.md)
- * [Unit Testing](unit_testing.md)
- * [Useful Functions](ref_functions.md)
- * [Configurator Support](reference_configurator_support.md)
-
-* [Features](features.md)
- * [Basic Keycodes](keycodes_basic.md)
- * [US ANSI Shifted Keys](keycodes_us_ansi_shifted.md)
- * [Quantum Keycodes](quantum_keycodes.md)
- * [Advanced Keycodes](feature_advanced_keycodes.md)
- * [Audio](feature_audio.md)
- * [Auto Shift](feature_auto_shift.md)
- * [Backlight](feature_backlight.md)
- * [Bluetooth](feature_bluetooth.md)
- * [Bootmagic](feature_bootmagic.md)
- * [Combos](feature_combo)
- * [Command](feature_command.md)
- * [Dynamic Macros](feature_dynamic_macros.md)
- * [Encoders](feature_encoders.md)
- * [Grave Escape](feature_grave_esc.md)
- * [Key Lock](feature_key_lock.md)
- * [Layouts](feature_layouts.md)
- * [Leader Key](feature_leader_key.md)
- * [Macros](feature_macros.md)
- * [Mouse Keys](feature_mouse_keys.md)
- * [One Shot Keys](feature_advanced_keycodes.md#one-shot-keys)
- * [Pointing Device](feature_pointing_device.md)
- * [PS/2 Mouse](feature_ps2_mouse.md)
- * [RGB Lighting](feature_rgblight.md)
- * [RGB Matrix](feature_rgb_matrix.md)
- * [Space Cadet Shift](feature_space_cadet_shift.md)
- * [Space Cadet Shift Enter](feature_space_cadet_shift_enter.md)
- * [Stenography](feature_stenography.md)
- * [Swap Hands](feature_swap_hands.md)
- * [Tap Dance](feature_tap_dance.md)
- * [Terminal](feature_terminal.md)
- * [Thermal Printer](feature_thermal_printer.md)
- * [Unicode](feature_unicode.md)
- * [Userspace](feature_userspace.md)
-
-* For Makers and Modders
- * [Hand Wiring Guide](hand_wire.md)
- * [ISP Flashing Guide](isp_flashing_guide.md)
- * [ARM Debugging Guide](arm_debugging.md)
- * [I2C Driver](i2c_driver.md)
-
-* For a Deeper Understanding
- * [How Keyboards Work](how_keyboards_work.md)
- * [Understanding QMK](understanding_qmk.md)
-
-* Other Topics
- * [Using Eclipse with QMK](eclipse.md)
- * [Support](support.md)
-
-* QMK Internals (In Progress)
- * [Defines](internals_defines.md)
- * [Input Callback Reg](internals_input_callback_reg.md)
- * [Midi Device](internals_midi_device.md)
- * [Midi Device Setup Process](internals_midi_device_setup_process.md)
- * [Midi Util](internals_midi_util.md)
- * [Send Functions](internals_send_functions.md)
- * [Sysex Tools](internals_sysex_tools.md)
diff --git a/docs/_summary.md b/docs/_summary.md
index b209c5e0b8..c467a7231a 100644
--- a/docs/_summary.md
+++ b/docs/_summary.md
@@ -81,6 +81,8 @@
* [ISP Flashing Guide](isp_flashing_guide.md)
* [ARM Debugging Guide](arm_debugging.md)
* [I2C Driver](i2c_driver.md)
+ * [GPIO Controls](internals_gpio_control.md)
+ * [Proton C Conversion](proton_c_conversion.md)
* For a Deeper Understanding
* [How Keyboards Work](how_keyboards_work.md)
diff --git a/docs/config_options.md b/docs/config_options.md
index 085ab3ee58..f5c2e76e7e 100644
--- a/docs/config_options.md
+++ b/docs/config_options.md
@@ -109,9 +109,9 @@ If you define these options you will disable the associated feature, which can s
* `#define NO_ACTION_ONESHOT`
* disable one-shot modifiers
* `#define NO_ACTION_MACRO`
- * disable all macro handling
+ * disable old style macro handling: MACRO() & action_get_macro
* `#define NO_ACTION_FUNCTION`
- * disable the action function (deprecated)
+ * disable calling of action_function() from the fn_actions array (deprecated)
## Features That Can Be Enabled
@@ -143,7 +143,7 @@ If you define these options you will enable the associated feature, which may in
* Breaks any Tap Toggle functionality (`TT` or the One Shot Tap Toggle)
* `#define LEADER_TIMEOUT 300`
* how long before the leader key times out
- * If you're having issues finishing the sequence before it times out, you may need to increase the timeout setting. Or you may want to enable the `LEADER_PER_KEY_TIMING` option, which resets the timeout after each key is tapped.
+ * If you're having issues finishing the sequence before it times out, you may need to increase the timeout setting. Or you may want to enable the `LEADER_PER_KEY_TIMING` option, which resets the timeout after each key is tapped.
* `#define LEADER_PER_KEY_TIMING`
* sets the timer for leader key chords to run on each key press rather than overall
* `#define LEADER_KEY_STRICT_KEY_PROCESSING`
@@ -197,6 +197,9 @@ If you define these options you will enable the associated feature, which may in
Split Keyboard specific options, make sure you have 'SPLIT_KEYBOARD = yes' in your rules.mk
+* `SPLIT_TRANSPORT = custom`
+ * Allows replacing the standard split communication routines with a custom one. ARM based split keyboards must use this at present.
+
### Setting Handedness
One thing to remember, the side that the USB port is plugged into is always the master half. The side not plugged into USB is the slave.
@@ -208,7 +211,7 @@ There are a few different ways to set handedness for split keyboards (listed in
3. Set `MASTER_RIGHT`: Half that is plugged into the USB port is determined to be the master and right half (inverse of the default)
4. Default: The side that is plugged into the USB port is the master half and is assumed to be the left half. The slave side is the right half
-* `#define SPLIT_HAND_PIN B7`
+* `#define SPLIT_HAND_PIN B7`
* For using high/low pin to determine handedness, low = right hand, high = left hand. Replace `B7` with the pin you are using. This is optional, and if you leave `SPLIT_HAND_PIN` undefined, then you can still use the EE_HANDS method or MASTER_LEFT / MASTER_RIGHT defines like the stock Let's Split uses.
* `#define EE_HANDS` (only works if `SPLIT_HAND_PIN` is not defined)
@@ -302,6 +305,10 @@ Use these to enable or disable building certain features. The more you have enab
* Current options are AdafruitEzKey, AdafruitBLE, RN42
* `SPLIT_KEYBOARD`
* Enables split keyboard support (dual MCU like the let's split and bakingpy's boards) and includes all necessary files located at quantum/split_common
+* `CUSTOM_MATRIX`
+ * Allows replacing the standard matrix scanning routine with a custom one.
+* `CUSTOM_DEBOUNCE`
+ * Allows replacing the standard key debouncing routine with a custom one.
* `WAIT_FOR_USB`
* Forces the keyboard to wait for a USB connection to be established before it starts up
* `NO_USB_STARTUP_CHECK`
diff --git a/docs/custom_quantum_functions.md b/docs/custom_quantum_functions.md
index 5b95450f26..d44786e2d5 100644
--- a/docs/custom_quantum_functions.md
+++ b/docs/custom_quantum_functions.md
@@ -90,7 +90,7 @@ keyrecord_t record {
# LED Control
-This allows you to control the 5 LED's defined as part of the USB Keyboard spec. It will be called when the state of one of those 5 LEDs changes.
+QMK provides methods to read the 5 LEDs defined as part of the HID spec:
* `USB_LED_NUM_LOCK`
* `USB_LED_CAPS_LOCK`
@@ -98,31 +98,44 @@ This allows you to control the 5 LED's defined as part of the USB Keyboard spec.
* `USB_LED_COMPOSE`
* `USB_LED_KANA`
+These five constants correspond to the positional bits of the host LED state.
+There are two ways to get the host LED state:
+
+* by implementing `led_set_user()`
+* by calling `host_keyboard_leds()`
+
+## `led_set_user()`
+
+This function will be called when the state of one of those 5 LEDs changes. It receives the LED state as a parameter.
+Use the `IS_LED_ON(usb_led, led_name)` and `IS_LED_OFF(usb_led, led_name)` macros to check the LED status.
+
+!> `host_keyboard_leds()` may already reflect a new value before `led_set_user()` is called.
+
### Example `led_set_user()` Implementation
```c
void led_set_user(uint8_t usb_led) {
- if (usb_led & (1<<USB_LED_NUM_LOCK)) {
+ if (IS_LED_ON(usb_led, USB_LED_NUM_LOCK)) {
PORTB |= (1<<0);
} else {
PORTB &= ~(1<<0);
}
- if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
+ if (IS_LED_ON(usb_led, USB_LED_CAPS_LOCK)) {
PORTB |= (1<<1);
} else {
PORTB &= ~(1<<1);
}
- if (usb_led & (1<<USB_LED_SCROLL_LOCK)) {
+ if (IS_LED_ON(usb_led, USB_LED_SCROLL_LOCK)) {
PORTB |= (1<<2);
} else {
PORTB &= ~(1<<2);
}
- if (usb_led & (1<<USB_LED_COMPOSE)) {
+ if (IS_LED_ON(usb_led, USB_LED_COMPOSE)) {
PORTB |= (1<<3);
} else {
PORTB &= ~(1<<3);
}
- if (usb_led & (1<<USB_LED_KANA)) {
+ if (IS_LED_ON(usb_led, USB_LED_KANA)) {
PORTB |= (1<<4);
} else {
PORTB &= ~(1<<4);
@@ -135,10 +148,26 @@ void led_set_user(uint8_t usb_led) {
* Keyboard/Revision: `void led_set_kb(uint8_t usb_led)`
* Keymap: `void led_set_user(uint8_t usb_led)`
+## `host_keyboard_leds()`
+
+Call this function to get the last received LED state. This is useful for reading the LED state outside `led_set_*`, e.g. in [`matrix_scan_user()`](#matrix-scanning-code).
+For convenience, you can use the `IS_HOST_LED_ON(led_name)` and `IS_HOST_LED_OFF(led_name)` macros instead of calling and checking `host_keyboard_leds()` directly.
+
+## Setting Physical LED State
+
+Some keyboard implementations provide convenience methods for setting the state of the physical LEDs.
+
+### Ergodox Boards
+
+The Ergodox implementations provide `ergodox_right_led_1`/`2`/`3_on`/`off()` to turn individual LEDs on or off, as well as `ergodox_right_led_on`/`off(uint8_t led)` to turn them on or off by their index.
+
+In addition, it is possible to specify the brightness level of all LEDs with `ergodox_led_all_set(uint8_t n)`; of individual LEDs with `ergodox_right_led_1`/`2`/`3_set(uint8_t n)`; or by index with `ergodox_right_led_set(uint8_t led, uint8_t n)`.
+
+Ergodox boards also define `LED_BRIGHTNESS_LO` for the lowest brightness and `LED_BRIGHTNESS_HI` for the highest brightness (which is the default).
# Matrix Initialization Code
-Before a keyboard can be used the hardware must be initialized. QMK handles initialization of the keyboard matrix itself, but if you have other hardware like LED's or i&#xb2;c controllers you will need to set up that hardware before it can be used.
+Before a keyboard can be used the hardware must be initialized. QMK handles initialization of the keyboard matrix itself, but if you have other hardware like LEDs or i&#xb2;c controllers you will need to set up that hardware before it can be used.
### Example `matrix_init_user()` Implementation
@@ -176,7 +205,7 @@ This example has been deliberately omitted. You should understand enough about Q
This function gets called at every matrix scan, which is basically as often as the MCU can handle. Be careful what you put here, as it will get run a lot.
-You should use this function if you need custom matrix scanning code. It can also be used for custom status output (such as LED's or a display) or other functionality that you want to trigger regularly even when the user isn't typing.
+You should use this function if you need custom matrix scanning code. It can also be used for custom status output (such as LEDs or a display) or other functionality that you want to trigger regularly even when the user isn't typing.
# Keyboard Idling/Wake Code
diff --git a/docs/feature_advanced_keycodes.md b/docs/feature_advanced_keycodes.md
index 8c0a22fc67..37a3d43fc3 100644
--- a/docs/feature_advanced_keycodes.md
+++ b/docs/feature_advanced_keycodes.md
@@ -25,7 +25,7 @@ These functions allow you to activate layers in various ways. Note that layers a
* `DF(layer)` - switches the default layer. The default layer is the always-active base layer that other layers stack on top of. See below for more about the default layer. This might be used to switch from QWERTY to Dvorak layout. (Note that this is a temporary switch that only persists until the keyboard loses power. To modify the default layer in a persistent way requires deeper customization, such as calling the `set_single_persistent_default_layer` function inside of [process_record_user](custom_quantum_functions.md#programming-the-behavior-of-any-keycode).)
* `MO(layer)` - momentarily activates *layer*. As soon as you let go of the key, the layer is deactivated.
-* `LM(layer, mod)` - Momentarily activates *layer* (like `MO`), but with modifier(s) *mod* active. Only supports layers 0-15 and the left modifiers.
+* `LM(layer, mod)` - Momentarily activates *layer* (like `MO`), but with modifier(s) *mod* active. Only supports layers 0-15 and the left modifiers: `MOD_LCTL`, `MOD_LSFT`, `MOD_LALT`, `MOD_LGUI` (note the use of `MOD_` constants instead of `KC_`). These modifiers can be combined using bitwise OR, e.g. `LM(_RAISE, MOD_LCTL | MOD_LALT)`.
* `LT(layer, kc)` - momentarily activates *layer* when held, and sends *kc* when tapped. Only supports layers 0-15.
* `OSL(layer)` - momentarily activates *layer* until the next key is pressed. See [One Shot Keys](#one-shot-keys) for details and additional functionality.
* `TG(layer)` - toggles *layer*, activating it if it's inactive and vice versa
@@ -60,21 +60,21 @@ Sometimes, you might want to switch between layers in a macro or as part of a ta
These allow you to combine a modifier with a keycode. When pressed, the keydown event for the modifier, then `kc` will be sent. On release, the keyup event for `kc`, then the modifier will be sent.
-|Key |Aliases |Description |
-|----------|----------------------|----------------------------------------------------|
-|`LCTL(kc)`| |Hold Left Control and press `kc` |
-|`LSFT(kc)`|`S(kc)` |Hold Left Shift and press `kc` |
-|`LALT(kc)`| |Hold Left Alt and press `kc` |
-|`LGUI(kc)`|`LCMD(kc)`, `LWIN(kc)`|Hold Left GUI and press `kc` |
-|`RCTL(kc)`| |Hold Right Control and press `kc` |
-|`RSFT(kc)`| |Hold Right Shift and press `kc` |
-|`RALT(kc)`|`ALGR(kc)` |Hold Right Alt and press `kc` |
-|`RGUI(kc)`|`RCMD(kc)`, `LWIN(kc)`|Hold Right GUI and press `kc` |
-|`HYPR(kc)`| |Hold Left Control, Shift, Alt and GUI and press `kc`|
-|`MEH(kc)` | |Hold Left Control, Shift and Alt and press `kc` |
-|`LCAG(kc)`| |Hold Left Control, Alt and GUI and press `kc` |
-|`SGUI(kc)`|`SCMD(kc)`, `SWIN(kc)`|Hold Left Shift and GUI and press `kc` |
-|`LCA(kc)` | |Hold Left Control and Alt and press `kc` |
+|Key |Aliases |Description |
+|----------|-------------------------------|----------------------------------------------------|
+|`LCTL(kc)`|`C(kc)` |Hold Left Control and press `kc` |
+|`LSFT(kc)`|`S(kc)` |Hold Left Shift and press `kc` |
+|`LALT(kc)`|`A(kc)` |Hold Left Alt and press `kc` |
+|`LGUI(kc)`|`G(kc)`, `LCMD(kc)`, `LWIN(kc)`|Hold Left GUI and press `kc` |
+|`RCTL(kc)`| |Hold Right Control and press `kc` |
+|`RSFT(kc)`| |Hold Right Shift and press `kc` |
+|`RALT(kc)`|`ALGR(kc)` |Hold Right Alt and press `kc` |
+|`RGUI(kc)`|`RCMD(kc)`, `LWIN(kc)` |Hold Right GUI and press `kc` |
+|`SGUI(kc)`|`SCMD(kc)`, `SWIN(kc)` |Hold Left Shift and GUI and press `kc` |
+|`LCA(kc)` | |Hold Left Control and Alt and press `kc` |
+|`LCAG(kc)`| |Hold Left Control, Alt and GUI and press `kc` |
+|`MEH(kc)` | |Hold Left Control, Shift and Alt and press `kc` |
+|`HYPR(kc)`| |Hold Left Control, Shift, Alt and GUI and press `kc`|
You can also chain them, for example `LCTL(LALT(KC_DEL))` makes a key that sends Control+Alt+Delete with a single keypress.
@@ -107,23 +107,23 @@ This key would activate Left Control and Left Shift when held, and send Escape w
For convenience, QMK includes some Mod-Tap shortcuts to make common combinations more compact in your keymap:
-|Key |Aliases |Description |
-|------------|---------------------------------------|-------------------------------------------------------|
-|`LCTL_T(kc)`|`CTL_T(kc)` |Left Control when held, `kc` when tapped |
-|`RCTL_T(kc)`| |Right Control when held, `kc` when tapped |
-|`LSFT_T(kc)`|`SFT_T(kc)` |Left Shift when held, `kc` when tapped |
-|`RSFT_T(kc)`| |Right Shift when held, `kc` when tapped |
-|`LALT_T(kc)`|`ALT_T(kc)` |Left Alt when held, `kc` when tapped |
-|`RALT_T(kc)`|`ALGR_T(kc)` |Right Alt when held, `kc` when tapped |
-|`LGUI_T(kc)`|`LCMD_T(kc)`, `RWIN_T(kc)`, `GUI_T(kc)`|Left GUI when held, `kc` when tapped |
-|`RGUI_T(kc)`|`RCMD_T(kc)`, `RWIN_T(kc)` |Right GUI when held, `kc` when tapped |
-|`C_S_T(kc)` | |Left Control and Shift when held, `kc` when tapped |
-|`MEH_T(kc)` | |Left Control, Shift and Alt when held, `kc` when tapped|
-|`LCAG_T(kc)`| |Left Control, Alt and GUI when held, `kc` when tapped |
-|`RCAG_T(kc)`| |Right Control, Alt and GUI when held, `kc` when tapped |
-|`ALL_T(kc)` | |Left Control, Shift, Alt and GUI when held, `kc` when tapped - more info [here](http://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/)|
-|`SGUI_T(kc)`|`SCMD_T(kc)`, `SWIN_T(kc)` |Left Shift and GUI when held, `kc` when tapped |
-|`LCA_T(kc)` | |Left Control and Alt when held, `kc` when tapped |
+|Key |Aliases |Description |
+|------------|-----------------------------------------------------------------|-------------------------------------------------------|
+|`LCTL_T(kc)`|`CTL_T(kc)` |Left Control when held, `kc` when tapped |
+|`LSFT_T(kc)`|`SFT_T(kc)` |Left Shift when held, `kc` when tapped |
+|`LALT_T(kc)`|`ALT_T(kc)` |Left Alt when held, `kc` when tapped |
+|`LGUI_T(kc)`|`LCMD_T(kc)`, `LWIN_T(kc)`, `GUI_T(kc)`, `CMD_T(kc)`, `WIN_T(kc)`|Left GUI when held, `kc` when tapped |
+|`RCTL_T(kc)`| |Right Control when held, `kc` when tapped |
+|`RSFT_T(kc)`| |Right Shift when held, `kc` when tapped |
+|`RALT_T(kc)`|`ALGR_T(kc)` |Right Alt when held, `kc` when tapped |
+|`RGUI_T(kc)`|`RCMD_T(kc)`, `RWIN_T(kc)` |Right GUI when held, `kc` when tapped |
+|`SGUI_T(kc)`|`SCMD_T(kc)`, `SWIN_T(kc)` |Left Shift and GUI when held, `kc` when tapped |
+|`LCA_T(kc)` | |Left Control and Alt when held, `kc` when tapped |
+|`LCAG_T(kc)`| |Left Control, Alt and GUI when held, `kc` when tapped |
+|`RCAG_T(kc)`| |Right Control, Alt and GUI when held, `kc` when tapped |
+|`C_S_T(kc)` | |Left Control and Shift when held, `kc` when tapped |
+|`MEH_T(kc)` | |Left Control, Shift and Alt when held, `kc` when tapped|
+|`HYPR_T(kc)`|`ALL_T(kc)` |Left Control, Shift, Alt and GUI when held, `kc` when tapped - more info [here](http://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/)|
## Caveats
diff --git a/docs/feature_encoders.md b/docs/feature_encoders.md
index 208d6db13c..6eab402ef9 100644
--- a/docs/feature_encoders.md
+++ b/docs/feature_encoders.md
@@ -32,15 +32,19 @@ The callback functions can be inserted into your `<keyboard>.c`:
or `keymap.c`:
void encoder_update_user(uint8_t index, bool clockwise) {
- if (index == 0) {
- if (clockwise) {
- register_code(KC_PGDN);
- unregister_code(KC_PGDN);
- } else {
- register_code(KC_PGUP);
- unregister_code(KC_PGUP);
- }
+ if (index == 0) { /* First encoder */
+ if (clockwise) {
+ tap_code(KC_PGDN);
+ } else {
+ tap_code(KC_PGUP);
}
+ } else if (index == 2) {
+ if (clockwise) {
+ tap_code(KC_UP);
+ } else {
+ tap_code(KC_DOWN);
+ }
+ }
}
## Hardware
diff --git a/docs/feature_unicode.md b/docs/feature_unicode.md
index 9d57e2fb7a..7dd85c5c2e 100644
--- a/docs/feature_unicode.md
+++ b/docs/feature_unicode.md
@@ -2,15 +2,15 @@
There are three Unicode keymap definition methods available in QMK:
-## UNICODE_ENABLE
+## `UNICODE_ENABLE`
-Supports Unicode up to `0xFFFF`. The keycode function is `UC(n)` in the keymap file, where _n_ is a 4 digit hexadecimal number.
+Supports Unicode up to `0x7FFF`. This covers characters for most modern languages, as well as symbols, but it doesn't cover emoji. The keycode function is `UC(c)` in the keymap file, where _c_ is the code point's number (preferably hexadecimal, up to 4 digits long). For example: `UC(0x45B)`, `UC(0x30C4)`.
-## UNICODEMAP_ENABLE
+## `UNICODEMAP_ENABLE`
-Supports Unicode up to `0x10FFFF` (all possible code points). You need to maintain a separate mapping table `const uint32_t PROGMEM unicode_map[] = {...}` in your keymap file. The keycode function is `X(n)`, where _n_ is an array index into the mapping table.
+Supports Unicode up to `0x10FFFF` (all possible code points). You need to maintain a separate mapping table `const uint32_t PROGMEM unicode_map[] = {...}` in your keymap file. The keycode function is `X(i)`, where _i_ is an array index into the mapping table. The table may contain at most 1024 entries.
-And you may want to have an enum to make reference easier. So you'd want to add something like this to your keymap:
+You may want to have an enum to make referencing easier. So, you could add something like this to your keymap file:
```c
enum unicode_names {
@@ -20,38 +20,37 @@ enum unicode_names {
};
const uint32_t PROGMEM unicode_map[] = {
- [BANG] = 0x203D, // ‽
- [IRONY] = 0x2E2E, // ⸮
- [SNEK] = 0x1F40D, // 🐍
+ [BANG] = 0x203D, // ‽
+ [IRONY] = 0x2E2E, // ⸮
+ [SNEK] = 0x1F40D, // 🐍
};
```
-Make sure that the order for both matches.
+Then you can use `X(BANG)` etc. in your keymap.
-## UCIS_ENABLE
+## `UCIS_ENABLE`
-Supports Unicode up to `0x10FFFF` (all possible code points). As with `UNICODEMAP`, you may want to maintain a mapping table in your keymap file. However, there are no built-in keycodes for this feature — you will have to add a keycode or function that calls `qk_ucis_start()`. Once it's been called, you can type the mnemonic for your character, then hit Space or Enter to complete it or Esc to cancel. If the mnemonic matches an entry in your table, the typed text will automatically be erased and the corresponding Unicode sequence inserted.
+Supports Unicode up to `0x10FFFF` (all possible code points). As with `UNICODEMAP`, you need to maintain a mapping table in your keymap file. However, there are no built-in keycodes for this feature — you will have to add a keycode or function that calls `qk_ucis_start()`. Once this function's been called, you can type the corresponding mnemonic for your character, then hit Space or Enter to complete it, or Esc to cancel. If the mnemonic matches an entry in your table, the typed text will automatically be erased and the corresponding Unicode character inserted.
-For instance, you would need to have a table like this in your keymap:
+For instance, you would define a table like this in your keymap file:
```c
-const qk_ucis_symbol_t ucis_symbol_table[] = UCIS_TABLE
-(
- UCIS_SYM("poop", 0x1f4a9),
- UCIS_SYM("rofl", 0x1f923),
- UCIS_SYM("kiss", 0x1f619)
+const qk_ucis_symbol_t ucis_symbol_table[] = UCIS_TABLE(
+ UCIS_SYM("poop", 0x1F4A9), // 💩
+ UCIS_SYM("rofl", 0x1F923), // 🤣
+ UCIS_SYM("kiss", 0x1F619) // 😙
);
```
-You run the function, and then type "rofl" and hit enter, it should backspace remove "rofl" and input the `0x1f923` unicode.
+You call `qk_ucis_start()`, then type "rofl" and hit Enter. QMK should erase the "rofl" text and input the laughing emoji.
### Customization
-There are several functions that you can add to your keymap to customize the functionality of this feature.
+There are several functions that you can define in your keymap to customize the functionality of this feature.
-* `void qk_ucis_start_user(void)` - This runs when you run the "start" function, and can be used to provide feedback. By default, it types out a keyboard emoji.
-* `void qk_ucis_success(uint8_t symbol_index)` - This runs when the unicode input has matched something, and has completed. Default doesn't do anything.
-* `void qk_ucis_symbol_fallback (void)` - This runs if the input text doesn't match anything. The default function falls back to trying that input as a unicode code.
+* `void qk_ucis_start_user(void)` – This runs when you call the "start" function, and can be used to provide feedback. By default, it types out a keyboard emoji.
+* `void qk_ucis_success(uint8_t symbol_index)` – This runs when the input has matched something and has completed. By default, it doesn't do anything.
+* `void qk_ucis_symbol_fallback (void)` – This runs when the input doesn't match anything. By default, it falls back to trying that input as a Unicode code.
You can find the default implementations of these functions in [`process_ucis.c`](https://github.com/qmk/qmk_firmware/blob/master/quantum/process_keycode/process_ucis.c).
@@ -66,7 +65,7 @@ The following input modes are available:
To enable, go to _System Preferences > Keyboard > Input Sources_, add _Unicode Hex Input_ to the list (it's under _Other_), then activate it from the input dropdown in the Menu Bar.
By default, this mode uses the left Option key (`KC_LALT`), but this can be changed by defining [`UNICODE_OSX_KEY`](#input-key-configuration) with another keycode.
-* **`UC_LNX`**: Linux built-in IBus Unicode input. Supports all possible code points (`0x10FFFF`).
+* **`UC_LNX`**: Linux built-in IBus Unicode input. Supports code points up to `0x10FFFF` (all possible code points).
Enabled by default and works almost anywhere on IBus-enabled distros. Without IBus, this mode works under GTK apps, but rarely anywhere else.
@@ -77,7 +76,7 @@ The following input modes are available:
* **`UC_BSD`**: _(non implemented)_ Unicode input under BSD. Not implemented at this time. If you're a BSD user and want to help add support for it, please [open an issue on GitHub](https://github.com/qmk/qmk_firmware/issues).
-* **`UC_WINC`**: Windows Unicode input using [WinCompose](https://github.com/samhocevar/wincompose). As of v0.8.2, supports code points up to `0xFFFFF`.
+* **`UC_WINC`**: Windows Unicode input using [WinCompose](https://github.com/samhocevar/wincompose). As of v0.8.2, supports code points up to `0xFFFFF` (all currently assigned code points).
To enable, install the [latest release](https://github.com/samhocevar/wincompose/releases/latest). Once installed, WinCompose will automatically run on startup. Works reliably under all version of Windows supported by the app.
By default, this mode uses the right Alt key (`KC_RALT`), but this can be changed in the WinCompose settings and by defining [`UNICODE_WINC_KEY`](#input-key-configuration) with another keycode.
diff --git a/docs/features.md b/docs/features.md
index 85f4cf6e00..9030500a2b 100644
--- a/docs/features.md
+++ b/docs/features.md
@@ -11,6 +11,7 @@ QMK has a staggering number of features for building your keyboard. It can take
* [Combos](feature_combo.md) - Custom actions for multiple key holds.
* [Command](feature_command.md) - Runtime version of bootmagic (Formerly known as "Magic").
* [Dynamic Macros](feature_dynamic_macros.md) - Record and playback macros from the keyboard itself.
+* [Encoders](feature_encoders.md) - Rotary encoders!
* [Grave Escape](feature_grave_esc.md) - Lets you use a single key for Esc and Grave.
* [HD44780 LCD Display](feature_hd44780.md) - Support for LCD character displays using the HD44780 standard.
* [Key Lock](feature_key_lock.md) - Lock a key in the "down" state.
diff --git a/docs/getting_started_build_tools.md b/docs/getting_started_build_tools.md
index 375e9d108f..dbed200d1b 100644
--- a/docs/getting_started_build_tools.md
+++ b/docs/getting_started_build_tools.md
@@ -41,6 +41,12 @@ Debian / Ubuntu example:
Fedora / Red Hat example:
sudo dnf install gcc unzip wget zip dfu-util dfu-programmer avr-gcc avr-libc binutils-avr32-linux-gnu arm-none-eabi-gcc-cs arm-none-eabi-binutils-cs arm-none-eabi-newlib
+
+Arch / Manjaro example:
+
+ pacman -S base-devel gcc unzip wget zip avr-gcc avr-binutils avr-libc dfu-util arm-none-eabi-gcc arm-none-eabi-binutils arm-none-eabi-newlib git
+
+(the `dfu-programmer` package is availble on AUR only so you should download from there or use an AUR helper)
## Nix
diff --git a/docs/getting_started_make_guide.md b/docs/getting_started_make_guide.md
index e515411901..bb7e1e7e3b 100644
--- a/docs/getting_started_make_guide.md
+++ b/docs/getting_started_make_guide.md
@@ -93,19 +93,17 @@ This enables MIDI sending and receiving with your keyboard. To enter MIDI send m
`UNICODE_ENABLE`
-This allows you to send unicode symbols via `UC(<unicode>)` in your keymap. Only codes up to 0x7FFF are currently supported.
+This allows you to send Unicode characters using `UC(<code point>)` in your keymap. Code points up to `0x7FFF` are supported. This covers characters for most modern languages, as well as symbols, but it doesn't cover emoji.
`UNICODEMAP_ENABLE`
-This allows sending unicode symbols using `X(<unicode>)` in your keymap. Codes
-up to 0xFFFFFFFF are supported, including emojis. You will need to maintain
-a separate mapping table in your keymap file.
+This allows you to send Unicode characters using `X(<map index>)` in your keymap. You will need to maintain a mapping table in your keymap file. All possible code points (up to `0x10FFFF`) are supported.
-Known limitations:
-- Under Mac OS, only codes up to 0xFFFF are supported.
-- Under Linux ibus, only codes up to 0xFFFFF are supported (but anything important is still under this limit for now).
+`UCIS_ENABLE`
-Characters out of range supported by the OS will be ignored.
+This allows you to send Unicode characters by inputting a mnemonic corresponding to the character you want to send. You will need to maintain a mapping table in your keymap file. All possible code points (up to `0x10FFFF`) are supported.
+
+For further details, as well as limitations, see the [Unicode page](feature_unicode.md).
`BLUETOOTH_ENABLE`
@@ -117,7 +115,7 @@ This allows you output audio on the C6 pin (needs abstracting). See the [audio p
`FAUXCLICKY_ENABLE`
-Uses buzzer to emulate clicky switches. A cheap imitation of the Cherry blue switches. By default, uses the C6 pin, same as AUDIO_ENABLE.
+Uses buzzer to emulate clicky switches. A cheap imitation of the Cherry blue switches. By default, uses the C6 pin, same as `AUDIO_ENABLE`.
`VARIABLE_TRACE`
@@ -137,6 +135,18 @@ This enables [key lock](feature_key_lock.md). This consumes an additional 260 by
This enables split keyboard support (dual MCU like the let's split and bakingpy's boards) and includes all necessary files located at quantum/split_common
+`SPLIT_TRANSPORT`
+
+As there is no standard split communication driver for ARM-based split keyboards yet, `SPLIT_TRANSPORT = custom` must be used for these. It will prevent the standard split keyboard communication code (which is AVR-specific) from being included, allowing a custom implementation to be used.
+
+`CUSTOM_MATRIX`
+
+Lets you replace the default matrix scanning routine with your own code. You will need to provide your own implementations of matrix_init() and matrix_scan().
+
+`CUSTOM_DEBOUNCE`
+
+Lets you replace the default key debouncing routine with your own code. You will need to provide your own implementation of debounce().
+
## Customizing Makefile Options on a Per-Keymap Basis
If your keymap directory has a file called `rules.mk` any options you set in that file will take precedence over other `rules.mk` options for your particular keyboard.
diff --git a/docs/index.html b/docs/index.html
index f5aa92b531..d6fdbdbcc1 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -17,7 +17,7 @@
name: 'QMK Firmware',
nameLink: 'https://qmk.fm/',
repo: 'qmk/qmk_firmware',
- loadSidebar: true,
+ loadSidebar: '_summary.md',
auto2top: true,
formatUpdated: '{YYYY}/{MM}/{DD} {HH}:{mm}',
search: {
diff --git a/docs/internals_gpio_control.md b/docs/internals_gpio_control.md
index 083e696648..51a549f1c9 100644
--- a/docs/internals_gpio_control.md
+++ b/docs/internals_gpio_control.md
@@ -1,6 +1,6 @@
# GPIO Control
-QMK has a GPIO control abstraction layer which is micro-controller agnostic. This is done to allow easy access to pin control across different platforms.
+QMK has a GPIO control abstraction layer which is microcontroller agnostic. This is done to allow easy access to pin control across different platforms.
## Functions
@@ -17,7 +17,7 @@ The following functions can provide basic control of GPIOs and are found in `qua
|`writePin(pin, level)`|Set pin level, assuming it is an output |
|`readPin(pin)` |Returns the level of the pin |
-## Advance settings
+## Advanced Settings
-Each micro-controller can have multiple advance settings regarding its GPIO. This abstraction layer does not limit the use of architecture specific functions. Advance users should consult the datasheet of there desired device and include any needed libraries. For AVR the standard avr/io.h library is used and for STM32 the Chibios [PAL library](http://chibios.sourceforge.net/docs3/hal/group___p_a_l.html) is used.
+Each microcontroller can have multiple advanced settings regarding its GPIO. This abstraction layer does not limit the use of architecture-specific functions. Advanced users should consult the datasheet of their desired device and include any needed libraries. For AVR, the standard avr/io.h library is used; for STM32, the ChibiOS [PAL library](http://chibios.sourceforge.net/docs3/hal/group___p_a_l.html) is used.
diff --git a/docs/isp_flashing_guide.md b/docs/isp_flashing_guide.md
index 008f944cc3..18f2147846 100644
--- a/docs/isp_flashing_guide.md
+++ b/docs/isp_flashing_guide.md
@@ -53,7 +53,7 @@ This is pretty straight-forward - we'll be connecting like-things to like-things
The only difference between the .hex files below is which pin is connected to RESET. You can use them on other boards as well, as long as you're aware of the pins being used. If for some reason neither of these pins are available, [create an issue](https://github.com/qmk/qmk_firmware/issues/new), and we can generate one for you!
* Teensy 2.0: [`util/teensy_2.0_ISP_B0.hex`](https://github.com/qmk/qmk_firmware/blob/master/util/teensy_2.0_ISP_B0.hex) (`B0`)
-* Pro Micro: [`util/pro_micro_ISP_B6_10.hex`](https://github.com/qmk/qmk_firmware/blob/master/util/pro_mico_ISP_B6_10.hex) (`B6/10`)
+* Pro Micro: [`util/pro_micro_ISP_B6_10.hex`](https://github.com/qmk/qmk_firmware/blob/master/util/pro_micro_ISP_B6_10.hex) (`B6/10`)
**Flash your Teenys/Pro Micro with one of these and continue - you won't need the file after flashing your ISP device.**
diff --git a/docs/keycodes.md b/docs/keycodes.md
index 6d85253935..91578414d1 100644
--- a/docs/keycodes.md
+++ b/docs/keycodes.md
@@ -6,205 +6,205 @@ This is a reference only. Each group of keys links to the page documenting their
## [Basic Keycodes](keycodes_basic.md)
-|Key |Aliases |Description |
-|-----------------------|--------------------|-----------------------------------------------|
-|`KC_NO` |`XXXXXXX` |Ignore this key (NOOP) |
-|`KC_TRANSPARENT` |`KC_TRNS`, `_______`|Use the next lowest non-transparent key |
-|`KC_A` | |`a` and `A` |
-|`KC_B` | |`b` and `B` |
-|`KC_C` | |`c` and `C` |
-|`KC_D` | |`d` and `D` |
-|`KC_E` | |`e` and `E` |
-|`KC_F` | |`f` and `F` |
-|`KC_G` | |`g` and `G` |
-|`KC_H` | |`h` and `H` |
-|`KC_I` | |`i` and `I` |
-|`KC_J` | |`j` and `J` |
-|`KC_K` | |`k` and `K` |
-|`KC_L` | |`l` and `L` |
-|`KC_M` | |`m` and `M` |
-|`KC_N` | |`n` and `N` |
-|`KC_O` | |`o` and `O` |
-|`KC_P` | |`p` and `P` |
-|`KC_Q` | |`q` and `Q` |
-|`KC_R` | |`r` and `R` |
-|`KC_S` | |`s` and `S` |
-|`KC_T` | |`t` and `T` |
-|`KC_U` | |`u` and `U` |
-|`KC_V` | |`v` and `V` |
-|`KC_W` | |`w` and `W` |
-|`KC_X` | |`x` and `X` |
-|`KC_Y` | |`y` and `Y` |
-|`KC_Z` | |`z` and `Z` |
-|`KC_1` | |`1` and `!` |
-|`KC_2` | |`2` and `@` |
-|`KC_3` | |`3` and `#` |
-|`KC_4` | |`4` and `$` |
-|`KC_5` | |`5` and `%` |
-|`KC_6` | |`6` and `^` |
-|`KC_7` | |`7` and `&` |
-|`KC_8` | |`8` and `*` |
-|`KC_9` | |`9` and `(` |
-|`KC_0` | |`0` and `)` |
-|`KC_ENTER` |`KC_ENT` |Return (Enter) |
-|`KC_ESCAPE` |`KC_ESC` |Escape |
-|`KC_BSPACE` |`KC_BSPC` |Delete (Backspace) |
-|`KC_TAB` | |Tab |
-|`KC_SPACE` |`KC_SPC` |Spacebar |
-|`KC_MINUS` |`KC_MINS` |`-` and `_` |
-|`KC_EQUAL` |`KC_EQL` |`=` and `+` |
-|`KC_LBRACKET` |`KC_LBRC` |`[` and `{` |
-|`KC_RBRACKET` |`KC_RBRC` |`]` and `}` |
-|`KC_BSLASH` |`KC_BSLS` |`\` and <code>&#124;</code> |
-|`KC_NONUS_HASH` |`KC_NUHS` |Non-US `#` and `~` |
-|`KC_SCOLON` |`KC_SCLN` |`;` and `:` |
-|`KC_QUOTE` |`KC_QUOT` |`'` and `"` |
-|`KC_GRAVE` |`KC_GRV`, `KC_ZKHK` |<code>&#96;</code> and `~`, JIS Zenkaku/Hankaku|
-|`KC_COMMA` |`KC_COMM` |`,` and `<` |
-|`KC_DOT` | |`.` and `>` |
-|`KC_SLASH` |`KC_SLSH` |`/` and `?` |
-|`KC_CAPSLOCK` |`KC_CLCK`, `KC_CAPS`|Caps Lock |
-|`KC_F1` | |F1 |
-|`KC_F2` | |F2 |
-|`KC_F3` | |F3 |
-|`KC_F4` | |F4 |
-|`KC_F5` | |F5 |
-|`KC_F6` | |F6 |
-|`KC_F7` | |F7 |
-|`KC_F8` | |F8 |
-|`KC_F9` | |F9 |
-|`KC_F10` | |F10 |
-|`KC_F11` | |F11 |
-|`KC_F12` | |F12 |
-|`KC_PSCREEN` |`KC_PSCR` |Print Screen |
-|`KC_SCROLLLOCK` |`KC_SLCK` |Scroll Lock |
-|`KC_PAUSE` |`KC_PAUS`, `KC_BRK` |Pause |
-|`KC_INSERT` |`KC_INS` |Insert |
-|`KC_HOME` | |Home |
-|`KC_PGUP` | |Page Up |
-|`KC_DELETE` |`KC_DEL` |Forward Delete |
-|`KC_END` | |End |
-|`KC_PGDOWN` |`KC_PGDN` |Page Down |
-|`KC_RIGHT` |`KC_RGHT` |Right Arrow |
-|`KC_LEFT` | |Left Arrow |
-|`KC_DOWN` | |Down Arrow |
-|`KC_UP` | |Up Arrow |
-|`KC_NUMLOCK` |`KC_NLCK` |Keypad Num Lock and Clear |
-|`KC_KP_SLASH` |`KC_PSLS` |Keypad `/` |
-|`KC_KP_ASTERISK` |`KC_PAST` |Keypad `*` |
-|`KC_KP_MINUS` |`KC_PMNS` |Keypad `-` |
-|`KC_KP_PLUS` |`KC_PPLS` |Keypad `+` |
-|`KC_KP_ENTER` |`KC_PENT` |Keypad Enter |
-|`KC_KP_1` |`KC_P1` |Keypad `1` and End |
-|`KC_KP_2` |`KC_P2` |Keypad `2` and Down Arrow |
-|`KC_KP_3` |`KC_P3` |Keypad `3` and Page Down |
-|`KC_KP_4` |`KC_P4` |Keypad `4` and Left Arrow |
-|`KC_KP_5` |`KC_P5` |Keypad `5` |
-|`KC_KP_6` |`KC_P6` |Keypad `6` and Right Arrow |
-|`KC_KP_7` |`KC_P7` |Keypad `7` and Home |
-|`KC_KP_8` |`KC_P8` |Keypad `8` and Up Arrow |
-|`KC_KP_9` |`KC_P9` |Keypad `9` and Page Up |
-|`KC_KP_0` |`KC_P0` |Keypad `0` and Insert |
-|`KC_KP_DOT` |`KC_PDOT` |Keypad `.` and Delete |
-|`KC_NONUS_BSLASH` |`KC_NUBS` |Non-US `\` and <code>&#124;</code> |
-|`KC_APPLICATION` |`KC_APP` |Application (Windows Menu Key) |
-|`KC_POWER` | |System Power (macOS) |
-|`KC_KP_EQUAL` |`KC_PEQL` |Keypad `=` |
-|`KC_F13` | |F13 |
-|`KC_F14` | |F14 |
-|`KC_F15` | |F15 |
-|`KC_F16` | |F16 |
-|`KC_F17` | |F17 |
-|`KC_F18` | |F18 |
-|`KC_F19` | |F19 |
-|`KC_F20` | |F20 |
-|`KC_F21` | |F21 |
-|`KC_F22` | |F22 |
-|`KC_F23` | |F23 |
-|`KC_F24` | |F24 |
-|`KC_EXECUTE` |`KC_EXEC` |Execute |
-|`KC_HELP` | |Help |
-|`KC_MENU` | |Menu |
-|`KC_SELECT` |`KC_SLCT` |Select |
-|`KC_STOP` | |Stop |
-|`KC_AGAIN` |`KC_AGIN` |Again |
-|`KC_UNDO` | |Undo |
-|`KC_CUT` | |Cut |
-|`KC_COPY` | |Copy |
-|`KC_PASTE` |`KC_PSTE` |Paste |
-|`KC_FIND` | |Find |
-|`KC__MUTE` | |Mute (macOS) |
-|`KC__VOLUP` | |Volume Up (macOS) |
-|`KC__VOLDOWN` | |Volume Down (macOS) |
-|`KC_LOCKING_CAPS` |`KC_LCAP` |Locking Caps Lock |
-|`KC_LOCKING_NUM` |`KC_LNUM` |Locking Num Lock |
-|`KC_LOCKING_SCROLL` |`KC_LSCR` |Locking Scroll Lock |
-|`KC_KP_COMMA` |`KC_PCMM` |Keypad `,` |
-|`KC_KP_EQUAL_AS400` | |Keypad `=` on AS/400 keyboards |
-|`KC_INT1` |`KC_RO` |JIS `\` and `_` |
-|`KC_INT2` |`KC_KANA` |JIS Katakana/Hiragana |
-|`KC_INT3` |`KC_JYEN` |JIS `¥` and <code>&#124;</code> |
-|`KC_INT4` |`KC_HENK` |JIS Henkan |
-|`KC_INT5` |`KC_MHEN` |JIS Muhenkan |
-|`KC_INT6` | |JIS Numpad `,` |
-|`KC_INT7` | |International 7 |
-|`KC_INT8` | |International 8 |
-|`KC_INT9` | |International 9 |
-|`KC_LANG1` |`KC_HAEN` |Hangul/English |
-|`KC_LANG2` |`KC_HANJ` |Hanja |
-|`KC_LANG3` | |JIS Katakana |
-|`KC_LANG4` | |JIS Hiragana |
-|`KC_LANG5` | |JIS Zenkaku/Hankaku |
-|`KC_LANG6` | |Language 6 |
-|`KC_LANG7` | |Language 7 |
-|`KC_LANG8` | |Language 8 |
-|`KC_LANG9` | |Language 9 |
-|`KC_ALT_ERASE` |`KC_ERAS` |Alternate Erase |
-|`KC_SYSREQ` | |SysReq/Attention |
-|`KC_CANCEL` | |Cancel |
-|`KC_CLEAR` |`KC_CLR` |Clear |
-|`KC_PRIOR` | |Prior |
-|`KC_RETURN` | |Return |
-|`KC_SEPARATOR` | |Separator |
-|`KC_OUT` | |Out |
-|`KC_OPER` | |Oper |
-|`KC_CLEAR_AGAIN` | |Clear/Again |
-|`KC_CRSEL` | |CrSel/Props |
-|`KC_EXSEL` | |ExSel |
-|`KC_LCTRL` |`KC_LCTL` |Left Control |
-|`KC_LSHIFT` |`KC_LSFT` |Left Shift |
-|`KC_LALT` | |Left Alt |
-|`KC_LGUI` |`KC_LCMD`, `KC_LWIN`|Left GUI (Windows/Command/Meta key) |
-|`KC_RCTRL` |`KC_RCTL` |Right Control |
-|`KC_RSHIFT` |`KC_RSFT` |Right Shift |
-|`KC_RALT` |`KC_ALGR` |Right Alt (AltGr) |
-|`KC_RGUI` |`KC_RCMD`, `KC_RWIN`|Right GUI (Windows/Command/Meta key) |
-|`KC_SYSTEM_POWER` |`KC_PWR` |System Power Down |
-|`KC_SYSTEM_SLEEP` |`KC_SLEP` |System Sleep |
-|`KC_SYSTEM_WAKE` |`KC_WAKE` |System Wake |
-|`KC_AUDIO_MUTE` |`KC_MUTE` |Mute |
-|`KC_AUDIO_VOL_UP` |`KC_VOLU` |Volume Up |
-|`KC_AUDIO_VOL_DOWN` |`KC_VOLD` |Volume Down |
-|`KC_MEDIA_NEXT_TRACK` |`KC_MNXT` |Next Track (Windows) |
-|`KC_MEDIA_PREV_TRACK` |`KC_MPRV` |Previous Track (Windows) |
-|`KC_MEDIA_STOP` |`KC_MSTP` |Stop Track (Windows) |
-|`KC_MEDIA_PLAY_PAUSE` |`KC_MPLY` |Play/Pause Track |
-|`KC_MEDIA_SELECT` |`KC_MSEL` |Launch Media Player (Windows) |
-|`KC_MEDIA_EJECT` |`KC_EJCT` |Eject (macOS) |
-|`KC_MAIL` | |Launch Mail (Windows) |
-|`KC_CALCULATOR` |`KC_CALC` |Launch Calculator (Windows) |
-|`KC_MY_COMPUTER` |`KC_MYCM` |Launch My Computer (Windows) |
-|`KC_WWW_SEARCH` |`KC_WSCH` |Browser Search (Windows) |
-|`KC_WWW_HOME` |`KC_WHOM` |Browser Home (Windows) |
-|`KC_WWW_BACK` |`KC_WBAK` |Browser Back (Windows) |
-|`KC_WWW_FORWARD` |`KC_WFWD` |Browser Forward (Windows) |
-|`KC_WWW_STOP` |`KC_WSTP` |Browser Stop (Windows) |
-|`KC_WWW_REFRESH` |`KC_WREF` |Browser Refresh (Windows) |
-|`KC_WWW_FAVORITES` |`KC_WFAV` |Browser Favorites (Windows) |
-|`KC_MEDIA_FAST_FORWARD`|`KC_MFFD` |Next Track (macOS) |
-|`KC_MEDIA_REWIND` |`KC_MRWD` |Previous Track (macOS) |
-|`KC_BRIGHTNESS_UP` |`KC_BRIU` |Brightness Up |
-|`KC_BRIGHTNESS_DOWN` |`KC_BRID` |Brightness Down |
+|Key |Aliases |Description |
+|-----------------------|------------------------------|-----------------------------------------------|
+|`KC_NO` |`XXXXXXX` |Ignore this key (NOOP) |
+|`KC_TRANSPARENT` |`KC_TRNS`, `_______` |Use the next lowest non-transparent key |
+|`KC_A` | |`a` and `A` |
+|`KC_B` | |`b` and `B` |
+|`KC_C` | |`c` and `C` |
+|`KC_D` | |`d` and `D` |
+|`KC_E` | |`e` and `E` |
+|`KC_F` | |`f` and `F` |
+|`KC_G` | |`g` and `G` |
+|`KC_H` | |`h` and `H` |
+|`KC_I` | |`i` and `I` |
+|`KC_J` | |`j` and `J` |
+|`KC_K` | |`k` and `K` |
+|`KC_L` | |`l` and `L` |
+|`KC_M` | |`m` and `M` |
+|`KC_N` | |`n` and `N` |
+|`KC_O` | |`o` and `O` |
+|`KC_P` | |`p` and `P` |
+|`KC_Q` | |`q` and `Q` |
+|`KC_R` | |`r` and `R` |
+|`KC_S` | |`s` and `S` |
+|`KC_T` | |`t` and `T` |
+|`KC_U` | |`u` and `U` |
+|`KC_V` | |`v` and `V` |
+|`KC_W` | |`w` and `W` |
+|`KC_X` | |`x` and `X` |
+|`KC_Y` | |`y` and `Y` |
+|`KC_Z` | |`z` and `Z` |
+|`KC_1` | |`1` and `!` |
+|`KC_2` | |`2` and `@` |
+|`KC_3` | |`3` and `#` |
+|`KC_4` | |`4` and `$` |
+|`KC_5` | |`5` and `%` |
+|`KC_6` | |`6` and `^` |
+|`KC_7` | |`7` and `&` |
+|`KC_8` | |`8` and `*` |
+|`KC_9` | |`9` and `(` |
+|`KC_0` | |`0` and `)` |
+|`KC_ENTER` |`KC_ENT` |Return (Enter) |
+|`KC_ESCAPE` |`KC_ESC` |Escape |
+|`KC_BSPACE` |`KC_BSPC` |Delete (Backspace) |
+|`KC_TAB` | |Tab |
+|`KC_SPACE` |`KC_SPC` |Spacebar |
+|`KC_MINUS` |`KC_MINS` |`-` and `_` |
+|`KC_EQUAL` |`KC_EQL` |`=` and `+` |
+|`KC_LBRACKET` |`KC_LBRC` |`[` and `{` |
+|`KC_RBRACKET` |`KC_RBRC` |`]` and `}` |
+|`KC_BSLASH` |`KC_BSLS` |`\` and <code>&#124;</code> |
+|`KC_NONUS_HASH` |`KC_NUHS` |Non-US `#` and `~` |
+|`KC_SCOLON` |`KC_SCLN` |`;` and `:` |
+|`KC_QUOTE` |`KC_QUOT` |`'` and `"` |
+|`KC_GRAVE` |`KC_GRV`, `KC_ZKHK` |<code>&#96;</code> and `~`, JIS Zenkaku/Hankaku|
+|`KC_COMMA` |`KC_COMM` |`,` and `<` |
+|`KC_DOT` | |`.` and `>` |
+|`KC_SLASH` |`KC_SLSH` |`/` and `?` |
+|`KC_CAPSLOCK` |`KC_CLCK`, `KC_CAPS` |Caps Lock |
+|`KC_F1` | |F1 |
+|`KC_F2` | |F2 |
+|`KC_F3` | |F3 |
+|`KC_F4` | |F4 |
+|`KC_F5` | |F5 |
+|`KC_F6` | |F6 |
+|`KC_F7` | |F7 |
+|`KC_F8` | |F8 |
+|`KC_F9` | |F9 |
+|`KC_F10` | |F10 |
+|`KC_F11` | |F11 |
+|`KC_F12` | |F12 |
+|`KC_PSCREEN` |`KC_PSCR` |Print Screen |
+|`KC_SCROLLLOCK` |`KC_SLCK`, `KC_BRMD` |Scroll Lock, Brightness Down (macOS) |
+|`KC_PAUSE` |`KC_PAUS`, `KC_BRK`, `KC_BRMU`|Pause, Brightness Up (macOS) |
+|`KC_INSERT` |`KC_INS` |Insert |
+|`KC_HOME` | |Home |
+|`KC_PGUP` | |Page Up |
+|`KC_DELETE` |`KC_DEL` |Forward Delete |
+|`KC_END` | |End |
+|`KC_PGDOWN` |`KC_PGDN` |Page Down |
+|`KC_RIGHT` |`KC_RGHT` |Right Arrow |
+|`KC_LEFT` | |Left Arrow |
+|`KC_DOWN` | |Down Arrow |
+|`KC_UP` | |Up Arrow |
+|`KC_NUMLOCK` |`KC_NLCK` |Keypad Num Lock and Clear |
+|`KC_KP_SLASH` |`KC_PSLS` |Keypad `/` |
+|`KC_KP_ASTERISK` |`KC_PAST` |Keypad `*` |
+|`KC_KP_MINUS` |`KC_PMNS` |Keypad `-` |
+|`KC_KP_PLUS` |`KC_PPLS` |Keypad `+` |
+|`KC_KP_ENTER` |`KC_PENT` |Keypad Enter |
+|`KC_KP_1` |`KC_P1` |Keypad `1` and End |
+|`KC_KP_2` |`KC_P2` |Keypad `2` and Down Arrow |
+|`KC_KP_3` |`KC_P3` |Keypad `3` and Page Down |
+|`KC_KP_4` |`KC_P4` |Keypad `4` and Left Arrow |
+|`KC_KP_5` |`KC_P5` |Keypad `5` |
+|`KC_KP_6` |`KC_P6` |Keypad `6` and Right Arrow |
+|`KC_KP_7` |`KC_P7` |Keypad `7` and Home |
+|`KC_KP_8` |`KC_P8` |Keypad `8` and Up Arrow |
+|`KC_KP_9` |`KC_P9` |Keypad `9` and Page Up |
+|`KC_KP_0` |`KC_P0` |Keypad `0` and Insert |
+|`KC_KP_DOT` |`KC_PDOT` |Keypad `.` and Delete |
+|`KC_NONUS_BSLASH` |`KC_NUBS` |Non-US `\` and <code>&#124;</code> |
+|`KC_APPLICATION` |`KC_APP` |Application (Windows Menu Key) |
+|`KC_POWER` | |System Power (macOS) |
+|`KC_KP_EQUAL` |`KC_PEQL` |Keypad `=` |
+|`KC_F13` | |F13 |
+|`KC_F14` | |F14 |
+|`KC_F15` | |F15 |
+|`KC_F16` | |F16 |
+|`KC_F17` | |F17 |
+|`KC_F18` | |F18 |
+|`KC_F19` | |F19 |
+|`KC_F20` | |F20 |
+|`KC_F21` | |F21 |
+|`KC_F22` | |F22 |
+|`KC_F23` | |F23 |
+|`KC_F24` | |F24 |
+|`KC_EXECUTE` |`KC_EXEC` |Execute |
+|`KC_HELP` | |Help |
+|`KC_MENU` | |Menu |
+|`KC_SELECT` |`KC_SLCT` |Select |
+|`KC_STOP` | |Stop |
+|`KC_AGAIN` |`KC_AGIN` |Again |
+|`KC_UNDO` | |Undo |
+|`KC_CUT` | |Cut |
+|`KC_COPY` | |Copy |
+|`KC_PASTE` |`KC_PSTE` |Paste |
+|`KC_FIND` | |Find |
+|`KC__MUTE` | |Mute (macOS) |
+|`KC__VOLUP` | |Volume Up (macOS) |
+|`KC__VOLDOWN` | |Volume Down (macOS) |
+|`KC_LOCKING_CAPS` |`KC_LCAP` |Locking Caps Lock |
+|`KC_LOCKING_NUM` |`KC_LNUM` |Locking Num Lock |
+|`KC_LOCKING_SCROLL` |`KC_LSCR` |Locking Scroll Lock |
+|`KC_KP_COMMA` |`KC_PCMM` |Keypad `,` |
+|`KC_KP_EQUAL_AS400` | |Keypad `=` on AS/400 keyboards |
+|`KC_INT1` |`KC_RO` |JIS `\` and `_` |
+|`KC_INT2` |`KC_KANA` |JIS Katakana/Hiragana |
+|`KC_INT3` |`KC_JYEN` |JIS `¥` and <code>&#124;</code> |
+|`KC_INT4` |`KC_HENK` |JIS Henkan |
+|`KC_INT5` |`KC_MHEN` |JIS Muhenkan |
+|`KC_INT6` | |JIS Numpad `,` |
+|`KC_INT7` | |International 7 |
+|`KC_INT8` | |International 8 |
+|`KC_INT9` | |International 9 |
+|`KC_LANG1` |`KC_HAEN` |Hangul/English |
+|`KC_LANG2` |`KC_HANJ` |Hanja |
+|`KC_LANG3` | |JIS Katakana |
+|`KC_LANG4` | |JIS Hiragana |
+|`KC_LANG5` | |JIS Zenkaku/Hankaku |
+|`KC_LANG6` | |Language 6 |
+|`KC_LANG7` | |Language 7 |
+|`KC_LANG8` | |Language 8 |
+|`KC_LANG9` | |Language 9 |
+|`KC_ALT_ERASE` |`KC_ERAS` |Alternate Erase |
+|`KC_SYSREQ` | |SysReq/Attention |
+|`KC_CANCEL` | |Cancel |
+|`KC_CLEAR` |`KC_CLR` |Clear |
+|`KC_PRIOR` | |Prior |
+|`KC_RETURN` | |Return |
+|`KC_SEPARATOR` | |Separator |
+|`KC_OUT` | |Out |
+|`KC_OPER` | |Oper |
+|`KC_CLEAR_AGAIN` | |Clear/Again |
+|`KC_CRSEL` | |CrSel/Props |
+|`KC_EXSEL` | |ExSel |
+|`KC_LCTRL` |`KC_LCTL` |Left Control |
+|`KC_LSHIFT` |`KC_LSFT` |Left Shift |
+|`KC_LALT` | |Left Alt |
+|`KC_LGUI` |`KC_LCMD`, `KC_LWIN` |Left GUI (Windows/Command/Meta key) |
+|`KC_RCTRL` |`KC_RCTL` |Right Control |
+|`KC_RSHIFT` |`KC_RSFT` |Right Shift |
+|`KC_RALT` |`KC_ALGR` |Right Alt (AltGr) |
+|`KC_RGUI` |`KC_RCMD`, `KC_RWIN` |Right GUI (Windows/Command/Meta key) |
+|`KC_SYSTEM_POWER` |`KC_PWR` |System Power Down |
+|`KC_SYSTEM_SLEEP` |`KC_SLEP` |System Sleep |
+|`KC_SYSTEM_WAKE` |`KC_WAKE` |System Wake |
+|`KC_AUDIO_MUTE` |`KC_MUTE` |Mute |
+|`KC_AUDIO_VOL_UP` |`KC_VOLU` |Volume Up |
+|`KC_AUDIO_VOL_DOWN` |`KC_VOLD` |Volume Down |
+|`KC_MEDIA_NEXT_TRACK` |`KC_MNXT` |Next Track (Windows) |
+|`KC_MEDIA_PREV_TRACK` |`KC_MPRV` |Previous Track (Windows) |
+|`KC_MEDIA_STOP` |`KC_MSTP` |Stop Track (Windows) |
+|`KC_MEDIA_PLAY_PAUSE` |`KC_MPLY` |Play/Pause Track |
+|`KC_MEDIA_SELECT` |`KC_MSEL` |Launch Media Player (Windows) |
+|`KC_MEDIA_EJECT` |`KC_EJCT` |Eject (macOS) |
+|`KC_MAIL` | |Launch Mail (Windows) |
+|`KC_CALCULATOR` |`KC_CALC` |Launch Calculator (Windows) |
+|`KC_MY_COMPUTER` |`KC_MYCM` |Launch My Computer (Windows) |
+|`KC_WWW_SEARCH` |`KC_WSCH` |Browser Search (Windows) |
+|`KC_WWW_HOME` |`KC_WHOM` |Browser Home (Windows) |
+|`KC_WWW_BACK` |`KC_WBAK` |Browser Back (Windows) |
+|`KC_WWW_FORWARD` |`KC_WFWD` |Browser Forward (Windows) |
+|`KC_WWW_STOP` |`KC_WSTP` |Browser Stop (Windows) |
+|`KC_WWW_REFRESH` |`KC_WREF` |Browser Refresh (Windows) |
+|`KC_WWW_FAVORITES` |`KC_WFAV` |Browser Favorites (Windows) |
+|`KC_MEDIA_FAST_FORWARD`|`KC_MFFD` |Next Track (macOS) |
+|`KC_MEDIA_REWIND` |`KC_MRWD` |Previous Track (macOS) |
+|`KC_BRIGHTNESS_UP` |`KC_BRIU` |Brightness Up |
+|`KC_BRIGHTNESS_DOWN` |`KC_BRID` |Brightness Down |
## [Quantum Keycodes](quantum_keycodes.md#qmk-keycodes)
@@ -238,8 +238,6 @@ This is a reference only. Each group of keys links to the page documenting their
|`MU_TOG` | |Toggles Music Mode |
|`MU_MOD` | |Cycles through the music modes |
-
-
## [Backlighting](feature_backlight.md)
|Key |Description |
@@ -285,7 +283,6 @@ This is a reference only. Each group of keys links to the page documenting their
|`OUT_USB` |USB only |
|`OUT_BT` |Bluetooth only |
-
## [Layer Switching](feature_advanced_keycodes.md#switching-and-toggling-layers)
|Key |Description |
@@ -293,7 +290,7 @@ This is a reference only. Each group of keys links to the page documenting their
|`DF(layer)` |Set the base (default) layer |
|`MO(layer)` |Momentarily turn on `layer` when pressed (requires `KC_TRNS` on destination layer)|
|`OSL(layer)` |Momentarily activates `layer` until a key is pressed. See [One Shot Keys](https://docs.qmk.fm/#/feature_advanced_keycodes?id=one-shot-keys) for details. |
-|`LM(layer, mod)`|Momentarily turn on `layer` (like MO) with `mod` active as well.
+|`LM(layer, mod)`|Momentarily turn on `layer` (like MO) with `mod` active as well. Where `mod` is a mods_bit. Mods can be viewed [here](https://docs.qmk.fm/#/feature_advanced_keycodes?id=mod-tap). Example Implementation: `LM(LAYER_1, MOD_LALT)`|
|`LT(layer, kc)` |Turn on `layer` when held, `kc` when tapped |
|`TG(layer)` |Toggle `layer` on or off |
|`TO(layer)` |Turn on `layer` when pressed |
@@ -322,43 +319,43 @@ This is a reference only. Each group of keys links to the page documenting their
## [Modifiers](feature_advanced_keycodes.md#modifier-keys)
-|Key |Aliases |Description |
-|----------|----------------------|----------------------------------------------------|
-|`KC_HYPR` | |Hold Left Control, Shift, Alt and GUI |
-|`KC_MEH` | |Hold Left Control, Shift and Alt |
-|`LCTL(kc)`| |Hold Left Control and press `kc` |
-|`LSFT(kc)`|`S(kc)` |Hold Left Shift and press `kc` |
-|`LALT(kc)`| |Hold Left Alt and press `kc` |
-|`LGUI(kc)`|`LCMD(kc)`, `LWIN(kc)`|Hold Left GUI and press `kc` |
-|`RCTL(kc)`| |Hold Right Control and press `kc` |
-|`RSFT(kc)`| |Hold Right Shift and press `kc` |
-|`RALT(kc)`|`ALGR(kc)` |Hold Right Alt and press `kc` |
-|`RGUI(kc)`|`RCMD(kc)`, `LWIN(kc)`|Hold Right GUI and press `kc` |
-|`HYPR(kc)`| |Hold Left Control, Shift, Alt and GUI and press `kc`|
-|`MEH(kc)` | |Hold Left Control, Shift and Alt and press `kc` |
-|`LCAG(kc)`| |Hold Left Control, Alt and GUI and press `kc` |
-|`SGUI(kc)`|`SCMD(kc)`, `SWIN(kc)`|Hold Left Shift and GUI and press `kc` |
-|`LCA(kc)` | |Hold Left Control and Alt and press `kc` |
+|Key |Aliases |Description |
+|----------|-------------------------------|----------------------------------------------------|
+|`LCTL(kc)`|`C(kc)` |Hold Left Control and press `kc` |
+|`LSFT(kc)`|`S(kc)` |Hold Left Shift and press `kc` |
+|`LALT(kc)`|`A(kc)` |Hold Left Alt and press `kc` |
+|`LGUI(kc)`|`G(kc)`, `LCMD(kc)`, `LWIN(kc)`|Hold Left GUI and press `kc` |
+|`RCTL(kc)`| |Hold Right Control and press `kc` |
+|`RSFT(kc)`| |Hold Right Shift and press `kc` |
+|`RALT(kc)`|`ALGR(kc)` |Hold Right Alt and press `kc` |
+|`RGUI(kc)`|`RCMD(kc)`, `LWIN(kc)` |Hold Right GUI and press `kc` |
+|`SGUI(kc)`|`SCMD(kc)`, `SWIN(kc)` |Hold Left Shift and GUI and press `kc` |
+|`LCA(kc)` | |Hold Left Control and Alt and press `kc` |
+|`LCAG(kc)`| |Hold Left Control, Alt and GUI and press `kc` |
+|`MEH(kc)` | |Hold Left Control, Shift and Alt and press `kc` |
+|`HYPR(kc)`| |Hold Left Control, Shift, Alt and GUI and press `kc`|
+|`KC_MEH` | |Left Control, Shift and Alt |
+|`KC_HYPR` | |Left Control, Shift, Alt and GUI |
## [Mod-Tap Keys](feature_advanced_keycodes.md#mod-tap)
-|Key |Aliases |Description |
-|------------|---------------------------------------|-------------------------------------------------------|
-|`LCTL_T(kc)`|`CTL_T(kc)` |Left Control when held, `kc` when tapped |
-|`RCTL_T(kc)`| |Right Control when held, `kc` when tapped |
-|`LSFT_T(kc)`|`SFT_T(kc)` |Left Shift when held, `kc` when tapped |
-|`RSFT_T(kc)`| |Right Shift when held, `kc` when tapped |
-|`LALT_T(kc)`|`ALT_T(kc)` |Left Alt when held, `kc` when tapped |
-|`RALT_T(kc)`|`ALGR_T(kc)` |Right Alt when held, `kc` when tapped |
-|`LGUI_T(kc)`|`LCMD_T(kc)`, `RWIN_T(kc)`, `GUI_T(kc)`|Left GUI when held, `kc` when tapped |
-|`RGUI_T(kc)`|`RCMD_T(kc)`, `RWIN_T(kc)` |Right GUI when held, `kc` when tapped |
-|`C_S_T(kc)` | |Left Control and Shift when held, `kc` when tapped |
-|`MEH_T(kc)` | |Left Control, Shift and Alt when held, `kc` when tapped|
-|`LCAG_T(kc)`| |Left Control, Alt and GUI when held, `kc` when tapped |
-|`RCAG_T(kc)`| |Right Control, Alt and GUI when held, `kc` when tapped |
-|`ALL_T(kc)` | |Left Control, Shift, Alt and GUI when held, `kc` when tapped - more info [here](http://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/)|
-|`SGUI_T(kc)`|`SCMD_T(kc)`, `SWIN_T(kc)` |Left Shift and GUI when held, `kc` when tapped |
-|`LCA_T(kc)` | |Left Control and Alt when held, `kc` when tapped |
+|Key |Aliases |Description |
+|------------|-----------------------------------------------------------------|-------------------------------------------------------|
+|`LCTL_T(kc)`|`CTL_T(kc)` |Left Control when held, `kc` when tapped |
+|`LSFT_T(kc)`|`SFT_T(kc)` |Left Shift when held, `kc` when tapped |
+|`LALT_T(kc)`|`ALT_T(kc)` |Left Alt when held, `kc` when tapped |
+|`LGUI_T(kc)`|`LCMD_T(kc)`, `LWIN_T(kc)`, `GUI_T(kc)`, `CMD_T(kc)`, `WIN_T(kc)`|Left GUI when held, `kc` when tapped |
+|`RCTL_T(kc)`| |Right Control when held, `kc` when tapped |
+|`RSFT_T(kc)`| |Right Shift when held, `kc` when tapped |
+|`RALT_T(kc)`|`ALGR_T(kc)` |Right Alt when held, `kc` when tapped |
+|`RGUI_T(kc)`|`RCMD_T(kc)`, `RWIN_T(kc)` |Right GUI when held, `kc` when tapped |
+|`SGUI_T(kc)`|`SCMD_T(kc)`, `SWIN_T(kc)` |Left Shift and GUI when held, `kc` when tapped |
+|`LCA_T(kc)` | |Left Control and Alt when held, `kc` when tapped |
+|`LCAG_T(kc)`| |Left Control, Alt and GUI when held, `kc` when tapped |
+|`RCAG_T(kc)`| |Right Control, Alt and GUI when held, `kc` when tapped |
+|`C_S_T(kc)` | |Left Control and Shift when held, `kc` when tapped |
+|`MEH_T(kc)` | |Left Control, Shift and Alt when held, `kc` when tapped|
+|`HYPR_T(kc)`|`ALL_T(kc)` |Left Control, Shift, Alt and GUI when held, `kc` when tapped - more info [here](http://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/)|
## [RGB Lighting](feature_rgblight.md)
@@ -439,7 +436,6 @@ This is a reference only. Each group of keys links to the page documenting their
|`OSM(mod)` |Hold `mod` for one keypress |
|`OSL(layer)`|Switch to `layer` for one keypress|
-
## [Swap Hands](feature_swap_hands.md)
|Key |Description |
@@ -454,7 +450,7 @@ This is a reference only. Each group of keys links to the page documenting their
## [Unicode Support](feature_unicode.md)
-|Key |Aliases| |
-|------------|-------|-------------------------------------------------|
-|`UNICODE(n)`|`UC(n)`|Send Unicode character `n` |
-|`X(n)` | |Send Unicode character `n` via a different method|
+|Key |Description |
+|-------|---------------------------------------------------------------------------|
+|`UC(c)`|Send Unicode code point `c` (`UNICODE_ENABLE`) |
+|`X(i)` |Send Unicode code point at index `i` in `unicode_map` (`UNICODEMAP_ENABLE`)|
diff --git a/docs/keycodes_basic.md b/docs/keycodes_basic.md
index cba876d346..6f21cabd2a 100644
--- a/docs/keycodes_basic.md
+++ b/docs/keycodes_basic.md
@@ -97,14 +97,14 @@ The basic set of keycodes are based on the [HID Keyboard/Keypad Usage Page (0x07
## Lock Keys
-|Key |Aliases |Description |
-|-------------------|--------------------|-------------------------|
-|`KC_CAPSLOCK` |`KC_CLCK`, `KC_CAPS`|Caps Lock |
-|`KC_SCROLLLOCK` |`KC_SLCK` |Scroll Lock |
-|`KC_NUMLOCK` |`KC_NLCK` |Keypad Num Lock and Clear|
-|`KC_LOCKING_CAPS` |`KC_LCAP` |Locking Caps Lock |
-|`KC_LOCKING_NUM` |`KC_LNUM` |Locking Num Lock |
-|`KC_LOCKING_SCROLL`|`KC_LSCR` |Locking Scroll Lock |
+|Key |Aliases |Description |
+|-------------------|--------------------|------------------------------------|
+|`KC_CAPSLOCK` |`KC_CLCK`, `KC_CAPS`|Caps Lock |
+|`KC_SCROLLLOCK` |`KC_SLCK`, `KC_BRMD`|Scroll Lock, Brightness Down (macOS)|
+|`KC_NUMLOCK` |`KC_NLCK` |Keypad Num Lock and Clear |
+|`KC_LOCKING_CAPS` |`KC_LCAP` |Locking Caps Lock |
+|`KC_LOCKING_NUM` |`KC_LNUM` |Locking Num Lock |
+|`KC_LOCKING_SCROLL`|`KC_LSCR` |Locking Scroll Lock |
## Modifiers
@@ -144,48 +144,48 @@ The basic set of keycodes are based on the [HID Keyboard/Keypad Usage Page (0x07
## Commands
-|Key |Aliases |Description |
-|------------------|-------------------|------------------------------|
-|`KC_PSCREEN` |`KC_PSCR` |Print Screen |
-|`KC_PAUSE` |`KC_PAUS`, `KC_BRK`|Pause |
-|`KC_INSERT` |`KC_INS` |Insert |
-|`KC_HOME` | |Home |
-|`KC_PGUP` | |Page Up |
-|`KC_DELETE` |`KC_DEL` |Forward Delete |
-|`KC_END` | |End |
-|`KC_PGDOWN` |`KC_PGDN` |Page Down |
-|`KC_RIGHT` |`KC_RGHT` |Right Arrow |
-|`KC_LEFT` | |Left Arrow |
-|`KC_DOWN` | |Down Arrow |
-|`KC_UP` | |Up Arrow |
-|`KC_APPLICATION` |`KC_APP` |Application (Windows Menu Key)|
-|`KC_POWER` | |System Power (macOS/Linux) |
-|`KC_EXECUTE` |`KC_EXEC` |Execute |
-|`KC_HELP` | |Help |
-|`KC_MENU` | |Menu |
-|`KC_SELECT` |`KC_SLCT` |Select |
-|`KC_STOP` | |Stop |
-|`KC_AGAIN` |`KC_AGIN` |Again |
-|`KC_UNDO` | |Undo |
-|`KC_CUT` | |Cut |
-|`KC_COPY` | |Copy |
-|`KC_PASTE` |`KC_PSTE` |Paste |
-|`KC_FIND` | |Find |
-|`KC__MUTE` | |Mute (macOS) |
-|`KC__VOLUP` | |Volume Up (macOS) |
-|`KC__VOLDOWN` | |Volume Down (macOS) |
-|`KC_ALT_ERASE` |`KC_ERAS` |Alternate Erase |
-|`KC_SYSREQ` | |SysReq/Attention |
-|`KC_CANCEL` | |Cancel |
-|`KC_CLEAR` |`KC_CLR` |Clear |
-|`KC_PRIOR` | |Prior |
-|`KC_RETURN` | |Return |
-|`KC_SEPARATOR` | |Separator |
-|`KC_OUT` | |Out |
-|`KC_OPER` | |Oper |
-|`KC_CLEAR_AGAIN` | |Clear/Again |
-|`KC_CRSEL` | |CrSel/Props |
-|`KC_EXSEL` | |ExSel |
+|Key |Aliases |Description |
+|------------------|------------------------------|------------------------------|
+|`KC_PSCREEN` |`KC_PSCR` |Print Screen |
+|`KC_PAUSE` |`KC_PAUS`, `KC_BRK`, `KC_BRMU`|Pause, Brightness Up (macOS) |
+|`KC_INSERT` |`KC_INS` |Insert |
+|`KC_HOME` | |Home |
+|`KC_PGUP` | |Page Up |
+|`KC_DELETE` |`KC_DEL` |Forward Delete |
+|`KC_END` | |End |
+|`KC_PGDOWN` |`KC_PGDN` |Page Down |
+|`KC_RIGHT` |`KC_RGHT` |Right Arrow |
+|`KC_LEFT` | |Left Arrow |
+|`KC_DOWN` | |Down Arrow |
+|`KC_UP` | |Up Arrow |
+|`KC_APPLICATION` |`KC_APP` |Application (Windows Menu Key)|
+|`KC_POWER` | |System Power (macOS/Linux) |
+|`KC_EXECUTE` |`KC_EXEC` |Execute |
+|`KC_HELP` | |Help |
+|`KC_MENU` | |Menu |
+|`KC_SELECT` |`KC_SLCT` |Select |
+|`KC_STOP` | |Stop |
+|`KC_AGAIN` |`KC_AGIN` |Again |
+|`KC_UNDO` | |Undo |
+|`KC_CUT` | |Cut |
+|`KC_COPY` | |Copy |
+|`KC_PASTE` |`KC_PSTE` |Paste |
+|`KC_FIND` | |Find |
+|`KC__MUTE` | |Mute (macOS) |
+|`KC__VOLUP` | |Volume Up (macOS) |
+|`KC__VOLDOWN` | |Volume Down (macOS) |
+|`KC_ALT_ERASE` |`KC_ERAS` |Alternate Erase |
+|`KC_SYSREQ` | |SysReq/Attention |
+|`KC_CANCEL` | |Cancel |
+|`KC_CLEAR` |`KC_CLR` |Clear |
+|`KC_PRIOR` | |Prior |
+|`KC_RETURN` | |Return |
+|`KC_SEPARATOR` | |Separator |
+|`KC_OUT` | |Out |
+|`KC_OPER` | |Oper |
+|`KC_CLEAR_AGAIN` | |Clear/Again |
+|`KC_CRSEL` | |CrSel/Props |
+|`KC_EXSEL` | |ExSel |
## Media Keys
diff --git a/docs/proton_c_conversion.md b/docs/proton_c_conversion.md
new file mode 100644
index 0000000000..be7d50a9f4
--- /dev/null
+++ b/docs/proton_c_conversion.md
@@ -0,0 +1,21 @@
+# Converting a board to use the Proton C
+
+If a board currently supported in QMK uses a Pro Micro (or compatible board) and you want to use the Proton C, you can generate the firmware by appending `CONVERT_TO_PROTON_C=yes` (or `CTPC=yes`) to your make argument, like this:
+
+ make 40percentclub/mf68:default CTPC=yes
+
+You can add the same argument to your keymap's `rules.mk`, which will accomplish the same thing.
+
+This exposes the `CONVERT_TO_PROTON_C` flag that you can use in your code with `#ifdef`s, like this:
+
+ #ifdef CONVERT_TO_PROTON_C
+ // Proton C code
+ #else
+ // Pro Micro code
+ #endif
+
+Before being able to compile, you may get some errors about `PORTB/DDRB`, etc not being defined, so you'll need to convert the keyboard's code to use the [GPIO Controls](internals_gpio_control.md) that will work for both ARM and AVR. This shouldn't affect the AVR builds at all.
+
+The Proton C only has one on-board LED (C13), and by default, the TXLED (D5) is mapped to it. If you want the RXLED (B0) mapped to it instead, add this like to your `config.h`:
+
+ #define CONVERT_TO_PROTON_C_RXLED
diff --git a/docs/understanding_qmk.md b/docs/understanding_qmk.md
index 35596cc692..20ead2b3f5 100644
--- a/docs/understanding_qmk.md
+++ b/docs/understanding_qmk.md
@@ -12,7 +12,7 @@ You can think of QMK as no different from any other computer program. It is star
The reason for this is the different platforms that QMK supports. The most common platform is `lufa`, which runs on AVR processors such at the atmega32u4. We also support `chibios` and `vusb`.
-We'll focus on AVR processors for the moment, which use the `lufa` platform. You can find the `main()` function in [tmk_core/protocol/lufa/lufa.c](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/tmk_core/protocol/lufa/lufa.c#L1019). If you browse through that function you'll find that it initializes any hardware that has been configured (including USB to the host) and then it starts the core part of the program with a [`while(1)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/tmk_core/protocol/lufa/lufa.c#L1060). This is [The Main Loop](#the-main-loop).
+We'll focus on AVR processors for the moment, which use the `lufa` platform. You can find the `main()` function in [tmk_core/protocol/lufa/lufa.c](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/tmk_core/protocol/lufa/lufa.c#L1028). If you browse through that function you'll find that it initializes any hardware that has been configured (including USB to the host) and then it starts the core part of the program with a [`while(1)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/tmk_core/protocol/lufa/lufa.c#L1069). This is [The Main Loop](#the-main-loop).
## The Main Loop
@@ -22,7 +22,7 @@ This section of code is called "The Main Loop" because it's responsible for loop
keyboard_task();
```
-This is where all the keyboard specific functionality is dispatched. The source code for `keyboard_task()` can be found in [tmk_core/common/keyboard.c](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/tmk_core/common/keyboard.c#L206), and it is responsible for detecting changes in the matrix and turning status LED's on and off.
+This is where all the keyboard specific functionality is dispatched. The source code for `keyboard_task()` can be found in [tmk_core/common/keyboard.c](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/tmk_core/common/keyboard.c#L216), and it is responsible for detecting changes in the matrix and turning status LED's on and off.
Within `keyboard_task()` you'll find code to handle:
@@ -77,7 +77,7 @@ At the keyboard level we define a C macro (typically named `KEYMAP()`) which map
Notice how the second block of our `KEYMAP()` macro matches the Matrix Scanning array above? This macro is what will map the matrix scanning array to keycodes. However, if you look at a 17 key numpad you'll notice that it has 3 places where the matrix could have a switch but doesn't, due to larger keys. We have populated those spaces with `KC_NO` so that our keymap definition doesn't have to.
-You can also use this macro to handle unusual matrix layouts, for example the [Clueboard rev 2](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/keyboards/clueboard/66/rev2/rev2.h). Explaining that is outside the scope of this document.
+You can also use this macro to handle unusual matrix layouts, for example the [Clueboard rev 2](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/keyboards/clueboard/66/rev2/rev2.h). Explaining that is outside the scope of this document.
##### Keycode Assignment
@@ -130,31 +130,33 @@ Comparing against our keymap we can see that the pressed key is KC_NLCK. From he
##### Process Record
-The `process_record()` function itself is deceptively simple, but hidden within is a gateway to overriding functionality at various levels of QMK. The chain of events is listed below, using cluecard whenever we need to look at the keyboard/keymap level functions. Depending on options set in rule.mk or elsewhere, only a subset of the functions below will be included in final firmware.
-
-* [`void process_record(keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/08c682c193f43e5d54df990680ae93fc2e06150a/tmk_core/common/action.c#L172)
- * [`bool process_record_quantum(keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/08c682c193f43e5d54df990680ae93fc2e06150a/quantum/quantum.c#L193)
- * [Map this record to a keycode](https://github.com/qmk/qmk_firmware/blob/08c682c193f43e5d54df990680ae93fc2e06150a/quantum/quantum.c#L213)
- * [`void preprocess_tap_dance(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/08c682c193f43e5d54df990680ae93fc2e06150a/quantum/process_keycode/process_tap_dance.c#L115)
- * [`bool process_key_lock(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/08c682c193f43e5d54df990680ae93fc2e06150a/quantum/process_keycode/process_key_lock.c#L62)
- * [`bool process_clicky(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/08c682c193f43e5d54df990680ae93fc2e06150a/quantum/process_keycode/process_clicky.c#L44)
- * [`bool process_record_kb(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/08c682c193f43e5d54df990680ae93fc2e06150a/keyboards/clueboard/card/card.c#L20)
- * [`bool process_record_user(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/08c682c193f43e5d54df990680ae93fc2e06150a/keyboards/clueboard/card/keymaps/default/keymap.c#L58)
- * [`bool process_rgb_matrix(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/fdd0f915271f79b104aa5d216566bcc3fd134e85/quantum/rgb_matrix.c#L139)
- * [`bool process_midi(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/process_keycode/process_midi.c#L81)
- * [`bool process_audio(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/process_keycode/process_audio.c#L19)
- * [`bool process_steno(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/process_keycode/process_steno.c#L160)
- * [`bool process_music(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/process_keycode/process_music.c#L114)
- * [`bool process_tap_dance(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/process_keycode/process_tap_dance.c#L136)
- * [`bool process_leader(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/process_keycode/process_leader.c#L38)
- * [`bool process_combo(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/process_keycode/process_combo.c#L115)
- * [`bool process_unicode(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/process_keycode/process_unicode.c#L22)
- * [`bool process_ucis(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/process_keycode/process_ucis.c#L91)
- * [`bool process_printer(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/process_keycode/process_printer.c#L77)
- * [`bool process_auto_shift(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/process_keycode/process_auto_shift.c#L94)
- * [`bool process_unicode_map(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/process_keycode/process_unicodemap.c#L47)
- * [`bool process_terminal(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/process_keycode/process_terminal.c#L264)
- * [Identify and process quantum specific keycodes](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/quantum.c#L287)
+The `process_record()` function itself is deceptively simple, but hidden within is a gateway to overriding functionality at various levels of QMK. The chain of events is listed below, using cluecard whenever we need to look at the keyboard/keymap level functions. Depending on options set in `rules.mk` or elsewhere, only a subset of the functions below will be included in final firmware.
+
+* [`void process_record(keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/tmk_core/common/action.c#L172)
+ * [`bool process_record_quantum(keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/quantum.c#L206)
+ * [Map this record to a keycode](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/quantum.c#L226)
+ * [`void preprocess_tap_dance(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_tap_dance.c#L119)
+ * [`bool process_key_lock(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_key_lock.c#L62)
+ * [`bool process_clicky(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_clicky.c#L79)
+ * [`bool process_record_kb(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/keyboards/clueboard/card/card.c#L20)
+ * [`bool process_record_user(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/keyboards/clueboard/card/keymaps/default/keymap.c#L58)
+ * [`bool process_rgb_matrix(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/rgb_matrix.c#L139)
+ * [`bool process_midi(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_midi.c#L81)
+ * [`bool process_audio(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_audio.c#L19)
+ * [`bool process_steno(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_steno.c#L160)
+ * [`bool process_music(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_music.c#L114)
+ * [`bool process_tap_dance(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_tap_dance.c#L141)
+ * [`bool process_unicode_common(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_unicode_common.c#L169)
+ calls one of:
+ * [`bool process_unicode(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_unicode.c#L20)
+ * [`bool process_unicodemap(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_unicodemap.c#L46)
+ * [`bool process_ucis(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_ucis.c#L95)
+ * [`bool process_leader(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_leader.c#L51)
+ * [`bool process_combo(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_combo.c#L115)
+ * [`bool process_printer(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_printer.c#L77)
+ * [`bool process_auto_shift(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_auto_shift.c#L94)
+ * [`bool process_terminal(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_terminal.c#L264)
+ * [Identify and process Quantum-specific keycodes](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/quantum.c#L291)
At any step during this chain of events a function (such as `process_record_kb()`) can `return false` to halt all further processing.
diff --git a/docs/zh/_sidebar.md b/docs/zh/_summary.md
index c167612929..c167612929 100644
--- a/docs/zh/_sidebar.md
+++ b/docs/zh/_summary.md