98 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			98 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* Copyright 2020 Stephen J. Bush
 | |
|  *
 | |
|  * This program is free software: you can redistribute it and/or modify
 | |
|  * it under the terms of the GNU General Public License as published by
 | |
|  * the Free Software Foundation, either version 2 of the License, or
 | |
|  * (at your option) any later version.
 | |
|  *
 | |
|  * This program is distributed in the hope that it will be useful,
 | |
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
|  * GNU General Public License for more details.
 | |
|  *
 | |
|  * You should have received a copy of the GNU General Public License
 | |
|  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | |
|  */
 | |
| 
 | |
| #ifdef TAP_DANCE_ENABLE
 | |
| 
 | |
| #    include QMK_KEYBOARD_H
 | |
| #    include "muppetjones.h"
 | |
| #    include "dancelayers.h"
 | |
| 
 | |
| // Initialize tap structure associated with example tap dance key
 | |
| static td_tap_t lyr_tap_state = {.is_press_action = true, .state = TD_NONE};
 | |
| 
 | |
| /* @brief Determine the current tap dance state
 | |
|  * @param A tap dance state struct.
 | |
|  * @return A struct.
 | |
|  */
 | |
| td_state_t cur_dance(tap_dance_state_t *state) {
 | |
|     switch (state->count) {
 | |
|         case 1:
 | |
|             if (!state->pressed)
 | |
|                 return TD_1X_TAP;
 | |
|             else
 | |
|                 return TD_1X_HOLD;
 | |
|         case 2:
 | |
|             return TD_2X_TAP;
 | |
|             break;
 | |
|         case 3:
 | |
|             return TD_3X_TAP;
 | |
|             break;
 | |
|         case 4:
 | |
|             return TD_4X_TAP;
 | |
|             break;
 | |
|         default:
 | |
|             return TD_UNKNOWN;
 | |
|     }
 | |
| }
 | |
| 
 | |
| // Functions that control what our tap dance key does
 | |
| __attribute__((weak)) void td_layer_finished(tap_dance_state_t *state, void *user_data) {
 | |
|     lyr_tap_state.state = cur_dance(state);
 | |
|     switch (lyr_tap_state.state) {
 | |
|         case TD_1X_TAP:
 | |
|             if (layer_state_is(_MOUSE))
 | |
|                 layer_off(_MOUSE);
 | |
|             else
 | |
|                 layer_on(_MOUSE);
 | |
|             break;
 | |
|         case TD_1X_HOLD:
 | |
|             layer_on(_ADJUST);
 | |
|             break;
 | |
|         case TD_2X_TAP:
 | |
|             // Toggle lower layer
 | |
|             if (layer_state_is(_LOWER))
 | |
|                 layer_off(_LOWER);
 | |
|             else
 | |
|                 layer_on(_LOWER);
 | |
|             break;
 | |
|         case TD_3X_TAP:
 | |
|             // Toggle lower layer
 | |
|             if (layer_state_is(_RAISE))
 | |
|                 layer_off(_RAISE);
 | |
|             else
 | |
|                 layer_on(_RAISE);
 | |
|             break;
 | |
|         case TD_4X_TAP:
 | |
|             // Toggle lower layer
 | |
|             if (layer_state_is(_ADJUST))
 | |
|                 layer_off(_ADJUST);
 | |
|             else
 | |
|                 layer_on(_ADJUST);
 | |
|             break;
 | |
|         default:
 | |
|             break;
 | |
|     }
 | |
| }
 | |
| 
 | |
| __attribute__((weak)) void td_layer_reset(tap_dance_state_t *state, void *user_data) {
 | |
|     // If the key was held down and now is released then switch off the layer
 | |
|     if (lyr_tap_state.state == TD_1X_HOLD) {
 | |
|         layer_off(_ADJUST);
 | |
|     }
 | |
|     lyr_tap_state.state = TD_NONE;
 | |
| }
 | |
| 
 | |
| #endif
 | 
