203 lines
		
	
	
	
		
			5.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			203 lines
		
	
	
	
		
			5.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include "tap_dance.h"
 | |
| #include "lights.h"
 | |
| 
 | |
| qk_tap_dance_action_t tap_dance_actions[] = {
 | |
|     [DA_LCTL] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_lctl_finished,
 | |
|                                              dance_lctl_reset),
 | |
|     [DA_LSPR] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_lspr_finished,
 | |
|                                              dance_lspr_reset),
 | |
|     [DA_RCTL] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_rctl_finished,
 | |
|                                              dance_rctl_reset),
 | |
|     [DA_RALT] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_ralt_finished,
 | |
|                                              dance_ralt_reset),
 | |
|     [DA_UPLY] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_uply_finished,
 | |
|                                              dance_uply_reset),
 | |
|     [DA_DWLY] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_dwly_finished,
 | |
|                                              dance_dwly_reset),
 | |
| };
 | |
| 
 | |
| volatile uint8_t active_layer = _BL;
 | |
| volatile uint8_t gm_layer_act = false;
 | |
| static tap upltap_state = {.state = 0};
 | |
| static tap dwltap_state = {.state = 0};
 | |
| static tap lsprtap_state = {.state = 0};
 | |
| static tap ralttap_state = {.state = 0};
 | |
| 
 | |
| void layer_switcher_tap(uint8_t new_layer) {
 | |
|   if (gm_layer_act == true) {
 | |
|     layer_off(active_layer);
 | |
|     if (new_layer == _BL) {
 | |
|       layer_on(_GM);
 | |
|       active_layer = _GM;
 | |
|     } else {
 | |
|       layer_on(new_layer);
 | |
|       active_layer = new_layer;
 | |
|     }
 | |
|   } else {
 | |
|     layer_off(active_layer);
 | |
|     layer_on(new_layer);
 | |
|     active_layer = new_layer;
 | |
|   }
 | |
| }
 | |
| 
 | |
| int cur_dance(qk_tap_dance_state_t *state) {
 | |
|   switch (state->count) {
 | |
|   case 1:
 | |
|     return state->pressed == 0 ? SINGLE_TAP : SINGLE_HOLD;
 | |
|   case 2:
 | |
|     return state->pressed == 0 ? DOUBLE_TAP : DOUBLE_HOLD;
 | |
|   case 3:
 | |
|     return state->pressed == 0 ? TRIPLE_TAP : TRIPLE_HOLD;
 | |
|   default:
 | |
|     return state->pressed == 0 ? DEFAULT_TAP : DEFAULT_HOLD;
 | |
|   }
 | |
| }
 | |
| 
 | |
| void dance_lctl_finished(qk_tap_dance_state_t *state, void *user_data) {
 | |
|   rbw_led_keys[RBW_LCTL].status = ENABLED;
 | |
|   register_code(KC_LCTRL);
 | |
| };
 | |
| 
 | |
| void dance_lctl_reset(qk_tap_dance_state_t *state, void *user_data) {
 | |
|   unregister_code(KC_LCTRL);
 | |
|   rbw_led_keys[RBW_LCTL].status = DISABLED;
 | |
| };
 | |
| 
 | |
| void dance_lspr_finished(qk_tap_dance_state_t *state, void *user_data) {
 | |
|   lsprtap_state.state = cur_dance(state);
 | |
| 
 | |
|   switch (lsprtap_state.state) {
 | |
|   case DOUBLE_HOLD:
 | |
|     rbw_led_keys[RBW_LSPR].status = ENABLED;
 | |
|     register_code(KC_LALT);
 | |
|     break;
 | |
|   default:
 | |
|     register_code(KC_LGUI);
 | |
|     break;
 | |
|   }
 | |
| };
 | |
| 
 | |
| void dance_lspr_reset(qk_tap_dance_state_t *state, void *user_data) {
 | |
|   switch (lsprtap_state.state) {
 | |
|   case DOUBLE_HOLD:
 | |
|     unregister_code(KC_LALT);
 | |
|     rbw_led_keys[RBW_LSPR].status = DISABLED;
 | |
|     break;
 | |
|   default:
 | |
|     unregister_code(KC_LGUI);
 | |
|     break;
 | |
|   }
 | |
| };
 | |
| 
 | |
| void dance_rctl_finished(qk_tap_dance_state_t *state, void *user_data) {
 | |
|   rbw_led_keys[RBW_RCTL].status = ENABLED;
 | |
|   register_code(KC_RCTRL);
 | |
| };
 | |
