diff options
Diffstat (limited to 'users/ollyhayes/ollyhayes.c')
-rw-r--r-- | users/ollyhayes/ollyhayes.c | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/users/ollyhayes/ollyhayes.c b/users/ollyhayes/ollyhayes.c new file mode 100644 index 0000000000..6dfd61b263 --- /dev/null +++ b/users/ollyhayes/ollyhayes.c @@ -0,0 +1,153 @@ +/* Copyright 2022 Olly Hayes (@ollyhayes) + * + * 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 "ollyhayes.h" + +#ifdef VIRTSER_ENABLE +# include "virtser.h" +#endif + +layer_state_t default_layer_state_set_kb(layer_state_t state) { + if (layer_state_cmp(state, BASE)) { + rgb_matrix_mode(3); + } else if (layer_state_cmp(state, GAMES)) { + rgb_matrix_mode(1); + } + return state; +} + +uint16_t key_presses = 0; +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + // for tab/number layer switch + static bool key_pressed_since_switch = false; + static uint16_t switch_down_time = 0; + + // for alt-tab on punc layer + static bool alt_tab_used = false; + + // for capital umlauts + static bool shift_held = false; + +#ifdef VIRTSER_ENABLE + if (record->event.pressed) { + uint8_t key_index = 40 + record->event.key.col + record->event.key.row * 6; + virtser_send(key_index); + } else { + uint8_t key_index = 90 + record->event.key.col + record->event.key.row * 6; + virtser_send(key_index); + } +#endif + + if (record->event.pressed) { + key_pressed_since_switch = true; + key_presses++; + } + + switch (keycode) { + case UP4: + if (record->event.pressed) { + tap_code(KC_UP); + tap_code(KC_UP); + tap_code(KC_UP); + tap_code(KC_UP); + return false; + } + break; + + case DOWN4: + if (record->event.pressed) { + tap_code(KC_DOWN); + tap_code(KC_DOWN); + tap_code(KC_DOWN); + tap_code(KC_DOWN); + return false; + } + break; + + case NUM_SWITCH: + if (record->event.pressed) { + layer_on(NUM); + key_pressed_since_switch = false; + switch_down_time = timer_read(); + } else { + layer_off(NUM); + + if (!key_pressed_since_switch && timer_elapsed(switch_down_time) < 200) { + tap_code(KC_TAB); + } + } + return false; + + case MO(PUNC): + if (!record->event.pressed) { + if (alt_tab_used) { + unregister_code(KC_LALT); + alt_tab_used = false; + } + } + return true; + + case MO(FUNCTIONS): + if (!record->event.pressed) { + // if NUM_SWITCH has been lifted first, toggle to that layer + // (4 = 2^NUM) + if ((layer_state & 4) != 0) { + layer_on(FUNCTIONS); + return false; + } + } + return true; + + case ALTTAB: + if (record->event.pressed) { + alt_tab_used = true; + register_code(KC_LALT); + tap_code(KC_TAB); + } + return false; + + case KC_LSFT: + case KC_RSFT: + shift_held = record->event.pressed; + break; + + case A_UMLAUT: + if (record->event.pressed) { + if (shift_held) + register_unicode(0x00c4); + else + register_unicode(0x00e4); + } + break; + case O_UMLAUT: + if (record->event.pressed) { + if (shift_held) + register_unicode(0x00d6); + else + register_unicode(0x00f6); + } + break; + case U_UMLAUT: + if (record->event.pressed) { + if (shift_held) + register_unicode(0x00dc); + else + register_unicode(0x00fc); + } + break; + } + return true; +} |