forked from mirrors/qmk_userspace
		
	Update features to use Custom Tapping Term when appropriate (#6259)
* Update Space Cadet to use Custom Tapping Term functionality * Detect correct keycode for space cadet tapping term * Update tap dancing to use global custom tapping term * Update documentation for Tap Dances * formatting pass * Apply suggestions from code review Co-Authored-By: fauxpark <fauxpark@gmail.com> * Update docs/feature_tap_dance.md Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com> * Update for future * Update user keymaps for space cadet * Fix typos * Clean up tapping term stuff * Fix compiler issue if NO_ACTION_TAPPING is enabled Co-authored-by: fauxpark <fauxpark@gmail.com> Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com>
This commit is contained in:
		
					parent
					
						
							
								3c74edbc69
							
						
					
				
			
			
				commit
				
					
						9d3b26a475
					
				
			
		
					 7 changed files with 28 additions and 26 deletions
				
			
		| 
						 | 
					@ -28,7 +28,9 @@ After this, you'll want to use the `tap_dance_actions` array to specify what act
 | 
				
			||||||
* `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_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(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(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`.
 | 
					* ~~`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`.
 | 
				
			||||||
 | 
					    * This is deprecated in favor of the Per Key Tapping Term functionality, as outlined [here](custom_quantum_functions.md#Custom_Tapping_Term). You'd want to check for the specific `TD()` macro that you want to use (such as `TD(TD_ESC_CAPS)`) instead of using this specific Tap Dance function.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The first option is enough for a lot of cases, that just want dual roles. For example, `ACTION_TAP_DANCE_DOUBLE(KC_SPC, KC_ENT)` will result in `Space` being sent on single-tap, `Enter` otherwise. 
 | 
					The first option is enough for a lot of cases, that just want dual roles. For example, `ACTION_TAP_DANCE_DOUBLE(KC_SPC, KC_ENT)` will result in `Space` being sent on single-tap, `Enter` otherwise. 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -130,17 +130,17 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // 1. Hold for LGUI, tap for Underscore
 | 
					        // 1. Hold for LGUI, tap for Underscore
 | 
				
			||||||
        case GUI_UNDS:
 | 
					        case GUI_UNDS:
 | 
				
			||||||
            perform_space_cadet(record, KC_LGUI, KC_LSFT, KC_MINS);
 | 
					            perform_space_cadet(record, keycode, KC_LGUI, KC_LSFT, KC_MINS);
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // 2. Hold for LSHIFT, tap for Parens open
 | 
					        // 2. Hold for LSHIFT, tap for Parens open
 | 
				
			||||||
        case LSFT_LPRN:
 | 
					        case LSFT_LPRN:
 | 
				
			||||||
            perform_space_cadet(record, KC_LSFT, KC_LSFT, KC_9);
 | 
					            perform_space_cadet(record, keycode, KC_LSFT, KC_LSFT, KC_9);
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // 3. Hold for RSHIFT, tap for Parens close
 | 
					        // 3. Hold for RSHIFT, tap for Parens close
 | 
				
			||||||
        case RSFT_RPRN:
 | 
					        case RSFT_RPRN:
 | 
				
			||||||
            perform_space_cadet(record, KC_RSFT, KC_RSFT, KC_0);
 | 
					            perform_space_cadet(record, keycode, KC_RSFT, KC_RSFT, KC_0);
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        default:
 | 
					        default:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -635,17 +635,17 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // 1. Hold for LGUI, tap for Underscore
 | 
					        // 1. Hold for LGUI, tap for Underscore
 | 
				
			||||||
        case GUI_UNDS:
 | 
					        case GUI_UNDS:
 | 
				
			||||||
            perform_space_cadet(record, KC_LGUI, KC_LSFT, KC_MINS);
 | 
					            perform_space_cadet(record, keycode, KC_LGUI, KC_LSFT, KC_MINS);
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // 2. Hold for LSHIFT, tap for Parens open
 | 
					        // 2. Hold for LSHIFT, tap for Parens open
 | 
				
			||||||
        case LSFT_LPRN:
 | 
					        case LSFT_LPRN:
 | 
				
			||||||
            perform_space_cadet(record, KC_LSFT, KC_LSFT, KC_9);
 | 
					            perform_space_cadet(record, keycode, KC_LSFT, KC_LSFT, KC_9);
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // 3. Hold for RSHIFT, tap for Parens close
 | 
					        // 3. Hold for RSHIFT, tap for Parens close
 | 
				
			||||||
        case RSFT_RPRN:
 | 
					        case RSFT_RPRN:
 | 
				
			||||||
            perform_space_cadet(record, KC_RSFT, KC_RSFT, KC_0);
 | 
					            perform_space_cadet(record, keycode, KC_RSFT, KC_RSFT, KC_0);
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -330,12 +330,12 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // 1. Hold for LGUI, tap for Underscore
 | 
					        // 1. Hold for LGUI, tap for Underscore
 | 
				
			||||||
        case GUI_UNDS:
 | 
					        case GUI_UNDS:
 | 
				
			||||||
            perform_space_cadet(record, KC_LGUI, KC_LSFT, KC_MINS);
 | 
					            perform_space_cadet(record, keycode, KC_LGUI, KC_LSFT, KC_MINS);
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // 2. Hold for LSHIFT, tap for Parens open
 | 
					        // 2. Hold for LSHIFT, tap for Parens open
 | 
				
			||||||
        case LSFT_LPRN:
 | 
					        case LSFT_LPRN:
 | 
				
			||||||
            perform_space_cadet(record, KC_LSFT, KC_LSFT, KC_9);
 | 
					            perform_space_cadet(record, keycode, KC_LSFT, KC_LSFT, KC_9);
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        default:
 | 
					        default:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,9 +14,10 @@
 | 
				
			||||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
#include "process_space_cadet.h"
 | 
					#include "process_space_cadet.h"
 | 
				
			||||||
 | 
					#include "action_tapping.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef TAPPING_TERM
 | 
					#ifdef NO_ACTION_TAPPING
 | 
				
			||||||
#    define TAPPING_TERM 200
 | 
					__attribute__((weak)) uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) { return TAPPING_TERM; };
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ********** OBSOLETE DEFINES, STOP USING! (pls?) **********
 | 
					// ********** OBSOLETE DEFINES, STOP USING! (pls?) **********
 | 
				
			||||||
| 
						 | 
					@ -85,7 +86,7 @@ static uint16_t sc_timer = 0;
 | 
				
			||||||
static uint8_t sc_mods = 0;
 | 
					static uint8_t sc_mods = 0;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void perform_space_cadet(keyrecord_t *record, uint8_t holdMod, uint8_t tapMod, uint8_t keycode) {
 | 
					void perform_space_cadet(keyrecord_t *record, uint16_t sc_keycode, uint8_t holdMod, uint8_t tapMod, uint8_t keycode) {
 | 
				
			||||||
    if (record->event.pressed) {
 | 
					    if (record->event.pressed) {
 | 
				
			||||||
        sc_last  = holdMod;
 | 
					        sc_last  = holdMod;
 | 
				
			||||||
        sc_timer = timer_read();
 | 
					        sc_timer = timer_read();
 | 
				
			||||||
| 
						 | 
					@ -96,7 +97,7 @@ void perform_space_cadet(keyrecord_t *record, uint8_t holdMod, uint8_t tapMod, u
 | 
				
			||||||
            register_mods(MOD_BIT(holdMod));
 | 
					            register_mods(MOD_BIT(holdMod));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        if (sc_last == holdMod && timer_elapsed(sc_timer) < TAPPING_TERM) {
 | 
					        if (sc_last == holdMod && timer_elapsed(sc_timer) < get_tapping_term(sc_keycode, record)) {
 | 
				
			||||||
            if (holdMod != tapMod) {
 | 
					            if (holdMod != tapMod) {
 | 
				
			||||||
                if (IS_MOD(holdMod)) {
 | 
					                if (IS_MOD(holdMod)) {
 | 
				
			||||||
                    unregister_mods(MOD_BIT(holdMod));
 | 
					                    unregister_mods(MOD_BIT(holdMod));
 | 
				
			||||||
| 
						 | 
					@ -126,31 +127,31 @@ void perform_space_cadet(keyrecord_t *record, uint8_t holdMod, uint8_t tapMod, u
 | 
				
			||||||
bool process_space_cadet(uint16_t keycode, keyrecord_t *record) {
 | 
					bool process_space_cadet(uint16_t keycode, keyrecord_t *record) {
 | 
				
			||||||
    switch (keycode) {
 | 
					    switch (keycode) {
 | 
				
			||||||
        case KC_LSPO: {
 | 
					        case KC_LSPO: {
 | 
				
			||||||
            perform_space_cadet(record, LSPO_KEYS);
 | 
					            perform_space_cadet(record, keycode, LSPO_KEYS);
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        case KC_RSPC: {
 | 
					        case KC_RSPC: {
 | 
				
			||||||
            perform_space_cadet(record, RSPC_KEYS);
 | 
					            perform_space_cadet(record, keycode, RSPC_KEYS);
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        case KC_LCPO: {
 | 
					        case KC_LCPO: {
 | 
				
			||||||
            perform_space_cadet(record, LCPO_KEYS);
 | 
					            perform_space_cadet(record, keycode, LCPO_KEYS);
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        case KC_RCPC: {
 | 
					        case KC_RCPC: {
 | 
				
			||||||
            perform_space_cadet(record, RCPC_KEYS);
 | 
					            perform_space_cadet(record, keycode, RCPC_KEYS);
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        case KC_LAPO: {
 | 
					        case KC_LAPO: {
 | 
				
			||||||
            perform_space_cadet(record, LAPO_KEYS);
 | 
					            perform_space_cadet(record, keycode, LAPO_KEYS);
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        case KC_RAPC: {
 | 
					        case KC_RAPC: {
 | 
				
			||||||
            perform_space_cadet(record, RAPC_KEYS);
 | 
					            perform_space_cadet(record, keycode, RAPC_KEYS);
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        case KC_SFTENT: {
 | 
					        case KC_SFTENT: {
 | 
				
			||||||
            perform_space_cadet(record, SFTENT_KEYS);
 | 
					            perform_space_cadet(record, keycode, SFTENT_KEYS);
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        default: {
 | 
					        default: {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,5 +17,8 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "quantum.h"
 | 
					#include "quantum.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void perform_space_cadet(keyrecord_t *record, uint8_t holdMod, uint8_t tapMod, uint8_t keycode);
 | 
					void perform_space_cadet(keyrecord_t *record, uint16_t sc_keycode, uint8_t holdMod, uint8_t tapMod, uint8_t keycode);
 | 
				
			||||||
bool process_space_cadet(uint16_t keycode, keyrecord_t *record);
 | 
					bool process_space_cadet(uint16_t keycode, keyrecord_t *record);
 | 
				
			||||||
 | 
					#ifdef NO_ACTION_TAPPING
 | 
				
			||||||
 | 
					uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -16,10 +16,6 @@
 | 
				
			||||||
#include "quantum.h"
 | 
					#include "quantum.h"
 | 
				
			||||||
#include "action_tapping.h"
 | 
					#include "action_tapping.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef TAPPING_TERM
 | 
					 | 
				
			||||||
#    define TAPPING_TERM 200
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef NO_ACTION_ONESHOT
 | 
					#ifndef NO_ACTION_ONESHOT
 | 
				
			||||||
uint8_t get_oneshot_mods(void);
 | 
					uint8_t get_oneshot_mods(void);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -171,7 +167,7 @@ void matrix_scan_tap_dance() {
 | 
				
			||||||
        if (action->custom_tapping_term > 0) {
 | 
					        if (action->custom_tapping_term > 0) {
 | 
				
			||||||
            tap_user_defined = action->custom_tapping_term;
 | 
					            tap_user_defined = action->custom_tapping_term;
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            tap_user_defined = TAPPING_TERM;
 | 
					            tap_user_defined = get_tapping_term(action->state.keycode, NULL);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (action->state.count && timer_elapsed(action->state.timer) > tap_user_defined) {
 | 
					        if (action->state.count && timer_elapsed(action->state.timer) > tap_user_defined) {
 | 
				
			||||||
            process_tap_dance_action_on_dance_finished(action);
 | 
					            process_tap_dance_action_on_dance_finished(action);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue