diff options
Diffstat (limited to 'layouts/community/ergodox/ordinary/keymap.c')
-rw-r--r-- | layouts/community/ergodox/ordinary/keymap.c | 288 |
1 files changed, 22 insertions, 266 deletions
diff --git a/layouts/community/ergodox/ordinary/keymap.c b/layouts/community/ergodox/ordinary/keymap.c index 86ab86491..8d0425e49 100644 --- a/layouts/community/ergodox/ordinary/keymap.c +++ b/layouts/community/ergodox/ordinary/keymap.c | |||
@@ -1,34 +1,12 @@ | |||
1 | #include QMK_KEYBOARD_H | 1 | #include QMK_KEYBOARD_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 | 2 | ||
3 | enum layer_names { | ||
4 | BASE, // default layer | ||
5 | SYMB, // symbols layer | ||
6 | MDIA, // media layer | ||
7 | SPEC, // special layer | ||
8 | RBASE // reverse default layer | ||
9 | }; | ||
32 | 10 | ||
33 | /* | 11 | /* |
34 | * The Ordinary Layout for the Ergodox EZ keyboard, v5 | 12 | * The Ordinary Layout for the Ergodox EZ keyboard, v5 |
@@ -69,18 +47,18 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
69 | */ | 47 | */ |
70 | [BASE] = LAYOUT_ergodox( | 48 | [BASE] = LAYOUT_ergodox( |
71 | // left hand | 49 | // left hand |
72 | F(LSpec) ,KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 ,KC_ESC | 50 | KC_NO ,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 | 51 | ,KC_NO ,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 | 52 | ,KC_NO ,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) | 53 | ,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 | 54 | ,KC_LCTL ,MEH_T(KC_NO) ,ALL_T(KC_NO),KC_LALT,KC_LGUI |
77 | ,KC_HOME,KC_END | 55 | ,KC_HOME,KC_END |
78 | ,KC_PGUP | 56 | ,KC_PGUP |
79 | ,KC_BSPC,KC_DEL ,KC_PGDN | 57 | ,KC_BSPC,KC_DEL ,KC_PGDN |
80 | // right hand | 58 | // right hand |
81 | ,KC_MINS ,KC_6 ,KC_7 ,KC_8 ,KC_9 ,KC_0 ,F(RSpec) | 59 | ,KC_MINS ,KC_6 ,KC_7 ,KC_8 ,KC_9 ,KC_0 ,KC_NO |
82 | ,KC_RBRC ,KC_Y ,KC_U ,KC_I ,KC_O ,KC_P ,F(RMdia) | 60 | ,KC_RBRC ,KC_Y ,KC_U ,KC_I ,KC_O ,KC_P ,KC_NO |
83 | ,KC_H ,LT(RBASE, KC_J),KC_K ,KC_L ,LT(RBASE,KC_SCLN),F(RSymb) | 61 | ,KC_H ,LT(RBASE, KC_J),KC_K ,KC_L ,LT(RBASE,KC_SCLN),KC_NO |
84 | ,KC_TAB ,KC_N ,KC_M ,KC_COMM,KC_DOT ,KC_SLSH ,KC_RSFT | 62 | ,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 | 63 | ,KC_RGUI ,KC_RALT,KC_HYPR,KC_MEH ,KC_RCTL |
86 | ,KC_LEFT ,KC_RGHT | 64 | ,KC_LEFT ,KC_RGHT |
@@ -116,9 +94,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
116 | ,KC_TRNS ,KC_HASH ,KC_DLR ,KC_LPRN ,KC_RPRN ,KC_GRV | 94 | ,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 | 95 | ,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) | 96 | ,KC_SCLN ,KC_AMPR ,KC_ASTR ,LSFT(KC_COMM),LSFT(KC_DOT) |
119 | ,M(GrtEq),M(LesEq) | 97 | ,KC_NO,KC_NO |
120 | ,KC_NO | 98 | ,KC_NO |
121 | ,KC_PLUS ,KC_EQL ,M(NotEq) | 99 | ,KC_PLUS ,KC_EQL ,KC_NO |
122 | // right hand | 100 | // right hand |
123 | ,KC_MINS ,KC_F6 ,KC_F7 ,KC_F8 ,KC_F9 ,KC_F10 ,KC_TRNS | 101 | ,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 | 102 | ,LSFT(KC_DOT),KC_PIPE ,KC_7 ,KC_8 ,KC_9 ,KC_SLSH ,KC_TRNS |
@@ -127,7 +105,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
127 | ,KC_0 ,KC_DOT ,KC_EQL,KC_PLUS ,KC_ENT | 105 | ,KC_0 ,KC_DOT ,KC_EQL,KC_PLUS ,KC_ENT |
128 | ,KC_NO ,KC_NO | 106 | ,KC_NO ,KC_NO |
129 | ,KC_NO | 107 | ,KC_NO |
130 | ,M(DeRef) ,LSFT(KC_MINS),KC_MINS | 108 | ,KC_NO ,LSFT(KC_MINS),KC_MINS |
131 | ), | 109 | ), |
132 | 110 | ||
133 | /******* Media Layer ******************************************************************************************************* | 111 | /******* Media Layer ******************************************************************************************************* |
@@ -154,9 +132,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
154 | [MDIA] = LAYOUT_ergodox( | 132 | [MDIA] = LAYOUT_ergodox( |
155 | // left hand | 133 | // left hand |
156 | KC_TRNS ,KC_F11 ,KC_F12 ,KC_F13 ,KC_F14 ,KC_F15 ,KC_ESC | 134 | 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 | 135 | ,KC_TRNS ,KC_POWER ,KC_NO ,KC_MS_U ,KC_NO ,KC_VOLU ,KC_WH_U |
158 | ,KC_TRNS ,KC_SLEP ,KC_MS_L ,KC_MS_D ,KC_MS_R ,KC_VOLD | 136 | ,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 | 137 | ,KC_TRNS ,KC_NO ,KC_NO ,KC_MS_D ,KC_NO ,KC_MUTE ,KC_WH_D |
160 | ,KC_NO ,KC_NO ,KC_BTN3 ,KC_BTN1 ,KC_BTN2 | 138 | ,KC_NO ,KC_NO ,KC_BTN3 ,KC_BTN1 ,KC_BTN2 |
161 | ,KC_WSTP ,KC_WREF | 139 | ,KC_WSTP ,KC_WREF |
162 | ,KC_WSCH | 140 | ,KC_WSCH |
@@ -257,248 +235,26 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
257 | ) | 235 | ) |
258 | }; | 236 | }; |
259 | 237 | ||
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(1), 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. | 238 | // Runs constantly in the background, in a loop. |
481 | void matrix_scan_user(void) { | 239 | void matrix_scan_user(void) { |
482 | // shift or caps lock turns on red light | 240 | // shift or caps lock turns on red light |
483 | if((keyboard_report->mods & MOD_BIT(KC_LSFT)) | 241 | if ((keyboard_report->mods & MOD_BIT(KC_LSFT)) || (keyboard_report->mods & MOD_BIT(KC_RSFT)) || (host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK))) { |
484 | || (keyboard_report->mods & MOD_BIT(KC_RSFT)) | ||
485 | || (host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK))) { | ||
486 | ergodox_right_led_1_on(); | 242 | ergodox_right_led_1_on(); |
487 | } else { | 243 | } else { |
488 | ergodox_right_led_1_off(); | 244 | ergodox_right_led_1_off(); |
489 | } | 245 | } |
490 | 246 | ||
491 | // Symbol layer turns on green light | 247 | // Symbol layer turns on green light |
492 | if(layer_state & (1UL<<SYMB)) { | 248 | if (layer_state & (1UL<<SYMB)) { |
493 | ergodox_right_led_2_on(); | 249 | ergodox_right_led_2_on(); |
494 | } else { | 250 | } else { |
495 | ergodox_right_led_2_off(); | 251 | ergodox_right_led_2_off(); |
496 | } | 252 | } |
497 | 253 | ||
498 | // Media layer turns on blue light | 254 | // Media layer turns on blue light |
499 | if(layer_state & (1UL<<MDIA)) { | 255 | if (layer_state & (1UL<<MDIA)) { |
500 | ergodox_right_led_3_on(); | 256 | ergodox_right_led_3_on(); |
501 | } else { | 257 | } else { |
502 | ergodox_right_led_3_off(); | 258 | ergodox_right_led_3_off(); |
503 | } | 259 | } |
504 | }; | 260 | } |