Fix #156: clear weak mods on every key press
- 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
			
			
This commit is contained in:
		
							parent
							
								
									7d3ebd7b40
								
							
						
					
					
						commit
						b7a81f0419
					
				
					 4 changed files with 23 additions and 2 deletions
				
			
		|  | @ -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 | ||||
|  |  | |||
|  | @ -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); | ||||
|  |  | |||
|  | @ -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) | ||||
|  |  | |||
|  | @ -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); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Didier Loiseau
						Didier Loiseau