Skip to content

Instantly share code, notes, and snippets.

@nclundsten

nclundsten/keymap.c

Last active Aug 29, 2016
Embed
What would you like to do?
my hacked up teckinesys keymap
#include "ergodox.h"
#include "led.h"
#include "debug.h"
#include "action_layer.h"
#include "action_util.h"
#include "mousekey.h"
#define BASE 0 // default layer
#define SYMB 1 // symbols layer
#define MDIA 2 // media layer
#define SPEC 3 // special layer
#define LCaps 10 // left caps-shift key
#define LSymb 11 // left symbol-shift key
#define LMdia 12 // left media-shift key
#define LSpec 13 // left special-shift key
#define RCaps 14 // right caps-shift key
#define RSymb 15 // right symbol-shift key
#define RMdia 16 // right media-shift key
#define RSpec 17 // right special-shift key
#define MUL 20 // mouse up left
#define MUR 21 // mouse up right
#define MDL 22 // mouse down left
#define MDR 23 // mouse down right
//macros to disable shifted symbols on numbers
#define Zero 230 //
#define One 231 //
#define Two 232 //
#define Thre 233 //
#define Four 234 //
#define Five 235 //
#define Six 236 //
#define Sevn 237 //
#define Eigt 238 //
#define Nine 239 //
enum {
// Tap/Hold
TH_1 ,TH_2 ,TH_3 ,TH_4 ,TH_5 ,TH_6 ,TH_7 ,TH_8 ,TH_9 ,TH_0
,TH_Q ,TH_W ,TH_E ,TH_R ,TH_T ,TH_Y ,TH_U ,TH_I ,TH_O ,TH_P
,TH_A ,TH_S ,TH_D ,TH_F ,TH_G ,TH_H ,TH_J ,TH_K ,TH_L
,TH_Z ,TH_X ,TH_C ,TH_V ,TH_B ,TH_N ,TH_M ,TH_COMM ,TH_DOT
};
static uint16_t* taphold_table[] = {
[TH_1] = {KC_1 ,KC_F1} // 1 F1
,[TH_2] = {KC_2 ,KC_F2} // 2 F2
,[TH_3] = {KC_3 ,KC_F3} // 3 F3
,[TH_Q] = {KC_Q ,KC_EXLM} // Q !
,[TH_W] = {KC_W ,KC_AT} // W @
,[TH_E] = {KC_E ,KC_HASH} // E #
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/******* Base Layer ********************************************************************************************************
*
* ,------------------------------------------------------. ,------------------------------------------------------.
* | Special | 1 | 2 | 3 | 4 | 5 | | | | 6 | 7 | 8 | 9 | 0 | Special |
* |------------+------+------+------+------+-------------| |------+------+------+------+------+------+------------|
* | Esc | Q | W | E | R | T | | | | Y | U | I | O | P | / |
* |------------+------+------+------+------+------| | | |------+------+------+------+------+------------|
* | Tab | A | S | D | F | G |------| |------| H | J | K | L | ; | '" |
* |------------+------+------+------+------+------| | | |------+------+------+------+------+------------|
* | Capitals | Z | X | C | V | B | | | | N | M | , | . | / | Capitals |
* `------------+------+------+------+------+-------------' `-------------+------+------+------+------+------------'
* | LCtrl |Meh/\ |Hypr//| LAlt | LSymb| | RSymb| RAlt |Hypr/[|Meh/] | RCtrl |
* `-----------------------------------' `-----------------------------------'
* ,-------------. ,-------------.
* | Home | End | | Left | Right|
* ,------|------|------| |------+------+------.
* | | | PgUp | | Up | | |
* |Backsp| Del |------| |------| Enter| Space|
* | | | PgDn | | Down | | |
* `--------------------' `--------------------'
*/
[BASE] = KEYMAP(
// left hand
F(LSpec) ,M(TH_1),M(Two) ,M(Thre),M(Four),M(Five),KC_NO
,KC_ESC ,M(TH_Q),KC_W ,KC_E ,KC_R ,KC_T ,KC_NO
,KC_TAB ,KC_A ,KC_S ,KC_D ,KC_F ,KC_G
,M(LCaps) ,KC_Z ,KC_X ,KC_C ,KC_V ,KC_B ,KC_NO
,KC_LCTL ,KC_LGUI,KC_LALT,KC_NO ,M(LSymb)
,KC_HOME,KC_END
,KC_PGUP
,KC_BSPC,KC_DEL ,KC_PGDN
// right hand
,KC_NO ,M(Six) ,M(Sevn),M(Eigt),M(Nine),M(Zero) ,F(RSpec)
,KC_NO ,KC_Y ,KC_U ,KC_I ,KC_O ,KC_P ,KC_BSLS
,KC_H ,KC_J ,KC_K ,KC_L ,KC_SCLN ,KC_QUOT
,KC_NO ,KC_N ,KC_M ,KC_COMM,KC_DOT ,KC_SLSH ,M(RCaps)
,M(RSymb),KC_NO ,KC_NO ,KC_NO ,KC_RCTL
,KC_LEFT ,KC_RGHT
,KC_UP
,KC_DOWN ,KC_ENT ,KC_SPC
),
/******* Symbols Layer *****************************************************************************************************
*
* ,-----------------------------------------------------. ,-----------------------------------------------------.
* | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | |
* |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------|
* | | ! | @ | # | $ | % | | | | ^ | & | * | + | | |
* |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
* | | | | [ | ] | ` |------| |------| / | { | } | - | _ | |
* |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
* | | | | | ( | ) | ~ | | | | \ | = | < | > | | |
* `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------'
* | LCtrl | Meh |Hyper | LAlt | LGui | |RGui/0|RAlt/.|Hypr/=|Meh/+ |RCtrl/Ent|
* `-----------------------------------' `-------------------------------------'
* ,-------------. ,-------------.
* | Left | Right| | | |
* ,------|------|------| |------+------+------.
* | | | Up | | | | |
* |Space |Enter |------| |------|BackSp| Del |
* | | | Down | | | | |
* `--------------------' `--------------------'
*/
[SYMB] = KEYMAP(
// left hand
KC_TRNS ,KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 ,KC_NO
,KC_TRNS ,KC_EXLM ,KC_AT ,KC_HASH ,KC_DLR ,KC_PERC ,LSFT(KC_COMM)
,KC_TRNS ,KC_NO ,KC_NO ,KC_LBRC ,KC_RBRC ,KC_GRV
,KC_TRNS ,KC_NO ,KC_PIPE ,KC_LPRN ,KC_RPRN ,KC_TILD ,KC_TAB
,KC_LCTL ,KC_MEH ,KC_HYPR ,KC_LALT ,KC_TRNS
,KC_TRNS ,KC_TRNS
,KC_TRNS
,KC_TRNS ,KC_TRNS ,KC_TRNS
// right hand
,KC_NO ,KC_F6 ,KC_F7 ,KC_F8 ,KC_F9 ,KC_F10 ,KC_TRNS
,LSFT(KC_DOT),KC_CIRC ,KC_AMPR ,KC_ASTR ,KC_PLUS,KC_NO ,KC_TRNS
,KC_SLSH ,KC_LCBR ,KC_RCBR ,KC_MINS,KC_UNDS,KC_TRNS
,LSFT(KC_TAB),KC_BSLS ,KC_EQL ,KC_LABK ,KC_RABK,KC_NO ,KC_TRNS
,KC_TRNS,ALT_T(KC_DOT),ALL_T(KC_EQL),MEH_T(KC_PLUS),CTL_T(KC_ENT)
,KC_TRNS ,KC_TRNS
,KC_TRNS
,KC_TRNS ,KC_TRNS ,KC_TRNS
),
/******* Media Layer *******************************************************************************************************
*
* ,---------------------------------------------------------------. ,---------------------------------------------------------------.
* | | F11 | F12 | F13 | F14 | F15 | Esc | | | F16 | F17 | F18 | F19 | F20 | |
* |------+---------+---------+---------+---------+----------------| |------+---------+---------+---------+---------+---------+------|
* | | |MouseUpLf|Mouse Up |MouseUpRg|Volume Up|Scroll| |Scroll|PrintScrn| Home | Up | PgUp | | |
* |------+---------+---------+---------+---------+---------| Up | | Up |---------+---------+---------+---------+---------+------|
* | | |MouseLeft|MouseDown|MouseRght|Volume Dn|------| |------| Left | Down | Up | Right | | |
* |------+---------+---------+---------+---------+---------|Scroll| |Scroll|---------+---------+---------+---------+---------+------|
* | | |MouseDnLf|MouseDown|MouseDnRg| Mute | Down | | Down | | End | Down | PgDn | | |
* `------+---------+---------+---------+---------+----------------' `----------------+---------+---------+---------+---------+------'
* |LCtrl| Meh | MClick | LClick | R Click| |Cmd/Insrt|Optn/Del | Hyper | Meh |RCtrl|
* `---------------------------------------------' `---------------------------------------------'
* ,-------------. ,-------------.
* | Stop |Refrsh| | Prev | Next |
* ,------|------|------| |------+------+------.
* |Brwser|Brwser|Search| |VolUp | | |
* |Back | Fwd |------| |------| Stop | Play-|
* | | | Home | |VolDn | | Pause|
* `--------------------' `--------------------'
*/
[MDIA] = KEYMAP(
// left hand
KC_TRNS ,KC_F11 ,KC_F12 ,KC_F13 ,KC_F14 ,KC_F15 ,KC_ESC
,KC_TRNS ,KC_NO ,M(MUL) ,KC_MS_U ,M(MUR) ,KC_VOLU ,KC_WH_U
,KC_TRNS ,KC_NO ,KC_MS_L ,KC_MS_D ,KC_MS_R ,KC_VOLD
,KC_TRNS ,KC_NO ,M(MDL) ,KC_MS_D ,M(MDR) ,KC_MUTE ,KC_WH_D
,KC_LCTL ,KC_MEH ,KC_BTN3 ,KC_BTN1 ,KC_BTN2
,KC_WSTP ,KC_WREF
,KC_WSCH
,KC_WBAK ,KC_NO ,KC_WHOM
// right hand
,KC_NO ,KC_F16 ,KC_F17 ,KC_F18 ,KC_F19 ,KC_F20 ,KC_TRNS
,KC_WH_U ,KC_PSCR ,KC_HOME ,KC_UP ,KC_PGUP ,KC_NO ,KC_TRNS
,KC_LEFT ,KC_DOWN ,KC_UP ,KC_RIGHT,KC_NO ,KC_TRNS
,KC_WH_D ,KC_NO ,KC_END ,KC_DOWN ,KC_PGDN ,KC_NO ,KC_TRNS
,GUI_T(KC_INS),ALT_T(KC_DEL),KC_HYPR ,KC_MEH ,KC_RCTL
,KC_MPRV ,KC_MNXT
,KC_VOLU
,KC_VOLD ,KC_MSTP ,KC_MPLY
),
/******* Special Layer *****************************************************************************************************
*
* ,-----------------------------------------------------. ,-----------------------------------------------------.
* | | Esc | | | | | | | | | | | | Bspc | |
* |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------|
* | | | | | | | | | | | | | | | |
* |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
* | | | | | | |------| |------| | | | | | |
* |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
* | | | | | | | | | | | | | | | RShift |
* `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------'
* | | | | | | | | | | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
[SPEC] = KEYMAP(
// left hand
KC_TRNS ,KC_ESC ,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
,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
// right hand
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_BSPC ,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 ,KC_TRNS ,KC_TRNS ,KC_RSFT
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,KC_TRNS ,KC_TRNS
,KC_TRNS
,KC_TRNS ,KC_TRNS ,KC_TRNS
)
};
const uint16_t PROGMEM fn_actions[] = {
// the faux shift keys are implemented as macro taps
[LCaps] = ACTION_MACRO_TAP(LCaps)
,[LSymb] = ACTION_MACRO_TAP(LSymb)
,[LMdia] = ACTION_MACRO_TAP(LMdia)
,[LSpec] = ACTION_MACRO_TAP(LSpec)
,[RCaps] = ACTION_MACRO_TAP(RCaps)
,[RSymb] = ACTION_MACRO_TAP(RSymb)
,[RMdia] = ACTION_MACRO_TAP(RMdia)
,[RSpec] = ACTION_MACRO_TAP(RSpec)
};
uint16_t caps_shift = 0;
uint16_t symb_shift = 0;
uint16_t mdia_shift = 0;
bool symb_lock = false;
bool mdia_lock = false;
uint16_t kc = 0;
bool tap = false;
const macro_t *action_get_macro(keyrecord_t *record ,uint8_t id ,uint8_t opt)
{
switch(id) {
case One:
if(record->event.pressed) {
unregister_code(KC_LSFT);
unregister_code(KC_RSFT);
register_code(KC_1);
} else {
unregister_code(KC_1);
}
break;
case Two:
if(record->event.pressed) {
unregister_code(KC_LSFT);
unregister_code(KC_RSFT);
register_code(KC_2);
} else {
unregister_code(KC_2);
}
break;
case Thre:
if(record->event.pressed) {
unregister_code(KC_LSFT);
unregister_code(KC_RSFT);
register_code(KC_3);
} else {
unregister_code(KC_3);
}
break;
case Four:
if(record->event.pressed) {
unregister_code(KC_LSFT);
unregister_code(KC_RSFT);
register_code(KC_4);
} else {
unregister_code(KC_4);
}
break;
case Five:
if(record->event.pressed) {
unregister_code(KC_LSFT);
unregister_code(KC_RSFT);
register_code(KC_5);
} else {
unregister_code(KC_5);
}
break;
case Six:
if(record->event.pressed) {
unregister_code(KC_LSFT);
unregister_code(KC_RSFT);
register_code(KC_6);
} else {
unregister_code(KC_6);
}
break;
case Sevn:
if(record->event.pressed) {
unregister_code(KC_LSFT);
unregister_code(KC_RSFT);
register_code(KC_7);
} else {
unregister_code(KC_7);
}
break;
case Eigt:
if(record->event.pressed) {
unregister_code(KC_LSFT);
unregister_code(KC_RSFT);
register_code(KC_8);
} else {
unregister_code(KC_8);
}
break;
case Nine:
if(record->event.pressed) {
unregister_code(KC_LSFT);
unregister_code(KC_RSFT);
register_code(KC_9);
} else {
unregister_code(KC_9);
}
break;
case Zero:
if(record->event.pressed) {
unregister_code(KC_LSFT);
unregister_code(KC_RSFT);
register_code(KC_0);
} else {
unregister_code(KC_0);
}
break;
case TH_1 ... TH_DOT:
// //// decide if tap or hold
// //tap = false;
// //if (tap)
// // kc = taphold_table[keycode][0];
// //else
// // kc = taphold_table[keycode][1];
// //if (record->event.pressed)
// // register_code(kc);
// //else
// // unregister_code(kc);
// //break;
break;
// There are two shift keys for each layer so we increment a layer_shift var when one
// is pressed and decrement when one is released. If both are pressed at the same time
// then the layer is locked (or unlocked). The shift counts are bound between 0 and 2
// only because sometimes rapid pressing led to irregular events; this way the states
// are self healing during use.
case LCaps: // both caps-shift keys trigger Left Shift
case RCaps: // so they don't interfere with the magic combo
if (record->event.pressed && !record->tap.count) {
if(++caps_shift > 2) caps_shift = 2;
if(caps_shift == 2) {
register_code(KC_CAPS);
unregister_code(KC_CAPS);
} else if(caps_shift == 1) {
register_code(KC_LSFT);
}
} else {
if(--caps_shift < 0) caps_shift = 0;
if(caps_shift == 0) unregister_code(KC_LSFT);
}
break;
case LSymb:
if (record->event.pressed) {
if(++symb_shift > 2) symb_shift = 2;
if(symb_shift == 2) {
symb_lock = !symb_lock;
} else if(symb_shift == 1) {
layer_on(SYMB);
}
} else {
if(--symb_shift < 0) symb_shift = 0;
if((!symb_shift) && (!symb_lock)) layer_off(SYMB);
}
break;
case LMdia:
if (record->event.pressed) {
if (record->tap.count && (!mdia_shift) && (!mdia_lock)) {
register_code(KC_ESC);
} else {
if(++mdia_shift > 2) mdia_shift = 2;
if(mdia_shift == 2) {
mdia_lock = !mdia_lock;
} else if(mdia_shift == 1) {
layer_on(MDIA);
}
}
} else {
if(record->tap.count && (!mdia_shift) && (!mdia_lock)) {
unregister_code(KC_ESC);
} else {
if(--mdia_shift < 0) mdia_shift = 0;
if((!mdia_shift) && (!mdia_lock)) layer_off(MDIA);
}
}
break;
case LSpec:
if (record->event.pressed) {
//if (record->tap.count && !record->tap.interrupted) {
// register_code(KC_EQL);
//} else {
layer_on(SPEC);
//}
} else {
//if(record->tap.count && !record->tap.interrupted) {
// unregister_code(KC_EQL);
//} else {
layer_off(SPEC);
//}
}
break;
case RSymb:
if (record->event.pressed) {
if(++symb_shift > 2) symb_shift = 2;
if(symb_shift == 2) {
symb_lock = !symb_lock;
} else if(symb_shift == 1) {
layer_on(SYMB);
}
} else {
if(--symb_shift < 0) symb_shift = 0;
if((!symb_shift) && (!symb_lock)) layer_off(SYMB);
}
break;
case RMdia:
if (record->event.pressed) {
//if (record->tap.count && (!mdia_shift) && (!mdia_lock)) {
// register_code(KC_BSLS);
//} else {
if(++mdia_shift > 2) mdia_shift = 2;
if(mdia_shift == 2) {
mdia_lock = !mdia_lock;
} else if(mdia_shift == 1) {
layer_on(MDIA);
}
//}
} else {
//if(record->tap.count && (!mdia_shift) && (!mdia_lock)) {
// unregister_code(KC_BSLS);
//} else {
if(--mdia_shift < 0) mdia_shift = 0;
if((!mdia_shift) && (!mdia_lock)) layer_off(MDIA);
//}
}
break;
case RSpec:
if (record->event.pressed) {
//if (record->tap.count && !record->tap.interrupted) {
// register_code(KC_MINS);
//} else {
layer_on(SPEC);
//}
} else {
//if(record->tap.count && !record->tap.interrupted) {
// unregister_code(KC_MINS);
//} else {
layer_off(SPEC);
//}
}
break;
// mouse diagonals
case MUL: // mouse up left
if (record->event.pressed) {
mousekey_on(KC_MS_UP);
mousekey_on(KC_MS_LEFT);
mousekey_send();
} else {
mousekey_off(KC_MS_UP);
mousekey_off(KC_MS_LEFT);
mousekey_send();
}
break;
case MUR: // mouse up right
if (record->event.pressed) {
mousekey_on(KC_MS_UP);
mousekey_on(KC_MS_RIGHT);
mousekey_send();
} else {
mousekey_off(KC_MS_UP);
mousekey_off(KC_MS_RIGHT);
mousekey_send();
}
break;
case MDL: // mouse down left
if (record->event.pressed) {
mousekey_on(KC_MS_DOWN);
mousekey_on(KC_MS_LEFT);
mousekey_send();
} else {
mousekey_off(KC_MS_DOWN);
mousekey_off(KC_MS_LEFT);
mousekey_send();
}
break;
case MDR: // mouse down right
if (record->event.pressed) {
mousekey_on(KC_MS_DOWN);
mousekey_on(KC_MS_RIGHT);
mousekey_send();
} else {
mousekey_off(KC_MS_DOWN);
mousekey_off(KC_MS_RIGHT);
mousekey_send();
}
break;
default:
// none
break;
}
return MACRO_NONE;
};
// Runs just one time when the keyboard initializes.
void matrix_init_user(void) {
};
// Runs constantly in the background ,in a loop.
void matrix_scan_user(void) {
// shift or caps lock turns on blue light
if(caps_shift || (keyboard_report->mods & MOD_BIT(KC_RSFT)) || (host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK))) {
ergodox_right_led_3_on();
} else {
ergodox_right_led_3_off();
}
// Symbol layer turns on green light
if(layer_state & (1UL<<SYMB)) {
ergodox_right_led_2_on();
} else {
ergodox_right_led_2_off();
}
// Media layer turns on red light
if(layer_state & (1UL<<MDIA)) {
ergodox_right_led_1_on();
} else {
ergodox_right_led_1_off();
ergodox_board_led_off();
}
// Special layer turns on board led (in reset hole)
if(layer_state & (1UL<<SPEC)) {
ergodox_board_led_on();
} else {
ergodox_board_led_off();
}
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment