LSpace + RSpace = switch layer
This commit is contained in:
		
							parent
							
								
									79de0cd119
								
							
						
					
					
						commit
						513286cf98
					
				
					 2 changed files with 92 additions and 1 deletions
				
			
		| 
						 | 
				
			
			@ -19,4 +19,6 @@
 | 
			
		|||
#define LAYOUT_NORMAN
 | 
			
		||||
#define LAYOUT_WORKMAN
 | 
			
		||||
 | 
			
		||||
#define DOUBLESPACE_LAYER_ENABLE
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -25,6 +25,13 @@
 | 
			
		|||
#define KC_RALT MT(MOD_RALT, KC_SLCK)
 | 
			
		||||
 | 
			
		||||
bool capslock = false;
 | 
			
		||||
#ifdef DOUBLESPACE_LAYER_ENABLE
 | 
			
		||||
bool lspace_active = false;
 | 
			
		||||
bool rspace_active = false;
 | 
			
		||||
bool lspace_emitted = false;
 | 
			
		||||
bool rspace_emitted = false;
 | 
			
		||||
bool space_layer_entered = false;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// glow
 | 
			
		||||
enum glow_modes {
 | 
			
		||||
| 
						 | 
				
			
			@ -55,6 +62,9 @@ enum layers {
 | 
			
		|||
  _SYS,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// double-space layer
 | 
			
		||||
#define _SPACE _GUI
 | 
			
		||||
 | 
			
		||||
enum planck_keycodes {
 | 
			
		||||
  // layouts
 | 
			
		||||
  QWERTY = SAFE_RANGE,
 | 
			
		||||
| 
						 | 
				
			
			@ -77,6 +87,8 @@ enum planck_keycodes {
 | 
			
		|||
  OSX,
 | 
			
		||||
 | 
			
		||||
  // others
 | 
			
		||||
  LSPACE,
 | 
			
		||||
  RSPACE,
 | 
			
		||||
  GLOW,
 | 
			
		||||
  AUDIO
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			@ -504,7 +516,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 | 
			
		|||
  KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_BSPC,
 | 
			
		||||
  KC_ESC,  KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_QUOT, KC_ENT ,
 | 
			
		||||
  KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_RSFT,
 | 
			
		||||
  KC_LCTL, KC_LALT, KC_LGUI, PUNC,    NUM,     KC_SPC,  KC_SPC,  FUNC,    GREEK,   KC_RGUI, KC_RALT, KC_RCTL
 | 
			
		||||
  KC_LCTL, KC_LALT, KC_LGUI, PUNC,    NUM,     LSPACE,  RSPACE,  FUNC,    GREEK,   KC_RGUI, KC_RALT, KC_RCTL
 | 
			
		||||
),
 | 
			
		||||
 | 
			
		||||
/* Dvorak
 | 
			
		||||
| 
						 | 
				
			
			@ -745,7 +757,84 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
 | 
			
		|||
  bool lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
 | 
			
		||||
  bool rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
 | 
			
		||||
 | 
			
		||||
#ifdef DOUBLESPACE_LAYER_ENABLE
 | 
			
		||||
  // double-space: send space immediately if any other key depressed before space is released
 | 
			
		||||
  if ((lspace_active ^ rspace_active)
 | 
			
		||||
      && keycode != LSPACE
 | 
			
		||||
      && keycode != RSPACE
 | 
			
		||||
      && record->event.pressed)
 | 
			
		||||
  {
 | 
			
		||||
    if (lspace_active) {
 | 
			
		||||
      if (!lspace_emitted) {
 | 
			
		||||
        register_code(KC_SPC);
 | 
			
		||||
        unregister_code(KC_SPC);
 | 
			
		||||
      }
 | 
			
		||||
      lspace_emitted = true;
 | 
			
		||||
    }
 | 
			
		||||
    if (rspace_active) {
 | 
			
		||||
      if (!rspace_emitted) {
 | 
			
		||||
        register_code(KC_SPC);
 | 
			
		||||
        unregister_code(KC_SPC);
 | 
			
		||||
      }
 | 
			
		||||
      rspace_emitted = true;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  switch (keycode) {
 | 
			
		||||
 | 
			
		||||
#ifdef DOUBLESPACE_LAYER_ENABLE
 | 
			
		||||
    // double-space enter space layer
 | 
			
		||||
    case LSPACE:
 | 
			
		||||
      if (record->event.pressed) {
 | 
			
		||||
        lspace_active = true;
 | 
			
		||||
        if (rspace_active) {
 | 
			
		||||
          layer_on(_SPACE);
 | 
			
		||||
          space_layer_entered = true;
 | 
			
		||||
        }
 | 
			
		||||
      } else {
 | 
			
		||||
        lspace_active = false;
 | 
			
		||||
        if (space_layer_entered) {
 | 
			
		||||
          layer_off(_SPACE);
 | 
			
		||||
          if (!rspace_active) {
 | 
			
		||||
            space_layer_entered = false;
 | 
			
		||||
          }
 | 
			
		||||
        } else {
 | 
			
		||||
          if (!lspace_emitted) {
 | 
			
		||||
            register_code(KC_SPC);
 | 
			
		||||
            unregister_code(KC_SPC);
 | 
			
		||||
          }
 | 
			
		||||
          lspace_emitted = false;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      return false;
 | 
			
		||||
      break;
 | 
			
		||||
    case RSPACE:
 | 
			
		||||
      if (record->event.pressed) {
 | 
			
		||||
        rspace_active = true;
 | 
			
		||||
        if (lspace_active) {
 | 
			
		||||
          layer_on(_SPACE);
 | 
			
		||||
          space_layer_entered = true;
 | 
			
		||||
        }
 | 
			
		||||
      } else {
 | 
			
		||||
        rspace_active = false;
 | 
			
		||||
        if (space_layer_entered) {
 | 
			
		||||
          layer_off(_SPACE);
 | 
			
		||||
          if (!lspace_active) {
 | 
			
		||||
            space_layer_entered = false;
 | 
			
		||||
          }
 | 
			
		||||
        } else {
 | 
			
		||||
          if (!rspace_emitted) {
 | 
			
		||||
            register_code(KC_SPC);
 | 
			
		||||
            unregister_code(KC_SPC);
 | 
			
		||||
          }
 | 
			
		||||
          rspace_emitted = false;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      return false;
 | 
			
		||||
      break;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    // handle greek layer shift
 | 
			
		||||
    // handle both shift = capslock
 | 
			
		||||
    case KC_LSFT:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue