From 00c3ecc23849efe525fb52fc82c938ce1b521c21 Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Tue, 29 Dec 2015 21:36:17 +0100 Subject: [PATCH 01/21] Initial TypeMatrix keymap: Layer 0 --- .../ergodox_ez/keymaps/keymap_typematrix.c | 188 ++++++++++++++++++ 1 file changed, 188 insertions(+) create mode 100644 keyboard/ergodox_ez/keymaps/keymap_typematrix.c diff --git a/keyboard/ergodox_ez/keymaps/keymap_typematrix.c b/keyboard/ergodox_ez/keymaps/keymap_typematrix.c new file mode 100644 index 0000000000..5b848fb1a6 --- /dev/null +++ b/keyboard/ergodox_ez/keymaps/keymap_typematrix.c @@ -0,0 +1,188 @@ +/* TypeMatrix-2030-like keymap */ +#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 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +/* Keymap 0: Basic layer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | Del | | Del | 6 | 7 | 8 | 9 | 0 | ] | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | Tab | Q | W | E | R | T |Backsp| |Backsp| Y | U | I | O | P | [ | + * |--------+------+------+------+------+------|ace | |ace |------+------+------+------+------+--------| + * | LShift | A | S | D | F | G |------| |------| H | J | K | L |; / L2| '/Shift| + * |--------+------+------+------+------+------|Enter | |Enter |------+------+------+------+------+--------| + * | LShift | Z | X | C | V | B |/Hyper| |/ Meh | N | M | , | . | / | \/Shift| + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * |LCtrl | ~L1 | LGui | Play | App | | Left |Right | - | = |RCtrl | + * `----------------------------------' `----------------------------------' + * ,--------------. ,---------------. + * |Esc/Alt| L1 | | Home |Ctrl/End| + * ,------+-------+------| |------+--------+------. + * |Space | Space | PgUp | | Up | | | + * | / | / |------| |------| RAlt |Space | + * | Alt | Alt | PgDn | | Down | | | + * `---------------------' `----------------------' + */ +// 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_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_DELT, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_BSPC, + KC_LSFT, KC_A, KC_S, KC_D, KC_F, KC_G, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, ALL_T(KC_ENT), + KC_LCTL, KC_FN1, KC_LGUI,KC_MPLY,KC_APP, + + ALT_T(KC_ESC), TG(1), + KC_PGUP, + ALT_T(KC_SPC), ALT_T(KC_SPC), KC_PGDN, + + // right hand + KC_DELT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_RBRC, + KC_BSPC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, + KC_H, KC_J, KC_K, KC_L, LT(MDIA, KC_SCLN),SFT_T(KC_QUOT), + MEH_T(KC_ENT),KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, SFT_T(KC_BSLS), + KC_LEFT,KC_RGHT,KC_MINS,KC_EQL, KC_RCTL, + + KC_HOME, CTL_T(KC_END), + KC_UP, + KC_DOWN, KC_RALT, KC_SPC + ), +/* Keymap 1: Symbol Layer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | ! | @ | { | } | | | | | | Up | 7 | 8 | 9 | * | F12 | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | # | $ | ( | ) | ` |------| |------| Down | 4 | 5 | 6 | + | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | % | ^ | [ | ] | ~ | | | | & | 1 | 2 | 3 | \ | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | | . | 0 | = | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + */ +// SYMBOLS +[SYMB] = KEYMAP( + // left hand + KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS, + 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,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS, + // right hand + KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, + KC_TRNS, KC_UP, KC_7, KC_8, KC_9, KC_ASTR, KC_F12, + 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, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS +), +/* Keymap 2: Media and mouse keys + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | | | MsUp | | | | | | | | | | | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | |MsLeft|MsDown|MsRght| |------| |------| | | | | | Play | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | | | | | | | | | Prev | Next | | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | Lclk | Rclk | |VolUp |VolDn | Mute | | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | |Brwser| + * | | |------| |------| |Back | + * | | | | | | | | + * `--------------------' `--------------------' + */ +// MEDIA AND MOUSE +KEYMAP( + KC_TRNS, 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_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_WBAK +), +}; + +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_TAP_TOGGLE(SYMB) // FN1 - Momentary Layer 1 (Symbols) +}; + +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) { + // TODO: Make this relevant to the ErgoDox EZ. + case 1: + ergodox_right_led_1_on(); + break; + case 2: + ergodox_right_led_2_on(); + break; + default: + // none + break; + } + +}; From 900c1f991df6b30a45a25094c61bcf5ed54119cf Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Tue, 29 Dec 2015 21:36:17 +0100 Subject: [PATCH 02/21] Initial TypeMatrix keymap: Layer 0 --- keyboard/ergodox_ez/keymaps/keymap_typematrix.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/keyboard/ergodox_ez/keymaps/keymap_typematrix.c b/keyboard/ergodox_ez/keymaps/keymap_typematrix.c index 5b848fb1a6..38b8da6352 100644 --- a/keyboard/ergodox_ez/keymaps/keymap_typematrix.c +++ b/keyboard/ergodox_ez/keymaps/keymap_typematrix.c @@ -17,7 +17,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |--------+------+------+------+------+------|ace | |ace |------+------+------+------+------+--------| * | LShift | A | S | D | F | G |------| |------| H | J | K | L |; / L2| '/Shift| * |--------+------+------+------+------+------|Enter | |Enter |------+------+------+------+------+--------| - * | LShift | Z | X | C | V | B |/Hyper| |/ Meh | N | M | , | . | / | \/Shift| + * | LShift | Z | X | C | V | B | | | | N | M | , | . | / | \/Shift| * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' * |LCtrl | ~L1 | LGui | Play | App | | Left |Right | - | = |RCtrl | * `----------------------------------' `----------------------------------' @@ -36,7 +36,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_DELT, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_BSPC, KC_LSFT, KC_A, KC_S, KC_D, KC_F, KC_G, - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, ALL_T(KC_ENT), + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_ENT, KC_LCTL, KC_FN1, KC_LGUI,KC_MPLY,KC_APP, ALT_T(KC_ESC), TG(1), @@ -47,7 +47,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_DELT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_RBRC, KC_BSPC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_H, KC_J, KC_K, KC_L, LT(MDIA, KC_SCLN),SFT_T(KC_QUOT), - MEH_T(KC_ENT),KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, SFT_T(KC_BSLS), + KC_ENT, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, SFT_T(KC_BSLS), KC_LEFT,KC_RGHT,KC_MINS,KC_EQL, KC_RCTL, KC_HOME, CTL_T(KC_END), From ac94577cbe03b771820a17e94ced640d78c06dfc Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Wed, 30 Dec 2015 00:51:12 +0100 Subject: [PATCH 03/21] TypeMatrix keymap: Layer 1 (Fn Layer) --- .../ergodox_ez/keymaps/keymap_typematrix.c | 47 +++++++++++-------- 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/keyboard/ergodox_ez/keymaps/keymap_typematrix.c b/keyboard/ergodox_ez/keymaps/keymap_typematrix.c index 38b8da6352..01ae6bbcae 100644 --- a/keyboard/ergodox_ez/keymaps/keymap_typematrix.c +++ b/keyboard/ergodox_ez/keymaps/keymap_typematrix.c @@ -57,42 +57,44 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Keymap 1: Symbol Layer * * ,--------------------------------------------------. ,--------------------------------------------------. - * | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 | + * | | F1 | F2 | F3 | F4 | F5 |Insert| |Insert| F6 | F7 | Tab | / | * | - | * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| - * | | ! | @ | { | } | | | | | | Up | 7 | 8 | 9 | * | F12 | + * | | F8 | F9 | F10 | F11 | F12 |VolUp | | Home | Up | End | 7 | 8 | 9 | + | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | # | $ | ( | ) | ` |------| |------| Down | 4 | 5 | 6 | + | | - * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | % | ^ | [ | ] | ~ | | | | & | 1 | 2 | 3 | \ | | + * | | | | | | |------| |------| Down | Right| 4 | 5 | 6 | + | + * |--------+------+------+------+------+------|VolDn | | Left |------+------+------+------+------+--------| + * | | | cut | copy |paste | Mute | | | | | Prev | 1 | 2 | 3 |KpEnter | * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' - * | | | | | | | | . | 0 | = | | - * `----------------------------------' `----------------------------------' + * | | | | | | | Next | 0 | 00 | . |KpEnter| + * `----------------------------------' `-----------------------------------' * ,-------------. ,-------------. - * | | | | | | + * | | | |n.lock|c.lock| * ,------|------|------| |------+------+------. * | | | | | | | | - * | | |------| |------| | | + * | Mute | |------| |------| | | * | | | | | | | | * `--------------------' `--------------------' */ // SYMBOLS [SYMB] = KEYMAP( // left hand - KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS, - 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,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_INS, + KC_TRNS,KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_VOLU, + KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS,KC_TRNS,LSFT(KC_DELT),LCTL(KC_INS),LSFT(KC_INS),KC_MUTE,KC_VOLD, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS, KC_TRNS, - KC_TRNS,KC_TRNS,KC_TRNS, + KC_MUTE,KC_TRNS,KC_TRNS, // right hand - KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, - KC_TRNS, KC_UP, KC_7, KC_8, KC_9, KC_ASTR, KC_F12, - 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, KC_TRNS, - KC_TRNS, KC_TRNS, + KC_INS, KC_F6, KC_F7, KC_TAB, KC_PSLS, KC_PAST, KC_PMNS, + KC_HOME, KC_UP, KC_END, KC_P7, KC_P8, KC_P9, KC_PPLS, + KC_DOWN, KC_RGHT, KC_P4, KC_P5, KC_P6, KC_PPLS, + KC_LEFT, KC_TRNS, KC_MPRV, KC_P1, KC_P2, KC_P3, KC_PENT, + KC_MNXT, KC_P0, M(1), KC_PDOT, KC_PENT, + + KC_NLCK, KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ), @@ -154,6 +156,11 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) unregister_code(KC_RSFT); } break; + case 1: + if (record->event.pressed) { + return MACRO( I(25), T(P0), T(P0), END ); + } + break; } return MACRO_NONE; }; From 8677ec0c9fbf0d0bb639ad082e27d6650b3c1dd0 Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Wed, 30 Dec 2015 00:56:02 +0100 Subject: [PATCH 04/21] Use 3rd led as caps-lock indicator --- keyboard/ergodox_ez/keymaps/keymap_typematrix.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/keyboard/ergodox_ez/keymaps/keymap_typematrix.c b/keyboard/ergodox_ez/keymaps/keymap_typematrix.c index 01ae6bbcae..1b201c2237 100644 --- a/keyboard/ergodox_ez/keymaps/keymap_typematrix.c +++ b/keyboard/ergodox_ez/keymaps/keymap_typematrix.c @@ -2,6 +2,7 @@ #include "ergodox_ez.h" #include "debug.h" #include "action_layer.h" +#include "led.h" #define BASE 0 // default layer #define SYMB 1 // symbols @@ -191,5 +192,7 @@ void * matrix_scan_user(void) { // none break; } - + if (host_keyboard_leds() & (1< Date: Wed, 30 Dec 2015 12:59:33 +0100 Subject: [PATCH 05/21] Make bottom row more similar to the TM - keep home/end at the same location - RAlt as first key on the bottom right row - left/right arrows moved on the thumb, near the other arrows - added Alt on App - added Alt on Mute in Layer 1 - removed ALT from left spaces to avoid issues when pressing too slowly --- .../ergodox_ez/keymaps/keymap_typematrix.c | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/keyboard/ergodox_ez/keymaps/keymap_typematrix.c b/keyboard/ergodox_ez/keymaps/keymap_typematrix.c index 1b201c2237..fd7c020bfe 100644 --- a/keyboard/ergodox_ez/keymaps/keymap_typematrix.c +++ b/keyboard/ergodox_ez/keymaps/keymap_typematrix.c @@ -20,15 +20,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |--------+------+------+------+------+------|Enter | |Enter |------+------+------+------+------+--------| * | LShift | Z | X | C | V | B | | | | N | M | , | . | / | \/Shift| * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' - * |LCtrl | ~L1 | LGui | Play | App | | Left |Right | - | = |RCtrl | - * `----------------------------------' `----------------------------------' - * ,--------------. ,---------------. - * |Esc/Alt| L1 | | Home |Ctrl/End| - * ,------+-------+------| |------+--------+------. - * |Space | Space | PgUp | | Up | | | - * | / | / |------| |------| RAlt |Space | - * | Alt | Alt | PgDn | | Down | | | - * `---------------------' `----------------------' + * |LCtrl | ~L1 | LGui | Play |App/Alt| | RAlt | - | Home | = |End/Ctl| + * `-----------------------------------' `-----------------------------------' + * ,--------------. ,-------------. + * |Esc/Alt| L1 | | Left |Right | + * ,------+-------+------| |------+------+------. + * | | | PgUp | | Up | | | + * |Space | Space |------| |------|Space |Space | + * | | | PgDn | | Down | | | + * `---------------------' `--------------------' */ // If it accepts an argument (i.e, is a function), it doesn't need KC_. // Otherwise, it needs KC_* @@ -38,22 +38,22 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_BSPC, KC_LSFT, KC_A, KC_S, KC_D, KC_F, KC_G, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_ENT, - KC_LCTL, KC_FN1, KC_LGUI,KC_MPLY,KC_APP, + KC_LCTL, KC_FN1, KC_LGUI,KC_MPLY,ALT_T(KC_APP), ALT_T(KC_ESC), TG(1), KC_PGUP, - ALT_T(KC_SPC), ALT_T(KC_SPC), KC_PGDN, + KC_SPC, KC_SPC, KC_PGDN, // right hand KC_DELT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_RBRC, KC_BSPC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_H, KC_J, KC_K, KC_L, LT(MDIA, KC_SCLN),SFT_T(KC_QUOT), KC_ENT, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, SFT_T(KC_BSLS), - KC_LEFT,KC_RGHT,KC_MINS,KC_EQL, KC_RCTL, + KC_RALT,KC_MINS,KC_HOME,KC_EQL, CTL_T(KC_END), - KC_HOME, CTL_T(KC_END), + KC_LEFT, KC_RGHT, KC_UP, - KC_DOWN, KC_RALT, KC_SPC + KC_DOWN, KC_SPC, KC_SPC ), /* Keymap 1: Symbol Layer * @@ -71,9 +71,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * ,-------------. ,-------------. * | | | |n.lock|c.lock| * ,------|------|------| |------+------+------. - * | | | | | | | | - * | Mute | |------| |------| | | - * | | | | | | | | + * | Mute | | | | | | | + * | / | |------| |------| | | + * | Alt | | | | | | | * `--------------------' `--------------------' */ // SYMBOLS @@ -87,7 +87,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS,KC_TRNS, KC_TRNS, - KC_MUTE,KC_TRNS,KC_TRNS, + ALT_T(KC_MUTE),KC_TRNS,KC_TRNS, // right hand KC_INS, KC_F6, KC_F7, KC_TAB, KC_PSLS, KC_PAST, KC_PMNS, KC_HOME, KC_UP, KC_END, KC_P7, KC_P8, KC_P9, KC_PPLS, From 56070d424b9dd90f8153b2fa1cb03c896bf5ee68 Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Wed, 30 Dec 2015 13:26:31 +0100 Subject: [PATCH 06/21] Added description of the layout and main differences with real TM --- .../ergodox_ez/keymaps/keymap_typematrix.c | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/keyboard/ergodox_ez/keymaps/keymap_typematrix.c b/keyboard/ergodox_ez/keymaps/keymap_typematrix.c index fd7c020bfe..de864ddfef 100644 --- a/keyboard/ergodox_ez/keymaps/keymap_typematrix.c +++ b/keyboard/ergodox_ez/keymaps/keymap_typematrix.c @@ -1,4 +1,24 @@ -/* TypeMatrix-2030-like keymap */ +/* TypeMatrix-2030-like keymap + * --------------------------- + * Currently supported features: + * Layer 0: default layer close to the TM with the following differences: + * - top row and rightmost column are removed, corresponding keys are displaced, except app-keys which are removed + * - bottom-left keys are reorganized on a single roz as: Ctrl, "Fn", Gui, Play, App/Alt + * - "shuffle" and "desktop" are not supported + * - right-shift is moved on ' and \ + * - right-ctrl is moved on End + * - ] is moved in place of the dash (-) + * - dash (-) and = are moved on bottom right row + * - arrows and PgUp/PgDn are moved on the thumbs + * Layer 1: "Fn"-layer close to the TM with the following differences: + * - provides access to F1-F12 + * - VolUp & VolDn are only on left hand + * - arrows & numpad are displaced by 1 to the top left + * Layer 2: TODO -- currently kept as in the default ErgoDox EZ layout + * Leds: + * - left (1st) & middle (2nd) leds are used to indicate layers 1 & 2 respectively + * - right (3rd) led is used to indicate caps-lock + */ #include "ergodox_ez.h" #include "debug.h" #include "action_layer.h" From 38a0e62a10fcbb4b96f8f69d4fc69872d2d3a7ed Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Sat, 9 Jan 2016 00:55:54 +0100 Subject: [PATCH 07/21] Layer 1: restore backspace, ralt and ctl on right hand - home replaced by KC_TRNS to make backspace available - prev/next moved left to space to restore ralt - arrows moved down to have reversed T-shape - added ctl on bottom right KpEnter, to match layer 0 - removed alt from mute, as it was already no more in layer 0 --- .../ergodox_ez/keymaps/keymap_typematrix.c | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/keyboard/ergodox_ez/keymaps/keymap_typematrix.c b/keyboard/ergodox_ez/keymaps/keymap_typematrix.c index de864ddfef..8e442e3cc2 100644 --- a/keyboard/ergodox_ez/keymaps/keymap_typematrix.c +++ b/keyboard/ergodox_ez/keymaps/keymap_typematrix.c @@ -80,20 +80,20 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * ,--------------------------------------------------. ,--------------------------------------------------. * | | F1 | F2 | F3 | F4 | F5 |Insert| |Insert| F6 | F7 | Tab | / | * | - | * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| - * | | F8 | F9 | F10 | F11 | F12 |VolUp | | Home | Up | End | 7 | 8 | 9 | + | + * | | F8 | F9 | F10 | F11 | F12 |VolUp | | | | Home | 7 | 8 | 9 | + | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | | | | | |------| |------| Down | Right| 4 | 5 | 6 | + | - * |--------+------+------+------+------+------|VolDn | | Left |------+------+------+------+------+--------| - * | | | cut | copy |paste | Mute | | | | | Prev | 1 | 2 | 3 |KpEnter | + * | | | | | | |------| |------| Up | End | 4 | 5 | 6 | + | + * |--------+------+------+------+------+------|VolDn | | |------+------+------+------+------+--------| + * | | | cut | copy |paste | Mute | | | Left | Down | Right| 1 | 2 | 3 |KpEnter | * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' - * | | | | | | | Next | 0 | 00 | . |KpEnter| + * | | | | | | | | 0 | 00 | . |Etr/Ctl| * `----------------------------------' `-----------------------------------' * ,-------------. ,-------------. * | | | |n.lock|c.lock| * ,------|------|------| |------+------+------. - * | Mute | | | | | | | - * | / | |------| |------| | | - * | Alt | | | | | | | + * | | | | | Next | | | + * | Mute | |------| |------| | | + * | | | | | Prev | | | * `--------------------' `--------------------' */ // SYMBOLS @@ -107,17 +107,17 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS,KC_TRNS, KC_TRNS, - ALT_T(KC_MUTE),KC_TRNS,KC_TRNS, + KC_MUTE, KC_TRNS,KC_TRNS, // right hand KC_INS, KC_F6, KC_F7, KC_TAB, KC_PSLS, KC_PAST, KC_PMNS, - KC_HOME, KC_UP, KC_END, KC_P7, KC_P8, KC_P9, KC_PPLS, - KC_DOWN, KC_RGHT, KC_P4, KC_P5, KC_P6, KC_PPLS, - KC_LEFT, KC_TRNS, KC_MPRV, KC_P1, KC_P2, KC_P3, KC_PENT, - KC_MNXT, KC_P0, M(1), KC_PDOT, KC_PENT, + KC_TRNS, KC_TRNS, KC_HOME, KC_P7, KC_P8, KC_P9, KC_PPLS, + KC_UP, KC_END, KC_P4, KC_P5, KC_P6, KC_PPLS, + KC_LEFT, KC_DOWN, KC_RGHT, KC_P1, KC_P2, KC_P3, KC_PENT, + KC_TRNS, KC_P0, M(1), KC_PDOT, CTL_T(KC_PENT), KC_NLCK, KC_CAPS, - KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS + KC_MPRV, + KC_MNXT, KC_TRNS, KC_TRNS ), /* Keymap 2: Media and mouse keys * From bfda6ee41773355c413904b128b317ee7eb45569 Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Sat, 9 Jan 2016 17:47:26 +0100 Subject: [PATCH 08/21] Split fn layer from numbers layer to better match the TM behaviour - removed access to layer 2 from ";" key - "fn" key toggles both layers 1 & 2 - replaced media and mouse layer by fn layer - renamed symbol layer to numbers layer - moved all F-keys together on left hand --- .../ergodox_ez/keymaps/keymap_typematrix.c | 156 +++++++++--------- 1 file changed, 78 insertions(+), 78 deletions(-) diff --git a/keyboard/ergodox_ez/keymaps/keymap_typematrix.c b/keyboard/ergodox_ez/keymaps/keymap_typematrix.c index 8e442e3cc2..5bd2f9d725 100644 --- a/keyboard/ergodox_ez/keymaps/keymap_typematrix.c +++ b/keyboard/ergodox_ez/keymaps/keymap_typematrix.c @@ -10,11 +10,12 @@ * - ] is moved in place of the dash (-) * - dash (-) and = are moved on bottom right row * - arrows and PgUp/PgDn are moved on the thumbs - * Layer 1: "Fn"-layer close to the TM with the following differences: - * - provides access to F1-F12 - * - VolUp & VolDn are only on left hand - * - arrows & numpad are displaced by 1 to the top left - * Layer 2: TODO -- currently kept as in the default ErgoDox EZ layout + * Layer 1: numbers layer close to the TM when toggling "num" with the following differences: + * - numpad is displaced by 1 to the top left + * - arrows are displaced by 1 to the left + * - provides access to F1-F12, caps lock and num lock + * Layer 2: "fn" layer ("fn" key toggles both layers 1 & 2) with the following differences: + * - VolUp & VolDn are only on left hand to keep access to arrows on right hand * Leds: * - left (1st) & middle (2nd) leds are used to indicate layers 1 & 2 respectively * - right (3rd) led is used to indicate caps-lock @@ -25,8 +26,8 @@ #include "led.h" #define BASE 0 // default layer -#define SYMB 1 // symbols -#define MDIA 2 // media keys +#define NMBR 1 // numbers layer +#define FNLR 2 // fn layer const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Keymap 0: Basic layer @@ -36,11 +37,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| * | Tab | Q | W | E | R | T |Backsp| |Backsp| Y | U | I | O | P | [ | * |--------+------+------+------+------+------|ace | |ace |------+------+------+------+------+--------| - * | LShift | A | S | D | F | G |------| |------| H | J | K | L |; / L2| '/Shift| + * | LShift | A | S | D | F | G |------| |------| H | J | K | L | ; | '/Shift| * |--------+------+------+------+------+------|Enter | |Enter |------+------+------+------+------+--------| * | LShift | Z | X | C | V | B | | | | N | M | , | . | / | \/Shift| * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' - * |LCtrl | ~L1 | LGui | Play |App/Alt| | RAlt | - | Home | = |End/Ctl| + * |LCtrl | fn | LGui | Play |App/Alt| | RAlt | - | Home | = |End/Ctl| * `-----------------------------------' `-----------------------------------' * ,--------------. ,-------------. * |Esc/Alt| L1 | | Left |Right | @@ -58,56 +59,56 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_BSPC, KC_LSFT, KC_A, KC_S, KC_D, KC_F, KC_G, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_ENT, - KC_LCTL, KC_FN1, KC_LGUI,KC_MPLY,ALT_T(KC_APP), + KC_LCTL, M(2), KC_LGUI,KC_MPLY,ALT_T(KC_APP), ALT_T(KC_ESC), TG(1), KC_PGUP, KC_SPC, KC_SPC, KC_PGDN, // right hand - KC_DELT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_RBRC, - KC_BSPC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, - KC_H, KC_J, KC_K, KC_L, LT(MDIA, KC_SCLN),SFT_T(KC_QUOT), - KC_ENT, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, SFT_T(KC_BSLS), - KC_RALT,KC_MINS,KC_HOME,KC_EQL, CTL_T(KC_END), + KC_DELT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_RBRC, + KC_BSPC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, + KC_H, KC_J, KC_K, KC_L, KC_SCLN, SFT_T(KC_QUOT), + KC_ENT, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_T(KC_BSLS), + KC_RALT, KC_MINS, KC_HOME, KC_EQL, CTL_T(KC_END), KC_LEFT, KC_RGHT, KC_UP, KC_DOWN, KC_SPC, KC_SPC ), -/* Keymap 1: Symbol Layer +/* Keymap 1: Numbers Layer * * ,--------------------------------------------------. ,--------------------------------------------------. - * | | F1 | F2 | F3 | F4 | F5 |Insert| |Insert| F6 | F7 | Tab | / | * | - | + * | | F1 | F2 | F3 | F4 | F5 | | | | | | Tab | / | * | - | * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| - * | | F8 | F9 | F10 | F11 | F12 |VolUp | | | | Home | 7 | 8 | 9 | + | + * | | F6 | F7 | F8 | F9 | F10 | | | | | Home | 7 | 8 | 9 | + | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | | | | | |------| |------| Up | End | 4 | 5 | 6 | + | - * |--------+------+------+------+------+------|VolDn | | |------+------+------+------+------+--------| - * | | | cut | copy |paste | Mute | | | Left | Down | Right| 1 | 2 | 3 |KpEnter | + * | | F11 | F12 | | | |------| |------| Up | End | 4 | 5 | 6 | + | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | | | | | | Left | Down | Right| 1 | 2 | 3 |KpEnter | * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' * | | | | | | | | 0 | 00 | . |Etr/Ctl| * `----------------------------------' `-----------------------------------' * ,-------------. ,-------------. * | | | |n.lock|c.lock| * ,------|------|------| |------+------+------. - * | | | | | Next | | | - * | Mute | |------| |------| | | - * | | | | | Prev | | | + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | * `--------------------' `--------------------' */ // SYMBOLS -[SYMB] = KEYMAP( +[NMBR] = KEYMAP( // left hand - KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_INS, - KC_TRNS,KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_VOLU, - KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS,KC_TRNS,LSFT(KC_DELT),LCTL(KC_INS),LSFT(KC_INS),KC_MUTE,KC_VOLD, - KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS, + KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_TRNS, + KC_TRNS, KC_F11, KC_F12, 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_MUTE, KC_TRNS,KC_TRNS, + KC_TRNS, KC_TRNS,KC_TRNS, // right hand KC_INS, KC_F6, KC_F7, KC_TAB, KC_PSLS, KC_PAST, KC_PMNS, KC_TRNS, KC_TRNS, KC_HOME, KC_P7, KC_P8, KC_P9, KC_PPLS, @@ -116,73 +117,77 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, KC_P0, M(1), KC_PDOT, CTL_T(KC_PENT), KC_NLCK, KC_CAPS, - KC_MPRV, - KC_MNXT, KC_TRNS, KC_TRNS + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS ), -/* Keymap 2: Media and mouse keys +/* Keymap 2: fn layer * * ,--------------------------------------------------. ,--------------------------------------------------. - * | | | | | | | | | | | | | | | | + * | | | | | | |Insert| |Insert| | | | | | | * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| - * | | | | MsUp | | | | | | | | | | | | + * | | | | | | |VolUp | | | | | | | | | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | |MsLeft|MsDown|MsRght| |------| |------| | | | | | Play | + * | | | | | | |------| |------| | | | | | | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | | | | | | | | | | | Prev | Next | | | + * | | | cut | copy |paste | Mute |VolDn | | | | | | | | | * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' - * | | | | Lclk | Rclk | |VolUp |VolDn | Mute | | | + * | | | | | | | | | | | | * `----------------------------------' `----------------------------------' * ,-------------. ,-------------. * | | | | | | * ,------|------|------| |------+------+------. - * | | | | | | |Brwser| - * | | |------| |------| |Back | - * | | | | | | | | + * | | | | | Next | | | + * | Mute | |------| |------| | | + * | | | | | Prev | | | * `--------------------' `--------------------' */ // MEDIA AND MOUSE -KEYMAP( - KC_TRNS, 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, +[FNLR] = KEYMAP( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_INS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLU, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, LSFT(KC_DELT),LCTL(KC_INS),LSFT(KC_INS), KC_MUTE, KC_VOLD, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, + KC_MUTE, KC_TRNS, KC_TRNS, // right hand + KC_INS, 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_MPLY, - KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS, - KC_VOLU, KC_VOLD, KC_MUTE, 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_WBAK + KC_MPRV, + KC_MNXT, KC_TRNS, KC_TRNS ), }; const uint16_t PROGMEM fn_actions[] = { - [1] = ACTION_LAYER_TAP_TOGGLE(SYMB) // FN1 - Momentary Layer 1 (Symbols) }; const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { // MACRODOWN only works in this function - switch(id) { + switch(id) { case 0: - if (record->event.pressed) { - register_code(KC_RSFT); - } else { - unregister_code(KC_RSFT); - } + if (record->event.pressed) { + register_code(KC_RSFT); + } else { + unregister_code(KC_RSFT); + } break; case 1: - if (record->event.pressed) { - return MACRO( I(25), T(P0), T(P0), END ); - } + if (record->event.pressed) { + return MACRO( I(25), T(P0), T(P0), END ); + } break; - } + case 2: + layer_state ^= (1 << NMBR) | (1 << FNLR); + break; + } return MACRO_NONE; }; @@ -194,24 +199,19 @@ 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; - default: - // none - break; + // led 1: numbers layer + if (layer_state & (1 << NMBR)) { + ergodox_right_led_1_on(); } + // led 2: fn layer + if (layer_state & (1 << FNLR)) { + ergodox_right_led_2_on(); + } + // led 3: caps lock if (host_keyboard_leds() & (1< Date: Sun, 10 Jan 2016 19:15:33 +0100 Subject: [PATCH 09/21] Added fn-eject, fn-power .. fn-pause keys Eject does not work though, see jackhumbert/qmk_firmware#82 and tmk/tmk_keyboard#250 --- keyboard/ergodox_ez/keymaps/keymap_typematrix.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/keyboard/ergodox_ez/keymaps/keymap_typematrix.c b/keyboard/ergodox_ez/keymaps/keymap_typematrix.c index 5bd2f9d725..6151b3628d 100644 --- a/keyboard/ergodox_ez/keymaps/keymap_typematrix.c +++ b/keyboard/ergodox_ez/keymaps/keymap_typematrix.c @@ -123,9 +123,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Keymap 2: fn layer * * ,--------------------------------------------------. ,--------------------------------------------------. - * | | | | | | |Insert| |Insert| | | | | | | + * | | | | | | |Insert| |Insert|Eject |Power |Sleep | Wake |PrtScr|ScrollLk| * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| - * | | | | | | |VolUp | | | | | | | | | + * | | | | | | |VolUp | | | | | | | | Pause | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| * | | | | | | |------| |------| | | | | | | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| @@ -153,8 +153,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, KC_MUTE, KC_TRNS, KC_TRNS, // right hand - KC_INS, 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_INS, KC_EJCT, KC_PWR, KC_SLEP, KC_WAKE, KC_PSCR, KC_SLCK, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PAUS, 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, From d3e4cc9af66630906f023cf83f1df46b065435a5 Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Sun, 10 Jan 2016 19:49:08 +0100 Subject: [PATCH 10/21] Implement cut/copy/paste as macros Workaround for jackhumbert/qmk_firmware#81 + added macro names + removed unused macro 0 --- .../ergodox_ez/keymaps/keymap_typematrix.c | 38 +++++++++++++------ 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/keyboard/ergodox_ez/keymaps/keymap_typematrix.c b/keyboard/ergodox_ez/keymaps/keymap_typematrix.c index 6151b3628d..7161a638a8 100644 --- a/keyboard/ergodox_ez/keymaps/keymap_typematrix.c +++ b/keyboard/ergodox_ez/keymaps/keymap_typematrix.c @@ -29,6 +29,12 @@ #define NMBR 1 // numbers layer #define FNLR 2 // fn layer +#define MDBL0 1 +#define MFNLR 2 +#define MCUT 3 +#define MCOPY 4 +#define MPSTE 5 + const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Keymap 0: Basic layer * @@ -59,7 +65,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_BSPC, KC_LSFT, KC_A, KC_S, KC_D, KC_F, KC_G, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_ENT, - KC_LCTL, M(2), KC_LGUI,KC_MPLY,ALT_T(KC_APP), + KC_LCTL, M(MFNLR), KC_LGUI,KC_MPLY,ALT_T(KC_APP), ALT_T(KC_ESC), TG(1), KC_PGUP, @@ -114,7 +120,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, KC_TRNS, KC_HOME, KC_P7, KC_P8, KC_P9, KC_PPLS, KC_UP, KC_END, KC_P4, KC_P5, KC_P6, KC_PPLS, KC_LEFT, KC_DOWN, KC_RGHT, KC_P1, KC_P2, KC_P3, KC_PENT, - KC_TRNS, KC_P0, M(1), KC_PDOT, CTL_T(KC_PENT), + KC_TRNS, KC_P0, M(MDBL0),KC_PDOT, CTL_T(KC_PENT), KC_NLCK, KC_CAPS, KC_TRNS, @@ -146,7 +152,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_INS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, LSFT(KC_DELT),LCTL(KC_INS),LSFT(KC_INS), KC_MUTE, KC_VOLD, + KC_TRNS, KC_TRNS, M(MCUT), M(MCOPY), M(MPSTE), KC_MUTE, KC_VOLD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, @@ -172,21 +178,29 @@ 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; - case 1: + case MDBL0: if (record->event.pressed) { return MACRO( I(25), T(P0), T(P0), END ); } break; - case 2: + case MFNLR: layer_state ^= (1 << NMBR) | (1 << FNLR); break; + case MCUT: + if (record->event.pressed) { + return MACRO(D(LSFT), T(DELT), U(LSFT), END); + } + break; + case MCOPY: + if (record->event.pressed) { + return MACRO(D(LCTL), T(INS), U(LCTL), END); + } + break; + case MPSTE: + if (record->event.pressed) { + return MACRO(D(LSFT), T(INS), U(LSFT), END); + } + break; } return MACRO_NONE; }; From 93e350caa1f5ce704741a18e6e3106787b574406 Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Sat, 16 Jan 2016 00:38:13 +0100 Subject: [PATCH 11/21] Added shifts on the thumbs --- keyboard/ergodox_ez/keymaps/keymap_typematrix.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/keyboard/ergodox_ez/keymaps/keymap_typematrix.c b/keyboard/ergodox_ez/keymaps/keymap_typematrix.c index 7161a638a8..04d91b45bf 100644 --- a/keyboard/ergodox_ez/keymaps/keymap_typematrix.c +++ b/keyboard/ergodox_ez/keymaps/keymap_typematrix.c @@ -53,7 +53,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |Esc/Alt| L1 | | Left |Right | * ,------+-------+------| |------+------+------. * | | | PgUp | | Up | | | - * |Space | Space |------| |------|Space |Space | + * |Space |LShift |------| |------|RShift|Space | * | | | PgDn | | Down | | | * `---------------------' `--------------------' */ @@ -69,7 +69,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ALT_T(KC_ESC), TG(1), KC_PGUP, - KC_SPC, KC_SPC, KC_PGDN, + KC_SPC, KC_LSFT, KC_PGDN, // right hand KC_DELT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_RBRC, @@ -80,7 +80,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LEFT, KC_RGHT, KC_UP, - KC_DOWN, KC_SPC, KC_SPC + KC_DOWN, KC_RSFT, KC_SPC ), /* Keymap 1: Numbers Layer * From fb181304083b884c60a30f64a634b592479aed6d Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Sat, 16 Jan 2016 01:35:28 +0100 Subject: [PATCH 12/21] Implemented Dvorak layer --- .../ergodox_ez/keymaps/keymap_typematrix.c | 76 +++++++++++++++---- 1 file changed, 63 insertions(+), 13 deletions(-) diff --git a/keyboard/ergodox_ez/keymaps/keymap_typematrix.c b/keyboard/ergodox_ez/keymaps/keymap_typematrix.c index 04d91b45bf..931170c387 100644 --- a/keyboard/ergodox_ez/keymaps/keymap_typematrix.c +++ b/keyboard/ergodox_ez/keymaps/keymap_typematrix.c @@ -10,14 +10,17 @@ * - ] is moved in place of the dash (-) * - dash (-) and = are moved on bottom right row * - arrows and PgUp/PgDn are moved on the thumbs - * Layer 1: numbers layer close to the TM when toggling "num" with the following differences: + * Layer 1: same as Layer 0 but with Dvorak layout, to use with QWERTY OS layout. + * Enable Dvorak layout with Magic-1 (LShift-RShift-1), disable with Magic-0. + * Layer 8: numbers layer close to the TM when toggling "num" with the following differences: * - numpad is displaced by 1 to the top left * - arrows are displaced by 1 to the left * - provides access to F1-F12, caps lock and num lock - * Layer 2: "fn" layer ("fn" key toggles both layers 1 & 2) with the following differences: + * Layer 9: "fn" layer ("fn" key toggles both layers 1 & 2) with the following differences: * - VolUp & VolDn are only on left hand to keep access to arrows on right hand - * Leds: - * - left (1st) & middle (2nd) leds are used to indicate layers 1 & 2 respectively + * LEDs: + * - left (1st) led is used to indicate the numbers layer + * - middle (2nd) led is used to indicate Dvorak layout * - right (3rd) led is used to indicate caps-lock */ #include "ergodox_ez.h" @@ -26,8 +29,9 @@ #include "led.h" #define BASE 0 // default layer -#define NMBR 1 // numbers layer -#define FNLR 2 // fn layer +#define DVRK 1 // Dvorak layer +#define NMBR 8 // numbers layer +#define FNLR 9 // fn layer #define MDBL0 1 #define MFNLR 2 @@ -36,7 +40,7 @@ #define MPSTE 5 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -/* Keymap 0: Basic layer +/* Basic layer * * ,--------------------------------------------------. ,--------------------------------------------------. * | ` | 1 | 2 | 3 | 4 | 5 | Del | | Del | 6 | 7 | 8 | 9 | 0 | ] | @@ -50,7 +54,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |LCtrl | fn | LGui | Play |App/Alt| | RAlt | - | Home | = |End/Ctl| * `-----------------------------------' `-----------------------------------' * ,--------------. ,-------------. - * |Esc/Alt| L1 | | Left |Right | + * |Esc/Alt| num | | Left |Right | * ,------+-------+------| |------+------+------. * | | | PgUp | | Up | | | * |Space |LShift |------| |------|RShift|Space | @@ -67,7 +71,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_ENT, KC_LCTL, M(MFNLR), KC_LGUI,KC_MPLY,ALT_T(KC_APP), - ALT_T(KC_ESC), TG(1), + ALT_T(KC_ESC), TG(NMBR), KC_PGUP, KC_SPC, KC_LSFT, KC_PGDN, @@ -82,7 +86,53 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_UP, KC_DOWN, KC_RSFT, KC_SPC ), -/* Keymap 1: Numbers Layer +/* Dvorak layer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | Del | | Del | 6 | 7 | 8 | 9 | 0 | = | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | Tab | ' | , | . | P | Y |Backsp| |Backsp| F | G | C | R | L | / | + * |--------+------+------+------+------+------|ace | |ace |------+------+------+------+------+--------| + * | LShift | A | O | E | U | I |------| |------| D | H | T | N | S | -/Shift| + * |--------+------+------+------+------+------|Enter | |Enter |------+------+------+------+------+--------| + * | LShift | ; | Q | J | K | X | | | | B | M | W | V | Z | \/Shift| + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * |LCtrl | fn | LGui | Play |App/Alt| | RAlt | [ | Home | ] |End/Ctl| + * `-----------------------------------' `-----------------------------------' + * ,--------------. ,-------------. + * |Esc/Alt| num | | Left |Right | + * ,------+-------+------| |------+------+------. + * | | | PgUp | | Up | | | + * |Space |LShift |------| |------|RShift|Space | + * | | | PgDn | | Down | | | + * `---------------------' `--------------------' + */ +// If it accepts an argument (i.e, is a function), it doesn't need KC_. +// Otherwise, it needs KC_* +[DVRK] = KEYMAP( // layer 0 : default + // left hand + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_DELT, + KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_BSPC, + KC_LSFT, KC_A, KC_O, KC_E, KC_U, KC_I, + KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_ENT, + KC_LCTL, M(MFNLR), KC_LGUI, KC_MPLY, ALT_T(KC_APP), + + ALT_T(KC_ESC), TG(NMBR), + KC_PGUP, + KC_SPC, KC_LSFT, KC_PGDN, + + // right hand + KC_DELT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_EQL, + KC_BSPC, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, + KC_D, KC_H, KC_T, KC_N, KC_S, SFT_T(KC_MINS), + KC_ENT, KC_B, KC_M, KC_W, KC_V, KC_Z, SFT_T(KC_BSLS), + KC_RALT, KC_LBRC, KC_HOME, KC_RBRC, CTL_T(KC_END), + + KC_LEFT, KC_RGHT, + KC_UP, + KC_DOWN, KC_RSFT, KC_SPC + ), +/* Numbers Layer * * ,--------------------------------------------------. ,--------------------------------------------------. * | | F1 | F2 | F3 | F4 | F5 | | | | | | Tab | / | * | - | @@ -126,7 +176,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ), -/* Keymap 2: fn layer +/* fn layer * * ,--------------------------------------------------. ,--------------------------------------------------. * | | | | | | |Insert| |Insert|Eject |Power |Sleep | Wake |PrtScr|ScrollLk| @@ -221,8 +271,8 @@ void * matrix_scan_user(void) { if (layer_state & (1 << NMBR)) { ergodox_right_led_1_on(); } - // led 2: fn layer - if (layer_state & (1 << FNLR)) { + // led 2: Dvorak layer + if (default_layer_state == 1 << DVRK) { ergodox_right_led_2_on(); } // led 3: caps lock From caf82bcacef6dc5eacfd8c7fccff304bdb38595b Mon Sep 17 00:00:00 2001 From: Evan Pitstick Date: Fri, 22 Jan 2016 07:33:56 -0500 Subject: [PATCH 13/21] Single tap enable ACTION_LAYER_TAP_TOGGLE layer --- keyboard/ergodox_ez/config.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/keyboard/ergodox_ez/config.h b/keyboard/ergodox_ez/config.h index 825997ba05..6a391ffb54 100644 --- a/keyboard/ergodox_ez/config.h +++ b/keyboard/ergodox_ez/config.h @@ -38,6 +38,8 @@ along with this program. If not, see . #define MOUSEKEY_MAX_SPEED 3 #define MOUSEKEY_TIME_TO_MAX 10 +#define TAPPING_TOGGLE 1 + #define COLS (int []){ F1, F0, B0, C7, F4, F5, F6, F7, D4, D6, B4, D7 } #define ROWS (int []){ D0, D5, B5, B6 } From 51fec6647a288862244a50b616255d84564db02d Mon Sep 17 00:00:00 2001 From: Olivier Lechevalier Date: Sat, 23 Jan 2016 14:07:13 +0900 Subject: [PATCH 14/21] Add colemak keymap to Ergodox EZ. --- .../ergodox_ez/keymaps/colemak/colemak.hex | Bin 0 -> 66143 bytes keyboard/ergodox_ez/keymaps/colemak/keymap.c | 184 ++++++++++++++++++ keyboard/ergodox_ez/keymaps/colemak/readme.md | 4 + 3 files changed, 188 insertions(+) create mode 100644 keyboard/ergodox_ez/keymaps/colemak/colemak.hex create mode 100644 keyboard/ergodox_ez/keymaps/colemak/keymap.c create mode 100644 keyboard/ergodox_ez/keymaps/colemak/readme.md diff --git a/keyboard/ergodox_ez/keymaps/colemak/colemak.hex b/keyboard/ergodox_ez/keymaps/colemak/colemak.hex new file mode 100644 index 0000000000000000000000000000000000000000..cd3bf781afa83825f8d1714f819f213197fc831e GIT binary patch literal 66143 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.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) { + // TODO: Make this relevant to the ErgoDox EZ. + case 1: + ergodox_right_led_1_on(); + break; + case 2: + ergodox_right_led_2_on(); + break; + default: + // none + break; + } + +}; diff --git a/keyboard/ergodox_ez/keymaps/colemak/readme.md b/keyboard/ergodox_ez/keymaps/colemak/readme.md new file mode 100644 index 0000000000..e28b2f0856 --- /dev/null +++ b/keyboard/ergodox_ez/keymaps/colemak/readme.md @@ -0,0 +1,4 @@ +# ErgoDox EZ Colemak Configuration + +Colemak layout with same layers as default ergodox ez keymap. + From e5f84058bb6884e0c2d024a1f2e64436395cbd60 Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Sat, 23 Jan 2016 16:59:33 +0100 Subject: [PATCH 15/21] Implemented new folders structure. moved keymap_typematrix.c to tm2030/keymap.c --- .../ergodox_ez/keymaps/{keymap_typematrix.c => tm2030/keymap.c} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename keyboard/ergodox_ez/keymaps/{keymap_typematrix.c => tm2030/keymap.c} (100%) diff --git a/keyboard/ergodox_ez/keymaps/keymap_typematrix.c b/keyboard/ergodox_ez/keymaps/tm2030/keymap.c similarity index 100% rename from keyboard/ergodox_ez/keymaps/keymap_typematrix.c rename to keyboard/ergodox_ez/keymaps/tm2030/keymap.c From 67583b2f4aeceb5cdbfd32055a6c4fc4436effe7 Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Sat, 23 Jan 2016 18:04:45 +0100 Subject: [PATCH 16/21] Renamed "Numbers Layer" to "Numeric Layer" --- keyboard/ergodox_ez/keymaps/tm2030/keymap.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/keyboard/ergodox_ez/keymaps/tm2030/keymap.c b/keyboard/ergodox_ez/keymaps/tm2030/keymap.c index 931170c387..31005b64d0 100644 --- a/keyboard/ergodox_ez/keymaps/tm2030/keymap.c +++ b/keyboard/ergodox_ez/keymaps/tm2030/keymap.c @@ -12,14 +12,14 @@ * - arrows and PgUp/PgDn are moved on the thumbs * Layer 1: same as Layer 0 but with Dvorak layout, to use with QWERTY OS layout. * Enable Dvorak layout with Magic-1 (LShift-RShift-1), disable with Magic-0. - * Layer 8: numbers layer close to the TM when toggling "num" with the following differences: + * Layer 8: numeric layer close to the TM when toggling "num" with the following differences: * - numpad is displaced by 1 to the top left * - arrows are displaced by 1 to the left * - provides access to F1-F12, caps lock and num lock * Layer 9: "fn" layer ("fn" key toggles both layers 1 & 2) with the following differences: * - VolUp & VolDn are only on left hand to keep access to arrows on right hand * LEDs: - * - left (1st) led is used to indicate the numbers layer + * - left (1st) led is used to indicate the numeric layer * - middle (2nd) led is used to indicate Dvorak layout * - right (3rd) led is used to indicate caps-lock */ @@ -30,7 +30,7 @@ #define BASE 0 // default layer #define DVRK 1 // Dvorak layer -#define NMBR 8 // numbers layer +#define NUMR 8 // numeric layer #define FNLR 9 // fn layer #define MDBL0 1 @@ -71,7 +71,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_ENT, KC_LCTL, M(MFNLR), KC_LGUI,KC_MPLY,ALT_T(KC_APP), - ALT_T(KC_ESC), TG(NMBR), + ALT_T(KC_ESC), TG(NUMR), KC_PGUP, KC_SPC, KC_LSFT, KC_PGDN, @@ -117,7 +117,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_ENT, KC_LCTL, M(MFNLR), KC_LGUI, KC_MPLY, ALT_T(KC_APP), - ALT_T(KC_ESC), TG(NMBR), + ALT_T(KC_ESC), TG(NUMR), KC_PGUP, KC_SPC, KC_LSFT, KC_PGDN, @@ -132,7 +132,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_UP, KC_DOWN, KC_RSFT, KC_SPC ), -/* Numbers Layer +/* Numeric Layer * * ,--------------------------------------------------. ,--------------------------------------------------. * | | F1 | F2 | F3 | F4 | F5 | | | | | | Tab | / | * | - | @@ -154,7 +154,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `--------------------' `--------------------' */ // SYMBOLS -[NMBR] = KEYMAP( +[NUMR] = KEYMAP( // left hand KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS, KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_TRNS, @@ -234,7 +234,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) } break; case MFNLR: - layer_state ^= (1 << NMBR) | (1 << FNLR); + layer_state ^= (1 << NUMR) | (1 << FNLR); break; case MCUT: if (record->event.pressed) { @@ -267,8 +267,8 @@ void * matrix_scan_user(void) { ergodox_right_led_1_off(); ergodox_right_led_2_off(); ergodox_right_led_3_off(); - // led 1: numbers layer - if (layer_state & (1 << NMBR)) { + // led 1: numeric layer + if (layer_state & (1 << NUMR)) { ergodox_right_led_1_on(); } // led 2: Dvorak layer From 96b9089d9f4237c2d4e4760181628fc96c4f93b6 Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Sat, 23 Jan 2016 18:15:21 +0100 Subject: [PATCH 17/21] Added Calculator, Mail and Browser Home application keys. --- keyboard/ergodox_ez/keymaps/tm2030/keymap.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/keyboard/ergodox_ez/keymaps/tm2030/keymap.c b/keyboard/ergodox_ez/keymaps/tm2030/keymap.c index 31005b64d0..00d6a4bfa4 100644 --- a/keyboard/ergodox_ez/keymaps/tm2030/keymap.c +++ b/keyboard/ergodox_ez/keymaps/tm2030/keymap.c @@ -2,7 +2,7 @@ * --------------------------- * Currently supported features: * Layer 0: default layer close to the TM with the following differences: - * - top row and rightmost column are removed, corresponding keys are displaced, except app-keys which are removed + * - top row and rightmost column are removed, corresponding keys are displaced * - bottom-left keys are reorganized on a single roz as: Ctrl, "Fn", Gui, Play, App/Alt * - "shuffle" and "desktop" are not supported * - right-shift is moved on ' and \ @@ -183,7 +183,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| * | | | | | | |VolUp | | | | | | | | Pause | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | | | | | |------| |------| | | | | | | + * | | | | Calc | Mail |Browsr|------| |------| | | | | | | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| * | | | cut | copy |paste | Mute |VolDn | | | | | | | | | * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' @@ -201,7 +201,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [FNLR] = KEYMAP( KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_INS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLU, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_CALC, KC_MAIL, KC_WHOM, KC_TRNS, KC_TRNS, M(MCUT), M(MCOPY), M(MPSTE), KC_MUTE, KC_VOLD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, From 294bd256150e381d3eac619a6eab1877eb95728f Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Sat, 23 Jan 2016 18:52:16 +0100 Subject: [PATCH 18/21] Moved layout description to README.md and added more details --- keyboard/ergodox_ez/keymaps/tm2030/README.md | 133 +++++++++++++++++++ keyboard/ergodox_ez/keymaps/tm2030/keymap.c | 26 +--- 2 files changed, 134 insertions(+), 25 deletions(-) create mode 100644 keyboard/ergodox_ez/keymaps/tm2030/README.md diff --git a/keyboard/ergodox_ez/keymaps/tm2030/README.md b/keyboard/ergodox_ez/keymaps/tm2030/README.md new file mode 100644 index 0000000000..55942709be --- /dev/null +++ b/keyboard/ergodox_ez/keymaps/tm2030/README.md @@ -0,0 +1,133 @@ +# TypeMatrix™ 2030 inspired layout + +This is a [TypeMatrix™ 2030](http://typematrix.com/2030/features.php) inspired layout for the ErgoDox EZ. The _TypeMatrix_ is a nice small ergonomic keyboard with a matrix layout, and it provides several nice features like `enter`, `backspace` and `delete` at the center, bigger `shift` keys and international `cut`, `copy` and `paste` keys. + +The idea in this ErgoDox layout is to make it is as close as possible to the TM2030, such that it would be easy to switch between the TM and the ErgoDox. No _fancy_ features have been implemented, as this is intended to be a base for further customization if desired. Some keys have been duplicated in order to accomodate for most people. + +Most of the TM2030 features are supported except +* automatic window switching (alt-tab key, at the left of the space key) +* show desktop key (at the right of the space key) +* 102/106 modes + +Dvorak mode is even supported by pressing [`Magic`](/TMK_README.md#magic-commands)+`1` (`Magic` is by default `LShift`+`RShift`) + +Some keys had to be moved around to fit into the ErgoDox, especially the `F1`-`F12` keys and the arrow keys. + +## Base Layer +This is the default layer, close to the TM with the following differences: +- Top row (with the `F`-keys) and rightmost column (with application shortcuts) are removed, the corresponding keys are displaced elsewhere. +- Bottom-left keys are reorganized on a single row as: `Ctrl`, `fn`, `Gui`, `Play`, `App`/`Alt`. +- `shuffle` and `desktop` are not supported. +- `right-shift` is moved on `'`, `\` and on the right thumb (the latter is actually the only _true_ `right-shift`, and must be used in the `Magic` key combination). +- `right-ctrl` is moved on `End`. +- `]` is moved in place of the dash (`-`). +- Dash (`-`) and `=` are moved on bottom right row. +- Arrows and `PgUp`/`PgDn` are moved on the thumbs. + + ,--------------------------------------------------. ,--------------------------------------------------. + | ` | 1 | 2 | 3 | 4 | 5 | Del | | Del | 6 | 7 | 8 | 9 | 0 | ] | + |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + | Tab | Q | W | E | R | T |Backsp| |Backsp| Y | U | I | O | P | [ | + |--------+------+------+------+------+------|ace | |ace |------+------+------+------+------+--------| + | LShift | A | S | D | F | G |------| |------| H | J | K | L | ; | '/Shift| + |--------+------+------+------+------+------|Enter | |Enter |------+------+------+------+------+--------| + | LShift | Z | X | C | V | B | | | | N | M | , | . | / | \/Shift| + `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + |LCtrl | fn | LGui | Play |App/Alt| | RAlt | - | Home | = |End/Ctl| + `-----------------------------------' `-----------------------------------' + ,--------------. ,-------------. + |Esc/Alt| num | | Left |Right | + ,------+-------+------| |------+------+------. + | | | PgUp | | Up | | | + |Space |LShift |------| |------|RShift|Space | + | | | PgDn | | Down | | | + `---------------------' `--------------------' + + +### Layer Switching +- Use `num` to toggle the Numeric Layer. +- Hold `fn` to temporarily activate the Numeric & Fn Layers +As on the original TM 2030, when `num` layer is activated, holding `fn` disables it but enables the other `fn` keys. + +## Dvorak Layer +Same as Layer 0 but with _Dvorak_ layout, to use with QWERTY OS layout. + +Enable Dvorak layout with [`Magic`](/TMK_README.md#magic-commands+`1` (`LShift`+`RShift`+`1`), disable with `Magic`-`0`. + +The middle (green) led indicates when the Dvorak layer is activated. + + ,--------------------------------------------------. ,--------------------------------------------------. + | ` | 1 | 2 | 3 | 4 | 5 | Del | | Del | 6 | 7 | 8 | 9 | 0 | = | + |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + | Tab | ' | , | . | P | Y |Backsp| |Backsp| F | G | C | R | L | / | + |--------+------+------+------+------+------|ace | |ace |------+------+------+------+------+--------| + | LShift | A | O | E | U | I |------| |------| D | H | T | N | S | -/Shift| + |--------+------+------+------+------+------|Enter | |Enter |------+------+------+------+------+--------| + | LShift | ; | Q | J | K | X | | | | B | M | W | V | Z | \/Shift| + `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + |LCtrl | fn | LGui | Play |App/Alt| | RAlt | [ | Home | ] |End/Ctl| + `-----------------------------------' `-----------------------------------' + ,--------------. ,-------------. + |Esc/Alt| num | | Left |Right | + ,------+-------+------| |------+------+------. + | | | PgUp | | Up | | | + |Space |LShift |------| |------|RShift|Space | + | | | PgDn | | Down | | | + `---------------------' `--------------------' + +## Numeric Layer +Numeric layer close to the TM when toggling `num`, with the following differences: + +- Numpad is displaced by 1 to the top left. +- Arrows are displaced by 1 to the left. +- Provides access to `F1`-`F12`, `caps-lock` and `num-lock`. + +The numeric layer is indicated with the left (red) led. Caps-lock is indicated with the right (blue) led. + + ,--------------------------------------------------. ,--------------------------------------------------. + | | F1 | F2 | F3 | F4 | F5 | | | | | | Tab | / | * | - | + |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + | | F6 | F7 | F8 | F9 | F10 | | | | | Home | 7 | 8 | 9 | + | + |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + | | F11 | F12 | | | |------| |------| Up | End | 4 | 5 | 6 | + | + |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + | | | | | | | | | Left | Down | Right| 1 | 2 | 3 |KpEnter | + `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + | | | | | | | | 0 | 00 | . |Etr/Ctl| + `----------------------------------' `-----------------------------------' + ,-------------. ,-------------. + | | | |n.lock|c.lock| + ,------|------|------| |------+------+------. + | | | | | | | | + | | |------| |------| | | + | | | | | | | | + `--------------------' `--------------------' + +## Fn Layer +Activated simultaneously with the Numeric layer when holding the `fn` key. As on the TM, it provides access to the following features: +- `cut`, `copy` and `paste` +- `volume up`, `volume down` and `mute` — as opposed to the TM, these are only on left hand +- `previous track` and `next track` +- `calculator`, `mail` and `browser home` +- `insert`, `power`, `sleep`, `wake`, `print screen`, `scroll-lock` and `pause` + +Note: the `eject` key does not work due to jackhumbert/qmk_firmware#82 + + ,--------------------------------------------------. ,--------------------------------------------------. + | | | | | | |Insert| |Insert|Eject |Power |Sleep | Wake |PrtScr|ScrollLk| + |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + | | | | | | |VolUp | | | | | | | | Pause | + |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + | | | | | | |------| |------| | | | | | | + |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + | | | cut | copy |paste | Mute |VolDn | | | | | | | | | + `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + | | | | | | | | | | | | + `----------------------------------' `----------------------------------' + ,-------------. ,-------------. + | | | | | | + ,------|------|------| |------+------+------. + | | | | | Next | | | + | Mute | |------| |------| | | + | | | | | Prev | | | + `--------------------' `--------------------' diff --git a/keyboard/ergodox_ez/keymaps/tm2030/keymap.c b/keyboard/ergodox_ez/keymaps/tm2030/keymap.c index 00d6a4bfa4..cbdf0ae00e 100644 --- a/keyboard/ergodox_ez/keymaps/tm2030/keymap.c +++ b/keyboard/ergodox_ez/keymaps/tm2030/keymap.c @@ -1,28 +1,4 @@ -/* TypeMatrix-2030-like keymap - * --------------------------- - * Currently supported features: - * Layer 0: default layer close to the TM with the following differences: - * - top row and rightmost column are removed, corresponding keys are displaced - * - bottom-left keys are reorganized on a single roz as: Ctrl, "Fn", Gui, Play, App/Alt - * - "shuffle" and "desktop" are not supported - * - right-shift is moved on ' and \ - * - right-ctrl is moved on End - * - ] is moved in place of the dash (-) - * - dash (-) and = are moved on bottom right row - * - arrows and PgUp/PgDn are moved on the thumbs - * Layer 1: same as Layer 0 but with Dvorak layout, to use with QWERTY OS layout. - * Enable Dvorak layout with Magic-1 (LShift-RShift-1), disable with Magic-0. - * Layer 8: numeric layer close to the TM when toggling "num" with the following differences: - * - numpad is displaced by 1 to the top left - * - arrows are displaced by 1 to the left - * - provides access to F1-F12, caps lock and num lock - * Layer 9: "fn" layer ("fn" key toggles both layers 1 & 2) with the following differences: - * - VolUp & VolDn are only on left hand to keep access to arrows on right hand - * LEDs: - * - left (1st) led is used to indicate the numeric layer - * - middle (2nd) led is used to indicate Dvorak layout - * - right (3rd) led is used to indicate caps-lock - */ +/* TypeMatrix-2030-like keymap */ #include "ergodox_ez.h" #include "debug.h" #include "action_layer.h" From b0d7d9d922ea5b432fcbb499df0881a2e80d5092 Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Sat, 23 Jan 2016 18:59:06 +0100 Subject: [PATCH 19/21] Added keymap.hex --- keyboard/ergodox_ez/keymaps/tm2030/keymap.hex | Bin 0 -> 69424 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 keyboard/ergodox_ez/keymaps/tm2030/keymap.hex diff --git a/keyboard/ergodox_ez/keymaps/tm2030/keymap.hex b/keyboard/ergodox_ez/keymaps/tm2030/keymap.hex new file mode 100644 index 0000000000000000000000000000000000000000..7e1118e3b216e8c02ed6698c1b2818e98e5811e3 GIT binary patch literal 69424 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 literal 0 HcmV?d00001 From 606d63e602bf5a01912a4c5b9c8536c705bcc777 Mon Sep 17 00:00:00 2001 From: DidierLoiseau Date: Sat, 23 Jan 2016 19:18:37 +0100 Subject: [PATCH 20/21] Fixed small issues in README.md - fixed rendering of the basic layer on GitHub - fixed missing Calculator, Mail & Browser Home keys in Fn Layer --- keyboard/ergodox_ez/keymaps/tm2030/README.md | 56 ++++++++++---------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/keyboard/ergodox_ez/keymaps/tm2030/README.md b/keyboard/ergodox_ez/keymaps/tm2030/README.md index 55942709be..7ea175b443 100644 --- a/keyboard/ergodox_ez/keymaps/tm2030/README.md +++ b/keyboard/ergodox_ez/keymaps/tm2030/README.md @@ -15,34 +15,36 @@ Some keys had to be moved around to fit into the ErgoDox, especially the `F1`-`F ## Base Layer This is the default layer, close to the TM with the following differences: -- Top row (with the `F`-keys) and rightmost column (with application shortcuts) are removed, the corresponding keys are displaced elsewhere. -- Bottom-left keys are reorganized on a single row as: `Ctrl`, `fn`, `Gui`, `Play`, `App`/`Alt`. -- `shuffle` and `desktop` are not supported. -- `right-shift` is moved on `'`, `\` and on the right thumb (the latter is actually the only _true_ `right-shift`, and must be used in the `Magic` key combination). -- `right-ctrl` is moved on `End`. -- `]` is moved in place of the dash (`-`). -- Dash (`-`) and `=` are moved on bottom right row. -- Arrows and `PgUp`/`PgDn` are moved on the thumbs. - ,--------------------------------------------------. ,--------------------------------------------------. - | ` | 1 | 2 | 3 | 4 | 5 | Del | | Del | 6 | 7 | 8 | 9 | 0 | ] | - |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| - | Tab | Q | W | E | R | T |Backsp| |Backsp| Y | U | I | O | P | [ | - |--------+------+------+------+------+------|ace | |ace |------+------+------+------+------+--------| - | LShift | A | S | D | F | G |------| |------| H | J | K | L | ; | '/Shift| - |--------+------+------+------+------+------|Enter | |Enter |------+------+------+------+------+--------| - | LShift | Z | X | C | V | B | | | | N | M | , | . | / | \/Shift| - `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' - |LCtrl | fn | LGui | Play |App/Alt| | RAlt | - | Home | = |End/Ctl| - `-----------------------------------' `-----------------------------------' - ,--------------. ,-------------. - |Esc/Alt| num | | Left |Right | - ,------+-------+------| |------+------+------. - | | | PgUp | | Up | | | - |Space |LShift |------| |------|RShift|Space | - | | | PgDn | | Down | | | - `---------------------' `--------------------' + - Top row (with the `F`-keys) and rightmost column (with application shortcuts) are removed, the corresponding keys are displaced elsewhere. + - Bottom-left keys are reorganized on a single row as: `Ctrl`, `fn`, `Gui`, `Play`, `App`/`Alt`. + - `shuffle` and `desktop` are not supported. + - `right-shift` is moved on `'`, `\` and on the right thumb (the latter is actually the only _true_ `right-shift`, and must be used in the `Magic` key combination). + - `right-ctrl` is moved on `End`. + - `]` is moved in place of the dash (`-`). + - Dash (`-`) and `=` are moved on bottom right row. + - Arrows and `PgUp`/`PgDn` are moved on the thumbs. +``` +,--------------------------------------------------. ,--------------------------------------------------. +| ` | 1 | 2 | 3 | 4 | 5 | Del | | Del | 6 | 7 | 8 | 9 | 0 | ] | +|--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| +| Tab | Q | W | E | R | T |Backsp| |Backsp| Y | U | I | O | P | [ | +|--------+------+------+------+------+------|ace | |ace |------+------+------+------+------+--------| +| LShift | A | S | D | F | G |------| |------| H | J | K | L | ; | '/Shift| +|--------+------+------+------+------+------|Enter | |Enter |------+------+------+------+------+--------| +| LShift | Z | X | C | V | B | | | | N | M | , | . | / | \/Shift| +`--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + |LCtrl | fn | LGui | Play |App/Alt| | RAlt | - | Home | = |End/Ctl| + `-----------------------------------' `-----------------------------------' + ,--------------. ,-------------. + |Esc/Alt| num | | Left |Right | + ,------+-------+------| |------+------+------. + | | | PgUp | | Up | | | + |Space |LShift |------| |------|RShift|Space | + | | | PgDn | | Down | | | + `---------------------' `--------------------' +``` ### Layer Switching - Use `num` to toggle the Numeric Layer. @@ -118,7 +120,7 @@ Note: the `eject` key does not work due to jackhumbert/qmk_firmware#82 |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| | | | | | | |VolUp | | | | | | | | Pause | |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - | | | | | | |------| |------| | | | | | | + | | | | Calc | Mail |Browsr|------| |------| | | | | | | |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| | | | cut | copy |paste | Mute |VolDn | | | | | | | | | `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' From 3e31fa4c50562b0d441262963ac6489351e7035d Mon Sep 17 00:00:00 2001 From: DidierLoiseau Date: Sat, 23 Jan 2016 19:29:14 +0100 Subject: [PATCH 21/21] Fixed rendering of the Layer Switching section --- keyboard/ergodox_ez/keymaps/tm2030/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/keyboard/ergodox_ez/keymaps/tm2030/README.md b/keyboard/ergodox_ez/keymaps/tm2030/README.md index 7ea175b443..096939dc28 100644 --- a/keyboard/ergodox_ez/keymaps/tm2030/README.md +++ b/keyboard/ergodox_ez/keymaps/tm2030/README.md @@ -48,7 +48,8 @@ This is the default layer, close to the TM with the following differences: ### Layer Switching - Use `num` to toggle the Numeric Layer. -- Hold `fn` to temporarily activate the Numeric & Fn Layers +- Hold `fn` to temporarily activate the Numeric & Fn Layers. + As on the original TM 2030, when `num` layer is activated, holding `fn` disables it but enables the other `fn` keys. ## Dvorak Layer