2 * algernon's ErgoDox EZ layout, please see the readme.md file!
5 #include "ergodox_ez.h"
8 #include "action_layer.h"
9 #include "action_util.h"
12 #include "keymap_plover.h"
33 // Buttons that do extra stuff
39 // Function / number keys
52 // Application select keys
59 // Diagonal mouse movement
65 // Hungarian layer keys
76 // One-handed layout specials
103 /* States & timers */
105 uint16_t gui_timer = 0;
107 uint16_t kf_timers[12];
109 uint16_t oh_base_timer = 0;
110 uint16_t oh_bsspc_timer = 0;
111 uint16_t oh_entsft_timer = 0;
113 #define OH_BLINK_INTERVAL 500
115 uint8_t oh_left_blink = 0;
116 uint16_t oh_left_blink_timer = 0;
117 uint8_t oh_right_blink = 0;
118 uint16_t oh_right_blink_timer = 0;
121 bool log_enable = false;
124 bool time_travel = false;
128 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
130 /* Keymap 0: Base Layer
132 * ,-----------------------------------------------------. ,-----------------------------------------------------.
133 * | `~ | 1 F1 | 2 F2 | 3 F3 | 4 F4 | 5 F5 | Plvr | | Apps | 6 F6 | 7 F7 | 8 F8 | 9 F9 | 0 F10| F11 |
134 * |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------|
135 * | Next/Prev | ' | , | . | P | Y | [ | | ] | F | G | C | R | L | \ |
136 * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
137 * | Tab/ARROW | A | O | E | U | I |------| |------| D | H | T | N | S | = / Arrow |
138 * |-----------+------+------+------+------+------| ( | | ) |------+------+------+------+------+-----------|
139 * | Play/Pause| / | Q | J | K | X | | | | B | M | W | V | Z | Stop |
140 * `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------'
141 * | | | | | : | | - | | | | |
142 * `-----------------------------------' `-----------------------------------'
143 * ,-------------. ,-------------.
144 * | LAlt | GUI | | MDIA | 1HND |
145 * ,------|------|------| |------+------+------.
146 * | | | Ctrl | | LEAD | | |
147 * |Backsp|LShift|------| |------| Enter| Space|
148 * | | | ESC | | HUN | | |
149 * `--------------------' `--------------------'
153 KC_GRV ,M(KF_1) ,M(KF_2) ,M(KF_3),M(KF_4),M(KF_5),M(A_PLVR)
154 ,M(A_MPN) ,KC_QUOT ,KC_COMM ,KC_DOT ,KC_P ,KC_Y ,KC_LBRC
155 ,TD(CT_TA) ,KC_A ,KC_O ,KC_E ,KC_U ,KC_I
156 ,KC_MPLY ,KC_SLSH ,KC_Q ,KC_J ,KC_K ,KC_X ,KC_LPRN
157 ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,TD(CT_CLN)
161 ,KC_BSPC,F(F_SFT),M(A_ESC)
164 ,KC_APP ,M(KF_6),M(KF_7) ,M(KF_8),M(KF_9) ,M(KF_10) ,KC_F11
165 ,KC_RBRC ,KC_F ,KC_G ,KC_C ,KC_R ,KC_L ,KC_BSLS
166 ,KC_D ,KC_H ,KC_T ,KC_N ,KC_S ,KC_EQL
167 ,KC_RPRN ,KC_B ,KC_M ,KC_W ,KC_V ,KC_Z ,KC_MSTP
168 ,TD(CT_MNS),KC_NO ,KC_NO ,KC_NO ,KC_NO
170 ,OSL(NMDIA),M(OH_LEFT)
172 ,F(F_HUN) ,KC_ENT ,KC_SPC
175 /* Keymap 1: Adore layer
177 * ,-----------------------------------------------------. ,-----------------------------------------------------.
178 * | `~ | 1 F1 | 2 F2 | 3 F3 | 4 F4 | 5 F5 | Plvr | | Apps | 6 F6 | 7 F7 | 8 F8 | 9 F9 | 0 F10| F11 |
179 * |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------|
180 * | Next/Prev | , | . | L | W | M | [ | | ] | F | H | C | P | Y | \ |
181 * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
182 * | Tab/Arrow | A | O | E | I | U |------| |------| D | R | T | N | S | = / Arrow |
183 * |-----------+------+------+------+------+------| ( | | ) |------+------+------+------+------+-----------|
184 * | Play/Pause| / | Z | ' | K | X | | | | B | G | V | J | Q | Stop |
185 * `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------'
186 * | | | | | : | | - | | | | |
187 * `-----------------------------------' `-----------------------------------'
188 * ,-------------. ,-------------.
189 * | LAlt | GUI | | MDIA | 1HND |
190 * ,------|------|------| |------+------+------.
191 * | | | Ctrl | | LEAD | | |
192 * |Backsp|LShift|------| |------| Enter| Space|
193 * | | | ESC | | HUN | | |
194 * `--------------------' `--------------------'
198 KC_GRV ,M(KF_1) ,M(KF_2) ,M(KF_3),M(KF_4),M(KF_5),M(A_PLVR)
199 ,M(A_MPN) ,KC_COMM ,KC_DOT ,KC_L ,KC_W ,KC_M ,KC_LBRC
200 ,TD(CT_TA) ,KC_A ,KC_O ,KC_E ,KC_I ,KC_U
201 ,KC_MPLY ,KC_SLSH ,KC_Z ,KC_QUOT,KC_K ,KC_X ,KC_LPRN
202 ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,TD(CT_CLN)
206 ,KC_BSPC,F(F_SFT),M(A_ESC)
209 ,KC_APP ,M(KF_6),M(KF_7) ,M(KF_8),M(KF_9) ,M(KF_10) ,KC_F11
210 ,KC_RBRC ,KC_F ,KC_H ,KC_C ,KC_P ,KC_Y ,KC_BSLS
211 ,KC_D ,KC_R ,KC_T ,KC_N ,KC_S ,KC_EQL
212 ,KC_RPRN ,KC_B ,KC_G ,KC_V ,KC_J ,KC_Q ,KC_MSTP
213 ,TD(CT_MNS),KC_NO ,KC_NO ,KC_NO ,KC_NO
215 ,OSL(NMDIA),M(OH_LEFT)
217 ,F(F_HUN) ,KC_ENT ,KC_SPC
220 /* Keymap 2: Arrow layer
222 * ,-----------------------------------------------------. ,-----------------------------------------------------.
223 * | | | | | | | | | | | | | | | |
224 * |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------|
225 * | | | | | | | | | | | Home | Up | End | | |
226 * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
227 * | | | | | | |------| |------| | Left | Down | Rght | | |
228 * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
229 * | | | | | | | | | | | | | | | |
230 * `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------'
231 * | | | | | | | | | | | |
232 * `----------------------------------' `----------------------------------'
233 * ,-------------. ,-------------.
235 * ,------|------|------| |------+------+------.
237 * | | |------| |------| PgUp | PgDn |
239 * `--------------------' `--------------------'
244 KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
245 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
246 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
247 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
248 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
252 ,KC_TRNS ,KC_TRNS ,KC_TRNS
255 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
256 ,KC_TRNS ,KC_TRNS ,KC_HOME ,KC_UP ,KC_END ,KC_TRNS ,KC_TRNS
257 ,KC_TRNS ,KC_LEFT ,KC_DOWN ,KC_RGHT ,KC_TRNS ,KC_TRNS
258 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
259 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
263 ,KC_TRNS ,KC_PGUP ,KC_PGDN
266 /* Keymap 3: Application select layer
268 * ,-----------------------------------------------------. ,-----------------------------------------------------.
269 * | |Music |Slack |Emacs |Term |Chrome| | | | | | | | | |
270 * |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------|
271 * | | | | | | | | | | | | | | | |
272 * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
273 * | | | | | | |------| |------| | | | | | |
274 * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
275 * | | | | | | | | | | | | | | | |
276 * `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------'
277 * | | | | | | | | | | | |
278 * `----------------------------------' `----------------------------------'
279 * ,-------------. ,-------------.
281 * ,------|------|------| |------+------+------.
283 * | | |------| |------| | |
285 * `--------------------' `--------------------'
290 KC_TRNS ,M(APP_MSIC),M(APP_SLK),M(APP_EMCS),M(APP_TERM),M(APP_CHRM),KC_TRNS
291 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
292 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
293 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
294 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
298 ,KC_TRNS ,KC_TRNS ,KC_TRNS
301 ,KC_TRNS ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_TRNS
302 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
303 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
304 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
305 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
309 ,KC_TRNS ,KC_TRNS ,KC_TRNS
313 /* Keymap 4: Hungarian Layer
315 * ,-----------------------------------------------------. ,-----------------------------------------------------.
316 * | | | | | | | | | | | | | | | |
317 * |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------|
318 * | | | Ő | | Ű | | | | | | | | | | |
319 * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
320 * | | Á | Ó | É | Ú | Í |------| |------| | | | | | |
321 * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
322 * | | | Ö | | Ü | | | | | | | | | | |
323 * `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------'
324 * | | | | | | | | | | | |
325 * `----------------------------------' `----------------------------------'
326 * ,-------------. ,-------------.
328 * ,------|------|------| |------+------+------.
330 * | | |------| |------| | |
331 * | | | | | BASE | | |
332 * `--------------------' `--------------------'
337 KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
338 ,KC_NO ,KC_NO ,M(HU_OEE),KC_NO ,M(HU_UEE),KC_NO ,KC_NO
339 ,KC_NO ,M(HU_AA),M(HU_OO) ,M(HU_EE),M(HU_UU) ,M(HU_II)
340 ,KC_NO ,KC_NO ,M(HU_OE) ,KC_NO ,M(HU_UE) ,KC_NO ,KC_NO
341 ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
345 ,KC_NO ,KC_TRNS ,KC_TRNS
348 ,KC_TRNS ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
349 ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
350 ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
351 ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
352 ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
356 ,F(F_BSE),KC_TRNS ,KC_TRNS
359 /* Keymap 5: Navigation & Media layer
361 * ,-----------------------------------------------------. ,-----------------------------------------------------.
362 * | MS Slow | | | | | |ScrLCK| |ScrLCK| | | | | | |
363 * |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------|
364 * | MS Normal | | Home | Up | PgUp | | | |Scroll| |MsUpL | MsUp |MsUpR | |PrintScreen|
365 * |-----------+------+------+------+------+------| | | Up |------+------+------+------+------+-----------|
366 * | MS Fast | | Left | Down | Right| |------| |------| |MsLeft| MsDn |MsRght| | |
367 * |-----------+------+------+------+------+------| | |Scroll|------+------+------+------+------+-----------|
368 * | Play/Pause| | End | Down | PgDn | | | | Down | |MsDnL | MsDn |MsDnR | | Stop |
369 * `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------'
370 * | | | | | | | | | | | |
371 * `----------------------------------' `----------------------------------'
372 * ,-------------. ,-------------.
373 * | Mute | VlUp | | BASE | MClk |
374 * ,------|------|------| |------+------+------.
375 * | | | VlDn | | Prev |Left |Right |
376 * | SPC | Enter|------| |------| Click| Click|
377 * | | | ESC | | Next | | |
378 * `--------------------' `--------------------'
382 KC_ACL0 ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,LGUI(KC_L)
383 ,KC_ACL1 ,KC_NO ,KC_HOME ,KC_UP ,KC_PGUP ,KC_NO ,KC_NO
384 ,KC_ACL2 ,KC_NO ,KC_LEFT ,KC_DOWN ,KC_RIGHT,KC_NO
385 ,KC_MPLY ,KC_NO ,KC_END ,KC_DOWN ,KC_PGDN ,KC_NO ,KC_NO
386 ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
389 ,KC_SPC,KC_ENTER,M(A_ESC)
392 ,LGUI(KC_L),KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
393 ,KC_WH_U ,KC_NO ,M(A_MUL),KC_MS_U ,M(A_MUR),KC_NO ,KC_PSCR
394 ,KC_NO ,KC_MS_L ,KC_MS_D ,KC_MS_R ,KC_NO ,KC_NO
395 ,KC_WH_D ,KC_NO ,M(A_MDL),KC_MS_D ,M(A_MDR),KC_NO ,KC_MSTP
396 ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
400 ,KC_MNXT ,KC_BTN1 ,KC_BTN2
403 /* Keymap 6: One-handed, left side
405 * ,-----------------------------------------------------.
406 * | `~ | 1 F1 | 2 F2 | 3 F3 | 4 F4 | 5 F5 |A BSE|
407 * |-----------+------+------+------+------+-------------|
408 * | Tab | ' | , | . | P | Y | [ |
409 * |-----------+------+------+------+------+------| |
410 * | - | A | O | E | U | I |------|
411 * |-----------+------+------+------+------+------| ( |
412 * | Play/Pause| ; | Q | J | K | X | |
413 * `-----------+------+------+------+------+-------------'
414 * | Home | End | Down | Up | ESC |
415 * `-----------------------------------'
418 * ,------|------|------|
419 * |BackSp|LShift| Ctrl |
421 * |Space |Enter |OTHER |
422 * `--------------------'
426 KC_GRV ,M(KF_1) ,M(KF_2) ,M(KF_3) ,M(KF_4) ,M(KF_5) ,M(OH_BASE)
427 ,KC_TAB ,KC_QUOT ,KC_COMM ,KC_DOT ,KC_P ,KC_Y ,KC_LBRC
428 ,KC_MINS ,KC_A ,KC_O ,KC_E ,KC_U ,KC_I
429 ,KC_MPLY ,KC_SCLN ,KC_Q ,KC_J ,KC_K ,KC_X ,KC_LPRN
430 ,KC_HOME ,KC_END ,KC_DOWN ,KC_UP ,M(A_ESC)
434 ,M(OH_BSSPC),M(OH_ENTSFT),M(OH_RIGHT)
437 ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
438 ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
439 ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
440 ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
441 ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
448 /* Keymap 7: One-handed, right side
450 * ,-----------------------------------------------------.
451 * | = F11 | 0 F10| 9 F9 | 8 F8 | 7 F7 | 6 F6 |A BSE|
452 * |-----------+------+------+------+------+-------------|
453 * | / | L | R | C | G | F | ] |
454 * |-----------+------+------+------+------+------| |
455 * | \ | S | N | T | H | D |------|
456 * |-----------+------+------+------+------+------| ) |
457 * | Stop | Z | V | W | M | B | |
458 * `-----------+------+------+------+------+-------------'
459 * | PgDn | PgUp | Right| Left | ESC |
460 * `-----------------------------------'
463 * ,------|------|------|
464 * |BackSp|LShift| Ctrl |
466 * |Space |Enter |OTHER |
467 * `--------------------'
471 M(KF_11) ,M(KF_10) ,M(KF_9) ,M(KF_8) ,M(KF_7) ,M(KF_6) ,M(OH_BASE)
472 ,KC_SLSH ,KC_L ,KC_R ,KC_C ,KC_G ,KC_F ,KC_RBRC
473 ,KC_BSLS ,KC_S ,KC_N ,KC_T ,KC_H ,KC_D
474 ,KC_MSTP ,KC_Z ,KC_V ,KC_W ,KC_M ,KC_B ,KC_RPRN
475 ,KC_PGDN ,KC_PGUP ,KC_RGHT ,KC_LEFT ,M(A_ESC)
479 ,M(OH_BSSPC),M(OH_ENTSFT),M(OH_LEFT)
482 ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
483 ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
484 ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
485 ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
486 ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
493 /* Keymap 8: Steno for Plover
495 * ,--------------------------------------------------. ,--------------------------------------------------.
496 * | | | | | | | BASE | | | | | | | | |
497 * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
498 * | | # | # | # | # | # | # | | # | # | # | # | # | # | # |
499 * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
500 * | | | T | P | H | |------| |------| | F | P | L | T | D |
501 * |--------+ S +------+------+------+ * | * | | * | * +------+------+------+------+--------|
502 * | | | K | W | R | | | | | | R | B | G | S | Z |
503 * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
504 * | | | | | | | | | | | |
505 * `----------------------------------' `----------------------------------'
506 * ,-------------. ,-------------.
508 * ,------|------|------| |------+------+------.
510 * | A | O |------| |------| E | U |
512 * `--------------------' `--------------------'
517 KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, M(A_PLVR),
518 KC_NO, PV_NUM, PV_NUM, PV_NUM, PV_NUM, PV_NUM, PV_NUM,
519 KC_NO, PV_LS, PV_LT, PV_LP, PV_LH, PV_STAR,
520 KC_NO, PV_LS, PV_LK, PV_LW, PV_LR, PV_STAR, PV_STAR,
521 KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
527 KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
528 PV_NUM, PV_NUM, PV_NUM, PV_NUM, PV_NUM, PV_NUM, PV_NUM,
529 PV_STAR, PV_RF, PV_RP, PV_RL, PV_RT, PV_RD,
530 PV_STAR, PV_STAR, PV_RR, PV_RB, PV_RG, PV_RS, PV_RZ,
531 KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
539 const uint16_t PROGMEM fn_actions[] = {
540 [F_BSE] = ACTION_LAYER_CLEAR(ON_PRESS)
541 ,[F_HUN] = ACTION_LAYER_INVERT(HUN, ON_PRESS)
542 ,[F_GUI] = ACTION_MACRO_TAP(A_GUI)
543 ,[F_SFT] = ACTION_MODS_ONESHOT (MOD_LSFT)
544 ,[F_ALT] = ACTION_MODS_ONESHOT (MOD_LALT)
545 ,[F_CTRL] = ACTION_MODS_ONESHOT (MOD_LCTL)
548 void toggle_steno(int pressed)
550 uint8_t layer = biton32(layer_state);
553 if (layer != PLVR) layer_on(PLVR); else layer_off(PLVR);
555 register_code(PV_LP);
556 register_code(PV_LH);
557 register_code(PV_LR);
559 register_code(PV_RL);
560 register_code(PV_RG);
562 unregister_code(PV_LP);
563 unregister_code(PV_LH);
564 unregister_code(PV_LR);
565 unregister_code(PV_O);
566 unregister_code(PV_RL);
567 unregister_code(PV_RG);
571 macro_t *ang_do_hun (keyrecord_t *record, uint16_t accent, uint16_t hun_char)
573 uint8_t need_shift = 0;
574 uint8_t hold_shift = 0;
576 if (!record->event.pressed)
581 if (keyboard_report->mods & MOD_BIT (KC_LSFT)) {
584 unregister_code (KC_LSFT);
586 if ((get_oneshot_mods () & MOD_BIT(KC_LSFT)) && !has_oneshot_mods_timed_out ()) {
589 unregister_code (KC_LSFT);
592 clear_oneshot_mods ();
594 register_code (KC_RALT);
595 unregister_code (KC_RALT);
596 if (accent == (KC_DQT)) {
597 register_code (KC_RSFT);
599 register_code (accent);
600 unregister_code (accent);
601 if (need_shift && accent != (KC_DQT)) {
602 register_code (KC_RSFT);
603 } else if (accent == (KC_DQT) && !need_shift) {
604 unregister_code (KC_RSFT);
606 register_code (hun_char);
607 unregister_code (hun_char);
608 if (need_shift || accent == (KC_DQT))
609 unregister_code (KC_RSFT);
611 register_code (KC_LSFT);
616 void ang_handle_kf (keyrecord_t *record, uint8_t id)
618 uint8_t code = id - KF_1;
620 if (record->event.pressed) {
621 kf_timers[code] = timer_read ();
625 if (timer_elapsed (kf_timers[code]) > TAPPING_TERM) {
636 unregister_code (kc);
640 const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
644 if (record->event.pressed) {
645 if ((get_oneshot_mods ()) && !has_oneshot_mods_timed_out ()) {
646 clear_oneshot_mods ();
648 register_code (KC_ESC);
652 unregister_code (KC_ESC);
657 if (record->event.pressed) {
658 if (keyboard_report->mods & MOD_BIT(KC_LSFT) ||
659 ((get_oneshot_mods() & MOD_BIT(KC_LSFT)) && !has_oneshot_mods_timed_out())) {
660 int oneshot = ((get_oneshot_mods() & MOD_BIT(KC_LSFT)) && !has_oneshot_mods_timed_out());
663 clear_oneshot_mods ();
664 unregister_code (KC_LSFT);
666 register_code (KC_MPRV);
667 unregister_code (KC_MPRV);
670 register_code (KC_LSFT);
672 return MACRO (T(MNXT), END);
677 /* Hungarian layer */
679 return ang_do_hun (record, KC_QUOT, KC_A);
681 return ang_do_hun (record, KC_QUOT, KC_O);
683 return ang_do_hun (record, KC_QUOT, KC_E);
685 return ang_do_hun (record, KC_QUOT, KC_U);
687 return ang_do_hun (record, KC_QUOT, KC_I);
689 return ang_do_hun (record, KC_DQT, KC_O);
691 return ang_do_hun (record, KC_DQT, KC_U);
693 return ang_do_hun (record, KC_EQL, KC_O);
695 return ang_do_hun (record, KC_EQL, KC_U);
699 if (record->event.pressed) {
700 mousekey_on(KC_MS_UP);
701 mousekey_on(KC_MS_LEFT);
703 mousekey_off(KC_MS_UP);
704 mousekey_off(KC_MS_LEFT);
710 if (record->event.pressed) {
711 mousekey_on(KC_MS_UP);
712 mousekey_on(KC_MS_RIGHT);
714 mousekey_off(KC_MS_UP);
715 mousekey_off(KC_MS_RIGHT);
721 if (record->event.pressed) {
722 mousekey_on(KC_MS_DOWN);
723 mousekey_on(KC_MS_LEFT);
725 mousekey_off(KC_MS_DOWN);
726 mousekey_off(KC_MS_LEFT);
732 if (record->event.pressed) {
733 mousekey_on(KC_MS_DOWN);
734 mousekey_on(KC_MS_RIGHT);
736 mousekey_off(KC_MS_DOWN);
737 mousekey_off(KC_MS_RIGHT);
744 toggle_steno(record->event.pressed);
749 if (record->event.pressed) {
750 register_code (KC_LGUI);
751 if (record->tap.count && !record->tap.interrupted) {
752 if (record->tap.count >= 2) {
753 register_code (KC_W);
755 set_oneshot_layer (APPSEL, ONESHOT_START);
758 record->tap.count = 0;
762 if (record->tap.count >= 2)
764 unregister_code (KC_W);
765 clear_oneshot_layer_state (ONESHOT_PRESSED);
767 gui_timer = timer_read ();
772 return MACRODOWN(T(S), T(L), T(A), T(C), T(K), T(ENT), END);
775 return MACRODOWN(T(E), T(M), T(A), T(C), T(S), T(ENT), END);
778 return MACRODOWN(T(T), T(E), T(R), T(M), T(ENT), END);
781 return MACRODOWN(T(C), T(H), T(R), T(O), T(M), T(ENT), END);
784 return MACRODOWN(T(R), T(H), T(Y), T(T), T(H), T(M), T(B), T(O), T(X), T(ENT), END);
788 ang_handle_kf (record, id);
793 if (record->event.pressed) {
794 oh_base_timer = timer_read ();
796 if (timer_elapsed (oh_base_timer) > TAPPING_TERM) {
799 return MACRO (T(APP), END);
805 if (record->event.pressed) {
806 oh_bsspc_timer = timer_read ();
808 if (timer_elapsed (oh_bsspc_timer) > TAPPING_TERM) {
809 return MACRO (T(BSPC), END);
811 return MACRO (T(SPC), END);
817 if (record->event.pressed) {
818 oh_entsft_timer = timer_read ();
820 if (timer_elapsed (oh_entsft_timer) > TAPPING_TERM) {
821 if (keyboard_report->mods & MOD_BIT(KC_LSFT))
822 unregister_code (KC_LSFT);
824 register_code (KC_LSFT);
826 return MACRO (T(ENT), END);
832 if (record->event.pressed) {
835 oh_left_blink_timer = timer_read ();
836 ergodox_right_led_1_on ();
841 if (record->event.pressed) {
844 oh_right_blink_timer = timer_read ();
845 ergodox_right_led_3_on ();
852 uint8_t is_adore = 0;
854 // Runs just one time when the keyboard initializes.
855 void matrix_init_user(void) {
858 ergodox_led_all_on();
859 for (int i = LED_BRIGHTNESS_HI; i > LED_BRIGHTNESS_LO; i--) {
860 ergodox_led_all_set (i);
864 for (int i = LED_BRIGHTNESS_LO; i > 0; i--) {
865 ergodox_led_all_set (i);
868 ergodox_led_all_off();
870 if (!eeconfig_is_enabled())
872 dl = eeconfig_read_default_layer ();
873 if (dl == (1UL << ADORE))
879 void ang_do_unicode (void) {
880 register_code (KC_RCTL);
881 register_code (KC_RSFT);
882 register_code (KC_U);
883 unregister_code (KC_U);
884 unregister_code (KC_RSFT);
885 unregister_code (KC_RCTL);
889 void ang_tap (uint16_t codes[]) {
890 for (int i = 0; codes[i] != 0; i++) {
891 register_code (codes[i]);
892 unregister_code (codes[i]);
897 #define TAP_ONCE(code) \
898 register_code (code); \
899 unregister_code (code)
901 void ang_tap_dance_cln_finished (qk_tap_dance_state_t *state, void *user_data) {
902 if (state->count == 1) {
903 register_code (KC_RSFT);
904 register_code (KC_SCLN);
905 } else if (state->count == 2) {
906 register_code (KC_SCLN);
910 void ang_tap_dance_cln_reset (qk_tap_dance_state_t *state, void *user_data) {
911 if (state->count == 1) {
912 unregister_code (KC_SCLN);
913 unregister_code (KC_RSFT);
914 } else if (state->count == 2) {
915 unregister_code (KC_SCLN);
919 void ang_tap_dance_mns_finished (qk_tap_dance_state_t *state, void *user_data) {
920 if (state->count == 1) {
921 register_code (KC_MINS);
922 } else if (state->count == 2) {
923 register_code (KC_RSFT);
924 register_code (KC_MINS);
928 void ang_tap_dance_mns_reset (qk_tap_dance_state_t *state, void *user_data) {
929 if (state->count == 1) {
930 unregister_code (KC_MINS);
931 } else if (state->count == 2) {
932 unregister_code (KC_RSFT);
933 unregister_code (KC_MINS);
943 void ang_tap_dance_ta_finished (qk_tap_dance_state_t *state, void *user_data) {
944 td_ta_state_t *td_ta = (td_ta_state_t *) user_data;
946 if (td_ta->finished_once) {
951 td_ta->sticky = false;
952 td_ta->layer_toggle = false;
957 td_ta->finished_once = true;
958 if (state->count == 1 && !state->pressed) {
959 register_code (KC_TAB);
960 td_ta->sticky = false;
961 td_ta->layer_toggle = false;
963 td_ta->layer_toggle = true;
965 td_ta->sticky = (state->count == 2);
969 void ang_tap_dance_ta_reset (qk_tap_dance_state_t *state, void *user_data) {
970 td_ta_state_t *td_ta = (td_ta_state_t *) user_data;
972 if (!td_ta->layer_toggle)
973 unregister_code (KC_TAB);
977 td_ta->finished_once = false;
980 const qk_tap_dance_action_t tap_dance_actions[] = {
981 [CT_CLN] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, ang_tap_dance_cln_finished, ang_tap_dance_cln_reset)
982 ,[CT_MNS] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, ang_tap_dance_mns_finished, ang_tap_dance_mns_reset)
984 .fn = { NULL, ang_tap_dance_ta_finished, ang_tap_dance_ta_reset },
985 .user_data = (void *)&((td_ta_state_t) { false, false, false })
989 // Runs constantly in the background, in a loop.
990 void matrix_scan_user(void) {
991 uint8_t layer = biton32(layer_state);
993 if (gui_timer && timer_elapsed (gui_timer) > TAPPING_TERM)
994 unregister_code (KC_LGUI);
1002 ergodox_right_led_2_on();
1003 ergodox_right_led_3_on();
1004 } else if (layer == NMDIA) {
1005 ergodox_right_led_1_on();
1006 ergodox_right_led_2_on();
1007 } else if (layer == PLVR) {
1008 ergodox_right_led_1_on ();
1009 ergodox_right_led_2_on ();
1010 ergodox_right_led_3_on ();
1011 } else if (layer == ADORE) {
1012 ergodox_right_led_1_on ();
1013 ergodox_right_led_2_on ();
1014 ergodox_right_led_3_on ();
1016 ergodox_right_led_2_set (LED_BRIGHTNESS_HI);
1019 if (layer == OHLFT || layer == OHRGT) {
1020 ergodox_right_led_2_on();
1022 if (oh_left_blink) {
1023 if (timer_elapsed (oh_left_blink_timer) > OH_BLINK_INTERVAL) {
1024 if ((keyboard_report->mods & MOD_BIT(KC_LSFT)) == 0)
1025 ergodox_right_led_1_off ();
1027 if (timer_elapsed (oh_left_blink_timer) > OH_BLINK_INTERVAL * 2) {
1028 ergodox_right_led_1_on ();
1029 oh_left_blink_timer = timer_read ();
1033 if (oh_right_blink) {
1034 if (timer_elapsed (oh_right_blink_timer) > OH_BLINK_INTERVAL) {
1035 if ((keyboard_report->mods & MOD_BIT(KC_LCTRL)) == 0)
1036 ergodox_right_led_3_off ();
1038 if (timer_elapsed (oh_right_blink_timer) > OH_BLINK_INTERVAL * 2) {
1039 ergodox_right_led_3_on ();
1040 oh_right_blink_timer = timer_read ();
1045 if (keyboard_report->mods & MOD_BIT(KC_LSFT) ||
1046 ((get_oneshot_mods() & MOD_BIT(KC_LSFT)) && !has_oneshot_mods_timed_out())) {
1047 ergodox_right_led_1_set (LED_BRIGHTNESS_HI);
1048 ergodox_right_led_1_on ();
1050 ergodox_right_led_1_set (LED_BRIGHTNESS_LO);
1051 if (layer != OHLFT && layer != NMDIA && layer != PLVR && layer != ADORE)
1052 ergodox_right_led_1_off ();
1055 if (keyboard_report->mods & MOD_BIT(KC_LALT) ||
1056 ((get_oneshot_mods() & MOD_BIT(KC_LALT)) && !has_oneshot_mods_timed_out())) {
1057 ergodox_right_led_2_set (LED_BRIGHTNESS_HI);
1058 ergodox_right_led_2_on ();
1060 ergodox_right_led_2_set (LED_BRIGHTNESS_LO);
1061 if (layer != OHRGT && layer != HUN && layer != OHLFT && layer != NMDIA && layer != PLVR && layer != ADORE)
1062 ergodox_right_led_2_off ();
1065 if (keyboard_report->mods & MOD_BIT(KC_LCTRL) ||
1066 ((get_oneshot_mods() & MOD_BIT(KC_LCTRL)) && !has_oneshot_mods_timed_out())) {
1067 ergodox_right_led_3_set (LED_BRIGHTNESS_HI);
1068 ergodox_right_led_3_on ();
1070 ergodox_right_led_3_set (LED_BRIGHTNESS_LO);
1071 if (layer != OHRGT && layer != HUN && layer != PLVR && layer != ADORE)
1072 ergodox_right_led_3_off ();
1075 LEADER_DICTIONARY() {
1079 #if KEYLOGGER_ENABLE
1080 SEQ_ONE_KEY (KC_D) {
1081 ergodox_led_all_on();
1083 ergodox_led_all_off();
1084 log_enable = !log_enable;
1088 SEQ_ONE_KEY (KC_T) {
1089 time_travel = !time_travel;
1092 SEQ_ONE_KEY (KC_U) {
1096 SEQ_ONE_KEY (KC_V) {
1097 SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ (" QMK_VERSION "/" KEYMAP_VERSION ")");
1100 SEQ_ONE_KEY (KC_L) {
1104 uint16_t codes[] = {KC_0, KC_3, KC_B, KC_B, KC_ENT, 0};
1108 SEQ_ONE_KEY (KC_Y) {
1109 uint16_t codes[] = {KC_BSLS, KC_O, KC_SLSH, 0};
1113 SEQ_ONE_KEY (KC_S) {
1114 ang_do_unicode (); TAP_ONCE (KC_A); TAP_ONCE (KC_F); TAP_ONCE (KC_SPC);
1116 register_code (KC_RSFT); TAP_ONCE (KC_MINS); TAP_ONCE (KC_9); unregister_code (KC_RSFT);
1117 ang_do_unicode (); TAP_ONCE (KC_3); TAP_ONCE (KC_0); TAP_ONCE (KC_C); TAP_ONCE (KC_4); TAP_ONCE (KC_SPC);
1118 register_code (KC_RSFT); TAP_ONCE (KC_0); TAP_ONCE (KC_MINS); unregister_code (KC_RSFT);
1120 ang_do_unicode (); TAP_ONCE (KC_A); TAP_ONCE (KC_F); TAP_ONCE (KC_SPC);
1123 SEQ_TWO_KEYS (KC_W, KC_M) {
1124 register_code (KC_LALT);
1125 register_code (KC_F2);
1126 unregister_code (KC_F2);
1127 unregister_code (KC_LALT);
1131 uint16_t codes[] = {KC_M, KC_A, KC_X, KC_MINS, KC_F, KC_O, KC_C, KC_U, KC_S, KC_E, KC_D, KC_ENT, 0};
1133 register_code (KC_LGUI);
1134 register_code (KC_UP);
1135 unregister_code (KC_UP);
1136 unregister_code (KC_LGUI);
1139 SEQ_ONE_KEY (KC_A) {
1140 if (is_adore == 0) {
1141 default_layer_and (0);
1142 default_layer_or ((1UL << ADORE));
1143 eeconfig_update_default_layer ((1UL << ADORE));
1146 ergodox_led_all_off ();
1147 ergodox_right_led_3_on ();
1149 ergodox_right_led_2_on ();
1151 ergodox_right_led_3_off ();
1152 ergodox_right_led_1_on ();
1154 ergodox_right_led_2_off ();
1156 ergodox_right_led_1_off ();
1159 default_layer_and (0);
1160 default_layer_or (1UL << BASE);
1161 eeconfig_update_default_layer ((1UL << BASE));
1163 ergodox_led_all_off ();
1164 ergodox_right_led_1_on ();
1166 ergodox_right_led_2_on ();
1168 ergodox_right_led_1_off ();
1169 ergodox_right_led_3_on ();
1171 ergodox_right_led_2_off ();
1173 ergodox_right_led_3_off ();
1179 static uint16_t last4[4];
1181 bool process_record_user (uint16_t keycode, keyrecord_t *record) {
1182 #if KEYLOGGER_ENABLE
1183 uint8_t layer = biton32(layer_state);
1185 if (log_enable && layer == BASE) {
1186 xprintf ("KL: col=%d, row=%d\n", record->event.key.col,
1187 record->event.key.row);
1191 if (time_travel && !record->event.pressed) {
1194 // shift cache one to the left
1195 for (p = 0; p < 3; p++) {
1196 last4[p] = last4[p + 1];
1200 if (last4[0] == KC_D && last4[1] == KC_A && last4[2] == KC_T && last4[3] == KC_E) {
1201 uint16_t codes[] = {KC_E, KC_SPC, KC_MINS, KC_D, KC_SPC, KC_QUOT, 0};
1203 register_code (KC_RSFT);
1204 register_code (KC_EQL);
1205 unregister_code (KC_EQL);
1206 unregister_code (KC_RSFT);
1208 uint16_t codes2[] = {KC_4, KC_SPC, KC_D, KC_A, KC_Y, KC_S, KC_QUOT, 0};