]> git.donarmstrong.com Git - qmk_firmware.git/commitdiff
registering a weak_mods when using register_code16
authorSjB <steve@sagacity.ca>
Sun, 29 Jan 2017 17:06:24 +0000 (12:06 -0500)
committerSjB <steve@sagacity.ca>
Sun, 29 Jan 2017 17:29:43 +0000 (12:29 -0500)
Scenario:
Locking the KC_LSHIFT, and then using a tap dance key that registers a
S(KC_9) will unregister the KC_LSHIFT.

The tap dance or any keycode that is registered should not have the
side effect of cancelling a locked moditifier. We should be using a
similar logic as the TMK codes in tmk_core/comman/action.c:158.

quantum/quantum.c

index 1767faed42ca5e9be83e45d8bef4fd05a9b70739..0aecd238e45f9813e5a0a2da9a21cad8b972c558 100644 (file)
@@ -33,22 +33,42 @@ static void do_code16 (uint16_t code, void (*f) (uint8_t)) {
     f(KC_RGUI);
 }
 
+static inline void qk_register_weak_mods(uint8_t kc) {
+    add_weak_mods(MOD_BIT(kc));
+    send_keyboard_report();
+}
+
+static inline void qk_unregister_weak_mods(uint8_t kc) {
+    del_weak_mods(MOD_BIT(kc));
+    send_keyboard_report();
+}
+
 static inline void qk_register_mods(uint8_t kc) {
-  register_mods(MOD_BIT(kc));
+    add_weak_mods(MOD_BIT(kc));
+    send_keyboard_report();
 }
 
 static inline void qk_unregister_mods(uint8_t kc) {
-  unregister_mods(MOD_BIT(kc));
+    del_weak_mods(MOD_BIT(kc));
+    send_keyboard_report();
 }
 
 void register_code16 (uint16_t code) {
-  do_code16 (code, qk_register_mods);
+  if (IS_MOD(code) || code == KC_NO) {
+      do_code16 (code, qk_register_mods);
+  } else {
+      do_code16 (code, qk_register_weak_mods);
+  }
   register_code (code);
 }
 
 void unregister_code16 (uint16_t code) {
   unregister_code (code);
-  do_code16 (code, qk_unregister_mods);
+  if (IS_MOD(code) || code == KC_NO) {
+      do_code16 (code, qk_unregister_mods);
+  } else {
+      do_code16 (code, qk_unregister_weak_mods);
+  }
 }
 
 __attribute__ ((weak))