aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDidier Loiseau <didierloiseau+git@gmail.com>2016-02-17 21:45:38 +0100
committerDidier Loiseau <didierloiseau+git@gmail.com>2016-04-02 18:16:30 +0200
commita7cef2ca0a2322448d02008337013936b1d550ec (patch)
treebcf02dd1296a30b98125ca64a504d8f0a360a006
parentb8ddbd21810951f64a081e4c3096bbc6aedc9aeb (diff)
downloadqmk_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.c159
-rw-r--r--quantum/keymap_extras/keymap_canadian_multilingual.h105
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
8enum layers { 9enum 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
14enum macros { 21enum 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] = {
155const uint16_t PROGMEM fn_actions[] = { 250const uint16_t PROGMEM fn_actions[] = {
156}; 251};
157 252
253void hold_shift(void) {
254 register_code(KC_LSHIFT);
255}
256
257void release_shift(void) {
258 unregister_code(KC_LSHIFT);
259}
260
158const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) 261const 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