keymap.c (19313B)
1 #include QMK_KEYBOARD_H 2 #include "keymap_bepo.h" 3 4 5 // Each layer gets a name for readability, which is then used in the keymap matrix below. 6 // The underscores don't mean anything - you can have a layer called STUFF or any other name. 7 #define _BASE 0 8 #define _SYMBOLS 1 9 #define _MEDIA 2 10 #define _TRNS 8 11 12 #define PEDAL_DELAY 250 13 #define KEY_DELAY 130 14 15 enum custom_keycodes { 16 M_LP = SAFE_RANGE, // left pedal 17 M_RP, // right pedal 18 M_SF, // shift 19 M_SFS, // shift and space 20 M_L1E, // L1 and space 21 L2INS, // L2 and insert 22 L2LOC, // Lock L2 23 M_UN, // undo 24 M_CUT, // cut 25 M_CP, // copy 26 M_PS, // paste 27 M_SE, // search 28 M_SFU, // shift and underscore 29 }; 30 31 static uint16_t key_timer_left_pedal; 32 static uint16_t key_timer_right_pedal; 33 static uint16_t key_timer_shift; 34 static uint16_t key_timer_1; 35 static uint16_t key_timer_2; 36 37 static uint16_t shift_count = 0; //this is used to keep track of shift state and avoid inserting non breakable space 38 static uint16_t l2_locked = 0; //this indicate wether L2 is locked 39 40 #define BP_CBSP CTL_T(KC_BSPC) 41 #define BP_CDEL CTL_T(KC_DEL) 42 43 //layout : http://www.keyboard-layout-editor.com/#/gists/4480e3ab8026eb7c710a7e22203ef4aa 44 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 45 /* base 46 * left foot clicked is right click 47 * left foot pressed is layer 2 48 * right foot clicked is left click 49 * right foot pressed is layer 1 + scroll lock (used with autohotkey for easier scrolling with trackballs) 50 * ,------. .. ,------. * 51 * ,------| F3 |-------------. .. ,-------------| F10 |------. * 52 * ,------| F2 |------| F4 | F5 |------. .. ,------| F8 | F9 |------| F11 |------. * 53 * | F1 |------| »/3 |------|------| F6 | .. | F7 |------|------| -/8 |------| F12 | * 54 * ,------+------| «/2 |------| (/4 | )/5 |------| .. |------| @/6 | +/7 |------| //9 |------+------. * 55 * | ESC | "/1 |------| O |------|------| ¨ | .. | ^ |------|------| D |------| * /0 |BCKSP | * 56 * |------+------| É |------| P | È |------| .. |------| K | V |------| L |------+------| * 57 * | TAB | B |------| E |------|------| _ | .. | =/° |------|------| S |------| J |ENTER | * 58 * |------+------| U |------| I | F |------| .. |------| C | T |------| R |------+------| * 59 * | ` | A |------| Y |------|------| ; | .. | ! |------|------| UP |------| N | '/? | * 60 * |------+------| À |------| X | W |------|-------------. .. .-------------|------| M | G |------| H |------+------| * 61 * | SHIFT| Z |------| . |------|------|sp/sh |bsp/ct|L2/ins| .. |L2lock|del/CT|sp/sh |------|------| DOWN |------| Q |SHIFT | * 62 * |------+------| / |------| , | space|------|------|------ .. ------|------|------| L1/sp| LEFT |------| UP |------+------| * 63 * | CTRL | win |------/ \-------------| L1 | alt | .. | CAPS | L1 |-------------/ \------| : | CTRL | * 64 * `-------------/ \-------------/ .. \-------------/ \-------------/ * 65 */ 66 [_BASE] = LAYOUT( 67 KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, 68 KC_ESC, BP_DQUO, BP_LDAQ, BP_RDAQ, BP_LPRN, BP_RPRN, BP_DIAE, BP_DCIR, BP_AT, BP_PLUS, BP_MINS, BP_SLSH, BP_ASTR, KC_BSPC, 69 KC_TAB, BP_B, BP_EACU, BP_O, BP_P, BP_EGRV, BP_UNDS, BP_EQL, BP_K, BP_V, BP_D, BP_L, BP_J, KC_ENT, 70 BP_GRV, BP_A, BP_U, BP_E, BP_I, BP_F, BP_SCLN, BP_EXLM, BP_C, BP_T, BP_S, BP_R, BP_N, BP_QUOT, 71 M_SF, BP_Z, BP_AGRV, BP_Y, BP_X, KC_RBRC, M_SFS, BP_CBSP, L2INS, L2LOC, BP_CDEL, M_SFS, BP_M, BP_G, KC_UP, BP_H, BP_Q, M_SF, 72 KC_LCTL, KC_LGUI, KC_PSLS, BP_DOT, BP_COMM, KC_SPACE,M_L1E, KC_LALT, KC_CAPS, M_L1E, KC_SPACE, KC_LEFT, KC_DOWN, KC_RIGHT,BP_COLN, KC_RCTL, 73 //left pedals 74 M_LP, M_RP, KC_TRNS, 75 //right pedals 76 M_LP, M_RP, KC_TRNS 77 ), 78 79 /* Larer 1 for symbols. 80 * left foot is middle click 81 * ,------. .. ,------. * 82 * ,------| |-------------. .. ,-------------| |------. * 83 * ,------| |------| | |------. .. ,------| | |------| |------. * 84 * | |------| § |------|------| | .. | |------|------| ± |------| | * 85 * ,------+------| ¶ |------| µ | |------| .. |------| ≤ | ≥ |------| ÷ |------+------. * 86 * | | ¤ |------| { |------|------| ~ | .. | ˇ |------|------| ] |------| × | | * 87 * |------+------| * |------| } | ` |------| .. |------| # | [ |------| % |------+------| * 88 * | | \ |------| ( |------|------| | .. | ≠ |------|------| > |------| ‰ | | * 89 * |------+------| Ù |------| ) | + |------| .. |------| Ç | < |------| & |------+------| * 90 * | | = |------| copy |------|------| : | .. | ? |------|------| PGUP |------| _ | | * 91 * |------+------| cut |------| paste|search|------|-------------. .. .-------------|------| $ | = |------| | |------+------| * 92 * | | undo |------| \ |------|------| | | | .. | | | |------|------| PGDN |------| / | | * 93 * |------+------| |------| | |------|------|------ .. ------|------|------| | HOME |------| PGDN |------+------| * 94 * | | |------/ \-------------| | | .. | | |-------------/ \------| | | * 95 * `-------------/ \-------------/ .. \-------------/ \-------------/ * 96 * 97 */ 98 [_SYMBOLS] = LAYOUT( 99 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, 100 KC_TRNS, BP_CURR, BP_PARA, BP_SECT, BP_DGRK, KC_TRNS, BP_TILD, BP_CARN, BP_LEQL, BP_GEQL, BP_PLMN, BP_DIV, BP_MUL, KC_TRNS, 101 KC_TRNS, BP_BSLS, BP_ASTR, BP_LCBR, BP_RCBR, BP_GRV, KC_TRNS, BP_NEQL, BP_HASH, BP_LBRC, BP_RBRC, BP_PERC, BP_PERM, KC_TRNS, 102 KC_TRNS, BP_EQL, BP_UGRV, BP_LPRN, BP_RPRN, BP_PLUS, BP_COLN, BP_QUES, BP_CCED, BP_LABK, BP_RABK, BP_AMPR, BP_UNDS, KC_TRNS, 103 KC_TRNS, M_UN, M_CUT, M_CP, M_PS, M_SE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, BP_DLR, BP_EQL, KC_PGUP, BP_PIPE, BP_SLSH, KC_TRNS, 104 KC_TRNS, KC_TRNS, BP_BSLS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGDN, KC_END, KC_TRNS, KC_TRNS, 105 //left pedals 106 KC_TRNS, MS_BTN1, KC_TRNS, 107 //right pedals 108 KC_TRNS, MS_BTN1, KC_TRNS 109 ), 110 111 /* MEDIA, mouse and numpad. 112 * right pedal is left clic 113 * ,------. .. ,------. * 114 * ,------|PAUSE |-------------. .. ,-------------| PRINT|------. * 115 * ,------|SCROLL|------|MUTE |VOLUD |------. .. ,------| pre | next |------| calc |------. * 116 * |QK_BOOT |------| stop |------|------|VOLDU | .. | play |------|------| stop |------| num | * 117 * ,------+------| |------| pre | next |------| .. |------| pre | next |------| |------+------. * 118 * | | |------|scrolu|------|------| play | .. | play |------|------| 8 |------| - | | * 119 * |------+------| |------| | bt4 |------| .. |------| next | 7 |------| 9 |------+------| * 120 * | | |------|scrold|------|------| bt5 | .. | pre |------|------| 5 |------| + | | * 121 * |------+------| |------|mclic | rclic|------| .. |------| rclic| 4 |------| 6 |------+------| * 122 * | | |------| |------|------| lclic| .. | lclic|------|------| 2 |------| * | | * 123 * |------+------| |------| | mclck|------|-------------. .. .-------------|------| mclic| 1 |------| 3 |------+------| * 124 * | | |------| |------|------| | | | .. | | | |------|------| num. |------| / | | * 125 * |------+------| |------| | |------|------|------ .. ------|------|------| | 0 |------| . |------+------| * 126 * | | |------/ \-------------| | | .. | | |-------------/ \------| , | | * 127 * `-------------/ \-------------/ .. \-------------/ \-------------/ * 128 * 129 */ 130 [_MEDIA] = LAYOUT( 131 QK_BOOT, KC_SCRL, KC_PAUS, KC_MUTE, KC_VOLD, KC_VOLU, KC_MUTE, KC_VOLD, KC_VOLU, KC_PSCR, KC_CALC, KC_NUM, 132 KC_TRNS, KC_TRNS, KC_TRNS, KC_MSTP, KC_MPRV, KC_MNXT, KC_MPLY, KC_MPLY, KC_MPRV, KC_MNXT, KC_MSTP, KC_TRNS, KC_PMNS, KC_TRNS, 133 KC_TRNS, KC_TRNS, KC_TRNS, MS_WHLU, KC_TRNS, MS_BTN4, MS_BTN5, MS_BTN4, MS_BTN5, KC_KP_7, KC_KP_8, KC_KP_9, KC_PPLS, KC_TRNS, 134 KC_TRNS, KC_TRNS, KC_TRNS, MS_WHLD, MS_BTN3, MS_BTN2, MS_BTN1, MS_BTN1, MS_BTN2, KC_KP_4, KC_KP_5, KC_KP_6, KC_PAST, KC_TRNS, 135 KC_TRNS, M_UN, M_CUT, M_CP, M_PS, MS_BTN3, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MS_BTN3, KC_KP_1, KC_KP_2, KC_KP_3, KC_PSLS, KC_TRNS, 136 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_KP_0, KC_PDOT, BP_DOT, BP_COMM, KC_TRNS, 137 //left pedals 138 MS_BTN3, M_RP, KC_TRNS, 139 //right pedals 140 MS_BTN3, M_RP, KC_TRNS 141 ), 142 143 /* TRNS - skeleton for laters 144 * ,------. .. ,------. * 145 * ,------| |-------------. .. ,-------------| |------. * 146 * ,------| |------| | |------. .. ,------| | |------| |------. * 147 * | |------| |------|------| | .. | |------|------| |------| | * 148 * ,------+------| |------| | |------| .. |------| | |------| |------+------. * 149 * | | |------| |------|------| | .. | |------|------| |------| | | * 150 * |------+------| |------| | |------| .. |------| | |------| |------+------| * 151 * | | |------| |------|------| | .. | |------|------| |------| | | * 152 * |------+------| |------| | |------| .. |------| | |------| |------+------| * 153 * | | |------| |------|------| | .. | |------|------| |------| | | * 154 * |------+------| |------| | |------|-------------. .. .-------------|------| | |------| |------+------| * 155 * | | |------| |------|------| | | | .. | | | |------|------| |------| | | * 156 * |------+------| |------| | |------|------|------ .. ------|------|------| | |------| |------+------| * 157 * | | |------/ \-------------| | | .. | | |-------------/ \------| | | * 158 * `-------------/ \-------------/ .. \-------------/ \-------------/ * 159 * 160 */ 161 162 [_TRNS] = LAYOUT( 163 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, 164 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, 165 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, 166 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, 167 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, 168 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, 169 //left pedals 170 MS_BTN3, M_RP, KC_TRNS, 171 //right pedals 172 MS_BTN3, M_RP, KC_TRNS 173 ), 174 175 }; 176 177 void hold_shift(void) { 178 shift_count = shift_count + 1; 179 register_code(KC_LSFT); 180 } 181 182 void release_shift(void) { 183 shift_count = shift_count - 1; 184 if(shift_count <= 0){ 185 unregister_code(KC_LSFT); 186 shift_count = 0; 187 } 188 } 189 190 void press_space(void) { 191 if(shift_count > 0) unregister_code (KC_LSFT); 192 tap_code(KC_SPACE); 193 if(shift_count > 0) register_code (KC_LSFT); 194 } 195 196 void press_enter(void) { 197 if(shift_count > 0) unregister_code (KC_LSFT); 198 tap_code (KC_ENT); 199 if(shift_count > 0) register_code (KC_LSFT); 200 } 201 202 void press_underscore(void) { 203 if(shift_count > 0) unregister_code (KC_LSFT); 204 tap_code ((unsigned char) BP_UNDS); 205 if(shift_count > 0) register_code (KC_LSFT); 206 } 207 208 // Bleah globals need to be initialized. 209 uint8_t old_layer=_BASE; 210 211 void matrix_scan_user(void) { 212 uint8_t layer = get_highest_layer(layer_state); 213 214 frenchdev_led_1_off(); 215 frenchdev_led_2_off(); 216 switch (layer) { 217 case _BASE: 218 frenchdev_led_2_on(); 219 break; 220 case _SYMBOLS: 221 frenchdev_led_1_on(); 222 break; 223 case _MEDIA: 224 frenchdev_led_1_on(); 225 frenchdev_led_2_on(); 226 default: 227 // none 228 break; 229 } 230 } 231 232 233 bool process_record_user(uint16_t keycode, keyrecord_t *record) { 234 switch(keycode) { 235 case M_LP: //left pedal 236 if (record->event.pressed) { 237 layer_on(1); 238 register_code (KC_SCRL); 239 key_timer_left_pedal = timer_read(); // if the key is being pressed, we start the timer. 240 } else { 241 if (timer_elapsed(key_timer_left_pedal) < KEY_DELAY) { 242 tap_code (MS_BTN2); 243 } 244 unregister_code (KC_SCRL); 245 layer_off(1); 246 } 247 break; 248 case M_RP: //right pedal 249 if (record->event.pressed) { 250 layer_on(2); 251 key_timer_right_pedal = timer_read(); // if the key is being pressed, we start the timer. 252 } else { 253 if (timer_elapsed(key_timer_right_pedal) < PEDAL_DELAY) { 254 tap_code (MS_BTN1); 255 } 256 layer_off(2); 257 } 258 break; 259 case M_SF: // shift, using macro to keep track of shift state and avoid inserting nbsp by mistake 260 if (record->event.pressed) { 261 hold_shift(); 262 } else { 263 release_shift(); 264 } 265 break; 266 case M_SFS: // shift when held, space when tapped 267 if (record->event.pressed) { 268 hold_shift(); 269 key_timer_shift = timer_read(); // if the key is being pressed, we start the timer. 270 } else { 271 if (timer_elapsed(key_timer_shift) < KEY_DELAY) { 272 press_space(); 273 } 274 release_shift(); 275 } 276 break; 277 case M_SFU: // shift when held, _ when tapped 278 if (record->event.pressed) { 279 hold_shift(); 280 key_timer_shift = timer_read(); // if the key is being pressed, we start the timer. 281 } else { 282 if (timer_elapsed(key_timer_shift) < KEY_DELAY) { 283 press_space(); 284 } 285 release_shift(); 286 } 287 break; 288 case M_L1E: // L1 when held, space when tapped 289 if (record->event.pressed) { 290 layer_on(1); 291 key_timer_1 = timer_read(); // if the key is being pressed, we start the timer. 292 } else { 293 if (timer_elapsed(key_timer_1) < KEY_DELAY) { 294 press_enter(); 295 } 296 layer_off(1); 297 } 298 break; 299 case L2INS: //activate layer 2, if released before 100ms trigger INS. basicaly equivalent to LT(2, KC_INS) but without delay for activation of layer 2 300 if (record->event.pressed) { 301 layer_on(2); 302 key_timer_2 = timer_read(); // if the key is being pressed, we start the timer. 303 } else { 304 if (timer_elapsed(key_timer_2) < KEY_DELAY) { 305 tap_code (KC_INS); 306 } 307 l2_locked = 0; 308 layer_off(2); 309 } 310 break; 311 case L2LOC: //lock L2 312 if (record->event.pressed) { 313 key_timer_2 = timer_read(); // if the key is being pressed, we start the timer. 314 layer_on(2); 315 } else { 316 if (timer_elapsed(key_timer_2) < KEY_DELAY && l2_locked == 0) { 317 l2_locked = 1; 318 layer_on(2); 319 } else { 320 l2_locked = 0; 321 layer_off(2); 322 } 323 } 324 break; 325 case M_UN: // undo 326 if (record->event.pressed) { 327 tap_code16(C(BP_Z)); 328 } 329 break; 330 case M_CUT: // cut 331 if (record->event.pressed) { 332 tap_code16(C(BP_X)); 333 } 334 break; 335 case M_CP: // copy 336 if (record->event.pressed) { 337 tap_code16(C(BP_C)); 338 } 339 break; 340 case M_PS: // paste 341 if (record->event.pressed) { 342 tap_code16(C(BP_V)); 343 } 344 break; 345 case M_SE: // search 346 if (record->event.pressed) { 347 tap_code16(C(BP_F)); 348 } 349 break; 350 } 351 return true; 352 } 353 354 bool led_update_user(led_t led_state) { 355 if (led_state.caps_lock){ 356 frenchdev_led_3_on(); 357 } else { 358 frenchdev_led_3_off(); 359 } 360 return false; 361 }