Преглед изворни кода

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
Konstantin Đorđević пре 6 година
родитељ
комит
93b004c943
3 измењених фајлова са 19 додато и 1 уклоњено
  1. 10 1
      tmk_core/common/action.c
  2. 1 0
      tmk_core/common/action.h
  3. 8 0
      tmk_core/common/action_layer.c

+ 10 - 1
tmk_core/common/action.c

@@ -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();

+ 1 - 0
tmk_core/common/action.h

@@ -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);
 
 

+ 8 - 0
tmk_core/common/action_layer.c

@@ -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