| 
 | |
| void dance_rctl_reset(qk_tap_dance_state_t *state, void *user_data) {
 | |
|   unregister_code(KC_RCTRL);
 | |
|   rbw_led_keys[RBW_RCTL].status = DISABLED;
 | |
| };
 | |
| 
 | |
| void dance_ralt_finished(qk_tap_dance_state_t *state, void *user_data) {
 | |
|   ralttap_state.state = cur_dance(state);
 | |
| 
 | |
|   switch (ralttap_state.state) {
 | |
|   case DOUBLE_HOLD:
 | |
|     rbw_led_keys[RBW_RALT].status = ENABLED;
 | |
|     unregister_code(KC_LGUI);
 | |
|     break;
 | |
|   default:
 | |
|     register_code(KC_RALT);
 | |
|     break;
 | |
|   }
 | |
| };
 | |
| 
 | |
| void dance_ralt_reset(qk_tap_dance_state_t *state, void *user_data) {
 | |
|   switch (ralttap_state.state) {
 | |
|   case DOUBLE_HOLD:
 | |
|     unregister_code(KC_RGUI);
 | |
|     rbw_led_keys[RBW_RALT].status = DISABLED;
 | |
|     break;
 | |
|   default:
 | |
|     unregister_code(KC_RALT);
 | |
|     break;
 | |
|   }
 | |
| };
 | |
| 
 | |
| void dance_uply_finished(qk_tap_dance_state_t *state, void *user_data) {
 | |
|   upltap_state.state = cur_dance(state);
 | |
| 
 | |
|   switch (upltap_state.state) {
 | |
|   case SINGLE_TAP:
 | |
|     if (active_layer == _UL) {
 | |
|       layer_switcher_tap(_BL);
 | |
|     } else {
 | |
|       layer_switcher_tap(_UL);
 | |
|     }
 | |
|     break;
 | |
|   case SINGLE_HOLD:
 | |
|     layer_switcher_tap(_UL);
 | |
|     break;
 | |
|   default:
 | |
|     layer_switcher_tap(_BL);
 | |
|     break;
 | |
|   }
 | |
| }
 | |
| 
 | |
| void dance_uply_reset(qk_tap_dance_state_t *state, void *user_data) {
 | |
|   switch (upltap_state.state) {
 | |
|   case SINGLE_TAP:
 | |
|     break;
 | |
|   case SINGLE_HOLD:
 | |
|   default:
 | |
|     layer_switcher_tap(_BL);
 | |
|     break;
 | |
|   }
 | |
|   upltap_state.state = 0;
 | |
| }
 | |
| 
 | |
| void dance_dwly_finished(qk_tap_dance_state_t *state, void *user_data) {
 | |
|   dwltap_state.state = cur_dance(state);
 | |
| 
 | |
|   switch (dwltap_state.state) {
 | |
|   case SINGLE_TAP:
 | |
|     if (active_layer == _DL) {
 | |
|       layer_switcher_tap(_BL);
 | |
|     } else {
 | |
|       layer_switcher_tap(_DL);
 | |
|     }
 | |
|     break;
 | |
|   case SINGLE_HOLD:
 | |
|     layer_switcher_tap(_DL);
 | |
|     break;
 | |
|   case DOUBLE_HOLD:
 | |
|     layer_switcher_tap(_AL);
 | |
|     break;
 | |
|   case TRIPLE_TAP:
 | |
|     if (gm_layer_act == true) {
 | |
|       gm_layer_act = false;
 | |
|       layer_switcher_tap(_BL);
 | |
|     } else {
 | |
|       gm_layer_act = true;
 | |
|       layer_switcher_tap(_GM);
 | |
|     }
 | |
|   default:
 | |
|     layer_switcher_tap(_BL);
 | |
|     break;
 | |
|   }
 | |
| }
 | |
| 
 | |
| void dance_dwly_reset(qk_tap_dance_state_t *state, void *user_data) {
 | |
|   switch (dwltap_state.state) {
 | |
|   case SINGLE_TAP:
 | |
|     break;
 | |
|   case SINGLE_HOLD:
 | |
|   case DOUBLE_HOLD:
 | |
|   case TRIPLE_TAP:
 | |
|   default:
 | |
|     layer_switcher_tap(_BL);
 | |
|     break;
 | |
|   }
 | |
|   dwltap_state.state = 0;
 | |
| }
 | 
