aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorfauxpark <fauxpark@gmail.com>2019-10-16 10:02:09 +1100
committerJoel Challis <git@zvecr.com>2019-10-16 00:02:09 +0100
commit63f4806d7a67100fdf37b5f557ceb9d0982c0775 (patch)
treec942f96e391b32e91753516fe0b07af639fc5b97
parent45225190794b438129d5b27d4fe5b756fdf2efc4 (diff)
downloadfirmware-63f4806d7a67100fdf37b5f557ceb9d0982c0775.tar.gz
firmware-63f4806d7a67100fdf37b5f557ceb9d0982c0775.tar.bz2
firmware-63f4806d7a67100fdf37b5f557ceb9d0982c0775.zip
Fix bug in `do_code16()` (#6935)
* Fix bug in `do_code16()` * Remove qk_ mods functions
-rw-r--r--quantum/quantum.c50
-rw-r--r--tmk_core/common/action.c30
-rw-r--r--tmk_core/common/action.h2
3 files changed, 45 insertions, 37 deletions
diff --git a/quantum/quantum.c b/quantum/quantum.c
index f4999456e..e615cfc0f 100644
--- a/quantum/quantum.c
+++ b/quantum/quantum.c
@@ -85,44 +85,28 @@ static void do_code16(uint16_t code, void (*f)(uint8_t)) {
return;
}
- if (code & QK_LCTL) f(KC_LCTL);
- if (code & QK_LSFT) f(KC_LSFT);
- if (code & QK_LALT) f(KC_LALT);
- if (code & QK_LGUI) f(KC_LGUI);
+ uint8_t mods_to_send = 0;
- if (code < QK_RMODS_MIN) return;
-
- if (code & QK_RCTL) f(KC_RCTL);
- if (code & QK_RSFT) f(KC_RSFT);
- if (code & QK_RALT) f(KC_RALT);
- if (code & QK_RGUI) 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) {
- add_weak_mods(MOD_BIT(kc));
- send_keyboard_report();
-}
+ if (code & QK_RMODS_MIN) { // Right mod flag is set
+ if (code & QK_LCTL) mods_to_send |= MOD_BIT(KC_RCTL);
+ if (code & QK_LSFT) mods_to_send |= MOD_BIT(KC_RSFT);
+ if (code & QK_LALT) mods_to_send |= MOD_BIT(KC_RALT);
+ if (code & QK_LGUI) mods_to_send |= MOD_BIT(KC_RGUI);
+ } else {
+ if (code & QK_LCTL) mods_to_send |= MOD_BIT(KC_LCTL);
+ if (code & QK_LSFT) mods_to_send |= MOD_BIT(KC_LSFT);
+ if (code & QK_LALT) mods_to_send |= MOD_BIT(KC_LALT);
+ if (code & QK_LGUI) mods_to_send |= MOD_BIT(KC_LGUI);
+ }
-static inline void qk_unregister_mods(uint8_t kc) {
- del_weak_mods(MOD_BIT(kc));
- send_keyboard_report();
+ f(mods_to_send);
}
void register_code16(uint16_t code) {
if (IS_MOD(code) || code == KC_NO) {
- do_code16(code, qk_register_mods);
+ do_code16(code, register_mods);
} else {
- do_code16(code, qk_register_weak_mods);
+ do_code16(code, register_weak_mods);
}
register_code(code);
}
@@ -130,9 +114,9 @@ void register_code16(uint16_t code) {
void unregister_code16(uint16_t code) {
unregister_code(code);
if (IS_MOD(code) || code == KC_NO) {
- do_code16(code, qk_unregister_mods);
+ do_code16(code, unregister_mods);
} else {
- do_code16(code, qk_unregister_weak_mods);
+ do_code16(code, unregister_weak_mods);
}
}
diff --git a/tmk_core/common/action.c b/tmk_core/common/action.c
index 1ba38a285..44b19d368 100644
--- a/tmk_core/common/action.c
+++ b/tmk_core/common/action.c
@@ -868,9 +868,9 @@ void tap_code(uint8_t code) {
unregister_code(code);
}
-/** \brief Utilities for actions. (FIXME: Needs better description)
+/** \brief Adds the given physically pressed modifiers and sends a keyboard report immediately.
*
- * FIXME: Needs documentation.
+ * \param mods A bitfield of modifiers to unregister.
*/
void register_mods(uint8_t mods) {
if (mods) {
@@ -879,9 +879,9 @@ void register_mods(uint8_t mods) {
}
}
-/** \brief Utilities for actions. (FIXME: Needs better description)
+/** \brief Removes the given physically pressed modifiers and sends a keyboard report immediately.
*
- * FIXME: Needs documentation.
+ * \param mods A bitfield of modifiers to unregister.
*/
void unregister_mods(uint8_t mods) {
if (mods) {
@@ -890,6 +890,28 @@ void unregister_mods(uint8_t mods) {
}
}
+/** \brief Adds the given weak modifiers and sends a keyboard report immediately.
+ *
+ * \param mods A bitfield of modifiers to register.
+ */
+void register_weak_mods(uint8_t mods) {
+ if (mods) {
+ add_weak_mods(mods);
+ send_keyboard_report();
+ }
+}
+
+/** \brief Removes the given weak modifiers and sends a keyboard report immediately.
+ *
+ * \param mods A bitfield of modifiers to unregister.
+ */
+void unregister_weak_mods(uint8_t mods) {
+ if (mods) {
+ del_weak_mods(mods);
+ send_keyboard_report();
+ }
+}
+
/** \brief Utilities for actions. (FIXME: Needs better description)
*
* FIXME: Needs documentation.
diff --git a/tmk_core/common/action.h b/tmk_core/common/action.h
index 633cedb06..15f4ce15c 100644
--- a/tmk_core/common/action.h
+++ b/tmk_core/common/action.h
@@ -90,6 +90,8 @@ void unregister_code(uint8_t code);
void tap_code(uint8_t code);
void register_mods(uint8_t mods);
void unregister_mods(uint8_t mods);
+void register_weak_mods(uint8_t mods);
+void unregister_weak_mods(uint8_t mods);
// void set_mods(uint8_t mods);
void clear_keyboard(void);
void clear_keyboard_but_mods(void);