diff options
| author | Didier Loiseau <didierloiseau+git@gmail.com> | 2016-02-17 21:45:38 +0100 |
|---|---|---|
| committer | Didier Loiseau <didierloiseau+git@gmail.com> | 2016-04-02 18:16:30 +0200 |
| commit | a7cef2ca0a2322448d02008337013936b1d550ec (patch) | |
| tree | bcf02dd1296a30b98125ca64a504d8f0a360a006 | |
| parent | b8ddbd21810951f64a081e4c3096bbc6aedc9aeb (diff) | |
| download | qmk_firmware-a7cef2ca0a2322448d02008337013936b1d550ec.tar.gz qmk_firmware-a7cef2ca0a2322448d02008337013936b1d550ec.zip | |
Initial BÉPO over CSA with Shift layer
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
| -rw-r--r-- | keyboard/ergodox_ez/keymaps/bepo/keymap.c | 159 | ||||
| -rw-r--r-- | quantum/keymap_extras/keymap_canadian_multilingual.h | 105 |
2 files changed, 262 insertions, 2 deletions
diff --git a/keyboard/ergodox_ez/keymaps/bepo/keymap.c b/keyboard/ergodox_ez/keymaps/bepo/keymap.c index 1cebf8c9e..ce887997e 100644 --- a/keyboard/ergodox_ez/keymaps/bepo/keymap.c +++ b/keyboard/ergodox_ez/keymaps/bepo/keymap.c | |||
| @@ -4,14 +4,39 @@ | |||
| 4 | #include "action_layer.h" | 4 | #include "action_layer.h" |
| 5 | #include "led.h" | 5 | #include "led.h" |
| 6 | #include "keymap_extras/keymap_bepo.h" | 6 | #include "keymap_extras/keymap_bepo.h" |
| 7 | #include "keymap_extras/keymap_canadian_multilingual.h" | ||
| 7 | 8 | ||
| 8 | enum layers { | 9 | enum layers { |
| 9 | LR_BASE, // default layer | 10 | LR_BASE, // default layer |
| 11 | LR_CSA, // BÉPO over Canadian Multilingual (CSA) | ||
| 12 | LR_CSA_SFT, // shifted BÉPO over CSA | ||
| 13 | LR_CSA_AGR, // altgr-ed BÉPO over CSA | ||
| 14 | LR_CSA_AGR_SFT, // altgr-shifted BÉPO over CSA | ||
| 10 | LR_NUMR, // numeric layer | 15 | LR_NUMR, // numeric layer |
| 11 | LR_FN, // fn layer | 16 | LR_FN, // fn layer |
| 12 | }; | 17 | }; |
| 13 | 18 | ||
| 19 | #define IS_CA_MULT_ENABLED() (default_layer_state & (1 << LR_CSA)) | ||
| 20 | |||
| 14 | enum macros { | 21 | enum macros { |
| 22 | M_TGCM, // toggle CA-mult | ||
| 23 | M_CMSFT, // toggle shift on CA-mult | ||
| 24 | // macros for characters that need to be un-shifted in LR_CA_MULT_SHIFT | ||
| 25 | M_1, | ||
| 26 | M_2, | ||
| 27 | M_3, | ||
| 28 | M_4, | ||
| 29 | M_5, | ||
| 30 | M_6, | ||
| 31 | M_7, | ||
| 32 | M_8, | ||
| 33 | M_9, | ||
| 34 | M_0, | ||
| 35 | M_DEGR, | ||
| 36 | M_SCLN, | ||
| 37 | M_GRV, | ||
| 38 | M_NBSP, | ||
| 39 | // other layer macros | ||
| 15 | M_DBL0, | 40 | M_DBL0, |
| 16 | M_FNLR, | 41 | M_FNLR, |
| 17 | }; | 42 | }; |
| @@ -63,6 +88,76 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
| 63 | KC_UP, | 88 | KC_UP, |
| 64 | KC_DOWN, KC_RSFT, KC_SPC | 89 | KC_DOWN, KC_RSFT, KC_SPC |
| 65 | ), | 90 | ), |
| 91 | /** | ||
| 92 | * Same as default but for use with Canadian Multilingual on OS side | ||
| 93 | */ | ||
| 94 | [LR_CSA] = KEYMAP( | ||
| 95 | // left hand | ||
| 96 | KC_DLR, CM_DQOT, CM_LGIL, CM_RGIL, KC_LPRN, KC_RPRN, KC_DELT, | ||
| 97 | KC_TAB, KC_B, CM_ECUT, KC_P, KC_O, CM_EGRV, KC_BSPC, | ||
| 98 | KC_EQL, KC_A, KC_U, KC_I, KC_E, KC_COMM, | ||
| 99 | M(M_CMSFT), CM_AGRV, KC_Y, KC_X, KC_DOT, KC_K, KC_ENT, | ||
| 100 | KC_LCTL, M(M_FNLR), KC_LGUI, KC_MPLY, ALT_T(KC_APP), | ||
| 101 | |||
| 102 | ALT_T(KC_ESC), TG(LR_NUMR), | ||
| 103 | KC_PGUP, | ||
| 104 | KC_SPC, KC_LSFT, KC_PGDN, | ||
| 105 | |||
| 106 | // right hand | ||
| 107 | KC_DELT, KC_AT, KC_PLUS, KC_MINS, CM_SLSH, KC_ASTR, KC_W, | ||
| 108 | KC_BSPC, CM_DCRC, KC_V, KC_D, KC_L, KC_J, KC_Z, | ||
| 109 | KC_C, KC_T, KC_S, KC_R, KC_N, KC_M, | ||
| 110 | KC_ENT, CM_APOS, KC_Q, KC_G, KC_H, KC_F, M(M_CMSFT), | ||
| 111 | CM_ALGR, KC_PERC, KC_HOME, CM_CCED, CTL_T(KC_END), | ||
| 112 | |||
| 113 | KC_LEFT, KC_RGHT, | ||
| 114 | KC_UP, | ||
| 115 | KC_DOWN, KC_RSFT, KC_SPC | ||
| 116 | ), | ||
| 117 | /* Shifted BÉPO over Canadian Multilingual | ||
| 118 | * | ||
| 119 | * ,--------------------------------------------------. ,--------------------------------------------------. | ||
| 120 | * | # | 1 | 2 | 3 | 4 | 5 | | | | 6 | 7 | 8 | 9 | 0 | | | ||
| 121 | * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| | ||
| 122 | * | | | | | | | | | | ! | | | | | | | ||
| 123 | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| | ||
| 124 | * | ° | | | | | ; |------| |------| | | | | | | | ||
| 125 | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| | ||
| 126 | * | | | | | : | | | | | ? | | | | | | | ||
| 127 | * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' | ||
| 128 | * | | | | | | | | ` | | | | | ||
| 129 | * `----------------------------------' `-----------------------------------' | ||
| 130 | * ,-------------. ,-------------. | ||
| 131 | * | | | | | | | ||
| 132 | * ,------|------|------| |------+------+------. | ||
| 133 | * | | | | | | | | | ||
| 134 | * | | |------| |------| | | | ||
| 135 | * | | | | | | | | | ||
| 136 | * `--------------------' `--------------------' | ||
| 137 | */ | ||
| 138 | [LR_CSA_SFT] = KEYMAP( | ||
| 139 | // left hand | ||
| 140 | KC_HASH, M(M_1), M(M_2), M(M_3), M(M_4), M(M_5), KC_TRNS, | ||
| 141 | KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, | ||
| 142 | M(M_DEGR),KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, M(M_SCLN), | ||
| 143 | KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_COLN, KC_TRNS, KC_TRNS, | ||
| 144 | KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, | ||
| 145 | |||
| 146 | KC_TRNS, KC_TRNS, | ||
| 147 | KC_TRNS, | ||
| 148 | M(M_NBSP), KC_TRNS, KC_TRNS, | ||
| 149 | |||
| 150 | // right hand | ||
| 151 | KC_TRNS, M(M_6), M(M_7), M(M_8), M(M_9), M(M_0), KC_TRNS, | ||
| 152 | KC_TRNS, KC_EXLM, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, | ||
| 153 | KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, | ||
| 154 | KC_TRNS, CM_QEST, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, | ||
| 155 | KC_TRNS, M(M_GRV), KC_TRNS, KC_TRNS, KC_TRNS, | ||
| 156 | |||
| 157 | KC_TRNS, KC_TRNS, | ||
| 158 | KC_TRNS, | ||
| 159 | KC_TRNS, KC_TRNS, M(M_NBSP) | ||
| 160 | ), | ||
| 66 | /* Numeric Layer | 161 | /* Numeric Layer |
| 67 | * | 162 | * |
| 68 | * ,--------------------------------------------------. ,--------------------------------------------------. | 163 | * ,--------------------------------------------------. ,--------------------------------------------------. |
| @@ -110,7 +205,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
| 110 | /* fn layer | 205 | /* fn layer |
| 111 | * | 206 | * |
| 112 | * ,--------------------------------------------------. ,--------------------------------------------------. | 207 | * ,--------------------------------------------------. ,--------------------------------------------------. |
| 113 | * | | | | | | |Insert| |Insert|Eject |Power |Sleep | Wake |PrtScr|ScrollLk| | 208 | * |~CA-mult| | | | | |Insert| |Insert|Eject |Power |Sleep | Wake |PrtScr|ScrollLk| |
| 114 | * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| | 209 | * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| |
| 115 | * | | | | | | |VolUp | | | | | | | | Pause | | 210 | * | | | | | | |VolUp | | | | | | | | Pause | |
| 116 | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| | 211 | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| |
| @@ -130,7 +225,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
| 130 | */ | 225 | */ |
| 131 | // MEDIA AND MOUSE | 226 | // MEDIA AND MOUSE |
| 132 | [LR_FN] = KEYMAP( | 227 | [LR_FN] = KEYMAP( |
| 133 | KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_INS, | 228 | M(M_TGCM), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_INS, |
| 134 | KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLU, | 229 | KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLU, |
| 135 | RESET, KC_TRNS, KC_TRNS, KC_CALC, KC_MAIL, KC_WHOM, | 230 | RESET, KC_TRNS, KC_TRNS, KC_CALC, KC_MAIL, KC_WHOM, |
| 136 | KC_TRNS, KC_TRNS, LSFT(KC_DELT),LCTL(KC_INS),LSFT(KC_INS), KC_MUTE, KC_VOLD, | 231 | 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] = { | |||
| 155 | const uint16_t PROGMEM fn_actions[] = { | 250 | const uint16_t PROGMEM fn_actions[] = { |
| 156 | }; | 251 | }; |
| 157 | 252 | ||
| 253 | void hold_shift(void) { | ||
| 254 | register_code(KC_LSHIFT); | ||
| 255 | } | ||
| 256 | |||
| 257 | void release_shift(void) { | ||
| 258 | unregister_code(KC_LSHIFT); | ||
| 259 | } | ||
| 260 | |||
| 158 | const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) | 261 | const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) |
| 159 | { | 262 | { |
| 160 | // MACRODOWN only works in this function | 263 | // MACRODOWN only works in this function |
| 161 | switch(id) { | 264 | switch(id) { |
| 265 | case M_TGCM: | ||
| 266 | if (record->event.pressed) { | ||
| 267 | default_layer_xor(1 << LR_CSA); | ||
| 268 | } | ||
| 269 | break; | ||
| 270 | case M_CMSFT: | ||
| 271 | if (record->event.pressed) { | ||
| 272 | layer_on(LR_CSA_SFT); | ||
| 273 | hold_shift(); | ||
| 274 | } else { | ||
| 275 | release_shift(); | ||
| 276 | layer_off(LR_CSA_SFT); | ||
| 277 | } | ||
| 278 | break; | ||
| 279 | case M_1 ... M_0: | ||
| 280 | case M_DEGR: | ||
| 281 | case M_SCLN: | ||
| 282 | case M_GRV: | ||
| 283 | case M_NBSP: | ||
| 284 | // macros of the shift layer that require to release shift | ||
| 285 | if (record->event.pressed) { | ||
| 286 | release_shift(); | ||
| 287 | switch (id) { | ||
| 288 | case M_1 ... M_0: | ||
| 289 | register_code(KC_1 + (id - M_1)); | ||
| 290 | break; | ||
| 291 | case M_DEGR: | ||
| 292 | return MACRO(DOWN(CM_ALTGR), D(SCLN), END); | ||
| 293 | case M_SCLN: | ||
| 294 | return MACRO(D(SCLN), END); | ||
| 295 | case M_GRV: | ||
| 296 | return MACRO(DOWN(CM_ALTGR), TYPE(CM_DCRC), UP(CM_ALTGR), T(SPACE), END); | ||
| 297 | case M_NBSP: | ||
| 298 | return MACRO(DOWN(CM_ALTGR), T(SPACE), UP(CM_ALTGR), END); | ||
| 299 | } | ||
| 300 | } else { | ||
| 301 | hold_shift(); | ||
| 302 | switch (id) { | ||
| 303 | case M_1 ... M_0: | ||
| 304 | unregister_code(KC_1 + (id - M_1)); | ||
| 305 | break; | ||
| 306 | case M_DEGR: | ||
| 307 | return MACRO(UP(CM_ALTGR), D(LSFT), U(SCLN), END); | ||
| 308 | case M_SCLN: | ||
| 309 | return MACRO(D(LSFT), U(SCLN), END); | ||
| 310 | } | ||
| 311 | } | ||
| 312 | break; | ||
| 162 | case M_DBL0: | 313 | case M_DBL0: |
| 163 | if (record->event.pressed) { | 314 | if (record->event.pressed) { |
| 164 | return MACRO( I(25), T(P0), T(P0), END ); | 315 | return MACRO( I(25), T(P0), T(P0), END ); |
| @@ -188,6 +339,10 @@ void * matrix_scan_user(void) { | |||
| 188 | if (layer_state & (1 << LR_NUMR)) { | 339 | if (layer_state & (1 << LR_NUMR)) { |
| 189 | ergodox_right_led_1_on(); | 340 | ergodox_right_led_1_on(); |
| 190 | } | 341 | } |
| 342 | // led 2: BÉPO over Canadian Multilingual | ||
| 343 | if (IS_CA_MULT_ENABLED()) { | ||
| 344 | ergodox_right_led_2_on(); | ||
| 345 | } | ||
| 191 | // led 3: caps lock | 346 | // led 3: caps lock |
| 192 | if (host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK)) { | 347 | if (host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK)) { |
| 193 | ergodox_right_led_3_on(); | 348 | ergodox_right_led_3_on(); |
diff --git a/quantum/keymap_extras/keymap_canadian_multilingual.h b/quantum/keymap_extras/keymap_canadian_multilingual.h new file mode 100644 index 000000000..ae60ffe37 --- /dev/null +++ b/quantum/keymap_extras/keymap_canadian_multilingual.h | |||
| @@ -0,0 +1,105 @@ | |||
| 1 | #ifndef KEYMAP_CANADIAN_MULTILINGUAG_H | ||
| 2 | #define KEYMAP_CANADIAN_MULTILINGUAG_H | ||
| 3 | |||
| 4 | #include "keymap_common.h" | ||
| 5 | |||
| 6 | // Alt gr | ||
| 7 | #ifndef ALTGR | ||
| 8 | #define ALTGR(kc) RALT(kc) | ||
| 9 | #endif | ||
| 10 | #ifndef ALGR | ||
| 11 | #define ALGR(kc) ALTGR(kc) | ||
| 12 | #endif | ||
| 13 | |||
| 14 | #define CM_ALTGR KC_RALT | ||
| 15 | #define CM_ALGR CM_ALTGR | ||
| 16 | |||
| 17 | #ifndef GR2A | ||
| 18 | #define GR2A(kc) RCTL(kc) | ||
| 19 | #endif | ||
| 20 | |||
| 21 | // Normal characters | ||
| 22 | // First row | ||
| 23 | #define CM_SLASH KC_GRV // / | ||
| 24 | #define CM_SLSH CM_SLASH | ||
| 25 | |||
| 26 | // Second row | ||
| 27 | #define CM_DEAD_CIRCUMFLEX KC_LBRACKET // dead ^ | ||
| 28 | #define CM_DCRC CM_DEAD_CIRCUMFLEX | ||
| 29 | #define CM_C_CEDILLA KC_RBRACKET // Ç | ||
| 30 | #define CM_CCED CM_C_CEDILLA | ||
| 31 | |||
| 32 | // Third row | ||
| 33 | #define CM_E_GRAVE KC_QUOT // è | ||
| 34 | #define CM_EGRV CM_E_GRAVE | ||
| 35 | #define CM_A_GRAVE KC_BSLASH // à | ||
| 36 | #define CM_AGRV CM_A_GRAVE | ||
| 37 | |||
| 38 | // Fourth row | ||
| 39 | #define CM_U_GRAVE KC_NONUS_BSLASH // ù | ||
| 40 | #define CM_UGRV CM_U_GRAVE | ||
| 41 | #define CM_E_ACUTE KC_SLSH // é | ||
| 42 | #define CM_ECUT CM_E_ACUTE | ||
| 43 | |||
| 44 | // Shifted characters | ||
| 45 | // First row | ||
| 46 | #define CM_BACKSLASH LSFT(CM_SLASH) /* \ */ | ||
| 47 | #define CM_BSLS CM_BACKSLASH | ||
| 48 | #define CM_QUESTION LSFT(KC_6) // ? | ||
| 49 | #define CM_QEST CM_QUESTION | ||
| 50 | |||
| 51 | // Second row | ||
| 52 | #define CM_DEAD_TREMA LSFT(CM_DEAD_CIRCUMFLEX) // dead trema/umlaut/diaresis for ä ë ï ö ü | ||
| 53 | #define CM_DTRM CM_DEAD_TREMA | ||
| 54 | |||
| 55 | // Third row | ||
| 56 | // all same as US-QWERTY, or capitalised character of the non-shifted key | ||
| 57 | |||
| 58 | // Fourth row | ||
| 59 | #define CM_APOSTROPHE LSFT(KC_COMMA) // ' | ||
| 60 | #define CM_APOS CM_APOSTROPHE | ||
| 61 | #define CM_DOUBLE_QUOTE LSFT(KC_DOT) // " | ||
| 62 | #define CM_DQOT CM_DOUBLE_QUOTE | ||
| 63 | |||
| 64 | // Alt Gr-ed characters | ||
| 65 | // First row | ||
| 66 | #define CM_PIPE ALTGR(CM_SLASH) // | | ||
| 67 | #define CM_CURRENCY ALTGR(KC_4) // ¤ | ||
| 68 | #define CM_CURR CM_CURRENCY | ||
| 69 | #define CM_LEFT_CURLY_BRACE ALTGR(KC_7) // { | ||
| 70 | #define CM_LCBR CM_LEFT_CURLY_BRACE | ||
| 71 | #define CM_RIGHT_CURLY_BRACE ALTGR(KC_8) // } | ||
| 72 | #define CM_RCBR CM_RIGHT_CURLY_BRACE | ||
| 73 | #define CM_LBRACKET ALTGR(KC_9) // [ | ||
| 74 | #define CM_LBRC CM_LBRACKET | ||
| 75 | #define CM_RBRACKET ALTGR(KC_0) // ] | ||
| 76 | #define CM_RBRC CM_RBRACKET | ||
| 77 | #define CM_NEGATION ALTGR(KC_EQUAL) // ¬ | ||
| 78 | #define CM_NEGT CM_NEGATION | ||
| 79 | |||
| 80 | // Second row | ||
| 81 | // euro symbol not available on Linux? (X.org) | ||
| 82 | #define CM_EURO ALTGR(KC_E) // € | ||
| 83 | #define CM_DEAD_GRAVE ALTGR(CM_DEAD_CIRCUMFLEX) | ||
| 84 | #define CM_DGRV CM_DEAD_GRAVE // dead ` | ||
| 85 | #define CM_TILDE ALTGR(CM_C_CEDILLA) // ~ | ||
| 86 | #define CM_TILD CM_TILDE | ||
| 87 | |||
| 88 | // Third row | ||
| 89 | #define CM_DEGREE ALTGR(KC_SCOLON) // ° | ||
| 90 | #define CM_DEGR CM_DEGREE | ||
| 91 | |||
| 92 | // Fourth row | ||
| 93 | #define CM_LEFT_GUILLEMET ALTGR(KC_Z) // « | ||
| 94 | #define CM_LGIL CM_LEFT_GUILLEMET | ||
| 95 | #define CM_RIGHT_GUILLEMET ALTGR(KC_X) // » | ||
| 96 | #define CM_RGIL CM_RIGHT_GUILLEMET | ||
| 97 | #define CM_LESS ALTGR(KC_COMMA) // < | ||
| 98 | #define CM_GREATER ALTGR(KC_DOT) // > | ||
| 99 | #define CM_GRTR CM_GREATER | ||
| 100 | |||
| 101 | // Space bar | ||
| 102 | #define CM_NON_BREAKING_SPACE ALTGR(KC_SPACE) | ||
| 103 | #define CM_NBSP CM_NON_BREAKING_SPACE | ||
| 104 | |||
| 105 | #endif | ||
