~ruther/qmk_firmware

8d55a12a9538742f510087f14fc59eb813b2ef42 — Wojciech Siewierski 9 years ago c248088
Document the issue of stuck modifiers
2 files changed, 21 insertions(+), 1 deletions(-)

M README.md
M tmk_core/common/action.c
M README.md => README.md +20 -0
@@ 98,6 98,26 @@ We've added shortcuts to make common modifier/tap (mod-tap) mappings more compac

`DF(layer)` - sets default layer to *layer*. The default layer is the one at the "bottom" of the layer stack - the ultimate fallback layer. This currently does not persist over power loss. When you plug the keyboard back in, layer 0 will always be the default. It is theoretically possible to work around that, but that's not what `DF` does.

### Prevent stuck modifiers

Consider the following scenario:

1. Layer 0 has a key defined as Shift.
2. The same key is defined on layer 1 as the letter A.
3. User presses Shift.
4. User switches to layer 1 for whatever reason.
5. User releases Shift, or rather the letter A.
6. User switches back to layer 0.

Shift was actually never released and is still considered pressed.

If such situation bothers you add this to your `config.h`:

    #define PREVENT_STUCK_MODIFIERS

Warning: This option uses up 2 bytes of memory per key. For example on
Planck it uses 2\*4\*12=96 bytes.

### Remember: These are just aliases

These functions work the same way that their `ACTION_*` functions do - they're just quick aliases. To dig into all of the tmk ACTION_* functions, please see the [TMK documentation](https://github.com/jackhumbert/qmk_firmware/blob/master/tmk_core/doc/keymap.md#2-action).

M tmk_core/common/action.c => tmk_core/common/action.c +1 -1
@@ 61,7 61,7 @@ void action_exec(keyevent_t event)
 */
action_t store_or_get_action(bool pressed, keypos_t key)
{
#ifndef NO_ACTION_LAYER
#if !defined(NO_ACTION_LAYER) && defined(PREVENT_STUCK_MODIFIERS)
    static action_t pressed_actions[MATRIX_ROWS][MATRIX_COLS];

    if (pressed) {