@ -0,0 +1,238 @@ |
|||||||
|
#include "ergodox_ez.h" |
||||||
|
#include "debug.h" |
||||||
|
#include "action_layer.h" |
||||||
|
|
||||||
|
#define BASE 0 // default layer
|
||||||
|
#define SYMB 1 // symbols
|
||||||
|
#define MDIA 2 // media keys
|
||||||
|
#define UNIC 3 // unicode entry layer
|
||||||
|
|
||||||
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { |
||||||
|
/* Keymap 0: Basic layer
|
||||||
|
* |
||||||
|
* ,--------------------------------------------------. ,--------------------------------------------------. |
||||||
|
* | ESC | 1! | 2@ | 3# | 4$ | 5% | 6^ | | 7& | 8* | 9( | 0) | -_ | += | BkSp | |
||||||
|
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| |
||||||
|
* | Tab | Q | W | E | R | T | { | | } | Y | U | I | O | P | |\ | |
||||||
|
* |--------+------+------+------+------+------| [ | | ] |------+------+------+------+------+--------| |
||||||
|
* | Win | A | S | D | F | G |------| |------| H | J | K | L | :; | '" | |
||||||
|
* |--------+------+------+------+------+------| Home | | End |------+------+------+------+------+--------| |
||||||
|
* | LShift |Z/Alt | X | C | V | B | | | | N | M | , | . | Alt | RShift | |
||||||
|
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' |
||||||
|
* |LCtrl | COPY | PASTE| Left | Right| | Down | Up |Hyper | `~ | RCtrl | |
||||||
|
* `----------------------------------' `----------------------------------' |
||||||
|
* ,-------------. ,-------------. |
||||||
|
* Hyper = Ctrl+Super+Alt+Shift | ~L3 | F5 | | F2 | ~L2 | |
||||||
|
* ,------|------|------| |------+------+------. |
||||||
|
* | | | PgUp | | Ins | | | |
||||||
|
* | Enter| BkSp |------| |------| ~L1 |Space | |
||||||
|
* | | | PgDn | | Del | | | |
||||||
|
* `--------------------' `--------------------' |
||||||
|
*/ |
||||||
|
// If it accepts an argument (i.e, is a function), it doesn't need KC_.
|
||||||
|
// Otherwise, it needs KC_*
|
||||||
|
[BASE] = KEYMAP( // layer 0 : default
|
||||||
|
// left hand
|
||||||
|
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, |
||||||
|
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_LBRC, |
||||||
|
KC_LGUI, KC_A, KC_S, KC_D, KC_F, KC_G, |
||||||
|
KC_LSFT, ALT_T(KC_Z), KC_X, KC_C, KC_V, KC_B, KC_HOME, |
||||||
|
KC_LCTRL, LCTL(KC_C), LCTL(KC_V), KC_LEFT,KC_RGHT, |
||||||
|
KC_FN3, KC_F5, |
||||||
|
KC_PGUP, |
||||||
|
KC_ENT,KC_BSPC,KC_PGDN, |
||||||
|
// right hand
|
||||||
|
KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, |
||||||
|
KC_RBRC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, |
||||||
|
KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT, |
||||||
|
KC_END, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSFT, |
||||||
|
KC_DOWN,KC_UP, ALL_T(KC_NO),KC_GRV, KC_RCTRL, |
||||||
|
KC_F2, KC_FN2, |
||||||
|
KC_INS, |
||||||
|
KC_DELT,KC_FN1, KC_SPC |
||||||
|
), |
||||||
|
/* Keymap 1: Symbol Layer
|
||||||
|
* |
||||||
|
* ,--------------------------------------------------. ,--------------------------------------------------. |
||||||
|
* | | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 |PrintScr| |
||||||
|
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| |
||||||
|
* | | ! | @ | { | } | | | | | | Up | 7 | 8 | 9 | * | | |
||||||
|
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| |
||||||
|
* | | # | $ | ( | ) | ` |------| |------| Down | 4 | 5 | 6 | + | | |
||||||
|
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| |
||||||
|
* | | % | ^ | [ | ] | ~ | | | | & | 1 | 2 | 3 | \ | | |
||||||
|
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' |
||||||
|
* | | £ | | | | | | . | 0 | = |Alt+F4| |
||||||
|
* `----------------------------------' `----------------------------------' |
||||||
|
* ↑ ,-------------. ,-------------. |
||||||
|
* THERE! | | | | | | |
||||||
|
* ,------|------|------| |------+------+------. |
||||||
|
* CAD = Ctrl + Alt + Delete | | | | | | | | |
||||||
|
* | | |------| |------| | | |
||||||
|
* | | | | | CAD | | | |
||||||
|
* `--------------------' `--------------------' |
||||||
|
*/ |
||||||
|
// SYMBOLS
|
||||||
|
[SYMB] = KEYMAP( |
||||||
|
// left hand
|
||||||
|
KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, |
||||||
|
KC_TRNS,KC_EXLM,KC_AT, KC_LCBR,KC_RCBR,KC_PIPE,KC_TRNS, |
||||||
|
KC_TRNS,KC_HASH,KC_DLR, KC_LPRN,KC_RPRN,KC_GRV, |
||||||
|
KC_TRNS,KC_PERC,KC_CIRC,KC_LBRC,KC_RBRC,KC_TILD,KC_TRNS, |
||||||
|
KC_TRNS,M(3),KC_TRNS,KC_TRNS,KC_TRNS, |
||||||
|
KC_TRNS,KC_TRNS, |
||||||
|
KC_TRNS, |
||||||
|
KC_TRNS,KC_TRNS,KC_TRNS, |
||||||
|
// right hand
|
||||||
|
KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, |
||||||
|
KC_TRNS, KC_UP, KC_7, KC_8, KC_9, KC_ASTR, KC_TRNS, |
||||||
|
KC_DOWN, KC_4, KC_5, KC_6, KC_PLUS, KC_TRNS, |
||||||
|
KC_TRNS, KC_AMPR, KC_1, KC_2, KC_3, KC_BSLS, KC_TRNS, |
||||||
|
KC_TRNS,KC_DOT, KC_0, KC_EQL, LALT(KC_F4), |
||||||
|
KC_TRNS, KC_TRNS, |
||||||
|
KC_TRNS, |
||||||
|
LCTL(LALT(KC_DEL)), KC_TRNS, KC_TRNS |
||||||
|
), |
||||||
|
/* Keymap 2: Media and mouse keys
|
||||||
|
* |
||||||
|
* ,--------------------------------------------------. ,--------------------------------------------------. |
||||||
|
* | TEENSY | | | | | | | | | | | | | | | |
||||||
|
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| |
||||||
|
* | | | | MsUp | | | | | | | | | | | | |
||||||
|
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| |
||||||
|
* | | |MsLeft|MsDown|MsRght| |------| |------| | | | | | Play | |
||||||
|
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| |
||||||
|
* | | | | | | | | | | | | Prev | Next | | | |
||||||
|
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' |
||||||
|
* | | | | Lclk | Rclk | |VolDn |VolUp | Mute | | | |
||||||
|
* `----------------------------------' `----------------------------------' |
||||||
|
* ,-------------. ,-------------. |
||||||
|
* | | | | | | |
||||||
|
* ,------|------|------| |------+------+------. |
||||||
|
* | | | | | | |Brwser| |
||||||
|
* | | |------| |------| |Back | |
||||||
|
* | | | | | | | | |
||||||
|
* `--------------------' `--------------------' |
||||||
|
*/ |
||||||
|
// MEDIA AND MOUSE
|
||||||
|
[MDIA] = KEYMAP( |
||||||
|
RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS, |
||||||
|
KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS, |
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2, |
||||||
|
KC_TRNS, KC_TRNS, |
||||||
|
KC_TRNS, |
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, |
||||||
|
// right hand
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, |
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS, |
||||||
|
KC_VOLD, KC_VOLU, KC_MUTE, KC_TRNS, KC_TRNS, |
||||||
|
KC_TRNS, KC_TRNS, |
||||||
|
KC_TRNS, |
||||||
|
KC_TRNS, KC_TRNS, KC_WBAK |
||||||
|
), |
||||||
|
/* Keymap 3: Unicode Entry
|
||||||
|
* |
||||||
|
* ,--------------------------------------------------. ,--------------------------------------------------. |
||||||
|
* | Alt | 1 | 2 | 3 | 4 | 5 | 6 | | 7 | 8 | 9 | 0 | + | + | | |
||||||
|
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| |
||||||
|
* | Alt | | | E | | | | | | | 7 | 8 | 9 | + | | |
||||||
|
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| |
||||||
|
* | Alt | A | | D | F | |------| |------| | 4 | 5 | 6 | + | | |
||||||
|
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| |
||||||
|
* | Alt | | | C | | B | | | | | 1 | 2 | 3 | + | | |
||||||
|
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' |
||||||
|
* | Alt | Alt | Alt | | | | 0 | 0 | 0 | + | | |
||||||
|
* `----------------------------------' `----------------------------------' |
||||||
|
* ,-------------. ,-------------. |
||||||
|
* WINDOWS ONLY SETUP!! | ~L3 | | | | | |
||||||
|
* ,------|------|------| |------+------+------. |
||||||
|
* | | | | | | | | |
||||||
|
* | Alt | Alt |------| |------| Alt | Alt | |
||||||
|
* | | | | | | | | |
||||||
|
* `--------------------' `--------------------' |
||||||
|
*/ |
||||||
|
// If it accepts an argument (i.e, is a function), it doesn't need KC_.
|
||||||
|
// Otherwise, it needs KC_*
|
||||||
|
[UNIC] = KEYMAP( // layer 3 : Unicode Entry
|
||||||
|
// left hand
|
||||||
|
KC_LALT, KC_P1, KC_P2, KC_P3, KC_P4, KC_P5, KC_P6, |
||||||
|
KC_LALT, KC_TRNS, KC_TRNS, KC_E, KC_TRNS, KC_TRNS, KC_TRNS, |
||||||
|
KC_LALT, KC_A, KC_TRNS, KC_D, KC_F, KC_TRNS, |
||||||
|
KC_LALT, KC_TRNS, KC_TRNS, KC_C, KC_TRNS, KC_B, KC_TRNS, |
||||||
|
KC_LALT, KC_LALT, KC_LALT, KC_TRNS,KC_TRNS, |
||||||
|
KC_TRNS, KC_TRNS, |
||||||
|
KC_TRNS, |
||||||
|
KC_LALT,KC_LALT, KC_TRNS, |
||||||
|
// right hand
|
||||||
|
KC_P7, KC_P8, KC_P9, KC_P0, KC_PPLS,KC_PPLS, KC_TRNS, |
||||||
|
KC_TRNS, KC_TRNS, KC_P7, KC_P8, KC_P9, KC_PPLS, KC_TRNS, |
||||||
|
KC_TRNS, KC_P4, KC_P5, KC_P6, KC_PPLS, KC_TRNS, |
||||||
|
KC_TRNS, KC_TRNS, KC_P1, KC_P2, KC_P3, KC_PPLS, KC_TRNS, |
||||||
|
KC_P0, KC_P0, KC_P0, KC_PPLS, KC_TRNS, |
||||||
|
KC_TRNS, KC_TRNS, |
||||||
|
KC_TRNS, |
||||||
|
KC_TRNS,KC_LALT, KC_LALT |
||||||
|
), |
||||||
|
}; |
||||||
|
|
||||||
|
|
||||||
|
const uint16_t PROGMEM fn_actions[] = { |
||||||
|
[1] = ACTION_LAYER_TAP_TOGGLE(SYMB), // FN1 - Momentary Layer 1 (Symbols)
|
||||||
|
[2] = ACTION_LAYER_TAP_TOGGLE(MDIA), // FN2 - Momentary Layer 2 (Media)
|
||||||
|
[3] = ACTION_LAYER_TAP_TOGGLE(UNIC) // FN3 - Momentary Layer 3 (Unicode entry)
|
||||||
|
};
|
||||||
|
|
||||||
|
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) |
||||||
|
{ |
||||||
|
// MACRODOWN only works in this function
|
||||||
|
switch(id) { |
||||||
|
case 0: |
||||||
|
if (record->event.pressed) { |
||||||
|
register_code(KC_RSFT); |
||||||
|
} else { |
||||||
|
unregister_code(KC_RSFT); |
||||||
|
} |
||||||
|
case 3: // this would trigger when you hit a key mapped as M(3)
|
||||||
|
if (record->event.pressed) { |
||||||
|
return MACRO( I(255), D(LALT), T(P1), T(P5), T(P6), U(LALT), END ); |
||||||
|
} |
||||||
|
break; |
||||||
|
} |
||||||
|
return MACRO_NONE; |
||||||
|
}; |
||||||
|
|
||||||
|
// Runs just one time when the keyboard initializes.
|
||||||
|
void matrix_init_user(void) { |
||||||
|
|
||||||
|
}; |
||||||
|
|
||||||
|
// Runs constantly in the background, in a loop.
|
||||||
|
void matrix_scan_user(void) { |
||||||
|
|
||||||
|
uint8_t layer = biton32(layer_state); |
||||||
|
|
||||||
|
ergodox_board_led_off(); |
||||||
|
ergodox_right_led_1_off(); |
||||||
|
ergodox_right_led_2_off(); |
||||||
|
ergodox_right_led_3_off(); |
||||||
|
switch (layer) { |
||||||
|
// TODO: Make this relevant to the ErgoDox EZ.
|
||||||
|
case 1: |
||||||
|
ergodox_right_led_1_on(); |
||||||
|
break; |
||||||
|
case 2: |
||||||
|
ergodox_right_led_2_on(); |
||||||
|
break; |
||||||
|
case 3: |
||||||
|
ergodox_right_led_3_on(); |
||||||
|
break; |
||||||
|
default: |
||||||
|
// none
|
||||||
|
break; |
||||||
|
} |
||||||
|
|
||||||
|
}; |
@ -0,0 +1,179 @@ |
|||||||
|
Englishman in New York |
||||||
|
=========================== |
||||||
|
|
||||||
|
:microphone: :tea: |
||||||
|
|
||||||
|
About |
||||||
|
------ |
||||||
|
|
||||||
|
After using the massdrop configurator to get the basics, I wanted to add a |
||||||
|
little extra to my ergodox. Notably the Hyper hotkey, the press and hold, |
||||||
|
and a way to have my beloved £ :pound: symbol available<sup>[1](#unicode)</sup>. Why not switch to a GB |
||||||
|
layout? Well the computers I use are US keymap'd and I can't always change |
||||||
|
that. Plus I've got used to 2/@ and 3/# and moving to the ergodox was hard |
||||||
|
enough. :sweat_smile: |
||||||
|
|
||||||
|
I started from the default and edited from there as I needed. It's somewhat |
||||||
|
similar to a regular layout, particularly R1 and shift/controls. I ended up |
||||||
|
with a few keys that were blank, so I'm testing out some shortcuts. Alt+F4 for |
||||||
|
quitting things in Windows, is one example, but I felt it was better placed on |
||||||
|
the 1st layer - in case of fat fingers. |
||||||
|
|
||||||
|
Layout |
||||||
|
------- |
||||||
|
|
||||||
|
 |
||||||
|
|
||||||
|
### Base Layer |
||||||
|
|
||||||
|
``` |
||||||
|
,--------------------------------------------------. ,--------------------------------------------------. |
||||||
|
| ESC | 1! | 2@ | 3# | 4$ | 5% | 6^ | | 7& | 8* | 9( | 0) | -_ | += | BkSp | |
||||||
|
|--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| |
||||||
|
| Tab | Q | W | E | R | T | { | | } | Y | U | I | O | P | |\ | |
||||||
|
|--------+------+------+------+------+------| [ | | ] |------+------+------+------+------+--------| |
||||||
|
| Win | A | S | D | F | G |------| |------| H | J | K | L | :; | '" | |
||||||
|
|--------+------+------+------+------+------| Home | | End |------+------+------+------+------+--------| |
||||||
|
| LShift |Z/Alt | X | C | V | B | | | | N | M | , | . | Alt | RShift | |
||||||
|
`--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' |
||||||
|
|LCtrl | COPY | PASTE| Left | Right| | Down | Up |Hyper | `~ | RCtrl | |
||||||
|
`----------------------------------' `----------------------------------' |
||||||
|
,-------------. ,-------------. |
||||||
|
Hyper = Ctrl+Super+Alt+Shift | ~L3 | F5 | | F2 | ~L2 | |
||||||
|
,------|------|------| |------+------+------. |
||||||
|
| | | PgUp | | Ins | | | |
||||||
|
| Enter| BkSp |------| |------| ~L1 |Space | |
||||||
|
| | | PgDn | | Del | | | |
||||||
|
`--------------------' `--------------------' |
||||||
|
``` |
||||||
|
|
||||||
|
### Symbol Layer |
||||||
|
|
||||||
|
``` |
||||||
|
,--------------------------------------------------. ,--------------------------------------------------. |
||||||
|
| | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 |PrintScr| |
||||||
|
|--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| |
||||||
|
| | ! | @ | { | } | | | | | | Up | 7 | 8 | 9 | * | | |
||||||
|
|--------+------+------+------+------+------| | | |------+------+------+------+------+--------| |
||||||
|
| | # | $ | ( | ) | ` |------| |------| Down | 4 | 5 | 6 | + | | |
||||||
|
|--------+------+------+------+------+------| | | |------+------+------+------+------+--------| |
||||||
|
| | % | ^ | [ | ] | ~ | | | | & | 1 | 2 | 3 | \ | | |
||||||
|
`--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' |
||||||
|
| | £ | | | | | | . | 0 | = |Alt+F4| |
||||||
|
`----------------------------------' `----------------------------------' |
||||||
|
↑ ,-------------. ,-------------. |
||||||
|
THERE! | | | | | | |
||||||
|
,------|------|------| |------+------+------. |
||||||
|
CAD = Ctrl + Alt + Delete | | | | | | | | |
||||||
|
| | |------| |------| | | |
||||||
|
| | | | | CAD | | | |
||||||
|
`--------------------' `--------------------' |
||||||
|
``` |
||||||
|
### Media Layer |
||||||
|
|
||||||
|
Not touched this, not used either. |
||||||
|
|
||||||
|
``` |
||||||
|
,--------------------------------------------------. ,--------------------------------------------------. |
||||||
|
| TEENSY | | | | | | | | | | | | | | | |
||||||
|
|--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| |
||||||
|
| | | | MsUp | | | | | | | | | | | | |
||||||
|
|--------+------+------+------+------+------| | | |------+------+------+------+------+--------| |
||||||
|
| | |MsLeft|MsDown|MsRght| |------| |------| | | | | | Play | |
||||||
|
|--------+------+------+------+------+------| | | |------+------+------+------+------+--------| |
||||||
|
| | | | | | | | | | | | Prev | Next | | | |
||||||
|
`--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' |
||||||
|
| | | | Lclk | Rclk | |VolDn |VolUp | Mute | | | |
||||||
|
`----------------------------------' `----------------------------------' |
||||||
|
,-------------. ,-------------. |
||||||
|
| | | | | | |
||||||
|
,------|------|------| |------+------+------. |
||||||
|
| | | | | | |Brwser| |
||||||
|
| | |------| |------| |Back | |
||||||
|
| | | | | | | | |
||||||
|
`--------------------' `--------------------' |
||||||
|
``` |
||||||
|
### Unicode Layer |
||||||
|
|
||||||
|
Used to enter/test unicode input on Windows. All numbers are numpad keys. |
||||||
|
|
||||||
|
``` |
||||||
|
,--------------------------------------------------. ,--------------------------------------------------. |
||||||
|
| Alt | 1 | 2 | 3 | 4 | 5 | 6 | | 7 | 8 | 9 | 0 | + | + | | |
||||||
|
|--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| |
||||||
|
| Alt | | | E | | | | | | | 7 | 8 | 9 | + | | |
||||||
|
|--------+------+------+------+------+------| | | |------+------+------+------+------+--------| |
||||||
|
| Alt | A | | D | F | |------| |------| | 4 | 5 | 6 | + | | |
||||||
|
|--------+------+------+------+------+------| | | |------+------+------+------+------+--------| |
||||||
|
| Alt | | | C | | B | | | | | 1 | 2 | 3 | + | | |
||||||
|
`--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' |
||||||
|
| Alt | Alt | Alt | | | | 0 | 0 | 0 | + | | |
||||||
|
`----------------------------------' `----------------------------------' |
||||||
|
,-------------. ,-------------. |
||||||
|
WINDOWS ONLY SETUP!! | ~L3 | | | | | |
||||||
|
,------|------|------| |------+------+------. |
||||||
|
| | | | | | | | |
||||||
|
| Alt | Alt |------| |------| Alt | Alt | |
||||||
|
| | | | | | | | |
||||||
|
`--------------------' `--------------------' |
||||||
|
``` |
||||||
|
|
||||||
|
|
||||||
|
Usage |
||||||
|
------ |
||||||
|
|
||||||
|
~L1 / L2 / L3 will momentarily switch to a layer if held and another key is pressed. |
||||||
|
If pressed and released will remain on layer until pressed again. |
||||||
|
|
||||||
|
### Unicode |
||||||
|
|
||||||
|
This layout is for Windows only. To enter a character Press and Hold Alt, type + and hex code then release Alt. |
||||||
|
|
||||||
|
Changelog |
||||||
|
----------- |
||||||
|
|
||||||
|
### [0.2.1] - 2016-04-05 |
||||||
|
|
||||||
|
* Changed £ to alt code in Windows. Windows sucks at unicode. |
||||||
|
|
||||||
|
### [0.2.0] - 2016-03-27 |
||||||
|
|
||||||
|
* Added unicode layer |
||||||
|
* Moved Copy/Paste to left hand side |
||||||
|
* Switched Enter and Space (again) |
||||||
|
* Added L3 (unicode layer) toggle |
||||||
|
* Removed Press and Hold for Alt on right hand size (/) |
||||||
|
* Swapped Volume Up/Down to match arrows |
||||||
|
* Tried fixing £ macro |
||||||
|
* Removed * in the matrix function things (upstream change) |
||||||
|
|
||||||
|
### [0.1.1] - 2016-03-23 |
||||||
|
|
||||||
|
* Changed £ input to a macro |
||||||
|
|
||||||
|
|
||||||
|
### [0.1.0] - 2016-03-22 |
||||||
|
|
||||||
|
After actually using the keyboard, I've made some changes: |
||||||
|
|
||||||
|
* Swapped Enter and Space |
||||||
|
* Moved backspace to thumb keys (top right still remains) |
||||||
|
* Added Ctrl+Alt+Delete |
||||||
|
* Added Teensy Reset on 2nd layer |
||||||
|
* Switched Up and Down |
||||||
|
* Changed copy/paste to be Ctrl+c and Ctrl+v as KC_COPY/PASTE didn't work (in Windows) |
||||||
|
* Moved ~L2 to replace +L1 after learning how the function works (notes above) |
||||||
|
* Hopefully fixed GBP symbol (unicode enabled in MakeFile) |
||||||
|
|
||||||
|
### [0.0.1] - 2016-03-21 |
||||||
|
|
||||||
|
First version |
||||||
|
|
||||||
|
|
||||||
|
Issues |
||||||
|
------- |
||||||
|
|
||||||
|
Space for feedback and notes for future improvements |
||||||
|
|
||||||
|
---- |
||||||
|
<sup><a name="unicode">1</a></sup>: For Windows only, and you have to edit the [registry](https://en.wikipedia.org/wiki/Unicode_input#Hexadecimal_code_input). |
After Width: | Height: | Size: 814 KiB |
@ -0,0 +1,710 @@ |
|||||||
|
#!/usr/bin/env python |
||||||
|
# -*- coding: utf-8 -*- |
||||||
|
"""Compiler for keymap.c files |
||||||
|
|
||||||
|
This scrip will generate a keymap.c file from a simple |
||||||
|
markdown file with a specific layout. |
||||||
|
|
||||||
|
Usage: |
||||||
|
python compile_keymap.py INPUT_PATH [OUTPUT_PATH] |
||||||
|
""" |
||||||
|
from __future__ import division |
||||||
|
from __future__ import print_function |
||||||
|
from __future__ import absolute_import |
||||||
|
from __future__ import unicode_literals |
||||||
|
|
||||||
|
import os |
||||||
|
import io |
||||||
|
import re |
||||||
|
import sys |
||||||
|
import json |
||||||
|
import unicodedata |
||||||
|
import collections |
||||||
|
import itertools as it |
||||||
|
|
||||||
|
PY2 = sys.version_info.major == 2 |
||||||
|
|
||||||
|
if PY2: |
||||||
|
chr = unichr |
||||||
|
|
||||||
|
|
||||||
|
KEYBOARD_LAYOUTS = { |
||||||
|
# These map positions in the parsed layout to |
||||||
|
# positions in the KEYMAP MATRIX |
||||||
|
'ergodox_ez': [ |
||||||
|
[ 0, 1, 2, 3, 4, 5, 6], [38, 39, 40, 41, 42, 43, 44], |
||||||
|
[ 7, 8, 9, 10, 11, 12, 13], [45, 46, 47, 48, 49, 50, 51], |
||||||
|
[14, 15, 16, 17, 18, 19 ], [ 52, 53, 54, 55, 56, 57], |
||||||
|
[20, 21, 22, 23, 24, 25, 26], [58, 59, 60, 61, 62, 63, 64], |
||||||
|
[27, 28, 29, 30, 31 ], [ 65, 66, 67, 68, 69], |
||||||
|
[ 32, 33], [70, 71 ], |
||||||
|
[ 34], [72 ], |
||||||
|
[ 35, 36, 37], [73, 74, 75 ], |
||||||
|
] |
||||||
|
} |
||||||
|
|
||||||
|
ROW_INDENTS = { |
||||||
|
'ergodox_ez': [0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 5, 0, 6, 0, 4, 0] |
||||||
|
} |
||||||
|
|
||||||
|
BLANK_LAYOUTS = [ |
||||||
|
# Compact Layout |
||||||
|
""" |
||||||
|
.------------------------------------.------------------------------------. |
||||||
|
| | | | | | | | | | | | | | | |
||||||
|
!-----+----+----+----+----+----------!-----+----+----+----+----+----+-----! |
||||||
|
| | | | | | | | | | | | | | | |
||||||
|
!-----+----+----+----x----x----! ! !----x----x----+----+----+-----! |
||||||
|
| | | | | | |-----!-----! | | | | | | |
||||||
|
!-----+----+----+----x----x----! ! !----x----x----+----+----+-----! |
||||||
|
| | | | | | | | | | | | | | | |
||||||
|
'-----+----+----+----+----+----------'----------+----+----+----+----+-----' |
||||||
|
| | | | | | ! | | | | | |
||||||
|
'------------------------' '------------------------' |
||||||
|
.-----------. .-----------. |
||||||
|
| | | ! | | |
||||||
|
.-----+-----+-----! !-----+-----+-----. |
||||||
|
! ! | | ! | ! ! |
||||||
|
! ! !-----! !-----! ! ! |
||||||
|
| | | | ! | | | |
||||||
|
'-----------------' '-----------------' |
||||||
|
""", |
||||||
|
|
||||||
|
# Wide Layout |
||||||
|
""" |
||||||
|
.---------------------------------------------. .---------------------------------------------. |
||||||
|
| | | | | | | | ! | | | | | | | |
||||||
|
!-------+-----+-----+-----+-----+-------------! !-------+-----+-----+-----+-----+-----+-------! |
||||||
|
| | | | | | | | ! | | | | | | | |
||||||
|
!-------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+-------! |
||||||
|
| | | | | | |-------! !-------! | | | | | | |
||||||
|
!-------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+-------! |
||||||
|
| | | | | | | | ! | | | | | | | |
||||||
|
'-------+-----+-----+-----+-----+-------------' '-------------+-----+-----+-----+-----+-------' |
||||||
|
| | | | | | ! | | | | | |
||||||
|
'------------------------------' '------------------------------' |
||||||
|
.---------------. .---------------. |
||||||
|
| | | ! | | |
||||||
|
.-------+-------+-------! !-------+-------+-------. |
||||||
|
! ! | | ! | ! ! |
||||||
|
! ! !-------! !-------! ! ! |
||||||
|
| | | | ! | | | |
||||||
|
'-----------------------' '-----------------------' |
||||||
|
""", |
||||||
|
] |
||||||
|
|
||||||
|
|
||||||
|
DEFAULT_CONFIG = { |
||||||
|
"keymaps_includes": [ |
||||||
|
"keymap_common.h", |
||||||
|
], |
||||||
|
'filler': "-+.'!:x", |
||||||
|
'separator': "|", |
||||||
|
'default_key_prefix': ["KC_"], |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
SECTIONS = [ |
||||||
|
'layout_config', |
||||||
|
'layers', |
||||||
|
] |
||||||
|
|
||||||
|
|
||||||
|
# Markdown Parsing |
||||||
|
|
||||||
|
ONELINE_COMMENT_RE = re.compile(r""" |
||||||
|
^ # comment must be at the start of the line |
||||||
|
\s* # arbitrary whitespace |
||||||
|
// # start of the comment |
||||||
|
(.*) # the comment |
||||||
|
$ # until the end of line |
||||||
|
""", re.MULTILINE | re.VERBOSE |
||||||
|
) |
||||||
|
|
||||||
|
INLINE_COMMENT_RE = re.compile(r""" |
||||||
|
([\,\"\[\]\{\}\d]) # anythig that might end a expression |
||||||
|
\s+ # comment must be preceded by whitespace |
||||||
|
// # start of the comment |
||||||
|
\s # and succeded by whitespace |
||||||
|
(?:[^\"\]\}\{\[]*) # the comment (except things which might be json) |
||||||
|
$ # until the end of line |
||||||
|
""", re.MULTILINE | re.VERBOSE) |
||||||
|
|
||||||
|
TRAILING_COMMA_RE = re.compile(r""" |
||||||
|
, # the comma |
||||||
|
(?:\s*) # arbitrary whitespace |
||||||
|
$ # only works if the trailing comma is followed by newline |
||||||
|
(\s*) # arbitrary whitespace |
||||||
|
([\]\}]) # end of an array or object |
||||||
|
""", re.MULTILINE | re.VERBOSE) |
||||||
|
|
||||||
|
|
||||||
|
def loads(raw_data): |
||||||
|
if isinstance(raw_data, bytes): |
||||||
|
raw_data = raw_data.decode('utf-8') |
||||||
|
|
||||||
|
raw_data = ONELINE_COMMENT_RE.sub(r"", raw_data) |
||||||
|
raw_data = INLINE_COMMENT_RE.sub(r"\1", raw_data) |
||||||
|
raw_data = TRAILING_COMMA_RE.sub(r"\1\2", raw_data) |
||||||
|
return json.loads(raw_data) |
||||||
|
|
||||||
|
|
||||||
|
def parse_config(path): |
||||||
|
def reset_section(): |
||||||
|
section.update({ |
||||||
|
'name': section.get('name', ""), |
||||||
|
'sub_name': "", |
||||||
|
'start_line': -1, |
||||||
|
'end_line': -1, |
||||||
|
'code_lines': [], |
||||||
|
}) |
||||||
|
|
||||||
|
def start_section(line_index, line): |
||||||
|
end_section() |
||||||
|
if line.startswith("# "): |
||||||
|
name = line[2:] |
||||||
|
elif line.startswith("## "): |
||||||
|
name = line[3:] |
||||||
|
else: |
||||||
|
name = "" |
||||||
|
|
||||||
|
name = name.strip().replace(" ", "_").lower() |
||||||
|
if name in SECTIONS: |
||||||
|
section['name'] = name |
||||||
|
else: |
||||||
|
section['sub_name'] = name |
||||||
|
section['start_line'] = line_index |
||||||
|
|
||||||
|
def end_section(): |
||||||
|
if section['start_line'] >= 0: |
||||||
|
if section['name'] == 'layout_config': |
||||||
|
config.update(loads("\n".join( |
||||||
|
section['code_lines'] |
||||||
|
))) |
||||||
|
elif section['sub_name'].startswith('layer'): |
||||||
|
layer_name = section['sub_name'] |
||||||
|
config['layer_lines'][layer_name] = section['code_lines'] |
||||||
|
|
||||||
|
reset_section() |
||||||
|
|
||||||
|
def amend_section(line_index, line): |
||||||
|
section['end_line'] = line_index |
||||||
|
section['code_lines'].append(line) |
||||||
|
|
||||||
|
config = DEFAULT_CONFIG.copy() |
||||||
|
config.update({ |
||||||
|
'layer_lines': collections.OrderedDict(), |
||||||
|
'macro_ids': {'UM'}, |
||||||
|
'unicode_macros': {}, |
||||||
|
}) |
||||||
|
|
||||||
|
section = {} |
||||||
|
reset_section() |
||||||
|
|
||||||
|
with io.open(path, encoding="utf-8") as fh: |
||||||
|
for i, line in enumerate(fh): |
||||||
|
if line.startswith("#"): |
||||||
|
start_section(i, line) |
||||||
|
elif line.startswith(" "): |
||||||
|
amend_section(i, line[4:]) |
||||||
|
else: |
||||||
|
# TODO: maybe parse description |
||||||
|
pass |
||||||
|
|
||||||
|
end_section() |
||||||
|
assert 'layout' in config |
||||||
|
return config |
||||||
|
|
||||||
|
# header file parsing |
||||||
|
|
||||||
|
IF0_RE = re.compile(r""" |
||||||
|
^ |
||||||
|
#if 0 |
||||||
|
$.*? |
||||||
|
#endif |
||||||
|
""", re.MULTILINE | re.DOTALL | re.VERBOSE) |
||||||
|
|
||||||
|
|
||||||
|
COMMENT_RE = re.compile(r""" |
||||||
|
/\* |
||||||
|
.*? |
||||||
|
\*/" |
||||||
|
""", re.MULTILINE | re.DOTALL | re.VERBOSE) |
||||||
|
|
||||||
|
|
||||||
|
def read_header_file(path): |
||||||
|
with io.open(path, encoding="utf-8") as fh: |
||||||
|
data = fh.read() |
||||||
|
data, _ = COMMENT_RE.subn("", data) |
||||||
|
data, _ = IF0_RE.subn("", data) |
||||||
|
return data |
||||||
|
|
||||||
|
|
||||||
|
def regex_partial(re_str_fmt, flags): |
||||||
|
def partial(*args, **kwargs): |
||||||
|
re_str = re_str_fmt.format(*args, **kwargs) |
||||||
|
return re.compile(re_str, flags) |
||||||
|
return partial |
||||||
|
|
||||||
|
|
||||||
|
KEYDEF_REP = regex_partial(r""" |
||||||
|
#define |
||||||
|
\s |
||||||
|
( |
||||||
|
(?:{}) # the prefixes |
||||||
|
(?:\w+) # the key name |
||||||
|
) # capture group end |
||||||
|
""", re.MULTILINE | re.DOTALL | re.VERBOSE) |
||||||
|
|
||||||
|
|
||||||
|
ENUM_RE = re.compile(r""" |
||||||
|
( |
||||||
|
enum |
||||||
|
\s\w+\s |
||||||
|
\{ |
||||||
|
.*? # the enum content |
||||||
|
\} |
||||||
|
; |
||||||
|
) # capture group end |
||||||
|
""", re.MULTILINE | re.DOTALL | re.VERBOSE) |
||||||
|
|
||||||
|
|
||||||
|
ENUM_KEY_REP = regex_partial(r""" |
||||||
|
( |
||||||
|
{} # the prefixes |
||||||
|
\w+ # the key name |
||||||
|
) # capture group end |
||||||
|
""", re.MULTILINE | re.DOTALL | re.VERBOSE) |
||||||
|
|
||||||
|
|
||||||
|
def parse_keydefs(config, data): |
||||||
|
prefix_options = "|".join(config['key_prefixes']) |
||||||
|
keydef_re = KEYDEF_REP(prefix_options) |
||||||
|
enum_key_re = ENUM_KEY_REP(prefix_options) |
||||||
|
for match in keydef_re.finditer(data): |
||||||
|
yield match.groups()[0] |
||||||
|
|
||||||
|
for enum_match in ENUM_RE.finditer(data): |
||||||
|
enum = enum_match.groups()[0] |
||||||
|
for key_match in enum_key_re.finditer(enum): |
||||||
|
yield key_match.groups()[0] |
||||||
|
|
||||||
|
|
||||||
|
def parse_valid_keys(config, out_path): |
||||||
|
basepath = os.path.abspath(os.path.join(os.path.dirname(out_path))) |
||||||
|
dirpaths = [] |
||||||
|
subpaths = [] |
||||||
|
while len(subpaths) < 6: |
||||||
|
path = os.path.join(basepath, *subpaths) |
||||||
|
dirpaths.append(path) |
||||||
|
dirpaths.append(os.path.join(path, "tmk_core", "common")) |
||||||
|
dirpaths.append(os.path.join(path, "quantum")) |
||||||
|
subpaths.append('..') |
||||||
|
|
||||||
|
includes = set(config['keymaps_includes']) |
||||||
|
includes.add("keycode.h") |
||||||
|
|
||||||
|
valid_keycodes = set() |
||||||
|
for dirpath, include in it.product(dirpaths, includes): |
||||||
|
include_path = os.path.join(dirpath, include) |
||||||
|
if os.path.exists(include_path): |
||||||
|
header_data = read_header_file(include_path) |
||||||
|
valid_keycodes.update( |
||||||
|
parse_keydefs(config, header_data) |
||||||
|
) |
||||||
|
return valid_keycodes |
||||||
|
|
||||||
|
|
||||||
|
# Keymap Parsing |
||||||
|
|
||||||
|
def iter_raw_codes(layer_lines, filler, separator): |
||||||
|
filler_re = re.compile("[" + filler + " ]") |
||||||
|
for line in layer_lines: |
||||||
|
line, _ = filler_re.subn("", line.strip()) |
||||||
|
if not line: |
||||||
|
continue |
||||||
|
codes = line.split(separator) |
||||||
|
for code in codes[1:-1]: |
||||||
|
yield code |
||||||
|
|
||||||
|
|
||||||
|
def iter_indexed_codes(raw_codes, key_indexes): |
||||||
|
key_rows = {} |
||||||
|
key_indexes_flat = [] |
||||||
|
|
||||||
|
for row_index, key_indexes in enumerate(key_indexes): |
||||||
|
for key_index in key_indexes: |
||||||
|
key_rows[key_index] = row_index |
||||||
|
key_indexes_flat.extend(key_indexes) |
||||||
|
assert len(raw_codes) == len(key_indexes_flat) |
||||||
|
for raw_code, key_index in zip(raw_codes, key_indexes_flat): |
||||||
|
# we keep track of the row mostly for layout purposes |
||||||
|
yield raw_code, key_index, key_rows[key_index] |
||||||
|
|
||||||
|
|
||||||
|
LAYER_CHANGE_RE = re.compile(r""" |
||||||
|
(DF|TG|MO)\(\d+\) |
||||||
|
""", re.VERBOSE) |
||||||
|
|
||||||
|
|
||||||
|
MACRO_RE = re.compile(r""" |
||||||
|
M\(\w+\) |
||||||
|
""", re.VERBOSE) |
||||||
|
|
||||||
|
|
||||||
|
UNICODE_RE = re.compile(r""" |
||||||
|
U[0-9A-F]{4} |
||||||
|
""", re.VERBOSE) |
||||||
|
|
||||||
|
|
||||||
|
NON_CODE = re.compile(r""" |
||||||
|
^[^A-Z0-9_]$ |
||||||
|
""", re.VERBOSE) |
||||||
|
|
||||||
|
|
||||||
|
def parse_uni_code(raw_code): |
||||||
|
macro_id = "UC_" + ( |
||||||
|
unicodedata.name(raw_code) |
||||||
|
.replace(" ", "_") |
||||||
|
.replace("-", "_") |
||||||
|
) |
||||||
|
code = "M({})".format(macro_id) |
||||||
|
uc_hex = "{:04X}".format(ord(raw_code)) |
||||||
|
return code, macro_id, uc_hex |
||||||
|
|
||||||
|
|
||||||
|
def parse_key_code(raw_code, key_prefixes, valid_keycodes): |
||||||
|
if raw_code in valid_keycodes: |
||||||
|
return raw_code |
||||||
|
|
||||||
|
for prefix in key_prefixes: |
||||||
|
code = prefix + raw_code |
||||||
|
if code in valid_keycodes: |
||||||
|
return code |
||||||
|
|
||||||
|
|
||||||
|
def parse_code(raw_code, key_prefixes, valid_keycodes): |
||||||
|
if not raw_code: |
||||||
|
return 'KC_TRNS', None, None |
||||||
|
|
||||||
|
if LAYER_CHANGE_RE.match(raw_code): |
||||||
|
return raw_code, None, None |
||||||
|
|
||||||
|
if MACRO_RE.match(raw_code): |
||||||
|
macro_id = raw_code[2:-1] |
||||||
|
return raw_code, macro_id, None |
||||||
|
|
||||||
|
if UNICODE_RE.match(raw_code): |
||||||
|
hex_code = raw_code[1:] |
||||||
|
return parse_uni_code(chr(int(hex_code, 16))) |
||||||
|
|
||||||
|
if NON_CODE.match(raw_code): |
||||||
|
return parse_uni_code(raw_code) |
||||||
|
|
||||||
|
code = parse_key_code(raw_code, key_prefixes, valid_keycodes) |
||||||
|
return code, None, None |
||||||
|
|
||||||
|
|
||||||
|
def parse_keymap(config, key_indexes, layer_lines, valid_keycodes): |
||||||
|
keymap = {} |
||||||
|
raw_codes = list(iter_raw_codes( |
||||||
|
layer_lines, config['filler'], config['separator'] |
||||||
|
)) |
||||||
|
indexed_codes = iter_indexed_codes(raw_codes, key_indexes) |
||||||
|
key_prefixes = config['key_prefixes'] |
||||||
|
for raw_code, key_index, row_index in indexed_codes: |
||||||
|
code, macro_id, uc_hex = parse_code( |
||||||
|
raw_code, key_prefixes, valid_keycodes |
||||||
|
) |
||||||
|
# TODO: line numbers for invalid codes |
||||||
|
err_msg = "Could not parse key '{}' on row {}".format( |
||||||
|
raw_code, row_index |
||||||
|
) |
||||||
|
assert code is not None, err_msg |
||||||
|
# print(repr(raw_code), repr(code), macro_id, uc_hex) |
||||||
|
if macro_id: |
||||||
|
config['macro_ids'].add(macro_id) |
||||||
|
if uc_hex: |
||||||
|
config['unicode_macros'][macro_id] = uc_hex |
||||||
|
keymap[key_index] = (code, row_index) |
||||||
|
return keymap |
||||||
|
|
||||||
|
|
||||||
|
def parse_keymaps(config, valid_keycodes): |
||||||
|
keymaps = collections.OrderedDict() |
||||||
|
key_indexes = config.get( |
||||||
|
'key_indexes', KEYBOARD_LAYOUTS[config['layout']] |
||||||
|
) |
||||||
|
# TODO: maybe validate key_indexes |
||||||
|
|
||||||
|
for layer_name, layer_lines, in config['layer_lines'].items(): |
||||||
|
keymaps[layer_name] = parse_keymap( |
||||||
|
config, key_indexes, layer_lines, valid_keycodes |
||||||
|
) |
||||||
|
return keymaps |
||||||
|
|
||||||
|
# keymap.c output |
||||||
|
|
||||||
|
USERCODE = """ |
||||||
|
// Runs just one time when the keyboard initializes. |
||||||
|
void matrix_init_user(void) { |
||||||
|
|
||||||
|
}; |
||||||
|
|
||||||
|
// Runs constantly in the background, in a loop. |
||||||
|
void matrix_scan_user(void) { |
||||||
|
uint8_t layer = biton32(layer_state); |
||||||
|
|
||||||
|
ergodox_board_led_off(); |
||||||
|
ergodox_right_led_1_off(); |
||||||
|
ergodox_right_led_2_off(); |
||||||
|
ergodox_right_led_3_off(); |
||||||
|
switch (layer) { |
||||||
|
case L1: |
||||||
|
ergodox_right_led_1_on(); |
||||||
|
break; |
||||||
|
case L2: |
||||||
|
ergodox_right_led_2_on(); |
||||||
|
break; |
||||||
|
case L3: |
||||||
|
ergodox_right_led_3_on(); |
||||||
|
break; |
||||||
|
case L4: |
||||||
|
ergodox_right_led_1_on(); |
||||||
|
ergodox_right_led_2_on(); |
||||||
|
break; |
||||||
|
case L5: |
||||||
|
ergodox_right_led_1_on(); |
||||||
|
ergodox_right_led_3_on(); |
||||||
|
break; |
||||||
|
// case L6: |
||||||
|
// ergodox_right_led_2_on(); |
||||||
|
// ergodox_right_led_3_on(); |
||||||
|
// break; |
||||||
|
// case L7: |
||||||
|
// ergodox_right_led_1_on(); |
||||||
|
// ergodox_right_led_2_on(); |
||||||
|
// ergodox_right_led_3_on(); |
||||||
|
// break; |
||||||
|
default: |
||||||
|
ergodox_board_led_off(); |
||||||
|
break; |
||||||
|
} |
||||||
|
}; |
||||||
|
""" |
||||||
|
|
||||||
|
MACROCODE = """ |
||||||
|
#define UC_MODE_WIN 0 |
||||||
|
#define UC_MODE_LINUX 1 |
||||||
|
#define UC_MODE_OSX 2 |
||||||
|
|
||||||
|
// TODO: allow default mode to be configured |
||||||
|
static uint16_t unicode_mode = UC_MODE_WIN; |
||||||
|
|
||||||
|
uint16_t hextokeycode(uint8_t hex) {{ |
||||||
|
if (hex == 0x0) {{ |
||||||
|
return KC_P0; |
||||||
|
}} |
||||||
|
if (hex < 0xA) {{ |
||||||
|
return KC_P1 + (hex - 0x1); |
||||||
|
}} |
||||||
|
return KC_A + (hex - 0xA); |
||||||
|
}} |
||||||
|
|
||||||
|
void unicode_action_function(uint16_t hi, uint16_t lo) {{ |
||||||
|
switch (unicode_mode) {{ |
||||||
|
case UC_MODE_WIN: |
||||||
|
register_code(KC_LALT); |
||||||
|
|
||||||
|
register_code(KC_PPLS); |
||||||
|
unregister_code(KC_PPLS); |
||||||
|
|
||||||
|
register_code(hextokeycode((hi & 0xF0) >> 4)); |
||||||
|
unregister_code(hextokeycode((hi & 0xF0) >> 4)); |
||||||
|
register_code(hextokeycode((hi & 0x0F))); |
||||||
|
unregister_code(hextokeycode((hi & 0x0F))); |
||||||
|
register_code(hextokeycode((lo & 0xF0) >> 4)); |
||||||
|
unregister_code(hextokeycode((lo & 0xF0) >> 4)); |
||||||
|
register_code(hextokeycode((lo & 0x0F))); |
||||||
|
unregister_code(hextokeycode((lo & 0x0F))); |
||||||
|
|
||||||
|
unregister_code(KC_LALT); |
||||||
|
break; |
||||||
|
case UC_MODE_LINUX: |
||||||
|
register_code(KC_LCTL); |
||||||
|
register_code(KC_LSFT); |
||||||
|
|
||||||
|
register_code(KC_U); |
||||||
|
unregister_code(KC_U); |
||||||
|
|
||||||
|
register_code(hextokeycode((hi & 0xF0) >> 4)); |
||||||
|
unregister_code(hextokeycode((hi & 0xF0) >> 4)); |
||||||
|
register_code(hextokeycode((hi & 0x0F))); |
||||||
|
unregister_code(hextokeycode((hi & 0x0F))); |
||||||
|
register_code(hextokeycode((lo & 0xF0) >> 4)); |
||||||
|
unregister_code(hextokeycode((lo & 0xF0) >> 4)); |
||||||
|
register_code(hextokeycode((lo & 0x0F))); |
||||||
|
unregister_code(hextokeycode((lo & 0x0F))); |
||||||
|
|
||||||
|
unregister_code(KC_LCTL); |
||||||
|
unregister_code(KC_LSFT); |
||||||
|
break; |
||||||
|
case UC_MODE_OSX: |
||||||
|
break; |
||||||
|
}} |
||||||
|
}} |
||||||
|
|
||||||
|
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {{ |
||||||
|
if (!record->event.pressed) {{ |
||||||
|
return MACRO_NONE; |
||||||
|
}} |
||||||
|
// MACRODOWN only works in this function |
||||||
|
switch(id) {{ |
||||||
|
case UM: |
||||||
|
unicode_mode = (unicode_mode + 1) % 2; |
||||||
|
break; |
||||||
|
{macro_cases} |
||||||
|
{unicode_macro_cases} |
||||||
|
default: |
||||||
|
break; |
||||||
|
}} |
||||||
|
return MACRO_NONE; |
||||||
|
}}; |
||||||
|
""" |
||||||
|
|
||||||
|
|
||||||
|
UNICODE_MACRO_TEMPLATE = """ |
||||||
|
case {macro_id}: |
||||||
|
unicode_action_function(0x{hi:02x}, 0x{lo:02x}); |
||||||
|
break; |
||||||
|
""".strip() |
||||||
|
|
||||||
|
|
||||||
|
def unicode_macro_cases(config): |
||||||
|
for macro_id, uc_hex in config['unicode_macros'].items(): |
||||||
|
hi = int(uc_hex, 16) >> 8 |
||||||
|
lo = int(uc_hex, 16) & 0xFF |
||||||
|
unimacro_keys = ", ".join( |
||||||
|
"T({})".format( |
||||||
|
"KP_" + digit if digit.isdigit() else digit |
||||||
|
) for digit in uc_hex |
||||||
|
) |
||||||
|
yield UNICODE_MACRO_TEMPLATE.format( |
||||||
|
macro_id=macro_id, hi=hi, lo=lo |
||||||
|
) |
||||||
|
|
||||||
|
|
||||||
|
def iter_keymap_lines(keymap, row_indents=None): |
||||||
|
col_widths = {} |
||||||
|
col = 0 |
||||||
|
# first pass, figure out the column widths |
||||||
|
prev_row_index = None |
||||||
|
for code, row_index in keymap.values(): |
||||||
|
if row_index != prev_row_index: |
||||||
|
col = 0 |
||||||
|
if row_indents: |
||||||
|
col = row_indents[row_index] |
||||||
|
col_widths[col] = max(len(code), col_widths.get(col, 0)) |
||||||
|
prev_row_index = row_index |
||||||
|
col += 1 |
||||||
|
|
||||||
|
# second pass, yield the cell values |
||||||
|
col = 0 |
||||||
|
prev_row_index = None |
||||||
|
for key_index in sorted(keymap): |
||||||
|
code, row_index = keymap[key_index] |
||||||
|
if row_index != prev_row_index: |
||||||
|
col = 0 |
||||||
|
yield "\n" |
||||||
|
if row_indents: |
||||||
|
for indent_col in range(row_indents[row_index]): |
||||||
|
pad = " " * (col_widths[indent_col] - 4) |
||||||
|
yield (" /*-*/" + pad) |
||||||
|
col = row_indents[row_index] |
||||||
|
else: |
||||||
|
yield pad |
||||||
|
yield " {}".format(code) |
||||||
|
if key_index < len(keymap) - 1: |
||||||
|
yield "," |
||||||
|
# This will be yielded on the next iteration when |
||||||
|
# we know that we're not at the end of a line. |
||||||
|
pad = " " * (col_widths[col] - len(code)) |
||||||
|
prev_row_index = row_index |
||||||
|
col += 1 |
||||||
|
|
||||||
|
|
||||||
|
def iter_keymap_parts(config, keymaps): |
||||||
|
# includes |
||||||
|
for include_path in config['keymaps_includes']: |
||||||
|
yield '#include "{}"\n'.format(include_path) |
||||||
|
|
||||||
|
yield "\n" |
||||||
|
|
||||||
|
# definitions |
||||||
|
for i, macro_id in enumerate(sorted(config['macro_ids'])): |
||||||
|
yield "#define {} {}\n".format(macro_id, i) |
||||||
|
|
||||||
|
yield "\n" |
||||||
|
|
||||||
|
for i, layer_name in enumerate(config['layer_lines']): |
||||||
|
yield '#define L{0:<3} {0:<5} // {1}\n'.format(i, layer_name) |
||||||
|
|
||||||
|
yield "\n" |
||||||
|
|
||||||
|
# keymaps |
||||||
|
yield "const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {\n" |
||||||
|
|
||||||
|
for i, layer_name in enumerate(config['layer_lines']): |
||||||
|
# comment |
||||||
|
layer_lines = config['layer_lines'][layer_name] |
||||||
|
prefixed_lines = " * " + " * ".join(layer_lines) |
||||||
|
yield "/*\n{} */\n".format(prefixed_lines) |
||||||
|
|
||||||
|
# keymap codes |
||||||
|
keymap = keymaps[layer_name] |
||||||
|
row_indents = ROW_INDENTS.get(config['layout']) |
||||||
|
keymap_lines = "".join(iter_keymap_lines(keymap, row_indents)) |
||||||
|
yield "[L{0}] = KEYMAP({1}\n),\n".format(i, keymap_lines) |
||||||
|
|
||||||
|
yield "};\n\n" |
||||||
|
|
||||||
|
# no idea what this is for |
||||||
|
yield "const uint16_t PROGMEM fn_actions[] = {};\n" |
||||||
|
|
||||||
|
# macros |
||||||
|
yield MACROCODE.format( |
||||||
|
macro_cases="", |
||||||
|
unicode_macro_cases="\n".join(unicode_macro_cases(config)), |
||||||
|
) |
||||||
|
|
||||||
|
# TODO: dynamically create blinking lights |
||||||
|
yield USERCODE |
||||||
|
|
||||||
|
|
||||||
|
def main(argv=sys.argv[1:]): |
||||||
|
if not argv or '-h' in argv or '--help' in argv: |
||||||
|
print(__doc__) |
||||||
|
return 0 |
||||||
|
|
||||||
|
in_path = os.path.abspath(argv[0]) |
||||||
|
if not os.path.exists(in_path): |
||||||
|
print("No such file '{}'".format(in_path)) |
||||||
|
return 1 |
||||||
|
|
||||||
|
if len(argv) > 1: |
||||||
|
out_path = os.path.abspath(argv[1]) |
||||||
|
else: |
||||||
|
dirname = os.path.dirname(in_path) |
||||||
|
out_path = os.path.join(dirname, "keymap.c") |
||||||
|
|
||||||
|
config = parse_config(in_path) |
||||||
|
valid_keys = parse_valid_keys(config, out_path) |
||||||
|
keymaps = parse_keymaps(config, valid_keys) |
||||||
|
|
||||||
|
with io.open(out_path, mode="w", encoding="utf-8") as fh: |
||||||
|
for part in iter_keymap_parts(config, keymaps): |
||||||
|
fh.write(part) |
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__': |
||||||
|
sys.exit(main()) |
@ -0,0 +1,783 @@ |
|||||||
|
#include "ergodox_ez.h" |
||||||
|
#include "action_layer.h" |
||||||
|
#include "keymap_common.h" |
||||||
|
#include "keymap_extras/keymap_german.h" |
||||||
|
|
||||||
|
#define UC_ASYMPTOTICALLY_EQUAL_TO 0 |
||||||
|
#define UC_DIVISION_SIGN 1 |
||||||
|
#define UC_DOWNWARDS_ARROW 2 |
||||||
|
#define UC_ELEMENT_OF 3 |
||||||
|
#define UC_EMPTY_SET 4 |
||||||
|
#define UC_FOR_ALL 5 |
||||||
|
#define UC_GREEK_CAPITAL_LETTER_ALPHA 6 |
||||||
|
#define UC_GREEK_CAPITAL_LETTER_BETA 7 |
||||||
|
#define UC_GREEK_CAPITAL_LETTER_CHI 8 |
||||||
|
#define UC_GREEK_CAPITAL_LETTER_DELTA 9 |
||||||
|
#define UC_GREEK_CAPITAL_LETTER_EPSILON 10 |
||||||
|
#define UC_GREEK_CAPITAL_LETTER_ETA 11 |
||||||
|
#define UC_GREEK_CAPITAL_LETTER_GAMMA 12 |
||||||
|
#define UC_GREEK_CAPITAL_LETTER_IOTA 13 |
||||||
|
#define UC_GREEK_CAPITAL_LETTER_KAPPA 14 |
||||||
|
#define UC_GREEK_CAPITAL_LETTER_LAMDA 15 |
||||||
|
#define UC_GREEK_CAPITAL_LETTER_MU 16 |
||||||
|
#define UC_GREEK_CAPITAL_LETTER_NU 17 |
||||||
|
#define UC_GREEK_CAPITAL_LETTER_OMEGA 18 |
||||||
|
#define UC_GREEK_CAPITAL_LETTER_OMICRON 19 |
||||||
|
#define UC_GREEK_CAPITAL_LETTER_PHI 20 |
||||||
|
#define UC_GREEK_CAPITAL_LETTER_PI 21 |
||||||
|
#define UC_GREEK_CAPITAL_LETTER_PSI 22 |
||||||
|
#define UC_GREEK_CAPITAL_LETTER_RHO 23 |
||||||
|
#define UC_GREEK_CAPITAL_LETTER_SIGMA 24 |
||||||
|
#define UC_GREEK_CAPITAL_LETTER_TAU 25 |
||||||
|
#define UC_GREEK_CAPITAL_LETTER_THETA 26 |
||||||
|
#define UC_GREEK_CAPITAL_LETTER_UPSILON 27 |
||||||
|
#define UC_GREEK_CAPITAL_LETTER_XI 28 |
||||||
|
#define UC_GREEK_CAPITAL_LETTER_ZETA 29 |
||||||
|
#define UC_GREEK_SMALL_LETTER_ALPHA 30 |
||||||
|
#define UC_GREEK_SMALL_LETTER_BETA 31 |
||||||
|
#define UC_GREEK_SMALL_LETTER_CHI 32 |
||||||
|
#define UC_GREEK_SMALL_LETTER_DELTA 33 |
||||||
|
#define UC_GREEK_SMALL_LETTER_EPSILON 34 |
||||||
|
#define UC_GREEK_SMALL_LETTER_ETA 35 |
||||||
|
#define UC_GREEK_SMALL_LETTER_FINAL_SIGMA 36 |
||||||
|
#define UC_GREEK_SMALL_LETTER_GAMMA 37 |
||||||
|
#define UC_GREEK_SMALL_LETTER_IOTA 38 |
||||||
|
#define UC_GREEK_SMALL_LETTER_KAPPA 39 |
||||||
|
#define UC_GREEK_SMALL_LETTER_LAMDA 40 |
||||||
|
#define UC_GREEK_SMALL_LETTER_MU 41 |
||||||
|
#define UC_GREEK_SMALL_LETTER_NU 42 |
||||||
|
#define UC_GREEK_SMALL_LETTER_OMEGA 43 |
||||||
|
#define UC_GREEK_SMALL_LETTER_OMICRON 44 |
||||||
|
#define UC_GREEK_SMALL_LETTER_PHI 45 |
||||||
|
#define UC_GREEK_SMALL_LETTER_PI 46 |
||||||
|
#define UC_GREEK_SMALL_LETTER_PSI 47 |
||||||
|
#define UC_GREEK_SMALL_LETTER_RHO 48 |
||||||
|
#define UC_GREEK_SMALL_LETTER_SIGMA 49 |
||||||
|
#define UC_GREEK_SMALL_LETTER_TAU 50 |
||||||
|
#define UC_GREEK_SMALL_LETTER_THETA 51 |
||||||
|
#define UC_GREEK_SMALL_LETTER_UPSILON 52 |
||||||
|
#define UC_GREEK_SMALL_LETTER_XI 53 |
||||||
|
#define UC_GREEK_SMALL_LETTER_ZETA 54 |
||||||
|
#define UC_INFINITY 55 |
||||||
|
#define UC_LEFTWARDS_ARROW 56 |
||||||
|
#define UC_MULTIPLICATION_SIGN 57 |
||||||
|
#define UC_NOT_AN_ELEMENT_OF 58 |
||||||
|
#define UC_NOT_EQUAL_TO 59 |
||||||
|
#define UC_PLUS_MINUS_SIGN 60 |
||||||
|
#define UC_RIGHTWARDS_ARROW 61 |
||||||
|
#define UC_SUBSCRIPT_EIGHT 62 |
||||||
|
#define UC_SUBSCRIPT_FIVE 63 |
||||||
|
#define UC_SUBSCRIPT_FOUR 64 |
||||||
|
#define UC_SUBSCRIPT_NINE 65 |
||||||
|
#define UC_SUBSCRIPT_ONE 66 |
||||||
|
#define UC_SUBSCRIPT_SEVEN 67 |
||||||
|
#define UC_SUBSCRIPT_SIX 68 |
||||||
|
#define UC_SUBSCRIPT_THREE 69 |
||||||
|
#define UC_SUBSCRIPT_TWO 70 |
||||||
|
#define UC_SUBSCRIPT_ZERO 71 |
||||||
|
#define UC_SUPERSCRIPT_EIGHT 72 |
||||||
|
#define UC_SUPERSCRIPT_FIVE 73 |
||||||
|
#define UC_SUPERSCRIPT_FOUR 74 |
||||||
|
#define UC_SUPERSCRIPT_LATIN_SMALL_LETTER_N 75 |
||||||
|
#define UC_SUPERSCRIPT_NINE 76 |
||||||
|
#define UC_SUPERSCRIPT_ONE 77 |
||||||
|
#define UC_SUPERSCRIPT_SEVEN 78 |
||||||
|
#define UC_SUPERSCRIPT_SIX 79 |
||||||
|
#define UC_SUPERSCRIPT_THREE 80 |
||||||
|
#define UC_SUPERSCRIPT_TWO 81 |
||||||
|
#define UC_SUPERSCRIPT_ZERO 82 |
||||||
|
#define UC_THERE_DOES_NOT_EXIST 83 |
||||||
|
#define UC_THERE_EXISTS 84 |
||||||
|
#define UC_UPWARDS_ARROW 85 |
||||||
|
#define UC_VULGAR_FRACTION_ONE_EIGHTH 86 |
||||||
|
#define UC_VULGAR_FRACTION_ONE_FIFTH 87 |
||||||
|
#define UC_VULGAR_FRACTION_ONE_HALF 88 |
||||||
|
#define UC_VULGAR_FRACTION_ONE_QUARTER 89 |
||||||
|
#define UC_VULGAR_FRACTION_ONE_SIXTH 90 |
||||||
|
#define UC_VULGAR_FRACTION_ONE_THIRD 91 |
||||||
|
#define UC_VULGAR_FRACTION_THREE_QUARTERS 92 |
||||||
|
#define UC_VULGAR_FRACTION_TWO_THIRDS 93 |
||||||
|
#define UM 94 |
||||||
|
|
||||||
|
#define L0 0 // layer_0
|
||||||
|
#define L1 1 // layer_1
|
||||||
|
#define L2 2 // layer_2
|
||||||
|
#define L3 3 // layer_3
|
||||||
|
#define L4 4 // layer_4
|
||||||
|
#define L5 5 // layer_5
|
||||||
|
#define L6 6 // layer_6
|
||||||
|
|
||||||
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { |
||||||
|
/*
|
||||||
|
* .------------------------------------.------------------------------------. |
||||||
|
* |MO(5)| 1 | 2 | 3 | 4 | 5 |ACUT | GRV | 6 | 7 | 8 | 9 | 0 |CIRC | |
||||||
|
* !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----! |
||||||
|
* |MO(4)| X | P | F | W | G |HOME |TG(2)| H | J | K | L | Q | Z | |
||||||
|
* !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! |
||||||
|
* |MO(1)| U | I | A | E | O |-----!-----! S | N | R | T | D | SS | |
||||||
|
* !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! |
||||||
|
* |MO(3)| UE | OE | AE | C | V |END | TAB | B | M |COMM| DOT| UP | Y | |
||||||
|
* '-----+----+----+----+----+----------'----------+----+----+----+----+-----' |
||||||
|
* | | |LGUI|LALT|LCTL| !RCTL|RALT|LEFT|DOWN|RGHT| |
||||||
|
* '------------------------' '------------------------' |
||||||
|
* .-----------. .-----------. |
||||||
|
* |INS |TG(2)| !M(UM)|DELT | |
||||||
|
* .-----+-----+-----! !-----+-----+-----. |
||||||
|
* ! ! | APP | ! PGUP| ! ! |
||||||
|
* ! ! !-----! !-----! ! ! |
||||||
|
* |BSPC |LSFT | ESC | ! PGDN|ENTER|SPACE| |
||||||
|
* '-----------------' '-----------------' |
||||||
|
*/ |
||||||
|
[L0] = KEYMAP( |
||||||
|
MO(5), DE_1, DE_2, DE_3, DE_4, DE_5, DE_ACUT, |
||||||
|
MO(4), DE_X, DE_P, DE_F, DE_W, DE_G, KC_HOME, |
||||||
|
MO(1), DE_U, DE_I, DE_A, DE_E, DE_O, |
||||||
|
MO(3), DE_UE, DE_OE, DE_AE, DE_C, DE_V, KC_END, |
||||||
|
KC_TRNS, KC_TRNS, KC_LGUI, KC_LALT, KC_LCTL, |
||||||
|
/*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_INS, TG(2), |
||||||
|
/*-*/ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_APP, |
||||||
|
/*-*/ /*-*/ /*-*/ /*-*/ KC_BSPC, KC_LSFT, KC_ESC, |
||||||
|
DE_GRV, DE_6, DE_7, DE_8, DE_9, DE_0, DE_CIRC, |
||||||
|
TG(2), DE_H, DE_J, DE_K, DE_L, DE_Q, DE_Z, |
||||||
|
/*-*/ DE_S, DE_N, DE_R, DE_T, DE_D, DE_SS, |
||||||
|
KC_TAB, DE_B, DE_M, DE_COMM, DE_DOT, KC_UP, DE_Y, |
||||||
|
/*-*/ /*-*/ KC_RCTL, KC_RALT, KC_LEFT, KC_DOWN, KC_RGHT, |
||||||
|
M(UM), KC_DELT, |
||||||
|
KC_PGUP, |
||||||
|
KC_PGDN, KC_ENTER, KC_SPACE |
||||||
|
), |
||||||
|
/*
|
||||||
|
* .------------------------------------.------------------------------------. |
||||||
|
* | |EXLM|DQOT|PARA| | | | | | | | |RING| | |
||||||
|
* !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----! |
||||||
|
* | |ASTR|PIPE|SLSH|LCBR|RCBR| | |HASH|LESS|MORE| |DQOT| | |
||||||
|
* !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! |
||||||
|
* | |UNDS|MINS|AMPR|LBRC|RBRC|-----!-----!DLR |LPRN|RPRN|TILD|QUOT| QST | |
||||||
|
* !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! |
||||||
|
* | | |PLUS|EQL | | | | |BSLS|PERC|SCLN|COLN| ↑ | | |
||||||
|
* '-----+----+----+----+----+----------'----------+----+----+----+----+-----' |
||||||
|
* | | | | | | ! | | ← | ↓ | → | |
||||||
|
* '------------------------' '------------------------' |
||||||
|
* .-----------. .-----------. |
||||||
|
* | | | ! | | |
||||||
|
* .-----+-----+-----! !-----+-----+-----. |
||||||
|
* ! ! | | ! | ! ! |
||||||
|
* ! ! !-----! !-----! ! ! |
||||||
|
* | | | | ! | | | |
||||||
|
* '-----------------' '-----------------' |
||||||
|
*/ |
||||||
|
[L1] = KEYMAP( |
||||||
|
KC_TRNS, DE_EXLM, DE_DQOT, DE_PARA, KC_TRNS, KC_TRNS, KC_TRNS, |
||||||
|
KC_TRNS, DE_ASTR, DE_PIPE, DE_SLSH, DE_LCBR, DE_RCBR, KC_TRNS, |
||||||
|
KC_TRNS, DE_UNDS, DE_MINS, DE_AMPR, DE_LBRC, DE_RBRC, |
||||||
|
KC_TRNS, KC_TRNS, DE_PLUS, DE_EQL, KC_TRNS, KC_TRNS, KC_TRNS, |
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||||
|
/*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, |
||||||
|
/*-*/ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, |
||||||
|
/*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, |
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, DE_RING, KC_TRNS, |
||||||
|
KC_TRNS, DE_HASH, DE_LESS, DE_MORE, KC_TRNS, DE_DQOT, KC_TRNS, |
||||||
|
/*-*/ DE_DLR, DE_LPRN, DE_RPRN, DE_TILD, DE_QUOT, DE_QST, |
||||||
|
KC_TRNS, DE_BSLS, DE_PERC, DE_SCLN, DE_COLN, M(UC_UPWARDS_ARROW), KC_TRNS, |
||||||
|
/*-*/ /*-*/ KC_TRNS, KC_TRNS, M(UC_LEFTWARDS_ARROW), M(UC_DOWNWARDS_ARROW), M(UC_RIGHTWARDS_ARROW), |
||||||
|
KC_TRNS, KC_TRNS, |
||||||
|
KC_TRNS, |
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS |
||||||
|
), |
||||||
|
/*
|
||||||
|
* .------------------------------------.------------------------------------. |
||||||
|
* | | F1 | F2 | F3 | F4 | F5 | F11 | F12 | F6 | F7 | F8 | F9 |F10 |PEQL | |
||||||
|
* !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----! |
||||||
|
* | | | | | | | | | | P7 | P8 | P9 |PAST|PSLS | |
||||||
|
* !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! |
||||||
|
* | | | | | | |-----!-----! | P4 | P5 | P6 |PMNS|PMNS | |
||||||
|
* !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! |
||||||
|
* | | | | | | | | NLCK| | P1 | P2 | P3 |PPLS|PPLS | |
||||||
|
* '-----+----+----+----+----+----------'----------+----+----+----+----+-----' |
||||||
|
* | | | | | | ! P0 |PCMM|PDOT|PENT|PENT| |
||||||
|
* '------------------------' '------------------------' |
||||||
|
* .-----------. .-----------. |
||||||
|
* | | | ! | | |
||||||
|
* .-----+-----+-----! !-----+-----+-----. |
||||||
|
* ! ! | | ! | ! ! |
||||||
|
* ! ! !-----! !-----! ! ! |
||||||
|
* | | | | ! | | | |
||||||
|
* '-----------------' '-----------------' |
||||||
|
*/ |
||||||
|
[L2] = KEYMAP( |
||||||
|
KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F11, |
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||||
|
/*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, |
||||||
|
/*-*/ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, |
||||||
|
/*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, |
||||||
|
KC_F12, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_PEQL, |
||||||
|
KC_TRNS, KC_TRNS, KC_P7, KC_P8, KC_P9, KC_PAST, KC_PSLS, |
||||||
|
/*-*/ KC_TRNS, KC_P4, KC_P5, KC_P6, KC_PMNS, KC_PMNS, |
||||||
|
KC_NLCK, KC_TRNS, KC_P1, KC_P2, KC_P3, KC_PPLS, KC_PPLS, |
||||||
|
/*-*/ /*-*/ KC_P0, KC_PCMM, KC_PDOT, KC_PENT, KC_PENT, |
||||||
|
KC_TRNS, KC_TRNS, |
||||||
|
KC_TRNS, |
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS |
||||||
|
), |
||||||
|
/*
|
||||||
|
* .------------------------------------.------------------------------------. |
||||||
|
* | | ¹ | ² | ³ | ⁴ | ⁵ | ∀ | | ⁶ | ⁷ | ⁸ | ⁹ | ⁰ | | |
||||||
|
* !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----! |
||||||
|
* | | × | ½ | ÷ | ¼ | ⅕ | | | ⅙ | | ⅛ | | | | |
||||||
|
* !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! |
||||||
|
* | | | ± | AT |EURO| ∅ |-----!-----! ∞ | ⁿ | ∃ | ∈ | | | |
||||||
|
* !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! |
||||||
|
* | | ⅓ | ≠ | ⅔ | ¾ | ≃ | | |EXLM| | ∄ | ∉ | | | |
||||||
|
* '-----+----+----+----+----+----------'----------+----+----+----+----+-----' |
||||||
|
* | | | | | | ! | | | | | |
||||||
|
* '------------------------' '------------------------' |
||||||
|
* .-----------. .-----------. |
||||||
|
* | | | ! | | |
||||||
|
* .-----+-----+-----! !-----+-----+-----. |
||||||
|
* ! ! | | ! | ! ! |
||||||
|
* ! ! !-----! !-----! ! ! |
||||||
|
* | | | | ! | | | |
||||||
|
* '-----------------' '-----------------' |
||||||
|
*/ |
||||||
|
[L3] = KEYMAP( |
||||||
|
KC_TRNS, M(UC_SUPERSCRIPT_ONE), M(UC_SUPERSCRIPT_TWO), M(UC_SUPERSCRIPT_THREE), M(UC_SUPERSCRIPT_FOUR), M(UC_SUPERSCRIPT_FIVE), M(UC_FOR_ALL), |
||||||
|
KC_TRNS, M(UC_MULTIPLICATION_SIGN), M(UC_VULGAR_FRACTION_ONE_HALF), M(UC_DIVISION_SIGN), M(UC_VULGAR_FRACTION_ONE_QUARTER), M(UC_VULGAR_FRACTION_ONE_FIFTH), KC_TRNS, |
||||||
|
KC_TRNS, KC_TRNS, M(UC_PLUS_MINUS_SIGN), DE_AT, DE_EURO, M(UC_EMPTY_SET), |
||||||
|
KC_TRNS, M(UC_VULGAR_FRACTION_ONE_THIRD), M(UC_NOT_EQUAL_TO), M(UC_VULGAR_FRACTION_TWO_THIRDS), M(UC_VULGAR_FRACTION_THREE_QUARTERS), M(UC_ASYMPTOTICALLY_EQUAL_TO), KC_TRNS, |
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||||
|
/*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, |
||||||
|
/*-*/ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, |
||||||
|
/*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, |
||||||
|
KC_TRNS, M(UC_SUPERSCRIPT_SIX), M(UC_SUPERSCRIPT_SEVEN), M(UC_SUPERSCRIPT_EIGHT), M(UC_SUPERSCRIPT_NINE), M(UC_SUPERSCRIPT_ZERO), KC_TRNS, |
||||||
|
KC_TRNS, M(UC_VULGAR_FRACTION_ONE_SIXTH), KC_TRNS, M(UC_VULGAR_FRACTION_ONE_EIGHTH), KC_TRNS, KC_TRNS, KC_TRNS, |
||||||
|
/*-*/ M(UC_INFINITY), M(UC_SUPERSCRIPT_LATIN_SMALL_LETTER_N), M(UC_THERE_EXISTS), M(UC_ELEMENT_OF), KC_TRNS, KC_TRNS, |
||||||
|
KC_TRNS, DE_EXLM, KC_TRNS, M(UC_THERE_DOES_NOT_EXIST), M(UC_NOT_AN_ELEMENT_OF), KC_TRNS, KC_TRNS, |
||||||
|
/*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||||
|
KC_TRNS, KC_TRNS, |
||||||
|
KC_TRNS, |
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS |
||||||
|
), |
||||||
|
/*
|
||||||
|
* .------------------------------------.------------------------------------. |
||||||
|
* | | ₁ | ₂ | ₃ | ₄ | ₅ | | | ₆ | ₇ | ₈ | ₉ | ₀ | | |
||||||
|
* !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----! |
||||||
|
* | | χ | π | φ | ω | γ | | | η | ξ | κ | λ | | ζ | |
||||||
|
* !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! |
||||||
|
* | | υ | ι | α | ε | ο |-----!-----! σ | ν | ρ | τ | δ | ς | |
||||||
|
* !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! |
||||||
|
* | | | θ | | | | | | β | μ | | | | ψ | |
||||||
|
* '-----+----+----+----+----+----------'----------+----+----+----+----+-----' |
||||||
|
* | | | | | | ! | | | | | |
||||||
|
* '------------------------' '------------------------' |
||||||
|
* .-----------. .-----------. |
||||||
|
* | | | ! | | |
||||||
|
* .-----+-----+-----! !-----+-----+-----. |
||||||
|
* ! ! | | ! | ! ! |
||||||
|
* ! ! !-----! !-----! ! ! |
||||||
|
* | | | | ! | | | |
||||||
|
* '-----------------' '-----------------' |
||||||
|
*/ |
||||||
|
[L4] = KEYMAP( |
||||||
|
KC_TRNS, M(UC_SUBSCRIPT_ONE), M(UC_SUBSCRIPT_TWO), M(UC_SUBSCRIPT_THREE), M(UC_SUBSCRIPT_FOUR), M(UC_SUBSCRIPT_FIVE), KC_TRNS, |
||||||
|
KC_TRNS, M(UC_GREEK_SMALL_LETTER_CHI), M(UC_GREEK_SMALL_LETTER_PI), M(UC_GREEK_SMALL_LETTER_PHI), M(UC_GREEK_SMALL_LETTER_OMEGA), M(UC_GREEK_SMALL_LETTER_GAMMA), KC_TRNS, |
||||||
|
KC_TRNS, M(UC_GREEK_SMALL_LETTER_UPSILON), M(UC_GREEK_SMALL_LETTER_IOTA), M(UC_GREEK_SMALL_LETTER_ALPHA), M(UC_GREEK_SMALL_LETTER_EPSILON), M(UC_GREEK_SMALL_LETTER_OMICRON), |
||||||
|
KC_TRNS, KC_TRNS, M(UC_GREEK_SMALL_LETTER_THETA), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||||
|
/*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, |
||||||
|
/*-*/ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, |
||||||
|
/*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, |
||||||
|
KC_TRNS, M(UC_SUBSCRIPT_SIX), M(UC_SUBSCRIPT_SEVEN), M(UC_SUBSCRIPT_EIGHT), M(UC_SUBSCRIPT_NINE), M(UC_SUBSCRIPT_ZERO), KC_TRNS, |
||||||
|
KC_TRNS, M(UC_GREEK_SMALL_LETTER_ETA), M(UC_GREEK_SMALL_LETTER_XI), M(UC_GREEK_SMALL_LETTER_KAPPA), M(UC_GREEK_SMALL_LETTER_LAMDA), KC_TRNS, M(UC_GREEK_SMALL_LETTER_ZETA), |
||||||
|
/*-*/ M(UC_GREEK_SMALL_LETTER_SIGMA), M(UC_GREEK_SMALL_LETTER_NU), M(UC_GREEK_SMALL_LETTER_RHO), M(UC_GREEK_SMALL_LETTER_TAU), M(UC_GREEK_SMALL_LETTER_DELTA), M(UC_GREEK_SMALL_LETTER_FINAL_SIGMA), |
||||||
|
KC_TRNS, M(UC_GREEK_SMALL_LETTER_BETA), M(UC_GREEK_SMALL_LETTER_MU), KC_TRNS, KC_TRNS, KC_TRNS, M(UC_GREEK_SMALL_LETTER_PSI), |
||||||
|
/*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||||
|
KC_TRNS, KC_TRNS, |
||||||
|
KC_TRNS, |
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS |
||||||
|
), |
||||||
|
/*
|
||||||
|
* .------------------------------------.------------------------------------. |
||||||
|
* | | | | | | | | | | | | | | | |
||||||
|
* !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----! |
||||||
|
* | | Χ | Π | Φ | Ω | Γ | | | Η | Ξ | Κ | Λ | | Ζ | |
||||||
|
* !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! |
||||||
|
* | | Υ | Ι | Α | Ε | Ο |-----!-----! Σ | Ν | Ρ | Τ | Δ | | |
||||||
|
* !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! |
||||||
|
* | | | Θ | | | | | | Β | Μ | | | | Ψ | |
||||||
|
* '-----+----+----+----+----+----------'----------+----+----+----+----+-----' |
||||||
|
* | | | | | | ! | | | | | |
||||||
|
* '------------------------' '------------------------' |
||||||
|
* .-----------. .-----------. |
||||||
|
* | | | ! | | |
||||||
|
* .-----+-----+-----! !-----+-----+-----. |
||||||
|
* ! ! | | ! | ! ! |
||||||
|
* ! ! !-----! !-----! ! ! |
||||||
|
* | | | | ! | | | |
||||||
|
* '-----------------' '-----------------' |
||||||
|
*/ |
||||||
|
[L5] = KEYMAP( |
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||||
|
KC_TRNS, M(UC_GREEK_CAPITAL_LETTER_CHI), M(UC_GREEK_CAPITAL_LETTER_PI), M(UC_GREEK_CAPITAL_LETTER_PHI), M(UC_GREEK_CAPITAL_LETTER_OMEGA), M(UC_GREEK_CAPITAL_LETTER_GAMMA), KC_TRNS, |
||||||
|
KC_TRNS, M(UC_GREEK_CAPITAL_LETTER_UPSILON), M(UC_GREEK_CAPITAL_LETTER_IOTA), M(UC_GREEK_CAPITAL_LETTER_ALPHA), M(UC_GREEK_CAPITAL_LETTER_EPSILON), M(UC_GREEK_CAPITAL_LETTER_OMICRON), |
||||||
|
KC_TRNS, KC_TRNS, M(UC_GREEK_CAPITAL_LETTER_THETA), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||||
|
/*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, |
||||||
|
/*-*/ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, |
||||||
|
/*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, |
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||||
|
KC_TRNS, M(UC_GREEK_CAPITAL_LETTER_ETA), M(UC_GREEK_CAPITAL_LETTER_XI), M(UC_GREEK_CAPITAL_LETTER_KAPPA), M(UC_GREEK_CAPITAL_LETTER_LAMDA), KC_TRNS, M(UC_GREEK_CAPITAL_LETTER_ZETA), |
||||||
|
/*-*/ M(UC_GREEK_CAPITAL_LETTER_SIGMA), M(UC_GREEK_CAPITAL_LETTER_NU), M(UC_GREEK_CAPITAL_LETTER_RHO), M(UC_GREEK_CAPITAL_LETTER_TAU), M(UC_GREEK_CAPITAL_LETTER_DELTA), KC_TRNS, |
||||||
|
KC_TRNS, M(UC_GREEK_CAPITAL_LETTER_BETA), M(UC_GREEK_CAPITAL_LETTER_MU), KC_TRNS, KC_TRNS, KC_TRNS, M(UC_GREEK_CAPITAL_LETTER_PSI), |
||||||
|
/*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||||
|
KC_TRNS, KC_TRNS, |
||||||
|
KC_TRNS, |
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS |
||||||
|
), |
||||||
|
/*
|
||||||
|
* .------------------------------------.------------------------------------. |
||||||
|
* | | | | | | | | | | | | | | | |
||||||
|
* !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----! |
||||||
|
* | | | | | | | | | | | | | | | |
||||||
|
* !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! |
||||||
|
* | | | | | | |-----!-----! | | | | | | |
||||||
|
* !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! |
||||||
|
* | | | | | | | | | | | | | | | |
||||||
|
* '-----+----+----+----+----+----------'----------+----+----+----+----+-----' |
||||||
|
* | | | | | | ! | | | | | |
||||||
|
* '------------------------' '------------------------' |
||||||
|
* .-----------. .-----------. |
||||||
|
* | | | ! | | |
||||||
|
* .-----+-----+-----! !-----+-----+-----. |
||||||
|
* ! ! | | ! | ! ! |
||||||
|
* ! ! !-----! !-----! ! ! |
||||||
|
* | | | | ! | | | |
||||||
|
* '-----------------' '-----------------' |
||||||
|
*/ |
||||||
|
[L6] = KEYMAP( |
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||||
|
/*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, |
||||||
|
/*-*/ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, |
||||||
|
/*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, |
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||||
|
/*-*/ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||||
|
/*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||||
|
KC_TRNS, KC_TRNS, |
||||||
|
KC_TRNS, |
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS |
||||||
|
), |
||||||
|
}; |
||||||
|
|
||||||
|
const uint16_t PROGMEM fn_actions[] = {}; |
||||||
|
|
||||||
|
#define UC_MODE_WIN 0 |
||||||
|
#define UC_MODE_LINUX 1 |
||||||
|
#define UC_MODE_OSX 2 |
||||||
|
|
||||||
|
// TODO: allow default mode to be configured
|
||||||
|
static uint16_t unicode_mode = UC_MODE_WIN; |
||||||
|
|
||||||
|
uint16_t hextokeycode(uint8_t hex) { |
||||||
|
if (hex == 0x0) { |
||||||
|
return KC_P0; |
||||||
|
} |
||||||
|
if (hex < 0xA) { |
||||||
|
return KC_P1 + (hex - 0x1); |
||||||
|
} |
||||||
|
return KC_A + (hex - 0xA); |
||||||
|
} |
||||||
|
|
||||||
|
void unicode_action_function(uint16_t hi, uint16_t lo) { |
||||||
|
switch (unicode_mode) { |
||||||
|
case UC_MODE_WIN: |
||||||
|
register_code(KC_LALT); |
||||||
|
|
||||||
|
register_code(KC_PPLS); |
||||||
|
unregister_code(KC_PPLS); |
||||||
|
|
||||||
|
register_code(hextokeycode((hi & 0xF0) >> 4)); |
||||||
|
unregister_code(hextokeycode((hi & 0xF0) >> 4)); |
||||||
|
register_code(hextokeycode((hi & 0x0F))); |
||||||
|
unregister_code(hextokeycode((hi & 0x0F))); |
||||||
|
register_code(hextokeycode((lo & 0xF0) >> 4)); |
||||||
|
unregister_code(hextokeycode((lo & 0xF0) >> 4)); |
||||||
|
register_code(hextokeycode((lo & 0x0F))); |
||||||
|
unregister_code(hextokeycode((lo & 0x0F))); |
||||||
|
|
||||||
|
unregister_code(KC_LALT); |
||||||
|
break; |
||||||
|
case UC_MODE_LINUX: |
||||||
|
register_code(KC_LCTL); |
||||||
|
register_code(KC_LSFT); |
||||||
|
|
||||||
|
register_code(KC_U); |
||||||
|
unregister_code(KC_U); |
||||||
|
|
||||||
|
register_code(hextokeycode((hi & 0xF0) >> 4)); |
||||||
|
unregister_code(hextokeycode((hi & 0xF0) >> 4)); |
||||||
|
register_code(hextokeycode((hi & 0x0F))); |
||||||
|
unregister_code(hextokeycode((hi & 0x0F))); |
||||||
|
register_code(hextokeycode((lo & 0xF0) >> 4)); |
||||||
|
unregister_code(hextokeycode((lo & 0xF0) >> 4)); |
||||||
|
register_code(hextokeycode((lo & 0x0F))); |
||||||
|
unregister_code(hextokeycode((lo & 0x0F))); |
||||||
|
|
||||||
|
unregister_code(KC_LCTL); |
||||||
|
unregister_code(KC_LSFT); |
||||||
|
break; |
||||||
|
case UC_MODE_OSX: |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { |
||||||
|
if (!record->event.pressed) { |
||||||
|
return MACRO_NONE; |
||||||
|
} |
||||||
|
// MACRODOWN only works in this function
|
||||||
|
switch(id) { |
||||||
|
case UM: |
||||||
|
unicode_mode = (unicode_mode + 1) % 2; |
||||||
|
break; |
||||||
|
|
||||||
|
case UC_GREEK_SMALL_LETTER_OMICRON: |
||||||
|
unicode_action_function(0x03, 0xbf); |
||||||
|
break; |
||||||
|
case UC_LEFTWARDS_ARROW: |
||||||
|
unicode_action_function(0x21, 0x90); |
||||||
|
break; |
||||||
|
case UC_GREEK_CAPITAL_LETTER_RHO: |
||||||
|
unicode_action_function(0x03, 0xa1); |
||||||
|
break; |
||||||
|
case UC_SUBSCRIPT_THREE: |
||||||
|
unicode_action_function(0x20, 0x83); |
||||||
|
break; |
||||||
|
case UC_VULGAR_FRACTION_ONE_EIGHTH: |
||||||
|
unicode_action_function(0x21, 0x5b); |
||||||
|
break; |
||||||
|
case UC_GREEK_SMALL_LETTER_LAMDA: |
||||||
|
unicode_action_function(0x03, 0xbb); |
||||||
|
break; |
||||||
|
case UC_VULGAR_FRACTION_ONE_THIRD: |
||||||
|
unicode_action_function(0x21, 0x53); |
||||||
|
break; |
||||||
|
case UC_GREEK_SMALL_LETTER_XI: |
||||||
|
unicode_action_function(0x03, 0xbe); |
||||||
|
break; |
||||||
|
case UC_THERE_DOES_NOT_EXIST: |
||||||
|
unicode_action_function(0x22, 0x04); |
||||||
|
break; |
||||||
|
case UC_SUPERSCRIPT_ONE: |
||||||
|
unicode_action_function(0x00, 0xb9); |
||||||
|
break; |
||||||
|
case UC_GREEK_SMALL_LETTER_BETA: |
||||||
|
unicode_action_function(0x03, 0xb2); |
||||||
|
break; |
||||||
|
case UC_SUBSCRIPT_FIVE: |
||||||
|
unicode_action_function(0x20, 0x85); |
||||||
|
break; |
||||||
|
case UC_GREEK_CAPITAL_LETTER_IOTA: |
||||||
|
unicode_action_function(0x03, 0x99); |
||||||
|
break; |
||||||
|
case UC_VULGAR_FRACTION_ONE_FIFTH: |
||||||
|
unicode_action_function(0x21, 0x55); |
||||||
|
break; |
||||||
|
case UC_GREEK_SMALL_LETTER_PSI: |
||||||
|
unicode_action_function(0x03, 0xc8); |
||||||
|
break; |
||||||
|
case UC_SUBSCRIPT_NINE: |
||||||
|
unicode_action_function(0x20, 0x89); |
||||||
|
break; |
||||||
|
case UC_SUPERSCRIPT_FOUR: |
||||||
|
unicode_action_function(0x20, 0x74); |
||||||
|
break; |
||||||
|
case UC_RIGHTWARDS_ARROW: |
||||||
|
unicode_action_function(0x21, 0x92); |
||||||
|
break; |
||||||
|
case UC_SUPERSCRIPT_SIX: |
||||||
|
unicode_action_function(0x20, 0x76); |
||||||
|
break; |
||||||
|
case UC_DOWNWARDS_ARROW: |
||||||
|
unicode_action_function(0x21, 0x93); |
||||||
|
break; |
||||||
|
case UC_GREEK_SMALL_LETTER_PI: |
||||||
|
unicode_action_function(0x03, 0xc0); |
||||||
|
break; |
||||||
|
case UC_SUPERSCRIPT_TWO: |
||||||
|
unicode_action_function(0x00, 0xb2); |
||||||
|
break; |
||||||
|
case UC_GREEK_CAPITAL_LETTER_OMEGA: |
||||||
|
unicode_action_function(0x03, 0xa9); |
||||||
|
break; |
||||||
|
case UC_GREEK_CAPITAL_LETTER_PSI: |
||||||
|
unicode_action_function(0x03, 0xa8); |
||||||
|
break; |
||||||
|
case UC_SUBSCRIPT_FOUR: |
||||||
|
unicode_action_function(0x20, 0x84); |
||||||
|
break; |
||||||
|
case UC_GREEK_CAPITAL_LETTER_NU: |
||||||
|
unicode_action_function(0x03, 0x9d); |
||||||
|
break; |
||||||
|
case UC_DIVISION_SIGN: |
||||||
|
unicode_action_function(0x00, 0xf7); |
||||||
|
break; |
||||||
|
case UC_GREEK_SMALL_LETTER_SIGMA: |
||||||
|
unicode_action_function(0x03, 0xc3); |
||||||
|
break; |
||||||
|
case UC_GREEK_SMALL_LETTER_RHO: |
||||||
|
unicode_action_function(0x03, 0xc1); |
||||||
|
break; |
||||||
|
case UC_VULGAR_FRACTION_ONE_SIXTH: |
||||||
|
unicode_action_function(0x21, 0x59); |
||||||
|
break; |
||||||
|
case UC_GREEK_SMALL_LETTER_GAMMA: |
||||||
|
unicode_action_function(0x03, 0xb3); |
||||||
|
break; |
||||||
|
case UC_VULGAR_FRACTION_TWO_THIRDS: |
||||||
|
unicode_action_function(0x21, 0x54); |
||||||
|
break; |
||||||
|
case UC_GREEK_SMALL_LETTER_NU: |
||||||
|
unicode_action_function(0x03, 0xbd); |
||||||
|
break; |
||||||
|
case UC_GREEK_SMALL_LETTER_ZETA: |
||||||
|
unicode_action_function(0x03, 0xb6); |
||||||
|
break; |
||||||
|
case UC_GREEK_SMALL_LETTER_EPSILON: |
||||||
|
unicode_action_function(0x03, 0xb5); |
||||||
|
break; |
||||||
|
case UC_GREEK_SMALL_LETTER_KAPPA: |
||||||
|
unicode_action_function(0x03, 0xba); |
||||||
|
break; |
||||||
|
case UC_SUPERSCRIPT_SEVEN: |
||||||
|
unicode_action_function(0x20, 0x77); |
||||||
|
break; |
||||||
|
case UC_GREEK_CAPITAL_LETTER_PI: |
||||||
|
unicode_action_function(0x03, 0xa0); |
||||||
|
break; |
||||||
|
case UC_GREEK_SMALL_LETTER_FINAL_SIGMA: |
||||||
|
unicode_action_function(0x03, 0xc2); |
||||||
|
break; |
||||||
|
case UC_GREEK_CAPITAL_LETTER_XI: |
||||||
|
unicode_action_function(0x03, 0x9e); |
||||||
|
break; |
||||||
|
case UC_GREEK_SMALL_LETTER_THETA: |
||||||
|
unicode_action_function(0x03, 0xb8); |
||||||
|
break; |
||||||
|
case UC_GREEK_SMALL_LETTER_ETA: |
||||||
|
unicode_action_function(0x03, 0xb7); |
||||||
|
break; |
||||||
|
case UC_SUBSCRIPT_TWO: |
||||||
|
unicode_action_function(0x20, 0x82); |
||||||
|
break; |
||||||
|
case UC_ASYMPTOTICALLY_EQUAL_TO: |
||||||
|
unicode_action_function(0x22, 0x43); |
||||||
|
break; |
||||||
|
case UC_GREEK_SMALL_LETTER_ALPHA: |
||||||
|
unicode_action_function(0x03, 0xb1); |
||||||
|
break; |
||||||
|
case UC_GREEK_CAPITAL_LETTER_PHI: |
||||||
|
unicode_action_function(0x03, 0xa6); |
||||||
|
break; |
||||||
|
case UC_GREEK_SMALL_LETTER_PHI: |
||||||
|
unicode_action_function(0x03, 0xc6); |
||||||
|
break; |
||||||
|
case UC_INFINITY: |
||||||
|
unicode_action_function(0x22, 0x1e); |
||||||
|
break; |
||||||
|
case UC_GREEK_CAPITAL_LETTER_OMICRON: |
||||||
|
unicode_action_function(0x03, 0x9f); |
||||||
|
break; |
||||||
|
case UC_ELEMENT_OF: |
||||||
|
unicode_action_function(0x22, 0x08); |
||||||
|
break; |
||||||
|
case UC_MULTIPLICATION_SIGN: |
||||||
|
unicode_action_function(0x00, 0xd7); |
||||||
|
break; |
||||||
|
case UC_SUBSCRIPT_ZERO: |
||||||
|
unicode_action_function(0x20, 0x80); |
||||||
|
break; |
||||||
|
case UC_GREEK_CAPITAL_LETTER_SIGMA: |
||||||
|
unicode_action_function(0x03, 0xa3); |
||||||
|
break; |
||||||
|
case UC_GREEK_SMALL_LETTER_OMEGA: |
||||||
|
unicode_action_function(0x03, 0xc9); |
||||||
|
break; |
||||||
|
case UC_SUBSCRIPT_ONE: |
||||||
|
unicode_action_function(0x20, 0x81); |
||||||
|
break; |
||||||
|
case UC_GREEK_CAPITAL_LETTER_ZETA: |
||||||
|
unicode_action_function(0x03, 0x96); |
||||||
|
break; |
||||||
|
case UC_GREEK_SMALL_LETTER_TAU: |
||||||
|
unicode_action_function(0x03, 0xc4); |
||||||
|
break; |
||||||
|
case UC_SUPERSCRIPT_FIVE: |
||||||
|
unicode_action_function(0x20, 0x75); |
||||||
|
break; |
||||||
|
case UC_THERE_EXISTS: |
||||||
|
unicode_action_function(0x22, 0x03); |
||||||
|
break; |
||||||
|
case UC_PLUS_MINUS_SIGN: |
||||||
|
unicode_action_function(0x00, 0xb1); |
||||||
|
break; |
||||||
|
case UC_VULGAR_FRACTION_THREE_QUARTERS: |
||||||
|
unicode_action_function(0x00, 0xbe); |
||||||
|
break; |
||||||
|
case UC_SUPERSCRIPT_THREE: |
||||||
|
unicode_action_function(0x00, 0xb3); |
||||||
|
break; |
||||||
|
case UC_EMPTY_SET: |
||||||
|
unicode_action_function(0x22, 0x05); |
||||||
|
break; |
||||||
|
case UC_UPWARDS_ARROW: |
||||||
|
unicode_action_function(0x21, 0x91); |
||||||
|
break; |
||||||
|
case UC_SUPERSCRIPT_NINE: |
||||||
|
unicode_action_function(0x20, 0x79); |
||||||
|
break; |
||||||
|
case UC_GREEK_SMALL_LETTER_DELTA: |
||||||
|
unicode_action_function(0x03, 0xb4); |
||||||
|
break; |
||||||
|
case UC_GREEK_SMALL_LETTER_MU: |
||||||
|
unicode_action_function(0x03, 0xbc); |
||||||
|
break; |
||||||
|
case UC_GREEK_CAPITAL_LETTER_KAPPA: |
||||||
|
unicode_action_function(0x03, 0x9a); |
||||||
|
break; |
||||||
|
case UC_SUBSCRIPT_EIGHT: |
||||||
|
unicode_action_function(0x20, 0x88); |
||||||
|
break; |
||||||
|
case UC_GREEK_CAPITAL_LETTER_ALPHA: |
||||||
|
unicode_action_function(0x03, 0x91); |
||||||
|
break; |
||||||
|
case UC_SUBSCRIPT_SEVEN: |
||||||
|
unicode_action_function(0x20, 0x87); |
||||||
|
break; |
||||||
|
case UC_GREEK_CAPITAL_LETTER_BETA: |
||||||
|
unicode_action_function(0x03, 0x92); |
||||||
|
break; |
||||||
|
case UC_GREEK_CAPITAL_LETTER_ETA: |
||||||
|
unicode_action_function(0x03, 0x97); |
||||||
|
break; |
||||||
|
case UC_SUPERSCRIPT_EIGHT: |
||||||
|
unicode_action_function(0x20, 0x78); |
||||||
|
break; |
||||||
|
case UC_SUPERSCRIPT_ZERO: |
||||||
|
unicode_action_function(0x20, 0x70); |
||||||
|
break; |
||||||
|
case UC_NOT_AN_ELEMENT_OF: |
||||||
|
unicode_action_function(0x22, 0x09); |
||||||
|
break; |
||||||
|
case UC_GREEK_SMALL_LETTER_UPSILON: |
||||||
|
unicode_action_function(0x03, 0xc5); |
||||||
|
break; |
||||||
|
case UC_NOT_EQUAL_TO: |
||||||
|
unicode_action_function(0x22, 0x60); |
||||||
|
break; |
||||||
|
case UC_GREEK_CAPITAL_LETTER_CHI: |
||||||
|
unicode_action_function(0x03, 0xa7); |
||||||
|
break; |
||||||
|
case UC_FOR_ALL: |
||||||
|
unicode_action_function(0x22, 0x00); |
||||||
|
break; |
||||||
|
case UC_GREEK_CAPITAL_LETTER_TAU: |
||||||
|
unicode_action_function(0x03, 0xa4); |
||||||
|
break; |
||||||
|
case UC_VULGAR_FRACTION_ONE_QUARTER: |
||||||
|
unicode_action_function(0x00, 0xbc); |
||||||
|
break; |
||||||
|
case UC_GREEK_SMALL_LETTER_CHI: |
||||||
|
unicode_action_function(0x03, 0xc7); |
||||||
|
break; |
||||||
|
case UC_GREEK_CAPITAL_LETTER_THETA: |
||||||
|
unicode_action_function(0x03, 0x98); |
||||||
|
break; |
||||||
|
case UC_GREEK_SMALL_LETTER_IOTA: |
||||||
|
unicode_action_function(0x03, 0xb9); |
||||||
|
break; |
||||||
|
case UC_GREEK_CAPITAL_LETTER_LAMDA: |
||||||
|
unicode_action_function(0x03, 0x9b); |
||||||
|
break; |
||||||
|
case UC_SUPERSCRIPT_LATIN_SMALL_LETTER_N: |
||||||
|
unicode_action_function(0x20, 0x7f); |
||||||
|
break; |
||||||
|
case UC_GREEK_CAPITAL_LETTER_UPSILON: |
||||||
|
unicode_action_function(0x03, 0xa5); |
||||||
|
break; |
||||||
|
case UC_GREEK_CAPITAL_LETTER_MU: |
||||||
|
unicode_action_function(0x03, 0x9c); |
||||||
|
break; |
||||||
|
case UC_GREEK_CAPITAL_LETTER_EPSILON: |
||||||
|
unicode_action_function(0x03, 0x95); |
||||||
|
break; |
||||||
|
case UC_GREEK_CAPITAL_LETTER_GAMMA: |
||||||
|
unicode_action_function(0x03, 0x93); |
||||||
|
break; |
||||||
|
case UC_SUBSCRIPT_SIX: |
||||||
|
unicode_action_function(0x20, 0x86); |
||||||
|
break; |
||||||
|
case UC_GREEK_CAPITAL_LETTER_DELTA: |
||||||
|
unicode_action_function(0x03, 0x94); |
||||||
|
break; |
||||||
|
case UC_VULGAR_FRACTION_ONE_HALF: |
||||||
|
unicode_action_function(0x00, 0xbd); |
||||||
|
break; |
||||||
|
default: |
||||||
|
break; |
||||||
|
} |
||||||
|
return MACRO_NONE; |
||||||
|
}; |
||||||
|
|
||||||
|
// Runs just one time when the keyboard initializes.
|
||||||
|
void matrix_init_user(void) { |
||||||
|
|
||||||
|
}; |
||||||
|
|
||||||
|
// Runs constantly in the background, in a loop.
|
||||||
|
void matrix_scan_user(void) { |
||||||
|
uint8_t layer = biton32(layer_state); |
||||||
|
|
||||||
|
ergodox_board_led_off(); |
||||||
|
ergodox_right_led_1_off(); |
||||||
|
ergodox_right_led_2_off(); |
||||||
|
ergodox_right_led_3_off(); |
||||||
|
switch (layer) { |
||||||
|
case L1: |
||||||
|
ergodox_right_led_1_on(); |
||||||
|
break; |
||||||
|
case L2: |
||||||
|
ergodox_right_led_2_on(); |
||||||
|
break; |
||||||
|
case L3: |
||||||
|
ergodox_right_led_3_on(); |
||||||
|
break; |
||||||
|
case L4: |
||||||
|
ergodox_right_led_1_on(); |
||||||
|
ergodox_right_led_2_on(); |
||||||
|
break; |
||||||
|
case L5: |
||||||
|
ergodox_right_led_1_on(); |
||||||
|
ergodox_right_led_3_on(); |
||||||
|
break; |
||||||
|
// case L6:
|
||||||
|
// ergodox_right_led_2_on();
|
||||||
|
// ergodox_right_led_3_on();
|
||||||
|
// break;
|
||||||
|
// case L7:
|
||||||
|
// ergodox_right_led_1_on();
|
||||||
|
// ergodox_right_led_2_on();
|
||||||
|
// ergodox_right_led_3_on();
|
||||||
|
// break;
|
||||||
|
default: |
||||||
|
ergodox_board_led_off(); |
||||||
|
break; |
||||||
|
} |
||||||
|
}; |
@ -0,0 +1,188 @@ |
|||||||
|
# ManuNeo Ergodox Keyboard Layout |
||||||
|
|
||||||
|
Compile this file to a `keymap.c` file using `compile_keymap.py` |
||||||
|
|
||||||
|
python compile_keymap.py keymaps/german-manuneo/keymap.md |
||||||
|
|
||||||
|
Tested with python 2.7 and python 3.4 |
||||||
|
|
||||||
|
|
||||||
|
# Layout Config |
||||||
|
|
||||||
|
{ |
||||||
|
"layout": "ergodox_ez", |
||||||
|
"keymaps_includes": [ |
||||||
|
"ergodox_ez.h", |
||||||
|
"action_layer.h", |
||||||
|
"keymap_common.h", |
||||||
|
"keymap_extras/keymap_german.h", |
||||||
|
], |
||||||
|
"key_prefixes": ["DE_", "KC_"], |
||||||
|
"macros": { |
||||||
|
// TODO: implement macros |
||||||
|
// "MUC": "", |
||||||
|
}, |
||||||
|
// TODO: implement default unicode mode |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
# Layers |
||||||
|
|
||||||
|
|
||||||
|
## Layer 0 |
||||||
|
|
||||||
|
.------------------------------------.------------------------------------. |
||||||
|
|MO(5)| 1 | 2 | 3 | 4 | 5 |ACUT | GRV | 6 | 7 | 8 | 9 | 0 |CIRC | |
||||||
|
!-----+----+----+----+----+----------!-----+----+----+----+----+----+-----! |
||||||
|
|MO(4)| X | P | F | W | G |HOME |TG(2)| H | J | K | L | Q | Z | |
||||||
|
!-----+----+----+----x----x----! ! !----x----x----+----+----+-----! |
||||||
|
|MO(1)| U | I | A | E | O |-----!-----! S | N | R | T | D | SS | |
||||||
|
!-----+----+----+----x----x----! ! !----x----x----+----+----+-----! |
||||||
|
|MO(3)| UE | OE | AE | C | V |END | TAB | B | M |COMM| DOT| UP | Y | |
||||||
|
'-----+----+----+----+----+----------'----------+----+----+----+----+-----' |
||||||
|
| | |LGUI|LALT|LCTL| !RCTL|RALT|LEFT|DOWN|RGHT| |
||||||
|
'------------------------' '------------------------' |
||||||
|
.-----------. .-----------. |
||||||
|
|INS |TG(2)| !M(UM)|DELT | |
||||||
|
.-----+-----+-----! !-----+-----+-----. |
||||||
|
! ! | APP | ! PGUP| ! ! |
||||||
|
! ! !-----! !-----! ! ! |
||||||
|
|BSPC |LSFT | ESC | ! PGDN|ENTER|SPACE| |
||||||
|
'-----------------' '-----------------' |
||||||
|
|
||||||
|
|
||||||
|
## Layer 1 |
||||||
|
|
||||||
|
.------------------------------------.------------------------------------. |
||||||
|
| |EXLM|DQOT|PARA| | | | | | | | |RING| | |
||||||
|
!-----+----+----+----+----+----------!-----+----+----+----+----+----+-----! |
||||||
|
| |ASTR|PIPE|SLSH|LCBR|RCBR| | |HASH|LESS|MORE| |DQOT| | |
||||||
|
!-----+----+----+----x----x----! ! !----x----x----+----+----+-----! |
||||||
|
| |UNDS|MINS|AMPR|LBRC|RBRC|-----!-----!DLR |LPRN|RPRN|TILD|QUOT| QST | |
||||||
|
!-----+----+----+----x----x----! ! !----x----x----+----+----+-----! |
||||||
|
| | |PLUS|EQL | | | | |BSLS|PERC|SCLN|COLN| ↑ | | |
||||||
|
'-----+----+----+----+----+----------'----------+----+----+----+----+-----' |
||||||
|
| | | | | | ! | | ← | ↓ | → | |
||||||
|
'------------------------' '------------------------' |
||||||
|
.-----------. .-----------. |
||||||
|
| | | ! | | |
||||||
|
.-----+-----+-----! !-----+-----+-----. |
||||||
|
! ! | | ! | ! ! |
||||||
|
! ! !-----! !-----! ! ! |
||||||
|
| | | | ! | | | |
||||||
|
'-----------------' '-----------------' |
||||||
|
|
||||||
|
|
||||||
|
## Layer 2 |
||||||
|
|
||||||
|
.------------------------------------.------------------------------------. |
||||||
|
| | F1 | F2 | F3 | F4 | F5 | F11 | F12 | F6 | F7 | F8 | F9 |F10 |PEQL | |
||||||
|
!-----+----+----+----+----+----------!-----+----+----+----+----+----+-----! |
||||||
|
| | | | | | | | | | P7 | P8 | P9 |PAST|PSLS | |
||||||
|
!-----+----+----+----x----x----! ! !----x----x----+----+----+-----! |
||||||
|
| | | | | | |-----!-----! | P4 | P5 | P6 |PMNS|PMNS | |
||||||
|
!-----+----+----+----x----x----! ! !----x----x----+----+----+-----! |
||||||
|
| | | | | | | | NLCK| | P1 | P2 | P3 |PPLS|PPLS | |
||||||
|
'-----+----+----+----+----+----------'----------+----+----+----+----+-----' |
||||||
|
| | | | | | ! P0 |PCMM|PDOT|PENT|PENT| |
||||||
|
'------------------------' '------------------------' |
||||||
|
.-----------. .-----------. |
||||||
|
| | | ! | | |
||||||
|
.-----+-----+-----! !-----+-----+-----. |
||||||
|
! ! | | ! | ! ! |
||||||
|
! ! !-----! !-----! ! ! |
||||||
|
| | | | ! | | | |
||||||
|
'-----------------' '-----------------' |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## Layer 3 |
||||||
|
|
||||||
|
http://symbolcodes.tlt.psu.edu/bylanguage/mathchart.html |
||||||
|
|
||||||
|
.------------------------------------.------------------------------------. |
||||||
|
| | ¹ | ² | ³ | ⁴ | ⁵ | ∀ | | ⁶ | ⁷ | ⁸ | ⁹ | ⁰ | | |
||||||
|
!-----+----+----+----+----+----------!-----+----+----+----+----+----+-----! |
||||||
|
| | × | ½ | ÷ | ¼ | ⅕ | | | ⅙ | | ⅛ | | | | |
||||||
|
!-----+----+----+----x----x----! ! !----x----x----+----+----+-----! |
||||||
|
| | | ± | AT |EURO| ∅ |-----!-----! ∞ | ⁿ | ∃ | ∈ | | | |
||||||
|
!-----+----+----+----x----x----! ! !----x----x----+----+----+-----! |
||||||
|
| | ⅓ | ≠ | ⅔ | ¾ | ≃ | | |EXLM| | ∄ | ∉ | | | |
||||||
|
'-----+----+----+----+----+----------'----------+----+----+----+----+-----' |
||||||
|
| | | | | | ! | | | | | |
||||||
|
'------------------------' '------------------------' |
||||||
|
.-----------. .-----------. |
||||||
|
| | | ! | | |
||||||
|
.-----+-----+-----! !-----+-----+-----. |
||||||
|
! ! | | ! | ! ! |
||||||
|
! ! !-----! !-----! ! ! |
||||||
|
| | | | ! | | | |
||||||
|
'-----------------' '-----------------' |
||||||
|
|
||||||
|
|
||||||
|
## Layer 4 |
||||||
|
|
||||||
|
|
||||||
|
.------------------------------------.------------------------------------. |
||||||
|
| | ₁ | ₂ | ₃ | ₄ | ₅ | | | ₆ | ₇ | ₈ | ₉ | ₀ | | |
||||||
|
!-----+----+----+----+----+----------!-----+----+----+----+----+----+-----! |
||||||
|
| | χ | π | φ | ω | γ | | | η | ξ | κ | λ | | ζ | |
||||||
|
!-----+----+----+----x----x----! ! !----x----x----+----+----+-----! |
||||||
|
| | υ | ι | α | ε | ο |-----!-----! σ | ν | ρ | τ | δ | ς | |
||||||
|
!-----+----+----+----x----x----! ! !----x----x----+----+----+-----! |
||||||
|
| | | θ | | | | | | β | μ | | | | ψ | |
||||||
|
'-----+----+----+----+----+----------'----------+----+----+----+----+-----' |
||||||
|
| | | | | | ! | | | | | |
||||||
|
'------------------------' '------------------------' |
||||||
|
.-----------. .-----------. |
||||||
|
| | | ! | | |
||||||
|
.-----+-----+-----! !-----+-----+-----. |
||||||
|
! ! | | ! | ! ! |
||||||
|
! ! !-----! !-----! ! ! |
||||||
|
| | | | ! | | | |
||||||
|
'-----------------' '-----------------' |
||||||
|
|
||||||
|
|
||||||
|
## Layer 5 |
||||||
|
|
||||||
|
.------------------------------------.------------------------------------. |
||||||
|
| | | | | | | | | | | | | | | |
||||||
|
!-----+----+----+----+----+----------!-----+----+----+----+----+----+-----! |
||||||
|
| | Χ | Π | Φ | Ω | Γ | | | Η | Ξ | Κ | Λ | | Ζ | |
||||||
|
!-----+----+----+----x----x----! ! !----x----x----+----+----+-----! |
||||||
|
| | Υ | Ι | Α | Ε | Ο |-----!-----! Σ | Ν | Ρ | Τ | Δ | | |
||||||
|
!-----+----+----+----x----x----! ! !----x----x----+----+----+-----! |
||||||
|
| | | Θ | | | | | | Β | Μ | | | | Ψ | |
||||||
|
'-----+----+----+----+----+----------'----------+----+----+----+----+-----' |
||||||
|
| | | | | | ! | | | | | |
||||||
|
'------------------------' '------------------------' |
||||||
|
.-----------. .-----------. |
||||||
|
| | | ! | | |
||||||
|
.-----+-----+-----! !-----+-----+-----. |
||||||
|
! ! | | ! | ! ! |
||||||
|
! ! !-----! !-----! ! ! |
||||||
|
| | | | ! | | | |
||||||
|
'-----------------' '-----------------' |
||||||
|
|
||||||
|
|
||||||
|
## Layer 6 |
||||||
|
|
||||||
|
.------------------------------------.------------------------------------. |
||||||
|
| | | | | | | | | | | | | | | |
||||||
|
!-----+----+----+----+----+----------!-----+----+----+----+----+----+-----! |
||||||
|
| | | | | | | | | | | | | | | |
||||||
|
!-----+----+----+----x----x----! ! !----x----x----+----+----+-----! |
||||||
|
| | | | | | |-----!-----! | | | | | | |
||||||
|
!-----+----+----+----x----x----! ! !----x----x----+----+----+-----! |
||||||
|
| | | | | | | | | | | | | | | |
||||||
|
'-----+----+----+----+----+----------'----------+----+----+----+----+-----' |
||||||
|
| | | | | | ! | | | | | |
||||||
|
'------------------------' '------------------------' |
||||||
|
.-----------. .-----------. |
||||||
|
| | | ! | | |
||||||
|
.-----+-----+-----! !-----+-----+-----. |
||||||
|
! ! | | ! | ! ! |
||||||
|
! ! !-----! !-----! ! ! |
||||||
|
| | | | ! | | | |
||||||
|
'-----------------' '-----------------' |
||||||
|
|
Before Width: | Height: | Size: 93 KiB After Width: | Height: | Size: 97 KiB |
Before Width: | Height: | Size: 106 KiB After Width: | Height: | Size: 116 KiB |
@ -1,27 +1,27 @@ |
|||||||
[{x:3.5,c:"#9988bb"},"Vol\n\n\n\n\n\nMute",{x:10.5,c:"#ccffff"},"Page\n\n\n\n\n\nUp"], |
[{x:3.5,c:"#99de2a"},"F13",{x:10.5},"F18"], |
||||||
[{y:-0.875,x:2.5,c:"#9988bb"},"Sleep",{x:1},"Vol\n\n\n\n\n\nDown",{x:8.5},"Print\n\n\n\n\n\nScreen",{x:1},"Home\n\n\n\n\n\nDir"], |
[{y:-0.875,x:2.5},"F12",{x:1},"F14",{x:8.5},"F17",{x:1},"F19"], |
||||||
[{y:-0.875,x:5.5},"Vol\n\n\n\n\n\nUp",{c:"#ff4444"},"Esc",{x:4.5,c:"#cccccc",a:7},"",""], |
[{y:-0.875,x:5.5},"F15",{c:"#ff4444"},"Esc",{x:4.5,c:"#cccccc",a:7},"",{c:"#99de2a",a:4},"F16"], |
||||||
[{y:-0.875,c:"#ff4444",a:4,w:1.5},"Esc",{c:"#9988bb"},"Shut\n\n\n\n\n\nDown",{x:14.5},"Email",{c:"#cccccc",a:7,w:1.5},""], |
[{y:-0.875,c:"#2277ff",w:1.5},"Shift\n\n\n\n\n\nLock",{c:"#99de2a"},"F11",{x:14.5},"F20",{c:"#2277ff",w:1.5},"\n\nShift\n\n\n\n\nLock"], |
||||||
[{y:-0.375,x:3.5,c:"#ccffff",a:4},"Mouse\n\n\n\n\n\nUp",{x:10.5},"Cursor\n\n\n\n\n\nUp"], |
[{y:-0.375,x:3.5,c:"#ff8500"},"Mouse\n\n\n\n\n\nUp",{x:10.5},"Cursor\n\n\n\n\n\nUp"], |
||||||
[{y:-0.875,x:2.5,c:"#cccccc",a:7},"",{x:1,c:"#99ffff",a:4},"Scroll\n\n\n\n\n\nUp",{x:8.5},"Scroll\n\n\n\n\n\nUp",{x:1,c:"#cccccc",a:7},""], |
[{y:-0.875,x:2.5,c:"#cccccc",a:7},"",{x:1,c:"#ffb063",a:4},"Scroll\n\n\n\n\n\nUp",{x:8.5},"Home",{x:1},"Page\n\n\n\n\n\nUp"], |
||||||
[{y:-0.875,x:5.5},"",{c:"#99ffff",a:4,h:1.5},"Scroll\n\n\n\n\n\nUp",{x:4.5,h:1.5},"Scroll\n\n\n\n\n\nUp",{c:"#cccccc",a:7},""], |
[{y:-0.875,x:5.5,c:"#cccccc",a:7},"",{c:"#ffb063",a:4,h:1.5},"Scroll\n\n\n\n\n\nUp",{x:4.5,h:1.5},"Scroll\n\n\n\n\n\nUp",{c:"#e6e067"},"Print\n\n\n\n\n\nScreen"], |
||||||
[{y:-0.875,c:"#000000",t:"#ff0000",a:4,fa:[0,0,0,1],w:1.5},"Media\n\n\nL2",{c:"#cccccc",t:"#000000",a:7},"",{x:14.5},"",{c:"#000000",t:"#ff0000",a:4,w:1.5},"\n\nMedia\nL2"], |
[{y:-0.875,c:"#000000",t:"#ff0000",w:1.5},"Media\n\n\n\n\n\nShift",{c:"#e6e067",t:"#000000"},"Shut\n\n\n\n\n\nDown",{x:14.5},"Mail",{c:"#000000",t:"#ff0000",w:1.5},"\n\nMedia\n\n\n\n\nShift"], |
||||||
[{y:-0.375,x:3.5,c:"#ccffff",t:"#000000"},"Mouse\n\n\n\n\n\nDown",{x:10.5},"Cursor\n\n\n\n\n\nDown"], |
[{y:-0.375,x:3.5,c:"#ff8500",t:"#000000"},"Mouse\n\n\n\n\n\nDown",{x:10.5},"Cursor\n\n\n\n\n\nDown"], |
||||||
[{y:-0.875,x:2.5},"Mouse\n\n\n\n\n\nLeft",{x:1},"Mouse\n\n\n\n\n\nRight",{x:8.5},"Cursor\n\n\n\n\n\nLeft",{x:1},"Cursor\n\n\n\n\n\nRight"], |
[{y:-0.875,x:2.5},"Mouse\n\n\n\n\n\nLeft",{x:1},"Mouse\n\n\n\n\n\nRight",{x:8.5},"Cursor\n\n\n\n\n\nLeft",{x:1},"Cursor\n\n\n\n\n\nRight"], |
||||||
[{y:-0.875,x:5.5,c:"#cccccc",a:7},"",{x:6.5,c:"#ccffff",a:4},"Home"], |
[{y:-0.875,x:5.5,c:"#cccccc",a:7},"",{x:6.5,c:"#e6e067",a:4},"Num\n\n\n\n\n\nLock"], |
||||||
[{y:-0.875,c:"#000000",t:"#ff0000",w:1.5},"Symbols\n\n\nL1",{c:"#cccccc",t:"#000000",a:7},"",{x:14.5,c:"#ccffff",a:4},"End",{c:"#cccccc",a:7,w:1.5},""], |
[{y:-0.875,c:"#cccccc",a:7,w:1.5},"",{c:"#e6e067",a:4},"Sleep",{x:14.5},"My\n\n\n\n\n\nComp",{c:"#cccccc",a:7,w:1.5},""], |
||||||
[{y:-0.625,x:6.5,c:"#99ffff",a:4,h:1.5},"Scroll\n\n\n\n\n\nDown",{x:4.5,h:1.5},"Scroll\n\n\n\n\n\nDown"], |
[{y:-0.625,x:6.5,c:"#ffb063",a:4,h:1.5},"Scroll\n\n\n\n\n\nDown",{x:4.5,h:1.5},"Scroll\n\n\n\n\n\nDown"], |
||||||
[{y:-0.75,x:3.5,c:"#ccffff"},"Mouse\n\n\n\n\n\nDown",{x:10.5},"Cursor\n\n\n\n\n\nDown"], |
[{y:-0.75,x:3.5,c:"#ff8500"},"Mouse\n\n\n\n\n\nDown",{x:10.5},"Cursor\n\n\n\n\n\nDown"], |
||||||
[{y:-0.875,x:2.5,c:"#cccccc",a:7},"",{x:1,c:"#99ffff",a:4},"Scroll\n\n\n\n\n\nDown",{x:8.5},"Scroll\n\n\n\n\n\nDown",{x:1,c:"#cccccc",a:7},""], |
[{y:-0.875,x:2.5,c:"#cccccc",a:7},"",{x:1,c:"#ffb063",a:4},"Scroll\n\n\n\n\n\nDown",{x:8.5},"End",{x:1},"Page\n\n\n\n\n\nDown"], |
||||||
[{y:-0.875,x:5.5},"",{x:6.5},""], |
[{y:-0.875,x:5.5,c:"#cccccc",a:7},"",{x:6.5},""], |
||||||
[{y:-0.875,w:1.5},"","",{x:14.5},"",{w:1.5},""], |
[{y:-0.875,c:"#2277ff",a:4,fa:[0,1,0,0,0,0,0],w:1.5},"Capitals\nShift\n\n\n\n\nShift",{c:"#cccccc",a:7},"",{x:14.5},"",{c:"#2277ff",a:4,fa:[0,1,0,1],w:1.5},"\n\nCapitals\nShift\n\n\n\nShift"], |
||||||
[{y:-0.375,x:3.5,c:"#ccffff",a:4},"Left\n\n\n\n\n\nClick",{x:10.5},"Page\n\n\n\n\n\nDown"], |
[{y:-0.375,x:3.5,c:"#ff8500"},"Left\n\n\n\n\n\nClick",{x:10.5,c:"#ffb063"},"Delete"], |
||||||
[{y:-0.875,x:2.5,c:"#cccccc",a:7},"",{x:1,c:"#ccffff",a:4},"Right\n\n\n\n\n\nClick",{x:8.5,c:"#cccccc",a:7},"",{x:1},""], |
[{y:-0.875,x:2.5,c:"#e6e067"},"Vol\n\n\n\n\n\nUp",{x:1,c:"#ff8500"},"Right\n\n\n\n\n\nClick",{x:8.5,c:"#ffb063"},"Insert",{x:1,c:"#cccccc",a:7},""], |
||||||
[{y:-0.75,x:0.5},"","",{x:14.5},"",""], |
[{y:-0.75,x:0.5,c:"#e6e067",a:4},"Mute","Vol\n\n\n\n\n\nDown",{x:14.5,c:"#cccccc",a:7},"",""], |
||||||
[{r:30,rx:6.5,ry:4.25,y:-1,x:1,c:"#bbaacc",a:4},"Stop\n\n\nBrowser","Reload\n\n\nBrowser"], |
[{r:30,rx:6.5,ry:4.25,y:-1,x:1,c:"#cfc82b",a:4},"Stop\n\n\nBrowser","Reload\n\n\nBrowser"], |
||||||
[{h:2},"< Web\n\n\nBrowser",{h:2},"Web >\n\n\nBrowser","Search\n\n\nBrowser"], |
[{h:2},"< Web\n\n\nBrowser",{h:2},"Web >\n\n\nBrowser","Search\n\n\nBrowser"], |
||||||
[{x:2},"Home\n\n\nBrowser"], |
[{x:2},"Home\n\n\nBrowser"], |
||||||
[{r:-30,rx:13,y:-1,x:-3},"Prev\n\n\nAudio\n\n\nTrack","Next\n\n\nAudio\n\n\nTrack"], |
[{r:-30,rx:13,y:-1,x:-3},"Prev\n\n\nAudio\n\n\nTrack","Next\n\n\nAudio\n\n\nTrack"], |
||||||
[{x:-3,c:"#9988bb"},"Vol\n\n\n\n\n\nUp",{c:"#bbaacc",h:2},"Stop\n\n\nAudio",{h:2},"Play\n\n\nAudio\n\n\nPause"], |
[{x:-3,c:"#e6e067"},"Vol\n\n\n\n\n\nUp",{c:"#cfc82b",h:2},"Stop\n\n\nAudio",{h:2},"Play\n\n\nAudio\n\n\nPause"], |
||||||
[{x:-3,c:"#9988bb"},"Vol\n\n\n\n\n\nDown"] |
[{x:-3,c:"#e6e067"},"Vol\n\n\n\n\n\nDown"] |
||||||
|
|
||||||
|
Before Width: | Height: | Size: 91 KiB After Width: | Height: | Size: 96 KiB |
@ -1,9 +1,75 @@ |
|||||||
# The Ordinary Layout, a familiar and powerful layout |
# The Ordinary Layout, a familiar and powerful layout # |
||||||
|
|
||||||
The Ordinary Layout is intended to be unremarkably mundane and remarkably useful. This layout maintains most key positions from common QWERTY keyboards and features enhanced Symbol and Media layers compared to the default Ergodox EZ layout. |
The Ordinary Layout is intended to be unremarkably mundane and remarkably useful. This layout maintains most key positions from common QWERTY keyboards, and it features enhanced Symbol and Media layers compared to the default Ergodox EZ layout. |
||||||
|
|
||||||
Full details about the rationale behind this layout [are available](http://nicholas.rinard.us/2016/03/ergodox-ez-layout.html). |
The Ordinary Layout is supposed to look mostly like a normal keyboard, except in the ways that the Ergodox key arrangement is unique. The thumbs are responsible for space, enter, plus both forward and backward delete; with only a couple exceptions, all other keys are in the same place they are found on traditional keyboards. |
||||||
|
|
||||||
|
Nicholas Keene |
||||||
|
ordinarylayout@nicholaskeene.com |
||||||
|
no rights reserved, use for any purposes, credit me if you are a nice person |
||||||
|
|
||||||
|
## The Base Layout ## |
||||||
|
|
||||||
|
* The light blue keys are modifiers: traditional Control, Option, and Command keys, plus Hyper and Meh |
||||||
|
* The dark blue keys are Shift keys: Capitals Shift (traditional shift), Symbol Shift, and Media Shift; plus a Shift Lock key |
||||||
|
* Several dark blue keys double for entry of characters which would typically be in those locations |
||||||
|
* The turquoise keys are text navigation and manipulation |
||||||
|
* The red keys is Escape and it is always found in that location no matter what |
||||||
|
|
||||||
 |
 |
||||||
|
|
||||||
|
This layout puts the modifier keys along the bottom of the keyboard where they are on most keyboards. They are in the regular order, with the addition of Hyper and Meh keys. On the outside edges are the Shift keys. The traditional shift key is called Capitals Shift and it is in the normal location. Above that are Symbols Shift and Media Shift. Each Shift key momentarily switches the layout to that layer, and if you use the Shift Lock button you can lock the layout to that layer. |
||||||
|
|
||||||
|
Touch typists will also find tilde, tab, equals/plus, slash/pipe, and quote/double-quote sharing space on those Shift keys where they would probably be on a common keyboard. Other than the turquoise keys the only buttons which move to new locations are the Brackets and Dash and Escape. Most touch typists dont touch-type brackets or dash anyway so only Escape really requires retraining of muscle memory, and see below for the Special Escape Sequence. |
||||||
|
|
||||||
|
The four big turquoise keys are arranged differently than in the default Ergodox EZ layout. The Ordinary Layout here copies the design of the old Fingerworks TouchStream keyboard, but also reflects the natural presumptions of the author -- me! I type the space character with my right hand, and to me it makes sense for the two delete keys to be next to one another. |
||||||
|
|
||||||
|
The Forward Tab and Backward Tab keys are in their locations mostly because I ended up with two extra buttons and needed something to do with them. My muscle memory from using the Truly Ergonomic Keyboard makes me look for the Tab key with my right index finger, so it is handy to have this redundant Tab, and the idea with the Backward Tab key is that it becomes easy to navigate text fields in forms, or to indent/unindent code. |
||||||
|
|
||||||
|
## The Symbols Layer ## |
||||||
|
|
||||||
|
* The light green keys are the eponymous symbols |
||||||
|
* The bright green keys are F-Keys |
||||||
|
* The dark green keys constitute a number pad |
||||||
|
* The turquoise keys are the *reverse* of the turquoise keys on the base layer |
||||||
|
|
||||||
 |
 |
||||||
|
|
||||||
|
The Ergodox EZ ships with the "Coder Layer" which I like to call the Symbols layer. There are some significant improvements in The Ordinary Layout over the default layout. |
||||||
|
|
||||||
|
The symbol keys are mostly the same as on the default layout, which did a good job in this regard, but with a few enhancements: |
||||||
|
|
||||||
|
* Angle brackets on this layer mean that curly, square, and angle brackets are all available on different layers of the same two buttons. Also, they mean that all kinds of brackets, including parentheses, are available on both the Base and Symbols layers. |
||||||
|
* The slash, backslash, and pipe characters are grouped together as a memory aid. |
||||||
|
* The & and | symbols are juxtaposed as a memory aid |
||||||
|
|
||||||
|
The number pad area here, in green, includes all four arithmetic operations in the same order found on most number pads and features an Enter key. The keycodes emitted here are normal numeric keycodes, not the number-pad specific keycodes emitted by most number pads, because this layout does not use a Num Lock key to switch the buttons between numeric keycodes and navigational keycodes. See the explanation in The Media Layout section about navigation using these same buttons. |
||||||
|
|
||||||
|
Finally, consider the turquoise text-nav keys. Here in the Symbols layer, these are *reversed* from the base layer, with most keys mirrored, but the Delete keys shifted to maintain the directional significance of their arrangement. This is powerful! Often I find myself using the mouse with my right hand, and the left hand needs to press Enter. Instead of reaching the left hand over to the right side of the keyboard, now I simply tap Symbols to reverse the yellow keys, and Enter is right where it should be. |
||||||
|
|
||||||
|
## The Media Layer ## |
||||||
|
|
||||||
|
* The dark orange keys on the left move the mouse cursor |
||||||
|
* The dark orange keys on the right move the text cursor |
||||||
|
* The light orange keys are for scrolling and paging |
||||||
|
* The bright green keys are more F-keys |
||||||
|
* The dark yellow keys signal Web and Audio applications |
||||||
|
* The light yellow keys signal the operating system |
||||||
|
|
||||||
 |
 |
||||||
|
|
||||||
|
This layer was inspired by the Media layer on the Ergodox EZ but takes it farther. The Fingerworks TouchStream keyboard had a very useful feature for controlling the text cursor easily and this layer does something similar. The left hand can move the mouse, the right hand moves the text cursor, in all four directions, in small or large increments. This greatly enhances navigation in text documents. |
||||||
|
|
||||||
|
Moreover, the orange keys on the right overlay the numberpad from the Symbols Layer, such that in the Media Layer the same keys can be used as if they were a number pad in navigational mode (Num Lock off). For instance, in traditional number pads the '3' key became 'Page Down', and so it is here. This means a user can do text navigation without moving either hand. |
||||||
|
|
||||||
|
## Switching Between Layers ## |
||||||
|
|
||||||
|
The three Shift keys correspond to three logical layers on top of the ever-present base layer, and are represented in the three LEDs on the keyboard: Capitals (red), Symbols (green), Media (blue). The color of a layer illuminates when the layer is active. Shift keys work in the expected way: press them and the keys shift to that layer; release them and the keys shift back to the base layer. The Ordinary Layout also features a Shift Lock key to keep a layer active indefinitely. Hold down the Shift Lock key then press any Shift key to lock to that layer. Or, hold down the Shift key and press the Shift Lock key; either way works. To revert to the base layer, use the Shift Lock key again in combination with the Shift key. |
||||||
|
|
||||||
|
This layout attempts to treat the Capitals Shift layer the same as the other two Shift layers, but internally they are different which causes some inconsistencies. For instance, it is possible to switch from any layer to any other layer, and to lock to any layer, *except* it is not possible to go from Media to Symbols. You must exit the Media layer before engaging the Symbols layer. Also, the Caps Lock feature must be triggered by first pressing the Shift Lock key then a Capitals Shift key; it doesn't work if you press the Shift key first (instead you get the secondary symbol associated with the Shift Lock button). |
||||||
|
|
||||||
|
## Special Escape Sequence ## |
||||||
|
|
||||||
|
In the Ordinary Layout, the most unsatisfying key location is the Escape key which rightly belongs segregated on its own way up on the top left of the keyboard. The Ergodox does not have a physical button in such a location and the nearest one, in the top left corner, was assigned to the tilde button which is traditionally found in that location. The Escape key is important so it features prominently on the other top corner on the left side of the keyboard, and is always there in all layers. Nevertheless, alas, it isn't Ordinary to put the escape in that different corner! |
||||||
|
|
||||||
|
That tilde key has a second function as the Shift Lock key and that makes possible a special feature. To make this layout as Ordinary as possible, the Escape key can *also* be accessed by pressing Shift Lock then the 1 button right next to it. This easy gesture is a way to partially maintain the ease of flicking your wrist to the left and tapping Escape. This gesture works in all layers. |
||||||
|
Before Width: | Height: | Size: 732 KiB After Width: | Height: | Size: 669 KiB |
@ -0,0 +1,134 @@ |
|||||||
|
#include "ergodox_ez.h" |
||||||
|
#include "debug.h" |
||||||
|
#include "action_layer.h" |
||||||
|
|
||||||
|
#define BASE 0 |
||||||
|
#define SYMB 1 |
||||||
|
#define PLVR 2 |
||||||
|
#define ARRW 3 |
||||||
|
|
||||||
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { |
||||||
|
[BASE] = KEYMAP( |
||||||
|
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_F14, |
||||||
|
KC_TAB, KC_Q, KC_W, KC_D, KC_F, KC_K, TG(PLVR), |
||||||
|
CTL_T(KC_ESC), KC_A, KC_S, KC_E, KC_T, KC_G, |
||||||
|
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LBRC, |
||||||
|
KC_F1, KC_F2, KC_F3, KC_LALT, KC_LGUI, |
||||||
|
/*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_VOLD, KC_MUTE, |
||||||
|
/*-*/ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_VOLU, |
||||||
|
/*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_BSPC, CTL_T(KC_ESC), KC_FN1, |
||||||
|
//
|
||||||
|
/*-*/ KC_F15, KC_6, KC_7, KC_8, KC_9, KC_0, KC_EQL, |
||||||
|
/*-*/ KC_BSLS, KC_J, KC_U, KC_R, KC_L, KC_SCLN, KC_MINS, |
||||||
|
/*-*/ /*-*/ KC_Y, KC_N, KC_I, KC_O, KC_H, KC_ENT, |
||||||
|
/*-*/ KC_RBRC, KC_P, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, |
||||||
|
/*-*/ /*-*/ /*-*/ KC_RGUI, KC_RALT, KC_F4, KC_F5, KC_F6, |
||||||
|
KC_MPLY, KC_MNXT, |
||||||
|
KC_MPRV, |
||||||
|
KC_FN3, KC_QUOT, KC_SPC |
||||||
|
), |
||||||
|
[SYMB] = KEYMAP( |
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||||
|
KC_TRNS, KC_1, KC_2, KC_3, KC_4, KC_5, KC_TRNS, |
||||||
|
KC_TRNS, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, |
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||||
|
/*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, |
||||||
|
/*-*/ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, |
||||||
|
/*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, |
||||||
|
//
|
||||||
|
/*-*/ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||||
|
/*-*/ KC_TRNS, KC_6, KC_7, KC_8, KC_9, KC_0, KC_TRNS, |
||||||
|
/*-*/ /*-*/ KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_TRNS, |
||||||
|
/*-*/ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||||
|
/*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||||
|
KC_TRNS, KC_TRNS, |
||||||
|
KC_TRNS, |
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS |
||||||
|
), |
||||||
|
[PLVR] = KEYMAP( |
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, |
||||||
|
KC_NO, KC_1, KC_2, KC_3, KC_4, KC_5, KC_TRNS, |
||||||
|
KC_NO, KC_Q, KC_W, KC_E, KC_R, KC_T, |
||||||
|
KC_NO, KC_A, KC_S, KC_D, KC_F, KC_G, KC_NO, |
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_NO, |
||||||
|
/*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, |
||||||
|
/*-*/ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, |
||||||
|
/*-*/ /*-*/ /*-*/ /*-*/ KC_C, KC_V, KC_NO, |
||||||
|
//
|
||||||
|
/*-*/ KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, |
||||||
|
/*-*/ KC_NO, KC_6, KC_7, KC_8, KC_9, KC_0, KC_NO, |
||||||
|
/*-*/ /*-*/ KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, |
||||||
|
/*-*/ KC_NO, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, |
||||||
|
/*-*/ /*-*/ /*-*/ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, |
||||||
|
KC_TRNS, KC_TRNS, |
||||||
|
KC_TRNS, |
||||||
|
KC_NO, KC_N, KC_M |
||||||
|
), |
||||||
|
[ARRW] = KEYMAP( |
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||||
|
KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_U, KC_MS_D, KC_MS_R, |
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2, KC_TRNS, |
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||||
|
/*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, |
||||||
|
/*-*/ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, |
||||||
|
/*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, |
||||||
|
//
|
||||||
|
/*-*/ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||||
|
/*-*/ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||||
|
/*-*/ /*-*/ KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_TRNS, KC_TRNS, |
||||||
|
/*-*/ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||||
|
/*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||||
|
KC_TRNS, KC_TRNS, |
||||||
|
KC_TRNS, |
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS |
||||||
|
), |
||||||
|
}; |
||||||
|
|
||||||
|
const uint16_t PROGMEM fn_actions[] = { |
||||||
|
[SYMB] = ACTION_LAYER_TAP_TOGGLE(SYMB), // FN1 - Momentary Symbols Layer
|
||||||
|
[PLVR] = ACTION_LAYER_TAP_TOGGLE(PLVR), // FN2 - Momentary Plover Layer
|
||||||
|
[ARRW] = ACTION_LAYER_TAP_TOGGLE(ARRW), // FN3 - Momentary Arrows Layer
|
||||||
|
}; |
||||||
|
|
||||||
|
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) |
||||||
|
{ |
||||||
|
// MACRODOWN only works in this function
|
||||||
|
switch(id) { |
||||||
|
case 0: |
||||||
|
if (record->event.pressed) { |
||||||
|
register_code(KC_RSFT); |
||||||
|
} else { |
||||||
|
unregister_code(KC_RSFT); |
||||||
|
} |
||||||
|
break; |
||||||
|
} |
||||||
|
return MACRO_NONE; |
||||||
|
}; |
||||||
|
|
||||||
|
// Runs just one time when the keyboard initializes.
|
||||||
|
void matrix_init_user(void) { |
||||||
|
}; |
||||||
|
|
||||||
|
// Runs constantly in the background, in a loop.
|
||||||
|
void matrix_scan_user(void) { |
||||||
|
uint8_t layer = biton32(layer_state); |
||||||
|
ergodox_board_led_off(); |
||||||
|
ergodox_right_led_1_off(); |
||||||
|
ergodox_right_led_2_off(); |
||||||
|
ergodox_right_led_3_off(); |
||||||
|
switch (layer) { |
||||||
|
case SYMB: |
||||||
|
ergodox_right_led_1_on(); |
||||||
|
break; |
||||||
|
case PLVR: |
||||||
|
ergodox_right_led_2_on(); |
||||||
|
break; |
||||||
|
case ARRW: |
||||||
|
ergodox_right_led_3_on(); |
||||||
|
break; |
||||||
|
default: |
||||||
|
break; |
||||||
|
} |
||||||
|
}; |
@ -0,0 +1,50 @@ |
|||||||
|
# Roman's Layout |
||||||
|
|
||||||
|
There are four layers: |
||||||
|
|
||||||
|
- **BASE** is [Norman layout](https://normanlayout.info/). |
||||||
|
- **SYMB** for numbers and symbols. |
||||||
|
- **PLVR** is optimized for [Plover](http://www.openstenoproject.org). |
||||||
|
- **ARRW** for navigation (same fingers for arrows as HJKL on QWERTY). |
||||||
|
|
||||||
|
Looking for IJKL arrows? [Here we |
||||||
|
go](../romanzolotarev-norman-plover-osx/). |
||||||
|
|
||||||
|
[](rttp://www.keyboard-layout-editor.com/#/gists/56ffedceb0668dda47c993e7271563e0) |
||||||
|
|
||||||
|
## Switching |
||||||
|
|
||||||
|
- Tap `SYMB` to toggle **SYMB**. |
||||||
|
- Tap `ARRW` to toggle **ARRW**. |
||||||
|
- Hold `SYMB` (or `ARRW`) to activate **SYMB** (or **ARRW**) while holding. |
||||||
|
- Tap `PLVR` to toggle **PLVR**. |
||||||
|
|
||||||
|
## LEDs |
||||||
|
|
||||||
|
- Red: SYMB is on. |
||||||
|
- Green: PLVR is on. |
||||||
|
- Blue: ARRW is on. |
||||||
|
|
||||||
|
## Functional Keys |
||||||
|
|
||||||
|
- Tap `F1` to mute microphone via [Shush](http://mizage.com/shush/). |
||||||
|
- Tap `F2` to copy screenshot to the clipboard. |
||||||
|
- Hold `SHIFT` and tap `F2` to save screenshot as a file. |
||||||
|
- Tap `F3`, `F4`, `F5`, `F6` to resize a window via [Divvy](http://mizage.com/divvy/). |
||||||
|
- Tap `F14`, `F15` to adjust display brightness. |
||||||
|
|
||||||
|
**IMPORTANT**: If you have another keyboard connected via Bluetooth, then |
||||||
|
`F14` and `F15` will not work. Turn off that Bluetooth keyboard. Re-plug |
||||||
|
you ErgoDox. Enjoy! |
||||||
|
|
||||||
|
## CTRL/ESC |
||||||
|
|
||||||
|
Both of those keys are frequently used in Vim. |
||||||
|
|
||||||
|
- Tap `CTRL/ESC` to send `ESC`. |
||||||
|
- Hold `CTRL/ESC` to use as `CTRL`. |
||||||
|
|
||||||
|
## Activate N-rollover |
||||||
|
|
||||||
|
- While in **BASE** hold left `SHIFT` and right `SHIRT` and then tap `N`. |
||||||
|
- Then you can activate **PLVR** and use ErgoDox EZ for steno. |
After Width: | Height: | Size: 128 KiB |
@ -0,0 +1,69 @@ |
|||||||
|
// This is the canonical layout file for the Quantum project. If you want to add another keyboard,
|
||||||
|
// this is the style you want to emulate.
|
||||||
|
|
||||||
|
#include "planck.h" |
||||||
|
#include "backlight.h" |
||||||
|
|
||||||
|
// Each layer gets a name for readability, which is then used in the keymap matrix below.
|
||||||
|
// The underscores don't mean anything - you can have a layer called STUFF or any other name.
|
||||||
|
// Layer names don't all need to be of the same length, obviously, and you can also skip them
|
||||||
|
// entirely and just use numbers.
|
||||||
|
#define _QW 0 |
||||||
|
#define _CM 1 |
||||||
|
#define _DV 2 |
||||||
|
#define _LW 3 |
||||||
|
#define _RS 4 |
||||||
|
|
||||||
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { |
||||||
|
[_QW] = { /* Qwerty */ |
||||||
|
{KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, |
||||||
|
{KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT}, |
||||||
|
{KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT }, |
||||||
|
{M(0), KC_ESC, KC_LALT, KC_LGUI, F(1), KC_SPC, KC_SPC, F(2), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} |
||||||
|
}, |
||||||
|
[_CM] = { /* Colemak */ |
||||||
|
{KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC}, |
||||||
|
{KC_LCTL, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT}, |
||||||
|
{KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT }, |
||||||
|
{M(0), KC_ESC, KC_LALT, KC_LGUI, F(1), KC_SPC, KC_SPC, F(2), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} |
||||||
|
}, |
||||||
|
[_DV] = { /* Dvorak */ |
||||||
|
{KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC}, |
||||||
|
{KC_LCTL, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH}, |
||||||
|
{KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT }, |
||||||
|
{M(0), KC_ESC, KC_LALT, KC_LGUI, F(1), KC_SPC, KC_SPC, F(2), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} |
||||||
|
}, |
||||||
|
[_RS] = { /* RAISE */ |
||||||
|
{KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, |
||||||
|
{KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS}, |
||||||
|
{KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS}, |
||||||
|
{M(0), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_F14, KC_F15, KC_TRNS, KC_MFFD, KC_VOLD, KC_VOLU, KC_MPLY} |
||||||
|
}, |
||||||
|
[_LW] = { /* LOWER */ |
||||||
|
{KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC}, |
||||||
|
{KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE}, |
||||||
|
{KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS}, |
||||||
|
{M(0), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_F14, KC_F15, KC_TRNS, KC_MFFD, KC_VOLD, KC_VOLU, KC_MPLY} |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
const uint16_t PROGMEM fn_actions[] = { |
||||||
|
[1] = ACTION_LAYER_TAP_KEY(MO(_LW), KC_BSPC), // Tap for backspace, hold for LOWER
|
||||||
|
[2] = ACTION_LAYER_TAP_KEY(MO(_RS), KC_ENT), // Tap for enter, hold for RAISE
|
||||||
|
}; |
||||||
|
|
||||||
|
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) |
||||||
|
{ |
||||||
|
// MACRODOWN only works in this function
|
||||||
|
switch(id) { |
||||||
|
case 0: |
||||||
|
if (record->event.pressed) { |
||||||
|
register_code(KC_RSFT); |
||||||
|
backlight_step(); |
||||||
|
} else { |
||||||
|
unregister_code(KC_RSFT); |
||||||
|
} |
||||||
|
break; |
||||||
|
} |
||||||
|
return MACRO_NONE; |
||||||
|
}; |
@ -0,0 +1,34 @@ |
|||||||
|
# The Default Planck Layout |
||||||
|
|
||||||
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { |
||||||
|
[_QW] = { /* Qwerty */ |
||||||
|
{KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, |
||||||
|
{KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT}, |
||||||
|
{KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT }, |
||||||
|
{M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} |
||||||
|
}, |
||||||
|
[_CM] = { /* Colemak */ |
||||||
|
{KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC}, |
||||||
|
{KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT}, |
||||||
|
{KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT }, |
||||||
|
{M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} |
||||||
|
}, |
||||||
|
[_DV] = { /* Dvorak */ |
||||||
|
{KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC}, |
||||||
|
{KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH}, |
||||||
|
{KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT }, |
||||||
|
{M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} |
||||||
|
}, |
||||||
|
[_RS] = { /* RAISE */ |
||||||
|
{KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, |
||||||
|
{KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS}, |
||||||
|
{KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS}, |
||||||
|
{KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} |
||||||
|
}, |
||||||
|
[_LW] = { /* LOWER */ |
||||||
|
{KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC}, |
||||||
|
{KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE}, |
||||||
|
{KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS}, |
||||||
|
{KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} |
||||||
|
} |
||||||
|
}; |
@ -0,0 +1,117 @@ |
|||||||
|
// This is the canonical layout file for the Quantum project. If you want to add another keyboard,
|
||||||
|
// this is the style you want to emulate.
|
||||||
|
|
||||||
|
#include "preonic.h" |
||||||
|
#ifdef BACKLIGHT_ENABLE |
||||||
|
#include "backlight.h" |
||||||
|
#endif |
||||||
|
|
||||||
|
// Each layer gets a name for readability, which is then used in the keymap matrix below.
|
||||||
|
// The underscores don't mean anything - you can have a layer called STUFF or any other name.
|
||||||
|
// Layer names don't all need to be of the same length, obviously, and you can also skip them
|
||||||
|
// entirely and just use numbers.
|
||||||
|
#define _QW 0 |
||||||
|
#define _CM 1 |
||||||
|
#define _DV 2 |
||||||
|
#define _LW 3 |
||||||
|
#define _RS 4 |
||||||
|
|
||||||
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { |
||||||
|
[_QW] = { /* Qwerty */ |
||||||
|
{KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, |
||||||
|
{KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, |
||||||
|
{KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT}, |
||||||
|
{KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT }, |
||||||
|
{M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} |
||||||
|
}, |
||||||
|
[_CM] = { /* Colemak */ |
||||||
|
{KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, |
||||||
|
{KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC}, |
||||||
|
{KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT}, |
||||||
|
{KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT }, |
||||||
|
{M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} |
||||||
|
}, |
||||||
|
[_DV] = { /* Dvorak */ |
||||||
|
{KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, |
||||||
|
{KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC}, |
||||||
|
{KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH}, |
||||||
|
{KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT }, |
||||||
|
{M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} |
||||||
|
}, |
||||||
|
[_RS] = { /* RAISE */ |
||||||
|
{KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, |
||||||
|
{KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, |
||||||
|
{KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS}, |
||||||
|
{KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS}, |
||||||
|
{KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} |
||||||
|
}, |
||||||
|
[_LW] = { /* LOWER */ |
||||||
|
{KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, |
||||||
|
{KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC}, |
||||||
|
{KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE}, |
||||||
|
{KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS}, |
||||||
|
{KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
const uint16_t PROGMEM fn_actions[] = { |
||||||
|
|
||||||
|
}; |
||||||
|
|
||||||
|
// Guitar Notes
|
||||||
|
#define N_E 13180.5 |
||||||
|
#define N_B 9870.8 |
||||||
|
#define N_G 15680.0 |
||||||
|
#define N_D 11740.7 |
||||||
|
#define N_E 13180.5 |
||||||
|
|
||||||
|
float start_up[][2] = { |
||||||
|
{ N_E, 500 }, |
||||||
|
{ 0, 50 }, |
||||||
|
{ N_E, 500 }, |
||||||
|
{ 0, 50 }, |
||||||
|
{ N_E, 500 }, |
||||||
|
{ 0, 50 }, |
||||||
|
{ N_B, 500 }, |
||||||
|
{ 0, 50 }, |
||||||
|
{ N_E, 1000 }, |
||||||
|
{ 0, 50 }, |
||||||
|
{ N_G, 1500 }, |
||||||
|
{ 0, 50 }, |
||||||
|
}; |
||||||
|
|
||||||
|
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) |
||||||
|
{ |
||||||
|
// MACRODOWN only works in this function
|
||||||
|
switch(id) { |
||||||
|
case 0: |
||||||
|
if (record->event.pressed) { |
||||||
|
register_code(KC_RSFT); |
||||||
|
#ifdef BACKLIGHT_ENABLE |
||||||
|
backlight_step(); |
||||||
|
#endif |
||||||
|
} else { |
||||||
|
unregister_code(KC_RSFT); |
||||||
|
} |
||||||
|
break; |
||||||
|
} |
||||||
|
return MACRO_NONE; |
||||||
|
}; |
||||||
|
|
||||||
|
void matrix_init_user(void) { |
||||||
|
#ifdef AUDIO_ENABLE |
||||||
|
init_notes(); |
||||||
|
play_notes(&start_up, 12, false); |
||||||
|
#endif |
||||||
|
} |
||||||
|
|
||||||
|
void process_action_user(keyrecord_t *record) { |
||||||
|
#ifdef AUDIO_ENABLE |
||||||
|
if (record->event.pressed) { |
||||||
|
float keypress[][2] = { |
||||||
|
{440.0*pow(2.0,(record->event.key.col*7)/12.0), 600} |
||||||
|
}; |
||||||
|
play_notes(&keypress, 1, false); |
||||||
|
} |
||||||
|
#endif |
||||||
|
} |