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