You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							74 lines
						
					
					
						
							1.6 KiB
						
					
					
				
			
		
		
	
	
							74 lines
						
					
					
						
							1.6 KiB
						
					
					
				| #include "edvorakjp.h"
 | |
| #include "process_keycode/process_tap_dance.h"
 | |
| 
 | |
| enum tap_state {
 | |
|   NONE = 0,
 | |
|   SINGLE_TAP = 1,
 | |
|   DOUBLE_TAP = 2,
 | |
|   HOLD
 | |
| };
 | |
| 
 | |
| typedef struct {
 | |
|   uint8_t lower;
 | |
|   uint8_t raise;
 | |
| } td_status_t;
 | |
| static td_status_t td_status = {NONE, NONE};
 | |
| 
 | |
| int cur_dance(qk_tap_dance_state_t *state) {
 | |
|   if (state->interrupted || !state->pressed) {
 | |
|     return state->count == 1 ? SINGLE_TAP : DOUBLE_TAP;
 | |
|   } else {
 | |
|     return HOLD;
 | |
|   }
 | |
| }
 | |
| 
 | |
| void td_lower_finished(qk_tap_dance_state_t *state, void *user_data) {
 | |
|   td_status.lower = cur_dance(state);
 | |
|   switch(td_status.lower) {
 | |
|     case SINGLE_TAP:
 | |
|       set_japanese_mode(false);
 | |
|       break;
 | |
|     case DOUBLE_TAP:
 | |
|       set_japanese_mode(false);
 | |
|       register_code(KC_ESC);
 | |
|       break;
 | |
|     case HOLD:
 | |
|       break;
 | |
|   }
 | |
|   layer_on(_LOWER);
 | |
| }
 | |
| 
 | |
| void td_lower_reset(qk_tap_dance_state_t *state, void *user_data) {
 | |
|   if (td_status.lower == DOUBLE_TAP) {
 | |
|     unregister_code(KC_ESC);
 | |
|   }
 | |
|   layer_off(_LOWER);
 | |
|   td_status.lower = NONE;
 | |
| }
 | |
| 
 | |
| void td_raise_finished(qk_tap_dance_state_t *state, void *user_data) {
 | |
|   td_status.raise = cur_dance(state);
 | |
|   switch(td_status.raise) {
 | |
|     case DOUBLE_TAP:
 | |
|       // same as single
 | |
|     case SINGLE_TAP:
 | |
|       set_japanese_mode(true);
 | |
|       break;
 | |
|     case HOLD:
 | |
|       break;
 | |
|   }
 | |
|   layer_on(_RAISE);
 | |
| }
 | |
| 
 | |
| void td_raise_reset(qk_tap_dance_state_t *state, void *user_data) {
 | |
|   layer_off(_RAISE);
 | |
|   td_status.raise = NONE;
 | |
| }
 | |
| 
 | |
| qk_tap_dance_action_t tap_dance_actions[] = {
 | |
|   [TD_LOWER] =
 | |
|     ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, td_lower_finished, td_lower_reset, 100),
 | |
|   [TD_RAISE] =
 | |
|     ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, td_raise_finished, td_raise_reset, 100)
 | |
| };
 |