keyboards/splitkb/halcyon/elora/rev2/keymaps/elv/keymap.c
/*
A Colemak derivation for french azerty os layout with the Halcyon Elora Rev2 from SplitKb.com
,---------------|---------------|---------------|---------------|---------------|---------------.
| ESC | 1 | 2 | 3 | 4 | 5 |
|---------------|---------------|---------------|---------------|---------------|---------------|
| Tab | Q | W | F | P | B |
|---------------|---------------|---------------|---------------|---------------|---------------|
| BackSpace | A | R | S | T | G |
|---------------|---------------|---------------|---------------|---------------|---------------|---------------|---------------.
| LCtrl | Z | X | C | D | V | | RGB_OFF |
`---------------|---------------|---------------|---------------|---------------|---------------|---------------|---------------|
| GUI | ACCENT/CODE | Space | Shift | |
`---------------|---------------|---------------|---------------|---------------'
,---------------|---------------|---------------|---------------|---------------|---------------.
| 6 | 7 | 8 | 9 | 0 | |
|---------------|---------------|---------------|---------------|---------------|---------------|
| J | L | U | Y | . | |
|---------------|---------------|---------------|---------------|---------------|---------------|
| M | N | E | I | O | , |
,---------------|---------------|---------------|---------------|---------------|---------------|---------------|---------------|
| RGB_ON | | K | H | ' | " | | |
|---------------|---------------|---------------|---------------|---------------|---------------|---------------|---------------'
| | Shift | Space | LSft/CODE | |
`---------------|---------------|---------------|---------------|---------------'
*/
#include QMK_KEYBOARD_H
#include "elv.h"
#define LAYOUT_SPLIT( \
L00, L01, L02, L03, L04, L05, \
L10, L11, L12, L13, L14, L15, \
L20, L21, L22, L23, L24, L25, \
L30, L31, L32, L33, L34, L35, L36, L37, \
L40, L41, L42, L43, L44, \
R00, R01, R02, R03, R04, R05, \
R10, R11, R12, R13, R14, R15, \
R20, R21, R22, R23, R24, R25, \
R30, R31, R32, R33, R34, R35, R36, R37, \
R40, R41, R42, R43, R44 \
) \
LAYOUT( \
L00, L01, L02, L03, L04, L05, \
R00, R01, R02, R03, R04, R05, \
L10, L11, L12, L13, L14, L15, \
R10, R11, R12, R13, R14, R15, \
L20, L21, L22, L23, L24, L25, \
R20, R21, R22, R23, R24, R25, \
L30, L31, L32, L33, L34, L35, L36, L37, \
R30, R31, R32, R33, R34, R35, R36, R37, \
L40, L41, L42, L43, L44, \
R40, R41, R42, R43, R44 \
)
enum layers {
ELV_COLEMAK = 0,
ELV_COLEMAK_CTL,
ELV_COLEMAK_CODE,
ELV_COLEMAK_ACCENT,
};
#define ELV_ACC_CODE LT(ELV_COLEMAK_CODE, KC_1)
#define ELV_SFT_CODE LT(ELV_COLEMAK_CODE, KC_2)
#define ELV_CTL_SWITCH MO(ELV_COLEMAK_CTL)
enum custom_keycodes {
ELV_ECIR = SAFE_RANGE,
ELV_ACIR,
ELV_ICIR,
ELV_OCIR,
ELV_UCIR,
ELV_EDIA,
ELV_IDIA,
};
// clang-format off
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[ELV_COLEMAK] = LAYOUT_SPLIT(
// ,---------------|---------------|---------------|---------------|---------------|---------------.
ELV_ESC , ELV_1 , ELV_2 , ELV_3 , ELV_4 , ELV_5
// |---------------|---------------|---------------|---------------|---------------|---------------|
, ELV_TAB , ELV_Q , ELV_W , ELV_F , ELV_P , ELV_B
// |---------------|---------------|---------------|---------------|---------------|---------------|
, ELV_BSPC , ELV_A , ELV_R , ELV_S , ELV_T , ELV_G
// |---------------|---------------|---------------|---------------|---------------|---------------|---------------|---------------.
,ELV_CTL_SWITCH , ELV_Z , ELV_X , ELV_C , ELV_D , ELV_V , ELV_NO , RM_OFF
// `---------------|---------------|---------------|---------------|---------------|---------------|---------------|---------------|
, ELV_GUI , ELV_ACC_CODE , ELV_SPACE , ELV_SFT , ELV_NO
// `---------------|---------------|---------------|---------------|---------------'
// ,---------------|---------------|---------------|---------------|---------------|---------------.
, ELV_6 , ELV_7 , ELV_8 , ELV_9 , ELV_0 , ELV_NO
// |---------------|---------------|---------------|---------------|---------------|---------------|
, ELV_J , ELV_L , ELV_U , ELV_Y , ELV_DOT , ELV_NO
// |---------------|---------------|---------------|---------------|---------------|---------------|
, ELV_M , ELV_N , ELV_E , ELV_I , ELV_O , ELV_COMM
// ,---------------|---------------|---------------|---------------|---------------|---------------|---------------|---------------|
, RM_ON , ELV_NO , ELV_K , ELV_H , ELV_QUOT , ELV_DQUO , ELV_NO , ELV_NO
// |---------------|---------------|---------------|---------------|---------------|---------------|---------------|---------------'
, ELV_NO , ELV_SFT , ELV_SPACE , ELV_SFT_CODE , ELV_NO
// `---------------|---------------|---------------|---------------|---------------'
),
[ELV_COLEMAK_CTL] = LAYOUT_SPLIT(
// ,---------------|---------------|---------------|---------------|---------------|---------------.
ELV_NO , ELV_NO , ELV_NO , ELV_NO , ELV_NO , ELV_NO
// |---------------|---------------|---------------|---------------|---------------|---------------|
, ELV_NO , C(ELV_A) , C(ELV_Z) , C(ELV_E) , C(ELV_R) , C(ELV_T)
// |---------------|---------------|---------------|---------------|---------------|---------------|
, C(ELV_BSPC) , ELV_NO , C(ELV_S) , C(ELV_D) , C(ELV_F) , ELV_HOME
// |---------------|---------------|---------------|---------------|---------------|---------------|---------------|---------------.
, ELV_NO , ELV_NO , C(ELV_W) , C(ELV_X) , C(ELV_C) , C(ELV_V) , ELV_NO , ELV_NO
// `---------------|---------------|---------------|---------------|---------------|---------------|---------------|---------------|
, ELV_NO , ELV_ACC_CODE , ELV_SPACE , ELV_NO , ELV_NO
// `---------------|---------------|---------------|---------------|---------------'
// ,---------------|---------------|---------------|---------------|---------------|---------------.
, ELV_NO , ELV_NO , ELV_NO , ELV_NO , ELV_NO , ELV_NO
// |---------------|---------------|---------------|---------------|---------------|---------------|
, C(ELV_Y) , C(ELV_U) , C(ELV_I) , C(ELV_O) , C(ELV_P) , ELV_NO
// |---------------|---------------|---------------|---------------|---------------|---------------|
, ELV_END , C(S(ELV_LEFT)), C(S(ELV_UP)) ,C(S(ELV_RIGHT)), C(ELV_M) , ELV_NO
// ,---------------|---------------|---------------|---------------|---------------|---------------|---------------|---------------|
, ELV_NO , ELV_NO , ELV_NO , ELV_NO , C(S(ELV_DOWN)), ELV_NO , ELV_NO , ELV_NO
// |---------------|---------------|---------------|---------------|---------------|---------------|---------------|---------------'
, ELV_NO , ELV_SFT , ELV_SPACE , ELV_SFT_CODE , ELV_NO
// `---------------|---------------|---------------|---------------|---------------'
),
[ELV_COLEMAK_CODE] = LAYOUT_SPLIT(
// ,---------------|---------------|---------------|---------------|---------------|---------------.
ELV_NO , ELV_EXLM , ELV_AT , ELV_HASH , ELV_DLR , ELV_PERC
// |---------------|---------------|---------------|---------------|---------------|---------------|
, ELV_NO , ELV_NO , ELV_LBRC , ELV_EQL , ELV_RBRC , ELV_NO
// |---------------|---------------|---------------|---------------|---------------|---------------|
, ELV_BSPC , ELV_TAB , ELV_LCBR , ELV_COLN , ELV_RCBR , ELV_NO
// |---------------|---------------|---------------|---------------|---------------|---------------|---------------|---------------.
, ELV_CTL , ELV_NO , ELV_SLSH , ELV_NO , ELV_BSLS , ELV_PIPE , ELV_NO , ELV_NO
// `---------------|---------------|---------------|---------------|---------------|---------------|---------------|---------------|
, ELV_NO , ELV_NO , ELV_SPACE , ELV_NO , ELV_NO
// `---------------|---------------|---------------|---------------|---------------'
// ,---------------|---------------|---------------|---------------|---------------|---------------.
, ELV_CIRC , ELV_AMPR , ELV_ASTR , ELV_LPRN , ELV_RPRN , ELV_NO
// |---------------|---------------|---------------|---------------|---------------|---------------|
, ELV_TILD , ELV_PLUS , ELV_UNDS , ELV_MINS , ELV_NO , ELV_NO
// |---------------|---------------|---------------|---------------|---------------|---------------|
, ELV_GRV , ELV_LEFT , ELV_UP , ELV_RIGHT , ELV_ENT , ELV_SCLN
// ,---------------|---------------|---------------|---------------|---------------|---------------|---------------|---------------|
, ELV_NO , ELV_NO , ELV_QUES , ELV_LABK , ELV_DOWN , ELV_RABK , ELV_NO , ELV_NO
// |---------------|---------------|---------------|---------------|---------------|---------------|---------------|---------------'
, ELV_NO , ELV_SFT , ELV_SPACE , ELV_NO , ELV_NO
// `---------------|---------------|---------------|---------------|---------------'
),
[ELV_COLEMAK_ACCENT] = LAYOUT_SPLIT(
// ,---------------|---------------|---------------|---------------|---------------|---------------.
ELV_NO , ELV_NO , ELV_NO , ELV_NO , ELV_NO , ELV_NO
// |---------------|---------------|---------------|---------------|---------------|---------------|
, ELV_NO , ELV_NO , ELV_NO , ELV_NO , ELV_NO , ELV_NO
// |---------------|---------------|---------------|---------------|---------------|---------------|
, ELV_BSPC , ELV_AGRV , ELV_ACIR , ELV_NO , ELV_NO , ELV_NO
// |---------------|---------------|---------------|---------------|---------------|---------------|---------------|---------------.
, ELV_NO , ELV_NO , ELV_NO , ELV_CCED , ELV_NO , ELV_NO , ELV_NO , ELV_NO
// `---------------|---------------|---------------|---------------|---------------|---------------|---------------|---------------|
, ELV_NO , ELV_NO , ELV_SPACE , ELV_NO , ELV_NO
// `---------------|---------------|---------------|---------------|---------------'
// ,---------------|---------------|---------------|---------------|---------------|---------------.
, ELV_NO , ELV_NO , ELV_NO , ELV_NO , ELV_NO , ELV_NO
// |---------------|---------------|---------------|---------------|---------------|---------------|
, ELV_NO , ELV_UCIR , ELV_UGRV , ELV_IDIA , ELV_EDIA , ELV_NO
// |---------------|---------------|---------------|---------------|---------------|---------------|
, ELV_ECIR , ELV_EGRV , ELV_EACU , ELV_ICIR , ELV_OCIR , ELV_NO
// ,---------------|---------------|---------------|---------------|---------------|---------------|---------------|---------------|
, ELV_NO , ELV_NO , ELV_NO , ELV_NO , ELV_NO , ELV_NO , ELV_NO , ELV_NO
// |---------------|---------------|---------------|---------------|---------------|---------------|---------------|---------------'
, ELV_NO , ELV_SFT , ELV_SPACE , ELV_NO , ELV_NO
// `---------------|---------------|---------------|---------------|---------------'
)
};
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
if (
record->event.pressed == false
&& keycode != ELV_ACC_CODE
&& keycode != ELV_SFT_CODE
) {
clear_oneshot_layer_state(ONESHOT_PRESSED);
clear_oneshot_mods();
return true;
}
switch (keycode) {
case ELV_ECIR: tap_code16(ELV_CIRC); tap_code(ELV_E); return false;
case ELV_ACIR: tap_code16(ELV_CIRC); tap_code(ELV_A); return false;
case ELV_ICIR: tap_code16(ELV_CIRC); tap_code(ELV_I); return false;
case ELV_OCIR: tap_code16(ELV_CIRC); tap_code(ELV_O); return false;
case ELV_UCIR: tap_code16(ELV_CIRC); tap_code(ELV_U); return false;
case ELV_EDIA: tap_code16(ELV_DIAE); tap_code(ELV_E); return false;
case ELV_IDIA: tap_code16(ELV_DIAE); tap_code(ELV_I); return false;
case ELV_ACC_CODE: if (record->tap.count > 0 && record->event.pressed) {
set_oneshot_layer(ELV_COLEMAK_ACCENT, ONESHOT_START);
return false;
}
case ELV_SFT_CODE: if (record->tap.count > 0 && record->event.pressed) {
set_oneshot_mods(MOD_LSFT);
return false;
}
}
return true;
}