2 * algernon's ErgoDox EZ layout, please see the readme.md file!
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
100 uint16_t gui_timer = 0;
102 uint16_t kf_timers[12];
105 bool log_enable = false;
108 bool time_travel = false;
112 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
114 /* Keymap 0: Base Layer
116 * ,-----------------------------------------------------. ,-----------------------------------------------------.
117 * | Next/Prev | 1 F1 | 2 F2 | 3 F3 | 4 F4 | 5 F5 | Plvr | | Apps | 6 F6 | 7 F7 | 8 F8 | 9 F9 | 0 F10| F11 |
118 * |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------|
119 * | ~ | ' | , | . | P | Y | [ | | ] | F | G | C | R | L | \ |
120 * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
121 * | Tab/ARROW | A | O | E | U | I |------| |------| D | H | T | N | S | = / Arrow |
122 * |-----------+------+------+------+------+------| ( | | ) |------+------+------+------+------+-----------|
123 * | Play/Pause| / | Q | J | K | X | | | | B | M | W | V | Z | Stop |
124 * `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------'
125 * | | | | | : | | - | | | | |
126 * `-----------------------------------' `-----------------------------------'
127 * ,-------------. ,-------------.
128 * | LAlt | GUI | | MDIA | Del |
129 * ,------|------|------| |------+------+------.
130 * | | | Ctrl | | LEAD | | |
131 * |Backsp|LShift|------| |------| Enter| Space|
132 * | | | ESC | | HUN | | |
133 * `--------------------' `--------------------'
137 M(A_MPN) ,M(KF_1) ,M(KF_2) ,M(KF_3),M(KF_4),M(KF_5),M(A_PLVR)
138 ,KC_GRV ,KC_QUOT ,KC_COMM ,KC_DOT ,KC_P ,KC_Y ,KC_LBRC
139 ,TD(CT_TA) ,KC_A ,KC_O ,KC_E ,KC_U ,KC_I
140 ,KC_MPLY ,KC_SLSH ,KC_Q ,KC_J ,KC_K ,KC_X ,KC_LPRN
141 ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,TD(CT_CLN)
145 ,KC_BSPC,F(F_SFT),M(A_ESC)
148 ,KC_APP ,M(KF_6),M(KF_7) ,M(KF_8),M(KF_9) ,M(KF_10) ,KC_F11
149 ,KC_RBRC ,KC_F ,KC_G ,KC_C ,KC_R ,KC_L ,KC_BSLS
150 ,KC_D ,KC_H ,KC_T ,KC_N ,KC_S ,KC_EQL
151 ,KC_RPRN ,KC_B ,KC_M ,KC_W ,KC_V ,KC_Z ,KC_MSTP
152 ,TD(CT_MNS),KC_NO ,KC_NO ,KC_NO ,KC_NO
156 ,F(F_HUN) ,KC_ENT ,KC_SPC
159 /* Keymap 1: Adore layer
161 * ,-----------------------------------------------------. ,-----------------------------------------------------.
162 * | Play/Pause| 1 F1 | 2 F2 | 3 F3 | 4 F4 | 5 F5 | Plvr | | Apps | 6 F6 | 7 F7 | 8 F8 | 9 F9 | 0 F10| F11 |
163 * |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------|
164 * | `~ | X | W | K | L | M | ( | | ) | F | H | C | P | Y | \ |
165 * |-----------+------+------+------+------+------| [ | | ] |------+------+------+------+------+-----------|
166 * | Tab/Arrow | A | O | E | I | U |------| |------| D | R | T | N | S | = |
167 * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
168 * | | Z | Q | ' | , | . | : | | - | B | G | V | J | / | |
169 * `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------'
170 * | | | | | | | | | | | |
171 * `-----------------------------------' `-----------------------------------'
172 * ,-------------. ,-------------.
173 * | LAlt | GUI | | MDIA | Del |
174 * ,------|------|------| |------+------+------.
175 * | | | Ctrl | | HUN | | |
176 * |Backsp|LShift|------| |------| Enter| Space|
177 * | | | ESC | | LEAD | | |
178 * `--------------------' `--------------------'
182 KC_MPLY ,M(KF_1) ,M(KF_2) ,M(KF_3),M(KF_4),M(KF_5),M(A_PLVR)
183 ,KC_GRV ,KC_X ,KC_W ,KC_K ,KC_L ,KC_M ,TD(CT_LBP)
184 ,TD(CT_TA) ,KC_A ,KC_O ,KC_E ,KC_I ,KC_U
185 ,KC_NO ,KC_Z ,KC_Q ,KC_QUOT,KC_COMM,KC_DOT ,TD(CT_CLN)
186 ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
190 ,KC_BSPC,F(F_SFT),M(A_ESC)
193 ,KC_APP ,M(KF_6),M(KF_7),M(KF_8),M(KF_9) ,M(KF_10) ,KC_F11
194 ,TD(CT_RBP),KC_F ,KC_H ,KC_C ,KC_P ,KC_Y ,KC_BSLS
195 ,KC_D ,KC_R ,KC_T ,KC_N ,KC_S ,KC_EQL
196 ,TD(CT_MNS),KC_B ,KC_G ,KC_V ,KC_J ,KC_SLSH ,KC_NO
197 ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
201 ,KC_LEAD ,KC_ENT ,KC_SPC
204 /* Keymap 2: Arrow layer
206 * ,-----------------------------------------------------. ,-----------------------------------------------------.
207 * | | | | | | | | | | | | | | | |
208 * |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------|
209 * | | | | | | | | | | | Home | Up | End | | |
210 * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
211 * | | | | | | |------| |------| | Left | Down | Rght | | |
212 * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
213 * | | | | | | | | | | | | | | | |
214 * `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------'
215 * | | | | | | | | | | | |
216 * `----------------------------------' `----------------------------------'
217 * ,-------------. ,-------------.
219 * ,------|------|------| |------+------+------.
221 * | Enter| |------| |------| PgUp | PgDn |
223 * `--------------------' `--------------------'
228 KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
229 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
230 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
231 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
232 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
236 ,KC_ENT ,KC_TRNS ,KC_TRNS
239 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
240 ,KC_TRNS ,KC_TRNS ,KC_HOME ,KC_UP ,KC_END ,KC_TRNS ,KC_TRNS
241 ,KC_TRNS ,KC_LEFT ,KC_DOWN ,KC_RGHT ,KC_TRNS ,KC_TRNS
242 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
243 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
247 ,KC_TRNS ,KC_PGUP ,KC_PGDN
250 /* Keymap 3: Application select layer
252 * ,-----------------------------------------------------. ,-----------------------------------------------------.
253 * | |Music |Slack |Emacs |Term |Chrome| | | | | | | | | |
254 * |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------|
255 * | | | | | | | | | | | | | | | |
256 * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
257 * | | | | | | |------| |------| | | | | | |
258 * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
259 * | | | | | | | | | | | | | | | |
260 * `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------'
261 * | | | | | | | | | | | |
262 * `----------------------------------' `----------------------------------'
263 * ,-------------. ,-------------.
265 * ,------|------|------| |------+------+------.
267 * | | |------| |------| | |
269 * `--------------------' `--------------------'
274 KC_TRNS ,M(APP_MSIC),M(APP_SLK),M(APP_EMCS),M(APP_TERM),M(APP_CHRM),KC_TRNS
275 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
276 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
277 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
278 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
282 ,KC_TRNS ,KC_TRNS ,KC_TRNS
285 ,KC_TRNS ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_TRNS
286 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
287 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
288 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
289 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
293 ,KC_TRNS ,KC_TRNS ,KC_TRNS
297 /* Keymap 4: Hungarian Layer
299 * ,-----------------------------------------------------. ,-----------------------------------------------------.
300 * | | | | | | | | | | | | | | | |
301 * |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------|
302 * | | | Ő | | Ű | | | | | | | | | | |
303 * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
304 * | | Á | Ó | É | Ú | Í |------| |------| | | | | | |
305 * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
306 * | | | Ö | | Ü | | | | | | | | | | |
307 * `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------'
308 * | | | | | | | | | | | |
309 * `----------------------------------' `----------------------------------'
310 * ,-------------. ,-------------.
312 * ,------|------|------| |------+------+------.
314 * | | |------| |------| | |
315 * | | | | | BASE | | |
316 * `--------------------' `--------------------'
321 KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
322 ,KC_NO ,KC_NO ,M(HU_OEE),KC_NO ,M(HU_UEE),KC_NO ,KC_NO
323 ,KC_NO ,M(HU_AA),M(HU_OO) ,M(HU_EE),M(HU_UU) ,M(HU_II)
324 ,KC_NO ,KC_NO ,M(HU_OE) ,KC_NO ,M(HU_UE) ,KC_NO ,KC_NO
325 ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
329 ,KC_NO ,KC_TRNS ,KC_TRNS
332 ,KC_TRNS ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
333 ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
334 ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
335 ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
336 ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
340 ,F(F_BSE),KC_TRNS ,KC_TRNS
343 /* Keymap 5: Navigation & Media layer
345 * ,-----------------------------------------------------. ,-----------------------------------------------------.
346 * | MS Slow | | | | | |ScrLCK| |ScrLCK| | | | | | |
347 * |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------|
348 * | MS Normal | | Home | Up | PgUp | | | |Scroll| |MsUpL | MsUp |MsUpR | |PrintScreen|
349 * |-----------+------+------+------+------+------| | | Up |------+------+------+------+------+-----------|
350 * | MS Fast | | Left | Down | Right| |------| |------| |MsLeft| MsDn |MsRght| | |
351 * |-----------+------+------+------+------+------| | |Scroll|------+------+------+------+------+-----------|
352 * | Play/Pause| | End | Down | PgDn | | | | Down | |MsDnL | MsDn |MsDnR | | Stop |
353 * `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------'
354 * | | | | | | | | | | | |
355 * `----------------------------------' `----------------------------------'
356 * ,-------------. ,-------------.
357 * | Mute | VlUp | | BASE | MClk |
358 * ,------|------|------| |------+------+------.
359 * | | | VlDn | | Prev |Left |Right |
360 * | SPC | Enter|------| |------| Click| Click|
361 * | | | ESC | | Next | | |
362 * `--------------------' `--------------------'
366 KC_ACL0 ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,LGUI(KC_L)
367 ,KC_ACL1 ,KC_NO ,KC_HOME ,KC_UP ,KC_PGUP ,KC_NO ,KC_NO
368 ,KC_ACL2 ,KC_NO ,KC_LEFT ,KC_DOWN ,KC_RIGHT,KC_NO
369 ,KC_MPLY ,KC_NO ,KC_END ,KC_DOWN ,KC_PGDN ,KC_NO ,KC_NO
370 ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
373 ,KC_SPC,KC_ENTER,M(A_ESC)
376 ,LGUI(KC_L),KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
377 ,KC_WH_U ,KC_NO ,M(A_MUL),KC_MS_U ,M(A_MUR),KC_NO ,KC_PSCR
378 ,KC_NO ,KC_MS_L ,KC_MS_D ,KC_MS_R ,KC_NO ,KC_NO
379 ,KC_WH_D ,KC_NO ,M(A_MDL),KC_MS_D ,M(A_MDR),KC_NO ,KC_MSTP
380 ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
384 ,KC_MNXT ,KC_BTN1 ,KC_BTN2
387 /* Keymap 6: Steno for Plover
389 * ,--------------------------------------------------. ,--------------------------------------------------.
390 * | | | | | | | BASE | | | | | | | | |
391 * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
392 * | | # | # | # | # | # | # | | # | # | # | # | # | # | # |
393 * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
394 * | | | T | P | H | |------| |------| | F | P | L | T | D |
395 * |--------+ S +------+------+------+ * | * | | * | * +------+------+------+------+--------|
396 * | | | K | W | R | | | | | | R | B | G | S | Z |
397 * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
398 * | | | | | | | | | | | |
399 * `----------------------------------' `----------------------------------'
400 * ,-------------. ,-------------.
402 * ,------|------|------| |------+------+------.
404 * | A | O |------| |------| E | U |
406 * `--------------------' `--------------------'
411 KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, M(A_PLVR),
412 KC_NO, PV_NUM, PV_NUM, PV_NUM, PV_NUM, PV_NUM, PV_NUM,
413 KC_NO, PV_LS, PV_LT, PV_LP, PV_LH, PV_STAR,
414 KC_NO, PV_LS, PV_LK, PV_LW, PV_LR, PV_STAR, PV_STAR,
415 KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
421 KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
422 PV_NUM, PV_NUM, PV_NUM, PV_NUM, PV_NUM, PV_NUM, PV_NUM,
423 PV_STAR, PV_RF, PV_RP, PV_RL, PV_RT, PV_RD,
424 PV_STAR, PV_STAR, PV_RR, PV_RB, PV_RG, PV_RS, PV_RZ,
425 KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
433 const uint16_t PROGMEM fn_actions[] = {
434 [F_BSE] = ACTION_LAYER_CLEAR(ON_PRESS)
435 ,[F_HUN] = ACTION_LAYER_INVERT(HUN, ON_PRESS)
436 ,[F_GUI] = ACTION_MACRO_TAP(A_GUI)
437 ,[F_SFT] = ACTION_MODS_ONESHOT (MOD_LSFT)
438 ,[F_ALT] = ACTION_MODS_ONESHOT (MOD_LALT)
439 ,[F_CTRL] = ACTION_MODS_ONESHOT (MOD_LCTL)
442 void toggle_steno(int pressed)
444 uint8_t layer = biton32(layer_state);
447 if (layer != PLVR) layer_on(PLVR); else layer_off(PLVR);
449 register_code(PV_LP);
450 register_code(PV_LH);
451 register_code(PV_LR);
453 register_code(PV_RL);
454 register_code(PV_RG);
456 unregister_code(PV_LP);
457 unregister_code(PV_LH);
458 unregister_code(PV_LR);
459 unregister_code(PV_O);
460 unregister_code(PV_RL);
461 unregister_code(PV_RG);
465 macro_t *ang_do_hun (keyrecord_t *record, uint16_t accent, uint16_t hun_char)
467 uint8_t need_shift = 0;
468 uint8_t hold_shift = 0;
470 if (!record->event.pressed)
475 if (keyboard_report->mods & MOD_BIT (KC_LSFT)) {
478 unregister_code (KC_LSFT);
480 if ((get_oneshot_mods () & MOD_BIT(KC_LSFT)) && !has_oneshot_mods_timed_out ()) {
483 unregister_code (KC_LSFT);
486 clear_oneshot_mods ();
488 register_code (KC_RALT);
489 unregister_code (KC_RALT);
490 if (accent == (KC_DQT)) {
491 register_code (KC_RSFT);
493 register_code (accent);
494 unregister_code (accent);
495 if (need_shift && accent != (KC_DQT)) {
496 register_code (KC_RSFT);
497 } else if (accent == (KC_DQT) && !need_shift) {
498 unregister_code (KC_RSFT);
500 register_code (hun_char);
501 unregister_code (hun_char);
502 if (need_shift || accent == (KC_DQT))
503 unregister_code (KC_RSFT);
505 register_code (KC_LSFT);
510 void ang_handle_kf (keyrecord_t *record, uint8_t id)
512 uint8_t code = id - KF_1;
514 if (record->event.pressed) {
515 kf_timers[code] = timer_read ();
519 if (timer_elapsed (kf_timers[code]) > TAPPING_TERM) {
530 unregister_code (kc);
534 const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
538 if (record->event.pressed) {
539 if ((get_oneshot_mods ()) && !has_oneshot_mods_timed_out ()) {
540 clear_oneshot_mods ();
542 register_code (KC_ESC);
546 unregister_code (KC_ESC);
551 if (record->event.pressed) {
552 if (keyboard_report->mods & MOD_BIT(KC_LSFT) ||
553 ((get_oneshot_mods() & MOD_BIT(KC_LSFT)) && !has_oneshot_mods_timed_out())) {
554 int oneshot = ((get_oneshot_mods() & MOD_BIT(KC_LSFT)) && !has_oneshot_mods_timed_out());
557 clear_oneshot_mods ();
558 unregister_code (KC_LSFT);
560 register_code (KC_MPRV);
561 unregister_code (KC_MPRV);
564 register_code (KC_LSFT);
566 return MACRO (T(MNXT), END);
571 /* Hungarian layer */
573 return ang_do_hun (record, KC_QUOT, KC_A);
575 return ang_do_hun (record, KC_QUOT, KC_O);
577 return ang_do_hun (record, KC_QUOT, KC_E);
579 return ang_do_hun (record, KC_QUOT, KC_U);
581 return ang_do_hun (record, KC_QUOT, KC_I);
583 return ang_do_hun (record, KC_DQT, KC_O);
585 return ang_do_hun (record, KC_DQT, KC_U);
587 return ang_do_hun (record, KC_EQL, KC_O);
589 return ang_do_hun (record, KC_EQL, KC_U);
593 if (record->event.pressed) {
594 mousekey_on(KC_MS_UP);
595 mousekey_on(KC_MS_LEFT);
597 mousekey_off(KC_MS_UP);
598 mousekey_off(KC_MS_LEFT);
604 if (record->event.pressed) {
605 mousekey_on(KC_MS_UP);
606 mousekey_on(KC_MS_RIGHT);
608 mousekey_off(KC_MS_UP);
609 mousekey_off(KC_MS_RIGHT);
615 if (record->event.pressed) {
616 mousekey_on(KC_MS_DOWN);
617 mousekey_on(KC_MS_LEFT);
619 mousekey_off(KC_MS_DOWN);
620 mousekey_off(KC_MS_LEFT);
626 if (record->event.pressed) {
627 mousekey_on(KC_MS_DOWN);
628 mousekey_on(KC_MS_RIGHT);
630 mousekey_off(KC_MS_DOWN);
631 mousekey_off(KC_MS_RIGHT);
638 toggle_steno(record->event.pressed);
643 if (record->event.pressed) {
644 register_code (KC_LGUI);
645 if (record->tap.count && !record->tap.interrupted) {
646 if (record->tap.count >= 2) {
647 register_code (KC_W);
649 set_oneshot_layer (APPSEL, ONESHOT_START);
652 record->tap.count = 0;
656 if (record->tap.count >= 2)
658 unregister_code (KC_W);
659 clear_oneshot_layer_state (ONESHOT_PRESSED);
661 gui_timer = timer_read ();
666 return MACRODOWN(T(S), T(L), T(A), T(C), T(K), T(ENT), END);
669 return MACRODOWN(T(G), T(N), T(U), T(SPC), T(E), T(M), T(A), T(C), T(S), T(SPC), T(2), T(4), T(ENT), END);
672 return MACRODOWN(T(T), T(E), T(R), T(M), T(ENT), END);
675 return MACRODOWN(T(C), T(H), T(R), T(O), T(M), T(ENT), END);
678 return MACRODOWN(T(R), T(H), T(Y), T(T), T(H), T(M), T(B), T(O), T(X), T(ENT), END);
682 ang_handle_kf (record, id);
689 uint8_t is_adore = 0;
691 // Runs just one time when the keyboard initializes.
692 void matrix_init_user(void) {
695 ergodox_led_all_on();
696 for (int i = LED_BRIGHTNESS_HI; i > LED_BRIGHTNESS_LO; i--) {
697 ergodox_led_all_set (i);
701 for (int i = LED_BRIGHTNESS_LO; i > 0; i--) {
702 ergodox_led_all_set (i);
705 ergodox_led_all_off();
707 if (!eeconfig_is_enabled())
709 dl = eeconfig_read_default_layer ();
710 if (dl == (1UL << ADORE)) {
720 void ang_do_unicode (void) {
721 register_code (KC_RCTL);
722 register_code (KC_RSFT);
723 register_code (KC_U);
724 unregister_code (KC_U);
725 unregister_code (KC_RSFT);
726 unregister_code (KC_RCTL);
730 void ang_tap (uint16_t codes[]) {
731 for (int i = 0; codes[i] != 0; i++) {
732 register_code (codes[i]);
733 unregister_code (codes[i]);
738 #define TAP_ONCE(code) \
739 register_code (code); \
740 unregister_code (code)
742 void ang_tap_dance_bp_finished (qk_tap_dance_state_t *state, void *user_data) {
745 if (state->count > 2) {
750 if (state->keycode == TD(CT_LBP))
755 if (state->count == 1)
761 register_code (KC_RSFT);
767 unregister_code (KC_RSFT);
777 void ang_tap_dance_cln_finished (qk_tap_dance_state_t *state, void *user_data) {
778 if (state->count == 1) {
779 register_code (KC_RSFT);
780 register_code (KC_SCLN);
781 } else if (state->count == 2) {
782 register_code (KC_SCLN);
786 void ang_tap_dance_cln_reset (qk_tap_dance_state_t *state, void *user_data) {
787 if (state->count == 1) {
788 unregister_code (KC_SCLN);
789 unregister_code (KC_RSFT);
790 } else if (state->count == 2) {
791 unregister_code (KC_SCLN);
795 void ang_tap_dance_mns_finished (qk_tap_dance_state_t *state, void *user_data) {
796 if (state->count == 1) {
797 register_code (KC_MINS);
798 } else if (state->count == 2) {
799 register_code (KC_RSFT);
800 register_code (KC_MINS);
804 void ang_tap_dance_mns_reset (qk_tap_dance_state_t *state, void *user_data) {
805 if (state->count == 1) {
806 unregister_code (KC_MINS);
807 } else if (state->count == 2) {
808 unregister_code (KC_RSFT);
809 unregister_code (KC_MINS);
819 void ang_tap_dance_ta_finished (qk_tap_dance_state_t *state, void *user_data) {
820 td_ta_state_t *td_ta = (td_ta_state_t *) user_data;
822 if (td_ta->finished_once) {
827 td_ta->sticky = false;
828 td_ta->layer_toggle = false;
833 td_ta->finished_once = true;
834 if (state->count == 1 && !state->pressed) {
835 register_code (KC_TAB);
836 td_ta->sticky = false;
837 td_ta->layer_toggle = false;
839 td_ta->layer_toggle = true;
841 td_ta->sticky = (state->count == 2);
845 void ang_tap_dance_ta_reset (qk_tap_dance_state_t *state, void *user_data) {
846 td_ta_state_t *td_ta = (td_ta_state_t *) user_data;
848 if (!td_ta->layer_toggle)
849 unregister_code (KC_TAB);
853 td_ta->finished_once = false;
856 qk_tap_dance_action_t tap_dance_actions[] = {
857 [CT_CLN] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, ang_tap_dance_cln_finished, ang_tap_dance_cln_reset)
858 ,[CT_MNS] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, ang_tap_dance_mns_finished, ang_tap_dance_mns_reset)
860 .fn = { NULL, ang_tap_dance_ta_finished, ang_tap_dance_ta_reset },
861 .user_data = (void *)&((td_ta_state_t) { false, false, false })
863 ,[CT_LBP] = ACTION_TAP_DANCE_FN (ang_tap_dance_bp_finished)
864 ,[CT_RBP] = ACTION_TAP_DANCE_FN (ang_tap_dance_bp_finished)
867 static uint16_t uni[32];
868 static uint8_t unicnt;
869 static bool unimagic = false;
871 // Runs constantly in the background, in a loop.
872 void matrix_scan_user(void) {
873 uint8_t layer = biton32(layer_state);
875 if (gui_timer && timer_elapsed (gui_timer) > TAPPING_TERM)
876 unregister_code (KC_LGUI);
879 ergodox_right_led_2_on();
880 ergodox_right_led_3_on();
881 } else if (layer == NMDIA) {
882 ergodox_right_led_1_on();
883 ergodox_right_led_2_on();
884 } else if (layer == PLVR) {
885 ergodox_right_led_1_on ();
886 ergodox_right_led_2_on ();
887 ergodox_right_led_3_on ();
888 } else if (layer == ADORE) {
889 ergodox_right_led_1_on ();
890 ergodox_right_led_2_on ();
891 ergodox_right_led_3_on ();
893 ergodox_right_led_2_set (LED_BRIGHTNESS_HI);
896 if (keyboard_report->mods & MOD_BIT(KC_LSFT) ||
897 ((get_oneshot_mods() & MOD_BIT(KC_LSFT)) && !has_oneshot_mods_timed_out())) {
898 ergodox_right_led_1_set (LED_BRIGHTNESS_HI);
899 ergodox_right_led_1_on ();
901 ergodox_right_led_1_set (LED_BRIGHTNESS_LO);
902 if (layer != NMDIA && layer != PLVR && layer != ADORE)
903 ergodox_right_led_1_off ();
906 if (keyboard_report->mods & MOD_BIT(KC_LALT) ||
907 ((get_oneshot_mods() & MOD_BIT(KC_LALT)) && !has_oneshot_mods_timed_out())) {
908 ergodox_right_led_2_set (LED_BRIGHTNESS_HI);
909 ergodox_right_led_2_on ();
911 ergodox_right_led_2_set (LED_BRIGHTNESS_LO);
912 if (layer != HUN && layer != NMDIA && layer != PLVR && layer != ADORE)
913 ergodox_right_led_2_off ();
916 if (keyboard_report->mods & MOD_BIT(KC_LCTRL) ||
917 ((get_oneshot_mods() & MOD_BIT(KC_LCTRL)) && !has_oneshot_mods_timed_out())) {
918 ergodox_right_led_3_set (LED_BRIGHTNESS_HI);
919 ergodox_right_led_3_on ();
921 ergodox_right_led_3_set (LED_BRIGHTNESS_LO);
922 if (layer != HUN && layer != PLVR && layer != ADORE)
923 ergodox_right_led_3_off ();
926 LEADER_DICTIONARY() {
932 ergodox_led_all_on();
934 ergodox_led_all_off();
935 log_enable = !log_enable;
940 time_travel = !time_travel;
947 SEQ_TWO_KEYS (KC_LEAD, KC_U) {
950 register_code(KC_RSFT);
952 unregister_code(KC_RSFT);
956 SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ (" QMK_VERSION "/" KEYMAP_VERSION ")");
963 uint16_t codes[] = {KC_0, KC_3, KC_B, KC_B, KC_ENT, 0};
968 uint16_t codes[] = {KC_BSLS, KC_O, KC_SLSH, 0};
973 ang_do_unicode (); TAP_ONCE (KC_A); TAP_ONCE (KC_F); TAP_ONCE (KC_SPC);
975 register_code (KC_RSFT); TAP_ONCE (KC_MINS); TAP_ONCE (KC_9); unregister_code (KC_RSFT);
976 ang_do_unicode (); TAP_ONCE (KC_3); TAP_ONCE (KC_0); TAP_ONCE (KC_C); TAP_ONCE (KC_4); TAP_ONCE (KC_SPC);
977 register_code (KC_RSFT); TAP_ONCE (KC_0); TAP_ONCE (KC_MINS); unregister_code (KC_RSFT);
979 ang_do_unicode (); TAP_ONCE (KC_A); TAP_ONCE (KC_F); TAP_ONCE (KC_SPC);
982 SEQ_TWO_KEYS (KC_W, KC_M) {
983 register_code (KC_LALT);
984 register_code (KC_F2);
985 unregister_code (KC_F2);
986 unregister_code (KC_LALT);
990 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};
992 register_code (KC_LGUI);
993 register_code (KC_UP);
994 unregister_code (KC_UP);
995 unregister_code (KC_LGUI);
1000 default_layer_and (0);
1001 default_layer_or ((1UL << ADORE));
1002 eeconfig_update_default_layer ((1UL << ADORE));
1005 ergodox_led_all_off ();
1006 ergodox_right_led_3_on ();
1008 ergodox_right_led_2_on ();
1010 ergodox_right_led_3_off ();
1011 ergodox_right_led_1_on ();
1013 ergodox_right_led_2_off ();
1015 ergodox_right_led_1_off ();
1024 default_layer_and (0);
1025 default_layer_or (1UL << BASE);
1026 eeconfig_update_default_layer ((1UL << BASE));
1028 ergodox_led_all_off ();
1029 ergodox_right_led_1_on ();
1031 ergodox_right_led_2_on ();
1033 ergodox_right_led_1_off ();
1034 ergodox_right_led_3_on ();
1036 ergodox_right_led_2_off ();
1038 ergodox_right_led_3_off ();
1044 static uint16_t last4[4];
1046 bool is_uni_seq(char *seq) {
1049 for (i = 0; seq[i]; i++) {
1051 if (('1' <= seq[i]) && (seq[i] <= '9'))
1052 code = seq[i] - '1' + KC_1;
1053 else if (seq[i] == '0')
1056 code = seq[i] - 'a' + KC_A;
1064 if (uni[i] == KC_ENT || uni[i] == KC_SPC)
1070 uint16_t hex_to_keycode(uint8_t hex)
1074 } else if (hex < 0xA) {
1075 return KC_1 + (hex - 0x1);
1077 return KC_A + (hex - 0xA);
1081 void register_hex(uint16_t hex) {
1082 bool leading_zeros = true;
1084 for(int i = 3; i >= 0; i--) {
1085 uint8_t digit = ((hex >> (i*4)) & 0xF);
1087 leading_zeros = false;
1088 else if (leading_zeros)
1090 register_code(hex_to_keycode(digit));
1091 unregister_code(hex_to_keycode(digit));
1101 static qk_ucis_symbol_t ucis_symbol_table[] = {
1102 {"poop", {0x1, 0xf4a9, 0}},
1103 {"rofl", {0x1, 0xf923, 0}},
1104 {"kiss", {0x1, 0xf619, 0}},
1105 {"snowman", {0x2603, 0}},
1109 bool process_record_ucis (uint16_t keycode, keyrecord_t *record) {
1115 if (!record->event.pressed)
1118 uni[unicnt] = keycode;
1121 if (keycode == KC_BSPC) {
1131 if (keycode == KC_ENT || keycode == KC_SPC) {
1132 bool symbol_found = false;
1134 for (i = unicnt; i > 0; i--) {
1135 register_code (KC_BSPC);
1136 unregister_code (KC_BSPC);
1142 for (i = 0; ucis_symbol_table[i].symbol; i++) {
1143 if (is_uni_seq (ucis_symbol_table[i].symbol)) {
1144 symbol_found = true;
1145 for (uint8_t j = 0; ucis_symbol_table[i].codes[j]; j++) {
1146 register_hex(ucis_symbol_table[i].codes[j]);
1151 if (!symbol_found) {
1152 for (i = 0; i < unicnt - 1; i++) {
1156 code = uni[i] - KF_1 + KC_1;
1170 bool process_record_user (uint16_t keycode, keyrecord_t *record) {
1171 #if KEYLOGGER_ENABLE
1173 xprintf ("KL: col=%d, row=%d\n", record->event.key.col,
1174 record->event.key.row);
1178 if (!process_record_ucis (keycode, record))
1181 if (time_travel && !record->event.pressed) {
1184 // shift cache one to the left
1185 for (p = 0; p < 3; p++) {
1186 last4[p] = last4[p + 1];
1190 if (last4[0] == KC_D && last4[1] == KC_A && last4[2] == KC_T && last4[3] == KC_E) {
1191 uint16_t codes[] = {KC_E, KC_SPC, KC_MINS, KC_D, KC_SPC, KC_QUOT, 0};
1193 register_code (KC_RSFT);
1194 register_code (KC_EQL);
1195 unregister_code (KC_EQL);
1196 unregister_code (KC_RSFT);
1198 uint16_t codes2[] = {KC_4, KC_SPC, KC_D, KC_A, KC_Y, KC_S, KC_QUOT, 0};