aboutsummaryrefslogtreecommitdiff
path: root/docs/quantum_keycodes.md
diff options
context:
space:
mode:
authorJack Humbert <jack.humb@gmail.com>2017-07-07 15:57:18 -0400
committerGitHub <noreply@github.com>2017-07-07 15:57:18 -0400
commit0787d70e55a668244445d9328f3cda2303cc6877 (patch)
treed2134fc159433f3cf4967d831a6b30de5630f744 /docs/quantum_keycodes.md
parent9de443cbf10ac41bc15762c9c83f138f51dd3b9a (diff)
parentecd3dbf085826459af9728b6529a504ba7d3de14 (diff)
downloadqmk_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.md349
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
3All 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
5On 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
23Shortcuts 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
79MIDI_TONE_MIN,
80MIDI_TONE_MAX
81
82MI_C = MIDI_TONE_MIN,
83MI_Cs,
84MI_Db = MI_Cs,
85MI_D,
86MI_Ds,
87MI_Eb = MI_Ds,
88MI_E,
89MI_F,
90MI_Fs,
91MI_Gb = MI_Fs,
92MI_G,
93MI_Gs,
94MI_Ab = MI_Gs,
95MI_A,
96MI_As,
97MI_Bb = MI_As,
98MI_B,
99
100MIDI_TONE_KEYCODE_OCTAVES > 1
101
102where x = 1-5:
103MI_C_x,
104MI_Cs_x,
105MI_Db_x = MI_Cs_x,
106MI_D_x,
107MI_Ds_x,
108MI_Eb_x = MI_Ds_x,
109MI_E_x,
110MI_F_x,
111MI_Fs_x,
112MI_Gb_x = MI_Fs_x,
113MI_G_x,
114MI_Gs_x,
115MI_Ab_x = MI_Gs_x,
116MI_A_x,
117MI_As_x,
118MI_Bb_x = MI_As_x,
119MI_B_x,
120
121MI_OCT_Nx 1-2
122MI_OCT_x 0-7
123MIDI_OCTAVE_MIN = MI_OCT_N2,
124MIDI_OCTAVE_MAX = MI_OCT_7,
125MI_OCTD, // octave down
126MI_OCTU, // octave up
127
128MI_TRNS_Nx 1-6
129MI_TRNS_x 0-6
130MIDI_TRANSPOSE_MIN = MI_TRNS_N6,
131MIDI_TRANSPOSE_MAX = MI_TRNS_6,
132MI_TRNSD, // transpose down
133MI_TRNSU, // transpose up
134
135MI_VEL_x 1-10
136MIDI_VELOCITY_MIN = MI_VEL_1,
137MIDI_VELOCITY_MAX = MI_VEL_9,
138MI_VELD, // velocity down
139MI_VELU, // velocity up
140
141MI_CHx 1-16
142MIDI_CHANNEL_MIN = MI_CH1
143MIDI_CHANNEL_MAX = MI_CH16,
144MI_CHD, // previous channel
145MI_CHU, // next channel
146
147MI_ALLOFF, // all notes off
148
149MI_SUS, // sustain
150MI_PORT, // portamento
151MI_SOST, // sostenuto
152MI_SOFT, // soft pedal
153MI_LEG, // legato
154
155MI_MOD, // modulation
156MI_MODSD, // decrease modulation speed
157MI_MODSU, // increase modulation speed
158#endif // MIDI_ADVANCED
159
160## Backlight
161
162These 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
176This 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
198This 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
208These 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
243Most 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
245To 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
254These 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
276These 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
278It'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
306These 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
320These 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
327Sometimes 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```
330enum my_keycodes {
331 FOO = SAFE_RANGE,
332 BAR
333};
334```
335
336You can then use `process_record_user()` to do something with your keycode:
337
338```
339bool 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```