Fix up process_leader to be a bit more optimized (#4662)
* Fix up process_leader to be a bit more optimized * Process dual function keys better * Make leader start a callable function * Fix per key timer call location * Add escape if already leading * Return false for KC_LEAD * Add documentation
This commit is contained in:
		
				
					committed by
					
						
						MechMerlin
					
				
			
			
				
	
			
			
			
						parent
						
							30c3f3b2bd
						
					
				
				
					commit
					afd5cda4a0
				
			@@ -35,31 +35,42 @@ uint16_t leader_time = 0;
 | 
			
		||||
uint16_t leader_sequence[5] = {0, 0, 0, 0, 0};
 | 
			
		||||
uint8_t leader_sequence_size = 0;
 | 
			
		||||
 | 
			
		||||
void qk_leader_start(void) {
 | 
			
		||||
  if (leading) { return; }
 | 
			
		||||
  leader_start();
 | 
			
		||||
  leading = true;
 | 
			
		||||
  leader_time = timer_read();
 | 
			
		||||
  leader_sequence_size = 0;
 | 
			
		||||
  leader_sequence[0] = 0;
 | 
			
		||||
  leader_sequence[1] = 0;
 | 
			
		||||
  leader_sequence[2] = 0;
 | 
			
		||||
  leader_sequence[3] = 0;
 | 
			
		||||
  leader_sequence[4] = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool process_leader(uint16_t keycode, keyrecord_t *record) {
 | 
			
		||||
  // Leader key set-up
 | 
			
		||||
  if (record->event.pressed) {
 | 
			
		||||
    if (leading) {
 | 
			
		||||
      if (timer_elapsed(leader_time) < LEADER_TIMEOUT) {
 | 
			
		||||
#ifndef LEADER_KEY_STRICT_KEY_PROCESSING
 | 
			
		||||
        if ((keycode >= QK_MOD_TAP && keycode <= QK_MOD_TAP_MAX) || (keycode >= QK_LAYER_TAP && keycode <= QK_LAYER_TAP_MAX)) {
 | 
			
		||||
          keycode = keycode & 0xFF;
 | 
			
		||||
        }
 | 
			
		||||
#endif // LEADER_KEY_STRICT_KEY_PROCESSING
 | 
			
		||||
        leader_sequence[leader_sequence_size] = keycode;
 | 
			
		||||
        leader_sequence_size++;
 | 
			
		||||
#ifdef LEADER_PER_KEY_TIMING
 | 
			
		||||
    leader_time = timer_read();
 | 
			
		||||
        leader_time = timer_read();
 | 
			
		||||
#endif
 | 
			
		||||
    if (!leading && keycode == KC_LEAD) {
 | 
			
		||||
      leader_start();
 | 
			
		||||
      leading = true;
 | 
			
		||||
#ifndef LEADER_PER_KEY_TIMING
 | 
			
		||||
      leader_time = timer_read();
 | 
			
		||||
#endif
 | 
			
		||||
      leader_time = timer_read();
 | 
			
		||||
      leader_sequence_size = 0;
 | 
			
		||||
      leader_sequence[0] = 0;
 | 
			
		||||
      leader_sequence[1] = 0;
 | 
			
		||||
      leader_sequence[2] = 0;
 | 
			
		||||
      leader_sequence[3] = 0;
 | 
			
		||||
      leader_sequence[4] = 0;
 | 
			
		||||
      return false;
 | 
			
		||||
    }
 | 
			
		||||
    if (leading && timer_elapsed(leader_time) < LEADER_TIMEOUT) {
 | 
			
		||||
      leader_sequence[leader_sequence_size] = keycode;
 | 
			
		||||
      leader_sequence_size++;
 | 
			
		||||
      return false;
 | 
			
		||||
        return false;
 | 
			
		||||
      }
 | 
			
		||||
    } else {
 | 
			
		||||
      if (keycode == KC_LEAD) {
 | 
			
		||||
        qk_leader_start();
 | 
			
		||||
        return false;
 | 
			
		||||
      }
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  return true;
 | 
			
		||||
 
 | 
			
		||||
@@ -24,7 +24,7 @@ bool process_leader(uint16_t keycode, keyrecord_t *record);
 | 
			
		||||
 | 
			
		||||
void leader_start(void);
 | 
			
		||||
void leader_end(void);
 | 
			
		||||
 | 
			
		||||
void qk_leader_start(void);
 | 
			
		||||
 | 
			
		||||
#define SEQ_ONE_KEY(key) if (leader_sequence[0] == (key) && leader_sequence[1] == 0 && leader_sequence[2] == 0 && leader_sequence[3] == 0 && leader_sequence[4] == 0)
 | 
			
		||||
#define SEQ_TWO_KEYS(key1, key2) if (leader_sequence[0] == (key1) && leader_sequence[1] == (key2) && leader_sequence[2] == 0 && leader_sequence[3] == 0 && leader_sequence[4] == 0)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user