Last active
February 19, 2025 03:42
-
-
Save trd86/03aaa969253ae8c64252d1ca17068b9a to your computer and use it in GitHub Desktop.
Tap Dance and Mouse Key. You can define the hold to be CMD or layer.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#define ACTION_TAP_DANCE_MOUSE_LAYER(kc1, layer) \ | |
{ .fn = {mousekey_tap, mousekey_finished, mousekey_reset}, .user_data = (void *)&((qk_tap_dance_pair_t){kc1, layer}), } | |
// Tap Dance declarations | |
enum { | |
TD_MB_CMD, | |
TD_MB_L1, | |
TD_RMB_L2 | |
}; | |
enum { | |
SINGLE_TAP = 1, | |
SINGLE_HOLD, | |
DOUBLE_TAP, | |
DOUBLE_HOLD, | |
DOUBLE_SINGLE_TAP, // Send two single taps | |
TRIPLE_TAP, | |
TRIPLE_HOLD, | |
IGNORE_TAP, | |
SHIFTED_ON_INITAL | |
}; | |
static tap mtap_state = { | |
.is_press_action = true, | |
.state = 0, | |
.layer = -1 | |
}; | |
void mousekey_tap (qk_tap_dance_state_t *state, void *user_data); | |
void mousekey_finished (qk_tap_dance_state_t *state, void *user_data); | |
void mousekey_reset (qk_tap_dance_state_t *state, void *user_data); | |
// Tap Dance definitions | |
qk_tap_dance_action_t tap_dance_actions[] = { | |
[TD_MB_CMD] = { .fn = {mousekey_tap, mousekey_finished, mousekey_reset}, .user_data = NULL }, | |
[TD_MB_L1] = ACTION_TAP_DANCE_MOUSE_LAYER(KC_MS_BTN1, 1), | |
[TD_RMB_L2] = ACTION_TAP_DANCE_MOUSE_LAYER(KC_MS_BTN2, 2) | |
} | |
void mousekey_tap (qk_tap_dance_state_t *state, void *user_data) { | |
if (state->count == 1) { | |
mtap_state.layer = -1; | |
} | |
if (user_data) { | |
qk_tap_dance_pair_t *pair = (qk_tap_dance_pair_t *)user_data; | |
mtap_state.layer = pair->kc2; | |
} | |
} | |
void mousekey_finished (qk_tap_dance_state_t *state, void *user_data) { | |
uint16_t mouse_key = KC_MS_BTN1; | |
int layer = -1; | |
if (user_data) { | |
qk_tap_dance_pair_t *pair = (qk_tap_dance_pair_t *)user_data; | |
mouse_key = pair->kc1; | |
layer = pair->kc2; | |
} | |
uint8_t st = SINGLE_TAP; | |
if (state->count == 1) { | |
if (!state->pressed) { | |
st = SINGLE_TAP; | |
} else { | |
st = SINGLE_HOLD; | |
} | |
} else if (state->count == 2) { | |
if (state->pressed) st = DOUBLE_HOLD; else st = DOUBLE_TAP; | |
} if (state->count == 3) { | |
if (state->interrupted || !state->pressed) st = TRIPLE_TAP; | |
else st = DOUBLE_SINGLE_TAP; | |
} | |
mtap_state.state = st; | |
switch (mtap_state.state) { | |
case SINGLE_HOLD: if (layer > -1) layer_on(layer); else register_code(KC_LGUI); break; | |
case SINGLE_TAP: if (get_oneshot_mods() & MOD_MASK_GUI) register_code(KC_LGUI); tap_key(mouse_key); break; | |
case DOUBLE_SINGLE_TAP: register_code(KC_LGUI); break; | |
case TRIPLE_TAP: | |
case DOUBLE_HOLD: if (get_oneshot_mods() & MOD_MASK_GUI) { clear_oneshot_mods(); unregister_code(KC_LGUI); register_code(KC_LALT); }; register_code(mouse_key); break; | |
case DOUBLE_TAP: tap_key(mouse_key); tap_key(mouse_key); break; | |
} | |
} | |
void mousekey_reset (qk_tap_dance_state_t *state, void *user_data) { | |
uint16_t mouse_key = KC_MS_BTN1; | |
int layer = -1; | |
if (user_data) { | |
qk_tap_dance_pair_t *pair = (qk_tap_dance_pair_t *)user_data; | |
mouse_key = pair->kc1; | |
layer = pair->kc2; | |
} | |
switch (mtap_state.state) { | |
case SINGLE_HOLD: if (layer > -1) layer_off(layer); else unregister_code(KC_LGUI); break; | |
case DOUBLE_SINGLE_TAP: unregister_code(KC_LGUI); break; | |
case DOUBLE_TAP: clear_oneshot_mods(); break; | |
case SINGLE_TAP: clear_oneshot_mods(); | |
case DOUBLE_HOLD: unregister_code(KC_LALT); unregister_code(mouse_key); clear_oneshot_mods(); break; | |
} | |
mtap_state.state = 0; | |
} | |
// Add TD(TD_MB_L1) for a key in your keymap to be a mouse button on tap, layer 1 on hold, double tap for double click and double tap hold to drag | |
// Note, if you double tap hold to drag with CMD it will switch it to ALT for OSX Finder |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment