1 #include "spacebarracecar.h"
4 // These indicate if left and right shift are physically pressed
8 // Interrupt and times for space cadet shift
11 uint16_t lshift_timer = 0;
12 uint16_t rshift_timer = 0;
14 // Number of items that are saved in prev_kcs
15 uint8_t prev_indx = 0;
16 // Used to save the last 6 actual keycodes activated by frankenkeycodes
17 uint16_t prev_kcs[6] = {0, 0, 0, 0, 0, 0};
19 // If true the deadkey characters grave and circonflexe are not automatically escaped
23 Used to add a keycode to a prev_kcs to remember it.
24 When full the last code gets discarded and replaced by
27 void add_to_prev(uint16_t kc){
28 for (int i=0; i<prev_indx; i++){
29 if (kc == prev_kcs[i])
33 for (int i=5; i>0; i--){
34 prev_kcs[i] = prev_kcs[i-1];
38 prev_kcs[prev_indx] = kc;
44 Unregisters all codes saved in prev_kcs and resets prev_indx.
45 gets called on multiple occasions mainly when shift is released
46 and when frankenkeycodes are pressed. Prevents output of
47 wrong characters when really specific key combinations
48 that would never occur during normal usage are pressed.
50 void unreg_prev(void){
53 for (int i=0; i<prev_indx; i++){
54 unregister_code(prev_kcs[i]);
60 // Interrupt and times for Nav/Esc
62 uint16_t navesc_timer = 0;
64 // If true Gui keys and Space Cadet Shift get disabled
67 // Interrupts all timers
68 void timer_timeout(void){
74 timer_timeout_keymap();
78 void timer_timeout_keymap(void){
81 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
84 if(record->event.pressed) {
88 // allows keymap to execute further commands when CU_GAME is pressed, for example enabling a macro layer
89 return process_record_keymap(keycode, record) && false;
92 if (record->event.pressed)
99 if(record->event.pressed) {
101 navesc_timer = timer_read();
104 if (timer_elapsed(navesc_timer) < TAPPING_TERM && navesc) {
105 register_code(KC_ESC);
106 unregister_code(KC_ESC);
112 if(record->event.pressed) {
114 register_code(KC_P0);
115 unregister_code(KC_P0);
116 register_code(KC_P0);
117 unregister_code(KC_P0);
121 #ifdef RGBLIGHT_ENABLE
123 if(record->event.pressed) {
125 if (rgblight_get_val()+32>255)
126 rgblight_sethsv(rgblight_get_hue(), rgblight_get_sat(), 31);
128 rgblight_sethsv(rgblight_get_hue(), rgblight_get_sat(), rgblight_get_val()+32);
135 if(record->event.pressed) {
137 lshift_timer = timer_read();
138 unregister_code(KC_LSFT);
139 register_code(KC_LSFT);
142 if (timer_elapsed(lshift_timer) < TAPPING_TERM && lshiftp && !game) {
143 register_code(KC_LSFT);
145 unregister_code(KC_8);
146 unregister_code(KC_LSFT);
150 unregister_code(KC_LSFT);
155 if(record->event.pressed) {
157 rshift_timer = timer_read();
158 unregister_code(KC_LSFT);
159 register_code(KC_LSFT);
162 if (timer_elapsed(rshift_timer) < TAPPING_TERM && rshiftp && !game) {
163 register_code(KC_LSFT);
165 unregister_code(KC_9);
166 unregister_code(KC_LSFT);
170 unregister_code(KC_LSFT);
175 if(record->event.pressed) {
187 if(record->event.pressed) {
189 unregister_code(KC_LSFT);
190 register_code(DE_SS);
191 unregister_code(DE_SS);
192 if (lshift || rshift)
193 register_code(KC_LSFT);
198 if(record->event.pressed) {
200 register_code(KC_LSFT);
202 unregister_code(KC_2);
203 if (!lshift && !rshift)
204 unregister_code(KC_LSFT);
209 if(record->event.pressed) {
215 if(record->event.pressed) {
217 if (lshift || rshift){
218 unregister_code(KC_LSFT);
219 register_code(KC_ALGR);
220 unregister_code(DE_PLUS);
221 register_code(DE_PLUS);
222 unregister_code(DE_PLUS);
223 unregister_code(KC_ALGR);
224 register_code(KC_LSFT);
226 register_code(KC_LSFT);
227 unregister_code(DE_ACUT);
228 register_code(DE_ACUT);
229 unregister_code(DE_ACUT);
230 unregister_code(KC_LSFT);
232 register_code(KC_SPC);
233 unregister_code(KC_SPC);
239 if(record->event.pressed) {
241 unregister_code(KC_LSFT);
242 unregister_code(DE_CIRC);
243 register_code(DE_CIRC);
244 unregister_code(DE_CIRC);
246 register_code(KC_SPC);
247 unregister_code(KC_SPC);
249 if (lshift || rshift)
250 register_code(KC_LSFT);
254 if(record->event.pressed){
256 register_code(KC_LSFT);
257 if (lshift || rshift){
260 unregister_code(DE_HASH);
261 register_code(DE_HASH);
262 add_to_prev(DE_HASH);
265 unregister_code(DE_HASH);
267 if (lshift || rshift)
268 register_code(KC_LSFT);
270 unregister_code(KC_LSFT);
274 if(record->event.pressed){
276 unregister_code(KC_LSFT);
277 if (lshift || rshift){
278 unregister_code(DE_CIRC);
279 register_code(DE_CIRC);
280 unregister_code(DE_CIRC);
282 register_code(KC_SPC);
283 unregister_code(KC_SPC);
285 register_code(KC_LSFT);
290 unregister_code(DE_6);
294 SHIFT_NO(DE_COMM, DE_LESS)
296 SHIFT_NORM(DE_DOT, DE_LESS)
298 SHIFT_ALL(DE_7, DE_SS)
300 SHIFT_ALL(DE_COMM, DE_DOT)
302 SHIFT_NO(DE_3, DE_HASH)
304 SHIFT_NORM(DE_7, DE_6)
306 SHIFT_NORM(DE_8, DE_PLUS)
308 SHIFT_NORM(DE_9, DE_8)
310 SHIFT_NORM(DE_0, DE_9)
312 SHIFT_SWITCH(DE_0, DE_PLUS)
314 SHIFT_ALGR(DE_8, DE_7)
316 SHIFT_ALGR(DE_9, DE_0)
318 SHIFT_ALGR(DE_SS, DE_LESS)
325 if(!record->event.pressed) {
327 unregister_code(KC_Z);
328 unregister_code(KC_Y);
334 if(record->event.pressed) {
338 if (lshift || rshift)
339 register_code(KC_LSFT);
341 unregister_code(KC_LSFT);
345 return process_record_keymap(keycode, record);
349 __attribute__((weak))
350 bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {