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