From f044edbed9b542de573a321628ddd6a3afc348b0 Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Sun, 31 Jan 2016 15:30:48 +0100 Subject: [PATCH 01/34] Initial bepo layout based on tm2030 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit No more SFT_T: - moved ] (bépo W) below Tab - moved - (bépo =) in place of ] (top right) - removed SFT_T from ' (bépo M) - moved \ (bépo Ç) in place of = (bépo %) - moved = (bépo %) in place of - (bépo =) --- keyboard/ergodox_ez/keymaps/bepo/keymap.c | 242 ++++++++++++++++++++++ 1 file changed, 242 insertions(+) create mode 100644 keyboard/ergodox_ez/keymaps/bepo/keymap.c diff --git a/keyboard/ergodox_ez/keymaps/bepo/keymap.c b/keyboard/ergodox_ez/keymaps/bepo/keymap.c new file mode 100644 index 00000000..1fe23a93 --- /dev/null +++ b/keyboard/ergodox_ez/keymaps/bepo/keymap.c @@ -0,0 +1,242 @@ +/* TypeMatrix-2030-like keymap */ +#include "ergodox_ez.h" +#include "debug.h" +#include "action_layer.h" +#include "led.h" + +#define BASE 0 // default layer +#define DVRK 1 // Dvorak layer +#define NUMR 8 // numeric layer +#define FNLR 9 // fn layer + +#define MDBL0 1 +#define MFNLR 2 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +/* 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 |------+------+------+------+------+--------| + * | ] | A | S | D | F | G |------| |------| H | J | K | L | ; | ' | + * |--------+------+------+------+------+------|Enter | |Enter |------+------+------+------+------+--------| + * | LShift | Z | X | C | V | B | | | | N | M | , | . | / | RShift | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * |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_* +[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_RBRC, 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(MFNLR), KC_LGUI,KC_MPLY,ALT_T(KC_APP), + + ALT_T(KC_ESC), TG(NUMR), + KC_PGUP, + KC_SPC, KC_LSFT, KC_PGDN, + + // right hand + KC_DELT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, + KC_BSPC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, + KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, + KC_ENT, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + KC_RALT, KC_EQL, KC_HOME, KC_BSLS, CTL_T(KC_END), + + KC_LEFT, KC_RGHT, + KC_UP, + KC_DOWN, KC_RSFT, KC_SPC + ), +/* 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(NUMR), + 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 + ), +/* Numeric Layer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | 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| + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + */ +// SYMBOLS +[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, + 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_TRNS, KC_TRNS,KC_TRNS, + // right hand + KC_TRNS, 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, + 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(MDBL0),KC_PDOT, CTL_T(KC_PENT), + + KC_NLCK, KC_CAPS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS +), +/* fn layer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | | | | | |Insert| |Insert|Eject |Power |Sleep | Wake |PrtScr|ScrollLk| + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | | | | | |VolUp | | | | | | | | Pause | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | Calc | Mail |Browsr|------| |------| | | | | | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | cut | copy |paste | Mute |VolDn | | | | | | | | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | | | | | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | Next | | | + * | Mute | |------| |------| | | + * | | | | | Prev | | | + * `--------------------' `--------------------' + */ +// MEDIA AND MOUSE +[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_CALC, KC_MAIL, KC_WHOM, + 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_MUTE, KC_TRNS, KC_TRNS, + // right hand + 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, + + KC_TRNS, KC_TRNS, + KC_MPRV, + KC_MNXT, KC_TRNS, KC_TRNS +), +}; + +const uint16_t PROGMEM fn_actions[] = { +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch(id) { + case MDBL0: + if (record->event.pressed) { + return MACRO( I(25), T(P0), T(P0), END ); + } + break; + case MFNLR: + layer_invert(NUMR); + layer_invert(FNLR); + break; + } + return MACRO_NONE; +}; + +// Runs just one time when the keyboard initializes. +void * matrix_init_user(void) { + return NULL; +}; + +// Runs constantly in the background, in a loop. +void * matrix_scan_user(void) { + + ergodox_board_led_off(); + ergodox_right_led_1_off(); + ergodox_right_led_2_off(); + ergodox_right_led_3_off(); + // led 1: numeric layer + if (layer_state & (1 << NUMR)) { + ergodox_right_led_1_on(); + } + // led 2: Dvorak layer + if (default_layer_state == 1 << DVRK) { + ergodox_right_led_2_on(); + } + // led 3: caps lock + if (host_keyboard_leds() & (1< Date: Sun, 7 Feb 2016 19:29:49 +0100 Subject: [PATCH 02/34] =?UTF-8?q?Use=20B=C3=89PO=20sp=C3=A9cific=20key=20a?= =?UTF-8?q?liases=20with=20BP=5F=20prefix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit keymap_bepo.h: define BP_* keycodes for all possible characters bepo/keymap.c: use those keycodes in the bépo keymap --- keyboard/ergodox_ez/keymaps/bepo/keymap.c | 90 +++++------------------ 1 file changed, 20 insertions(+), 70 deletions(-) diff --git a/keyboard/ergodox_ez/keymaps/bepo/keymap.c b/keyboard/ergodox_ez/keymaps/bepo/keymap.c index 1fe23a93..835db147 100644 --- a/keyboard/ergodox_ez/keymaps/bepo/keymap.c +++ b/keyboard/ergodox_ez/keymaps/bepo/keymap.c @@ -3,9 +3,9 @@ #include "debug.h" #include "action_layer.h" #include "led.h" +#include "keymap_extras/keymap_bepo.h" #define BASE 0 // default layer -#define DVRK 1 // Dvorak layer #define NUMR 8 // numeric layer #define FNLR 9 // fn layer @@ -16,15 +16,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Basic layer * * ,--------------------------------------------------. ,--------------------------------------------------. - * | ` | 1 | 2 | 3 | 4 | 5 | Del | | Del | 6 | 7 | 8 | 9 | 0 | - | + * | $ | " | « | » | ( | ) | Del | | Del | @ | + | - | / | * | = | * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| - * | Tab | Q | W | E | R | T |Backsp| |Backsp| Y | U | I | O | P | [ | + * | Tab | B | É | P | O | È |Backsp| |Backsp| ^ | V | D | L | J | Z | * |--------+------+------+------+------+------|ace | |ace |------+------+------+------+------+--------| - * | ] | A | S | D | F | G |------| |------| H | J | K | L | ; | ' | + * | W | A | U | I | E | , |------| |------| C | T | S | R | N | M | * |--------+------+------+------+------+------|Enter | |Enter |------+------+------+------+------+--------| - * | LShift | Z | X | C | V | B | | | | N | M | , | . | / | RShift | + * | LShift | À | Y | X | . | K | | | | ' | Q | G | H | F | RShift | * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' - * |LCtrl | fn | LGui | Play |App/Alt| | RAlt | = | Home | \ |End/Ctl| + * |LCtrl | fn | LGui | Play |App/Alt| |Alt Gr| % | Home | Ç |End/Ctl| * `-----------------------------------' `-----------------------------------' * ,--------------. ,-------------. * |Esc/Alt| num | | Left |Right | @@ -38,72 +38,26 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // 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_RBRC, 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(MFNLR), KC_LGUI,KC_MPLY,ALT_T(KC_APP), + BP_DLR, KC_1, KC_2, KC_3, KC_4, KC_5, KC_DELT, + KC_TAB, BP_B, BP_ECUT, BP_P, BP_O, BP_EGRV, KC_BSPC, + BP_W, BP_A, BP_U, BP_I, BP_E, BP_COMM, + KC_LSFT, BP_AGRV, BP_Y, BP_X, BP_DOT, BP_K, KC_ENT, + KC_LCTL, M(MFNLR), KC_LGUI, KC_MPLY, ALT_T(KC_APP), ALT_T(KC_ESC), TG(NUMR), KC_PGUP, KC_SPC, KC_LSFT, KC_PGDN, // right hand - KC_DELT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, - KC_BSPC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, - KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, - KC_ENT, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, - KC_RALT, KC_EQL, KC_HOME, KC_BSLS, CTL_T(KC_END), - - KC_LEFT, KC_RGHT, - KC_UP, - KC_DOWN, KC_RSFT, KC_SPC - ), -/* 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(NUMR), - 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 + KC_DELT, KC_6, KC_7, KC_8, KC_9, KC_0, BP_EQL, + KC_BSPC, BP_DCRC, BP_V, BP_D, BP_L, BP_J, BP_Z, + BP_C, BP_T, BP_S, BP_R, BP_N, BP_M, + KC_ENT, BP_APOS, BP_Q, BP_G, BP_H, BP_F, KC_RSFT, + BP_ALGR, BP_PERC, KC_HOME, BP_CCED, CTL_T(KC_END), + + KC_LEFT, KC_RGHT, + KC_UP, + KC_DOWN, KC_RSFT, KC_SPC ), /* Numeric Layer * @@ -230,10 +184,6 @@ void * matrix_scan_user(void) { if (layer_state & (1 << NUMR)) { ergodox_right_led_1_on(); } - // led 2: Dvorak layer - if (default_layer_state == 1 << DVRK) { - ergodox_right_led_2_on(); - } // led 3: caps lock if (host_keyboard_leds() & (1< Date: Sun, 14 Feb 2016 15:18:04 +0100 Subject: [PATCH 03/34] Swapped w and = to keep the w on the right hand (better for English) --- keyboard/ergodox_ez/keymaps/bepo/keymap.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/keyboard/ergodox_ez/keymaps/bepo/keymap.c b/keyboard/ergodox_ez/keymaps/bepo/keymap.c index 835db147..2a4cce07 100644 --- a/keyboard/ergodox_ez/keymaps/bepo/keymap.c +++ b/keyboard/ergodox_ez/keymaps/bepo/keymap.c @@ -16,11 +16,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Basic layer * * ,--------------------------------------------------. ,--------------------------------------------------. - * | $ | " | « | » | ( | ) | Del | | Del | @ | + | - | / | * | = | + * | $ | " | « | » | ( | ) | Del | | Del | @ | + | - | / | * | W | * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| * | Tab | B | É | P | O | È |Backsp| |Backsp| ^ | V | D | L | J | Z | * |--------+------+------+------+------+------|ace | |ace |------+------+------+------+------+--------| - * | W | A | U | I | E | , |------| |------| C | T | S | R | N | M | + * | = | A | U | I | E | , |------| |------| C | T | S | R | N | M | * |--------+------+------+------+------+------|Enter | |Enter |------+------+------+------+------+--------| * | LShift | À | Y | X | . | K | | | | ' | Q | G | H | F | RShift | * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' @@ -40,7 +40,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // left hand BP_DLR, KC_1, KC_2, KC_3, KC_4, KC_5, KC_DELT, KC_TAB, BP_B, BP_ECUT, BP_P, BP_O, BP_EGRV, KC_BSPC, - BP_W, BP_A, BP_U, BP_I, BP_E, BP_COMM, + BP_EQL, BP_A, BP_U, BP_I, BP_E, BP_COMM, KC_LSFT, BP_AGRV, BP_Y, BP_X, BP_DOT, BP_K, KC_ENT, KC_LCTL, M(MFNLR), KC_LGUI, KC_MPLY, ALT_T(KC_APP), @@ -49,7 +49,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_SPC, KC_LSFT, KC_PGDN, // right hand - KC_DELT, KC_6, KC_7, KC_8, KC_9, KC_0, BP_EQL, + KC_DELT, KC_6, KC_7, KC_8, KC_9, KC_0, BP_W, KC_BSPC, BP_DCRC, BP_V, BP_D, BP_L, BP_J, BP_Z, BP_C, BP_T, BP_S, BP_R, BP_N, BP_M, KC_ENT, BP_APOS, BP_Q, BP_G, BP_H, BP_F, KC_RSFT, From bf78ca1ef2983f87e9acb5f115326290f9626931 Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Wed, 17 Feb 2016 21:07:38 +0100 Subject: [PATCH 04/34] Use enums to define layers and macros --- keyboard/ergodox_ez/keymaps/bepo/keymap.c | 56 ++++++++++++----------- 1 file changed, 30 insertions(+), 26 deletions(-) diff --git a/keyboard/ergodox_ez/keymaps/bepo/keymap.c b/keyboard/ergodox_ez/keymaps/bepo/keymap.c index 2a4cce07..855379e3 100644 --- a/keyboard/ergodox_ez/keymaps/bepo/keymap.c +++ b/keyboard/ergodox_ez/keymaps/bepo/keymap.c @@ -5,12 +5,16 @@ #include "led.h" #include "keymap_extras/keymap_bepo.h" -#define BASE 0 // default layer -#define NUMR 8 // numeric layer -#define FNLR 9 // fn layer +enum layers { + LR_BASE, // default layer + LR_NUMR, // numeric layer + LR_FN, // fn layer +}; -#define MDBL0 1 -#define MFNLR 2 +enum macros { + M_DBL0, + M_FNLR, +}; const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Basic layer @@ -36,15 +40,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ // If it accepts an argument (i.e, is a function), it doesn't need KC_. // Otherwise, it needs KC_* -[BASE] = KEYMAP( // layer 0 : default +[LR_BASE] = KEYMAP( // layer 0 : default // left hand BP_DLR, KC_1, KC_2, KC_3, KC_4, KC_5, KC_DELT, KC_TAB, BP_B, BP_ECUT, BP_P, BP_O, BP_EGRV, KC_BSPC, BP_EQL, BP_A, BP_U, BP_I, BP_E, BP_COMM, KC_LSFT, BP_AGRV, BP_Y, BP_X, BP_DOT, BP_K, KC_ENT, - KC_LCTL, M(MFNLR), KC_LGUI, KC_MPLY, ALT_T(KC_APP), + KC_LCTL, M(M_FNLR), KC_LGUI, KC_MPLY, ALT_T(KC_APP), - ALT_T(KC_ESC), TG(NUMR), + ALT_T(KC_ESC), TG(LR_NUMR), KC_PGUP, KC_SPC, KC_LSFT, KC_PGDN, @@ -81,7 +85,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `--------------------' `--------------------' */ // SYMBOLS -[NUMR] = KEYMAP( +[LR_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, @@ -91,13 +95,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 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_TAB, KC_PSLS, KC_PAST, KC_PMNS, - 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(MDBL0),KC_PDOT, CTL_T(KC_PENT), + KC_TRNS, 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, + 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(M_DBL0),KC_PDOT, CTL_T(KC_PENT), KC_NLCK, KC_CAPS, KC_TRNS, @@ -125,12 +129,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `--------------------' `--------------------' */ // MEDIA AND MOUSE -[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_CALC, KC_MAIL, KC_WHOM, - 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, +[LR_FN] = 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_CALC, KC_MAIL, KC_WHOM, + 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, @@ -155,14 +159,14 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { // MACRODOWN only works in this function switch(id) { - case MDBL0: + case M_DBL0: if (record->event.pressed) { return MACRO( I(25), T(P0), T(P0), END ); } break; - case MFNLR: - layer_invert(NUMR); - layer_invert(FNLR); + case M_FNLR: + layer_invert(LR_NUMR); + layer_invert(LR_FN); break; } return MACRO_NONE; @@ -181,7 +185,7 @@ void * matrix_scan_user(void) { ergodox_right_led_2_off(); ergodox_right_led_3_off(); // led 1: numeric layer - if (layer_state & (1 << NUMR)) { + if (layer_state & (1 << LR_NUMR)) { ergodox_right_led_1_on(); } // led 3: caps lock From b8ddbd21810951f64a081e4c3096bbc6aedc9aeb Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Fri, 26 Feb 2016 00:54:19 +0100 Subject: [PATCH 05/34] Added RESET key on fn-= --- keyboard/ergodox_ez/keymaps/bepo/keymap.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/keyboard/ergodox_ez/keymaps/bepo/keymap.c b/keyboard/ergodox_ez/keymaps/bepo/keymap.c index 855379e3..1cebf8c9 100644 --- a/keyboard/ergodox_ez/keymaps/bepo/keymap.c +++ b/keyboard/ergodox_ez/keymaps/bepo/keymap.c @@ -114,7 +114,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| * | | | | | | |VolUp | | | | | | | | Pause | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | | | Calc | Mail |Browsr|------| |------| | | | | | | + * | RESET | | | Calc | Mail |Browsr|------| |------| | | | | | | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| * | | | cut | copy |paste | Mute |VolDn | | | | | | | | | * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' @@ -132,7 +132,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [LR_FN] = 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_CALC, KC_MAIL, KC_WHOM, + RESET, KC_TRNS, KC_TRNS, KC_CALC, KC_MAIL, KC_WHOM, 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, From a7cef2ca0a2322448d02008337013936b1d550ec Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Wed, 17 Feb 2016 21:45:38 +0100 Subject: [PATCH 06/34] =?UTF-8?q?Initial=20B=C3=89PO=20over=20CSA=20with?= =?UTF-8?q?=20Shift=20layer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Initial implementation of the BÉPO layout for use with the Canadian Multilingual Standard layout (a.k.a. CSA / ACNOR layout) on the OS-side. - support all bépo characters from the default and shifted layers --- keyboard/ergodox_ez/keymaps/bepo/keymap.c | 159 +++++++++++++++++- .../keymap_canadian_multilingual.h | 105 ++++++++++++ 2 files changed, 262 insertions(+), 2 deletions(-) create mode 100644 quantum/keymap_extras/keymap_canadian_multilingual.h diff --git a/keyboard/ergodox_ez/keymaps/bepo/keymap.c b/keyboard/ergodox_ez/keymaps/bepo/keymap.c index 1cebf8c9..ce887997 100644 --- a/keyboard/ergodox_ez/keymaps/bepo/keymap.c +++ b/keyboard/ergodox_ez/keymaps/bepo/keymap.c @@ -4,14 +4,39 @@ #include "action_layer.h" #include "led.h" #include "keymap_extras/keymap_bepo.h" +#include "keymap_extras/keymap_canadian_multilingual.h" enum layers { LR_BASE, // default layer + LR_CSA, // BÉPO over Canadian Multilingual (CSA) + LR_CSA_SFT, // shifted BÉPO over CSA + LR_CSA_AGR, // altgr-ed BÉPO over CSA + LR_CSA_AGR_SFT, // altgr-shifted BÉPO over CSA LR_NUMR, // numeric layer LR_FN, // fn layer }; +#define IS_CA_MULT_ENABLED() (default_layer_state & (1 << LR_CSA)) + enum macros { + M_TGCM, // toggle CA-mult + M_CMSFT, // toggle shift on CA-mult + // macros for characters that need to be un-shifted in LR_CA_MULT_SHIFT + M_1, + M_2, + M_3, + M_4, + M_5, + M_6, + M_7, + M_8, + M_9, + M_0, + M_DEGR, + M_SCLN, + M_GRV, + M_NBSP, + // other layer macros M_DBL0, M_FNLR, }; @@ -63,6 +88,76 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_UP, KC_DOWN, KC_RSFT, KC_SPC ), +/** + * Same as default but for use with Canadian Multilingual on OS side + */ +[LR_CSA] = KEYMAP( + // left hand + KC_DLR, CM_DQOT, CM_LGIL, CM_RGIL, KC_LPRN, KC_RPRN, KC_DELT, + KC_TAB, KC_B, CM_ECUT, KC_P, KC_O, CM_EGRV, KC_BSPC, + KC_EQL, KC_A, KC_U, KC_I, KC_E, KC_COMM, + M(M_CMSFT), CM_AGRV, KC_Y, KC_X, KC_DOT, KC_K, KC_ENT, + KC_LCTL, M(M_FNLR), KC_LGUI, KC_MPLY, ALT_T(KC_APP), + + ALT_T(KC_ESC), TG(LR_NUMR), + KC_PGUP, + KC_SPC, KC_LSFT, KC_PGDN, + + // right hand + KC_DELT, KC_AT, KC_PLUS, KC_MINS, CM_SLSH, KC_ASTR, KC_W, + KC_BSPC, CM_DCRC, KC_V, KC_D, KC_L, KC_J, KC_Z, + KC_C, KC_T, KC_S, KC_R, KC_N, KC_M, + KC_ENT, CM_APOS, KC_Q, KC_G, KC_H, KC_F, M(M_CMSFT), + CM_ALGR, KC_PERC, KC_HOME, CM_CCED, CTL_T(KC_END), + + KC_LEFT, KC_RGHT, + KC_UP, + KC_DOWN, KC_RSFT, KC_SPC + ), +/* Shifted BÉPO over Canadian Multilingual + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | # | 1 | 2 | 3 | 4 | 5 | | | | 6 | 7 | 8 | 9 | 0 | | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | | | | | | | | | ! | | | | | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | ° | | | | | ; |------| |------| | | | | | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | | : | | | | | ? | | | | | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | | ` | | | | + * `----------------------------------' `-----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + */ +[LR_CSA_SFT] = KEYMAP( + // left hand + KC_HASH, M(M_1), M(M_2), M(M_3), M(M_4), M(M_5), KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + M(M_DEGR),KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, M(M_SCLN), + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_COLN, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + + KC_TRNS, KC_TRNS, + KC_TRNS, + M(M_NBSP), KC_TRNS, KC_TRNS, + + // right hand + KC_TRNS, M(M_6), M(M_7), M(M_8), M(M_9), M(M_0), KC_TRNS, + KC_TRNS, KC_EXLM, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, CM_QEST, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, M(M_GRV), KC_TRNS, KC_TRNS, KC_TRNS, + + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, M(M_NBSP) + ), /* Numeric Layer * * ,--------------------------------------------------. ,--------------------------------------------------. @@ -110,7 +205,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* fn layer * * ,--------------------------------------------------. ,--------------------------------------------------. - * | | | | | | |Insert| |Insert|Eject |Power |Sleep | Wake |PrtScr|ScrollLk| + * |~CA-mult| | | | | |Insert| |Insert|Eject |Power |Sleep | Wake |PrtScr|ScrollLk| * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| * | | | | | | |VolUp | | | | | | | | Pause | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| @@ -130,7 +225,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ // MEDIA AND MOUSE [LR_FN] = KEYMAP( - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_INS, + M(M_TGCM), 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, RESET, KC_TRNS, KC_TRNS, KC_CALC, KC_MAIL, KC_WHOM, KC_TRNS, KC_TRNS, LSFT(KC_DELT),LCTL(KC_INS),LSFT(KC_INS), KC_MUTE, KC_VOLD, @@ -155,10 +250,66 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { const uint16_t PROGMEM fn_actions[] = { }; +void hold_shift(void) { + register_code(KC_LSHIFT); +} + +void release_shift(void) { + unregister_code(KC_LSHIFT); +} + const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { // MACRODOWN only works in this function switch(id) { + case M_TGCM: + if (record->event.pressed) { + default_layer_xor(1 << LR_CSA); + } + break; + case M_CMSFT: + if (record->event.pressed) { + layer_on(LR_CSA_SFT); + hold_shift(); + } else { + release_shift(); + layer_off(LR_CSA_SFT); + } + break; + case M_1 ... M_0: + case M_DEGR: + case M_SCLN: + case M_GRV: + case M_NBSP: + // macros of the shift layer that require to release shift + if (record->event.pressed) { + release_shift(); + switch (id) { + case M_1 ... M_0: + register_code(KC_1 + (id - M_1)); + break; + case M_DEGR: + return MACRO(DOWN(CM_ALTGR), D(SCLN), END); + case M_SCLN: + return MACRO(D(SCLN), END); + case M_GRV: + return MACRO(DOWN(CM_ALTGR), TYPE(CM_DCRC), UP(CM_ALTGR), T(SPACE), END); + case M_NBSP: + return MACRO(DOWN(CM_ALTGR), T(SPACE), UP(CM_ALTGR), END); + } + } else { + hold_shift(); + switch (id) { + case M_1 ... M_0: + unregister_code(KC_1 + (id - M_1)); + break; + case M_DEGR: + return MACRO(UP(CM_ALTGR), D(LSFT), U(SCLN), END); + case M_SCLN: + return MACRO(D(LSFT), U(SCLN), END); + } + } + break; case M_DBL0: if (record->event.pressed) { return MACRO( I(25), T(P0), T(P0), END ); @@ -188,6 +339,10 @@ void * matrix_scan_user(void) { if (layer_state & (1 << LR_NUMR)) { ergodox_right_led_1_on(); } + // led 2: BÉPO over Canadian Multilingual + if (IS_CA_MULT_ENABLED()) { + ergodox_right_led_2_on(); + } // led 3: caps lock if (host_keyboard_leds() & (1< +#define CM_GRTR CM_GREATER + +// Space bar +#define CM_NON_BREAKING_SPACE ALTGR(KC_SPACE) +#define CM_NBSP CM_NON_BREAKING_SPACE + +#endif From 7840e69bfaee1d67de273c235b532d6f20c905a9 Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Thu, 18 Feb 2016 00:47:23 +0100 Subject: [PATCH 07/34] =?UTF-8?q?B=C3=89PO=20over=20CSA:=20AltGr=20layer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - implemented the most useful characters: - all French characters + € - common programmer characters - other keys implemented as KC_NO to avoid mistyping a character from a lower layer - AltGr+Shift not supported (yet) --- keyboard/ergodox_ez/keymaps/bepo/keymap.c | 54 ++++++++++++++++++- .../keymap_canadian_multilingual.h | 11 ++++ 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/keyboard/ergodox_ez/keymaps/bepo/keymap.c b/keyboard/ergodox_ez/keymaps/bepo/keymap.c index ce887997..64fac7f9 100644 --- a/keyboard/ergodox_ez/keymaps/bepo/keymap.c +++ b/keyboard/ergodox_ez/keymaps/bepo/keymap.c @@ -36,6 +36,8 @@ enum macros { M_SCLN, M_GRV, M_NBSP, + // macros for characters that don't have a simple key combination in LR_CA_MULT_ALTGR + M_CRC, // other layer macros M_DBL0, M_FNLR, @@ -108,7 +110,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_BSPC, CM_DCRC, KC_V, KC_D, KC_L, KC_J, KC_Z, KC_C, KC_T, KC_S, KC_R, KC_N, KC_M, KC_ENT, CM_APOS, KC_Q, KC_G, KC_H, KC_F, M(M_CMSFT), - CM_ALGR, KC_PERC, KC_HOME, CM_CCED, CTL_T(KC_END), + MO(LR_CSA_AGR), KC_PERC, KC_HOME, CM_CCED, CTL_T(KC_END), KC_LEFT, KC_RGHT, KC_UP, @@ -158,6 +160,51 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, KC_TRNS, KC_TRNS, M(M_NBSP) ), +/* AltGr-ed BÉPO over Canadian Multilingual + * "////" indicates that the key is disabled (unsupported bépo character) + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | ////// | //// | < | > | [ | ] | | | | ^ | //// | //// | //// | //// | ////// | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | | |dead '| & | œ |dead `| | | | //// | //// | //// | //// | //// | ////// | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | ////// | æ | ù |dead "| € | //// |------| |------| //// | //// | //// | //// | //// | ////// | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | \ | { | } | //// | ~ | | | | //// | //// | //// | //// | //// | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | | //// | | //// | | + * `----------------------------------' `-----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | _ | |------| |------| | _ | + * | | | | | | | | + * `--------------------' `--------------------' + */ +[LR_CSA_AGR] = KEYMAP( + // left hand + KC_NO, KC_NO, CM_LESS, CM_GRTR, CM_LBRC, CM_RBRC, KC_TRNS, + KC_TRNS, CM_PIPE, CM_DACT, KC_AMPR, CM_OE, CM_DGRV, KC_TRNS, + KC_NO, CM_AE, CM_UGRV, CM_DTRM, CM_EURO, KC_NO, + KC_TRNS, CM_BSLS, CM_LCBR, CM_RCBR, KC_NO, CM_TILD, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_UNDS, KC_TRNS, KC_TRNS, + + // right hand + KC_TRNS, M(M_CRC), KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, + KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_TRNS, KC_NO, KC_TRNS, KC_NO, KC_TRNS, + + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_UNDS + ), /* Numeric Layer * * ,--------------------------------------------------. ,--------------------------------------------------. @@ -310,6 +357,11 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) } } break; + case M_CRC: + if (record->event.pressed) { + return MACRO(TYPE(CM_DCRC), T(SPACE), END); + } + break; case M_DBL0: if (record->event.pressed) { return MACRO( I(25), T(P0), T(P0), END ); diff --git a/quantum/keymap_extras/keymap_canadian_multilingual.h b/quantum/keymap_extras/keymap_canadian_multilingual.h index ae60ffe3..e30419b5 100644 --- a/quantum/keymap_extras/keymap_canadian_multilingual.h +++ b/quantum/keymap_extras/keymap_canadian_multilingual.h @@ -102,4 +102,15 @@ #define CM_NON_BREAKING_SPACE ALTGR(KC_SPACE) #define CM_NBSP CM_NON_BREAKING_SPACE +// GR2A-ed characters (non-exhaustive list) +// second row +#define CM_OE_LIGATURE GR2A(KC_E) // œ +#define CM_OE CM_OE_LIGATURE + +// third row +#define CM_AE_LIGATURE GR2A(KC_A) // æ +#define CM_AE CM_AE_LIGATURE +#define CM_DEAD_ACUTE GR2A(KC_SCLN) // dead acute accent +#define CM_DACT CM_DEAD_ACUTE + #endif From fbf1333d87aa4487692f068881ab1ce46fa79be5 Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Fri, 26 Feb 2016 00:53:30 +0100 Subject: [PATCH 08/34] =?UTF-8?q?B=C3=89PO=20over=20CSA:=20unicode=20suppo?= =?UTF-8?q?rt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - implement easy way to define and send unicode characters on Windows - define 3 characters not available in CSA: - en dash: – - em dash: — - ellipsis: … --- keyboard/ergodox_ez/keymaps/bepo/keymap.c | 59 +++++++++++++++++++++-- 1 file changed, 54 insertions(+), 5 deletions(-) diff --git a/keyboard/ergodox_ez/keymaps/bepo/keymap.c b/keyboard/ergodox_ez/keymaps/bepo/keymap.c index 64fac7f9..b08b4721 100644 --- a/keyboard/ergodox_ez/keymaps/bepo/keymap.c +++ b/keyboard/ergodox_ez/keymaps/bepo/keymap.c @@ -19,6 +19,13 @@ enum layers { #define IS_CA_MULT_ENABLED() (default_layer_state & (1 << LR_CSA)) enum macros { + // Characters that do not exist in CSA and must be implemented based on unicode support + // Note: these are intentionally declared first to be used as indexes in spec_chars below + UC_NDSH, // – + UC_MDSH, // — + UC_ELPS, // … + END_UC, // indicates the last unicode character macro + // other macros M_TGCM, // toggle CA-mult M_CMSFT, // toggle shift on CA-mult // macros for characters that need to be un-shifted in LR_CA_MULT_SHIFT @@ -43,6 +50,15 @@ enum macros { M_FNLR, }; +const uint16_t unicode_chars[] = { + [UC_NDSH] = L'–', + [UC_MDSH] = L'—', + [UC_ELPS] = L'…', +}; + +/* shortcut for unicod character macros */ +#define MUC(name) M(UC_##name) + const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Basic layer * @@ -164,13 +180,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * "////" indicates that the key is disabled (unsupported bépo character) * * ,--------------------------------------------------. ,--------------------------------------------------. - * | ////// | //// | < | > | [ | ] | | | | ^ | //// | //// | //// | //// | ////// | + * | – | — | < | > | [ | ] | | | | ^ | //// | //// | //// | //// | ////// | * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| * | | | |dead '| & | œ |dead `| | | | //// | //// | //// | //// | //// | ////// | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| * | ////// | æ | ù |dead "| € | //// |------| |------| //// | //// | //// | //// | //// | ////// | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | \ | { | } | //// | ~ | | | | //// | //// | //// | //// | //// | | + * | | \ | { | } | … | ~ | | | | //// | //// | //// | //// | //// | | * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' * | | | | | | | | //// | | //// | | * `----------------------------------' `-----------------------------------' @@ -184,10 +200,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [LR_CSA_AGR] = KEYMAP( // left hand - KC_NO, KC_NO, CM_LESS, CM_GRTR, CM_LBRC, CM_RBRC, KC_TRNS, + MUC(NDSH),MUC(MDSH),CM_LESS, CM_GRTR, CM_LBRC, CM_RBRC, KC_TRNS, KC_TRNS, CM_PIPE, CM_DACT, KC_AMPR, CM_OE, CM_DGRV, KC_TRNS, KC_NO, CM_AE, CM_UGRV, CM_DTRM, CM_EURO, KC_NO, - KC_TRNS, CM_BSLS, CM_LCBR, CM_RCBR, KC_NO, CM_TILD, KC_TRNS, + KC_TRNS, CM_BSLS, CM_LCBR, CM_RCBR, MUC(ELPS),CM_TILD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, @@ -305,10 +321,43 @@ void release_shift(void) { unregister_code(KC_LSHIFT); } +uint16_t hextokeycode(int hex) { + if (hex == 0x0) { + return KC_P0; + } else if (hex < 0xA) { + return KC_P1 + (hex - 0x1); + } else { + return KC_A + (hex - 0xA); + } +} + +void send_unicode(uint16_t unicode) +{ + // For more info on how this works per OS, see here: https://en.wikipedia.org/wiki/Unicode_input#Hexadecimal_code_input + // Implemented for Windows: + // Pressing ALT followed by + followed by the unicode code point in hex. + // Requires registry key HKEY_CURRENT_USER\Control Panel\Input Method\EnableHexNumpad set to String 1 + register_code(KC_LALT); + register_code(KC_PPLS); + unregister_code(KC_PPLS); + + for (int i = 12; i >= 0; i -= 4) { + register_code(hextokeycode((unicode >> i) & 0xF)); + unregister_code(hextokeycode((unicode >> i) & 0xF)); + } + + unregister_code(KC_LALT); +} + 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 ... END_UC: + if (record->event.pressed) { + send_unicode(unicode_chars[id]); + } + break; case M_TGCM: if (record->event.pressed) { default_layer_xor(1 << LR_CSA); @@ -364,7 +413,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) break; case M_DBL0: if (record->event.pressed) { - return MACRO( I(25), T(P0), T(P0), END ); + return MACRO( I(25), T(P0), T(P0), END ); } break; case M_FNLR: From 911222892ecb1c01551e0abdfbe98ed1dbf82139 Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Fri, 26 Feb 2016 00:55:39 +0100 Subject: [PATCH 09/34] =?UTF-8?q?B=C3=89PO=20over=20CSA:=20GR2A=20characte?= =?UTF-8?q?rs=20in=20AltGr=20layer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - define aliases for all GR2A characters (unshifted) - use the available characters in the BÉPO over CSA AltGr layer --- keyboard/ergodox_ez/keymaps/bepo/keymap.c | 22 ++--- .../keymap_canadian_multilingual.h | 81 ++++++++++++++++++- 2 files changed, 88 insertions(+), 15 deletions(-) diff --git a/keyboard/ergodox_ez/keymaps/bepo/keymap.c b/keyboard/ergodox_ez/keymaps/bepo/keymap.c index b08b4721..a3b8d9c4 100644 --- a/keyboard/ergodox_ez/keymaps/bepo/keymap.c +++ b/keyboard/ergodox_ez/keymaps/bepo/keymap.c @@ -180,15 +180,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * "////" indicates that the key is disabled (unsupported bépo character) * * ,--------------------------------------------------. ,--------------------------------------------------. - * | – | — | < | > | [ | ] | | | | ^ | //// | //// | //// | //// | ////// | + * | – | — | < | > | [ | ] | | | | ^ | ± | //// | //// | //// | ////// | * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| - * | | | |dead '| & | œ |dead `| | | | //// | //// | //// | //// | //// | ////// | + * | | | |dead '| & | œ |dead `| | | | //// | //// | ð | //// | ij | ////// | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | ////// | æ | ù |dead "| € | //// |------| |------| //// | //// | //// | //// | //// | ////// | + * | ////// | æ | ù |dead "| € | ̛’ |------| |------| //// | þ | ß | //// |dead ~| ////// | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | \ | { | } | … | ~ | | | | //// | //// | //// | //// | //// | | + * | | \ | { | } | … | ~ | | | | //// | //// | μ | //// | //// | | * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' - * | | | | | | | | //// | | //// | | + * | | | | | | | | //// | |dead ¸| | * `----------------------------------' `-----------------------------------' * ,-------------. ,-------------. * | | | | | | @@ -202,7 +202,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // left hand MUC(NDSH),MUC(MDSH),CM_LESS, CM_GRTR, CM_LBRC, CM_RBRC, KC_TRNS, KC_TRNS, CM_PIPE, CM_DACT, KC_AMPR, CM_OE, CM_DGRV, KC_TRNS, - KC_NO, CM_AE, CM_UGRV, CM_DTRM, CM_EURO, KC_NO, + KC_NO, CM_AE, CM_UGRV, CM_DTRM, CM_EURO, CM_RQOT, KC_TRNS, CM_BSLS, CM_LCBR, CM_RCBR, MUC(ELPS),CM_TILD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, @@ -211,11 +211,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_UNDS, KC_TRNS, KC_TRNS, // right hand - KC_TRNS, M(M_CRC), KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, - KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, - KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, - KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, - KC_TRNS, KC_NO, KC_TRNS, KC_NO, KC_TRNS, + KC_TRNS, M(M_CRC), CM_PSMS, KC_NO, KC_NO, KC_NO, KC_NO, + KC_TRNS, KC_NO, KC_NO, CM_ETH, KC_NO, CM_IJ, KC_NO, + KC_NO, CM_THRN, CM_SRPS, KC_NO, CM_DTLD, KC_TRNS, + KC_TRNS, KC_NO, KC_NO, CM_MU, KC_NO, KC_NO, KC_NO, + KC_TRNS, KC_NO, KC_TRNS, CM_DCED, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, diff --git a/quantum/keymap_extras/keymap_canadian_multilingual.h b/quantum/keymap_extras/keymap_canadian_multilingual.h index e30419b5..9b13b1e4 100644 --- a/quantum/keymap_extras/keymap_canadian_multilingual.h +++ b/quantum/keymap_extras/keymap_canadian_multilingual.h @@ -103,14 +103,87 @@ #define CM_NBSP CM_NON_BREAKING_SPACE // GR2A-ed characters (non-exhaustive list) -// second row -#define CM_OE_LIGATURE GR2A(KC_E) // œ -#define CM_OE CM_OE_LIGATURE +// First row +#define CM_SUPERSCRIPT_ONE GR2A(KC_1) // ¹ +#define CM_SUP1 CM_SUPERSCRIPT_ONE +#define CM_SUPERSCRIPT_TWO GR2A(KC_2) // ² +#define CM_SUP2 CM_SUPERSCRIPT_TWO +#define CM_SUPERSCRIPT_THREE GR2A(KC_3) // ³ +#define CM_SUP3 CM_SUPERSCRIPT_THREE +#define CM_ONE_QUARTER GR2A(KC_4) // ¼ +#define CM_1QRT CM_ONE_QUARTER +#define CM_ONE_HALF GR2A(KC_5) // ½ +#define CM_1HLF CM_ONE_HALF +#define CM_THREE_QUARTERS GR2A(KC_6) // ¾ +#define CM_3QRT CM_THREE_QUARTERS +// nothing on 7-0 and - +#define CM_DEAD_CEDILLA GR2A(KC_EQUAL) // dead ¸ +#define CM_DCED CM_DEAD_CEDILLA + +// Second row +#define CM_OMEGA GR2A(KC_Q) // ω +#define CM_OMEG CM_OMEGA +#define CM_L_STROKE GR2A(KC_W) // ł +#define CM_LSTK CM_L_STROKE +#define CM_OE_LIGATURE GR2A(KC_E) // œ +#define CM_OE CM_OE_LIGATURE +#define CM_PARAGRAPH GR2A(KC_R) // ¶ +#define CM_PARG CM_PARAGRAPH +#define CM_T_STROKE GR2A(KC_T) // ŧ +#define CM_LEFT_ARROW GR2A(KC_Y) // ← +#define CM_LARW CM_LEFT_ARROW +#define CM_DOWN_ARROW GR2A(KC_U) // ↓ +#define CM_DARW CM_DOWN_ARROW +#define CM_RIGHT_ARROW GR2A(KC_I) // → +#define CM_RARW CM_RIGHT_ARROW +#define CM_O_STROKE GR2A(KC_O) // ø +#define CM_OSTK CM_O_STROKE +#define CM_THORN GR2A(KC_P) // þ +#define CM_THRN CM_THORN +// nothing on ^ +#define CM_DEAD_TILDE GR2A(CM_C_CEDILLA) // dead ~ +#define CM_DTLD CM_DEAD_TILDE -// third row +// Third row #define CM_AE_LIGATURE GR2A(KC_A) // æ #define CM_AE CM_AE_LIGATURE +#define CM_SHARP_S GR2A(KC_S) // ß +#define CM_SRPS CM_SHARP_S +#define CM_ETH GR2A(KC_D) // ð +// nothing on F +#define CM_ENG GR2A(KC_G) // ŋ +#define CM_H_SRTOKE GR2A(KC_H) // ħ +#define CM_HSTK CM_H_SRTOKE +#define CM_IJ_LIGATURE GR2A(KC_J) // ij +#define CM_IJ CM_IJ_LIGATURE +#define CM_KRA GR2A(KC_K) // ĸ +#define CM_L_FLOWN_DOT GR2A(KC_L) // ŀ +#define CM_LFLD CM_L_FLOWN_DOT #define CM_DEAD_ACUTE GR2A(KC_SCLN) // dead acute accent #define CM_DACT CM_DEAD_ACUTE +// nothing on È & À + +// Fourth row +#define CM_CENT GR2A(KC_C) // ¢ +#define CM_LEFT_DOUBLE_QUOTE GR2A(KC_V) // “ +#define CM_LDQT CM_LEFT_DOUBLE_QUOTE +#define CM_RIGHT_DOUBLE_QUOTE GR2A(KC_B) // ” +#define CM_RDQT CM_RIGHT_DOUBLE_QUOTE +#define CM_N_APOSTROPHE GR2A(KC_N) // ʼn (deprecated unicode codepoint) +#define CM_NAPO CM_N_APOSTROPHE +#define CM_MU GR2A(KC_M) // μ +// ─ TODO box drawing character? +#define CM_HYPHENATION_POINT GR2A(CM_DOT) // ‧ TODO not an interpunct ? + +// GR2A-shifted characters (non-exhaustive list) +// First row +#define CM_PLUS_MINUS LSFT(GR2A(KC_9)) // ± +#define CM_PSMS CM_PLUS_MINUS + +// Fourth row +#define CM_LEFT_QUOTE LSFT(GR2A(KC_V)) // ‘ +#define CM_LQOT CM_LEFT_QUOTE +#define CM_RIGHT_QUOTE LSFT(GR2A(KC_B)) // ’ +#define CM_RQOT CM_RIGHT_QUOTE #endif From 3a91ddb0745ae0f52007984793ea1b48abb2098c Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Tue, 1 Mar 2016 22:59:38 +0100 Subject: [PATCH 10/34] Use CSA_ as prefix for Canadian Multilingual key aliases CM is already used for Colemak. --- keyboard/ergodox_ez/keymaps/bepo/keymap.c | 60 ++--- .../keymap_canadian_multilingual.h | 244 +++++++++--------- 2 files changed, 153 insertions(+), 151 deletions(-) diff --git a/keyboard/ergodox_ez/keymaps/bepo/keymap.c b/keyboard/ergodox_ez/keymaps/bepo/keymap.c index a3b8d9c4..6cee216a 100644 --- a/keyboard/ergodox_ez/keymaps/bepo/keymap.c +++ b/keyboard/ergodox_ez/keymaps/bepo/keymap.c @@ -111,22 +111,22 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [LR_CSA] = KEYMAP( // left hand - KC_DLR, CM_DQOT, CM_LGIL, CM_RGIL, KC_LPRN, KC_RPRN, KC_DELT, - KC_TAB, KC_B, CM_ECUT, KC_P, KC_O, CM_EGRV, KC_BSPC, - KC_EQL, KC_A, KC_U, KC_I, KC_E, KC_COMM, - M(M_CMSFT), CM_AGRV, KC_Y, KC_X, KC_DOT, KC_K, KC_ENT, - KC_LCTL, M(M_FNLR), KC_LGUI, KC_MPLY, ALT_T(KC_APP), + KC_DLR, CSA_DQOT, CSA_LGIL, CSA_RGIL, KC_LPRN, KC_RPRN, KC_DELT, + KC_TAB, KC_B, CSA_ECUT, KC_P, KC_O, CSA_EGRV, KC_BSPC, + KC_EQL, KC_A, KC_U, KC_I, KC_E, KC_COMM, + M(M_CMSFT), CSA_AGRV, KC_Y, KC_X, KC_DOT, KC_K, KC_ENT, + KC_LCTL, M(M_FNLR), KC_LGUI, KC_MPLY, ALT_T(KC_APP), ALT_T(KC_ESC), TG(LR_NUMR), KC_PGUP, KC_SPC, KC_LSFT, KC_PGDN, // right hand - KC_DELT, KC_AT, KC_PLUS, KC_MINS, CM_SLSH, KC_ASTR, KC_W, - KC_BSPC, CM_DCRC, KC_V, KC_D, KC_L, KC_J, KC_Z, - KC_C, KC_T, KC_S, KC_R, KC_N, KC_M, - KC_ENT, CM_APOS, KC_Q, KC_G, KC_H, KC_F, M(M_CMSFT), - MO(LR_CSA_AGR), KC_PERC, KC_HOME, CM_CCED, CTL_T(KC_END), + KC_DELT, KC_AT, KC_PLUS, KC_MINS, CSA_SLSH, KC_ASTR, KC_W, + KC_BSPC, CSA_DCRC, KC_V, KC_D, KC_L, KC_J, KC_Z, + KC_C, KC_T, KC_S, KC_R, KC_N, KC_M, + KC_ENT, CSA_APOS, KC_Q, KC_G, KC_H, KC_F, M(M_CMSFT), + MO(LR_CSA_AGR), KC_PERC, KC_HOME, CSA_CCED, CTL_T(KC_END), KC_LEFT, KC_RGHT, KC_UP, @@ -166,11 +166,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { M(M_NBSP), KC_TRNS, KC_TRNS, // right hand - KC_TRNS, M(M_6), M(M_7), M(M_8), M(M_9), M(M_0), KC_TRNS, - KC_TRNS, KC_EXLM, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, CM_QEST, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, M(M_GRV), KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, M(M_6), M(M_7), M(M_8), M(M_9), M(M_0), KC_TRNS, + KC_TRNS, KC_EXLM, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, CSA_QEST, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, M(M_GRV), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, @@ -200,22 +200,22 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [LR_CSA_AGR] = KEYMAP( // left hand - MUC(NDSH),MUC(MDSH),CM_LESS, CM_GRTR, CM_LBRC, CM_RBRC, KC_TRNS, - KC_TRNS, CM_PIPE, CM_DACT, KC_AMPR, CM_OE, CM_DGRV, KC_TRNS, - KC_NO, CM_AE, CM_UGRV, CM_DTRM, CM_EURO, CM_RQOT, - KC_TRNS, CM_BSLS, CM_LCBR, CM_RCBR, MUC(ELPS),CM_TILD, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + MUC(NDSH), MUC(MDSH), CSA_LESS, CSA_GRTR, CSA_LBRC, CSA_RBRC, KC_TRNS, + KC_TRNS, CSA_PIPE, CSA_DACT, KC_AMPR, CSA_OE, CSA_DGRV, KC_TRNS, + KC_NO, CSA_AE, CSA_UGRV, CSA_DTRM, CSA_EURO, CSA_RQOT, + KC_TRNS, CSA_BSLS, CSA_LCBR, CSA_RCBR, MUC(ELPS), CSA_TILD, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_UNDS, KC_TRNS, KC_TRNS, // right hand - KC_TRNS, M(M_CRC), CM_PSMS, KC_NO, KC_NO, KC_NO, KC_NO, - KC_TRNS, KC_NO, KC_NO, CM_ETH, KC_NO, CM_IJ, KC_NO, - KC_NO, CM_THRN, CM_SRPS, KC_NO, CM_DTLD, KC_TRNS, - KC_TRNS, KC_NO, KC_NO, CM_MU, KC_NO, KC_NO, KC_NO, - KC_TRNS, KC_NO, KC_TRNS, CM_DCED, KC_TRNS, + KC_TRNS, M(M_CRC), CSA_PSMS, KC_NO, KC_NO, KC_NO, KC_NO, + KC_TRNS, KC_NO, KC_NO, CSA_ETH, KC_NO, CSA_IJ, KC_NO, + KC_NO, CSA_THRN, CSA_SRPS, KC_NO, CSA_DTLD, KC_TRNS, + KC_TRNS, KC_NO, KC_NO, CSA_MU, KC_NO, KC_NO, KC_NO, + KC_TRNS, KC_NO, KC_TRNS, CSA_DCED, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, @@ -385,13 +385,13 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) register_code(KC_1 + (id - M_1)); break; case M_DEGR: - return MACRO(DOWN(CM_ALTGR), D(SCLN), END); + return MACRO(DOWN(CSA_ALTGR), D(SCLN), END); case M_SCLN: return MACRO(D(SCLN), END); case M_GRV: - return MACRO(DOWN(CM_ALTGR), TYPE(CM_DCRC), UP(CM_ALTGR), T(SPACE), END); + return MACRO(DOWN(CSA_ALTGR), TYPE(CSA_DCRC), UP(CSA_ALTGR), T(SPACE), END); case M_NBSP: - return MACRO(DOWN(CM_ALTGR), T(SPACE), UP(CM_ALTGR), END); + return MACRO(DOWN(CSA_ALTGR), T(SPACE), UP(CSA_ALTGR), END); } } else { hold_shift(); @@ -400,7 +400,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) unregister_code(KC_1 + (id - M_1)); break; case M_DEGR: - return MACRO(UP(CM_ALTGR), D(LSFT), U(SCLN), END); + return MACRO(UP(CSA_ALTGR), D(LSFT), U(SCLN), END); case M_SCLN: return MACRO(D(LSFT), U(SCLN), END); } @@ -408,7 +408,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) break; case M_CRC: if (record->event.pressed) { - return MACRO(TYPE(CM_DCRC), T(SPACE), END); + return MACRO(TYPE(CSA_DCRC), T(SPACE), END); } break; case M_DBL0: diff --git a/quantum/keymap_extras/keymap_canadian_multilingual.h b/quantum/keymap_extras/keymap_canadian_multilingual.h index 9b13b1e4..b1d7b4e7 100644 --- a/quantum/keymap_extras/keymap_canadian_multilingual.h +++ b/quantum/keymap_extras/keymap_canadian_multilingual.h @@ -11,8 +11,8 @@ #define ALGR(kc) ALTGR(kc) #endif -#define CM_ALTGR KC_RALT -#define CM_ALGR CM_ALTGR +#define CSA_ALTGR KC_RALT +#define CSA_ALGR CSA_ALTGR #ifndef GR2A #define GR2A(kc) RCTL(kc) @@ -20,170 +20,172 @@ // Normal characters // First row -#define CM_SLASH KC_GRV // / -#define CM_SLSH CM_SLASH +#define CSA_SLASH KC_GRV // / +#define CSA_SLSH CSA_SLASH // Second row -#define CM_DEAD_CIRCUMFLEX KC_LBRACKET // dead ^ -#define CM_DCRC CM_DEAD_CIRCUMFLEX -#define CM_C_CEDILLA KC_RBRACKET // Ç -#define CM_CCED CM_C_CEDILLA +#define CSA_DEAD_CIRCUMFLEX KC_LBRACKET // dead ^ +#define CSA_DCRC CSA_DEAD_CIRCUMFLEX +#define CSA_C_CEDILLA KC_RBRACKET // Ç +#define CSA_CCED CSA_C_CEDILLA // Third row -#define CM_E_GRAVE KC_QUOT // è -#define CM_EGRV CM_E_GRAVE -#define CM_A_GRAVE KC_BSLASH // à -#define CM_AGRV CM_A_GRAVE +#define CSA_E_GRAVE KC_QUOT // è +#define CSA_EGRV CSA_E_GRAVE +#define CSA_A_GRAVE KC_BSLASH // à +#define CSA_AGRV CSA_A_GRAVE // Fourth row -#define CM_U_GRAVE KC_NONUS_BSLASH // ù -#define CM_UGRV CM_U_GRAVE -#define CM_E_ACUTE KC_SLSH // é -#define CM_ECUT CM_E_ACUTE +#define CSA_U_GRAVE KC_NONUS_BSLASH // ù +#define CSA_UGRV CSA_U_GRAVE +#define CSA_E_ACUTE KC_SLSH // é +#define CSA_ECUT CSA_E_ACUTE // Shifted characters // First row -#define CM_BACKSLASH LSFT(CM_SLASH) /* \ */ -#define CM_BSLS CM_BACKSLASH -#define CM_QUESTION LSFT(KC_6) // ? -#define CM_QEST CM_QUESTION +#define CSA_BACKSLASH LSFT(CSA_SLASH) /* \ */ +#define CSA_BSLS CSA_BACKSLASH +#define CSA_QUESTION LSFT(KC_6) // ? +#define CSA_QEST CSA_QUESTION // Second row -#define CM_DEAD_TREMA LSFT(CM_DEAD_CIRCUMFLEX) // dead trema/umlaut/diaresis for ä ë ï ö ü -#define CM_DTRM CM_DEAD_TREMA +#define CSA_DEAD_TREMA LSFT(CSA_DEAD_CIRCUMFLEX) // dead trema/umlaut/diaresis for ä ë ï ö ü +#define CSA_DTRM CSA_DEAD_TREMA // Third row // all same as US-QWERTY, or capitalised character of the non-shifted key // Fourth row -#define CM_APOSTROPHE LSFT(KC_COMMA) // ' -#define CM_APOS CM_APOSTROPHE -#define CM_DOUBLE_QUOTE LSFT(KC_DOT) // " -#define CM_DQOT CM_DOUBLE_QUOTE +#define CSA_APOSTROPHE LSFT(KC_COMMA) // ' +#define CSA_APOS CSA_APOSTROPHE +#define CSA_DOUBLE_QUOTE LSFT(KC_DOT) // " +#define CSA_DQOT CSA_DOUBLE_QUOTE // Alt Gr-ed characters // First row -#define CM_PIPE ALTGR(CM_SLASH) // | -#define CM_CURRENCY ALTGR(KC_4) // ¤ -#define CM_CURR CM_CURRENCY -#define CM_LEFT_CURLY_BRACE ALTGR(KC_7) // { -#define CM_LCBR CM_LEFT_CURLY_BRACE -#define CM_RIGHT_CURLY_BRACE ALTGR(KC_8) // } -#define CM_RCBR CM_RIGHT_CURLY_BRACE -#define CM_LBRACKET ALTGR(KC_9) // [ -#define CM_LBRC CM_LBRACKET -#define CM_RBRACKET ALTGR(KC_0) // ] -#define CM_RBRC CM_RBRACKET -#define CM_NEGATION ALTGR(KC_EQUAL) // ¬ -#define CM_NEGT CM_NEGATION +#define CSA_PIPE ALTGR(CSA_SLASH) // | +#define CSA_CURRENCY ALTGR(KC_4) // ¤ +#define CSA_CURR CSA_CURRENCY +#define CSA_LEFT_CURLY_BRACE ALTGR(KC_7) // { +#define CSA_LCBR CSA_LEFT_CURLY_BRACE +#define CSA_RIGHT_CURLY_BRACE ALTGR(KC_8) // } +#define CSA_RCBR CSA_RIGHT_CURLY_BRACE +#define CSA_LBRACKET ALTGR(KC_9) // [ +#define CSA_LBRC CSA_LBRACKET +#define CSA_RBRACKET ALTGR(KC_0) // ] +#define CSA_RBRC CSA_RBRACKET +#define CSA_NEGATION ALTGR(KC_EQUAL) // ¬ +#define CSA_NEGT CSA_NEGATION // Second row // euro symbol not available on Linux? (X.org) -#define CM_EURO ALTGR(KC_E) // € -#define CM_DEAD_GRAVE ALTGR(CM_DEAD_CIRCUMFLEX) -#define CM_DGRV CM_DEAD_GRAVE // dead ` -#define CM_TILDE ALTGR(CM_C_CEDILLA) // ~ -#define CM_TILD CM_TILDE +#define CSA_EURO ALTGR(KC_E) // € +#define CSA_DEAD_GRAVE ALTGR(CSA_DEAD_CIRCUMFLEX) +#define CSA_DGRV CSA_DEAD_GRAVE // dead ` +#define CSA_TILDE ALTGR(CSA_C_CEDILLA) // ~ +#define CSA_TILD CSA_TILDE // Third row -#define CM_DEGREE ALTGR(KC_SCOLON) // ° -#define CM_DEGR CM_DEGREE +#define CSA_DEGREE ALTGR(KC_SCOLON) // ° +#define CSA_DEGR CSA_DEGREE // Fourth row -#define CM_LEFT_GUILLEMET ALTGR(KC_Z) // « -#define CM_LGIL CM_LEFT_GUILLEMET -#define CM_RIGHT_GUILLEMET ALTGR(KC_X) // » -#define CM_RGIL CM_RIGHT_GUILLEMET -#define CM_LESS ALTGR(KC_COMMA) // < -#define CM_GREATER ALTGR(KC_DOT) // > -#define CM_GRTR CM_GREATER +#define CSA_LEFT_GUILLEMET ALTGR(KC_Z) // « +#define CSA_LGIL CSA_LEFT_GUILLEMET +#define CSA_RIGHT_GUILLEMET ALTGR(KC_X) // » +#define CSA_RGIL CSA_RIGHT_GUILLEMET +#define CSA_LESS ALTGR(KC_COMMA) // < +#define CSA_GREATER ALTGR(KC_DOT) // > +#define CSA_GRTR CSA_GREATER // Space bar -#define CM_NON_BREAKING_SPACE ALTGR(KC_SPACE) -#define CM_NBSP CM_NON_BREAKING_SPACE +#define CSA_NON_BREAKING_SPACE ALTGR(KC_SPACE) +#define CSA_NBSP CSA_NON_BREAKING_SPACE // GR2A-ed characters (non-exhaustive list) // First row -#define CM_SUPERSCRIPT_ONE GR2A(KC_1) // ¹ -#define CM_SUP1 CM_SUPERSCRIPT_ONE -#define CM_SUPERSCRIPT_TWO GR2A(KC_2) // ² -#define CM_SUP2 CM_SUPERSCRIPT_TWO -#define CM_SUPERSCRIPT_THREE GR2A(KC_3) // ³ -#define CM_SUP3 CM_SUPERSCRIPT_THREE -#define CM_ONE_QUARTER GR2A(KC_4) // ¼ -#define CM_1QRT CM_ONE_QUARTER -#define CM_ONE_HALF GR2A(KC_5) // ½ -#define CM_1HLF CM_ONE_HALF -#define CM_THREE_QUARTERS GR2A(KC_6) // ¾ -#define CM_3QRT CM_THREE_QUARTERS +#define CSA_SUPERSCRIPT_ONE GR2A(KC_1) // ¹ +#define CSA_SUP1 CSA_SUPERSCRIPT_ONE +#define CSA_SUPERSCRIPT_TWO GR2A(KC_2) // ² +#define CSA_SUP2 CSA_SUPERSCRIPT_TWO +#define CSA_SUPERSCRIPT_THREE GR2A(KC_3) // ³ +#define CSA_SUP3 CSA_SUPERSCRIPT_THREE +#define CSA_ONE_QUARTER GR2A(KC_4) // ¼ +#define CSA_1QRT CSA_ONE_QUARTER +#define CSA_ONE_HALF GR2A(KC_5) // ½ +#define CSA_1HLF CSA_ONE_HALF +#define CSA_THREE_QUARTERS GR2A(KC_6) // ¾ +#define CSA_3QRT CSA_THREE_QUARTERS // nothing on 7-0 and - -#define CM_DEAD_CEDILLA GR2A(KC_EQUAL) // dead ¸ -#define CM_DCED CM_DEAD_CEDILLA +#define CSA_DEAD_CEDILLA GR2A(KC_EQUAL) // dead ¸ +#define CSA_DCED CSA_DEAD_CEDILLA // Second row -#define CM_OMEGA GR2A(KC_Q) // ω -#define CM_OMEG CM_OMEGA -#define CM_L_STROKE GR2A(KC_W) // ł -#define CM_LSTK CM_L_STROKE -#define CM_OE_LIGATURE GR2A(KC_E) // œ -#define CM_OE CM_OE_LIGATURE -#define CM_PARAGRAPH GR2A(KC_R) // ¶ -#define CM_PARG CM_PARAGRAPH -#define CM_T_STROKE GR2A(KC_T) // ŧ -#define CM_LEFT_ARROW GR2A(KC_Y) // ← -#define CM_LARW CM_LEFT_ARROW -#define CM_DOWN_ARROW GR2A(KC_U) // ↓ -#define CM_DARW CM_DOWN_ARROW -#define CM_RIGHT_ARROW GR2A(KC_I) // → -#define CM_RARW CM_RIGHT_ARROW -#define CM_O_STROKE GR2A(KC_O) // ø -#define CM_OSTK CM_O_STROKE -#define CM_THORN GR2A(KC_P) // þ -#define CM_THRN CM_THORN +#define CSA_OMEGA GR2A(KC_Q) // ω +#define CSA_OMEG CSA_OMEGA +#define CSA_L_STROKE GR2A(KC_W) // ł +#define CSA_LSTK CSA_L_STROKE +#define CSA_OE_LIGATURE GR2A(KC_E) // œ +#define CSA_OE CSA_OE_LIGATURE +#define CSA_PARAGRAPH GR2A(KC_R) // ¶ +#define CSA_PARG CSA_PARAGRAPH +#define CSA_T_STROKE GR2A(KC_T) // ŧ +#define CSA_LEFT_ARROW GR2A(KC_Y) // ← +#define CSA_LARW CSA_LEFT_ARROW +#define CSA_DOWN_ARROW GR2A(KC_U) // ↓ +#define CSA_DARW CSA_DOWN_ARROW +#define CSA_RIGHT_ARROW GR2A(KC_I) // → +#define CSA_RARW CSA_RIGHT_ARROW +#define CSA_O_STROKE GR2A(KC_O) // ø +#define CSA_OSTK CSA_O_STROKE +#define CSA_THORN GR2A(KC_P) // þ +#define CSA_THRN CSA_THORN // nothing on ^ -#define CM_DEAD_TILDE GR2A(CM_C_CEDILLA) // dead ~ -#define CM_DTLD CM_DEAD_TILDE +#define CSA_DEAD_TILDE GR2A(CSA_C_CEDILLA) // dead ~ +#define CSA_DTLD CSA_DEAD_TILDE // Third row -#define CM_AE_LIGATURE GR2A(KC_A) // æ -#define CM_AE CM_AE_LIGATURE -#define CM_SHARP_S GR2A(KC_S) // ß -#define CM_SRPS CM_SHARP_S -#define CM_ETH GR2A(KC_D) // ð +#define CSA_AE_LIGATURE GR2A(KC_A) // æ +#define CSA_AE CSA_AE_LIGATURE +#define CSA_SHARP_S GR2A(KC_S) // ß +#define CSA_SRPS CSA_SHARP_S +#define CSA_ETH GR2A(KC_D) // ð // nothing on F -#define CM_ENG GR2A(KC_G) // ŋ -#define CM_H_SRTOKE GR2A(KC_H) // ħ -#define CM_HSTK CM_H_SRTOKE -#define CM_IJ_LIGATURE GR2A(KC_J) // ij -#define CM_IJ CM_IJ_LIGATURE -#define CM_KRA GR2A(KC_K) // ĸ -#define CM_L_FLOWN_DOT GR2A(KC_L) // ŀ -#define CM_LFLD CM_L_FLOWN_DOT -#define CM_DEAD_ACUTE GR2A(KC_SCLN) // dead acute accent -#define CM_DACT CM_DEAD_ACUTE +#define CSA_ENG GR2A(KC_G) // ŋ +#define CSA_H_SRTOKE GR2A(KC_H) // ħ +#define CSA_HSTK CSA_H_SRTOKE +#define CSA_IJ_LIGATURE GR2A(KC_J) // ij +#define CSA_IJ CSA_IJ_LIGATURE +#define CSA_KRA GR2A(KC_K) // ĸ +#define CSA_L_FLOWN_DOT GR2A(KC_L) // ŀ +#define CSA_LFLD CSA_L_FLOWN_DOT +#define CSA_DEAD_ACUTE GR2A(KC_SCLN) // dead acute accent +#define CSA_DACT CSA_DEAD_ACUTE // nothing on È & À // Fourth row -#define CM_CENT GR2A(KC_C) // ¢ -#define CM_LEFT_DOUBLE_QUOTE GR2A(KC_V) // “ -#define CM_LDQT CM_LEFT_DOUBLE_QUOTE -#define CM_RIGHT_DOUBLE_QUOTE GR2A(KC_B) // ” -#define CM_RDQT CM_RIGHT_DOUBLE_QUOTE -#define CM_N_APOSTROPHE GR2A(KC_N) // ʼn (deprecated unicode codepoint) -#define CM_NAPO CM_N_APOSTROPHE -#define CM_MU GR2A(KC_M) // μ -// ─ TODO box drawing character? -#define CM_HYPHENATION_POINT GR2A(CM_DOT) // ‧ TODO not an interpunct ? +#define CSA_CENT GR2A(KC_C) // ¢ +#define CSA_LEFT_DOUBLE_QUOTE GR2A(KC_V) // “ +#define CSA_LDQT CSA_LEFT_DOUBLE_QUOTE +#define CSA_RIGHT_DOUBLE_QUOTE GR2A(KC_B) // ” +#define CSA_RDQT CSA_RIGHT_DOUBLE_QUOTE +#define CSA_N_APOSTROPHE GR2A(KC_N) // ʼn (deprecated unicode codepoint) +#define CSA_NAPO CSA_N_APOSTROPHE +#define CSA_MU GR2A(KC_M) // μ +#define CSA_HORIZONTAL_BAR GR2A(KC_COMMA) // ― +#define CSA_HZBR CSA_HORIZONTAL_BAR +#define CSA_DEAD_DOT_ABOVE GR2A(KC_DOT) // dead ˙ +#define CSA_DOTA CSA_DEAD_DOT_ABOVE // GR2A-shifted characters (non-exhaustive list) // First row -#define CM_PLUS_MINUS LSFT(GR2A(KC_9)) // ± -#define CM_PSMS CM_PLUS_MINUS +#define CSA_PLUS_MINUS LSFT(GR2A(KC_9)) // ± +#define CSA_PSMS CSA_PLUS_MINUS // Fourth row -#define CM_LEFT_QUOTE LSFT(GR2A(KC_V)) // ‘ -#define CM_LQOT CM_LEFT_QUOTE -#define CM_RIGHT_QUOTE LSFT(GR2A(KC_B)) // ’ -#define CM_RQOT CM_RIGHT_QUOTE +#define CSA_LEFT_QUOTE LSFT(GR2A(KC_V)) // ‘ +#define CSA_LQOT CSA_LEFT_QUOTE +#define CSA_RIGHT_QUOTE LSFT(GR2A(KC_B)) // ’ +#define CSA_RQOT CSA_RIGHT_QUOTE #endif From b2a4434abbfe63902be668c34995587193f778dd Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Tue, 8 Mar 2016 23:27:18 +0100 Subject: [PATCH 11/34] =?UTF-8?q?B=C3=89PO=20over=20CSA:=20Fixed=20key=20r?= =?UTF-8?q?epeat=20for=20M=5FNBSP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- keyboard/ergodox_ez/keymaps/bepo/keymap.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/keyboard/ergodox_ez/keymaps/bepo/keymap.c b/keyboard/ergodox_ez/keymaps/bepo/keymap.c index 6cee216a..db6c9583 100644 --- a/keyboard/ergodox_ez/keymaps/bepo/keymap.c +++ b/keyboard/ergodox_ez/keymaps/bepo/keymap.c @@ -2,6 +2,7 @@ #include "ergodox_ez.h" #include "debug.h" #include "action_layer.h" +#include "action_util.h" #include "led.h" #include "keymap_extras/keymap_bepo.h" #include "keymap_extras/keymap_canadian_multilingual.h" @@ -391,7 +392,9 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) case M_GRV: return MACRO(DOWN(CSA_ALTGR), TYPE(CSA_DCRC), UP(CSA_ALTGR), T(SPACE), END); case M_NBSP: - return MACRO(DOWN(CSA_ALTGR), T(SPACE), UP(CSA_ALTGR), END); + // use weak mod such that pressing another key will not be affected + add_weak_mods(MOD_BIT(CSA_ALTGR)); + return MACRO(D(SPACE), END); } } else { hold_shift(); @@ -403,6 +406,9 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) return MACRO(UP(CSA_ALTGR), D(LSFT), U(SCLN), END); case M_SCLN: return MACRO(D(LSFT), U(SCLN), END); + case M_NBSP: + del_weak_mods(MOD_BIT(CSA_ALTGR)); + return MACRO(U(SPACE), END); } } break; From aa5eb49edd993e2abe3adf814e030fcdda4a3596 Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Wed, 2 Mar 2016 00:22:41 +0100 Subject: [PATCH 12/34] =?UTF-8?q?B=C3=89PO=20over=20CSA:=20GR2A-shifted=20?= =?UTF-8?q?characters=20in=20AltGr=20layer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - define aliases for all GR2A-shifted characters - use the available characters in BÉPO over CSA AltGr layer --- keyboard/ergodox_ez/keymaps/bepo/keymap.c | 18 ++-- .../keymap_canadian_multilingual.h | 86 ++++++++++++++++--- 2 files changed, 84 insertions(+), 20 deletions(-) diff --git a/keyboard/ergodox_ez/keymaps/bepo/keymap.c b/keyboard/ergodox_ez/keymaps/bepo/keymap.c index db6c9583..e339792b 100644 --- a/keyboard/ergodox_ez/keymaps/bepo/keymap.c +++ b/keyboard/ergodox_ez/keymaps/bepo/keymap.c @@ -181,13 +181,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * "////" indicates that the key is disabled (unsupported bépo character) * * ,--------------------------------------------------. ,--------------------------------------------------. - * | – | — | < | > | [ | ] | | | | ^ | ± | //// | //// | //// | ////// | + * | – | — | < | > | [ | ] | | | | ^ | ± | //// | ÷ | × | dead ˘ | * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| - * | | | |dead '| & | œ |dead `| | | | //// | //// | ð | //// | ij | ////// | + * | | | |dead '| & | œ |dead `| | | | ¡ |dead ˇ| ð | //// | ij | ////// | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | ////// | æ | ù |dead "| € | ̛’ |------| |------| //// | þ | ß | //// |dead ~| ////// | + * | ////// | æ | ù |dead "| € | ̛’ |------| |------| © | þ | ß | ® |dead ~| dead ¯ | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | \ | { | } | … | ~ | | | | //// | //// | μ | //// | //// | | + * | | \ | { | } | … | ~ | | | | ¿ |dead °| μ | //// |dead ˛| | * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' * | | | | | | | | //// | |dead ¸| | * `----------------------------------' `-----------------------------------' @@ -212,11 +212,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_UNDS, KC_TRNS, KC_TRNS, // right hand - KC_TRNS, M(M_CRC), CSA_PSMS, KC_NO, KC_NO, KC_NO, KC_NO, - KC_TRNS, KC_NO, KC_NO, CSA_ETH, KC_NO, CSA_IJ, KC_NO, - KC_NO, CSA_THRN, CSA_SRPS, KC_NO, CSA_DTLD, KC_TRNS, - KC_TRNS, KC_NO, KC_NO, CSA_MU, KC_NO, KC_NO, KC_NO, - KC_TRNS, KC_NO, KC_TRNS, CSA_DCED, KC_TRNS, + KC_TRNS, M(M_CRC), CSA_PSMS, KC_NO, CSA_DVSN, CSA_TIMS, CSA_DBRV, + KC_TRNS, CSA_IXLM, CSA_DCAR, CSA_ETH, KC_NO, CSA_IJ, KC_NO, + CSA_CPRT, CSA_THRN, CSA_SRPS, CSA_RTM, CSA_DTLD, CSA_DMCR, + KC_TRNS, CSA_IQST, CSA_DRNG, CSA_MU, KC_NO, CSA_DOGO, KC_TRNS, + KC_TRNS, KC_NO, KC_TRNS, CSA_DCED, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, diff --git a/quantum/keymap_extras/keymap_canadian_multilingual.h b/quantum/keymap_extras/keymap_canadian_multilingual.h index b1d7b4e7..c720088e 100644 --- a/quantum/keymap_extras/keymap_canadian_multilingual.h +++ b/quantum/keymap_extras/keymap_canadian_multilingual.h @@ -82,8 +82,8 @@ #define CSA_EURO ALTGR(KC_E) // € #define CSA_DEAD_GRAVE ALTGR(CSA_DEAD_CIRCUMFLEX) #define CSA_DGRV CSA_DEAD_GRAVE // dead ` -#define CSA_TILDE ALTGR(CSA_C_CEDILLA) // ~ -#define CSA_TILD CSA_TILDE +#define CSA_DEAD_TILDE ALTGR(CSA_C_CEDILLA) // ~ +#define CSA_DTLD CSA_DEAD_TILDE // Third row #define CSA_DEGREE ALTGR(KC_SCOLON) // ° @@ -102,7 +102,7 @@ #define CSA_NON_BREAKING_SPACE ALTGR(KC_SPACE) #define CSA_NBSP CSA_NON_BREAKING_SPACE -// GR2A-ed characters (non-exhaustive list) +// GR2A-ed characters // First row #define CSA_SUPERSCRIPT_ONE GR2A(KC_1) // ¹ #define CSA_SUP1 CSA_SUPERSCRIPT_ONE @@ -141,8 +141,8 @@ #define CSA_THORN GR2A(KC_P) // þ #define CSA_THRN CSA_THORN // nothing on ^ -#define CSA_DEAD_TILDE GR2A(CSA_C_CEDILLA) // dead ~ -#define CSA_DTLD CSA_DEAD_TILDE +#define CSA_TILDE GR2A(CSA_C_CEDILLA) // dead ~ +#define CSA_TILD CSA_TILDE // Third row #define CSA_AE_LIGATURE GR2A(KC_A) // æ @@ -175,17 +175,81 @@ #define CSA_HORIZONTAL_BAR GR2A(KC_COMMA) // ― #define CSA_HZBR CSA_HORIZONTAL_BAR #define CSA_DEAD_DOT_ABOVE GR2A(KC_DOT) // dead ˙ -#define CSA_DOTA CSA_DEAD_DOT_ABOVE +#define CSA_DDTA CSA_DEAD_DOT_ABOVE -// GR2A-shifted characters (non-exhaustive list) +// GR2A-shifted characters (different from capitalised GR2A-ed characters) // First row -#define CSA_PLUS_MINUS LSFT(GR2A(KC_9)) // ± -#define CSA_PSMS CSA_PLUS_MINUS +#define CSA_SOFT_HYPHEN GR2A(LSFT(CSA_SLASH)) // soft-hyphen, appears as a hyphen in wrapped word +#define CSA_SHYP CSA_SOFT_HYPHEN +#define CSA_INVERTED_EXCLAIM GR2A(KC_EXCLAIM) // ¡ +#define CSA_IXLM CSA_INVERTED_EXCLAIM +// nothing on 2 +#define CSA_POUND GR2A(LSFT(KC_3)) // £ +#define CSA_GBP CSA_POUND_SIGN +// already on ALTGR(KC_E) +#define CSA_EURO_BIS GR2A(LSFT(KC_4)) // € +#define CSA_EURB CSA_EURO_BIS +#define CSA_THREE_EIGHTHS GR2A(LSFT(KC_5)) // ⅜ +#define CSA_3ON8 CSA_THREE_EIGHTHS +#define CSA_FIVE_EIGHTHS GR2A(LSFT(KC_6)) // ⅝ +#define CSA_5ON8 CSA_FIVE_EIGHTHS +#define CSA_SEVEN_EIGHTHS GR2A(LSFT(KC_7)) // ⅞ +#define CSA_7ON8 CSA_SEVEN_EIGHTHS +#define CSA_TRADEMARK GR2A(LSFT(KC_8)) // ™ +#define CSA_TM CSA_TRADEMARK +#define CSA_PLUS_MINUS GR2A(LSFT(KC_9)) // ± +#define CSA_PSMS CSA_PLUS_MINUS +// nothing on 0 +#define CSA_INVERTED_QUESTION GR2A(LSFT(KC_MINUS)) // ¿ +#define CSA_IQST CSA_INVERTED_QUESTION +#define CSA_DEAD_OGONEK GR2A(LSFT(KC_EQUAL)) // dead ˛ +#define CSA_DOGO CSA_DEAD_OGONEK + +// Second row +#define CSA_REGISTERED_TRADEMARK GR2A(LSFT(KC_R)) // ® +#define CSA_RTM CSA_REGISTERED_TRADEMARK +#define CSA_YEN GR2A(LSFT(KC_Y)) // ¥ +#define CSA_YUAN CSA_YEN +#define CSA_UP_ARROW LSFT(CSA_DOWN_ARROW) // ↑ +#define CSA_DOTLESS_I GR2A(LSFT(KC_I)) // ı +#define CSA_DLSI CSA_DOTLESS_I +#define CSA_DEAD_RING GR2A(LSFT(CSA_DCRC)) // dead ° +#define CSA_DRNG CSA_DEAD_RING +#define CSA_DEAD_MACRON GR2A(LSFT(CSA_C_CEDILLA)) // dead ¯ +#define CSA_DMCR CSA_DEAD_MACRON + +// Third row +#define CSA_SECTION GR2A(LSFT(KC_S)) // § +#define CSA_SECT CSA_SECTION +#define CSA_ORDINAL_INDICATOR_A GR2A(LSFT(KC_F)) // ª +#define CSA_ORDA CSA_ORDINAL_INDICATOR_A +#define CSA_DEAD_DOUBLE_ACUTE LSFT(CSA_DEAD_ACUTE) // ˝ +#define CSA_DDCT CSA_DEAD_DOUBLE_ACUTE +#define CSA_DEAD_CARON GR2A(LSFT(CSA_E_GRAVE)) // dead ˇ +#define CSA_DCAR CSA_DEAD_CARON +#define CSA_DEAD_BREVE GR2A(LSFT(CSA_A_GRAVE)) // dead ˘ +#define CSA_DBRV CSA_DEAD_BREVE // Fourth row -#define CSA_LEFT_QUOTE LSFT(GR2A(KC_V)) // ‘ +#define CSA_BROKEN_PIPE GR2A(LSFT(CSA_U_GRAVE)) // ¦ +#define CSA_BPIP CSA_BROKEN_PIPE +#define CSA_COPYRIGHT GR2A(LSFT(KC_C)) // © +#define CSA_CPRT CSA_COPYRIGHT +#define CSA_LEFT_QUOTE GR2A(LSFT(KC_V)) // ‘ #define CSA_LQOT CSA_LEFT_QUOTE -#define CSA_RIGHT_QUOTE LSFT(GR2A(KC_B)) // ’ +#define CSA_RIGHT_QUOTE GR2A(LSFT(KC_B)) // ’ #define CSA_RQOT CSA_RIGHT_QUOTE +#define CSA_EIGHTH_NOTE GR2A(LSFT(KC_N)) // ♪ +#define CSA_8NOT CSA_EIGHTH_NOTE +#define CSA_ORDINAL_INDICATOR_O GR2A(LSFT(KC_M)) // º +#define CSA_ORDO CSA_ORDINAL_INDICATOR_O +#define CSA_TIMES GR2A(LSFT(KC_COMMA)) // × +#define CSA_TIMS CSA_TIMES +#define CSA_OBELUS GR2A(LSFT(KC_DOT)) // ÷ +#define CSA_OBEL CSA_OBELUS +// more conventional name of the symbol +#define CSA_DIVISION_SIGN CSA_OBELUS +#define CSA_DVSN CSA_DIVISION_SIGN +// TODO GR2A(LSFT(CSA_E_ACUTE)) #endif From 6c672dfdc6f3a9e7df79462d79c34e5750a72edf Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Tue, 8 Mar 2016 22:06:27 +0100 Subject: [PATCH 13/34] =?UTF-8?q?B=C3=89PO=20over=20CSA:=20Altgr-shifted?= =?UTF-8?q?=20layer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - all characters available directly in CSA - more explicit names for macros that switch accross CSA layers - use macros to implement the shifts next to the spaces --- keyboard/ergodox_ez/keymaps/bepo/keymap.c | 110 +++++++++++++++++----- 1 file changed, 88 insertions(+), 22 deletions(-) diff --git a/keyboard/ergodox_ez/keymaps/bepo/keymap.c b/keyboard/ergodox_ez/keymaps/bepo/keymap.c index e339792b..2b76fea2 100644 --- a/keyboard/ergodox_ez/keymaps/bepo/keymap.c +++ b/keyboard/ergodox_ez/keymaps/bepo/keymap.c @@ -27,8 +27,10 @@ enum macros { UC_ELPS, // … END_UC, // indicates the last unicode character macro // other macros - M_TGCM, // toggle CA-mult - M_CMSFT, // toggle shift on CA-mult + M_TGCSA, // toggle BÉPO over CSA + M_CSA_SFT, // toggle shift on CSA + M_CSA_AGR_SFT, // toggle shift on LR_CSA_AGR (goes to LR_CSA_AGR_SFT) + M_CSA_SFT_AGR, // toggle AltGr on LR_CSA_SFT (goes to LR_CSA_AGR_SFT) // macros for characters that need to be un-shifted in LR_CA_MULT_SHIFT M_1, M_2, @@ -51,14 +53,16 @@ enum macros { M_FNLR, }; +#define CSA(name) M(M_CSA_##name) // calls a CSA macro + const uint16_t unicode_chars[] = { [UC_NDSH] = L'–', [UC_MDSH] = L'—', [UC_ELPS] = L'…', }; -/* shortcut for unicod character macros */ -#define MUC(name) M(UC_##name) +/* shortcut for unicode character macros */ +#define MUC(name) M(UC_##name) // calls a unicode macro const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Basic layer @@ -115,23 +119,23 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_DLR, CSA_DQOT, CSA_LGIL, CSA_RGIL, KC_LPRN, KC_RPRN, KC_DELT, KC_TAB, KC_B, CSA_ECUT, KC_P, KC_O, CSA_EGRV, KC_BSPC, KC_EQL, KC_A, KC_U, KC_I, KC_E, KC_COMM, - M(M_CMSFT), CSA_AGRV, KC_Y, KC_X, KC_DOT, KC_K, KC_ENT, + CSA(SFT), CSA_AGRV, KC_Y, KC_X, KC_DOT, KC_K, KC_ENT, KC_LCTL, M(M_FNLR), KC_LGUI, KC_MPLY, ALT_T(KC_APP), ALT_T(KC_ESC), TG(LR_NUMR), KC_PGUP, - KC_SPC, KC_LSFT, KC_PGDN, + KC_SPC, CSA(SFT), KC_PGDN, // right hand KC_DELT, KC_AT, KC_PLUS, KC_MINS, CSA_SLSH, KC_ASTR, KC_W, KC_BSPC, CSA_DCRC, KC_V, KC_D, KC_L, KC_J, KC_Z, KC_C, KC_T, KC_S, KC_R, KC_N, KC_M, - KC_ENT, CSA_APOS, KC_Q, KC_G, KC_H, KC_F, M(M_CMSFT), + KC_ENT, CSA_APOS, KC_Q, KC_G, KC_H, KC_F, CSA(SFT), MO(LR_CSA_AGR), KC_PERC, KC_HOME, CSA_CCED, CTL_T(KC_END), KC_LEFT, KC_RGHT, KC_UP, - KC_DOWN, KC_RSFT, KC_SPC + KC_DOWN, CSA(SFT), KC_SPC ), /* Shifted BÉPO over Canadian Multilingual * @@ -171,7 +175,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, KC_EXLM, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, CSA_QEST, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, M(M_GRV), KC_TRNS, KC_TRNS, KC_TRNS, + CSA(SFT_AGR), M(M_GRV), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, @@ -201,26 +205,71 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [LR_CSA_AGR] = KEYMAP( // left hand - MUC(NDSH), MUC(MDSH), CSA_LESS, CSA_GRTR, CSA_LBRC, CSA_RBRC, KC_TRNS, - KC_TRNS, CSA_PIPE, CSA_DACT, KC_AMPR, CSA_OE, CSA_DGRV, KC_TRNS, - KC_NO, CSA_AE, CSA_UGRV, CSA_DTRM, CSA_EURO, CSA_RQOT, - KC_TRNS, CSA_BSLS, CSA_LCBR, CSA_RCBR, MUC(ELPS), CSA_TILD, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + MUC(NDSH), MUC(MDSH), CSA_LESS, CSA_GRTR, CSA_LBRC, CSA_RBRC, KC_TRNS, + KC_TRNS, CSA_PIPE, CSA_DACT, KC_AMPR, CSA_OE, CSA_DGRV, KC_TRNS, + KC_NO, CSA_AE, CSA_UGRV, CSA_DTRM, CSA_EURO, CSA_RQOT, + CSA(AGR_SFT), CSA_BSLS, CSA_LCBR, CSA_RCBR, MUC(ELPS), CSA_TILD, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_UNDS, KC_TRNS, KC_TRNS, + KC_UNDS, CSA(AGR_SFT), KC_TRNS, // right hand KC_TRNS, M(M_CRC), CSA_PSMS, KC_NO, CSA_DVSN, CSA_TIMS, CSA_DBRV, KC_TRNS, CSA_IXLM, CSA_DCAR, CSA_ETH, KC_NO, CSA_IJ, KC_NO, CSA_CPRT, CSA_THRN, CSA_SRPS, CSA_RTM, CSA_DTLD, CSA_DMCR, - KC_TRNS, CSA_IQST, CSA_DRNG, CSA_MU, KC_NO, CSA_DOGO, KC_TRNS, + KC_TRNS, CSA_IQST, CSA_DRNG, CSA_MU, KC_NO, CSA_DOGO, CSA(AGR_SFT), KC_TRNS, KC_NO, KC_TRNS, CSA_DCED, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_UNDS + KC_TRNS, CSA(AGR_SFT), KC_UNDS + ), +/* AltGr-shifted BÉPO over Canadian Multilingual + * "////" indicates that the key is disabled (unsupported bépo character or unused in bépo) + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | ¶ | //// | “ | ” | //// | //// | | | | //// | ¬ | ¼ | ½ | ¾ | ////// | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | ¦ | ˝ | § | Œ | ` | | | | //// | //// | Ð | //// | IJ | ////// | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | ////// | Æ | Ù |dead-˙| //// | //// |------| |------| //// | Þ | ẞ | ™ | //// | º | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | //// | ‘ | ’ | //// | //// | | | | //// | //// | //// | //// | ª | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | | | | | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + */ +[LR_CSA_AGR_SFT] = KEYMAP( + // left hand + CSA_PARG, KC_NO, CSA_LDQT, CSA_RDQT, KC_NO, KC_NO, KC_TRNS, + KC_TRNS, CSA_BPIP, CSA_DDCT, CSA_SECT, S(CSA_OE), M(M_GRV), KC_TRNS, + KC_NO, S(CSA_AE), S(CSA_UGRV), CSA_DDTA, KC_NO, KC_NO, + CSA(AGR_SFT), KC_NO, CSA_LQOT, CSA_RQOT, KC_NO, KC_NO, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, CSA(AGR_SFT), KC_TRNS, + + // right hand + KC_TRNS, KC_NO, CSA_NEGT, CSA_1QRT, CSA_1HLF, CSA_3QRT, KC_NO, + KC_TRNS, KC_NO, KC_NO, S(CSA_ETH), KC_NO, S(CSA_IJ), KC_NO, + KC_NO, S(CSA_THRN), S(CSA_SRPS), CSA_TM, KC_NO, CSA_ORDO, + KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, CSA_ORDA, CSA(AGR_SFT), + CSA(SFT_AGR), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, CSA(AGR_SFT), KC_TRNS ), /* Numeric Layer * @@ -289,7 +338,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ // MEDIA AND MOUSE [LR_FN] = KEYMAP( - M(M_TGCM), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_INS, + M(M_TGCSA), 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, RESET, KC_TRNS, KC_TRNS, KC_CALC, KC_MAIL, KC_WHOM, KC_TRNS, KC_TRNS, LSFT(KC_DELT),LCTL(KC_INS),LSFT(KC_INS), KC_MUTE, KC_VOLD, @@ -359,20 +408,37 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) send_unicode(unicode_chars[id]); } break; - case M_TGCM: + case M_TGCSA: if (record->event.pressed) { default_layer_xor(1 << LR_CSA); } break; - case M_CMSFT: + case M_CSA_SFT: + // BÉPO over CSA: toggle shift layer + layer_invert(LR_CSA_SFT); if (record->event.pressed) { - layer_on(LR_CSA_SFT); hold_shift(); } else { release_shift(); - layer_off(LR_CSA_SFT); } break; + case M_CSA_SFT_AGR: + // BÉPO over CSA: from shift layer, momentary altgr+shift layer + layer_invert(LR_CSA_AGR); + layer_invert(LR_CSA_AGR_SFT); + if (record->event.pressed) { + // shift not needed for LR_CSA_AGR_SFT + release_shift(); + } else { + // back to shift layer + hold_shift(); + } + break; + case M_CSA_AGR_SFT: + // BÉPO over CSA: from altgr layer, momentary altgr+shift layer + layer_invert(LR_CSA_SFT); + layer_invert(LR_CSA_AGR_SFT); + break; case M_1 ... M_0: case M_DEGR: case M_SCLN: From 89b647fe2b345fd26940508784482d37148ddc45 Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Sun, 13 Mar 2016 19:02:43 +0100 Subject: [PATCH 14/34] Replace Play by temporary num layer with left Alt - move play on fn+left thumb - move prev/next besides play --- keyboard/ergodox_ez/keymaps/bepo/keymap.c | 51 ++++++++++++++--------- 1 file changed, 31 insertions(+), 20 deletions(-) diff --git a/keyboard/ergodox_ez/keymaps/bepo/keymap.c b/keyboard/ergodox_ez/keymaps/bepo/keymap.c index 2b76fea2..a37ce7f3 100644 --- a/keyboard/ergodox_ez/keymaps/bepo/keymap.c +++ b/keyboard/ergodox_ez/keymaps/bepo/keymap.c @@ -49,8 +49,9 @@ enum macros { // macros for characters that don't have a simple key combination in LR_CA_MULT_ALTGR M_CRC, // other layer macros - M_DBL0, - M_FNLR, + M_DBL0, // double 0 + M_FNLR, // fn layer + M_NMAL, // num+alt }; #define CSA(name) M(M_CSA_##name) // calls a CSA macro @@ -76,7 +77,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |--------+------+------+------+------+------|Enter | |Enter |------+------+------+------+------+--------| * | LShift | À | Y | X | . | K | | | | ' | Q | G | H | F | RShift | * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' - * |LCtrl | fn | LGui | Play |App/Alt| |Alt Gr| % | Home | Ç |End/Ctl| + * |LCtrl | fn | LGui |numAlt|App/Alt| |Alt Gr| % | Home | Ç |End/Ctl| * `-----------------------------------' `-----------------------------------' * ,--------------. ,-------------. * |Esc/Alt| num | | Left |Right | @@ -90,11 +91,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // Otherwise, it needs KC_* [LR_BASE] = KEYMAP( // layer 0 : default // left hand - BP_DLR, KC_1, KC_2, KC_3, KC_4, KC_5, KC_DELT, - KC_TAB, BP_B, BP_ECUT, BP_P, BP_O, BP_EGRV, KC_BSPC, - BP_EQL, BP_A, BP_U, BP_I, BP_E, BP_COMM, - KC_LSFT, BP_AGRV, BP_Y, BP_X, BP_DOT, BP_K, KC_ENT, - KC_LCTL, M(M_FNLR), KC_LGUI, KC_MPLY, ALT_T(KC_APP), + BP_DLR, KC_1, KC_2, KC_3, KC_4, KC_5, KC_DELT, + KC_TAB, BP_B, BP_ECUT, BP_P, BP_O, BP_EGRV, KC_BSPC, + BP_EQL, BP_A, BP_U, BP_I, BP_E, BP_COMM, + KC_LSFT, BP_AGRV, BP_Y, BP_X, BP_DOT, BP_K, KC_ENT, + KC_LCTL, M(M_FNLR), KC_LGUI, M(M_NMAL), ALT_T(KC_APP), ALT_T(KC_ESC), TG(LR_NUMR), KC_PGUP, @@ -120,7 +121,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TAB, KC_B, CSA_ECUT, KC_P, KC_O, CSA_EGRV, KC_BSPC, KC_EQL, KC_A, KC_U, KC_I, KC_E, KC_COMM, CSA(SFT), CSA_AGRV, KC_Y, KC_X, KC_DOT, KC_K, KC_ENT, - KC_LCTL, M(M_FNLR), KC_LGUI, KC_MPLY, ALT_T(KC_APP), + KC_LCTL, M(M_FNLR), KC_LGUI, M(M_NMAL), ALT_T(KC_APP), ALT_T(KC_ESC), TG(LR_NUMR), KC_PGUP, @@ -304,6 +305,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, + // right hand KC_TRNS, 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, @@ -331,22 +333,23 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * ,-------------. ,-------------. * | | | | | | * ,------|------|------| |------+------+------. - * | | | | | Next | | | - * | Mute | |------| |------| | | - * | | | | | Prev | | | + * | | | Next | | | | | + * | Mute | play |------| |------| | | + * | | | Prev | | | | | * `--------------------' `--------------------' */ // MEDIA AND MOUSE [LR_FN] = KEYMAP( M(M_TGCSA), 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, - RESET, KC_TRNS, KC_TRNS, KC_CALC, KC_MAIL, KC_WHOM, - 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_VOLU, + RESET, KC_TRNS, KC_TRNS, KC_CALC, KC_MAIL, KC_WHOM, + KC_TRNS, KC_TRNS, S(KC_DELT), LCTL(KC_INS),S(KC_INS), KC_MUTE, KC_VOLD, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, - KC_MUTE, KC_TRNS, KC_TRNS, + KC_MPRV, + KC_MUTE, KC_MPLY, KC_MNXT, + // right hand 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, @@ -355,8 +358,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_MPRV, - KC_MNXT, KC_TRNS, KC_TRNS + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS ), }; @@ -492,6 +495,14 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) layer_invert(LR_NUMR); layer_invert(LR_FN); break; + case M_NMAL: + layer_invert(LR_NUMR); + if (record->event.pressed) { + register_code(KC_LALT); + } else { + unregister_code(KC_LALT); + } + break; } return MACRO_NONE; }; From 4e25342b417b64e0830886407f3842b68198f8d1 Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Sun, 13 Mar 2016 19:17:37 +0100 Subject: [PATCH 15/34] =?UTF-8?q?Use=20TG()=20to=20switch=20to=20B=C3=89PO?= =?UTF-8?q?=20over=20CSA,=20and=20use=20KC=5FTRNS=20in=20LR=5FCSA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Simplifies future changes to modifier and special keys + removed M_TGCSA macro --- keyboard/ergodox_ez/keymaps/bepo/keymap.c | 42 ++++++++++------------- 1 file changed, 18 insertions(+), 24 deletions(-) diff --git a/keyboard/ergodox_ez/keymaps/bepo/keymap.c b/keyboard/ergodox_ez/keymaps/bepo/keymap.c index a37ce7f3..bdb73544 100644 --- a/keyboard/ergodox_ez/keymaps/bepo/keymap.c +++ b/keyboard/ergodox_ez/keymaps/bepo/keymap.c @@ -17,7 +17,7 @@ enum layers { LR_FN, // fn layer }; -#define IS_CA_MULT_ENABLED() (default_layer_state & (1 << LR_CSA)) +#define IS_CA_MULT_ENABLED() (layer_state & (1 << LR_CSA)) enum macros { // Characters that do not exist in CSA and must be implemented based on unicode support @@ -27,7 +27,6 @@ enum macros { UC_ELPS, // … END_UC, // indicates the last unicode character macro // other macros - M_TGCSA, // toggle BÉPO over CSA M_CSA_SFT, // toggle shift on CSA M_CSA_AGR_SFT, // toggle shift on LR_CSA_AGR (goes to LR_CSA_AGR_SFT) M_CSA_SFT_AGR, // toggle AltGr on LR_CSA_SFT (goes to LR_CSA_AGR_SFT) @@ -117,26 +116,26 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [LR_CSA] = KEYMAP( // left hand - KC_DLR, CSA_DQOT, CSA_LGIL, CSA_RGIL, KC_LPRN, KC_RPRN, KC_DELT, - KC_TAB, KC_B, CSA_ECUT, KC_P, KC_O, CSA_EGRV, KC_BSPC, - KC_EQL, KC_A, KC_U, KC_I, KC_E, KC_COMM, - CSA(SFT), CSA_AGRV, KC_Y, KC_X, KC_DOT, KC_K, KC_ENT, - KC_LCTL, M(M_FNLR), KC_LGUI, M(M_NMAL), ALT_T(KC_APP), + KC_DLR, CSA_DQOT, CSA_LGIL, CSA_RGIL, KC_LPRN, KC_RPRN, KC_TRNS, + KC_TRNS, KC_B, CSA_ECUT, KC_P, KC_O, CSA_EGRV, KC_TRNS, + KC_EQL, KC_A, KC_U, KC_I, KC_E, KC_COMM, + CSA(SFT), CSA_AGRV, KC_Y, KC_X, KC_DOT, KC_K, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - ALT_T(KC_ESC), TG(LR_NUMR), - KC_PGUP, - KC_SPC, CSA(SFT), KC_PGDN, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, // right hand - KC_DELT, KC_AT, KC_PLUS, KC_MINS, CSA_SLSH, KC_ASTR, KC_W, - KC_BSPC, CSA_DCRC, KC_V, KC_D, KC_L, KC_J, KC_Z, - KC_C, KC_T, KC_S, KC_R, KC_N, KC_M, - KC_ENT, CSA_APOS, KC_Q, KC_G, KC_H, KC_F, CSA(SFT), - MO(LR_CSA_AGR), KC_PERC, KC_HOME, CSA_CCED, CTL_T(KC_END), + KC_TRNS, KC_AT, KC_PLUS, KC_MINS, CSA_SLSH, KC_ASTR, KC_W, + KC_TRNS, CSA_DCRC, KC_V, KC_D, KC_L, KC_J, KC_Z, + KC_C, KC_T, KC_S, KC_R, KC_N, KC_M, + KC_TRNS, CSA_APOS, KC_Q, KC_G, KC_H, KC_F, CSA(SFT), + MO(LR_CSA_AGR), KC_PERC, KC_TRNS, CSA_CCED, KC_TRNS, - KC_LEFT, KC_RGHT, - KC_UP, - KC_DOWN, CSA(SFT), KC_SPC + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, CSA(SFT), KC_TRNS ), /* Shifted BÉPO over Canadian Multilingual * @@ -340,7 +339,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ // MEDIA AND MOUSE [LR_FN] = KEYMAP( - M(M_TGCSA), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_INS, + TG(LR_CSA), 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, RESET, KC_TRNS, KC_TRNS, KC_CALC, KC_MAIL, KC_WHOM, KC_TRNS, KC_TRNS, S(KC_DELT), LCTL(KC_INS),S(KC_INS), KC_MUTE, KC_VOLD, @@ -411,11 +410,6 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) send_unicode(unicode_chars[id]); } break; - case M_TGCSA: - if (record->event.pressed) { - default_layer_xor(1 << LR_CSA); - } - break; case M_CSA_SFT: // BÉPO over CSA: toggle shift layer layer_invert(LR_CSA_SFT); From 4289ff793938bbfa2d85c0022bc765bba3eb1347 Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Sun, 13 Mar 2016 19:38:58 +0100 Subject: [PATCH 16/34] Removed remaining ALT_T and CTL_T keys Having "true" modifiers is more reliable and practical. - moved APP in place of HOME - moved HOME in place of LSFT on left thumb - moved END in place of RSFT on right thumb (Ctrl+End with single hand!) - removed ALT_T from KC_ESC --- keyboard/ergodox_ez/keymaps/bepo/keymap.c | 32 +++++++++++------------ 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/keyboard/ergodox_ez/keymaps/bepo/keymap.c b/keyboard/ergodox_ez/keymaps/bepo/keymap.c index bdb73544..cd7d24ee 100644 --- a/keyboard/ergodox_ez/keymaps/bepo/keymap.c +++ b/keyboard/ergodox_ez/keymaps/bepo/keymap.c @@ -76,13 +76,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |--------+------+------+------+------+------|Enter | |Enter |------+------+------+------+------+--------| * | LShift | À | Y | X | . | K | | | | ' | Q | G | H | F | RShift | * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' - * |LCtrl | fn | LGui |numAlt|App/Alt| |Alt Gr| % | Home | Ç |End/Ctl| - * `-----------------------------------' `-----------------------------------' + * |LCtrl | fn | LGui |numAlt| LAlt | |Alt Gr| % | App | Ç | RCtrl| + * `----------------------------------' `----------------------------------' * ,--------------. ,-------------. - * |Esc/Alt| num | | Left |Right | + * | Esc | num | | Left |Right | * ,------+-------+------| |------+------+------. * | | | PgUp | | Up | | | - * |Space |LShift |------| |------|RShift|Space | + * |Space | Home |------| |------| End |Space | * | | | PgDn | | Down | | | * `---------------------' `--------------------' */ @@ -90,26 +90,26 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // Otherwise, it needs KC_* [LR_BASE] = KEYMAP( // layer 0 : default // left hand - BP_DLR, KC_1, KC_2, KC_3, KC_4, KC_5, KC_DELT, - KC_TAB, BP_B, BP_ECUT, BP_P, BP_O, BP_EGRV, KC_BSPC, - BP_EQL, BP_A, BP_U, BP_I, BP_E, BP_COMM, - KC_LSFT, BP_AGRV, BP_Y, BP_X, BP_DOT, BP_K, KC_ENT, - KC_LCTL, M(M_FNLR), KC_LGUI, M(M_NMAL), ALT_T(KC_APP), + BP_DLR, KC_1, KC_2, KC_3, KC_4, KC_5, KC_DELT, + KC_TAB, BP_B, BP_ECUT, BP_P, BP_O, BP_EGRV, KC_BSPC, + BP_EQL, BP_A, BP_U, BP_I, BP_E, BP_COMM, + KC_LSFT, BP_AGRV, BP_Y, BP_X, BP_DOT, BP_K, KC_ENT, + KC_LCTL, M(M_FNLR), KC_LGUI, M(M_NMAL), KC_LALT, - ALT_T(KC_ESC), TG(LR_NUMR), - KC_PGUP, - KC_SPC, KC_LSFT, KC_PGDN, + KC_ESC, TG(LR_NUMR), + KC_PGUP, + KC_SPC, KC_HOME, KC_PGDN, // right hand KC_DELT, KC_6, KC_7, KC_8, KC_9, KC_0, BP_W, KC_BSPC, BP_DCRC, BP_V, BP_D, BP_L, BP_J, BP_Z, BP_C, BP_T, BP_S, BP_R, BP_N, BP_M, KC_ENT, BP_APOS, BP_Q, BP_G, BP_H, BP_F, KC_RSFT, - BP_ALGR, BP_PERC, KC_HOME, BP_CCED, CTL_T(KC_END), + BP_ALGR, BP_PERC, KC_APP, BP_CCED, KC_RCTL, KC_LEFT, KC_RGHT, KC_UP, - KC_DOWN, KC_RSFT, KC_SPC + KC_DOWN, KC_END, KC_SPC ), /** * Same as default but for use with Canadian Multilingual on OS side @@ -131,11 +131,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, CSA_DCRC, KC_V, KC_D, KC_L, KC_J, KC_Z, KC_C, KC_T, KC_S, KC_R, KC_N, KC_M, KC_TRNS, CSA_APOS, KC_Q, KC_G, KC_H, KC_F, CSA(SFT), - MO(LR_CSA_AGR), KC_PERC, KC_TRNS, CSA_CCED, KC_TRNS, + MO(LR_CSA_AGR), KC_PERC, KC_TRNS, CSA_CCED, KC_LCTL, // RCTL has a special behaviour in CSA so use LCTL KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, CSA(SFT), KC_TRNS + KC_TRNS, KC_TRNS, KC_TRNS ), /* Shifted BÉPO over Canadian Multilingual * From 5bc69c5b0a25d12aa8d96c58b01304453d5ccbd6 Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Wed, 6 Apr 2016 00:09:03 +0200 Subject: [PATCH 17/34] Fixed compilation issues --- keyboard/ergodox_ez/keymaps/bepo/keymap.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/keyboard/ergodox_ez/keymaps/bepo/keymap.c b/keyboard/ergodox_ez/keymaps/bepo/keymap.c index cd7d24ee..339faf57 100644 --- a/keyboard/ergodox_ez/keymaps/bepo/keymap.c +++ b/keyboard/ergodox_ez/keymaps/bepo/keymap.c @@ -502,12 +502,11 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) }; // Runs just one time when the keyboard initializes. -void * matrix_init_user(void) { - return NULL; +void matrix_init_user(void) { }; // Runs constantly in the background, in a loop. -void * matrix_scan_user(void) { +void matrix_scan_user(void) { ergodox_board_led_off(); ergodox_right_led_1_off(); @@ -525,5 +524,4 @@ void * matrix_scan_user(void) { if (host_keyboard_leds() & (1< Date: Wed, 6 Apr 2016 00:13:18 +0200 Subject: [PATCH 18/34] Add delay to CSA macros using dead keys MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit With the BÉPO over CSA on Windows, the dead keys stop working after a while, like in http://superuser.com/questions/776558/suddenly-dead-keys-dont-work I suspect this is triggered by too fast typing from macros. --- keyboard/ergodox_ez/keymaps/bepo/keymap.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/keyboard/ergodox_ez/keymaps/bepo/keymap.c b/keyboard/ergodox_ez/keymaps/bepo/keymap.c index 339faf57..7fac3597 100644 --- a/keyboard/ergodox_ez/keymaps/bepo/keymap.c +++ b/keyboard/ergodox_ez/keymaps/bepo/keymap.c @@ -453,7 +453,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) case M_SCLN: return MACRO(D(SCLN), END); case M_GRV: - return MACRO(DOWN(CSA_ALTGR), TYPE(CSA_DCRC), UP(CSA_ALTGR), T(SPACE), END); + return MACRO(I(75), DOWN(CSA_ALTGR), TYPE(CSA_DCRC), UP(CSA_ALTGR), T(SPACE), END); case M_NBSP: // use weak mod such that pressing another key will not be affected add_weak_mods(MOD_BIT(CSA_ALTGR)); @@ -477,7 +477,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) break; case M_CRC: if (record->event.pressed) { - return MACRO(TYPE(CSA_DCRC), T(SPACE), END); + return MACRO(I(75), TYPE(CSA_DCRC), T(SPACE), END); } break; case M_DBL0: From db35212422f228cd9ddf68b61f47380fe1842e83 Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Wed, 6 Apr 2016 00:13:18 +0200 Subject: [PATCH 19/34] Removed D(LSFT) is CSA macros Were causing stuck LSFT weak mods. --- keyboard/ergodox_ez/keymaps/bepo/keymap.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/keyboard/ergodox_ez/keymaps/bepo/keymap.c b/keyboard/ergodox_ez/keymaps/bepo/keymap.c index 7fac3597..8d776198 100644 --- a/keyboard/ergodox_ez/keymaps/bepo/keymap.c +++ b/keyboard/ergodox_ez/keymaps/bepo/keymap.c @@ -466,9 +466,9 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) unregister_code(KC_1 + (id - M_1)); break; case M_DEGR: - return MACRO(UP(CSA_ALTGR), D(LSFT), U(SCLN), END); + return MACRO(UP(CSA_ALTGR), U(SCLN), END); case M_SCLN: - return MACRO(D(LSFT), U(SCLN), END); + return MACRO(U(SCLN), END); case M_NBSP: del_weak_mods(MOD_BIT(CSA_ALTGR)); return MACRO(U(SPACE), END); From 8d6bbf2757d7dc085b0765feda8d67b48c6c8f8b Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Wed, 6 Apr 2016 00:19:12 +0200 Subject: [PATCH 20/34] Fix issue #221: LGUI(KC_LSFT) does not work - on mod keys, register LGUI, LSFT etc. as normal mods instead of weak mods: - they won't be cleared by layer switching - LSFT(KC_LGUI) will now have the same behavior as LGUI(KC_LSFT) --- tmk_core/common/action.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/tmk_core/common/action.c b/tmk_core/common/action.c index 2ccc0e0b..90108963 100644 --- a/tmk_core/common/action.c +++ b/tmk_core/common/action.c @@ -88,14 +88,24 @@ void process_action(keyrecord_t *record) action.key.mods<<4; if (event.pressed) { if (mods) { - add_weak_mods(mods); + if (IS_MOD(action.key.code)) { + // e.g. LSFT(KC_LGUI): we don't want the LSFT to be weak as it would make it useless. + // this also makes LSFT(KC_LGUI) behave exactly the same as LGUI(KC_LSFT) + add_mods(mods); + } else { + add_weak_mods(mods); + } send_keyboard_report(); } register_code(action.key.code); } else { unregister_code(action.key.code); if (mods) { - del_weak_mods(mods); + if (IS_MOD(action.key.code)) { + del_mods(mods); + } else { + del_weak_mods(mods); + } send_keyboard_report(); } } From e5396ca9e5ccb714a757b6559c9f7e95bf372e3f Mon Sep 17 00:00:00 2001 From: Nathan Sharfi Date: Wed, 7 Sep 2016 18:23:01 -0700 Subject: [PATCH 21/34] zweihander: rename to Makefile --- .../ergodox/keymaps/zweihander-osx/{makefile.mk => Makefile} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename keyboards/ergodox/keymaps/zweihander-osx/{makefile.mk => Makefile} (100%) diff --git a/keyboards/ergodox/keymaps/zweihander-osx/makefile.mk b/keyboards/ergodox/keymaps/zweihander-osx/Makefile similarity index 100% rename from keyboards/ergodox/keymaps/zweihander-osx/makefile.mk rename to keyboards/ergodox/keymaps/zweihander-osx/Makefile From 273a6cc688ef4c8f7964d8c62147c8697db42cde Mon Sep 17 00:00:00 2001 From: Nathan Sharfi Date: Wed, 7 Sep 2016 20:28:31 -0700 Subject: [PATCH 22/34] =?UTF-8?q?-=20Make=20thumb-accessible=20=E2=8C=A5?= =?UTF-8?q?=20and=20=E2=8C=83=20into=20right-=E2=8C=A5=20and=20right-?= =?UTF-8?q?=E2=8C=83=20-=20remove=20media-space=20and=20media-shift-space;?= =?UTF-8?q?=20put=20a=20play/pause=20key=20at=20media-m=20instead=20-=20ad?= =?UTF-8?q?d=20print=20screen,=20scroll=20lock,=20and=20pause/break=20to?= =?UTF-8?q?=20the=20media=20layer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit And in the readme: - don't say we don't have any Windows-specific keys - add mnemonics for thumb-alt and thumb-ctrl positioning --- keyboards/ergodox/keymaps/zweihander-osx/keymap.c | 14 +++++++------- .../ergodox/keymaps/zweihander-osx/readme.markdown | 8 +++++--- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/keyboards/ergodox/keymaps/zweihander-osx/keymap.c b/keyboards/ergodox/keymaps/zweihander-osx/keymap.c index d6d66fd5..725a73e3 100644 --- a/keyboards/ergodox/keymaps/zweihander-osx/keymap.c +++ b/keyboards/ergodox/keymaps/zweihander-osx/keymap.c @@ -32,7 +32,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * ,------|------|------| |------+--------+------. * | | | PgUp | | PgDn | | | * | | ⇥ |------| |------| ⇥ |Enter | - * | | | L⌥ | | L⌃ | | | + * | | | R⌥ | | R⌃ | | | * `--------------------' `----------------------' */ // If it accepts an argument (i.e, is a function), it doesn't need KC_. @@ -46,7 +46,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LCTL, KC_LALT, KC_LGUI,KC_LEFT,KC_RGHT, KC_GRV, KC_QUOT, KC_PGUP, - KC_SPC,KC_TAB ,KC_LALT, + KC_SPC,KC_TAB ,KC_RALT, // right hand TG(SYMB), KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, MO(SYMB), KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, @@ -55,7 +55,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_UP, KC_DOWN,KC_LBRC,KC_RBRC, KC_SPC , KC_ESC, KC_BSPC, KC_PGDN, - KC_LCTL, KC_TAB, KC_ENT + KC_RCTL, KC_TAB, KC_ENT ), /* Keymap 1: Symbol Layer * @@ -102,13 +102,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Keymap 2: Media keys * * ,--------------------------------------------------. ,--------------------------------------------------. - * | | F14 | F15 | | | | | | ⌘Q | ⌘W | ⌘⇧` | ⌘` | | | Power | + * | | F14 | F15 |PrtScr|SclLck| Pause| | | ⌘Q | ⌘W | ⌘⇧` | ⌘` | | | Power | * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| * | | | | PgUp |⌘S⌘⇥⌘R| Term | | | | ⌘] | ⌥⌘↑ | ↑ | ⌥⌘↓ | | | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| * | | |Safari| PgDn | | |------| |------| ⌘[ | ← | ↓ | → | | ⏯ | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | | | | |BBEdit| | | |L⇧+Spc| Spc | ⏮ | ⏭ | | | + * | | | | | |BBEdit| | | | | ⏯ | ⏮ | ⏭ | | | * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' * | | | | | | |VolUp |VolDn | Mute | | | * `----------------------------------' `----------------------------------' @@ -122,7 +122,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ // MEDIA AND MOUSE [MDIA] = KEYMAP( - KC_TRNS, KC_F14 , KC_F15 , KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, /* F14 dims screen, F15 brightens */ + KC_TRNS, KC_F14 , KC_F15 , KC_PSCR, KC_SLCK, KC_PAUS, KC_TRNS, /* F14 dims screen, F15 brightens */ KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, M(SGWF), M(TMNL), KC_TRNS, KC_TRNS, KC_TRNS, M(SAFA), KC_PGDN, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, M(BBED), KC_TRNS, @@ -134,7 +134,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { LGUI(KC_Q), LGUI(KC_W), LGUI(LSFT(KC_GRV)), LGUI(KC_GRV), KC_TRNS, KC_TRNS, KC_PWR , KC_TRNS, LGUI(KC_RBRC), LGUI(LALT(KC_UP)), KC_UP , LGUI(LALT(KC_DOWN)), KC_TRNS, KC_TRNS, LGUI(KC_LBRC), KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_MPLY, - KC_TRNS, LSFT(KC_SPC), KC_SPC , KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_MPLY, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS, KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_END , diff --git a/keyboards/ergodox/keymaps/zweihander-osx/readme.markdown b/keyboards/ergodox/keymaps/zweihander-osx/readme.markdown index 3b7f5294..5125a12e 100644 --- a/keyboards/ergodox/keymaps/zweihander-osx/readme.markdown +++ b/keyboards/ergodox/keymaps/zweihander-osx/readme.markdown @@ -7,7 +7,7 @@ This layout is tuned for people who… ## use OS X -This layout doesn’t make any concessions for Windows use. While it should work fine in Windows, I’m not about to devote precious keyboard space to Windows-specific shortcuts. +While this layout should work fine in Windows, it’s not tuned for it. No sane person who primarily uses Windows would put this many Windows keys on a keyboard layout. ## mouse left-handed while doing other things with the right hand @@ -21,8 +21,6 @@ I tend to have my mouse in my left hand, but I like to use my other hand to make - Go Up and Close Just-Left Folder (⌥⌘↑) - Cycle through open windows in current application (⌘\` and ⌘⇧\`) - Cycle through tabs in current window (⌥⇥ and ⌥⇧⇥) -- Space (page down in browsers; Quick Look in the Finder) -- Shift-Space (page up in web browsers) Because moving letter-by-letter is way slower than moving word-by-word, I added Option (⌥) to the bottommost button on the left side. This key can be held easily while holding ; (activate media layer) and pressing J and L to move left and right by word. @@ -34,11 +32,15 @@ I wanted to preserve the feel of a number of shortcuts that involve pressing lot - Empty Trash Without Asking for Confirmation (⇧⌥⌘⌫) - Shut Down Without Asking for Confirmation (⇧⌥⌘ power) +⇧⌥⌘⌫, when you press the backspace on the right half of the keyboard, is much more satisfying than if you curl your left hand into a claw to press all the keys on the left. Try both; you’ll agree. + ## use Emacs-style shortcuts I press C-a, C-e, and C-k all the time. It’s difficult to press these key combinations with the control key on the bottom left and I’m too quick on the draw for the control function on the / key to work reliably, so the bottommost thumb button on the right side is another control key. +Having trouble remembering which thumb key is alt and which is ctrl? It’s like on the lower right of a normal keyboard — leftmost is alt, rightmost is ctrl. + ## use spreadsheets From 9c2015ea7f23a69c1c585b1b366df5cbfd3e93c7 Mon Sep 17 00:00:00 2001 From: Lars Date: Thu, 8 Sep 2016 23:20:17 -0500 Subject: [PATCH 23/34] first commit of Absenth's Ergodox Firmware --- .../keymaps/absenth/absenth_highres.png | Bin 0 -> 1463041 bytes keyboards/ergodox/keymaps/absenth/keymap.c | 183 ++++++++++++++++++ keyboards/ergodox/keymaps/absenth/readme.md | 8 + 3 files changed, 191 insertions(+) create mode 100644 keyboards/ergodox/keymaps/absenth/absenth_highres.png create mode 100644 keyboards/ergodox/keymaps/absenth/keymap.c create mode 100644 keyboards/ergodox/keymaps/absenth/readme.md diff --git a/keyboards/ergodox/keymaps/absenth/absenth_highres.png b/keyboards/ergodox/keymaps/absenth/absenth_highres.png new file mode 100644 index 0000000000000000000000000000000000000000..c07aa8803fb611caea0f87c529739c61d084d432 GIT binary patch literal 1463041 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