|
|
@ -0,0 +1,161 @@ |
|
|
|
#include QMK_KEYBOARD_H |
|
|
|
|
|
|
|
enum layer_names { |
|
|
|
_BASE, |
|
|
|
_MACRO, |
|
|
|
_MOD |
|
|
|
}; |
|
|
|
|
|
|
|
enum custom_keycodes { |
|
|
|
M801 = SAFE_RANGE, |
|
|
|
M802, |
|
|
|
M803, |
|
|
|
M804, |
|
|
|
M805, |
|
|
|
M806, |
|
|
|
MAIL_C |
|
|
|
}; |
|
|
|
|
|
|
|
// tapdance keycodes |
|
|
|
enum td_keycodes { |
|
|
|
LAY // Our example key: `LALT` when held, `(` when tapped. Add additional keycodes for each tapdance. |
|
|
|
}; |
|
|
|
|
|
|
|
// define a type containing as many tapdance states as you need |
|
|
|
typedef enum { |
|
|
|
SINGLE_TAP, |
|
|
|
SINGLE_HOLD, |
|
|
|
} td_state_t; |
|
|
|
|
|
|
|
// create a global instance of the tapdance state type |
|
|
|
static td_state_t td_state; |
|
|
|
|
|
|
|
// declare your tapdance functions: |
|
|
|
|
|
|
|
// function to determine the current tapdance state |
|
|
|
int cur_dance (qk_tap_dance_state_t *state); |
|
|
|
|
|
|
|
// `finished` and `reset` functions for each tapdance keycode |
|
|
|
void altlp_finished (qk_tap_dance_state_t *state, void *user_data); |
|
|
|
void altlp_reset (qk_tap_dance_state_t *state, void *user_data); |
|
|
|
|
|
|
|
bool process_record_user(uint16_t keycode, keyrecord_t *record) { |
|
|
|
switch (keycode) { |
|
|
|
case M801: |
|
|
|
if (record->event.pressed) { |
|
|
|
SEND_STRING("M801" SS_TAP(X_ENTER)); |
|
|
|
} |
|
|
|
break; |
|
|
|
case M802: |
|
|
|
if (record->event.pressed) { |
|
|
|
SEND_STRING("M802" SS_TAP(X_ENTER)); |
|
|
|
} |
|
|
|
break; |
|
|
|
case M803: |
|
|
|
if (record->event.pressed) { |
|
|
|
SEND_STRING("M803" SS_TAP(X_ENTER)); |
|
|
|
} |
|
|
|
break; |
|
|
|
case M804: |
|
|
|
if (record->event.pressed) { |
|
|
|
SEND_STRING("M804" SS_TAP(X_ENTER)); |
|
|
|
} |
|
|
|
break; |
|
|
|
case M805: |
|
|
|
if (record->event.pressed) { |
|
|
|
SEND_STRING("M805" SS_TAP(X_ENTER)); |
|
|
|
} |
|
|
|
break; |
|
|
|
case M806: |
|
|
|
if (record->event.pressed) { |
|
|
|
SEND_STRING("M806" SS_TAP(X_ENTER)); |
|
|
|
} |
|
|
|
break; |
|
|
|
case MAIL_C: |
|
|
|
if (record->event.pressed) { |
|
|
|
SEND_STRING(SS_TAP(X_ENTER) SS_TAP(X_DOWN) SS_TAP(X_DOWN) SS_TAP(X_ENTER)); |
|
|
|
} |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
return true; |
|
|
|
}; |
|
|
|
|
|
|
|
#define EX_ARR LCTL(LSFT(KC_ENTER)) |
|
|
|
|
|
|
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { |
|
|
|
[_BASE] = LAYOUT( |
|
|
|
// ┌────────┬────────┬────────┐ |
|
|
|
KC_MUTE, KC_UP, TD(LAY), |
|
|
|
// ├────────┼────────┼────────┤ |
|
|
|
KC_LEFT, KC_DOWN, KC_RGHT, |
|
|
|
// ├────────┼────────┼────────┤ |
|
|
|
KC_NO, KC_NO, KC_NO |
|
|
|
// └────────┴────────┴────────┘ |
|
|
|
), |
|
|
|
[_MACRO] = LAYOUT( |
|
|
|
// ┌────────┬────────┬────────┐ |
|
|
|
_______, KC_SPC, TG(_MACRO), |
|
|
|
// ├────────┼────────┼────────┤ |
|
|
|
M801, M802, M803, |
|
|
|
// ├────────┼────────┼────────┤ |
|
|
|
MAIL_C, KC_NO, EX_ARR |
|
|
|
// └────────┴────────┴────────┘ |
|
|
|
), |
|
|
|
[_MOD] = LAYOUT( |
|
|
|
// ┌────────┬────────┬────────┐ |
|
|
|
_______, BL_STEP,TG(_MOD), |
|
|
|
// ├────────┼────────┼────────┤ |
|
|
|
KC_NO, RGB_MOD, KC_NO, |
|
|
|
// ├────────┼────────┼────────┤ |
|
|
|
KC_NO, KC_NO, KC_NO |
|
|
|
// └────────┴────────┴────────┘ |
|
|
|
) |
|
|
|
}; |
|
|
|
|
|
|
|
void encoder_update_user(uint8_t index, bool clockwise) { |
|
|
|
if (index == 0) { |
|
|
|
if (clockwise) { |
|
|
|
tap_code(KC_VOLD); |
|
|
|
} else { |
|
|
|
tap_code(KC_VOLU); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// determine the tapdance state to return |
|
|
|
int cur_dance (qk_tap_dance_state_t *state) { |
|
|
|
if (state->count == 1) { |
|
|
|
if (state->interrupted || !state->pressed) { return SINGLE_TAP; } |
|
|
|
else { return SINGLE_HOLD; } |
|
|
|
} else { return 3; } // any number higher than the maximum state value you return above |
|
|
|
} |
|
|
|
|
|
|
|
// handle the possible states for each tapdance keycode you define: |
|
|
|
|
|
|
|
void altlp_finished (qk_tap_dance_state_t *state, void *user_data) { |
|
|
|
td_state = cur_dance(state); |
|
|
|
switch (td_state) { |
|
|
|
case SINGLE_TAP: |
|
|
|
layer_on(_MACRO); |
|
|
|
break; |
|
|
|
case SINGLE_HOLD: |
|
|
|
layer_on(_MOD); |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void altlp_reset (qk_tap_dance_state_t *state, void *user_data) { |
|
|
|
switch (td_state) { |
|
|
|
case SINGLE_TAP: |
|
|
|
break; |
|
|
|
case SINGLE_HOLD: |
|
|
|
layer_off(_MOD); |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// define `ACTION_TAP_DANCE_FN_ADVANCED()` for each tapdance keycode, passing in `finished` and `reset` functions |
|
|
|
qk_tap_dance_action_t tap_dance_actions[] = { |
|
|
|
[LAY] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, altlp_finished, altlp_reset) |
|
|
|
}; |