]> git.donarmstrong.com Git - qmk_firmware.git/commitdiff
Fix #156: clear weak mods on every key press
authorDidier Loiseau <didierloiseau+git@gmail.com>
Tue, 8 Mar 2016 22:14:15 +0000 (23:14 +0100)
committerDidier Loiseau <didierloiseau+git@gmail.com>
Tue, 8 Mar 2016 22:14:15 +0000 (23:14 +0100)
- new macro_mods bit field for mods applied by macros
- weak_mods now only used for ACT_{L,R}MODS (i.e. LSFT, RSFT, LCTL etc.)
- clear the _weak_ mods on every key *pressed* such that LSFT etc.
  can no more interfere with the next key

tmk_core/common/action.c
tmk_core/common/action_macro.c
tmk_core/common/action_util.c
tmk_core/common/action_util.h

index 77ea39e942c77b8fb9774184119ff838b278236d..4197c53ed21609dc2d1838c035b7b8f8fce6c714 100644 (file)
@@ -70,6 +70,10 @@ void process_action(keyrecord_t *record)
 #endif
     dprintln();
 
+    if (event.pressed) {
+        // clear the potential weak mods left by previously pressed keys
+        clear_weak_mods();
+    }
     switch (action.kind.id) {
         /* Key and Mods */
         case ACT_LMODS:
@@ -500,6 +504,7 @@ void clear_keyboard(void)
 void clear_keyboard_but_mods(void)
 {
     clear_weak_mods();
+    clear_macro_mods();
     clear_keys();
     send_keyboard_report();
 #ifdef MOUSEKEY_ENABLE
index ffaf125c06ce8850c8e66135a71ef07c986513ba..7726b1190769a869d7e3a711e6b077fcfab91ebe 100644 (file)
@@ -41,7 +41,7 @@ void action_macro_play(const macro_t *macro_p)
                 MACRO_READ();
                 dprintf("KEY_DOWN(%02X)\n", macro);
                 if (IS_MOD(macro)) {
-                    add_weak_mods(MOD_BIT(macro));
+                    add_macro_mods(MOD_BIT(macro));
                     send_keyboard_report();
                 } else {
                     register_code(macro);
@@ -51,7 +51,7 @@ void action_macro_play(const macro_t *macro_p)
                 MACRO_READ();
                 dprintf("KEY_UP(%02X)\n", macro);
                 if (IS_MOD(macro)) {
-                    del_weak_mods(MOD_BIT(macro));
+                    del_macro_mods(MOD_BIT(macro));
                     send_keyboard_report();
                 } else {
                     unregister_code(macro);
index f81877dd9f489a34e5c6bb896b75d5c47681ebb6..a2d6577b24dae29d44de82032bdfeadc97bba00a 100644 (file)
@@ -29,6 +29,7 @@ static inline void del_key_bit(uint8_t code);
 
 static uint8_t real_mods = 0;
 static uint8_t weak_mods = 0;
+static uint8_t macro_mods = 0;
 
 #ifdef USB_6KRO_ENABLE
 #define RO_ADD(a, b) ((a + b) % KEYBOARD_REPORT_KEYS)
@@ -55,6 +56,7 @@ static int16_t oneshot_time = 0;
 void send_keyboard_report(void) {
     keyboard_report->mods  = real_mods;
     keyboard_report->mods |= weak_mods;
+    keyboard_report->mods |= macro_mods;
 #ifndef NO_ACTION_ONESHOT
     if (oneshot_mods) {
 #if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0))
@@ -118,6 +120,13 @@ void del_weak_mods(uint8_t mods) { weak_mods &= ~mods; }
 void set_weak_mods(uint8_t mods) { weak_mods = mods; }
 void clear_weak_mods(void) { weak_mods = 0; }
 
+/* macro modifier */
+uint8_t get_macro_mods(void) { return macro_mods; }
+void add_macro_mods(uint8_t mods) { macro_mods |= mods; }
+void del_macro_mods(uint8_t mods) { macro_mods &= ~mods; }
+void set_macro_mods(uint8_t mods) { macro_mods = mods; }
+void clear_macro_mods(void) { macro_mods = 0; }
+
 /* Oneshot modifier */
 #ifndef NO_ACTION_ONESHOT
 void set_oneshot_mods(uint8_t mods)
index a955638b46d8ad84c45c297b2a5f431f506aa85a..1a95cec10ec1ced084be192e7dd172602564e99e 100644 (file)
@@ -47,6 +47,13 @@ void del_weak_mods(uint8_t mods);
 void set_weak_mods(uint8_t mods);
 void clear_weak_mods(void);
 
+/* macro modifier */
+uint8_t get_macro_mods(void);
+void add_macro_mods(uint8_t mods);
+void del_macro_mods(uint8_t mods);
+void set_macro_mods(uint8_t mods);
+void clear_macro_mods(void);
+
 /* oneshot modifier */
 void set_oneshot_mods(uint8_t mods);
 void clear_oneshot_mods(void);