@ -71,7 +71,7 @@ At the keyboard level we define a C macro (typically named `LAYOUT()`) which map
Notice how the second block of our `LAYOUT()` 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/e1203a222bb12ab9733916164a000ef3ac48da93/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 [Alice ](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/keyboards/sneakbox/aliceclone/aliceclone.h#L24 ). Explaining that is outside the scope of this document.
##### Keycode Assignment
@ -127,39 +127,52 @@ Comparing against our keymap we can see that the pressed key is `KC_NUM`. From h
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 action_exec(keyevent_t event)` ](https://github.com/qmk/qmk_firmware/blob/88fe5c16a5cdca5e3cf13ef3cd91f5f1e4898c37/quantum/action.c#L70-L131 )
* [`void pre_process_record_quantum(keyrecord_t *record)` ](https://github.com/qmk/qmk_firmware/blob/ed49dbeac4c0deba1c6b511ac1ce8f4c542e1b3e/quantum/quantum.c#L176-L185 )
* [`bool process_combo(uint16_t keycode, keyrecord_t *record)` ](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_combo.c#L115 )
* [`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 velocikey_accelerate(void)` ](https://github.com/qmk/qmk_firmware/blob/c1c5922aae7b60b7c7d13d3769350eed9dda17ab/quantum/velocikey.c#L27 )
* [`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_haptic(uint16_t keycode, keyrecord_t *record)` ](https://github.com/qmk/qmk_firmware/blob/2cee371bf125a6ec541dd7c5a809573facc7c456/drivers/haptic/haptic.c#L216 )
* [`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_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 )
* [`void action_exec(keyevent_t event)` ](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/action.c#L78-L140 )
* [`void pre_process_record_quantum(keyrecord_t *record)` ](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/quantum.c#L204 )
* [`bool process_combo(uint16_t keycode, keyrecord_t *record)` ](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_combo.c#L521 )
* [`void process_record(keyrecord_t *record)` ](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/action.c#L254 )
* [`bool process_record_quantum(keyrecord_t *record)` ](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/quantum.c#L224 )
* [Map this record to a keycode ](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/quantum.c#L225 )
* [`void velocikey_accelerate(void)` ](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/velocikey.c#L27 )
* [`void update_wpm(uint16_t keycode)` ](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/wpm.c#L109 )
* [`void preprocess_tap_dance(uint16_t keycode, keyrecord_t *record)` ](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_tap_dance.c#L118 )
* [`bool process_key_lock(uint16_t keycode, keyrecord_t *record)` ](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_key_lock.c#L64 )
* [`bool process_dynamic_macro(uint16_t keycode, keyrecord_t *record)` ](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_dynamic_macro.c#L160 )
* [`bool process_clicky(uint16_t keycode, keyrecord_t *record)` ](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_clicky.c#L84 )
* [`bool process_haptic(uint16_t keycode, keyrecord_t *record)` ](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_haptic.c#L87 )
* [`bool process_record_via(uint16_t keycode, keyrecord_t *record)` ](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/via.c#L160 )
* [`bool process_record_kb(uint16_t keycode, keyrecord_t *record)` ](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/keyboards/planck/ez/ez.c#L271 )
* [`bool process_record_user(uint16_t keycode, keyrecord_t *record)` ](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/keyboards/planck/keymaps/default/keymap.c#L183 )
* [`bool process_secure(uint16_t keycode, keyrecord_t *record)` ](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_secure.c#L23 )
* [`bool process_sequencer(uint16_t keycode, keyrecord_t *record)` ](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_sequencer.c#L19 )
* [`bool process_midi(uint16_t keycode, keyrecord_t *record)` ](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_midi.c#L75 )
* [`bool process_audio(uint16_t keycode, keyrecord_t *record)` ](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_audio.c#L18 )
* [`bool process_backlight(uint16_t keycode, keyrecord_t *record)` ](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_backlight.c#L25 )
* [`bool process_steno(uint16_t keycode, keyrecord_t *record)` ](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_steno.c#L159 )
* [`bool process_music(uint16_t keycode, keyrecord_t *record)` ](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_music.c#L103 )
* [`bool process_key_override(uint16_t keycode, keyrecord_t *record)` ](https://github.com/qmk/qmk_firmware/blob/5a1b857dea45a17698f6baa7dd1b7a7ea907fb0a/quantum/process_keycode/process_key_override.c#L397 )
* [`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 )
* [`bool process_tap_dance(uint16_t keycode, keyrecord_t *record)` ](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_tap_dance.c#L135 )
* [`bool process_caps_word(uint16_t keycode, keyrecord_t *record)` ](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_caps_word.c#L17 )
* [`bool process_unicode_common(uint16_t keycode, keyrecord_t *record)` ](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_unicode_common.c#L290 )
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_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_dynamic_tapping_term(uint16_t keycode, keyrecord_t *record)`
* [Identify and process Quantum-specific keycodes ](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/quantum.c#L291 )
* [`bool process_unicode(uint16_t keycode, keyrecord_t *record)` ](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_unicode.c#L21 )
* [`bool process_unicodemap(uint16_t keycode, keyrecord_t *record)` ](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_unicodemap.c#L42 )
* [`bool process_ucis(uint16_t keycode, keyrecord_t *record)` ](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_ucis.c#L70 )
* [`bool process_leader(uint16_t keycode, keyrecord_t *record)` ](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_leader.c#L48 )
* [`bool process_printer(uint16_t keycode, keyrecord_t *record)` ](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_printer.c#L77 )
* [`bool process_auto_shift(uint16_t keycode, keyrecord_t *record)` ](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_auto_shift.c#L353 )
* [`bool process_dynamic_tapping_term(uint16_t keycode, keyrecord_t *record)` ](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_dynamic_tapping_term.c#L35 )
* [`bool process_space_cadet(uint16_t keycode, keyrecord_t *record)` ](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_space_cadet.c#L123 )
* [`bool process_magic(uint16_t keycode, keyrecord_t *record)` ](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_magic.c#L40 )
* [`bool process_grave_esc(uint16_t keycode, keyrecord_t *record)` ](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_grave_esc.c#L23 )
* [`bool process_rgb(uint16_t keycode, keyrecord_t *record)` ](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_rgb.c#L53 )
* [`bool process_joystick(uint16_t keycode, keyrecord_t *record)` ](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_joystick.c#L9 )
* [`bool process_programmable_button(uint16_t keycode, keyrecord_t *record)` ](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_programmable_button.c#L21 )
* [Identify and process Quantum-specific keycodes ](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/quantum.c#L343 )
At any step during this chain of events a function (such as `process_record_kb()` ) can `return false` to halt all further processing.
After this is called, `post_process_record()` is called, which can be used to handle additional cleanup that needs to be run after the keycode is normally handled.
After this is called, `post_process_record()` is called, which can be used to handle additional cleanup that needs to be run after the keycode is normally handled.
* [`void post_process_record(keyrecord_t *record)`]()
* [`void post_process_record_quantum(keyrecord_t *record)`]()
@ -167,7 +180,7 @@ After this is called, `post_process_record()` is called, which can be used to ha
* [`void post_process_clicky(uint16_t keycode, keyrecord_t *record)`]()
* [`void post_process_record_kb(uint16_t keycode, keyrecord_t *record)`]()
* [`void post_process_record_user(uint16_t keycode, keyrecord_t *record)`]()
<!--
#### Mouse Handling