elvqmk

13 commits
Updated 2026-03-05 19:31:44
keyboards/splitkb/halcyon/elora/rev2/keymaps/elv
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;
}