diff options
author | fauxpark <fauxpark@gmail.com> | 2021-06-20 12:10:59 +1000 |
---|---|---|
committer | fauxpark <fauxpark@gmail.com> | 2021-06-20 12:10:59 +1000 |
commit | e3030bff5e6b241ef8934ddaf84e524d0fd32bce (patch) | |
tree | 976aa1cc9d25c884ecedc548ce507404904414a3 /users/mnil/mnil.c | |
parent | 5b7cf9fdc86bf92b465565b2be5d501ea9529f37 (diff) | |
parent | 4dddcb4f0300f79d8fbfc462ff8d6b360e99989e (diff) |
Merge remote-tracking branch 'upstream/master' into develop
Diffstat (limited to 'users/mnil/mnil.c')
-rw-r--r-- | users/mnil/mnil.c | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/users/mnil/mnil.c b/users/mnil/mnil.c new file mode 100644 index 0000000000..11d5ee28df --- /dev/null +++ b/users/mnil/mnil.c @@ -0,0 +1,146 @@ +/* Copyright 2021 Mats Nilsson + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "mnil.h" + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case M_TILD: // ~ + if (record->event.pressed) { + tap_code16(RALT(KC_RBRC)); + tap_code(KC_SPC); + } else { + } + break; + case M_CIRC: // ^ + if (record->event.pressed) { + tap_code16(S(KC_RBRC)); + tap_code(KC_SPC); + } else { + } + break; + case M_BTCK: // ` + if (record->event.pressed) { + tap_code16(S(KC_EQL)); + tap_code(KC_SPC); + } else { + } + break; + case QWE_COL: // Swap default keymap layer + if (record->event.pressed) { + if (get_highest_layer(default_layer_state) == _COLEMAK) { + default_layer_set(1UL << _QWERTY); + } else { + default_layer_set(1UL << _COLEMAK); + } + } + break; + } + return true; +}; + +// Tap Dance +// Determine the current tap dance state +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 if (state->count == 2) { + if (state->interrupted) + return DOUBLE_SINGLE_TAP; + else if (state->pressed) + return DOUBLE_HOLD; + else + return DOUBLE_SINGLE_TAP; + } + if (state->count == 3) { + if (state->interrupted || !state->pressed) + return TRIPLE_TAP; + else + return TRIPLE_HOLD; + } else + return 8; +} + +static tap ae_tap_state = {.is_press_action = true, .state = 0}; + +void ae_finished(qk_tap_dance_state_t *state, void *user_data) { + ae_tap_state.state = cur_dance(state); + switch (ae_tap_state.state) { + case SINGLE_TAP: + register_code(KC_A); + break; + case SINGLE_HOLD: + tap_code(SE_AE); + break; + case DOUBLE_SINGLE_TAP: + tap_code(KC_A); + register_code(KC_A); + break; + } +} + +void ae_reset(qk_tap_dance_state_t *state, void *user_data) { + switch (ae_tap_state.state) { + case SINGLE_TAP: + unregister_code(KC_A); + break; + case DOUBLE_SINGLE_TAP: + unregister_code(KC_A); + break; + } + ae_tap_state.state = 0; +} + +static tap aa_tap_state = {.is_press_action = true, .state = 0}; + +void aa_finished(qk_tap_dance_state_t *state, void *user_data) { + aa_tap_state.state = cur_dance(state); + switch (aa_tap_state.state) { + case SINGLE_TAP: + register_code(SE_OSLH); + break; + case SINGLE_HOLD: + register_code(SE_AA); + unregister_code(SE_AA); + break; + case DOUBLE_SINGLE_TAP: + tap_code(SE_OSLH); + register_code(SE_OSLH); + break; + } +} + +void aa_reset(qk_tap_dance_state_t *state, void *user_data) { + switch (aa_tap_state.state) { + case SINGLE_TAP: + unregister_code(SE_OSLH); + break; + case DOUBLE_SINGLE_TAP: + unregister_code(SE_OSLH); + break; + } + aa_tap_state.state = 0; +} + +// clang-format off +qk_tap_dance_action_t tap_dance_actions[] = { + [AAE] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, ae_finished, ae_reset, 250), + [OAA] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, aa_finished, aa_reset, 250) +}; +// clang-format on |