aboutsummaryrefslogtreecommitdiff
path: root/layouts/community/ergodox/algernon/keymap.c
diff options
context:
space:
mode:
Diffstat (limited to 'layouts/community/ergodox/algernon/keymap.c')
-rw-r--r--layouts/community/ergodox/algernon/keymap.c1108
1 files changed, 1108 insertions, 0 deletions
diff --git a/layouts/community/ergodox/algernon/keymap.c b/layouts/community/ergodox/algernon/keymap.c
new file mode 100644
index 000000000..8be54986f
--- /dev/null
+++ b/layouts/community/ergodox/algernon/keymap.c
@@ -0,0 +1,1108 @@
1/*
2 * algernon's ErgoDox EZ layout, please see the readme.md file!
3 */
4
5#include <stdarg.h>
6#include QMK_KEYBOARD_H
7#include "led.h"
8#include "debug.h"
9#include "action_layer.h"
10#include "action_util.h"
11#include "timer.h"
12#include "keymap_plover.h"
13#include "eeconfig.h"
14#include "wait.h"
15#include "version.h"
16
17/* Layers */
18
19enum {
20 BASE = 0,
21 ADORE,
22 ARRW,
23 APPSEL,
24 HUN,
25 NMDIA,
26 PLVR,
27};
28
29/* Macros */
30
31enum {
32 NONE = 0,
33 // Buttons that do extra stuff
34 A_GUI,
35 A_PLVR,
36 A_MPN,
37
38 // Application select keys
39 APP_SLK, // Slack
40 APP_EMCS, // Emacs
41 APP_TERM, // Terminal
42 APP_CHRM, // Chrome
43 APP_MSIC, // Music
44
45 // Hungarian layer keys
46 HU_AA, // Á
47 HU_OO, // Ó
48 HU_EE, // É
49 HU_UU, // Ú
50 HU_II, // Í
51 HU_OE, // Ö
52 HU_UE, // Ü
53 HU_OEE, // Ő
54 HU_UEE, // Ű
55
56 // number/symbol keys
57 A_1, // 1
58 A_2, // 2
59 A_3, // ...
60 A_4,
61 A_5,
62 A_6,
63 A_7,
64 A_8,
65 A_9,
66 A_0,
67
68 // Fx
69 Fx,
70};
71
72/* Fn keys */
73
74enum {
75 F_BSE = 0,
76 F_HUN,
77 F_GUI,
78 F_SFT,
79 F_ALT,
80 F_CTRL
81};
82
83/* Custom keycodes */
84
85enum {
86 CT_CLN = 0,
87 CT_TA,
88 CT_LBP,
89 CT_RBP,
90 CT_TMUX,
91 CT_TPS,
92 CT_SR,
93};
94
95/* States & timers */
96
97uint16_t gui_timer = 0;
98
99#if KEYLOGGER_ENABLE
100# ifdef AUTOLOG_ENABLE
101bool log_enable = true;
102# else
103bool log_enable = false;
104# endif
105#endif
106
107bool time_travel = false;
108bool skip_leds = false;
109
110static uint8_t is_adore = 0;
111
112/* The Keymap */
113
114const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
115
116/* Keymap 0: Base Layer
117 *
118 * ,-----------------------------------------------------. ,-----------------------------------------------------.
119 * | Next/Prev | 9 | 7 @ | 5 * | 3 ^ | 1 $ | F11 | | Fx | 0 % | 2 ! | 4 # | 6 & | 8 | Plover |
120 * |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------|
121 * | ~ | ' | , | . | P | Y | ( | | ) | F | G | C | R | L | \ |
122 * |-----------+------+------+------+------+------| [ | | ] |------+------+------+------+------+-----------|
123 * | Tab/ARROW | A | O | E | U | I |------| |------| D | H | T | N | S | = / Arrow |
124 * |-----------+------+------+------+------+------| tmux | | tmux |------+------+------+------+------+-----------|
125 * | Play/Pause| / | Q | J | K | X | | | Pane | B | M | W | V | Z | Stop/Reset|
126 * `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------'
127 * | | | | | : | | - | | | | |
128 * `-----------------------------------' `-----------------------------------'
129 * ,-------------. ,-------------.
130 * | LAlt | GUI | | MDIA | Del |
131 * ,------|------|------| |------+------+------.
132 * | | | Ctrl | | LEAD | | |
133 * |Backsp|LShift|------| |------| Enter| Space|
134 * | | | ESC | | HUN | | |
135 * `--------------------' `--------------------'
136 */
137[BASE] = LAYOUT_ergodox(
138// left hand
139 M(A_MPN) ,M(A_9) ,M(A_7) ,M(A_5) ,M(A_3) ,M(A_1) ,KC_F11
140,KC_GRV ,KC_QUOT ,KC_COMM ,KC_DOT ,KC_P ,KC_Y ,TD(CT_LBP)
141,TD(CT_TA) ,KC_A ,KC_O ,KC_E ,KC_U ,KC_I
142,KC_MPLY ,KC_SLSH ,KC_Q ,KC_J ,KC_K ,KC_X ,TD(CT_TMUX)
143,KC_NO ,KC_NO ,KC_NO ,KC_NO ,TD(CT_CLN)
144
145 ,F(F_ALT),F(F_GUI)
146 ,F(F_CTRL)
147 ,KC_BSPC,F(F_SFT),KC_ESC
148
149 // right hand
150 ,M(Fx) ,M(A_0) ,M(A_2) ,M(A_4) ,M(A_6) ,M(A_8) ,M(A_PLVR)
151 ,TD(CT_RBP),KC_F ,KC_G ,KC_C ,KC_R ,KC_L ,KC_BSLS
152 ,KC_D ,KC_H ,KC_T ,KC_N ,KC_S ,KC_EQL
153 ,TD(CT_TPS),KC_B ,KC_M ,KC_W ,KC_V ,KC_Z ,TD(CT_SR)
154 ,KC_MINS ,KC_NO ,KC_NO ,KC_NO ,KC_NO
155
156 ,OSL(NMDIA),KC_DEL
157 ,KC_LEAD
158 ,F(F_HUN) ,KC_ENT ,KC_SPC
159 ),
160
161/* Keymap 1: Adore layer
162 *
163 * ,-----------------------------------------------------. ,-----------------------------------------------------.
164 * | Play/Pause| 9 | 7 @ | 5 * | 3 ^ | 1 $ | F11 | | Fx | 0 % | 2 ! | 4 # | 6 & | 8 | Plover |
165 * |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------|
166 * | \ | X | W | C | H | F | ( | | ) | M | G | L | P | / | `~ |
167 * |-----------+------+------+------+------+------| [ | | ] |------+------+------+------+------+-----------|
168 * | Tab/Arrow | A | O | E | I | U |------| |------| D | R | T | N | S | = |
169 * |-----------+------+------+------+------+------| tmux | | tmux |------+------+------+------+------+-----------|
170 * | | Z | Q | ' | , | . | | | pane | B | K | V | Y | J | |
171 * `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------'
172 * | | | | | : | | - | | | | |
173 * `-----------------------------------' `-----------------------------------'
174 * ,-------------. ,-------------.
175 * | LAlt | GUI | | MDIA | Del |
176 * ,------|------|------| |------+------+------.
177 * | | | Ctrl | | HUN | | |
178 * |Backsp|LShift|------| |------| Enter| Space|
179 * | | | ESC | | LEAD | | |
180 * `--------------------' `--------------------'
181 */
182[ADORE] = LAYOUT_ergodox(
183// left hand
184 KC_MPLY ,M(A_9) ,M(A_7) ,M(A_5) ,M(A_3) ,M(A_1) ,KC_F11
185,KC_BSLS ,KC_X ,KC_W ,KC_C ,KC_H ,KC_F ,TD(CT_LBP)
186,TD(CT_TA) ,KC_A ,KC_O ,KC_E ,KC_I ,KC_U
187,KC_NO ,KC_Z ,KC_Q ,KC_QUOT ,KC_COMM ,KC_DOT ,TD(CT_TMUX)
188,KC_NO ,KC_NO ,KC_NO ,KC_NO ,TD(CT_CLN)
189
190 ,F(F_ALT),F(F_GUI)
191 ,F(F_CTRL)
192 ,KC_BSPC,F(F_SFT),KC_ESC
193
194 // right hand
195 ,M(Fx) ,M(A_0) ,M(A_2) ,M(A_4) ,M(A_6) ,M(A_8) ,M(A_PLVR)
196 ,TD(CT_RBP),KC_M ,KC_G ,KC_L ,KC_P ,KC_SLSH ,KC_GRV
197 ,KC_D ,KC_R ,KC_T ,KC_N ,KC_S ,KC_EQL
198 ,TD(CT_TPS),KC_B ,KC_K ,KC_V ,KC_Y ,KC_J ,KC_NO
199 ,KC_MINS ,KC_NO ,KC_NO ,KC_NO ,KC_NO
200
201 ,OSL(NMDIA),KC_DEL
202 ,F(F_HUN)
203 ,KC_LEAD ,KC_ENT ,KC_SPC
204 ),
205
206/* Keymap 2: Arrow layer
207 *
208 * ,-----------------------------------------------------. ,-----------------------------------------------------.
209 * | | | | | | | | | | | | | | | |
210 * |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------|
211 * | | | | | | | | | | | Home | Up | End | | |
212 * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
213 * | | | | | | |------| |------| | Left | Down | Rght | | |
214 * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
215 * | | | | | | | | | | | | | | | |
216 * `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------'
217 * | | | | | | | | | | | |
218 * `----------------------------------' `----------------------------------'
219 * ,-------------. ,-------------.
220 * | | | | | |
221 * ,------|------|------| |------+------+------.
222 * | | | | | | | |
223 * | Enter| |------| |------| PgUp | PgDn |
224 * | | | | | | | |
225 * `--------------------' `--------------------'
226 */
227
228[ARRW] = LAYOUT_ergodox(
229// left hand
230 KC_TRNS ,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 ,KC_TRNS
233,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
234,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
235
236 ,KC_TRNS ,KC_TRNS
237 ,KC_TRNS
238 ,KC_ENT ,KC_TRNS ,KC_TRNS
239
240 // right hand
241 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
242 ,KC_TRNS ,KC_TRNS ,KC_HOME ,KC_UP ,KC_END ,KC_TRNS ,KC_TRNS
243 ,KC_TRNS ,KC_LEFT ,KC_DOWN ,KC_RGHT ,KC_TRNS ,KC_TRNS
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
246
247 ,KC_TRNS ,KC_TRNS
248 ,KC_TRNS
249 ,KC_TRNS ,KC_PGUP ,KC_PGDN
250 ),
251
252/* Keymap 3: Application select layer
253 *
254 * ,-----------------------------------------------------. ,-----------------------------------------------------.
255 * | |Music |Slack |Emacs |Term |Chrome| | | | | | | | | |
256 * |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------|
257 * | | | | | | | | | | | | | | | |
258 * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
259 * | | | | | | |------| |------| | | | | | |
260 * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
261 * | | | | | | | | | | | | | | | |
262 * `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------'
263 * | | | | | | | | | | | |
264 * `----------------------------------' `----------------------------------'
265 * ,-------------. ,-------------.
266 * | | | | | |
267 * ,------|------|------| |------+------+------.
268 * | | | | | | | |
269 * | | |------| |------| | |
270 * | | | | | | | |
271 * `--------------------' `--------------------'
272 */
273
274[APPSEL] = LAYOUT_ergodox(
275// left hand
276 KC_TRNS ,M(APP_MSIC),M(APP_SLK),M(APP_EMCS),M(APP_TERM),M(APP_CHRM),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 ,KC_TRNS
279,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
280,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
281
282 ,KC_TRNS ,KC_TRNS
283 ,KC_TRNS
284 ,KC_TRNS ,KC_TRNS ,KC_TRNS
285
286 // right hand
287 ,KC_TRNS ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,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 ,KC_TRNS
290 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
291 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
292
293 ,KC_TRNS ,KC_TRNS
294 ,KC_TRNS
295 ,KC_TRNS ,KC_TRNS ,KC_TRNS
296 ),
297
298
299/* Keymap 4: Hungarian Layer
300 *
301 * ,-----------------------------------------------------. ,-----------------------------------------------------.
302 * | | | | | | | | | | | | | | | |
303 * |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------|
304 * | | | Ő | | Ű | | | | | | | | | | |
305 * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
306 * | | Á | Ó | É | Ú | Í |------| |------| | | | | | |
307 * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
308 * | | | Ö | | Ü | | | | | | | | | | |
309 * `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------'
310 * | | | | | | | | | | | |
311 * `----------------------------------' `----------------------------------'
312 * ,-------------. ,-------------.
313 * | | | | | |
314 * ,------|------|------| |------+------+------.
315 * | | | | | | | |
316 * | | |------| |------| | |
317 * | | | | | BASE | | |
318 * `--------------------' `--------------------'
319 */
320
321[HUN] = LAYOUT_ergodox(
322// left hand
323 KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
324,KC_NO ,KC_NO ,M(HU_OEE),KC_NO ,M(HU_UEE),KC_NO ,KC_NO
325,KC_NO ,M(HU_AA),M(HU_OO) ,M(HU_EE),M(HU_UU) ,M(HU_II)
326,KC_NO ,KC_NO ,M(HU_OE) ,KC_NO ,M(HU_UE) ,KC_NO ,KC_NO
327,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
328
329 ,KC_NO ,KC_NO
330 ,KC_NO
331 ,KC_NO ,KC_TRNS ,KC_TRNS
332
333 // right hand
334 ,KC_TRNS ,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 ,KC_NO
337 ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
338 ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
339
340 ,KC_NO ,KC_NO
341 ,KC_NO
342 ,F(F_BSE),KC_TRNS ,KC_TRNS
343 ),
344
345/* Keymap 5: Navigation & Media layer
346 *
347 * ,-----------------------------------------------------. ,-----------------------------------------------------.
348 * | | F9 | F7 | F5 | F3 | F1 |ScrLCK| | | F10 | F2 | F4 | F6 | F8 | |
349 * |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------|
350 * | | | | | | | | | | | | | | | |
351 * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
352 * | | | | | | |------| |------| | | | | | |
353 * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
354 * | | | | | | | | | | | | | | | |
355 * `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------'
356 * | | | | | | | | | | | |
357 * `----------------------------------' `----------------------------------'
358 * ,-------------. ,-------------.
359 * | Mute | VlUp | | BASE | |
360 * ,------|------|------| |------+------+------.
361 * | | | VlDn | | | | |
362 * | | |------| |------| | |
363 * | | | | | | | |
364 * `--------------------' `--------------------'
365 */
366[NMDIA] = LAYOUT_ergodox(
367// left hand
368 KC_NO ,KC_F9 ,KC_F7 ,KC_F5 ,KC_F3 ,KC_F1 ,LGUI(KC_L)
369,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
370,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
371,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
372,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
373 ,KC_MUTE ,KC_VOLU
374 ,KC_VOLD
375 ,KC_NO ,KC_NO ,KC_TRNS
376
377 // right hand
378 ,KC_TRNS ,KC_F10 ,KC_F2 ,KC_F4 ,KC_F6 ,KC_F8 ,KC_NO
379 ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
380 ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
381 ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
382 ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
383
384 ,KC_TRNS ,KC_NO
385 ,KC_NO
386 ,KC_NO ,KC_NO ,KC_NO
387 ),
388
389/* Keymap 6: Steno for Plover
390 *
391 * ,--------------------------------------------------. ,--------------------------------------------------.
392 * | | | | | | | | | | | | | | | BASE |
393 * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
394 * | | # | # | # | # | # | # | | # | # | # | # | # | # | # |
395 * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
396 * | | | T | P | H | |------| |------| | F | P | L | T | D |
397 * |--------+ S +------+------+------+ * | * | | * | * +------+------+------+------+--------|
398 * | | | K | W | R | | | | | | R | B | G | S | Z |
399 * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
400 * | | | | | | | | | | | |
401 * `----------------------------------' `----------------------------------'
402 * ,-------------. ,-------------.
403 * | | | | | |
404 * ,------|------|------| |------+------+------.
405 * | | | | | | | |
406 * | A | O |------| |------| E | U |
407 * | | | | | | | |
408 * `--------------------' `--------------------'
409 */
410
411[PLVR] = LAYOUT_ergodox(
412// left hand
413KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
414KC_NO, PV_NUM, PV_NUM, PV_NUM, PV_NUM, PV_NUM, PV_NUM,
415KC_NO, PV_LS, PV_LT, PV_LP, PV_LH, PV_STAR,
416KC_NO, PV_LS, PV_LK, PV_LW, PV_LR, PV_STAR, PV_STAR,
417KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
418 KC_NO, KC_NO,
419 KC_NO,
420 PV_A, PV_O, KC_NO,
421
422 // right hand
423 KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, M(A_PLVR),
424 PV_NUM, PV_NUM, PV_NUM, PV_NUM, PV_NUM, PV_NUM, PV_NUM,
425 PV_STAR, PV_RF, PV_RP, PV_RL, PV_RT, PV_RD,
426 PV_STAR, PV_STAR, PV_RR, PV_RB, PV_RG, PV_RS, PV_RZ,
427 KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
428 KC_NO, KC_NO,
429 KC_NO,
430 KC_NO,PV_E, PV_U
431 ),
432
433};
434
435const uint16_t PROGMEM fn_actions[] = {
436 [F_BSE] = ACTION_LAYER_CLEAR(ON_PRESS)
437 ,[F_HUN] = ACTION_LAYER_INVERT(HUN, ON_PRESS)
438 ,[F_GUI] = ACTION_MACRO_TAP(A_GUI)
439 ,[F_SFT] = ACTION_MODS_ONESHOT (MOD_LSFT)
440 ,[F_ALT] = ACTION_MODS_ONESHOT (MOD_LALT)
441 ,[F_CTRL] = ACTION_MODS_ONESHOT (MOD_LCTL)
442};
443
444static void toggle_steno(int pressed)
445{
446 uint8_t layer = biton32(layer_state);
447
448 if (pressed) {
449 if (layer != PLVR) layer_on(PLVR); else layer_off(PLVR);
450
451 register_code(PV_LP);
452 register_code(PV_LH);
453 register_code(PV_LR);
454 register_code(PV_O);
455 register_code(PV_RL);
456 register_code(PV_RG);
457 } else {
458 unregister_code(PV_LP);
459 unregister_code(PV_LH);
460 unregister_code(PV_LR);
461 unregister_code(PV_O);
462 unregister_code(PV_RL);
463 unregister_code(PV_RG);
464 }
465}
466
467static macro_t *ang_do_hun (keyrecord_t *record, uint16_t accent, uint16_t hun_char)
468{
469 uint8_t need_shift = 0;
470 uint8_t hold_shift = 0;
471
472 if (!record->event.pressed)
473 return MACRO_NONE;
474
475 layer_off (HUN);
476
477 if (keyboard_report->mods & MOD_BIT (KC_LSFT)) {
478 hold_shift = 1;
479 need_shift = 1;
480 unregister_code (KC_LSFT);
481 }
482 if ((get_oneshot_mods () & MOD_BIT(KC_LSFT)) && !has_oneshot_mods_timed_out ()) {
483 need_shift = 1;
484 hold_shift = 0;
485 unregister_code (KC_LSFT);
486 }
487
488 clear_oneshot_mods ();
489
490 register_code (KC_RALT);
491 unregister_code (KC_RALT);
492 if (accent == (KC_DQT)) {
493 register_code (KC_RSFT);
494 }
495 register_code (accent);
496 unregister_code (accent);
497 if (need_shift && accent != (KC_DQT)) {
498 register_code (KC_RSFT);
499 } else if (accent == (KC_DQT) && !need_shift) {
500 unregister_code (KC_RSFT);
501 }
502 register_code (hun_char);
503 unregister_code (hun_char);
504 if (need_shift || accent == (KC_DQT))
505 unregister_code (KC_RSFT);
506 if (hold_shift)
507 register_code (KC_LSFT);
508
509 return MACRO_NONE;
510}
511
512static void ang_handle_num_row(uint8_t id, keyrecord_t *record) {
513 uint8_t idx = id - A_1;
514 uint8_t kc;
515 static bool shifted[10];
516
517 if (keyboard_report->mods & MOD_BIT(KC_LSFT) ||
518 ((get_oneshot_mods() & MOD_BIT(KC_LSFT)) && !has_oneshot_mods_timed_out())) {
519 if (record->event.pressed)
520 shifted[idx] = true;
521 }
522
523 if (!shifted[idx]) {
524 kc = idx + KC_1;
525 } else {
526 switch (id) {
527 case A_8:
528 case A_9:
529 shifted[idx] = false;
530 return;
531
532 case A_7:
533 kc = KC_2;
534 break;
535 case A_5:
536 kc = KC_8;
537 break;
538 case A_3:
539 kc = KC_6;
540 break;
541 case A_1:
542 kc = KC_4;
543 break;
544
545 case A_0:
546 kc = KC_5;
547 break;
548 case A_2:
549 kc = KC_1;
550 break;
551 case A_4:
552 kc = KC_3;
553 break;
554 case A_6:
555 kc = KC_7;
556 break;
557 }
558 }
559
560 if (record->event.pressed) {
561 register_code (kc);
562 } else {
563 unregister_code (kc);
564 shifted[idx] = false;
565 }
566}
567
568const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
569{
570 switch(id) {
571 case A_MPN:
572 if (record->event.pressed) {
573 if (keyboard_report->mods & MOD_BIT(KC_LSFT) ||
574 ((get_oneshot_mods() & MOD_BIT(KC_LSFT)) && !has_oneshot_mods_timed_out())) {
575 int oneshot = ((get_oneshot_mods() & MOD_BIT(KC_LSFT)) && !has_oneshot_mods_timed_out());
576
577 if (oneshot)
578 clear_oneshot_mods ();
579 unregister_code (KC_LSFT);
580
581 register_code (KC_MPRV);
582 unregister_code (KC_MPRV);
583
584 if (!oneshot)
585 register_code (KC_LSFT);
586 } else {
587 return MACRO (T(MNXT), END);
588 }
589 }
590 break;
591
592 /* Hungarian layer */
593 case HU_AA:
594 return ang_do_hun (record, KC_QUOT, KC_A);
595 case HU_OO:
596 return ang_do_hun (record, KC_QUOT, KC_O);
597 case HU_EE:
598 return ang_do_hun (record, KC_QUOT, KC_E);
599 case HU_UU:
600 return ang_do_hun (record, KC_QUOT, KC_U);
601 case HU_II:
602 return ang_do_hun (record, KC_QUOT, KC_I);
603 case HU_OE:
604 return ang_do_hun (record, KC_DQT, KC_O);
605 case HU_UE:
606 return ang_do_hun (record, KC_DQT, KC_U);
607 case HU_OEE:
608 return ang_do_hun (record, KC_EQL, KC_O);
609 case HU_UEE:
610 return ang_do_hun (record, KC_EQL, KC_U);
611
612 /* Plover base */
613 case A_PLVR:
614 toggle_steno(record->event.pressed);
615 break;
616
617 /* Fx */
618 case Fx:
619 if (record->event.pressed) {
620 set_oneshot_mods (MOD_LALT);
621 layer_on (NMDIA);
622 set_oneshot_layer (NMDIA, ONESHOT_START);
623 } else {
624 clear_oneshot_layer_state (ONESHOT_PRESSED);
625 }
626 break;
627
628 /* GUI & AppSel */
629 case A_GUI:
630 if (record->event.pressed) {
631 register_code (KC_LGUI);
632 if (record->tap.count && !record->tap.interrupted) {
633 if (record->tap.count >= 2) {
634 uprintf("CMD:appsel_start\n");
635 layer_on (APPSEL);
636 set_oneshot_layer (APPSEL, ONESHOT_START);
637 }
638 } else {
639 record->tap.count = 0;
640 }
641 gui_timer = 0;
642 } else {
643 if (record->tap.count >= 2)
644 {
645 clear_oneshot_layer_state (ONESHOT_PRESSED);
646 }
647 gui_timer = timer_read ();
648 }
649 break;
650
651 case APP_SLK:
652 if (record->event.pressed)
653 uprintf("CMD:appsel_slack\n");
654 break;
655
656 case APP_EMCS:
657 if (record->event.pressed)
658 uprintf("CMD:appsel_emacs\n");
659 break;
660
661 case APP_TERM:
662 if (record->event.pressed)
663 uprintf("CMD:appsel_term\n");
664 break;
665
666 case APP_CHRM:
667 if (record->event.pressed)
668 uprintf("CMD:appsel_chrome\n");
669 break;
670
671 case APP_MSIC:
672 if (record->event.pressed)
673 uprintf("CMD:appsel_music\n");
674 break;
675
676 // number row and symbols
677 case A_1 ... A_0:
678 ang_handle_num_row(id, record);
679 break;
680 }
681
682 return MACRO_NONE;
683};
684
685// Runs just one time when the keyboard initializes.
686void matrix_init_user(void) {
687 uint8_t dl;
688
689 set_unicode_input_mode(UC_LNX);
690
691 ergodox_led_all_on();
692 for (int i = LED_BRIGHTNESS_HI; i > LED_BRIGHTNESS_LO; i--) {
693 ergodox_led_all_set (i);
694 wait_ms (5);
695 }
696 wait_ms(1000);
697 for (int i = LED_BRIGHTNESS_LO; i > 0; i--) {
698 ergodox_led_all_set (i);
699 wait_ms (10);
700 }
701 ergodox_led_all_off();
702
703 if (!eeconfig_is_enabled())
704 eeconfig_init();
705 dl = eeconfig_read_default_layer ();
706 if (dl == (1UL << ADORE)) {
707 is_adore = 1;
708 }
709};
710
711LEADER_EXTERNS();
712
713static void ang_tap (uint16_t code, ...) {
714 uint16_t kc = code;
715 va_list ap;
716
717 va_start(ap, code);
718
719 do {
720 register_code16(kc);
721 unregister_code16(kc);
722 wait_ms(50);
723 kc = va_arg(ap, int);
724 } while (kc != 0);
725 va_end(ap);
726}
727
728#define TAP_ONCE(code) \
729 register_code (code); \
730 unregister_code (code)
731
732typedef struct {
733 bool layer_toggle;
734 bool sticky;
735} td_ta_state_t;
736
737static void ang_tap_dance_ta_finished (qk_tap_dance_state_t *state, void *user_data) {
738 td_ta_state_t *td_ta = (td_ta_state_t *) user_data;
739
740 if (td_ta->sticky) {
741 td_ta->sticky = false;
742 td_ta->layer_toggle = false;
743 layer_off (ARRW);
744 return;
745 }
746
747 if (state->count == 1 && !state->pressed) {
748 register_code (KC_TAB);
749 td_ta->sticky = false;
750 td_ta->layer_toggle = false;
751 } else {
752 td_ta->layer_toggle = true;
753 layer_on (ARRW);
754 td_ta->sticky = (state->count == 2);
755 }
756}
757
758static void ang_tap_dance_ta_reset (qk_tap_dance_state_t *state, void *user_data) {
759 td_ta_state_t *td_ta = (td_ta_state_t *) user_data;
760
761 if (!td_ta->layer_toggle)
762 unregister_code (KC_TAB);
763 if (!td_ta->sticky)
764 layer_off (ARRW);
765}
766
767static void ang_tap_dance_tmux_finished (qk_tap_dance_state_t *state, void *user_data) {
768 if (state->count == 1) {
769 register_code(KC_LALT);
770 register_code(KC_SPC);
771 unregister_code(KC_SPC);
772 unregister_code(KC_LALT);
773 } else {
774 register_code(KC_LCTL);
775 register_code(KC_A);
776 unregister_code(KC_A);
777 unregister_code(KC_LCTL);
778 }
779}
780
781static void ang_tap_dance_tmux_pane_select (qk_tap_dance_state_t *state, void *user_data) {
782 uint8_t kc = KC_P;
783
784 if (state->count >= 2) {
785 kc = KC_Z;
786 }
787
788 register_code(KC_LALT);
789 register_code(KC_SPC);
790 unregister_code(KC_SPC);
791 unregister_code(KC_LALT);
792
793 register_code(kc);
794 unregister_code(kc);
795}
796
797static void
798_td_sr_each (qk_tap_dance_state_t *state, void *user_data) {
799 skip_leds = true;
800
801 switch (state->count) {
802 case 1:
803 ergodox_right_led_3_on ();
804 break;
805 case 2:
806 ergodox_right_led_2_on ();
807 break;
808 case 3:
809 ergodox_right_led_1_on ();
810 break;
811 case 4:
812 ergodox_right_led_3_off ();
813 wait_ms (50);
814 ergodox_right_led_2_off ();
815 wait_ms (50);
816 ergodox_right_led_1_off ();
817 break;
818 }
819}
820
821static void
822_td_sr_finished (qk_tap_dance_state_t *state, void *user_data) {
823 if (state->count == 1) {
824 register_code (KC_MSTP);
825 }
826 if (state->count >= 4) {
827 uprintf("CMD:reflash\n");
828 wait_ms (1000);
829 reset_keyboard ();
830 reset_tap_dance (state);
831 }
832}
833
834static void
835_td_sr_reset (qk_tap_dance_state_t *state, void *user_data) {
836 ergodox_right_led_1_off ();
837 wait_ms (50);
838 ergodox_right_led_2_off ();
839 wait_ms (50);
840 ergodox_right_led_3_off ();
841
842 if (state->count == 1) {
843 unregister_code (KC_MSTP);
844 }
845}
846
847qk_tap_dance_action_t tap_dance_actions[] = {
848 [CT_CLN] = ACTION_TAP_DANCE_DOUBLE (KC_COLN, KC_SCLN)
849 ,[CT_TA] = {
850 .fn = { NULL, ang_tap_dance_ta_finished, ang_tap_dance_ta_reset },
851 .user_data = (void *)&((td_ta_state_t) { false, false })
852 }
853 ,[CT_LBP] = ACTION_TAP_DANCE_DOUBLE (KC_LBRC, KC_LPRN)
854 ,[CT_RBP] = ACTION_TAP_DANCE_DOUBLE (KC_RBRC, KC_RPRN)
855 ,[CT_TMUX]= ACTION_TAP_DANCE_FN (ang_tap_dance_tmux_finished)
856 ,[CT_TPS] = ACTION_TAP_DANCE_FN (ang_tap_dance_tmux_pane_select)
857 ,[CT_SR] = ACTION_TAP_DANCE_FN_ADVANCED (_td_sr_each, _td_sr_finished, _td_sr_reset)
858};
859
860// Runs constantly in the background, in a loop.
861void matrix_scan_user(void) {
862 uint8_t layer = biton32(layer_state);
863 bool is_arrow = false;
864
865 if (gui_timer && timer_elapsed (gui_timer) > TAPPING_TERM)
866 unregister_code (KC_LGUI);
867
868 if (!skip_leds) {
869 if (layer == HUN) {
870 ergodox_right_led_2_on();
871 ergodox_right_led_3_on();
872 } else if (layer == NMDIA) {
873 ergodox_right_led_1_on();
874 ergodox_right_led_2_on();
875 } else if (layer == PLVR) {
876 ergodox_right_led_1_on ();
877 ergodox_right_led_2_on ();
878 ergodox_right_led_3_on ();
879 } else if (layer == ADORE) {
880 ergodox_right_led_1_on ();
881 ergodox_right_led_2_on ();
882 ergodox_right_led_3_on ();
883
884 ergodox_right_led_2_set (LED_BRIGHTNESS_HI);
885 }
886 }
887
888 if (layer_state & (1UL << ARRW)) {
889 if (!skip_leds) {
890 ergodox_right_led_1_on ();
891 ergodox_right_led_3_on ();
892 }
893 is_arrow = true;
894 }
895
896 if (!skip_leds) {
897 if (keyboard_report->mods & MOD_BIT(KC_LSFT) ||
898 ((get_oneshot_mods() & MOD_BIT(KC_LSFT)) && !has_oneshot_mods_timed_out())) {
899 ergodox_right_led_1_set (LED_BRIGHTNESS_HI);
900 ergodox_right_led_1_on ();
901 } else {
902 ergodox_right_led_1_set (LED_BRIGHTNESS_LO);
903 if (layer != NMDIA && layer != PLVR && layer != ADORE && !is_arrow)
904 ergodox_right_led_1_off ();
905 }
906
907 if (keyboard_report->mods & MOD_BIT(KC_LALT) ||
908 ((get_oneshot_mods() & MOD_BIT(KC_LALT)) && !has_oneshot_mods_timed_out())) {
909 ergodox_right_led_2_set (LED_BRIGHTNESS_HI);
910 ergodox_right_led_2_on ();
911 } else {
912 ergodox_right_led_2_set (LED_BRIGHTNESS_LO);
913 if (layer != HUN && layer != NMDIA && layer != PLVR && layer != ADORE)
914 ergodox_right_led_2_off ();
915 }
916
917 if (keyboard_report->mods & MOD_BIT(KC_LCTRL) ||
918 ((get_oneshot_mods() & MOD_BIT(KC_LCTRL)) && !has_oneshot_mods_timed_out())) {
919 ergodox_right_led_3_set (LED_BRIGHTNESS_HI);
920 ergodox_right_led_3_on ();
921 } else {
922 ergodox_right_led_3_set (LED_BRIGHTNESS_LO);
923 if (layer != HUN && layer != PLVR && layer != ADORE && !is_arrow)
924 ergodox_right_led_3_off ();
925 }
926 }
927
928 LEADER_DICTIONARY() {
929 leading = false;
930 leader_end ();
931
932 SEQ_ONE_KEY (KC_C) {
933 ang_tap (LSFT(KC_C), KC_S, KC_I, KC_L, KC_L, KC_RALT, KC_QUOT, KC_A, KC_M, KC_A, KC_S,
934 KC_S, KC_Z, KC_O, KC_N, KC_Y, KC_K, KC_RALT, KC_QUOT, KC_A, KC_M, 0);
935 }
936
937 SEQ_ONE_KEY (KC_G) {
938 ang_tap (LSFT(KC_G), KC_E, KC_J, KC_G, KC_RALT, KC_EQL, KC_O,
939 KC_RALT, KC_EQL, KC_O,
940 KC_RALT, KC_EQL, KC_O, 0);
941 }
942
943#if KEYLOGGER_ENABLE
944 SEQ_ONE_KEY (KC_D) {
945 ergodox_led_all_on();
946 wait_ms(100);
947 ergodox_led_all_off();
948 log_enable = !log_enable;
949 }
950#endif
951
952 SEQ_ONE_KEY (KC_T) {
953 time_travel = !time_travel;
954 }
955
956 SEQ_ONE_KEY (KC_U) {
957 qk_ucis_start();
958 }
959
960 SEQ_ONE_KEY (KC_V) {
961 SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ (" QMK_VERSION "/" LAYOUT_ergodox_VERSION ")");
962 }
963
964 SEQ_ONE_KEY (KC_L) {
965 /* λ */
966 unicode_input_start();
967 register_hex(0x03bb);
968 unicode_input_finish();
969 }
970
971 SEQ_ONE_KEY (KC_Y) {
972 ang_tap (KC_BSLS, KC_O, KC_SLSH, 0);
973 }
974
975 SEQ_ONE_KEY (KC_S) {
976 unicode_input_start(); register_hex(0xaf); unicode_input_finish();
977 TAP_ONCE (KC_BSLS);
978 register_code (KC_RSFT); TAP_ONCE (KC_MINS); TAP_ONCE (KC_9); unregister_code (KC_RSFT);
979 unicode_input_start (); register_hex(0x30c4); unicode_input_finish();
980 register_code (KC_RSFT); TAP_ONCE (KC_0); TAP_ONCE (KC_MINS); unregister_code (KC_RSFT);
981 TAP_ONCE (KC_SLSH);
982 unicode_input_start (); register_hex(0xaf); unicode_input_finish();
983 }
984
985 SEQ_TWO_KEYS (KC_W, KC_M) {
986 uprintf("CMD:wm\n");
987 }
988
989 SEQ_ONE_KEY (KC_A) {
990 if (is_adore == 0) {
991 default_layer_and (0);
992 default_layer_or ((1UL << ADORE));
993 eeconfig_update_default_layer ((1UL << ADORE));
994 is_adore = 1;
995
996 ergodox_led_all_off ();
997 ergodox_right_led_3_on ();
998 wait_ms (100);
999 ergodox_right_led_2_on ();
1000 wait_ms (100);
1001 ergodox_right_led_3_off ();
1002 ergodox_right_led_1_on ();
1003 wait_ms (100);
1004 ergodox_right_led_2_off ();
1005 wait_ms (100);
1006 ergodox_right_led_1_off ();
1007 } else {
1008 is_adore = 0;
1009 default_layer_and (0);
1010 default_layer_or (1UL << BASE);
1011 eeconfig_update_default_layer ((1UL << BASE));
1012
1013 ergodox_led_all_off ();
1014 ergodox_right_led_1_on ();
1015 wait_ms (100);
1016 ergodox_right_led_2_on ();
1017 wait_ms (100);
1018 ergodox_right_led_1_off ();
1019 ergodox_right_led_3_on ();
1020 wait_ms (100);
1021 ergodox_right_led_2_off ();
1022 wait_ms (100);
1023 ergodox_right_led_3_off ();
1024 }
1025 }
1026 }
1027}
1028
1029static uint16_t last4[4];
1030
1031const qk_ucis_symbol_t ucis_symbol_table[] = UCIS_TABLE
1032(
1033 UCIS_SYM("poop", 0x1f4a9),
1034 UCIS_SYM("rofl", 0x1f923),
1035 UCIS_SYM("kiss", 0x1f619),
1036 UCIS_SYM("snowman", 0x2603),
1037 UCIS_SYM("coffee", 0x2615),
1038 UCIS_SYM("heart", 0x2764),
1039 UCIS_SYM("bolt", 0x26a1),
1040 UCIS_SYM("pi", 0x03c0),
1041 UCIS_SYM("mouse", 0x1f401),
1042 UCIS_SYM("micro", 0x00b5),
1043 UCIS_SYM("tm", 0x2122)
1044);
1045
1046bool process_record_user (uint16_t keycode, keyrecord_t *record) {
1047#if KEYLOGGER_ENABLE
1048 if (log_enable) {
1049 uint8_t layer = biton32(layer_state);
1050
1051 if ((layer == ADORE) || (layer == BASE))
1052 uprintf ("KL: col=%02d, row=%02d, pressed=%d, layer=%s\n", record->event.key.col,
1053 record->event.key.row, record->event.pressed, (is_adore) ? "ADORE" : "Dvorak");
1054 }
1055#endif
1056
1057 if (keycode == KC_ESC && record->event.pressed) {
1058 bool queue = true;
1059
1060 if ((get_oneshot_mods ()) && !has_oneshot_mods_timed_out ()) {
1061 clear_oneshot_mods ();
1062 queue = false;
1063 }
1064 if (layer_state & (1UL<<HUN)) {
1065 layer_off (HUN);
1066 queue = false;
1067 }
1068 return queue;
1069 }
1070
1071 if (time_travel && !record->event.pressed) {
1072 uint8_t p;
1073
1074 // shift cache one to the left
1075 for (p = 0; p < 3; p++) {
1076 last4[p] = last4[p + 1];
1077 }
1078 last4[3] = keycode;
1079
1080 if (last4[0] == KC_D && last4[1] == KC_A && last4[2] == KC_T && last4[3] == KC_E) {
1081 ang_tap (KC_E, KC_SPC, KC_MINS, KC_D, KC_SPC, KC_QUOT, 0);
1082 register_code (KC_RSFT);
1083 register_code (KC_EQL);
1084 unregister_code (KC_EQL);
1085 unregister_code (KC_RSFT);
1086
1087 ang_tap (KC_4, KC_SPC, KC_D, KC_A, KC_Y, KC_S, KC_QUOT, 0);
1088
1089 return false;
1090 }
1091 }
1092
1093 return true;
1094}
1095
1096void qk_ucis_symbol_fallback (void) {
1097 for (uint8_t i = 0; i < qk_ucis_state.count - 1; i++) {
1098 uint8_t code;
1099
1100 if ((qk_ucis_state.codes[i] >= M(A_1)) && (qk_ucis_state.codes[i] <= M(A_0)))
1101 code = qk_ucis_state.codes[i] - M(A_1) + KC_1;
1102 else
1103 code = qk_ucis_state.codes[i];
1104 register_code(code);
1105 unregister_code(code);
1106 wait_ms (10);
1107 }
1108}