]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboards/ergodox_ez/keymaps/algernon/keymap.c
Merge pull request #584 from algernon/ergodox-ez/algernon
[qmk_firmware.git] / keyboards / ergodox_ez / keymaps / algernon / keymap.c
1 /*
2  * algernon's ErgoDox EZ layout, please see the readme.md file!
3  */
4
5 #include "ergodox_ez.h"
6 #include "led.h"
7 #include "debug.h"
8 #include "action_layer.h"
9 #include "action_util.h"
10 #include "mousekey.h"
11 #include "timer.h"
12 #include "keymap_plover.h"
13 #include "eeconfig.h"
14
15 /* Layers */
16
17 enum {
18   BASE = 0,
19   ADORE,
20   ARRW,
21   APPSEL,
22   HUN,
23   NMDIA,
24   OHLFT,
25   OHRGT,
26   PLVR,
27 };
28
29 /* Macros */
30
31 enum {
32   NONE = 0,
33   // Buttons that do extra stuff
34   A_GUI,
35   A_PLVR,
36   A_ESC,
37   A_MPN,
38
39   // Function / number keys
40   KF_1, // 1, F1
41   KF_2, // 2, F2
42   KF_3, // ...
43   KF_4,
44   KF_5,
45   KF_6,
46   KF_7,
47   KF_8,
48   KF_9,
49   KF_10,
50   KF_11, // =, F11
51
52   // Application select keys
53   APP_SLK, // Slack
54   APP_EMCS, // Emacs
55   APP_TERM, // Terminal
56   APP_CHRM, // Chrome
57   APP_MSIC, // Music
58
59   // Diagonal mouse movement
60   A_MUL,
61   A_MUR,
62   A_MDL,
63   A_MDR,
64
65   // Hungarian layer keys
66   HU_AA, // Á
67   HU_OO, // Ó
68   HU_EE, // É
69   HU_UU, // Ú
70   HU_II, // Í
71   HU_OE, // Ö
72   HU_UE, // Ü
73   HU_OEE, // Ő
74   HU_UEE, // Ű
75
76   // One-handed layout specials
77   OH_BSSPC,
78   OH_ENTSFT,
79   OH_BASE,
80   OH_LEFT,
81   OH_RIGHT,
82 };
83
84 /* Fn keys */
85
86 enum {
87   F_BSE = 0,
88   F_HUN,
89   F_GUI,
90   F_SFT,
91   F_ALT,
92   F_CTRL
93 };
94
95 /* Custom keycodes */
96
97 enum {
98   CT_CLN = 0,
99   CT_MNS,
100   CT_TA,
101 };
102
103 /* States & timers */
104
105 uint16_t gui_timer = 0;
106
107 uint16_t kf_timers[12];
108
109 uint16_t oh_base_timer = 0;
110 uint16_t oh_bsspc_timer = 0;
111 uint16_t oh_entsft_timer = 0;
112
113 #define OH_BLINK_INTERVAL 500
114
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;
119
120 #if KEYLOGGER_ENABLE
121 bool log_enable = false;
122 #endif
123
124 bool time_travel = false;
125
126 /* The Keymap */
127
128 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
129
130 /* Keymap 0: Base Layer
131  *
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  *                                  `--------------------'           `--------------------'
150  */
151 [BASE] = KEYMAP(
152 // left hand
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)
158
159                                                             ,F(F_ALT),F(F_GUI)
160                                                                      ,F(F_CTRL)
161                                                     ,KC_BSPC,F(F_SFT),M(A_ESC)
162
163                                                                 // right hand
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
169
170                                                                ,OSL(NMDIA),M(OH_LEFT)
171                                                                ,KC_LEAD
172                                                                ,F(F_HUN)  ,KC_ENT ,KC_SPC
173     ),
174
175 /* Keymap 1: Adore layer
176  *
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  *                                  `--------------------'           `--------------------'
195  */
196 [ADORE] = KEYMAP(
197 // left hand
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)
203
204                                                             ,F(F_ALT),F(F_GUI)
205                                                                      ,F(F_CTRL)
206                                                     ,KC_BSPC,F(F_SFT),M(A_ESC)
207
208                                                                 // right hand
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
214
215                                                                ,OSL(NMDIA),M(OH_LEFT)
216                                                                ,KC_LEAD
217                                                                ,F(F_HUN)  ,KC_ENT ,KC_SPC
218     ),
219
220 /* Keymap 2: Arrow layer
221  *
222  * ,-----------------------------------------------------.           ,-----------------------------------------------------.
223  * |           |      |      |      |      |      |      |           |      |      |      |      |      |      |           |
224  * |-----------+------+------+------+------+-------------|           |------+------+------+------+------+------+-----------|
225  * |           |      |      |      |      |      |      |           |      |      | Home |  Up  |  End |      |           |
226  * |-----------+------+------+------+------+------|      |           |      |------+------+------+------+------+-----------|
227  * |           |      |      |      |      |      |------|           |------|      | Left | Down | Rght |      |           |
228  * |-----------+------+------+------+------+------|      |           |      |------+------+------+------+------+-----------|
229  * |           |      |      |      |      |      |      |           |      |      |      |      |      |      |           |
230  * `-----------+------+------+------+------+-------------'           `-------------+------+------+------+------+-----------'
231  *      |      |      |      |      |      |                                       |      |      |      |      |      |
232  *      `----------------------------------'                                       `----------------------------------'
233  *                                         ,-------------.           ,-------------.
234  *                                         |      |      |           |      |      |
235  *                                  ,------|------|------|           |------+------+------.
236  *                                  |      |      |      |           |      |      |      |
237  *                                  |      |      |------|           |------| PgUp | PgDn |
238  *                                  |      |      |      |           |      |      |      |
239  *                                  `--------------------'           `--------------------'
240  */
241
242 [ARRW] = KEYMAP(
243 // left hand
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
249
250                                              ,KC_TRNS ,KC_TRNS
251                                                       ,KC_TRNS
252                                     ,KC_TRNS ,KC_TRNS ,KC_TRNS
253
254                                                                 // right hand
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
260
261                                                                ,KC_TRNS ,KC_TRNS
262                                                                ,KC_TRNS
263                                                                ,KC_TRNS ,KC_PGUP ,KC_PGDN
264     ),
265
266 /* Keymap 3: Application select layer
267  *
268  * ,-----------------------------------------------------.           ,-----------------------------------------------------.
269  * |           |Music |Slack |Emacs |Term  |Chrome|      |           |      |      |      |      |      |      |           |
270  * |-----------+------+------+------+------+-------------|           |------+------+------+------+------+------+-----------|
271  * |           |      |      |      |      |      |      |           |      |      |      |      |      |      |           |
272  * |-----------+------+------+------+------+------|      |           |      |------+------+------+------+------+-----------|
273  * |           |      |      |      |      |      |------|           |------|      |      |      |      |      |           |
274  * |-----------+------+------+------+------+------|      |           |      |------+------+------+------+------+-----------|
275  * |           |      |      |      |      |      |      |           |      |      |      |      |      |      |           |
276  * `-----------+------+------+------+------+-------------'           `-------------+------+------+------+------+-----------'
277  *      |      |      |      |      |      |                                       |      |      |      |      |      |
278  *      `----------------------------------'                                       `----------------------------------'
279  *                                         ,-------------.           ,-------------.
280  *                                         |      |      |           |      |      |
281  *                                  ,------|------|------|           |------+------+------.
282  *                                  |      |      |      |           |      |      |      |
283  *                                  |      |      |------|           |------|      |      |
284  *                                  |      |      |      |           |      |      |      |
285  *                                  `--------------------'           `--------------------'
286  */
287
288 [APPSEL] = KEYMAP(
289 // left hand
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
295
296                                              ,KC_TRNS ,KC_TRNS
297                                                       ,KC_TRNS
298                                     ,KC_TRNS ,KC_TRNS ,KC_TRNS
299
300                                                                 // right hand
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
306
307                                                                ,KC_TRNS ,KC_TRNS
308                                                                ,KC_TRNS
309                                                                ,KC_TRNS ,KC_TRNS  ,KC_TRNS
310     ),
311
312
313 /* Keymap 4: Hungarian Layer
314  *
315  * ,-----------------------------------------------------.           ,-----------------------------------------------------.
316  * |           |      |      |      |      |      |      |           |      |      |      |      |      |      |           |
317  * |-----------+------+------+------+------+-------------|           |------+------+------+------+------+------+-----------|
318  * |           |      |  Ő   |      |  Ű   |      |      |           |      |      |      |      |      |      |           |
319  * |-----------+------+------+------+------+------|      |           |      |------+------+------+------+------+-----------|
320  * |           |   Á  |  Ó   |  É   |  Ú   |  Í   |------|           |------|      |      |      |      |      |           |
321  * |-----------+------+------+------+------+------|      |           |      |------+------+------+------+------+-----------|
322  * |           |      |  Ö   |      |  Ü   |      |      |           |      |      |      |      |      |      |           |
323  * `-----------+------+------+------+------+-------------'           `-------------+------+------+------+------+-----------'
324  *      |      |      |      |      |      |                                       |      |      |      |      |      |
325  *      `----------------------------------'                                       `----------------------------------'
326  *                                         ,-------------.           ,-------------.
327  *                                         |      |      |           |      |      |
328  *                                  ,------|------|------|           |------+------+------.
329  *                                  |      |      |      |           |      |      |      |
330  *                                  |      |      |------|           |------|      |      |
331  *                                  |      |      |      |           | BASE |      |      |
332  *                                  `--------------------'           `--------------------'
333  */
334
335 [HUN] = KEYMAP(
336 // left hand
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
342
343                                              ,KC_NO   ,KC_NO
344                                                       ,KC_NO
345                                     ,KC_NO   ,KC_TRNS ,KC_TRNS
346
347                                                                 // right hand
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
353
354                                                                ,KC_NO   ,KC_NO
355                                                                ,KC_NO
356                                                                ,F(F_BSE),KC_TRNS  ,KC_TRNS
357     ),
358
359 /* Keymap 5: Navigation & Media layer
360  *
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  *                                  `--------------------'           `--------------------'
379  */
380 [NMDIA] = KEYMAP(
381 // left hand
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
387                                                         ,KC_MUTE ,KC_VOLU
388                                                                  ,KC_VOLD
389                                                  ,KC_SPC,KC_ENTER,M(A_ESC)
390
391                                                                      // right hand
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
397
398                                                                      ,KC_TRNS   ,KC_MS_BTN3
399                                                                      ,KC_MPRV
400                                                                      ,KC_MNXT   ,KC_BTN1 ,KC_BTN2
401     ),
402
403 /* Keymap 6: One-handed, left side
404  *
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  *     `-----------------------------------'
416  *                                         ,-------------.
417  *                                         | LAlt | GUI  |
418  *                                  ,------|------|------|
419  *                                  |BackSp|LShift| Ctrl |
420  *                                  |      |      |------|
421  *                                  |Space |Enter |OTHER |
422  *                                  `--------------------'
423  */
424 [OHLFT] = KEYMAP(
425 // left hand
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)
431
432                                                                 ,KC_TRNS     ,KC_TRNS
433                                                                              ,KC_TRNS
434                                                     ,M(OH_BSSPC),M(OH_ENTSFT),M(OH_RIGHT)
435
436                                                                 // right hand
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
442
443                                                                ,KC_NO   ,KC_NO
444                                                                ,KC_NO
445                                                                ,KC_NO   ,KC_NO  ,KC_NO
446     ),
447
448 /* Keymap 7: One-handed, right side
449  *
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  *     `-----------------------------------'
461  *                                         ,-------------.
462  *                                         | LAlt | GUI  |
463  *                                  ,------|------|------|
464  *                                  |BackSp|LShift| Ctrl |
465  *                                  |      |      |------|
466  *                                  |Space |Enter |OTHER |
467  *                                  `--------------------'
468  */
469 [OHRGT] = KEYMAP(
470 // left hand
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)
476
477                                                                 ,KC_TRNS     ,KC_TRNS
478                                                                              ,KC_TRNS
479                                                     ,M(OH_BSSPC),M(OH_ENTSFT),M(OH_LEFT)
480
481                                                                 // right hand
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
487
488                                                                ,KC_NO   ,KC_NO
489                                                                ,KC_NO
490                                                                ,KC_NO   ,KC_NO  ,KC_NO
491     ),
492
493 /* Keymap 8: Steno for Plover
494  *
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  *                                        ,-------------.       ,-------------.
507  *                                        |      |      |       |      |      |
508  *                                 ,------|------|------|       |------+------+------.
509  *                                 |      |      |      |       |      |      |      |
510  *                                 |   A  |   O  |------|       |------|  E   |  U   |
511  *                                 |      |      |      |       |      |      |      |
512  *                                 `--------------------'       `--------------------'
513  */
514
515 [PLVR] = KEYMAP(
516 // left hand
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,
522                                            KC_NO, KC_NO,
523                                            KC_NO,
524                                            PV_A,  PV_O,  KC_NO,
525
526                                                  // right hand
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,
532                                            KC_NO,      KC_NO,
533                                            KC_NO,
534                                            KC_NO,PV_E, PV_U
535  ),
536
537 };
538
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)
546 };
547
548 void toggle_steno(int pressed)
549 {
550   uint8_t layer = biton32(layer_state);
551
552   if (pressed) {
553     if (layer != PLVR) layer_on(PLVR); else layer_off(PLVR);
554
555     register_code(PV_LP);
556     register_code(PV_LH);
557     register_code(PV_LR);
558     register_code(PV_O);
559     register_code(PV_RL);
560     register_code(PV_RG);
561   } else {
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);
568   }
569 }
570
571 macro_t *ang_do_hun (keyrecord_t *record, uint16_t accent, uint16_t hun_char)
572 {
573   uint8_t need_shift = 0;
574   uint8_t hold_shift = 0;
575
576   if (!record->event.pressed)
577     return MACRO_NONE;
578
579   layer_off (HUN);
580
581   if (keyboard_report->mods & MOD_BIT (KC_LSFT)) {
582     hold_shift = 1;
583     need_shift = 1;
584     unregister_code (KC_LSFT);
585   }
586   if ((get_oneshot_mods () & MOD_BIT(KC_LSFT)) && !has_oneshot_mods_timed_out ()) {
587     need_shift = 1;
588     hold_shift = 0;
589     unregister_code (KC_LSFT);
590   }
591
592   clear_oneshot_mods ();
593
594   register_code (KC_RALT);
595   unregister_code (KC_RALT);
596   if (accent == (KC_DQT)) {
597     register_code (KC_RSFT);
598   }
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);
605   }
606   register_code (hun_char);
607   unregister_code (hun_char);
608   if (need_shift || accent == (KC_DQT))
609     unregister_code (KC_RSFT);
610   if (hold_shift)
611     register_code (KC_LSFT);
612
613   return MACRO_NONE;
614 }
615
616 void ang_handle_kf (keyrecord_t *record, uint8_t id)
617 {
618   uint8_t code = id - KF_1;
619
620   if (record->event.pressed) {
621     kf_timers[code] = timer_read ();
622   } else {
623     uint8_t kc;
624
625     if (timer_elapsed (kf_timers[code]) > TAPPING_TERM) {
626       // Long press
627       kc = KC_F1 + code;
628     } else {
629       if (id == KF_11)
630         kc = KC_EQL;
631       else
632         kc = KC_1 + code;
633     }
634
635     register_code (kc);
636     unregister_code (kc);
637   }
638 }
639
640 const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
641 {
642       switch(id) {
643       case A_ESC:
644         if (record->event.pressed) {
645           if ((get_oneshot_mods ()) && !has_oneshot_mods_timed_out ()) {
646             clear_oneshot_mods ();
647           } else {
648             register_code (KC_ESC);
649           }
650           layer_off (HUN);
651         } else {
652           unregister_code (KC_ESC);
653         }
654         break;
655
656       case A_MPN:
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());
661
662             if (oneshot)
663               clear_oneshot_mods ();
664             unregister_code (KC_LSFT);
665
666             register_code (KC_MPRV);
667             unregister_code (KC_MPRV);
668
669             if (!oneshot)
670               register_code (KC_LSFT);
671           } else {
672             return MACRO (T(MNXT), END);
673           }
674         }
675         break;
676
677         /* Hungarian layer */
678       case HU_AA:
679         return ang_do_hun (record, KC_QUOT, KC_A);
680       case HU_OO:
681         return ang_do_hun (record, KC_QUOT, KC_O);
682       case HU_EE:
683         return ang_do_hun (record, KC_QUOT, KC_E);
684       case HU_UU:
685         return ang_do_hun (record, KC_QUOT, KC_U);
686       case HU_II:
687         return ang_do_hun (record, KC_QUOT, KC_I);
688       case HU_OE:
689         return ang_do_hun (record, KC_DQT, KC_O);
690       case HU_UE:
691         return ang_do_hun (record, KC_DQT, KC_U);
692       case HU_OEE:
693         return ang_do_hun (record, KC_EQL, KC_O);
694       case HU_UEE:
695         return ang_do_hun (record, KC_EQL, KC_U);
696
697         /* Mouse movement */
698       case A_MUL:
699         if (record->event.pressed) {
700           mousekey_on(KC_MS_UP);
701           mousekey_on(KC_MS_LEFT);
702         } else {
703           mousekey_off(KC_MS_UP);
704           mousekey_off(KC_MS_LEFT);
705         }
706         mousekey_send();
707         break;
708
709       case A_MUR:
710         if (record->event.pressed) {
711           mousekey_on(KC_MS_UP);
712           mousekey_on(KC_MS_RIGHT);
713         } else {
714           mousekey_off(KC_MS_UP);
715           mousekey_off(KC_MS_RIGHT);
716         }
717         mousekey_send();
718         break;
719
720       case A_MDL:
721         if (record->event.pressed) {
722           mousekey_on(KC_MS_DOWN);
723           mousekey_on(KC_MS_LEFT);
724         } else {
725           mousekey_off(KC_MS_DOWN);
726           mousekey_off(KC_MS_LEFT);
727         }
728         mousekey_send();
729         break;
730
731       case A_MDR:
732         if (record->event.pressed) {
733           mousekey_on(KC_MS_DOWN);
734           mousekey_on(KC_MS_RIGHT);
735         } else {
736           mousekey_off(KC_MS_DOWN);
737           mousekey_off(KC_MS_RIGHT);
738         }
739         mousekey_send();
740         break;
741
742         /* Plover base */
743       case A_PLVR:
744         toggle_steno(record->event.pressed);
745         break;
746
747         /* GUI & AppSel */
748       case A_GUI:
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);
754               layer_on (APPSEL);
755               set_oneshot_layer (APPSEL, ONESHOT_START);
756             }
757           } else {
758             record->tap.count = 0;
759           }
760           gui_timer = 0;
761         } else {
762           if (record->tap.count >= 2)
763             {
764               unregister_code (KC_W);
765               clear_oneshot_layer_state (ONESHOT_PRESSED);
766             }
767           gui_timer = timer_read ();
768         }
769         break;
770
771       case APP_SLK:
772         return MACRODOWN(T(S), T(L), T(A), T(C), T(K), T(ENT), END);
773
774       case APP_EMCS:
775         return MACRODOWN(T(E), T(M), T(A), T(C), T(S), T(ENT), END);
776
777       case APP_TERM:
778         return MACRODOWN(T(T), T(E), T(R), T(M), T(ENT), END);
779
780       case APP_CHRM:
781         return MACRODOWN(T(C), T(H), T(R), T(O), T(M), T(ENT), END);
782
783       case APP_MSIC:
784         return MACRODOWN(T(R), T(H), T(Y), T(T), T(H), T(M), T(B), T(O), T(X), T(ENT), END);
785
786         /* Function keys */
787       case KF_1 ... KF_11:
788         ang_handle_kf (record, id);
789         break;
790
791         /* 1HAND layout */
792       case OH_BASE:
793         if (record->event.pressed) {
794           oh_base_timer = timer_read ();
795         } else {
796           if (timer_elapsed (oh_base_timer) > TAPPING_TERM) {
797             layer_clear ();
798           } else {
799             return MACRO (T(APP), END);
800           }
801         }
802         break;
803
804       case OH_BSSPC:
805         if (record->event.pressed) {
806           oh_bsspc_timer = timer_read ();
807         } else {
808           if (timer_elapsed (oh_bsspc_timer) > TAPPING_TERM) {
809             return MACRO (T(BSPC), END);
810           } else {
811             return MACRO (T(SPC), END);
812           }
813         }
814         break;
815
816       case OH_ENTSFT:
817         if (record->event.pressed) {
818           oh_entsft_timer = timer_read ();
819         } else {
820           if (timer_elapsed (oh_entsft_timer) > TAPPING_TERM) {
821             if (keyboard_report->mods & MOD_BIT(KC_LSFT))
822               unregister_code (KC_LSFT);
823             else
824               register_code (KC_LSFT);
825           } else {
826             return MACRO (T(ENT), END);
827           }
828         }
829         break;
830
831       case OH_LEFT:
832         if (record->event.pressed) {
833           layer_move (OHLFT);
834           oh_left_blink = 1;
835           oh_left_blink_timer = timer_read ();
836           ergodox_right_led_1_on ();
837         }
838         break;
839
840       case OH_RIGHT:
841         if (record->event.pressed) {
842           layer_move (OHRGT);
843           oh_right_blink = 1;
844           oh_right_blink_timer = timer_read ();
845           ergodox_right_led_3_on ();
846         }
847         break;
848       }
849       return MACRO_NONE;
850 };
851
852 uint8_t is_adore = 0;
853
854 // Runs just one time when the keyboard initializes.
855 void matrix_init_user(void) {
856   uint8_t dl;
857
858   ergodox_led_all_on();
859   for (int i = LED_BRIGHTNESS_HI; i > LED_BRIGHTNESS_LO; i--) {
860     ergodox_led_all_set (i);
861     _delay_ms (5);
862   }
863   _delay_ms(1000);
864   for (int i = LED_BRIGHTNESS_LO; i > 0; i--) {
865     ergodox_led_all_set (i);
866     _delay_ms (10);
867   }
868   ergodox_led_all_off();
869
870   if (!eeconfig_is_enabled())
871     eeconfig_init();
872   dl = eeconfig_read_default_layer ();
873   if (dl == (1UL << ADORE))
874     is_adore = 1;
875 };
876
877 LEADER_EXTERNS();
878
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);
886   _delay_ms (100);
887 }
888
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]);
893     _delay_ms (50);
894   }
895 }
896
897 #define TAP_ONCE(code) \
898   register_code (code); \
899   unregister_code (code)
900
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);
907   }
908 }
909
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);
916   }
917 }
918
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);
925   }
926 }
927
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);
934   }
935 }
936
937 typedef struct {
938   bool layer_toggle;
939   bool sticky;
940   bool finished_once;
941 } td_ta_state_t;
942
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;
945
946   if (td_ta->finished_once) {
947     return;
948   }
949
950   if (td_ta->sticky) {
951     td_ta->sticky = false;
952     td_ta->layer_toggle = false;
953     layer_off (ARRW);
954     return;
955   }
956
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;
962   } else {
963     td_ta->layer_toggle = true;
964     layer_on (ARRW);
965     td_ta->sticky = (state->count == 2);
966   }
967 }
968
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;
971
972   if (!td_ta->layer_toggle)
973     unregister_code (KC_TAB);
974   if (!td_ta->sticky)
975     layer_off (ARRW);
976
977   td_ta->finished_once = false;
978 }
979
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)
983   ,[CT_TA]  = {
984      .fn = { NULL, ang_tap_dance_ta_finished, ang_tap_dance_ta_reset },
985      .user_data = (void *)&((td_ta_state_t) { false, false, false })
986    }
987 };
988
989 // Runs constantly in the background, in a loop.
990 void matrix_scan_user(void) {
991   uint8_t layer = biton32(layer_state);
992
993   if (gui_timer && timer_elapsed (gui_timer) > TAPPING_TERM)
994     unregister_code (KC_LGUI);
995
996   if (layer != OHLFT)
997     oh_left_blink = 0;
998   if (layer != OHRGT)
999     oh_right_blink = 0;
1000
1001   if (layer == HUN) {
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 ();
1015
1016     ergodox_right_led_2_set (LED_BRIGHTNESS_HI);
1017   }
1018
1019   if (layer == OHLFT || layer == OHRGT) {
1020     ergodox_right_led_2_on();
1021
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 ();
1026       }
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 ();
1030       }
1031     }
1032
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 ();
1037       }
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 ();
1041       }
1042     }
1043   }
1044
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 ();
1049   } else {
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 ();
1053   }
1054
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 ();
1059   } else {
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 ();
1063   }
1064
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 ();
1069   } else {
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 ();
1073   }
1074
1075   LEADER_DICTIONARY() {
1076     leading = false;
1077     leader_end ();
1078
1079 #if KEYLOGGER_ENABLE
1080     SEQ_ONE_KEY (KC_D) {
1081       ergodox_led_all_on();
1082       _delay_ms(100);
1083       ergodox_led_all_off();
1084       log_enable = !log_enable;
1085     }
1086 #endif
1087
1088     SEQ_ONE_KEY (KC_T) {
1089       time_travel = !time_travel;
1090     }
1091
1092     SEQ_ONE_KEY (KC_U) {
1093       ang_do_unicode ();
1094     }
1095
1096     SEQ_ONE_KEY (KC_V) {
1097       SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ (" QMK_VERSION "/" KEYMAP_VERSION ")");
1098     }
1099
1100     SEQ_ONE_KEY (KC_L) {
1101       /* λ */
1102       ang_do_unicode ();
1103
1104       uint16_t codes[] = {KC_0, KC_3, KC_B, KC_B, KC_ENT, 0};
1105       ang_tap (codes);
1106     }
1107
1108     SEQ_ONE_KEY (KC_Y) {
1109       uint16_t codes[] = {KC_BSLS, KC_O, KC_SLSH, 0};
1110       ang_tap (codes);
1111     }
1112
1113     SEQ_ONE_KEY (KC_S) {
1114       ang_do_unicode (); TAP_ONCE (KC_A); TAP_ONCE (KC_F); TAP_ONCE (KC_SPC);
1115       TAP_ONCE (KC_BSLS);
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);
1119       TAP_ONCE (KC_SLSH);
1120       ang_do_unicode (); TAP_ONCE (KC_A); TAP_ONCE (KC_F); TAP_ONCE (KC_SPC);
1121     }
1122
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);
1128
1129       _delay_ms (1000);
1130
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};
1132       ang_tap (codes);
1133       register_code (KC_LGUI);
1134       register_code (KC_UP);
1135       unregister_code (KC_UP);
1136       unregister_code (KC_LGUI);
1137     }
1138
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));
1144         is_adore = 1;
1145
1146         ergodox_led_all_off ();
1147         ergodox_right_led_3_on ();
1148         _delay_ms (100);
1149         ergodox_right_led_2_on ();
1150         _delay_ms (100);
1151         ergodox_right_led_3_off ();
1152         ergodox_right_led_1_on ();
1153         _delay_ms (100);
1154         ergodox_right_led_2_off ();
1155         _delay_ms (100);
1156         ergodox_right_led_1_off ();
1157       } else {
1158         is_adore = 0;
1159         default_layer_and (0);
1160         default_layer_or (1UL << BASE);
1161         eeconfig_update_default_layer ((1UL << BASE));
1162
1163         ergodox_led_all_off ();
1164         ergodox_right_led_1_on ();
1165         _delay_ms (100);
1166         ergodox_right_led_2_on ();
1167         _delay_ms (100);
1168         ergodox_right_led_1_off ();
1169         ergodox_right_led_3_on ();
1170         _delay_ms (100);
1171         ergodox_right_led_2_off ();
1172         _delay_ms (100);
1173         ergodox_right_led_3_off ();
1174       }
1175     }
1176   }
1177 }
1178
1179 static uint16_t last4[4];
1180
1181 bool process_record_user (uint16_t keycode, keyrecord_t *record) {
1182 #if KEYLOGGER_ENABLE
1183   uint8_t layer = biton32(layer_state);
1184
1185   if (log_enable && layer == BASE) {
1186     xprintf ("KL: col=%d, row=%d\n", record->event.key.col,
1187              record->event.key.row);
1188   }
1189 #endif
1190
1191   if (time_travel && !record->event.pressed) {
1192     uint8_t p;
1193
1194     // shift cache one to the left
1195     for (p = 0; p < 3; p++) {
1196       last4[p] = last4[p + 1];
1197     }
1198     last4[3] = keycode;
1199
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};
1202       ang_tap (codes);
1203       register_code (KC_RSFT);
1204       register_code (KC_EQL);
1205       unregister_code (KC_EQL);
1206       unregister_code (KC_RSFT);
1207
1208       uint16_t codes2[] = {KC_4, KC_SPC, KC_D, KC_A, KC_Y, KC_S, KC_QUOT, 0};
1209       ang_tap (codes2);
1210
1211       return false;
1212     }
1213   }
1214
1215   return true;
1216 }