1 /* Copyright 2019 Jack Humbert
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 2 of the License, or
6 * (at your option) any later version.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #include "process_space_cadet.h"
19 #define TAPPING_TERM 200
22 // ********** OBSOLETE DEFINES, STOP USING! (pls?) **********
23 // Shift / paren setup
31 // Shift / Enter setup
33 #define SFTENT_KEY KC_ENT
36 #ifdef DISABLE_SPACE_CADET_MODIFIER
38 #define LSPO_MOD KC_TRNS
41 #define RSPC_MOD KC_TRNS
45 #define LSPO_MOD KC_LSFT
48 #define RSPC_MOD KC_RSFT
51 // **********************************************************
53 // Shift / paren setup
55 #define LSPO_KEYS KC_LSFT, LSPO_MOD, LSPO_KEY
58 #define RSPC_KEYS KC_RSFT, RSPC_MOD, RSPC_KEY
61 // Control / paren setup
63 #define LCPO_KEYS KC_LCTL, KC_LSFT, KC_9
66 #define RCPC_KEYS KC_RCTL, KC_RSFT, KC_0
71 #define LAPO_KEYS KC_LALT, KC_LSFT, KC_9
74 #define RAPC_KEYS KC_RALT, KC_RSFT, KC_0
77 // Shift / Enter setup
79 #define SFTENT_KEYS KC_RSFT, KC_TRNS, SFTENT_KEY
82 static uint8_t sc_last = 0;
83 static uint16_t sc_timer = 0;
84 #ifdef SPACE_CADET_MODIFIER_CARRYOVER
85 static uint8_t sc_mods = 0;
88 void perform_space_cadet(keyrecord_t *record, uint8_t holdMod, uint8_t tapMod, uint8_t keycode) {
89 if (record->event.pressed) {
91 sc_timer = timer_read ();
92 #ifdef SPACE_CADET_MODIFIER_CARRYOVER
95 if (IS_MOD(holdMod)) {
96 register_mods(MOD_BIT(holdMod));
100 if (sc_last == holdMod && timer_elapsed(sc_timer) < TAPPING_TERM) {
101 if (holdMod != tapMod) {
102 if (IS_MOD(holdMod)) {
103 unregister_mods(MOD_BIT(holdMod));
105 if (IS_MOD(tapMod)) {
106 register_mods(MOD_BIT(tapMod));
109 #ifdef SPACE_CADET_MODIFIER_CARRYOVER
110 set_weak_mods(sc_mods);
113 #ifdef SPACE_CADET_MODIFIER_CARRYOVER
116 if (IS_MOD(tapMod)) {
117 unregister_mods(MOD_BIT(tapMod));
120 if (IS_MOD(holdMod)) {
121 unregister_mods(MOD_BIT(holdMod));
127 bool process_space_cadet(uint16_t keycode, keyrecord_t *record) {
130 perform_space_cadet(record, LSPO_KEYS);
134 perform_space_cadet(record, RSPC_KEYS);
138 perform_space_cadet(record, LCPO_KEYS);
142 perform_space_cadet(record, RCPC_KEYS);
146 perform_space_cadet(record, LAPO_KEYS);
150 perform_space_cadet(record, RAPC_KEYS);
154 perform_space_cadet(record, SFTENT_KEYS);
158 if (record->event.pressed) {