diff options
| author | Jack Humbert <jack.humb@gmail.com> | 2017-07-07 15:57:18 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-07-07 15:57:18 -0400 |
| commit | 0787d70e55a668244445d9328f3cda2303cc6877 (patch) | |
| tree | d2134fc159433f3cf4967d831a6b30de5630f744 /docs/quantum_keycodes.md | |
| parent | 9de443cbf10ac41bc15762c9c83f138f51dd3b9a (diff) | |
| parent | ecd3dbf085826459af9728b6529a504ba7d3de14 (diff) | |
| download | qmk_firmware-0787d70e55a668244445d9328f3cda2303cc6877.tar.gz qmk_firmware-0787d70e55a668244445d9328f3cda2303cc6877.zip | |
Updates Documentation from #1444
Diffstat (limited to 'docs/quantum_keycodes.md')
| -rw-r--r-- | docs/quantum_keycodes.md | 349 |
1 files changed, 349 insertions, 0 deletions
diff --git a/docs/quantum_keycodes.md b/docs/quantum_keycodes.md new file mode 100644 index 000000000..a59d8fbc8 --- /dev/null +++ b/docs/quantum_keycodes.md | |||
| @@ -0,0 +1,349 @@ | |||
| 1 | # Quantum Keycodes | ||
| 2 | |||
| 3 | All keycodes within quantum are numbers between `0x0000` and `0xFFFF`. Within your `keymap.c` it may look like you have functions and other special cases, but ultimately the C preprocessor will translate those into a single 4 byte integer. QMK has reserved `0x0000` through `0x00FF` for standard keycodes. These are keycodes such as `KC_A`, `KC_1`, and `KC_LCTL`, which are basic keys defined in the USB HID specification. | ||
| 4 | |||
| 5 | On this page we have documented keycodes between `0x00FF` and `0xFFFF` which are used to implement advanced quantum features. If you define your own custom keycodes they will be put into this range as well. Keycodes above `0x00FF` may not be used with any of the mod/layer-tap keys listed | ||
| 6 | |||
| 7 | ## QMK keycodes | ||
| 8 | |||
| 9 | |Name|Description| | ||
| 10 | |----|-----------| | ||
| 11 | |`RESET`|Put the keyboard into DFU mode for flashing| | ||
| 12 | |`DEBUG`|Toggles debug mode| | ||
| 13 | |`KC_GESC`/`GRAVE_ESC`|Acts as escape when pressed normally but when pressed with Shift or GUI will send a `~`| | ||
| 14 | |`KC_LSPO`|Left shift when held, open paranthesis when tapped| | ||
| 15 | |`KC_RSPC`|Right shift when held, close paranthesis when tapped| | ||
| 16 | |`KC_LEAD`|The [leader key](leader_key.md)| | ||
| 17 | |`FUNC(n)`/`F(n)`|Call `fn_action(n)`| | ||
| 18 | |`M(n)`|to call macro n| | ||
| 19 | |`MACROTAP(n)`|to macro-tap n idk FIXME| | ||
| 20 | |||
| 21 | ## Bootmagic Keycodes | ||
| 22 | |||
| 23 | Shortcuts for bootmagic options (these work even when bootmagic is off.) | ||
| 24 | |||
| 25 | |Name|Description| | ||
| 26 | |----|-----------| | ||
| 27 | |`MAGIC_SWAP_CONTROL_CAPSLOCK`|Swap Capslock and Left Control| | ||
| 28 | |`MAGIC_CAPSLOCK_TO_CONTROL`|Treat Capslock like a Control Key| | ||
| 29 | |`MAGIC_SWAP_LALT_LGUI`|Swap the left Alt and GUI keys| | ||
| 30 | |`MAGIC_SWAP_RALT_RGUI`|Swap the right Alt and GUI keys| | ||
| 31 | |`MAGIC_NO_GUI`|Disable the GUI key| | ||
| 32 | |`MAGIC_SWAP_GRAVE_ESC`|Swap the Grave and Esc key.| | ||
| 33 | |`MAGIC_SWAP_BACKSLASH_BACKSPACE`|Swap backslack and backspace| | ||
| 34 | |`MAGIC_HOST_NKRO`|Force NKRO on| | ||
| 35 | |`MAGIC_SWAP_ALT_GUI`/`AG_SWAP`|Swap Alt and Gui on both sides| | ||
| 36 | |`MAGIC_UNSWAP_CONTROL_CAPSLOCK`|Disable the Control/Capslock swap| | ||
| 37 | |`MAGIC_UNCAPSLOCK_TO_CONTROL`|Disable treating Capslock like Control | | ||
| 38 | |`MAGIC_UNSWAP_LALT_LGUI`|Disable Left Alt and GUI switching| | ||
| 39 | |`MAGIC_UNSWAP_RALT_RGUI`|Disable Right Alt and GUI switching| | ||
| 40 | |`MAGIC_UNNO_GUI`|Enable the GUI key | | ||
| 41 | |`MAGIC_UNSWAP_GRAVE_ESC`|Disable the Grave/Esc swap | | ||
| 42 | |`MAGIC_UNSWAP_BACKSLASH_BACKSPACE`|Disable the backslash/backspace swap| | ||
| 43 | |`MAGIC_UNHOST_NKRO`|Force NKRO off| | ||
| 44 | |`MAGIC_UNSWAP_ALT_GUI`/`AG_NORM`|Disable the Alt/GUI switching| | ||
| 45 | |`MAGIC_TOGGLE_NKRO`|Turn NKRO on or off| | ||
| 46 | |||
| 47 | ## Audio | ||
| 48 | |||
| 49 | ```c | ||
| 50 | #ifdef AUDIO_ENABLE | ||
| 51 | AU_ON, | ||
| 52 | AU_OFF, | ||
| 53 | AU_TOG, | ||
| 54 | |||
| 55 | #ifdef FAUXCLICKY_ENABLE | ||
| 56 | FC_ON, | ||
| 57 | FC_OFF, | ||
| 58 | FC_TOG, | ||
| 59 | #endif | ||
| 60 | |||
| 61 | // Music mode on/off/toggle | ||
| 62 | MU_ON, | ||
| 63 | MU_OFF, | ||
| 64 | MU_TOG, | ||
| 65 | |||
| 66 | // Music voice iterate | ||
| 67 | MUV_IN, | ||
| 68 | MUV_DE, | ||
| 69 | #endif | ||
| 70 | ``` | ||
| 71 | |||
| 72 | ### Midi | ||
| 73 | |||
| 74 | #if !MIDI_ENABLE_STRICT || (defined(MIDI_ENABLE) && defined(MIDI_BASIC)) | ||
| 75 | MI_ON, // send midi notes when music mode is enabled | ||
| 76 | MI_OFF, // don't send midi notes when music mode is enabled | ||
| 77 | #endif | ||
| 78 | |||
| 79 | MIDI_TONE_MIN, | ||
| 80 | MIDI_TONE_MAX | ||
| 81 | |||
| 82 | MI_C = MIDI_TONE_MIN, | ||
| 83 | MI_Cs, | ||
| 84 | MI_Db = MI_Cs, | ||
| 85 | MI_D, | ||
| 86 | MI_Ds, | ||
| 87 | MI_Eb = MI_Ds, | ||
| 88 | MI_E, | ||
| 89 | MI_F, | ||
| 90 | MI_Fs, | ||
| 91 | MI_Gb = MI_Fs, | ||
| 92 | MI_G, | ||
| 93 | MI_Gs, | ||
| 94 | MI_Ab = MI_Gs, | ||
| 95 | MI_A, | ||
| 96 | MI_As, | ||
| 97 | MI_Bb = MI_As, | ||
| 98 | MI_B, | ||
| 99 | |||
| 100 | MIDI_TONE_KEYCODE_OCTAVES > 1 | ||
| 101 | |||
| 102 | where x = 1-5: | ||
| 103 | MI_C_x, | ||
| 104 | MI_Cs_x, | ||
| 105 | MI_Db_x = MI_Cs_x, | ||
| 106 | MI_D_x, | ||
| 107 | MI_Ds_x, | ||
| 108 | MI_Eb_x = MI_Ds_x, | ||
| 109 | MI_E_x, | ||
| 110 | MI_F_x, | ||
| 111 | MI_Fs_x, | ||
| 112 | MI_Gb_x = MI_Fs_x, | ||
| 113 | MI_G_x, | ||
| 114 | MI_Gs_x, | ||
| 115 | MI_Ab_x = MI_Gs_x, | ||
| 116 | MI_A_x, | ||
| 117 | MI_As_x, | ||
| 118 | MI_Bb_x = MI_As_x, | ||
| 119 | MI_B_x, | ||
| 120 | |||
| 121 | MI_OCT_Nx 1-2 | ||
| 122 | MI_OCT_x 0-7 | ||
| 123 | MIDI_OCTAVE_MIN = MI_OCT_N2, | ||
| 124 | MIDI_OCTAVE_MAX = MI_OCT_7, | ||
| 125 | MI_OCTD, // octave down | ||
| 126 | MI_OCTU, // octave up | ||
| 127 | |||
| 128 | MI_TRNS_Nx 1-6 | ||
| 129 | MI_TRNS_x 0-6 | ||
| 130 | MIDI_TRANSPOSE_MIN = MI_TRNS_N6, | ||
| 131 | MIDI_TRANSPOSE_MAX = MI_TRNS_6, | ||
| 132 | MI_TRNSD, // transpose down | ||
| 133 | MI_TRNSU, // transpose up | ||
| 134 | |||
| 135 | MI_VEL_x 1-10 | ||
| 136 | MIDI_VELOCITY_MIN = MI_VEL_1, | ||
| 137 | MIDI_VELOCITY_MAX = MI_VEL_9, | ||
| 138 | MI_VELD, // velocity down | ||
| 139 | MI_VELU, // velocity up | ||
| 140 | |||
| 141 | MI_CHx 1-16 | ||
| 142 | MIDI_CHANNEL_MIN = MI_CH1 | ||
| 143 | MIDI_CHANNEL_MAX = MI_CH16, | ||
| 144 | MI_CHD, // previous channel | ||
| 145 | MI_CHU, // next channel | ||
| 146 | |||
| 147 | MI_ALLOFF, // all notes off | ||
| 148 | |||
| 149 | MI_SUS, // sustain | ||
| 150 | MI_PORT, // portamento | ||
| 151 | MI_SOST, // sostenuto | ||
| 152 | MI_SOFT, // soft pedal | ||
| 153 | MI_LEG, // legato | ||
| 154 | |||
| 155 | MI_MOD, // modulation | ||
| 156 | MI_MODSD, // decrease modulation speed | ||
| 157 | MI_MODSU, // increase modulation speed | ||
| 158 | #endif // MIDI_ADVANCED | ||
| 159 | |||
| 160 | ## Backlight | ||
| 161 | |||
| 162 | These keycodes control the backlight. Most keyboards use this for single color in-switch lighting. | ||
| 163 | |||
| 164 | |Name|Description| | ||
| 165 | |----|-----------| | ||
| 166 | |`BL_x`|Set a specific backlight level between 0-9| | ||
| 167 | |`BL_ON`|An alias for `BL_9`| | ||
| 168 | |`BL_OFF`|An alias for `BL_0`| | ||
| 169 | |`BL_DEC`|Turn the backlight level down by 1| | ||
| 170 | |`BL_INC`|Turn the backlight level up by 1| | ||
| 171 | |`BL_TOGG`|Toggle the backlight on or off| | ||
| 172 | |`BL_STEP`|Step through backlight levels, wrapping around to 0 when you reach the top.| | ||
| 173 | |||
| 174 | ## RGBLIGHT WS2818 LEDs | ||
| 175 | |||
| 176 | This controls the `RGBLIGHT` functionality. Most keyboards use WS2812 (and compatible) LEDs for underlight or case lighting. | ||
| 177 | |||
| 178 | |Name|Description| | ||
| 179 | |----|-----------| | ||
| 180 | |`RGB_TOG`|toggle on/off| | ||
| 181 | |`RGB_MOD`|cycle through modes| | ||
| 182 | |`RGB_HUI`|hue increase| | ||
| 183 | |`RGB_HUD`|hue decrease| | ||
| 184 | |`RGB_SAI`|saturation increase| | ||
| 185 | |`RGB_SAD`|saturation decrease| | ||
| 186 | |`RGB_VAI`|value increase| | ||
| 187 | |`RGB_VAD`|value decrease| | ||
| 188 | |||
| 189 | ## Thermal Printer (experimental) | ||
| 190 | |||
| 191 | |Name|Description| | ||
| 192 | |----|-----------| | ||
| 193 | |`PRINT_ON`|Start printing everything the user types| | ||
| 194 | |`PRINT_OFF`|Stop printing everything the user types| | ||
| 195 | |||
| 196 | ## Keyboard output selection | ||
| 197 | |||
| 198 | This is used when multiple keyboard outputs can be selected. Currently this only allows for switching between USB and Bluetooth on keyboards that support both. | ||
| 199 | |||
| 200 | |Name|Description| | ||
| 201 | |----|-----------| | ||
| 202 | |`OUT_AUTO`|auto mode| | ||
| 203 | |`OUT_USB`|usb only| | ||
| 204 | |`OUT_BT`|bluetooth (when `BLUETOOTH_ENABLE`)| | ||
| 205 | |||
| 206 | ## Modifiers | ||
| 207 | |||
| 208 | These are special keycodes that simulate pressing several modifiers at once. | ||
| 209 | |||
| 210 | |Name|Description| | ||
| 211 | |----|-----------| | ||
| 212 | |`KC_HYPR`|Hold down LCTL + LSFT + LALT + LGUI| | ||
| 213 | |`KC_MEH`|Hold down LCTL + LSFT + LALT| | ||
| 214 | |||
| 215 | /* FIXME: Should we have these in QMK too? | ||
| 216 | * |`KC_LCAG`|`LCTL` + `LALT` + `LGUI`| | ||
| 217 | * |`KC_ALTG`|`RCTL` + `RALT`| | ||
| 218 | * |`KC_SCMD`/`KC_SWIN`|`LGUI` + `LSFT`| | ||
| 219 | * |`KC_LCA`|`LCTL` + `LALT`| | ||
| 220 | */ | ||
| 221 | |||
| 222 | ### Modifiers with keys | ||
| 223 | |||
| 224 | |Name|Description| | ||
| 225 | |----|-----------| | ||
| 226 | |`LCTL(kc)`|`LCTL` + `kc`| | ||
| 227 | |`LSFT(kc)`/`S(kc)`|`LSFT` + `kc`| | ||
| 228 | |`LALT(kc)`|`LALT` + `kc`| | ||
| 229 | |`LGUI(kc)`|`LGUI` + `kc`| | ||
| 230 | |`RCTL(kc)`|`RCTL` + `kc`| | ||
| 231 | |`RSFT(kc)`|`RSFT` + `kc`| | ||
| 232 | |`RALT(kc)`|`RALT` + `kc`| | ||
| 233 | |`RGUI(kc)`|`RGUI` + `kc`| | ||
| 234 | |`HYPR(kc)`|`LCTL` + `LSFT` + `LALT` + `LGUI` + `kc`| | ||
| 235 | |`MEH(kc)`|`LCTL` + `LSFT` + `LALT` + `kc`| | ||
| 236 | |`LCAG(kc)`|`LCTL` + `LALT` + `LGUI` + `kc`| | ||
| 237 | |`ALTG(kc)`|`RCTL` + `RALT` + `kc`| | ||
| 238 | |`SCMD(kc)`/`SWIN(kc)`|`LGUI` + `LSFT` + `kc`| | ||
| 239 | |`LCA(kc)`|`LCTL` + `LALT` + `kc`| | ||
| 240 | |||
| 241 | ### One Shot Keys | ||
| 242 | |||
| 243 | Most modifiers work by being held down while you push another key. You can use `OSM()` to setup a "One Shot" modifier. When you tap a one shot mod it will remain is a pressed state until you press another key. | ||
| 244 | |||
| 245 | To specify a your modifier you need to pass the `MOD` form of the key. For example, if you want to setup a One Shot Control you would use `OSM(MOD_LCTL)`. | ||
| 246 | |||
| 247 | |Name|Description| | ||
| 248 | |----|-----------| | ||
| 249 | |`OSM(mod)`|use mod for one keypress| | ||
| 250 | |`OSL(layer)`|switch to layer for one keypress| | ||
| 251 | |||
| 252 | ### Mod-tap keys | ||
| 253 | |||
| 254 | These keycodes will press the mod(s) when held, and the key when tapped. They only work with [basic keycodes](basic_keycodes.md). | ||
| 255 | |||
| 256 | |Name|Description| | ||
| 257 | |----|-----------| | ||
| 258 | |`CTL_T(kc)`/`LCTL_T(kc)`|`LCTL` when held, `kc` when tapped| | ||
| 259 | |`RCTL_T(kc)`|`RCTL` when held, `kc` when tapped| | ||
| 260 | |`SFT_T(kc)`/`LSFT_T(kc)`|`LSFT` when held, `kc` when tapped| | ||
| 261 | |`RSFT_T(kc)`|`RSFT` when held, `kc` when tapped| | ||
| 262 | |`ALT_T(kc)`/`LALT_T(kc)`|`LALT` when held, `kc` when tapped| | ||
| 263 | |`RALT_T(kc)`/`ALGR_T(kc)`|`RALT` when held, `kc` when tapped| | ||
| 264 | |`GUI_T(kc)`/`LGUI_T(kc)`|`LGUI` when held, `kc` when tapped| | ||
| 265 | |`RGUI_T(kc)`|`RGUI` when held, `kc` when tapped| | ||
| 266 | |`C_S_T(kc)`|`LCTL` + `LSFT` when held, `kc` when tapped| | ||
| 267 | |`MEH_T(kc)`|`LCTL` + `LSFT` + `LALT` when held, `kc` when tapped| | ||
| 268 | |`LCAG_T(kc)`|`LCTL` + `LALT` + `LGUI` when held, `kc` when tapped| | ||
| 269 | |`RCAG_T(kc)`|`RCTL` + `RALT` + `RGUI` when held, `kc` when tapped| | ||
| 270 | |`ALL_T(kc)`|`LCTL` + `LSFT` + `LALT` + `LGUI` when held, `kc` when tapped [more info](http://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/)| | ||
| 271 | |`SCMD_T(kc)`/`SWIN_T(kc)`|`LGUI` + `LSFT` when held, `kc` when tapped| | ||
| 272 | |`LCA_T(kc)`|`LCTL` + `LALT` when held, `kc` when tapped| | ||
| 273 | |||
| 274 | ## US ANSI Shifted symbols | ||
| 275 | |||
| 276 | These keycodes correspond to characters that are "shifted" on a standard US ANSI keyboards. They do not have dedicated keycodes but are instead typed by holding down shift and then sending a keycode. | ||
| 277 | |||
| 278 | It's important to remember that all of these keycodes send a left shift - this may cause unintended actions if unaccounted for. The short code is preferred in most situations. | ||
| 279 | |||
| 280 | |Short Name|Long Name|Description| | ||
| 281 | |----------|---------|-----------| | ||
| 282 | |`KC_TILD`|`KC_TILDE`|tilde `~`| | ||
| 283 | |`KC_EXLM`|`KC_EXCLAIM`|exclamation mark `!`| | ||
| 284 | |`KC_AT`||at sign `@`| | ||
| 285 | |`KC_HASH`||hash sign `#`| | ||
| 286 | |`KC_DLR`|`KC_DOLLAR`|dollar sign `$`| | ||
| 287 | |`KC_PERC`|`KC_PERCENT`|percent sign `%`| | ||
| 288 | |`KC_CIRC`|`KC_CIRCUMFLEX`|circumflex `^`| | ||
| 289 | |`KC_AMPR`|`KC_AMPERSAND`|ampersand `&`| | ||
| 290 | |`KC_ASTR`|`KC_ASTERISK`|asterisk `*`| | ||
| 291 | |`KC_LPRN`|`KC_LEFT_PAREN`|left parenthesis `(`| | ||
| 292 | |`KC_RPRN`|`KC_RIGHT_PAREN`|right parenthesis `)`| | ||
| 293 | |`KC_UNDS`|`KC_UNDERSCORE`|underscore `_`| | ||
| 294 | |`KC_PLUS`||plus sign `+`| | ||
| 295 | |`KC_LCBR`|`KC_LEFT_CURLY_BRACE`|left curly brace `{`| | ||
| 296 | |`KC_RCBR`|`KC_RIGHT_CURLY_BRACE`|right curly brace `}`| | ||
| 297 | |`KC_LT`/`KC_LABK`|`KC_LEFT_ANGLE_BRACKET`|left angle bracket `<`| | ||
| 298 | |`KC_GT`/`KC_RABK`|`KC_RIGHT_ANGLE_BRACKET`|right angle bracket `>`| | ||
| 299 | |`KC_COLN`|`KC_COLON`|colon `:`| | ||
| 300 | |`KC_PIPE`||pipe `\|`| | ||
| 301 | |`KC_QUES`|`KC_QUESTION`|question mark `?`| | ||
| 302 | |`KC_DQT`/`KC_DQUO`|`KC_DOUBLE_QUOTE`|double quote `"`| | ||
| 303 | |||
| 304 | ## Layer Changes | ||
| 305 | |||
| 306 | These are keycodes that can be used to change the current layer. | ||
| 307 | |||
| 308 | |Name|Description| | ||
| 309 | |----|-----------| | ||
| 310 | |`LT(layer, kc)`|turn on layer (0-15) when held, kc ([basic keycodes](basic_keycodes.md)) when tapped| | ||
| 311 | |`TO(layer)`|turn on layer when depressed| | ||
| 312 | |`MO(layer)`|momentarily turn on layer when depressed (requires `KC_TRNS` on destination layer)| | ||
| 313 | |`DF(layer)`|sets the base (default) layer| | ||
| 314 | |`TG(layer)`|toggle layer on/off| | ||
| 315 | |`TT(layer)`|tap toggle? idk FIXME| | ||
| 316 | |`OSL(layer)`|switch to layer for one keycode| | ||
| 317 | |||
| 318 | ## Unicode | ||
| 319 | |||
| 320 | These keycodes can be used in conjuction with the [Unicode](unicode_and_additional_language_support.md) support. | ||
| 321 | |||
| 322 | |`UNICODE(n)`/`UC(n)`|if `UNICODE_ENABLE`, this will send characters up to `0x7FFF`| | ||
| 323 | |`X(n)`|if `UNICODEMAP_ENABLE`, also sends unicode via a different method| | ||
| 324 | |||
| 325 | # `SAFE_RANGE`, or safely defining custom keycodes | ||
| 326 | |||
| 327 | Sometimes you want to define your own custom keycodes to make your keymap easier to read. QMK provides `SAFE_RANGE` to help you do that. `SAFE_RANGE` is the first available keycode in the `0x0000`-`0xFFFF` range and you can use it when creating your own custom keycode enum: | ||
| 328 | |||
| 329 | ``` | ||
| 330 | enum my_keycodes { | ||
| 331 | FOO = SAFE_RANGE, | ||
| 332 | BAR | ||
| 333 | }; | ||
| 334 | ``` | ||
| 335 | |||
| 336 | You can then use `process_record_user()` to do something with your keycode: | ||
| 337 | |||
| 338 | ``` | ||
| 339 | bool process_record_user(uint16_t keycode, keyrecord_t *record) { | ||
| 340 | switch (keycode) { | ||
| 341 | case FOO: | ||
| 342 | // Do something here | ||
| 343 | break; | ||
| 344 | case BAR: | ||
| 345 | // Do something here | ||
| 346 | break; | ||
| 347 | } | ||
| 348 | } | ||
| 349 | ``` | ||
