]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboards/ergodox_ez/keymaps/dvorak_spanish/keymap.c
6eb864b447abc47b7247af63970da446d39dde0c
[qmk_firmware.git] / keyboards / ergodox_ez / keymaps / dvorak_spanish / keymap.c
1 #include "ergodox_ez.h"
2 #include "debug.h"
3 #include "action_layer.h"
4
5 /******************************************************************************************
6  * SPANISH DVORAK LAYOUT (see http://djelibeibi.unex.es/dvorak/)
7  * Layer 1: auxiliary keys
8  * Layer 2: full qwerty layout
9  ******************************************************************************************
10  * IMPORTANT: Software layout must be set to SPANISH QWERTY to work properly
11  *****************************************************************************************/
12
13 // LAYERS
14 #define BASE    0 // dvorak layout (default)
15 #define AUX     1 // auxiliary keys
16 #define QWERTY  2 // qwerty layout
17
18 // MACROS
19 #define OBRACE 0 // key { or shift
20 #define CBRACE 1 // key } or shift
21 #define OBRACK 2 // key [ or left alt
22 #define CBRACK 3 // key ] or left alt
23 #define CAPS   4 // caps lock
24
25 // LEDS
26 #define USB_LED_NUM_LOCK    0
27 #define USB_LED_CAPS_LOCK   1
28 #define USB_LED_SCROLL_LOCK 2
29 #define USB_LED_COMPOSE     3
30 #define USB_LED_KANA        4
31
32 // TIMERS
33 #define KEY_TAP_FAST 85
34 #define KEY_TAP_SLOW 95
35
36 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
37 /* Keymap 0: Base layer
38  * Keys with double values (like Esc/Ctrl) correspond to the 'tapped' key and the 'held' key, respectively
39  *
40  * ,--------------------------------------------------.           ,--------------------------------------------------.
41  * |   \    |   1  |   2  |   3  |   4  |   5  |  <>  |           |   ¡  |   6  |   7  |   8  |   9  |   0  |   '    |
42  * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
43  * | F1/~L1 |   .  |   ,  |   Ñ  |   P  |   Y  |MEH_T |           |  L1  |   F  |   G  |   C  |   H  |   L  |ALL_T/+ |
44  * |--------+------+------+------+------+------| DEL  |           | ~L1  |------+------+------+------+------+--------|
45  * |Esc/Ctrl|   A  |   O  |   E  |   U  |   I  |------|           |------|   D  |   R  |   T  |   N  |   S  |'/RCtrl |
46  * |--------+------+------+------+------+------| LGUI |           | RALT |------+------+------+------+------+--------|
47  * | {/LSft |   -  |   Q  |   J  |   K  |   X  |      |           |      |   B  |   M  |   W  |   V  |   Z  | }/RSft |
48  * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
49  *   |[/LALT| HOME |PGDOWN| PGUP | END  |                                       | LEFT | DOWN |  UP  |RIGHT |]/LALT|
50  *   `----------------------------------'                                       `----------------------------------'
51  *                                        ,-------------.       ,-------------.
52  *                                        |F5/CAG|F6/~L1|       |F7/~L1|F8/CAG|
53  *                                 ,------|------|------|       |------+--------+------.
54  *                                 |      |      |F4/CA |       |F11/CA|        |      |
55  *                                 | ENTER| TAB  |------|       |------|  BSPC  | SPACE|
56  *                                 |      |      |F3/SA |       |F12/SA|        |      |
57  *                                 `--------------------'       `----------------------'
58  *  CAG = CTRL-ALT-GUI
59  *   CA = CTRL-ALT
60  *   SA = SHIFT-ALT
61  *
62  */
63 [BASE] = KEYMAP(
64         // left hand
65         KC_GRAVE,       KC_1,   KC_2,   KC_3,   KC_4,   KC_5,   KC_NONUS_BSLASH,
66         LT(AUX, KC_F1), KC_DOT, KC_COMM,KC_SCLN,KC_P,   KC_Y,   MEH_T(KC_DEL),
67         CTL_T(KC_ESC),  KC_A,   KC_O,   KC_E,   KC_U,   KC_I,
68         M(OBRACE),      KC_SLSH,KC_Q,   KC_J,   KC_K,   KC_X,   KC_LGUI,
69         M(OBRACK),      KC_HOME,KC_PGDN,KC_PGUP,KC_END,
70                                                            LCAG_T(KC_F5),  LT(AUX, KC_F6),
71                                                            MT((MOD_LALT | MOD_LCTL), KC_F4),
72                                            KC_ENT,KC_TAB,MT((MOD_LALT | MOD_LSFT), KC_F3),
73         // right hand
74                     KC_EQL,    KC_6,   KC_7,   KC_8,   KC_9,   KC_0,   KC_MINUS,
75                     KC_FN1,    KC_F,   KC_G,   KC_C,   KC_H,   KC_L,   ALL_T(KC_RBRACKET),
76                                KC_D,   KC_R,   KC_T,   KC_N,   KC_S,   CTL_T(KC_QUOTE),
77                     KC_RALT,   KC_B,   KC_M,   KC_W,   KC_V,   KC_Z,   M(CBRACE),
78                                        KC_LEFT,KC_DOWN,KC_UP,  KC_RGHT,M(CBRACK),
79         LT(AUX, KC_F7), LCAG_T(KC_F8),
80         MT((MOD_LALT | MOD_LCTL), KC_F11),
81         MT((MOD_LALT | MOD_LSFT), KC_F12),KC_BSPC, KC_SPC
82     ),
83 /* Keymap 1: Aux layer
84  *
85  * ,--------------------------------------------------.           ,--------------------------------------------------.
86  * |        |  F1  |  F2  |  F3  |  F4  |  F5  | SLEEP            | PWR  |  F6  |  F7  |  F8  |  F9  |  F10 |   F11  |
87  * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
88  * |        |  <   |  >   | MsUp |      |      |      |           | ~L0  |      |   7  |   8  |   9  |   *  |  `^    |
89  * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
90  * |        |      |MsLeft|MsDown|MsRght|      |------|           |------|      |   4  |   5  |   6  |   +  |   Ç    |
91  * |--------+------+------+------+------+------|      |           |PSCR  |------+------+------+------+------+--------|
92  * |CAPSLOCK|      |      |      |      |      |      |           |      |      |   1  |   2  |   3  |   /  |        |
93  * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
94  *   |CTRL-S|CTRL-Z|CTRL-X|CTRL-C|CTRL-V|                                       |      |    . |   0  |   =  |      |
95  *   `----------------------------------'                                       `----------------------------------'
96  *                                        ,-------------.       ,-------------.
97  *                                        |      |      |       |      | Play |
98  *                                 ,------|------|------|       |------+------+------.
99  *                                 |      |      |      |       | VolUp|      |      |
100  *                                 | Lclk | Rclk |------|       |------| Prev | Next |
101  *                                 |      |      |  L2  |       | VolDn|      |      |
102  *                                 `--------------------'       `--------------------'
103  */
104 [AUX] = KEYMAP(
105        // left hand
106        KC_NO  , KC_F1,  KC_F2,  KC_F3,  KC_F4,  KC_F5,  KC_SLEP,
107        KC_TRNS, KC_NONUS_BSLASH, LSFT(KC_NONUS_BSLASH), KC_MS_U, KC_NO, KC_NO, KC_NO,
108        KC_NO  , KC_NO, KC_MS_L, KC_MS_D, KC_MS_R, KC_NO  ,
109        M(CAPS), KC_NO, KC_NO  , KC_NO  , KC_NO  , KC_NO  , KC_NO,
110        LCTL(KC_S), LCTL(KC_Z), LCTL(KC_X), LCTL(KC_C), LCTL(KC_V),
111                                                             KC_NO  , KC_TRNS,
112                                                                        KC_NO,
113                                                 KC_BTN1, KC_BTN2, TG(QWERTY),
114        // right hand
115             KC_PWR,  KC_F6,   KC_F7,  KC_F8,  KC_F9,   KC_F10,  KC_F11,
116             KC_TRNS, KC_NO,   KC_7,   KC_8,   KC_9,    KC_PAST, KC_LBRACKET,
117                      KC_NO,   KC_4,   KC_5,   KC_6,    KC_PPLS, KC_BSLASH,
118             KC_PSCR, KC_NO,   KC_1,   KC_2,   KC_3,    KC_PSLS, KC_NO,
119                               KC_NO  ,KC_DOT, KC_0,    KC_PEQL, KC_NO,
120        KC_TRNS, KC_MPLY,
121        KC_VOLU,
122        KC_VOLD, KC_MPRV, KC_MNXT
123 ),
124 /* Keymap 2: QWERTY layer
125  *
126  * ,--------------------------------------------------.           ,--------------------------------------------------.
127  * |   \    |   1  |   2  |   3  |   4  |   5  |  <>  |           |   ¡  |   6  |   7  |   8  |   9  |   0  |   '    |
128  * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
129  * |  TRANS |   Q  |   W  |   E  |   R  |   T  |MEH_T |           | TRANS|   Y  |   U  |   I  |   O  |   P  |ALL_T/+ |
130  * |--------+------+------+------+------+------| DEL  |           |      |------+------+------+------+------+--------|
131  * |Esc/Ctrl|   A  |   S  |   D  |   F  |   G  |------|           |------|   H  |   J  |   K  |   L  |   Ñ  |'/RCtrl |
132  * |--------+------+------+------+------+------| LGUI |           | RALT |------+------+------+------+------+--------|
133  * | {/LSft |   Z  |   X  |   C  |   V  |   B  |      |           |      |   N  |   M  |   ,  |   .  |   -  | }/RSft |
134  * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
135  *   |[/LALT| HOME |PGDOWN| PGUP | END  |                                       | LEFT | DOWN |  UP  |RIGHT |]/LALT|
136  *   `----------------------------------'                                       `----------------------------------'
137  *                                        ,-------------.       ,-------------.
138  *                                        |F5/CAG| TRANS|       | TRANS|F8/CAG|
139  *                                 ,------|------|------|       |------+--------+------.
140  *                                 |      |      |F4/CA |       |F11/CA|        |      |
141  *                                 | ENTER| TAB  |------|       |------|  BSPC  | SPACE|
142  *                                 |      |      | TRANS|       |F12/SA|        |      |
143  *                                 `--------------------'       `----------------------'
144  *  CAG = CTRL-ALT-GUI
145  *   CA = CTRL-ALT
146  *   SA = SHIFT-ALT
147  *
148  */
149 [QWERTY] = KEYMAP(
150         // left hand
151         KC_GRAVE,       KC_1,   KC_2,   KC_3,   KC_4,   KC_5,   KC_NONUS_BSLASH,
152         KC_TRNS,        KC_Q,   KC_W,   KC_E,   KC_R,   KC_T,   MEH_T(KC_DEL),
153         CTL_T(KC_ESC),  KC_A,   KC_S,   KC_D,   KC_F,   KC_G,
154         M(OBRACE),      KC_Z,   KC_X,   KC_C,   KC_V,   KC_B,   KC_LGUI,
155         M(OBRACK),      KC_HOME,KC_PGDN,KC_PGUP,KC_END,
156                                                                   LCAG_T(KC_F5),  KC_TRNS,
157                                                            MT((MOD_LALT | MOD_LCTL), KC_F4),
158                                                                     KC_ENT,KC_TAB,KC_TRNS,
159         // right hand
160                     KC_EQL,    KC_6,   KC_7,   KC_8,   KC_9,   KC_0,   KC_MINUS,
161                     KC_TRNS,   KC_Y,   KC_U,   KC_I,   KC_O,   KC_P,   ALL_T(KC_RBRACKET),
162                                KC_H,   KC_J,   KC_K,   KC_L,   KC_SCLN,CTL_T(KC_QUOTE),
163                     KC_RALT,   KC_N,   KC_M,   KC_COMM,KC_DOT, KC_SLSH,M(CBRACE),
164                                        KC_LEFT,KC_DOWN,KC_UP,  KC_RGHT,M(CBRACK),
165         KC_TRNS, LCAG_T(KC_F8),
166         MT((MOD_LALT | MOD_LCTL), KC_F11),
167         MT((MOD_LALT | MOD_LSFT), KC_F12),KC_BSPC, KC_SPC
168 ),
169 };
170
171 const uint16_t PROGMEM fn_actions[] = {
172     [1] = ACTION_LAYER_TAP_TOGGLE(AUX)                // FN1 - Momentary Layer 1 (Aux)
173 };
174
175 static uint16_t key_timer;
176
177 const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
178 {
179       switch(id) {
180         case OBRACE: {
181             if (record->event.pressed) {
182                 key_timer = timer_read();
183                 register_code(KC_RSFT);
184             } else {
185                 unregister_code(KC_RSFT);
186                 if (timer_elapsed(key_timer) < KEY_TAP_SLOW) {
187                     register_code(KC_RALT);
188                     register_code(KC_QUOTE);
189                     unregister_code(KC_QUOTE);
190                     unregister_code(KC_RALT);
191                 }
192             }
193             break;
194         }
195         case CBRACE: {
196             if (record->event.pressed) {
197                 key_timer = timer_read();
198                 register_code(KC_RSFT);
199             } else { 
200                 unregister_code(KC_RSFT);
201                 if (timer_elapsed(key_timer) < KEY_TAP_SLOW) { 
202                     register_code(KC_RALT); 
203                     register_code(KC_BSLS); 
204                     unregister_code(KC_BSLS); 
205                     unregister_code(KC_RALT); 
206                 }
207             }
208             break;
209         }
210         case OBRACK: {
211             if (record->event.pressed) {
212                 key_timer = timer_read();
213                 register_code(KC_LALT);
214             } else { 
215                 unregister_code(KC_LALT);
216                 if (timer_elapsed(key_timer) < KEY_TAP_SLOW) { 
217                     register_code(KC_RALT); 
218                     register_code(KC_LBRACKET); 
219                     unregister_code(KC_LBRACKET); 
220                     unregister_code(KC_RALT); 
221                 }
222             }
223             break;
224         }
225         case CBRACK: {
226             if (record->event.pressed) {
227                 key_timer = timer_read();
228                 register_code(KC_LALT);
229             } else { 
230                 unregister_code(KC_LALT);
231                 if (timer_elapsed(key_timer) < KEY_TAP_SLOW) { 
232                     register_code(KC_RALT); 
233                     register_code(KC_RBRACKET); 
234                     unregister_code(KC_RBRACKET); 
235                     unregister_code(KC_RALT); 
236                 }
237             }
238             break;
239         }
240         case CAPS: {
241             if (record->event.pressed) {
242                 register_code(KC_CAPSLOCK);
243             } else { 
244                 unregister_code(KC_CAPSLOCK);
245             }
246             break;
247         }
248       }
249     return MACRO_NONE;
250 };
251
252 // Runs just one time when the keyboard initializes.
253 void matrix_init_user(void) {
254
255 };
256
257 // Runs constantly in the background, in a loop.
258 void matrix_scan_user(void) {
259
260     uint8_t layer = biton32(layer_state);
261
262     ergodox_board_led_off();
263     ergodox_right_led_1_off();
264     ergodox_right_led_2_off();
265     ergodox_right_led_3_off();
266     switch (layer) {
267         case 1:
268             ergodox_right_led_3_on();
269             break;
270         case 2:
271             ergodox_right_led_2_on();
272             break;
273         default:
274             // none
275             break;
276     }
277     
278     // Turn the caps lock led on
279     if (host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK)) {
280         ergodox_right_led_1_on();
281     }
282
283 }
284