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