]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboards/ergodox/keymaps/algernon/keymap.c
Merge remote-tracking branch 'refs/remotes/jackhumbert/master'
[qmk_firmware.git] / keyboards / ergodox / keymaps / algernon / keymap.c
1 /*\r
2  * algernon's ErgoDox EZ layout, please see the readme.md file!\r
3  */\r
4 \r
5 #include "ergodox.h"\r
6 #include "led.h"\r
7 #include "debug.h"\r
8 #include "action_layer.h"\r
9 #include "action_util.h"\r
10 #include "mousekey.h"\r
11 #include "timer.h"\r
12 #include "keymap_plover.h"\r
13 #include "eeconfig.h"\r
14 #include "wait.h"\r
15 #include "version.h"
16 \r
17 /* Layers */\r
18 \r
19 enum {\r
20   BASE = 0,\r
21   ADORE,\r
22   ARRW,\r
23   APPSEL,\r
24   HUN,\r
25   NMDIA,\r
26   OHLFT,\r
27   OHRGT,\r
28   PLVR,\r
29 };\r
30 \r
31 /* Macros */\r
32 \r
33 enum {\r
34   NONE = 0,\r
35   // Buttons that do extra stuff\r
36   A_GUI,\r
37   A_PLVR,\r
38   A_ESC,\r
39   A_MPN,\r
40 \r
41   // Function / number keys\r
42   KF_1, // 1, F1\r
43   KF_2, // 2, F2\r
44   KF_3, // ...\r
45   KF_4,\r
46   KF_5,\r
47   KF_6,\r
48   KF_7,\r
49   KF_8,\r
50   KF_9,\r
51   KF_10,\r
52   KF_11, // =, F11\r
53 \r
54   // Application select keys\r
55   APP_SLK, // Slack\r
56   APP_EMCS, // Emacs\r
57   APP_TERM, // Terminal\r
58   APP_CHRM, // Chrome\r
59   APP_MSIC, // Music\r
60 \r
61   // Diagonal mouse movement\r
62   A_MUL,\r
63   A_MUR,\r
64   A_MDL,\r
65   A_MDR,\r
66 \r
67   // Hungarian layer keys\r
68   HU_AA, // Á\r
69   HU_OO, // Ó\r
70   HU_EE, // É\r
71   HU_UU, // Ú\r
72   HU_II, // Í\r
73   HU_OE, // Ö\r
74   HU_UE, // Ü\r
75   HU_OEE, // Ő\r
76   HU_UEE, // Ű\r
77 \r
78   // One-handed layout specials\r
79   OH_BSSPC,\r
80   OH_ENTSFT,\r
81   OH_BASE,\r
82   OH_LEFT,\r
83   OH_RIGHT,\r
84 };\r
85 \r
86 /* Fn keys */\r
87 \r
88 enum {\r
89   F_BSE = 0,\r
90   F_HUN,\r
91   F_GUI,\r
92   F_SFT,\r
93   F_ALT,\r
94   F_CTRL\r
95 };\r
96 \r
97 /* Custom keycodes */\r
98 \r
99 enum {\r
100   CT_CLN = 0,\r
101   CT_MNS,\r
102   CT_TA,\r
103 };\r
104 \r
105 /* States & timers */\r
106 \r
107 uint16_t gui_timer = 0;\r
108 \r
109 uint16_t kf_timers[12];\r
110 \r
111 uint16_t oh_base_timer = 0;\r
112 uint16_t oh_bsspc_timer = 0;\r
113 uint16_t oh_entsft_timer = 0;\r
114 \r
115 #define OH_BLINK_INTERVAL 500\r
116 \r
117 uint8_t oh_left_blink = 0;\r
118 uint16_t oh_left_blink_timer = 0;\r
119 uint8_t oh_right_blink = 0;\r
120 uint16_t oh_right_blink_timer = 0;\r
121 \r
122 #if KEYLOGGER_ENABLE\r
123 bool log_enable = false;\r
124 #endif\r
125 \r
126 bool time_travel = false;\r
127 \r
128 /* The Keymap */\r
129 \r
130 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {\r
131 \r
132 /* Keymap 0: Base Layer\r
133  *\r
134  * ,-----------------------------------------------------.           ,-----------------------------------------------------.\r
135  * |        `~ | 1 F1 | 2 F2 | 3 F3 | 4 F4 | 5 F5 | Plvr |           | Apps | 6 F6 | 7 F7 | 8 F8 | 9 F9 | 0 F10|       F11 |\r
136  * |-----------+------+------+------+------+-------------|           |------+------+------+------+------+------+-----------|\r
137  * | Next/Prev |   '  |   ,  |   .  |   P  |   Y  |   [  |           |  ]   |   F  |   G  |   C  |   R  |  L   | \         |\r
138  * |-----------+------+------+------+------+------|      |           |      |------+------+------+------+------+-----------|\r
139  * | Tab/ARROW |   A  |   O  |   E  |   U  |   I  |------|           |------|   D  |   H  |   T  |   N  |  S   | = / Arrow |\r
140  * |-----------+------+------+------+------+------|   (  |           |  )   |------+------+------+------+------+-----------|\r
141  * | Play/Pause|   /  |   Q  |   J  |   K  |   X  |      |           |      |   B  |   M  |   W  |   V  |  Z   |      Stop |\r
142  * `-----------+------+------+------+------+-------------'           `-------------+------+------+------+------+-----------'\r
143  *     |       |      |      |      |   :  |                                       |   -  |      |      |      |       |\r
144  *     `-----------------------------------'                                       `-----------------------------------'\r
145  *                                         ,-------------.           ,-------------.\r
146  *                                         | LAlt | GUI  |           | MDIA | 1HND |\r
147  *                                  ,------|------|------|           |------+------+------.\r
148  *                                  |      |      | Ctrl |           | LEAD |      |      |\r
149  *                                  |Backsp|LShift|------|           |------| Enter| Space|\r
150  *                                  |      |      | ESC  |           | HUN  |      |      |\r
151  *                                  `--------------------'           `--------------------'\r
152  */\r
153 [BASE] = KEYMAP(\r
154 // left hand\r
155  KC_GRV             ,M(KF_1)     ,M(KF_2)     ,M(KF_3),M(KF_4),M(KF_5),M(A_PLVR)\r
156 ,M(A_MPN)           ,KC_QUOT     ,KC_COMM     ,KC_DOT ,KC_P   ,KC_Y   ,KC_LBRC\r
157 ,TD(CT_TA)          ,KC_A        ,KC_O        ,KC_E   ,KC_U   ,KC_I\r
158 ,KC_MPLY            ,KC_SLSH     ,KC_Q        ,KC_J   ,KC_K   ,KC_X   ,KC_LPRN\r
159 ,KC_NO              ,KC_NO       ,KC_NO       ,KC_NO  ,TD(CT_CLN)\r
160 \r
161                                                             ,F(F_ALT),F(F_GUI)\r
162                                                                      ,F(F_CTRL)\r
163                                                     ,KC_BSPC,F(F_SFT),M(A_ESC)\r
164 \r
165                                                                 // right hand\r
166                                                                ,KC_APP    ,M(KF_6),M(KF_7)   ,M(KF_8),M(KF_9) ,M(KF_10) ,KC_F11\r
167                                                                ,KC_RBRC   ,KC_F   ,KC_G      ,KC_C   ,KC_R    ,KC_L     ,KC_BSLS\r
168                                                                           ,KC_D   ,KC_H      ,KC_T   ,KC_N    ,KC_S     ,KC_EQL\r
169                                                                ,KC_RPRN   ,KC_B   ,KC_M      ,KC_W   ,KC_V    ,KC_Z     ,KC_MSTP\r
170                                                                                   ,TD(CT_MNS),KC_NO  ,KC_NO   ,KC_NO    ,KC_NO\r
171 \r
172                                                                ,OSL(NMDIA),M(OH_LEFT)\r
173                                                                ,KC_LEAD\r
174                                                                ,F(F_HUN)  ,KC_ENT ,KC_SPC\r
175     ),\r
176 \r
177 /* Keymap 1: Adore layer\r
178  *\r
179  * ,-----------------------------------------------------.           ,-----------------------------------------------------.\r
180  * |        `~ | 1 F1 | 2 F2 | 3 F3 | 4 F4 | 5 F5 | Plvr |           | Apps | 6 F6 | 7 F7 | 8 F8 | 9 F9 | 0 F10|       F11 |\r
181  * |-----------+------+------+------+------+-------------|           |------+------+------+------+------+------+-----------|\r
182  * | Next/Prev |   ,  |   .  |   L  |   W  |   M  |   [  |           |  ]   |   F  |   H  |   C  |   P  |  Y   | \         |\r
183  * |-----------+------+------+------+------+------|      |           |      |------+------+------+------+------+-----------|\r
184  * | Tab/Arrow |   A  |   O  |   E  |   I  |   U  |------|           |------|   D  |   R  |   T  |   N  |  S   | = / Arrow |\r
185  * |-----------+------+------+------+------+------|   (  |           |  )   |------+------+------+------+------+-----------|\r
186  * | Play/Pause|   /  |   Z  |   '  |   K  |   X  |      |           |      |   B  |   G  |   V  |   J  |  Q   |      Stop |\r
187  * `-----------+------+------+------+------+-------------'           `-------------+------+------+------+------+-----------'\r
188  *     |       |      |      |      |   :  |                                       |   -  |      |      |      |       |\r
189  *     `-----------------------------------'                                       `-----------------------------------'\r
190  *                                         ,-------------.           ,-------------.\r
191  *                                         | LAlt | GUI  |           | MDIA | 1HND |\r
192  *                                  ,------|------|------|           |------+------+------.\r
193  *                                  |      |      | Ctrl |           | LEAD |      |      |\r
194  *                                  |Backsp|LShift|------|           |------| Enter| Space|\r
195  *                                  |      |      | ESC  |           | HUN  |      |      |\r
196  *                                  `--------------------'           `--------------------'\r
197  */\r
198 [ADORE] = KEYMAP(\r
199 // left hand\r
200  KC_GRV             ,M(KF_1)     ,M(KF_2)     ,M(KF_3),M(KF_4),M(KF_5),M(A_PLVR)\r
201 ,M(A_MPN)           ,KC_COMM     ,KC_DOT      ,KC_L   ,KC_W   ,KC_M   ,KC_LBRC\r
202 ,TD(CT_TA)          ,KC_A        ,KC_O        ,KC_E   ,KC_I   ,KC_U\r
203 ,KC_MPLY            ,KC_SLSH     ,KC_Z        ,KC_QUOT,KC_K   ,KC_X   ,KC_LPRN\r
204 ,KC_NO              ,KC_NO       ,KC_NO       ,KC_NO  ,TD(CT_CLN)\r
205 \r
206                                                             ,F(F_ALT),F(F_GUI)\r
207                                                                      ,F(F_CTRL)\r
208                                                     ,KC_BSPC,F(F_SFT),M(A_ESC)\r
209 \r
210                                                                 // right hand\r
211                                                                ,KC_APP    ,M(KF_6),M(KF_7)   ,M(KF_8),M(KF_9) ,M(KF_10) ,KC_F11\r
212                                                                ,KC_RBRC   ,KC_F   ,KC_H      ,KC_C   ,KC_P    ,KC_Y     ,KC_BSLS\r
213                                                                           ,KC_D   ,KC_R      ,KC_T   ,KC_N    ,KC_S     ,KC_EQL\r
214                                                                ,KC_RPRN   ,KC_B   ,KC_G      ,KC_V   ,KC_J    ,KC_Q     ,KC_MSTP\r
215                                                                                   ,TD(CT_MNS),KC_NO  ,KC_NO   ,KC_NO    ,KC_NO\r
216 \r
217                                                                ,OSL(NMDIA),M(OH_LEFT)\r
218                                                                ,KC_LEAD\r
219                                                                ,F(F_HUN)  ,KC_ENT ,KC_SPC\r
220     ),\r
221 \r
222 /* Keymap 2: Arrow layer\r
223  *\r
224  * ,-----------------------------------------------------.           ,-----------------------------------------------------.\r
225  * |           |      |      |      |      |      |      |           |      |      |      |      |      |      |           |\r
226  * |-----------+------+------+------+------+-------------|           |------+------+------+------+------+------+-----------|\r
227  * |           |      |      |      |      |      |      |           |      |      | Home |  Up  |  End |      |           |\r
228  * |-----------+------+------+------+------+------|      |           |      |------+------+------+------+------+-----------|\r
229  * |           |      |      |      |      |      |------|           |------|      | Left | Down | Rght |      |           |\r
230  * |-----------+------+------+------+------+------|      |           |      |------+------+------+------+------+-----------|\r
231  * |           |      |      |      |      |      |      |           |      |      |      |      |      |      |           |\r
232  * `-----------+------+------+------+------+-------------'           `-------------+------+------+------+------+-----------'\r
233  *      |      |      |      |      |      |                                       |      |      |      |      |      |\r
234  *      `----------------------------------'                                       `----------------------------------'\r
235  *                                         ,-------------.           ,-------------.\r
236  *                                         |      |      |           |      |      |\r
237  *                                  ,------|------|------|           |------+------+------.\r
238  *                                  |      |      |      |           |      |      |      |\r
239  *                                  |      |      |------|           |------| PgUp | PgDn |\r
240  *                                  |      |      |      |           |      |      |      |\r
241  *                                  `--------------------'           `--------------------'\r
242  */\r
243 \r
244 [ARRW] = KEYMAP(\r
245 // left hand\r
246  KC_TRNS ,KC_TRNS    ,KC_TRNS   ,KC_TRNS    ,KC_TRNS    ,KC_TRNS    ,KC_TRNS\r
247 ,KC_TRNS ,KC_TRNS    ,KC_TRNS   ,KC_TRNS    ,KC_TRNS    ,KC_TRNS    ,KC_TRNS\r
248 ,KC_TRNS ,KC_TRNS    ,KC_TRNS   ,KC_TRNS    ,KC_TRNS    ,KC_TRNS\r
249 ,KC_TRNS ,KC_TRNS    ,KC_TRNS   ,KC_TRNS    ,KC_TRNS    ,KC_TRNS    ,KC_TRNS\r
250 ,KC_TRNS ,KC_TRNS    ,KC_TRNS   ,KC_TRNS    ,KC_TRNS\r
251 \r
252                                              ,KC_TRNS ,KC_TRNS\r
253                                                       ,KC_TRNS\r
254                                     ,KC_TRNS ,KC_TRNS ,KC_TRNS\r
255 \r
256                                                                 // right hand\r
257                                                                ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS\r
258                                                                ,KC_TRNS ,KC_TRNS ,KC_HOME ,KC_UP   ,KC_END  ,KC_TRNS ,KC_TRNS\r
259                                                                         ,KC_TRNS ,KC_LEFT ,KC_DOWN ,KC_RGHT ,KC_TRNS ,KC_TRNS\r
260                                                                ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS\r
261                                                                                  ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS\r
262 \r
263                                                                ,KC_TRNS ,KC_TRNS\r
264                                                                ,KC_TRNS\r
265                                                                ,KC_TRNS ,KC_PGUP ,KC_PGDN\r
266     ),\r
267 \r
268 /* Keymap 3: Application select layer\r
269  *\r
270  * ,-----------------------------------------------------.           ,-----------------------------------------------------.\r
271  * |           |Music |Slack |Emacs |Term  |Chrome|      |           |      |      |      |      |      |      |           |\r
272  * |-----------+------+------+------+------+-------------|           |------+------+------+------+------+------+-----------|\r
273  * |           |      |      |      |      |      |      |           |      |      |      |      |      |      |           |\r
274  * |-----------+------+------+------+------+------|      |           |      |------+------+------+------+------+-----------|\r
275  * |           |      |      |      |      |      |------|           |------|      |      |      |      |      |           |\r
276  * |-----------+------+------+------+------+------|      |           |      |------+------+------+------+------+-----------|\r
277  * |           |      |      |      |      |      |      |           |      |      |      |      |      |      |           |\r
278  * `-----------+------+------+------+------+-------------'           `-------------+------+------+------+------+-----------'\r
279  *      |      |      |      |      |      |                                       |      |      |      |      |      |\r
280  *      `----------------------------------'                                       `----------------------------------'\r
281  *                                         ,-------------.           ,-------------.\r
282  *                                         |      |      |           |      |      |\r
283  *                                  ,------|------|------|           |------+------+------.\r
284  *                                  |      |      |      |           |      |      |      |\r
285  *                                  |      |      |------|           |------|      |      |\r
286  *                                  |      |      |      |           |      |      |      |\r
287  *                                  `--------------------'           `--------------------'\r
288  */\r
289 \r
290 [APPSEL] = KEYMAP(\r
291 // left hand\r
292  KC_TRNS ,M(APP_MSIC),M(APP_SLK),M(APP_EMCS),M(APP_TERM),M(APP_CHRM),KC_TRNS\r
293 ,KC_TRNS ,KC_TRNS    ,KC_TRNS   ,KC_TRNS    ,KC_TRNS    ,KC_TRNS    ,KC_TRNS\r
294 ,KC_TRNS ,KC_TRNS    ,KC_TRNS   ,KC_TRNS    ,KC_TRNS    ,KC_TRNS\r
295 ,KC_TRNS ,KC_TRNS    ,KC_TRNS   ,KC_TRNS    ,KC_TRNS    ,KC_TRNS    ,KC_TRNS\r
296 ,KC_TRNS ,KC_TRNS    ,KC_TRNS   ,KC_TRNS    ,KC_TRNS\r
297 \r
298                                              ,KC_TRNS ,KC_TRNS\r
299                                                       ,KC_TRNS\r
300                                     ,KC_TRNS ,KC_TRNS ,KC_TRNS\r
301 \r
302                                                                 // right hand\r
303                                                                ,KC_TRNS ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_TRNS\r
304                                                                ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS\r
305                                                                         ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS\r
306                                                                ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS\r
307                                                                                  ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS\r
308 \r
309                                                                ,KC_TRNS ,KC_TRNS\r
310                                                                ,KC_TRNS\r
311                                                                ,KC_TRNS ,KC_TRNS  ,KC_TRNS\r
312     ),\r
313 \r
314 \r
315 /* Keymap 4: Hungarian Layer\r
316  *\r
317  * ,-----------------------------------------------------.           ,-----------------------------------------------------.\r
318  * |           |      |      |      |      |      |      |           |      |      |      |      |      |      |           |\r
319  * |-----------+------+------+------+------+-------------|           |------+------+------+------+------+------+-----------|\r
320  * |           |      |  Ő   |      |  Ű   |      |      |           |      |      |      |      |      |      |           |\r
321  * |-----------+------+------+------+------+------|      |           |      |------+------+------+------+------+-----------|\r
322  * |           |   Á  |  Ó   |  É   |  Ú   |  Í   |------|           |------|      |      |      |      |      |           |\r
323  * |-----------+------+------+------+------+------|      |           |      |------+------+------+------+------+-----------|\r
324  * |           |      |  Ö   |      |  Ü   |      |      |           |      |      |      |      |      |      |           |\r
325  * `-----------+------+------+------+------+-------------'           `-------------+------+------+------+------+-----------'\r
326  *      |      |      |      |      |      |                                       |      |      |      |      |      |\r
327  *      `----------------------------------'                                       `----------------------------------'\r
328  *                                         ,-------------.           ,-------------.\r
329  *                                         |      |      |           |      |      |\r
330  *                                  ,------|------|------|           |------+------+------.\r
331  *                                  |      |      |      |           |      |      |      |\r
332  *                                  |      |      |------|           |------|      |      |\r
333  *                                  |      |      |      |           | BASE |      |      |\r
334  *                                  `--------------------'           `--------------------'\r
335  */\r
336 \r
337 [HUN] = KEYMAP(\r
338 // left hand\r
339  KC_NO   ,KC_NO   ,KC_NO    ,KC_NO   ,KC_NO    ,KC_NO   ,KC_NO\r
340 ,KC_NO   ,KC_NO   ,M(HU_OEE),KC_NO   ,M(HU_UEE),KC_NO   ,KC_NO\r
341 ,KC_NO   ,M(HU_AA),M(HU_OO) ,M(HU_EE),M(HU_UU) ,M(HU_II)\r
342 ,KC_NO   ,KC_NO   ,M(HU_OE) ,KC_NO   ,M(HU_UE) ,KC_NO   ,KC_NO\r
343 ,KC_NO   ,KC_NO   ,KC_NO    ,KC_NO   ,KC_NO\r
344 \r
345                                              ,KC_NO   ,KC_NO\r
346                                                       ,KC_NO\r
347                                     ,KC_NO   ,KC_TRNS ,KC_TRNS\r
348 \r
349                                                                 // right hand\r
350                                                                ,KC_TRNS ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO\r
351                                                                ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO\r
352                                                                         ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO\r
353                                                                ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO\r
354                                                                                  ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO\r
355 \r
356                                                                ,KC_NO   ,KC_NO\r
357                                                                ,KC_NO\r
358                                                                ,F(F_BSE),KC_TRNS  ,KC_TRNS\r
359     ),\r
360 \r
361 /* Keymap 5: Navigation & Media layer\r
362  *\r
363  * ,-----------------------------------------------------.           ,-----------------------------------------------------.\r
364  * | MS Slow   |      |      |      |      |      |ScrLCK|           |ScrLCK|      |      |      |      |      |           |\r
365  * |-----------+------+------+------+------+-------------|           |------+------+------+------+------+------+-----------|\r
366  * | MS Normal |      | Home |  Up  | PgUp |      |      |           |Scroll|      |MsUpL | MsUp |MsUpR |      |PrintScreen|\r
367  * |-----------+------+------+------+------+------|      |           |  Up  |------+------+------+------+------+-----------|\r
368  * | MS Fast   |      | Left | Down | Right|      |------|           |------|      |MsLeft| MsDn |MsRght|      |           |\r
369  * |-----------+------+------+------+------+------|      |           |Scroll|------+------+------+------+------+-----------|\r
370  * | Play/Pause|      | End  | Down | PgDn |      |      |           | Down |      |MsDnL | MsDn |MsDnR |      |      Stop |\r
371  * `-----------+------+------+------+------+-------------'           `-------------+------+------+------+------+-----------'\r
372  *      |      |      |      |      |      |                                       |      |      |      |      |      |\r
373  *      `----------------------------------'                                       `----------------------------------'\r
374  *                                         ,-------------.           ,-------------.\r
375  *                                         | Mute | VlUp |           | BASE | MClk |\r
376  *                                  ,------|------|------|           |------+------+------.\r
377  *                                  |      |      | VlDn |           | Prev |Left  |Right |\r
378  *                                  |  SPC | Enter|------|           |------| Click| Click|\r
379  *                                  |      |      | ESC  |           | Next |      |      |\r
380  *                                  `--------------------'           `--------------------'\r
381  */\r
382 [NMDIA] = KEYMAP(\r
383 // left hand\r
384  KC_ACL0    ,KC_NO       ,KC_NO      ,KC_NO   ,KC_NO   ,KC_NO   ,LGUI(KC_L)\r
385 ,KC_ACL1    ,KC_NO       ,KC_HOME    ,KC_UP   ,KC_PGUP ,KC_NO   ,KC_NO\r
386 ,KC_ACL2    ,KC_NO       ,KC_LEFT    ,KC_DOWN ,KC_RIGHT,KC_NO\r
387 ,KC_MPLY    ,KC_NO       ,KC_END     ,KC_DOWN ,KC_PGDN ,KC_NO   ,KC_NO\r
388 ,KC_NO      ,KC_NO       ,KC_NO      ,KC_NO   ,KC_NO\r
389                                                         ,KC_MUTE ,KC_VOLU\r
390                                                                  ,KC_VOLD\r
391                                                  ,KC_SPC,KC_ENTER,M(A_ESC)\r
392 \r
393                                                                      // right hand\r
394                                                                      ,LGUI(KC_L),KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO    ,KC_NO\r
395                                                                      ,KC_WH_U   ,KC_NO   ,M(A_MUL),KC_MS_U ,M(A_MUR),KC_NO    ,KC_PSCR\r
396                                                                                 ,KC_NO   ,KC_MS_L ,KC_MS_D ,KC_MS_R ,KC_NO    ,KC_NO\r
397                                                                      ,KC_WH_D   ,KC_NO   ,M(A_MDL),KC_MS_D ,M(A_MDR),KC_NO    ,KC_MSTP\r
398                                                                                          ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO    ,KC_NO\r
399 \r
400                                                                      ,KC_TRNS   ,KC_MS_BTN3\r
401                                                                      ,KC_MPRV\r
402                                                                      ,KC_MNXT   ,KC_BTN1 ,KC_BTN2\r
403     ),\r
404 \r
405 /* Keymap 6: One-handed, left side\r
406  *\r
407  * ,-----------------------------------------------------.\r
408  * |        `~ | 1 F1 | 2 F2 | 3 F3 | 4 F4 | 5 F5 |A  BSE|\r
409  * |-----------+------+------+------+------+-------------|\r
410  * |       Tab |   '  |   ,  |   .  |   P  |   Y  |   [  |\r
411  * |-----------+------+------+------+------+------|      |\r
412  * |         - |   A  |   O  |   E  |   U  |   I  |------|\r
413  * |-----------+------+------+------+------+------|   (  |\r
414  * | Play/Pause|   ;  |   Q  |   J  |   K  |   X  |      |\r
415  * `-----------+------+------+------+------+-------------'\r
416  *     |  Home | End  | Down |  Up  | ESC  |\r
417  *     `-----------------------------------'\r
418  *                                         ,-------------.\r
419  *                                         | LAlt | GUI  |\r
420  *                                  ,------|------|------|\r
421  *                                  |BackSp|LShift| Ctrl |\r
422  *                                  |      |      |------|\r
423  *                                  |Space |Enter |OTHER |\r
424  *                                  `--------------------'\r
425  */\r
426 [OHLFT] = KEYMAP(\r
427 // left hand\r
428  KC_GRV     ,M(KF_1)     ,M(KF_2)     ,M(KF_3)   ,M(KF_4)    ,M(KF_5) ,M(OH_BASE)\r
429 ,KC_TAB     ,KC_QUOT     ,KC_COMM     ,KC_DOT    ,KC_P       ,KC_Y    ,KC_LBRC\r
430 ,KC_MINS    ,KC_A        ,KC_O        ,KC_E      ,KC_U       ,KC_I\r
431 ,KC_MPLY    ,KC_SCLN     ,KC_Q        ,KC_J      ,KC_K       ,KC_X    ,KC_LPRN\r
432 ,KC_HOME    ,KC_END      ,KC_DOWN     ,KC_UP     ,M(A_ESC)\r
433 \r
434                                                                 ,KC_TRNS     ,KC_TRNS\r
435                                                                              ,KC_TRNS\r
436                                                     ,M(OH_BSSPC),M(OH_ENTSFT),M(OH_RIGHT)\r
437 \r
438                                                                 // right hand\r
439                                                                ,KC_NO   ,KC_NO  ,KC_NO  ,KC_NO  ,KC_NO       ,KC_NO       ,KC_NO\r
440                                                                ,KC_NO   ,KC_NO  ,KC_NO  ,KC_NO  ,KC_NO       ,KC_NO       ,KC_NO\r
441                                                                         ,KC_NO  ,KC_NO  ,KC_NO  ,KC_NO       ,KC_NO       ,KC_NO\r
442                                                                ,KC_NO   ,KC_NO  ,KC_NO  ,KC_NO  ,KC_NO       ,KC_NO       ,KC_NO\r
443                                                                                 ,KC_NO  ,KC_NO  ,KC_NO       ,KC_NO       ,KC_NO\r
444 \r
445                                                                ,KC_NO   ,KC_NO\r
446                                                                ,KC_NO\r
447                                                                ,KC_NO   ,KC_NO  ,KC_NO\r
448     ),\r
449 \r
450 /* Keymap 7: One-handed, right side\r
451  *\r
452  * ,-----------------------------------------------------.\r
453  * | =     F11 | 0 F10| 9 F9 | 8 F8 | 7 F7 | 6 F6 |A  BSE|\r
454  * |-----------+------+------+------+------+-------------|\r
455  * |         / |   L  |   R  |   C  |   G  |   F  |   ]  |\r
456  * |-----------+------+------+------+------+------|      |\r
457  * |         \ |   S  |   N  |   T  |   H  |   D  |------|\r
458  * |-----------+------+------+------+------+------|   )  |\r
459  * |      Stop |   Z  |   V  |   W  |   M  |   B  |      |\r
460  * `-----------+------+------+------+------+-------------'\r
461  *     |  PgDn | PgUp | Right| Left | ESC  |\r
462  *     `-----------------------------------'\r
463  *                                         ,-------------.\r
464  *                                         | LAlt | GUI  |\r
465  *                                  ,------|------|------|\r
466  *                                  |BackSp|LShift| Ctrl |\r
467  *                                  |      |      |------|\r
468  *                                  |Space |Enter |OTHER |\r
469  *                                  `--------------------'\r
470  */\r
471 [OHRGT] = KEYMAP(\r
472 // left hand\r
473  M(KF_11)   ,M(KF_10)    ,M(KF_9)     ,M(KF_8)   ,M(KF_7)    ,M(KF_6) ,M(OH_BASE)\r
474 ,KC_SLSH    ,KC_L        ,KC_R        ,KC_C      ,KC_G       ,KC_F    ,KC_RBRC\r
475 ,KC_BSLS    ,KC_S        ,KC_N        ,KC_T      ,KC_H       ,KC_D\r
476 ,KC_MSTP    ,KC_Z        ,KC_V        ,KC_W      ,KC_M       ,KC_B    ,KC_RPRN\r
477 ,KC_PGDN    ,KC_PGUP     ,KC_RGHT     ,KC_LEFT   ,M(A_ESC)\r
478 \r
479                                                                 ,KC_TRNS     ,KC_TRNS\r
480                                                                              ,KC_TRNS\r
481                                                     ,M(OH_BSSPC),M(OH_ENTSFT),M(OH_LEFT)\r
482 \r
483                                                                 // right hand\r
484                                                                ,KC_NO   ,KC_NO  ,KC_NO  ,KC_NO  ,KC_NO       ,KC_NO       ,KC_NO\r
485                                                                ,KC_NO   ,KC_NO  ,KC_NO  ,KC_NO  ,KC_NO       ,KC_NO       ,KC_NO\r
486                                                                         ,KC_NO  ,KC_NO  ,KC_NO  ,KC_NO       ,KC_NO       ,KC_NO\r
487                                                                ,KC_NO   ,KC_NO  ,KC_NO  ,KC_NO  ,KC_NO       ,KC_NO       ,KC_NO\r
488                                                                                 ,KC_NO  ,KC_NO  ,KC_NO       ,KC_NO       ,KC_NO\r
489 \r
490                                                                ,KC_NO   ,KC_NO\r
491                                                                ,KC_NO\r
492                                                                ,KC_NO   ,KC_NO  ,KC_NO\r
493     ),\r
494 \r
495 /* Keymap 8: Steno for Plover\r
496  *\r
497  * ,--------------------------------------------------.           ,--------------------------------------------------.\r
498  * |        |      |      |      |      |      | BASE |           |      |      |      |      |      |      |        |\r
499  * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|\r
500  * |        |   #  |   #  |   #  |   #  |   #  |   #  |           |  #   |  #   |  #   |   #  |   #  |  #   |   #    |\r
501  * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|\r
502  * |        |      |   T  |   P  |   H  |      |------|           |------|      |  F   |   P  |   L  |  T   |   D    |\r
503  * |--------+   S  +------+------+------+   *  |   *  |           |  *   |  *   +------+------+------+------+--------|\r
504  * |        |      |   K  |   W  |   R  |      |      |           |      |      |  R   |   B  |   G  |  S   |   Z    |\r
505  * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'\r
506  *   |      |      |      |      |      |                                       |      |      |      |      |      |\r
507  *   `----------------------------------'                                       `----------------------------------'\r
508  *                                        ,-------------.       ,-------------.\r
509  *                                        |      |      |       |      |      |\r
510  *                                 ,------|------|------|       |------+------+------.\r
511  *                                 |      |      |      |       |      |      |      |\r
512  *                                 |   A  |   O  |------|       |------|  E   |  U   |\r
513  *                                 |      |      |      |       |      |      |      |\r
514  *                                 `--------------------'       `--------------------'\r
515  */\r
516 \r
517 [PLVR] = KEYMAP(\r
518 // left hand\r
519 KC_NO,  KC_NO,  KC_NO,  KC_NO,   KC_NO,  KC_NO,   M(A_PLVR),\r
520 KC_NO,  PV_NUM, PV_NUM, PV_NUM,  PV_NUM, PV_NUM,  PV_NUM,\r
521 KC_NO,  PV_LS,  PV_LT,  PV_LP,   PV_LH,  PV_STAR,\r
522 KC_NO,  PV_LS,  PV_LK,  PV_LW,   PV_LR,  PV_STAR, PV_STAR,\r
523 KC_NO,  KC_NO,  KC_NO,  KC_NO,   KC_NO,\r
524                                            KC_NO, KC_NO,\r
525                                            KC_NO,\r
526                                            PV_A,  PV_O,  KC_NO,\r
527 \r
528                                                  // right hand\r
529                                                  KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,\r
530                                                  PV_NUM,  PV_NUM,  PV_NUM,  PV_NUM,  PV_NUM,  PV_NUM,  PV_NUM,\r
531                                                           PV_STAR, PV_RF,   PV_RP,   PV_RL,   PV_RT,   PV_RD,\r
532                                                  PV_STAR, PV_STAR, PV_RR,   PV_RB,   PV_RG,   PV_RS,   PV_RZ,\r
533                                                                    KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,\r
534                                            KC_NO,      KC_NO,\r
535                                            KC_NO,\r
536                                            KC_NO,PV_E, PV_U\r
537  ),\r
538 \r
539 };\r
540 \r
541 const uint16_t PROGMEM fn_actions[] = {\r
542    [F_BSE]  = ACTION_LAYER_CLEAR(ON_PRESS)\r
543   ,[F_HUN]  = ACTION_LAYER_INVERT(HUN, ON_PRESS)\r
544   ,[F_GUI]  = ACTION_MACRO_TAP(A_GUI)\r
545   ,[F_SFT]  = ACTION_MODS_ONESHOT (MOD_LSFT)\r
546   ,[F_ALT]  = ACTION_MODS_ONESHOT (MOD_LALT)\r
547   ,[F_CTRL] = ACTION_MODS_ONESHOT (MOD_LCTL)\r
548 };\r
549 \r
550 void toggle_steno(int pressed)\r
551 {\r
552   uint8_t layer = biton32(layer_state);\r
553 \r
554   if (pressed) {\r
555     if (layer != PLVR) layer_on(PLVR); else layer_off(PLVR);\r
556 \r
557     register_code(PV_LP);\r
558     register_code(PV_LH);\r
559     register_code(PV_LR);\r
560     register_code(PV_O);\r
561     register_code(PV_RL);\r
562     register_code(PV_RG);\r
563   } else {\r
564     unregister_code(PV_LP);\r
565     unregister_code(PV_LH);\r
566     unregister_code(PV_LR);\r
567     unregister_code(PV_O);\r
568     unregister_code(PV_RL);\r
569     unregister_code(PV_RG);\r
570   }\r
571 }\r
572 \r
573 macro_t *ang_do_hun (keyrecord_t *record, uint16_t accent, uint16_t hun_char)\r
574 {\r
575   uint8_t need_shift = 0;\r
576   uint8_t hold_shift = 0;\r
577 \r
578   if (!record->event.pressed)\r
579     return MACRO_NONE;\r
580 \r
581   layer_off (HUN);\r
582 \r
583   if (keyboard_report->mods & MOD_BIT (KC_LSFT)) {\r
584     hold_shift = 1;\r
585     need_shift = 1;\r
586     unregister_code (KC_LSFT);\r
587   }\r
588   if ((get_oneshot_mods () & MOD_BIT(KC_LSFT)) && !has_oneshot_mods_timed_out ()) {\r
589     need_shift = 1;\r
590     hold_shift = 0;\r
591     unregister_code (KC_LSFT);\r
592   }\r
593 \r
594   clear_oneshot_mods ();\r
595 \r
596   register_code (KC_RALT);\r
597   unregister_code (KC_RALT);\r
598   if (accent == (KC_DQT)) {\r
599     register_code (KC_RSFT);\r
600   }\r
601   register_code (accent);\r
602   unregister_code (accent);\r
603   if (need_shift && accent != (KC_DQT)) {\r
604     register_code (KC_RSFT);\r
605   } else if (accent == (KC_DQT) && !need_shift) {\r
606     unregister_code (KC_RSFT);\r
607   }\r
608   register_code (hun_char);\r
609   unregister_code (hun_char);\r
610   if (need_shift || accent == (KC_DQT))\r
611     unregister_code (KC_RSFT);\r
612   if (hold_shift)\r
613     register_code (KC_LSFT);\r
614 \r
615   return MACRO_NONE;\r
616 }\r
617 \r
618 void ang_handle_kf (keyrecord_t *record, uint8_t id)\r
619 {\r
620   uint8_t code = id - KF_1;\r
621 \r
622   if (record->event.pressed) {\r
623     kf_timers[code] = timer_read ();\r
624   } else {\r
625     uint8_t kc;\r
626 \r
627     if (timer_elapsed (kf_timers[code]) > TAPPING_TERM) {\r
628       // Long press\r
629       kc = KC_F1 + code;\r
630     } else {\r
631       if (id == KF_11)\r
632         kc = KC_EQL;\r
633       else\r
634         kc = KC_1 + code;\r
635     }\r
636 \r
637     register_code (kc);\r
638     unregister_code (kc);\r
639   }\r
640 }\r
641 \r
642 const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)\r
643 {\r
644       switch(id) {\r
645       case A_ESC:\r
646         if (record->event.pressed) {\r
647           if ((get_oneshot_mods ()) && !has_oneshot_mods_timed_out ()) {\r
648             clear_oneshot_mods ();\r
649           } else {\r
650             register_code (KC_ESC);\r
651           }\r
652           layer_off (HUN);\r
653         } else {\r
654           unregister_code (KC_ESC);\r
655         }\r
656         break;\r
657 \r
658       case A_MPN:\r
659         if (record->event.pressed) {\r
660           if (keyboard_report->mods & MOD_BIT(KC_LSFT) ||\r
661               ((get_oneshot_mods() & MOD_BIT(KC_LSFT)) && !has_oneshot_mods_timed_out())) {\r
662             int oneshot = ((get_oneshot_mods() & MOD_BIT(KC_LSFT)) && !has_oneshot_mods_timed_out());\r
663 \r
664             if (oneshot)\r
665               clear_oneshot_mods ();\r
666             unregister_code (KC_LSFT);\r
667 \r
668             register_code (KC_MPRV);\r
669             unregister_code (KC_MPRV);\r
670 \r
671             if (!oneshot)\r
672               register_code (KC_LSFT);\r
673           } else {\r
674             return MACRO (T(MNXT), END);\r
675           }\r
676         }\r
677         break;\r
678 \r
679         /* Hungarian layer */\r
680       case HU_AA:\r
681         return ang_do_hun (record, KC_QUOT, KC_A);\r
682       case HU_OO:\r
683         return ang_do_hun (record, KC_QUOT, KC_O);\r
684       case HU_EE:\r
685         return ang_do_hun (record, KC_QUOT, KC_E);\r
686       case HU_UU:\r
687         return ang_do_hun (record, KC_QUOT, KC_U);\r
688       case HU_II:\r
689         return ang_do_hun (record, KC_QUOT, KC_I);\r
690       case HU_OE:\r
691         return ang_do_hun (record, KC_DQT, KC_O);\r
692       case HU_UE:\r
693         return ang_do_hun (record, KC_DQT, KC_U);\r
694       case HU_OEE:\r
695         return ang_do_hun (record, KC_EQL, KC_O);\r
696       case HU_UEE:\r
697         return ang_do_hun (record, KC_EQL, KC_U);\r
698 \r
699         /* Mouse movement */\r
700       case A_MUL:\r
701         if (record->event.pressed) {\r
702           mousekey_on(KC_MS_UP);\r
703           mousekey_on(KC_MS_LEFT);\r
704         } else {\r
705           mousekey_off(KC_MS_UP);\r
706           mousekey_off(KC_MS_LEFT);\r
707         }\r
708         mousekey_send();\r
709         break;\r
710 \r
711       case A_MUR:\r
712         if (record->event.pressed) {\r
713           mousekey_on(KC_MS_UP);\r
714           mousekey_on(KC_MS_RIGHT);\r
715         } else {\r
716           mousekey_off(KC_MS_UP);\r
717           mousekey_off(KC_MS_RIGHT);\r
718         }\r
719         mousekey_send();\r
720         break;\r
721 \r
722       case A_MDL:\r
723         if (record->event.pressed) {\r
724           mousekey_on(KC_MS_DOWN);\r
725           mousekey_on(KC_MS_LEFT);\r
726         } else {\r
727           mousekey_off(KC_MS_DOWN);\r
728           mousekey_off(KC_MS_LEFT);\r
729         }\r
730         mousekey_send();\r
731         break;\r
732 \r
733       case A_MDR:\r
734         if (record->event.pressed) {\r
735           mousekey_on(KC_MS_DOWN);\r
736           mousekey_on(KC_MS_RIGHT);\r
737         } else {\r
738           mousekey_off(KC_MS_DOWN);\r
739           mousekey_off(KC_MS_RIGHT);\r
740         }\r
741         mousekey_send();\r
742         break;\r
743 \r
744         /* Plover base */\r
745       case A_PLVR:\r
746         toggle_steno(record->event.pressed);\r
747         break;\r
748 \r
749         /* GUI & AppSel */\r
750       case A_GUI:\r
751         if (record->event.pressed) {\r
752           register_code (KC_LGUI);\r
753           if (record->tap.count && !record->tap.interrupted) {\r
754             if (record->tap.count >= 2) {\r
755               register_code (KC_W);\r
756               layer_on (APPSEL);\r
757               set_oneshot_layer (APPSEL, ONESHOT_START);\r
758             }\r
759           } else {\r
760             record->tap.count = 0;\r
761           }\r
762           gui_timer = 0;\r
763         } else {\r
764           if (record->tap.count >= 2)\r
765             {\r
766               unregister_code (KC_W);\r
767               clear_oneshot_layer_state (ONESHOT_PRESSED);\r
768             }\r
769           gui_timer = timer_read ();\r
770         }\r
771         break;\r
772 \r
773       case APP_SLK:\r
774         return MACRODOWN(T(S), T(L), T(A), T(C), T(K), T(ENT), END);\r
775 \r
776       case APP_EMCS:\r
777         return MACRODOWN(T(E), T(M), T(A), T(C), T(S), T(ENT), END);\r
778 \r
779       case APP_TERM:\r
780         return MACRODOWN(T(T), T(E), T(R), T(M), T(ENT), END);\r
781 \r
782       case APP_CHRM:\r
783         return MACRODOWN(T(C), T(H), T(R), T(O), T(M), T(ENT), END);\r
784 \r
785       case APP_MSIC:\r
786         return MACRODOWN(T(R), T(H), T(Y), T(T), T(H), T(M), T(B), T(O), T(X), T(ENT), END);\r
787 \r
788         /* Function keys */\r
789       case KF_1 ... KF_11:\r
790         ang_handle_kf (record, id);\r
791         break;\r
792 \r
793         /* 1HAND layout */\r
794       case OH_BASE:\r
795         if (record->event.pressed) {\r
796           oh_base_timer = timer_read ();\r
797         } else {\r
798           if (timer_elapsed (oh_base_timer) > TAPPING_TERM) {\r
799             layer_clear ();\r
800           } else {\r
801             return MACRO (T(APP), END);\r
802           }\r
803         }\r
804         break;\r
805 \r
806       case OH_BSSPC:\r
807         if (record->event.pressed) {\r
808           oh_bsspc_timer = timer_read ();\r
809         } else {\r
810           if (timer_elapsed (oh_bsspc_timer) > TAPPING_TERM) {\r
811             return MACRO (T(BSPC), END);\r
812           } else {\r
813             return MACRO (T(SPC), END);\r
814           }\r
815         }\r
816         break;\r
817 \r
818       case OH_ENTSFT:\r
819         if (record->event.pressed) {\r
820           oh_entsft_timer = timer_read ();\r
821         } else {\r
822           if (timer_elapsed (oh_entsft_timer) > TAPPING_TERM) {\r
823             if (keyboard_report->mods & MOD_BIT(KC_LSFT))\r
824               unregister_code (KC_LSFT);\r
825             else\r
826               register_code (KC_LSFT);\r
827           } else {\r
828             return MACRO (T(ENT), END);\r
829           }\r
830         }\r
831         break;\r
832 \r
833       case OH_LEFT:\r
834         if (record->event.pressed) {\r
835           layer_move (OHLFT);\r
836           oh_left_blink = 1;\r
837           oh_left_blink_timer = timer_read ();\r
838           ergodox_right_led_1_on ();\r
839         }\r
840         break;\r
841 \r
842       case OH_RIGHT:\r
843         if (record->event.pressed) {\r
844           layer_move (OHRGT);\r
845           oh_right_blink = 1;\r
846           oh_right_blink_timer = timer_read ();\r
847           ergodox_right_led_3_on ();\r
848         }\r
849         break;\r
850       }\r
851       return MACRO_NONE;\r
852 };\r
853 \r
854 uint8_t is_adore = 0;\r
855 \r
856 // Runs just one time when the keyboard initializes.\r
857 void matrix_init_user(void) {\r
858   uint8_t dl;\r
859 \r
860   ergodox_led_all_on();\r
861   for (int i = LED_BRIGHTNESS_HI; i > LED_BRIGHTNESS_LO; i--) {\r
862     ergodox_led_all_set (i);\r
863     wait_ms (5);\r
864   }\r
865   wait_ms(1000);\r
866   for (int i = LED_BRIGHTNESS_LO; i > 0; i--) {\r
867     ergodox_led_all_set (i);\r
868     wait_ms (10);\r
869   }\r
870   ergodox_led_all_off();\r
871 \r
872   if (!eeconfig_is_enabled())\r
873     eeconfig_init();\r
874   dl = eeconfig_read_default_layer ();\r
875   if (dl == (1UL << ADORE))\r
876     is_adore = 1;\r
877 };\r
878 \r
879 LEADER_EXTERNS();\r
880 \r
881 void ang_do_unicode (void) {\r
882   register_code (KC_RCTL);\r
883   register_code (KC_RSFT);\r
884   register_code (KC_U);\r
885   unregister_code (KC_U);\r
886   unregister_code (KC_RSFT);\r
887   unregister_code (KC_RCTL);\r
888   wait_ms (100);\r
889 }\r
890 \r
891 void ang_tap (uint16_t codes[]) {\r
892   for (int i = 0; codes[i] != 0; i++) {\r
893     register_code (codes[i]);\r
894     unregister_code (codes[i]);\r
895     wait_ms (50);\r
896   }\r
897 }\r
898 \r
899 #define TAP_ONCE(code) \\r
900   register_code (code); \\r
901   unregister_code (code)\r
902 \r
903 void ang_tap_dance_cln_finished (qk_tap_dance_state_t *state, void *user_data) {\r
904   if (state->count == 1) {\r
905     register_code (KC_RSFT);\r
906     register_code (KC_SCLN);\r
907   } else if (state->count == 2) {\r
908     register_code (KC_SCLN);\r
909   }\r
910 }\r
911 \r
912 void ang_tap_dance_cln_reset (qk_tap_dance_state_t *state, void *user_data) {\r
913   if (state->count == 1) {\r
914     unregister_code (KC_SCLN);\r
915     unregister_code (KC_RSFT);\r
916   } else if (state->count == 2) {\r
917     unregister_code (KC_SCLN);\r
918   }\r
919 }\r
920 \r
921 void ang_tap_dance_mns_finished (qk_tap_dance_state_t *state, void *user_data) {\r
922   if (state->count == 1) {\r
923     register_code (KC_MINS);\r
924   } else if (state->count == 2) {\r
925     register_code (KC_RSFT);\r
926     register_code (KC_MINS);\r
927   }\r
928 }\r
929 \r
930 void ang_tap_dance_mns_reset (qk_tap_dance_state_t *state, void *user_data) {\r
931   if (state->count == 1) {\r
932     unregister_code (KC_MINS);\r
933   } else if (state->count == 2) {\r
934     unregister_code (KC_RSFT);\r
935     unregister_code (KC_MINS);\r
936   }\r
937 }\r
938 \r
939 typedef struct {\r
940   bool layer_toggle;\r
941   bool sticky;\r
942   bool finished_once;\r
943 } td_ta_state_t;\r
944 \r
945 void ang_tap_dance_ta_finished (qk_tap_dance_state_t *state, void *user_data) {\r
946   td_ta_state_t *td_ta = (td_ta_state_t *) user_data;\r
947 \r
948   if (td_ta->finished_once) {\r
949     return;\r
950   }\r
951 \r
952   if (td_ta->sticky) {\r
953     td_ta->sticky = false;\r
954     td_ta->layer_toggle = false;\r
955     layer_off (ARRW);\r
956     return;\r
957   }\r
958 \r
959   td_ta->finished_once = true;\r
960   if (state->count == 1 && !state->pressed) {\r
961     register_code (KC_TAB);\r
962     td_ta->sticky = false;\r
963     td_ta->layer_toggle = false;\r
964   } else {\r
965     td_ta->layer_toggle = true;\r
966     layer_on (ARRW);\r
967     td_ta->sticky = (state->count == 2);\r
968   }\r
969 }\r
970 \r
971 void ang_tap_dance_ta_reset (qk_tap_dance_state_t *state, void *user_data) {\r
972   td_ta_state_t *td_ta = (td_ta_state_t *) user_data;\r
973 \r
974   if (!td_ta->layer_toggle)\r
975     unregister_code (KC_TAB);\r
976   if (!td_ta->sticky)\r
977     layer_off (ARRW);\r
978 \r
979   td_ta->finished_once = false;\r
980 }\r
981 \r
982 const qk_tap_dance_action_t tap_dance_actions[] = {\r
983    [CT_CLN] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, ang_tap_dance_cln_finished, ang_tap_dance_cln_reset)\r
984   ,[CT_MNS] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, ang_tap_dance_mns_finished, ang_tap_dance_mns_reset)\r
985   ,[CT_TA]  = {\r
986      .fn = { NULL, ang_tap_dance_ta_finished, ang_tap_dance_ta_reset },\r
987      .user_data = (void *)&((td_ta_state_t) { false, false, false })\r
988    }\r
989 };\r
990 \r
991 // Runs constantly in the background, in a loop.\r
992 void matrix_scan_user(void) {\r
993   uint8_t layer = biton32(layer_state);\r
994 \r
995   if (gui_timer && timer_elapsed (gui_timer) > TAPPING_TERM)\r
996     unregister_code (KC_LGUI);\r
997 \r
998   if (layer != OHLFT)\r
999     oh_left_blink = 0;\r
1000   if (layer != OHRGT)\r
1001     oh_right_blink = 0;\r
1002 \r
1003   if (layer == HUN) {\r
1004     ergodox_right_led_2_on();\r
1005     ergodox_right_led_3_on();\r
1006   } else if (layer == NMDIA) {\r
1007     ergodox_right_led_1_on();\r
1008     ergodox_right_led_2_on();\r
1009   } else if (layer == PLVR) {\r
1010     ergodox_right_led_1_on ();\r
1011     ergodox_right_led_2_on ();\r
1012     ergodox_right_led_3_on ();\r
1013   } else if (layer == ADORE) {\r
1014     ergodox_right_led_1_on ();\r
1015     ergodox_right_led_2_on ();\r
1016     ergodox_right_led_3_on ();\r
1017 \r
1018     ergodox_right_led_2_set (LED_BRIGHTNESS_HI);\r
1019   }\r
1020 \r
1021   if (layer == OHLFT || layer == OHRGT) {\r
1022     ergodox_right_led_2_on();\r
1023 \r
1024     if (oh_left_blink) {\r
1025       if (timer_elapsed (oh_left_blink_timer) > OH_BLINK_INTERVAL) {\r
1026         if ((keyboard_report->mods & MOD_BIT(KC_LSFT)) == 0)\r
1027           ergodox_right_led_1_off ();\r
1028       }\r
1029       if (timer_elapsed (oh_left_blink_timer) > OH_BLINK_INTERVAL * 2) {\r
1030         ergodox_right_led_1_on ();\r
1031         oh_left_blink_timer = timer_read ();\r
1032       }\r
1033     }\r
1034 \r
1035     if (oh_right_blink) {\r
1036       if (timer_elapsed (oh_right_blink_timer) > OH_BLINK_INTERVAL) {\r
1037         if ((keyboard_report->mods & MOD_BIT(KC_LCTRL)) == 0)\r
1038           ergodox_right_led_3_off ();\r
1039       }\r
1040       if (timer_elapsed (oh_right_blink_timer) > OH_BLINK_INTERVAL * 2) {\r
1041         ergodox_right_led_3_on ();\r
1042         oh_right_blink_timer = timer_read ();\r
1043       }\r
1044     }\r
1045   }\r
1046 \r
1047   if (keyboard_report->mods & MOD_BIT(KC_LSFT) ||\r
1048       ((get_oneshot_mods() & MOD_BIT(KC_LSFT)) && !has_oneshot_mods_timed_out())) {\r
1049     ergodox_right_led_1_set (LED_BRIGHTNESS_HI);\r
1050     ergodox_right_led_1_on ();\r
1051   } else {\r
1052     ergodox_right_led_1_set (LED_BRIGHTNESS_LO);\r
1053     if (layer != OHLFT && layer != NMDIA && layer != PLVR && layer != ADORE)\r
1054       ergodox_right_led_1_off ();\r
1055   }\r
1056 \r
1057   if (keyboard_report->mods & MOD_BIT(KC_LALT) ||\r
1058       ((get_oneshot_mods() & MOD_BIT(KC_LALT)) && !has_oneshot_mods_timed_out())) {\r
1059     ergodox_right_led_2_set (LED_BRIGHTNESS_HI);\r
1060     ergodox_right_led_2_on ();\r
1061   } else {\r
1062     ergodox_right_led_2_set (LED_BRIGHTNESS_LO);\r
1063     if (layer != OHRGT && layer != HUN && layer != OHLFT && layer != NMDIA && layer != PLVR && layer != ADORE)\r
1064       ergodox_right_led_2_off ();\r
1065   }\r
1066 \r
1067   if (keyboard_report->mods & MOD_BIT(KC_LCTRL) ||\r
1068       ((get_oneshot_mods() & MOD_BIT(KC_LCTRL)) && !has_oneshot_mods_timed_out())) {\r
1069     ergodox_right_led_3_set (LED_BRIGHTNESS_HI);\r
1070     ergodox_right_led_3_on ();\r
1071   } else {\r
1072     ergodox_right_led_3_set (LED_BRIGHTNESS_LO);\r
1073     if (layer != OHRGT && layer != HUN && layer != PLVR && layer != ADORE)\r
1074       ergodox_right_led_3_off ();\r
1075   }\r
1076 \r
1077   LEADER_DICTIONARY() {\r
1078     leading = false;\r
1079     leader_end ();\r
1080 \r
1081 #if KEYLOGGER_ENABLE\r
1082     SEQ_ONE_KEY (KC_D) {\r
1083       ergodox_led_all_on();\r
1084       wait_ms(100);\r
1085       ergodox_led_all_off();\r
1086       log_enable = !log_enable;\r
1087     }\r
1088 #endif\r
1089 \r
1090     SEQ_ONE_KEY (KC_T) {\r
1091       time_travel = !time_travel;\r
1092     }\r
1093 \r
1094     SEQ_ONE_KEY (KC_U) {\r
1095       ang_do_unicode ();\r
1096     }\r
1097 \r
1098     SEQ_ONE_KEY (KC_V) {\r
1099       SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ (" QMK_VERSION "/" KEYMAP_VERSION ")");\r
1100     }\r
1101 \r
1102     SEQ_ONE_KEY (KC_L) {\r
1103       /* λ */\r
1104       ang_do_unicode ();\r
1105 \r
1106       uint16_t codes[] = {KC_0, KC_3, KC_B, KC_B, KC_ENT, 0};\r
1107       ang_tap (codes);\r
1108     }\r
1109 \r
1110     SEQ_ONE_KEY (KC_Y) {\r
1111       uint16_t codes[] = {KC_BSLS, KC_O, KC_SLSH, 0};\r
1112       ang_tap (codes);\r
1113     }\r
1114 \r
1115     SEQ_ONE_KEY (KC_S) {\r
1116       ang_do_unicode (); TAP_ONCE (KC_A); TAP_ONCE (KC_F); TAP_ONCE (KC_SPC);\r
1117       TAP_ONCE (KC_BSLS);\r
1118       register_code (KC_RSFT); TAP_ONCE (KC_MINS); TAP_ONCE (KC_9); unregister_code (KC_RSFT);\r
1119       ang_do_unicode (); TAP_ONCE (KC_3); TAP_ONCE (KC_0); TAP_ONCE (KC_C); TAP_ONCE (KC_4); TAP_ONCE (KC_SPC);\r
1120       register_code (KC_RSFT); TAP_ONCE (KC_0); TAP_ONCE (KC_MINS); unregister_code (KC_RSFT);\r
1121       TAP_ONCE (KC_SLSH);\r
1122       ang_do_unicode (); TAP_ONCE (KC_A); TAP_ONCE (KC_F); TAP_ONCE (KC_SPC);\r
1123     }\r
1124 \r
1125     SEQ_TWO_KEYS (KC_W, KC_M) {\r
1126       register_code (KC_LALT);\r
1127       register_code (KC_F2);\r
1128       unregister_code (KC_F2);\r
1129       unregister_code (KC_LALT);\r
1130 \r
1131       wait_ms (1000);\r
1132 \r
1133       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};\r
1134       ang_tap (codes);\r
1135       register_code (KC_LGUI);\r
1136       register_code (KC_UP);\r
1137       unregister_code (KC_UP);\r
1138       unregister_code (KC_LGUI);\r
1139     }\r
1140 \r
1141     SEQ_ONE_KEY (KC_A) {\r
1142       if (is_adore == 0) {\r
1143         default_layer_and (0);\r
1144         default_layer_or ((1UL << ADORE));\r
1145         eeconfig_update_default_layer ((1UL << ADORE));\r
1146         is_adore = 1;\r
1147 \r
1148         ergodox_led_all_off ();\r
1149         ergodox_right_led_3_on ();\r
1150         wait_ms (100);\r
1151         ergodox_right_led_2_on ();\r
1152         wait_ms (100);\r
1153         ergodox_right_led_3_off ();\r
1154         ergodox_right_led_1_on ();\r
1155         wait_ms (100);\r
1156         ergodox_right_led_2_off ();\r
1157         wait_ms (100);\r
1158         ergodox_right_led_1_off ();\r
1159       } else {\r
1160         is_adore = 0;\r
1161         default_layer_and (0);\r
1162         default_layer_or (1UL << BASE);\r
1163         eeconfig_update_default_layer ((1UL << BASE));\r
1164 \r
1165         ergodox_led_all_off ();\r
1166         ergodox_right_led_1_on ();\r
1167         wait_ms (100);\r
1168         ergodox_right_led_2_on ();\r
1169         wait_ms (100);\r
1170         ergodox_right_led_1_off ();\r
1171         ergodox_right_led_3_on ();\r
1172         wait_ms (100);\r
1173         ergodox_right_led_2_off ();\r
1174         wait_ms (100);\r
1175         ergodox_right_led_3_off ();\r
1176       }\r
1177     }\r
1178   }\r
1179 }\r
1180 \r
1181 static uint16_t last4[4];\r
1182 \r
1183 bool process_record_user (uint16_t keycode, keyrecord_t *record) {\r
1184 #if KEYLOGGER_ENABLE\r
1185   uint8_t layer = biton32(layer_state);\r
1186 \r
1187   if (log_enable && layer == BASE) {\r
1188     xprintf ("KL: col=%d, row=%d\n", record->event.key.col,\r
1189              record->event.key.row);\r
1190   }\r
1191 #endif\r
1192 \r
1193   if (time_travel && !record->event.pressed) {\r
1194     uint8_t p;\r
1195 \r
1196     // shift cache one to the left\r
1197     for (p = 0; p < 3; p++) {\r
1198       last4[p] = last4[p + 1];\r
1199     }\r
1200     last4[3] = keycode;\r
1201 \r
1202     if (last4[0] == KC_D && last4[1] == KC_A && last4[2] == KC_T && last4[3] == KC_E) {\r
1203       uint16_t codes[] = {KC_E, KC_SPC, KC_MINS, KC_D, KC_SPC, KC_QUOT, 0};\r
1204       ang_tap (codes);\r
1205       register_code (KC_RSFT);\r
1206       register_code (KC_EQL);\r
1207       unregister_code (KC_EQL);\r
1208       unregister_code (KC_RSFT);\r
1209 \r
1210       uint16_t codes2[] = {KC_4, KC_SPC, KC_D, KC_A, KC_Y, KC_S, KC_QUOT, 0};\r
1211       ang_tap (codes2);\r
1212 \r
1213       return false;\r
1214     }\r
1215   }\r
1216 \r
1217   return true;\r
1218 }\r