qmk-firmware/keyboards/keebio/bdn9/keymaps/eosti/keymap.c
2019-10-22 14:37:29 +01:00

162 lines
4.6 KiB
C

#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)
};