Generalize Tap Dance Layer functions (#6629)
* made tapdance dual_role general * updated original dual_role functionality * added toggling layer example * Fix dual role and add alias * Update docs about new layer tap dances * Fix up based on feedback
This commit is contained in:
		
							parent
							
								
									63a0b1241d
								
							
						
					
					
						commit
						f069e9fc09
					
				
					 4 changed files with 20 additions and 8 deletions
				
			
		
							
								
								
									
										12
									
								
								.vscode/settings.json
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								.vscode/settings.json
									
										
									
									
										vendored
									
									
								
							|  | @ -8,10 +8,12 @@ | |||
|         "**/*.hex": true | ||||
|     }, | ||||
|     "files.associations": { | ||||
|         "*.h": "c", | ||||
|         "*.c": "c", | ||||
|         "*.cpp": "cpp", | ||||
|         "*.hpp": "cpp", | ||||
|         "xstddef": "c" | ||||
|       "*.h": "c", | ||||
|       "*.c": "c", | ||||
|       "*.cpp": "cpp", | ||||
|       "*.hpp": "cpp", | ||||
|       "xstddef": "c", | ||||
|       "type_traits": "c", | ||||
|       "utility": "c" | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -30,7 +30,9 @@ Next, you will want to define some tap-dance keys, which is easiest to do with t | |||
| After this, you'll want to use the `tap_dance_actions` array to specify what actions shall be taken when a tap-dance key is in action. Currently, there are five possible options: | ||||
| 
 | ||||
| * `ACTION_TAP_DANCE_DOUBLE(kc1, kc2)`: Sends the `kc1` keycode when tapped once, `kc2` otherwise. When the key is held, the appropriate keycode is registered: `kc1` when pressed and held, `kc2` when tapped once, then pressed and held. | ||||
| * `ACTION_TAP_DANCE_DUAL_ROLE(kc, layer)`: Sends the `kc` keycode when tapped once, or moves to `layer`. (this functions like the `TO` layer keycode). | ||||
| * `ACTION_TAP_DANCE_LAYER_MOVE(kc, layer)`: Sends the `kc` keycode when tapped once, or moves to `layer`. (this functions like the `TO` layer keycode). | ||||
|     * This is the same as `ACTION_TAP_DANCE_DUAL_ROLE`, but renamed to something that is clearer about its functionality.  Both names will work. | ||||
| * `ACTION_TAP_DANCE_LAYER_TOGGLE(kc, layer)`: Sends the `kc` keycode when tapped once, or toggles the state of `layer`. (this functions like the `TG` layer keycode). | ||||
| * `ACTION_TAP_DANCE_FN(fn)`: Calls the specified function - defined in the user keymap - with the final tap count of the tap dance action. | ||||
| * `ACTION_TAP_DANCE_FN_ADVANCED(on_each_tap_fn, on_dance_finished_fn, on_dance_reset_fn)`: Calls the first specified function - defined in the user keymap - on every tap, the second function when the dance action finishes (like the previous option), and the last function when the tap dance action resets. | ||||
| * `ACTION_TAP_DANCE_FN_ADVANCED_TIME(on_each_tap_fn, on_dance_finished_fn, on_dance_reset_fn, tap_specific_tapping_term)`: This functions identically to the `ACTION_TAP_DANCE_FN_ADVANCED` function, but uses a custom tapping term for it, instead of the predefined `TAPPING_TERM`. | ||||
|  |  | |||
|  | @ -71,7 +71,7 @@ void qk_tap_dance_dual_role_finished(qk_tap_dance_state_t *state, void *user_dat | |||
|     if (state->count == 1) { | ||||
|         register_code16(pair->kc); | ||||
|     } else if (state->count == 2) { | ||||
|         layer_move(pair->layer); | ||||
|         pair->layer_function(pair->layer); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -56,13 +56,19 @@ typedef struct { | |||
| typedef struct { | ||||
|     uint16_t kc; | ||||
|     uint8_t  layer; | ||||
|     void (*layer_function)(uint8_t); | ||||
| } qk_tap_dance_dual_role_t; | ||||
| 
 | ||||
| #    define ACTION_TAP_DANCE_DOUBLE(kc1, kc2) \ | ||||
|         { .fn = {qk_tap_dance_pair_on_each_tap, qk_tap_dance_pair_finished, qk_tap_dance_pair_reset}, .user_data = (void *)&((qk_tap_dance_pair_t){kc1, kc2}), } | ||||
| 
 | ||||
| #    define ACTION_TAP_DANCE_DUAL_ROLE(kc, layer) \ | ||||
|         { .fn = {qk_tap_dance_dual_role_on_each_tap, qk_tap_dance_dual_role_finished, qk_tap_dance_dual_role_reset}, .user_data = (void *)&((qk_tap_dance_dual_role_t){kc, layer}), } | ||||
|         { .fn = { qk_tap_dance_dual_role_on_each_tap, qk_tap_dance_dual_role_finished, qk_tap_dance_dual_role_reset }, .user_data = (void *)&((qk_tap_dance_dual_role_t) { kc, layer, layer_move }),  } | ||||
| 
 | ||||
| #    define ACTION_TAP_DANCE_TOGGLE_LAYER(kc, layer) \ | ||||
|         { .fn = { NULL, qk_tap_dance_dual_role_finished, qk_tap_dance_dual_role_reset }, .user_data = (void *)&((qk_tap_dance_dual_role_t) { kc, layer, layer_invert }), } | ||||
| 
 | ||||
| #    define ACTION_TAP_DANCE_LAYER_MOVE(kc, layer) ACTION_TAP_DANCE_DUAL_ROLE(kc, layer) | ||||
| 
 | ||||
| #    define ACTION_TAP_DANCE_FN(user_fn) \ | ||||
|         { .fn = {NULL, user_fn, NULL}, .user_data = NULL, } | ||||
|  | @ -73,6 +79,8 @@ typedef struct { | |||
| #    define ACTION_TAP_DANCE_FN_ADVANCED_TIME(user_fn_on_each_tap, user_fn_on_dance_finished, user_fn_on_dance_reset, tap_specific_tapping_term) \ | ||||
|         { .fn = {user_fn_on_each_tap, user_fn_on_dance_finished, user_fn_on_dance_reset}, .user_data = NULL, .custom_tapping_term = tap_specific_tapping_term, } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| extern qk_tap_dance_action_t tap_dance_actions[]; | ||||
| 
 | ||||
| /* To be used internally */ | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Drashna Jaelre
						Drashna Jaelre