Created
June 23, 2018 18:52
-
-
Save tomykaira/f767d2f30cfd50f697a77495c4535d0b to your computer and use it in GitHub Desktop.
Alternative of let's split keymap, for foobar keyboard. Use with QMK. MIT License.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Copyright Megumi Tomita <tomykaira@gmail.com>. | |
// MIT License. | |
#include QMK_KEYBOARD_H | |
extern keymap_config_t keymap_config; | |
// Each layer gets a name for readability, which is then used in the keymap matrix below. | |
// The underscores don't mean anything - you can have a layer called STUFF or any other name. | |
// Layer names don't all need to be of the same length, obviously, and you can also skip them | |
// entirely and just use numbers. | |
#define _QWERTY 0 | |
#define _CFG 1 | |
#define _SYMBOL 2 | |
#define _NUM 3 | |
#define _MEDIA 4 | |
enum custom_keycodes { | |
CFG, | |
ST_SYM, | |
ST_NUM, | |
ST_MDIA, | |
ST_CTRL, | |
ST_SHFT, | |
ST_META, | |
ST_ALT, | |
KC_INEN, | |
KC_INJA, | |
}; | |
// Fillers to make layering more clear | |
#define _______ KC_TRNS | |
#define XXXXXXX KC_NO | |
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |
[_QWERTY] = LAYOUT_ortho_4x12( | |
KC_Q, KC_W, KC_E, KC_R, KC_T, _______, _______, KC_Y, KC_U, KC_I, KC_O, KC_P, \ | |
KC_A, KC_S, KC_D, KC_F, KC_G, _______, _______, KC_H, KC_J, KC_K, KC_L, CFG, \ | |
KC_Z, KC_X, KC_C, KC_V, KC_B, _______, _______, KC_N, KC_M, KC_COLN, KC_DOT, KC_SPC, \ | |
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ | |
), | |
}; | |
const uint16_t PROGMEM virtual_keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |
[_CFG] = LAYOUT_ortho_4x12( \ | |
XXXXXXX, XXXXXXX, ST_SYM, ST_NUM, ST_MDIA, XXXXXXX, XXXXXXX, KC_ESC, KC_SPC, KC_TAB, XXXXXXX, XXXXXXX, \ | |
XXXXXXX, ST_ALT, ST_CTRL, ST_SHFT, ST_META, XXXXXXX, XXXXXXX, KC_ENT, KC_BSPC, XXXXXXX, XXXXXXX, CFG, \ | |
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_INEN, KC_INJA, KC_SCLN, XXXXXXX, XXXXXXX, \ | |
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX \ | |
), | |
[_SYMBOL] = LAYOUT_ortho_4x12( \ | |
KC_EXCLAIM, KC_DQUO, KC_HASH, KC_DLR, KC_PERC, _______, _______, KC_AMPR, KC_QUOTE,KC_LPRN, KC_RPRN, KC_MINS, \ | |
KC_TAB, KC_ASTR, KC_GRV, KC_PIPE, KC_LGUI, _______, _______, KC_LCBR, KC_RCBR, KC_LBRC, KC_RBRC, CFG, \ | |
KC_PLUS, KC_TILD, KC_AT, KC_CIRC, KC_LSFT, _______, _______, KC_UNDS, KC_EQL, KC_SCLN, KC_BSLS, KC_SLSH, \ | |
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ | |
), | |
[_NUM] = LAYOUT_ortho_4x12( \ | |
KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, _______, _______, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, \ | |
KC_1, KC_2, KC_3, KC_4, KC_5, _______, _______, KC_6, KC_7, KC_8, KC_9, CFG, \ | |
KC_F11, KC_F12, _______, KC_COMMA,KC_DOT, _______, _______, KC_0, KC_PLUS, KC_MINUS, KC_ASTR, KC_SLASH, \ | |
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ | |
), | |
[_MEDIA] = LAYOUT_ortho_4x12( \ | |
KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, _______, _______, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, \ | |
KC_1, KC_2, KC_3, KC_4, KC_5, _______, _______, KC_6, KC_7, KC_8, KC_9, CFG, \ | |
KC_F11, KC_F12, _______, KC_COMMA,KC_DOT, _______, _______, _______, KC_PLUS, KC_MINUS, KC_ASTR, KC_SLASH, \ | |
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ | |
), | |
}; | |
static uint8_t on_cfg = false; | |
static uint8_t cur_map = _QWERTY; | |
static uint16_t cur_modifiers = 0; | |
uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key) | |
{ | |
// Read entire word (16bits) | |
if (cur_map) { | |
return pgm_read_word(&virtual_keymaps[(cur_map)][(key.row)][(key.col)]) | cur_modifiers; | |
} else { | |
return pgm_read_word(&keymaps[(layer)][(key.row)][(key.col)]) | cur_modifiers; | |
} | |
} | |
bool process_record_user(uint16_t keycode, keyrecord_t *record) { | |
if ((keycode ^ cur_modifiers) == CFG) { | |
if (record->event.pressed && cur_map == _QWERTY && cur_modifiers == 0) { | |
on_cfg = true; | |
} else if (!record->event.pressed) { | |
cur_map = _QWERTY; | |
cur_modifiers = 0; | |
on_cfg = false; | |
} | |
return false; | |
} | |
if (on_cfg) { | |
uint16_t vk = pgm_read_word(&virtual_keymaps[(_CFG)][(record->event.key.row)][(record->event.key.col)]); | |
switch (vk) { | |
case ST_SYM: | |
if (record->event.pressed) { | |
cur_map = _SYMBOL; | |
} else { | |
on_cfg = false; | |
} | |
return false; | |
case ST_NUM: | |
if (record->event.pressed) { | |
cur_map = _NUM; | |
} else { | |
on_cfg = false; | |
} | |
return false; | |
case ST_MDIA: | |
if (record->event.pressed) { | |
cur_map = _MEDIA; | |
} else { | |
on_cfg = false; | |
} | |
return false; | |
case ST_CTRL: | |
if (record->event.pressed) { | |
cur_modifiers |= QK_LCTL; | |
} else { | |
on_cfg = false; | |
} | |
return false; | |
case ST_SHFT: | |
if (record->event.pressed) { | |
cur_modifiers |= QK_LSFT; | |
} else { | |
on_cfg = false; | |
} | |
return false; | |
case ST_META: | |
if (record->event.pressed) { | |
cur_modifiers |= QK_LGUI; | |
} else { | |
on_cfg = false; | |
} | |
return false; | |
case ST_ALT: | |
if (record->event.pressed) { | |
cur_modifiers |= QK_LALT; | |
} else { | |
on_cfg = false; | |
} | |
return false; | |
case KC_INEN: | |
if (record->event.pressed) { | |
register_code16(KC_SCLN | QK_LCTL | QK_LSFT); | |
unregister_code16(KC_SCLN | QK_LCTL | QK_LSFT); | |
} | |
return false; | |
case KC_INJA: | |
if (record->event.pressed) { | |
register_code16(KC_J| QK_LCTL | QK_LSFT); | |
unregister_code16(KC_J| QK_LCTL | QK_LSFT); | |
} | |
return false; | |
default: | |
if (record->event.pressed) { | |
register_code16(vk | cur_modifiers); | |
} else { | |
unregister_code16(vk | cur_modifiers); | |
} | |
return false; | |
} | |
} | |
return true; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment