]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboards/ergodox/keymaps/ordinary/keymap.c
Merge pull request #1097 from stanleylai/master
[qmk_firmware.git] / keyboards / ergodox / keymaps / ordinary / keymap.c
1 #include "ergodox.h"
2 #include "led.h"
3 #include "mousekey.h"
4 #include "debug.h"
5 #include "action_layer.h"
6 #include "action_util.h"
7
8 #define BASE   0 // default layer
9 #define SYMB   1 // symbols layer
10 #define MDIA   2 // media layer
11 #define SPEC   3 // special layer
12 #define RBASE  4 // reverse default layer
13
14 #define LSymb 10 // left symbol-shift key
15 #define LMdia 11 // left media-shift key
16 #define LSpec 12 // left special-shift key
17 #define RSymb 13 // right symbol-shift key
18 #define RMdia 14 // right media-shift key
19 #define RSpec 15 // right special-shift key
20
21 #define NotEq 16 // != macro
22 #define GrtEq 17 // >= macro
23 #define LesEq 18 // <= macro
24 #define DeRef 19 // -> macro
25
26 #define MUL   20 // mouse up left
27 #define MUR   21 // mouse up right
28 #define MDL   22 // mouse down left
29 #define MDR   23 // mouse down right
30
31
32
33 /*
34  * The Ordinary Layout for the Ergodox EZ keyboard, v5
35  *
36  * Modifications from the default Ergodox EZ layout
37  * by Nicholas Keene ergodoxez@nicholaskeene.com
38  *
39  * No rights reserved. This software is in the public domain.
40  * Credit me if you are friendly but if you're a jerk don't bother.
41  * If you use or modify this layout I would love to hear from you.
42  *
43  * Details: readme.md
44  *          https://github.com/nrrkeene/qmk_firmware/tree/master/keyboards/ergodox/keymaps/ordinary
45  */
46
47 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
48
49 /******* Base Layer ****************************************************************************************************
50  *
51  * ,------------------------------------------------------.       ,------------------------------------------------------.
52  * | Special `~ |   1  |   2  |   3  |   4  |   5  | ESC  |       |  -   |   6  |   7  |   8  |   9  |   0  | =+ Special |
53  * |------------+------+------+------+------+-------------|       |------+------+------+------+------+------+------------|
54  * | Media  Tab |   Q  |   W  |   E  |   R  |   T  |   [  |       |  ]   |   Y  |   U  |   I  |   O  |   P  | \|   Media |
55  * |------------+------+------+------+------+------|      |       |      |------+------+------+------+------+------------|
56  * | Symbol     |  ^A  |   S  |   D  |  ^F  |   G  |------|       |------|   H  |  ^J  |   K  |   L  |  ^;  | '"  Symbol |
57  * |------------+------+------+------+------+------|Shift |       | Tab  |------+------+------+------+------+------------|
58  * | Capitals   |   Z  |   X  |   C  |   V  |   B  | -Tab |       |      |   N  |   M  |   ,  |   .  |  /   |   Capitals |
59  * `------------+------+------+------+------+-------------'       `-------------+------+------+------+------+------------'
60  *      | LCtrl | Meh  |Hyper | LAlt | LGui |                                   | RGui | RAlt | Hyper|  Meh | RCtrl |
61  *      `-----------------------------------'                                   `-----------------------------------'
62  *                                          ,-------------.       ,-------------.
63  *                                          | Home | End  |       | Left | Right|
64  *                                   ,------|------|------|       |------+------+------.
65  *                                   |      |      | PgUp |       |  Up  |      |      |
66  *                                   |Backsp| Del  |------|       |------| Enter| Space|
67  *                                   |      |      | PgDn |       | Down |      |      |
68  *                                   `--------------------'       `--------------------'
69  */
70 [BASE] = KEYMAP(
71 // left hand
72  F(LSpec)  ,KC_1           ,KC_2   ,KC_3   ,KC_4  ,KC_5  ,KC_ESC
73 ,F(LMdia)  ,KC_Q           ,KC_W   ,KC_E   ,KC_R  ,KC_T  ,KC_LBRC
74 ,M(LSymb)  ,LT(RBASE, KC_A),KC_S   ,KC_D   ,LT(RBASE, KC_F)  ,KC_G
75 ,KC_LSFT   ,KC_Z           ,KC_X   ,KC_C   ,KC_V  ,KC_B  ,LSFT(KC_TAB)
76 ,KC_LCTL   ,MEH_T(KC_NO)   ,ALL_T(KC_NO),KC_LALT,KC_LGUI
77                                          ,KC_HOME,KC_END
78                                                  ,KC_PGUP
79                                  ,KC_BSPC,KC_DEL ,KC_PGDN
80                                                                   // right hand
81                                                                  ,KC_MINS ,KC_6 ,KC_7           ,KC_8   ,KC_9   ,KC_0             ,F(RSpec)
82                                                                  ,KC_RBRC ,KC_Y ,KC_U           ,KC_I   ,KC_O   ,KC_P             ,F(RMdia)
83                                                                           ,KC_H ,LT(RBASE, KC_J),KC_K   ,KC_L   ,LT(RBASE,KC_SCLN),F(RSymb)
84                                                                  ,KC_TAB  ,KC_N ,KC_M           ,KC_COMM,KC_DOT ,KC_SLSH          ,KC_RSFT
85                                                                                 ,KC_RGUI        ,KC_RALT,KC_HYPR,KC_MEH           ,KC_RCTL
86                                                                  ,KC_LEFT ,KC_RGHT
87                                                                  ,KC_UP
88                                                                  ,KC_DOWN ,KC_ENT ,KC_SPC
89 ),
90
91 /******* Symbols Layer *************************************************************************************************
92  *
93  * ,-----------------------------------------------------.       ,-----------------------------------------------------.
94  * |           |  F1  |  F2  |  F3  |  F4  |  F5  | Esc  |       |  -   |  F6  |  F7  |  F8  |  F9  |  F10 |           |
95  * |-----------+------+------+------+------+-------------|       |------+------+------+------+------+------+-----------|
96  * |           |   !  |   @  |   {  |   }  |   &  |  <   |       |  >   |   |  |   7  |   8  |   9  |   /  |           |
97  * |-----------+------+------+------+------+------|      |       |      |------+------+------+------+------+-----------|
98  * |           |   #  |   $  |   (  |   )  |   `  |------|       |------|   /  |   4  |   5  |   6  |   *  |           |
99  * |-----------+------+------+------+------+------|  '   |       |  "   |------+------+------+------+------+-----------|
100  * |           |   %  |   ^  |   [  |   ]  |   ~  |      |       |      |   \  |   1  |   2  |   3  |   -  |           |
101  * `-----------+------+------+------+------+-------------'       `-------------+------+------+------+------+-----------'
102  *     |   ;   |   &  |   *  |   <  |   >  |                                   |   0  |   .  |   =  |   +  | Enter |
103  *     `-----------------------------------'                                   `-----------------------------------'
104  *                                         ,-------------.       ,-------------.
105  *                                         | |||| | |||| |       | |||| | |||| |
106  *                                  ,------|------|------|       |------+------+------.
107  *                                  | Plus | Equal| |||| |       | |||| | Under| Dash |
108  *                                  |      |      |------|       |------| Score|      |
109  *                                  |  +   |   =  |  !=  |       |  ->  |  _   |  -   |
110  *                                  `--------------------'       `--------------------'
111  */
112 [SYMB] = KEYMAP(
113 // left hand
114  KC_TRNS ,KC_F1       ,KC_F2        ,KC_F3   ,KC_F4   ,KC_F5   ,KC_ESC
115 ,KC_TRNS ,KC_EXLM     ,KC_AT        ,KC_LCBR ,KC_RCBR ,KC_AMPR ,LSFT(KC_COMM)
116 ,KC_TRNS ,KC_HASH     ,KC_DLR       ,KC_LPRN ,KC_RPRN ,KC_GRV
117 ,KC_TRNS ,KC_PERC     ,KC_CIRC      ,KC_LBRC ,KC_RBRC ,KC_TILD ,KC_QUOT
118 ,KC_SCLN ,KC_AMPR     ,KC_ASTR ,LSFT(KC_COMM),LSFT(KC_DOT)
119                                                       ,M(GrtEq),M(LesEq)
120                                                                ,KC_NO
121                                              ,KC_PLUS ,KC_EQL  ,M(NotEq)
122                                                                  // right hand
123                                                                  ,KC_MINS     ,KC_F6        ,KC_F7 ,KC_F8  ,KC_F9 ,KC_F10  ,KC_TRNS
124                                                                  ,LSFT(KC_DOT),KC_PIPE      ,KC_7  ,KC_8   ,KC_9  ,KC_SLSH ,KC_TRNS
125                                                                               ,KC_SLSH      ,KC_4  ,KC_5   ,KC_6  ,KC_ASTR ,KC_TRNS
126                                                                  ,LSFT(KC_QUOT),KC_BSLS     ,KC_1  ,KC_2   ,KC_3  ,KC_MINS ,KC_TRNS
127                                                                                             ,KC_0  ,KC_DOT ,KC_EQL,KC_PLUS ,KC_ENT
128                                                                  ,KC_NO       ,KC_NO
129                                                                  ,KC_NO
130                                                                  ,M(DeRef)    ,LSFT(KC_MINS),KC_MINS
131 ),
132
133 /******* Media Layer *******************************************************************************************************
134  *
135  * ,---------------------------------------------------------------.    ,---------------------------------------------------------------.
136  * |      |   F11   |   F12   |   F13   |   F14   |   F15   | Esc  |    | |||| |   F16   |   F17   |   F18   |   F19   |   F20   |      |
137  * |------+---------+---------+---------+---------+----------------|    |------+---------+---------+---------+---------+---------+------|
138  * |      |Shut Down|MouseUpLf|Mouse Up |MouseUpRg|Volume Up|Scroll|    |Scroll|PrintScrn|   Home  |    Up   |   PgUp  |   Mail  |      |
139  * |------+---------+---------+---------+---------+---------|  Up  |    |  Up  |---------+---------+---------+---------+---------+------|
140  * |      |  Sleep  |MouseLeft|MouseDown|MouseRght|Volume Dn|------|    |------| Num Lock|   Left  |   Down  |   Right | MyComp  |      |
141  * |------+---------+---------+---------+---------+---------|Scroll|    |Scroll|---------+---------+---------+---------+---------+------|
142  * |      |  ||||   |MouseDnLf|MouseDown|MouseDnRg|  Mute   | Down |    | Down |  ||||   |   End   |   Down  |   PgDn  |  ||||   |      |
143  * `------+---------+---------+---------+---------+----------------'    `----------------+---------+---------+---------+---------+------'
144  *  | ||| |  ||||   |  MClick | LClick  |  R Click|                                      |  Insert |   Del   |   ||||  |  ||||   | ||| |
145  *  `---------------------------------------------'                                      `---------------------------------------------'
146  *                                                   ,-------------.    ,-------------.
147  *                                                   | Stop |Refrsh|    | Prev | Next |
148  *                                            ,------|------|------|    |------+------+------.
149  *                                            |Brwser|Brwser|Search|    |VolUp |      |      |
150  *                                            |Back  | Fwd  |------|    |------| Stop | Play-|
151  *                                            |      |      | Home |    |VolDn |      | Pause|
152  *                                            `--------------------'    `--------------------'
153  */
154 [MDIA] = KEYMAP(
155 // left hand
156  KC_TRNS ,KC_F11   ,KC_F12  ,KC_F13   ,KC_F14  ,KC_F15  ,KC_ESC
157 ,KC_TRNS ,KC_POWER ,M(MUL)  ,KC_MS_U  ,M(MUR)  ,KC_VOLU ,KC_WH_U
158 ,KC_TRNS ,KC_SLEP  ,KC_MS_L ,KC_MS_D  ,KC_MS_R ,KC_VOLD
159 ,KC_TRNS ,KC_NO    ,M(MDL)  ,KC_MS_D  ,M(MDR)  ,KC_MUTE ,KC_WH_D
160 ,KC_NO ,KC_NO   ,KC_BTN3 ,KC_BTN1  ,KC_BTN2
161                                                ,KC_WSTP ,KC_WREF
162                                                         ,KC_WSCH
163                                       ,KC_WBAK ,KC_NO   ,KC_WHOM
164                                                                      // right hand
165                                                                      ,KC_NO    ,KC_F16  ,KC_F17       ,KC_F18       ,KC_F19  ,KC_F20  ,KC_TRNS
166                                                                      ,KC_WH_U  ,KC_PSCR ,KC_HOME      ,KC_UP        ,KC_PGUP ,KC_MAIL ,KC_TRNS
167                                                                                ,KC_NLCK ,KC_LEFT      ,KC_DOWN      ,KC_RIGHT,KC_MYCM ,KC_TRNS
168                                                                      ,KC_WH_D  ,KC_NO   ,KC_END       ,KC_DOWN      ,KC_PGDN ,KC_NO   ,KC_TRNS
169                                                                                         ,KC_INS       ,KC_DEL       ,KC_NO   ,KC_NO   ,KC_NO
170                                                                      ,KC_MPRV  ,KC_MNXT
171                                                                      ,KC_VOLU
172                                                                      ,KC_VOLD  ,KC_MSTP ,KC_MPLY
173 ),
174
175 /******* Special Layer *****************************************************************************************************
176  *
177  * ,-------------------------------------------------------.    ,-------------------------------------------------------.
178  * |             |  Esc |      |      |      |      |      |    |      |      |      |      |   -  | Bspc |             |
179  * |-------------+------+------+------+------+-------------|    |------+------+------+------+------+------+-------------|
180  * | Media Lock  |      |      |      |      |      |      |    |      |      |      |      |  [   |   ]  | Media Lock  |
181  * |-------------+------+------+------+------+------|      |    |      |------+------+------+------+------+-------------|
182  * | Symbol Lock |      |      |      |      |      |------|    |------|      |      |      |      |      | Symbol Lock |
183  * |-------------+------+------+------+------+------|      |    |      |------+------+------+------+------+-------------|
184  * | Caps Lock   |      |      |      |      |      |      |    |      |      |      |      |      |      | Caps Lock   |
185  * `-------------+------+------+------+------+-------------'    `-------------+------+------+------+------+-------------'
186  *      |        |      |      |      |      |                                |      |      |      |      |        |
187  *      `------------------------------------'                                `------------------------------------'
188  *                                         ,-------------.     ,-------------.
189  *                                         |      |      |     |      |      |
190  *                                  ,------|------|------|     |------+------+------.
191  *                                  |      |      |      |     |      |      |      |
192  *                                  |      |      |------|     |------|      |      |
193  *                                  |      |      |      |     |      |      |      |
194  *                                  `--------------------'     `--------------------'
195  */
196 [SPEC] = KEYMAP(
197 // left hand
198  KC_TRNS ,KC_ESC  ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
199 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
200 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
201 ,KC_CAPS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
202 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
203                                              ,KC_TRNS ,KC_TRNS
204                                                       ,KC_TRNS
205                                      ,KC_TRNS,KC_TRNS ,KC_TRNS
206                                                              // right hand
207                                                              ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_MINS ,KC_BSPC ,KC_TRNS
208                                                              ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_LBRC ,KC_RBRC ,KC_TRNS
209                                                                       ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
210                                                              ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_CAPS
211                                                                                ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
212                                                              ,KC_TRNS ,KC_TRNS
213                                                              ,KC_TRNS
214                                                              ,KC_TRNS ,KC_TRNS ,KC_TRNS
215 ),
216
217 /******* Reverse Base Layer *********************************************************************************************
218  *
219  * ,------------------------------------------------------.       ,------------------------------------------------------.
220  * |    =+      |   0  |   9  |   8  |   7  |   6  |  -   |       |  Esc |   5  |   4  |   3  |   2  |   1  |    `~      |
221  * |------------+------+------+------+------+-------------|       |------+------+------+------+------+------+------------|
222  * |    \|      |   P  |   O  |   I  |   U  |   Y  |   ]  |       |  [   |   T  |   R  |   E  |   W  |   Q  |    Tab     |
223  * |------------+------+------+------+------+------|      |       |      |------+------+------+------+------+------------|
224  * |    '"      |   ;  |   L  |   K  |   J  |   H  |------|       |------|   G  |   F  |   D  |   S  |  A   |            |
225  * |------------+------+------+------+------+------| Tab  |       |Shift |------+------+------+------+------+------------|
226  * | Capitals   |   /  |   .  |   ,  |   M  |   N  |      |       | -Tab |   B  |   V  |   C  |   X  |  Z   |   Capitals |
227  * `------------+------+------+------+------+-------------'       `-------------+------+------+------+------+------------'
228  *      | LCtrl | Meh  |Hyper | LAlt | LGui |                                   | RGui | RAlt | Hyper|  Meh | RCtrl |
229  *      `-----------------------------------'                                   `-----------------------------------'
230  *                                         ,-------------.       ,-------------.
231  *                                         | Left | Right|       | Home | End  |
232  *                                  ,------|------|------|       |------+------+------.
233  *                                  |      |      |  Up  |       | PgUp |      |      |
234  *                                  |Space |Enter |------|       |------|BackSp| Del  |
235  *                                  |      |      | Down |       | PgDn |      |      |
236  *                                  `--------------------'       `--------------------'
237  */
238 [RBASE] = KEYMAP(
239 // left hand
240  KC_EQL    ,KC_0        ,KC_9   ,KC_8   ,KC_7  ,KC_6  ,KC_MINS
241 ,KC_BSLS   ,KC_P        ,KC_O   ,KC_I   ,KC_U  ,KC_Y  ,KC_RBRC
242 ,KC_QUOT     ,LT(RBASE, KC_SCLN)     ,KC_L   ,KC_K   ,LT(RBASE, KC_J)  ,KC_H
243 ,KC_RSFT   ,KC_SLSH     ,KC_DOT ,KC_COMM,KC_M  ,KC_N  ,KC_TAB
244 ,KC_RCTL   ,MEH_T(KC_NO),ALL_T(KC_NO),KC_RALT,KC_RGUI
245                                              ,KC_LEFT ,KC_RGHT
246                                                       ,KC_UP
247                                     ,KC_SPC  ,KC_ENT  ,KC_DOWN
248                                                                   // right hand
249                                                                  ,KC_ESC      ,KC_5   ,KC_4   ,KC_3   ,KC_2    ,KC_1  ,KC_GRV
250                                                                  ,KC_LBRC     ,KC_T   ,KC_R   ,KC_E   ,KC_W    ,KC_Q  ,KC_TAB
251                                                                               ,KC_G   ,LT(RBASE, KC_F),KC_D   ,KC_S   ,LT(RBASE, KC_A)  ,KC_NO
252                                                                  ,LSFT(KC_TAB),KC_B   ,KC_V   ,KC_C   ,KC_X    ,KC_Z  ,KC_LSFT
253                                                                                       ,KC_LGUI,KC_LALT,KC_HYPR ,KC_MEH,KC_LCTL
254                                                                  ,KC_HOME     ,KC_END
255                                                                  ,KC_PGUP
256                                                                  ,KC_PGDN     ,KC_BSPC ,KC_DEL
257 )
258 };
259
260 const uint16_t PROGMEM fn_actions[] = {
261      // the faux shift keys are implemented as macro taps
262      [LSymb] = ACTION_MACRO_TAP(LSymb)
263     ,[LMdia] = ACTION_MACRO_TAP(LMdia)
264     ,[LSpec] = ACTION_MACRO_TAP(LSpec)
265     ,[RSymb] = ACTION_MACRO_TAP(RSymb)
266     ,[RMdia] = ACTION_MACRO_TAP(RMdia)
267     ,[RSpec] = ACTION_MACRO_TAP(RSpec)
268 };
269
270 uint16_t symb_shift = 0;
271 uint16_t mdia_shift = 0;
272 uint16_t spec_shift = 0;
273
274 bool mdia_lock = false;
275 bool symb_lock = false;
276
277 const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
278 {
279     switch(id) {
280         // There are two shift keys for each layer so we increment a layer_shift var when one
281         // is pressed and decrement when one is released. The shift counts are bound between 0 and 2
282         // only because sometimes rapid pressing led to irregular events; this way the states
283         // are self healing during use.
284
285         case LSymb:                                               //
286         if (record->event.pressed) {                              // when the LSymb button is pressed
287             if(++symb_shift > 2) symb_shift = 2;                  // increment the symb shift count, max two
288             if(spec_shift) symb_lock = !symb_lock;                // if the Special layer is on, toggle the shift lock
289             layer_on(SYMB);                                       // in any case, turn on the Symbols layer
290         } else {                                                  // when the LSymb button is released
291             if(--symb_shift < 0) symb_shift = 0;                  // decrement the shift count, minimum zero
292             if((!symb_shift) && (!symb_lock)) layer_off(SYMB);    // if both shifts are released and the lock is off, turn off the Symbols layer
293         }
294         break;
295
296         case LMdia:
297         if (record->event.pressed) {
298            if (record->tap.count && (!mdia_shift) && (!mdia_lock) && (!spec_shift)) {
299                 register_code(KC_TAB);
300             } else {
301                 if(spec_shift) mdia_lock = !mdia_lock;
302                 if(++mdia_shift > 2) mdia_shift = 2;
303                 layer_on(MDIA);
304             }
305         } else {
306             if(record->tap.count && (!mdia_shift) && (!mdia_lock) && (!spec_shift)) {
307                 unregister_code(KC_TAB);
308             } else {
309                 if(--mdia_shift < 0) mdia_shift = 0;
310                 if((!mdia_shift) && (!mdia_lock)) layer_off(MDIA);
311             }
312         }
313         break;
314
315         case LSpec:
316         if (record->event.pressed) {                                     // when the LSpec button is pressed
317             if(symb_shift) symb_lock = !symb_lock;                       // if another layer button is engaged, then
318             else if(mdia_shift) mdia_lock = !mdia_lock;                  // lock that layer, be it caps or symb or mdia
319             else if (record->tap.count && !record->tap.interrupted && (!spec_shift)) {
320                 register_code(KC_GRV);                                   // otherwise, if it's an uninterrupted tap, emit a char
321             } else {
322                 if(++spec_shift > 2) spec_shift = 2;
323                 layer_on(SPEC);                                          // otherwise, turn on the Special layer
324             }
325         } else {
326             if(record->tap.count && !record->tap.interrupted && (!spec_shift)) {
327                 unregister_code(KC_GRV);
328             } else {
329                 if(--spec_shift < 0) spec_shift = 0;
330                 if(!spec_shift) layer_off(SPEC);
331             }
332         }
333         break;
334
335         case RSymb:
336         if (record->event.pressed) {
337             if (record->tap.count && (!symb_shift) && (!symb_lock) && (!spec_shift)) {
338                 register_code(KC_QUOT);
339             } else {
340                 if(++symb_shift > 2) symb_shift = 2;
341                 if(spec_shift) symb_lock = !symb_lock;
342                 layer_on(SYMB);
343             }
344         } else {
345             if(record->tap.count && (!symb_shift) && (!symb_lock) && (!spec_shift)) {
346                 unregister_code(KC_QUOT);
347             } else {
348                 if(--symb_shift < 0) symb_shift = 0;
349                 if((!symb_shift) && (!symb_lock)) layer_off(SYMB);
350             }
351         }
352         break;
353
354         case RMdia:
355         if (record->event.pressed) {
356             if (record->tap.count && (!mdia_shift) && (!mdia_lock) && (!spec_shift)) {
357                 register_code(KC_BSLS);
358             } else {
359                 if(++mdia_shift > 2) mdia_shift = 2;
360                 if(spec_shift) mdia_lock = !mdia_lock;
361                 layer_on(MDIA);
362             }
363         } else {
364             if(record->tap.count && (!mdia_shift) && (!mdia_lock) && (!spec_shift)) {
365                 unregister_code(KC_BSLS);
366             } else {
367                 if(--mdia_shift < 0) mdia_shift = 0;
368                 if((!mdia_shift) && (!mdia_lock)) layer_off(MDIA);
369             }
370         }
371         break;
372
373         case RSpec:
374         if (record->event.pressed) {
375             if(symb_shift) symb_lock = !symb_lock;
376             else if(mdia_shift) mdia_lock = !mdia_lock;
377             else if (record->tap.count && !record->tap.interrupted && (!spec_shift)) {
378                 register_code(KC_EQL);
379             } else {
380                 if(++spec_shift > 2) spec_shift = 2;
381                 layer_on(SPEC);
382             }
383         } else {
384             if(record->tap.count && !record->tap.interrupted && (!spec_shift)) {
385                 unregister_code(KC_EQL);
386             } else {
387                 if(--spec_shift < 0) spec_shift = 0;
388                 if(!spec_shift) layer_off(SPEC);
389             }
390         }
391         break;
392
393         case NotEq:
394         if (record->event.pressed) {
395             return MACRO( I(10), D(LSFT), T(EXLM), U(LSFT), T(EQL), END  ); // !=
396         }
397         break;
398
399         case GrtEq:
400         if (record->event.pressed) {
401             return MACRO( I(10), D(LSFT), T(COMM), U(LSFT), T(EQL), END  ); // <=
402         }
403         break;
404
405         case LesEq:
406         if (record->event.pressed) {
407             return MACRO( I(10), D(LSFT), T(DOT), U(LSFT), T(EQL), END  ); // >=
408         }
409         break;
410
411         case DeRef:
412         if (record->event.pressed) {
413             return MACRO( I(10), T(MINS), D(LSFT), T(DOT), U(LSFT), END  ); // ->
414         }
415         break;
416
417         // mouse diagonals
418
419         case MUL: // mouse up left
420         if (record->event.pressed) {
421             mousekey_on(KC_MS_UP);
422             mousekey_on(KC_MS_LEFT);
423             mousekey_send();
424         } else {
425             mousekey_off(KC_MS_UP);
426             mousekey_off(KC_MS_LEFT);
427             mousekey_send();
428         }
429         break;
430
431         case MUR: // mouse up right
432         if (record->event.pressed) {
433             mousekey_on(KC_MS_UP);
434             mousekey_on(KC_MS_RIGHT);
435             mousekey_send();
436         } else {
437             mousekey_off(KC_MS_UP);
438             mousekey_off(KC_MS_RIGHT);
439             mousekey_send();
440         }
441         break;
442
443         case MDL: // mouse down left
444         if (record->event.pressed) {
445             mousekey_on(KC_MS_DOWN);
446             mousekey_on(KC_MS_LEFT);
447             mousekey_send();
448         } else {
449             mousekey_off(KC_MS_DOWN);
450             mousekey_off(KC_MS_LEFT);
451             mousekey_send();
452         }
453         break;
454
455         case MDR: // mouse down right
456         if (record->event.pressed) {
457             mousekey_on(KC_MS_DOWN);
458             mousekey_on(KC_MS_RIGHT);
459             mousekey_send();
460         } else {
461             mousekey_off(KC_MS_DOWN);
462             mousekey_off(KC_MS_RIGHT);
463             mousekey_send();
464         }
465         break;
466
467         default:
468             // none
469             break;
470     }
471
472     return MACRO_NONE;
473 };
474
475 // Runs just one time when the keyboard initializes.
476 void matrix_init_user(void) {
477
478 };
479
480 // Runs constantly in the background, in a loop.
481 void matrix_scan_user(void) {
482     // shift or caps lock turns on red light
483     if((keyboard_report->mods & MOD_BIT(KC_LSFT))
484     || (keyboard_report->mods & MOD_BIT(KC_RSFT))
485     || (host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK))) {
486         ergodox_right_led_1_on();
487     } else {
488         ergodox_right_led_1_off();
489     }
490
491     // Symbol layer turns on green light
492     if(layer_state & (1UL<<SYMB)) {
493         ergodox_right_led_2_on();
494     } else {
495         ergodox_right_led_2_off();
496     }
497
498     // Media layer turns on blue light
499     if(layer_state & (1UL<<MDIA)) {
500         ergodox_right_led_3_on();
501     } else {
502         ergodox_right_led_3_off();
503     }
504 };