Skip to content

Instantly share code, notes, and snippets.

@tomykaira
Created June 23, 2018 18:52
Show Gist options
  • Save tomykaira/f767d2f30cfd50f697a77495c4535d0b to your computer and use it in GitHub Desktop.
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.
// 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