Keep pressed keys on layer state change (fixes #2053, #2279) (#3905)

* Keep pressed keys on layer state change

* Add doc comment for clear_keyboard_but_mods_and_keys

* Keep pressed keys only if PREVENT_STUCK_MODIFIERS is on

* Check STRICT_LAYER_RELEASE instead of PREVENT_STUCK_MODIFIERS
This commit is contained in:
Konstantin Đorđević 2018-12-28 20:07:56 +01:00 committed by MechMerlin
parent fbcbf44926
commit 93b004c943
3 changed files with 19 additions and 1 deletions

View File

@ -898,10 +898,19 @@ void clear_keyboard(void)
* FIXME: Needs documentation. * FIXME: Needs documentation.
*/ */
void clear_keyboard_but_mods(void) void clear_keyboard_but_mods(void)
{
clear_keys();
clear_keyboard_but_mods_and_keys();
}
/** \brief Utilities for actions. (FIXME: Needs better description)
*
* FIXME: Needs documentation.
*/
void clear_keyboard_but_mods_and_keys()
{ {
clear_weak_mods(); clear_weak_mods();
clear_macro_mods(); clear_macro_mods();
clear_keys();
send_keyboard_report(); send_keyboard_report();
#ifdef MOUSEKEY_ENABLE #ifdef MOUSEKEY_ENABLE
mousekey_clear(); mousekey_clear();

View File

@ -94,6 +94,7 @@ void unregister_mods(uint8_t mods);
//void set_mods(uint8_t mods); //void set_mods(uint8_t mods);
void clear_keyboard(void); void clear_keyboard(void);
void clear_keyboard_but_mods(void); void clear_keyboard_but_mods(void);
void clear_keyboard_but_mods_and_keys(void);
void layer_switch(uint8_t new_layer); void layer_switch(uint8_t new_layer);
bool is_tap_key(keypos_t key); bool is_tap_key(keypos_t key);

View File

@ -44,7 +44,11 @@ static void default_layer_state_set(uint32_t state)
default_layer_debug(); debug(" to "); default_layer_debug(); debug(" to ");
default_layer_state = state; default_layer_state = state;
default_layer_debug(); debug("\n"); default_layer_debug(); debug("\n");
#ifdef STRICT_LAYER_RELEASE
clear_keyboard_but_mods(); // To avoid stuck keys clear_keyboard_but_mods(); // To avoid stuck keys
#else
clear_keyboard_but_mods_and_keys(); // Don't reset held keys
#endif
} }
/** \brief Default Layer Print /** \brief Default Layer Print
@ -127,7 +131,11 @@ void layer_state_set(uint32_t state)
layer_debug(); dprint(" to "); layer_debug(); dprint(" to ");
layer_state = state; layer_state = state;
layer_debug(); dprintln(); layer_debug(); dprintln();
#ifdef STRICT_LAYER_RELEASE
clear_keyboard_but_mods(); // To avoid stuck keys clear_keyboard_but_mods(); // To avoid stuck keys
#else
clear_keyboard_but_mods_and_keys(); // Don't reset held keys
#endif
} }
/** \brief Layer clear /** \brief Layer clear