diff options
| author | SjB <steve@sagacity.ca> | 2017-01-29 12:06:24 -0500 |
|---|---|---|
| committer | SjB <steve@sagacity.ca> | 2017-01-29 12:29:43 -0500 |
| commit | f644b9a07a34ae19a6014b08db656a4eeca1dcda (patch) | |
| tree | 5c2e1337433e5bd96c62f26a829589d970fd9b97 | |
| parent | 2b3859937b1e7f96b684408d31ff12a4e682f7ee (diff) | |
| download | qmk_firmware-f644b9a07a34ae19a6014b08db656a4eeca1dcda.tar.gz qmk_firmware-f644b9a07a34ae19a6014b08db656a4eeca1dcda.zip | |
registering a weak_mods when using register_code16
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.
| -rw-r--r-- | quantum/quantum.c | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/quantum/quantum.c b/quantum/quantum.c index 1767faed4..0aecd238e 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c | |||
| @@ -33,22 +33,42 @@ static void do_code16 (uint16_t code, void (*f) (uint8_t)) { | |||
| 33 | f(KC_RGUI); | 33 | f(KC_RGUI); |
| 34 | } | 34 | } |
| 35 | 35 | ||
| 36 | static inline void qk_register_weak_mods(uint8_t kc) { | ||
| 37 | add_weak_mods(MOD_BIT(kc)); | ||
| 38 | send_keyboard_report(); | ||
| 39 | } | ||
| 40 | |||
| 41 | static inline void qk_unregister_weak_mods(uint8_t kc) { | ||
| 42 | del_weak_mods(MOD_BIT(kc)); | ||
| 43 | send_keyboard_report(); | ||
| 44 | } | ||
| 45 | |||
| 36 | static inline void qk_register_mods(uint8_t kc) { | 46 | static inline void qk_register_mods(uint8_t kc) { |
| 37 | register_mods(MOD_BIT(kc)); | 47 | add_weak_mods(MOD_BIT(kc)); |
| 48 | send_keyboard_report(); | ||
| 38 | } | 49 | } |
| 39 | 50 | ||
| 40 | static inline void qk_unregister_mods(uint8_t kc) { | 51 | static inline void qk_unregister_mods(uint8_t kc) { |
| 41 | unregister_mods(MOD_BIT(kc)); | 52 | del_weak_mods(MOD_BIT(kc)); |
| 53 | send_keyboard_report(); | ||
| 42 | } | 54 | } |
| 43 | 55 | ||
| 44 | void register_code16 (uint16_t code) { | 56 | void register_code16 (uint16_t code) { |
| 45 | do_code16 (code, qk_register_mods); | 57 | if (IS_MOD(code) || code == KC_NO) { |
| 58 | do_code16 (code, qk_register_mods); | ||
| 59 | } else { | ||
| 60 | do_code16 (code, qk_register_weak_mods); | ||
| 61 | } | ||
| 46 | register_code (code); | 62 | register_code (code); |
| 47 | } | 63 | } |
| 48 | 64 | ||
| 49 | void unregister_code16 (uint16_t code) { | 65 | void unregister_code16 (uint16_t code) { |
| 50 | unregister_code (code); | 66 | unregister_code (code); |
| 51 | do_code16 (code, qk_unregister_mods); | 67 | if (IS_MOD(code) || code == KC_NO) { |
| 68 | do_code16 (code, qk_unregister_mods); | ||
| 69 | } else { | ||
| 70 | do_code16 (code, qk_unregister_weak_mods); | ||
| 71 | } | ||
| 52 | } | 72 | } |
| 53 | 73 | ||
| 54 | __attribute__ ((weak)) | 74 | __attribute__ ((weak)) |
