qmk_firmware

QMK firmware for my keyboards (Corne, Sweep Ferris) and trackball (Ploopy Adept)
Log | Files | Refs | Submodules | LICENSE

keymap.c (20971B)


      1 #include QMK_KEYBOARD_H
      2 
      3 typedef union {
      4   uint32_t raw;
      5   struct {
      6     bool thumb_alt :1;
      7     bool iso       :1;
      8   };
      9 } user_config_t;
     10 
     11 user_config_t user_config;
     12 
     13 #ifdef STENO_ENABLE
     14 #endif // STENO_ENABLE
     15 
     16 
     17 #define QWERTY_base  KC_GRV, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I,    KC_O,   KC_P,    KC_LBRC, KC_RBRC, \
     18                              KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K,    KC_L,   KC_SCLN, KC_QUOT, \
     19                              KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH
     20 #define DVORAK_base  KC_GRV, KC_QUOT, KC_COMM, KC_DOT,KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_LBRC, KC_RBRC, \
     21                              KC_A,    KC_O,    KC_E,  KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH, \
     22                              KC_SCLN, KC_Q,    KC_J,  KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z
     23 #define COLEMAK_base KC_GRV, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U,    KC_Y,   KC_SCLN, KC_LBRC, KC_RBRC, \
     24                              KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E,    KC_I,   KC_O,    KC_QUOT, \
     25                              KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH
     26 #define WORKMAN_base KC_GRV, KC_Q, KC_D, KC_R, KC_W, KC_B, KC_J, KC_F, KC_U,    KC_P,   KC_SCLN, KC_LBRC, KC_RBRC, \
     27                              KC_A, KC_S, KC_H, KC_T, KC_G, KC_Y, KC_N, KC_E,    KC_O,   KC_I,    KC_QUOT, \
     28                              KC_Z, KC_X, KC_M, KC_C, KC_V, KC_K, KC_L, KC_COMM, KC_DOT, KC_SLSH
     29 #ifdef ALT_LAYOUTS_ENABLE
     30 #include "keymap_dvorak.h"
     31 #include "keymap_colemak.h"
     32 #include "keymap_workman.h"
     33 #define DVK2QWE_base DV_GRV, DV_Q, DV_W, DV_E, DV_R, DV_T, DV_Y, DV_U, DV_I,    DV_O,   DV_P,    DV_LBRC, DV_RBRC, \
     34                              DV_A, DV_S, DV_D, DV_F, DV_G, DV_H, DV_J, DV_K,    DV_L,   DV_SCLN, DV_QUOT, \
     35                              DV_Z, DV_X, DV_C, DV_V, DV_B, DV_N, DV_M, DV_COMM, DV_DOT, DV_SLSH
     36 #define CMK2QWE_base KC_GRV, CM_Q, CM_W, CM_E, CM_R, CM_T, CM_Y, CM_U, CM_I,    CM_O,   CM_P,    KC_LBRC, KC_RBRC, \
     37                              CM_A, CM_S, CM_D, CM_F, CM_G, CM_H, CM_J, CM_K,    CM_L,   CM_SCLN, KC_QUOT, \
     38                              CM_Z, CM_X, CM_C, CM_V, CM_B, CM_N, CM_M, CM_COMM, CM_DOT, CM_SLSH
     39 #define WMN2QWE_base KC_GRV, WK_Q, WK_W, WK_E, WK_R, WK_T, WK_Y, WK_U, WK_I,    WK_O,   WK_P,    KC_LBRC, KC_RBRC, \
     40                              WK_A, WK_S, WK_D, WK_F, WK_G, WK_H, WK_J, WK_K,    WK_L,   WK_SCLN, KC_QUOT, \
     41                              WK_Z, WK_X, WK_C, WK_V, WK_B, WK_N, WK_M, KC_COMM, KC_DOT, KC_SLSH
     42 #define CMK2DVK_base KC_GRV, KC_QUOT, KC_COMM, KC_DOT,CM_P, CM_Y, CM_F, CM_G, CM_C, CM_R, CM_L, KC_LBRC, KC_RBRC, \
     43                              CM_A,    CM_O,    CM_E,  CM_U, CM_I, CM_D, CM_H, CM_T, CM_N, CM_S, CM_SLSH, \
     44                              CM_SCLN, CM_Q,    CM_J,  CM_K, CM_X, CM_B, CM_M, CM_W, CM_V, CM_Z
     45 #define WMN2DVK_base KC_GRV, KC_QUOT, KC_COMM, KC_DOT,WK_P, WK_Y, WK_F, WK_G, WK_C, WK_R, WK_L, KC_LBRC, KC_RBRC, \
     46                              WK_A,    WK_O,    WK_E,  WK_U, WK_I, WK_D, WK_H, WK_T, WK_N, WK_S, KC_SLSH, \
     47                              WK_SCLN, WK_Q,    WK_J,  WK_K, WK_X, WK_B, WK_M, WK_W, WK_V, WK_Z
     48 #define DVK2CMK_base DV_GRV, DV_Q, DV_W, DV_F, DV_P, DV_G, DV_J, DV_L, DV_U,    DV_Y,   DV_SCLN, DV_LBRC, DV_RBRC, \
     49                              DV_A, DV_R, DV_S, DV_T, DV_D, DV_H, DV_N, DV_E,    DV_I,   DV_O,    DV_QUOT, \
     50                              DV_Z, DV_X, DV_C, DV_V, DV_B, DV_K, DV_M, DV_COMM, DV_DOT, DV_SLSH
     51 #define WMN2CMK_base KC_GRV, WK_Q, WK_W, WK_F, WK_P, WK_G, WK_J, WK_L, WK_U,    WK_Y,   WK_SCLN, KC_LBRC, KC_RBRC, \
     52                              WK_A, WK_R, WK_S, WK_T, WK_D, WK_H, WK_N, WK_E,    WK_I,   WK_O,    KC_QUOT, \
     53                              WK_Z, WK_X, WK_C, WK_V, WK_B, WK_K, WK_M, KC_COMM, KC_DOT, KC_SLSH
     54 #define DVK2WMN_base DV_GRV, DV_Q, DV_D, DV_R, DV_W, DV_B, DV_J, DV_F, DV_U,    DV_P,   DV_SCLN, DV_LBRC, DV_RBRC, \
     55                              DV_A, DV_S, DV_H, DV_T, DV_G, DV_Y, DV_N, DV_E,    DV_O,   DV_I,    DV_QUOT, \
     56                              DV_Z, DV_X, DV_M, DV_C, DV_V, DV_K, DV_L, DV_COMM, DV_DOT, DV_SLSH
     57 #define CMK2WMN_base KC_GRV, CM_Q, CM_D, CM_R, CM_W, CM_B, CM_J, CM_F, CM_U,    CM_P,   CM_SCLN, KC_LBRC, KC_RBRC, \
     58                              CM_A, CM_S, CM_H, CM_T, CM_G, CM_Y, CM_N, CM_E,    CM_O,   CM_I,    KC_QUOT, \
     59                              CM_Z, CM_X, CM_M, CM_C, CM_V, CM_K, CM_L, CM_COMM, CM_DOT, CM_SLSH
     60 #endif // ALT_LAYOUTS_ENABLE
     61 
     62 enum jian_layers {
     63   _QWERTY,
     64 #ifdef ALT_LAYOUTS_ENABLE
     65   _DVORAK,
     66   _COLEMAK,
     67   _WORKMAN,
     68   _DVK2QWE,
     69   _DVK2CMK,
     70   _DVK2WMN,
     71   _CMK2QWE,
     72   _CMK2DVK,
     73   _CMK2WMN,
     74   _WMN2QWE,
     75   _WMN2DVK,
     76   _WMN2CMK,
     77 #endif // ALT_LAYOUTS_ENABLE
     78   _ISO,
     79   _LOWER,
     80   _RAISE,
     81   _ADJUST,
     82   _BCKLT_ADJ,
     83   _THUMB_ALT,
     84 #ifdef TRAINING_HALFES_LOCK
     85   _LEFT,
     86   _RIGHT,
     87 #endif //TRAINING_HALFES_LOCK
     88 #ifdef STENO_ENABLE
     89   _PLOVER
     90 #endif // STENO_ENABLE
     91 };
     92 
     93 enum jian_keycodes {
     94   QWERTY = SAFE_RANGE,
     95   PLOVER,
     96   EXT_PLV,
     97   EXT_RGB,
     98   ISO,
     99   THUMB_ALT,
    100 //ifdef ALT_LAYOUTS_ENABLE
    101   CH_WMN,
    102   CH_CMK,
    103   CH_QWE,
    104   CH_DVK,
    105 //endif // ALT_LAYOUTS_ENABLE
    106 #ifdef DIP_SWITCH_ENABLE
    107   LAYOUT0,
    108   LAYOUT1,
    109   LAYOUT2,
    110   LAYOUT3,
    111   DIP_ISO,
    112   FLIP_TH,
    113   DIP6,
    114   DIP7,
    115   DIP8,
    116   DIP9,
    117   DIP10,
    118   DIP11,
    119 #endif // DIP_SWITCH_ENABLE
    120 };
    121 
    122 #ifdef TRAINING_HALFES_LOCK
    123 static uint8_t lock_timeout = 1;
    124 static uint8_t lock_cooldown = 0;
    125 #endif //TRAINING_HALFES_LOCK
    126 #ifdef DIP_SWITCH_ENABLE
    127 #ifdef ALT_LAYOUTS_ENABLE
    128 static uint8_t layout_conversion_dip_state = 0;
    129 #endif // ALT_LAYOUTS_ENABLE
    130 #endif // DIP_SWITCH_ENABLE
    131 
    132 #define LOWER MO(_LOWER)
    133 #define RAISE MO(_RAISE)
    134 
    135 #define BL_ADJ  TG(_BCKLT_ADJ)
    136 #define TG_LWR  TG(_LOWER)
    137 #define TG_RSE  TG(_RAISE)
    138 
    139 #define RBR_RGU MT(MOD_RGUI, KC_RBRC)
    140 #define F12_RGU MT(MOD_RGUI, KC_F12)
    141 #define EQL_LCT MT(MOD_LCTL, KC_EQL)
    142 #define APP_LCT MT(MOD_LCTL, KC_APP)
    143 #define EQL_RCT MT(MOD_RCTL, KC_EQL)
    144 #define QUO_RCT MT(MOD_RCTL, KC_QUOT)
    145 #define APP_RCT MT(MOD_RCTL, KC_APP)
    146 #define MIN_RCT MT(MOD_RCTL, KC_MINS)
    147 #define PLS_LAL MT(MOD_LALT, KC_PPLS)
    148 #define BSL_RAL MT(MOD_RALT, KC_BSLS)
    149 
    150 #define NBS_LCT MT(MOD_LCTL, KC_NUBS)
    151 #define BSH_LAL MT(MOD_LALT, KC_BSLS)
    152 #define APP_RAL MT(MOD_RALT, KC_APP)
    153 
    154 #define BSP_LSH MT(MOD_LSFT, KC_BSPC)
    155 #define BSP_RSH MT(MOD_RSFT, KC_BSPC)
    156 #define SPC_LSH MT(MOD_LSFT, KC_SPC)
    157 #define SPC_RSH MT(MOD_RSFT, KC_SPC)
    158 #define DEL_RSE LT(_RAISE, KC_DEL)
    159 #define TAB_RSE LT(_RAISE, KC_TAB)
    160 #define ENT_LWR LT(_LOWER, KC_ENT)
    161 #define ESC_LWR LT(_LOWER, KC_ESC)
    162 
    163 #define RGU_RBR RGUI_T(KC_RBRC)
    164 #define RCT_QUO RCTL_T(KC_QUOT)
    165 
    166 #define LAYOUT_base( \
    167     GRV, Q, W, E, R, T, Y, U, I,    O,   P,    LBRC, RBRC, \
    168          A, S, D, F, G, H, J, K,    L,   SCLN, QUOT, \
    169          Z, X, C, V, B, N, M, COMM, DOT, SLSH \
    170   ) \
    171   LAYOUT( \
    172   KC_LGUI, GRV,     Q,       W,       E,       R,       T,            Y,       U,       I,       O,       P,       LBRC,    RGU_RBR, \
    173            KC_LCTL, A,       S,       D,       F,       G,            H,       J,       K,       L,       SCLN,    RCT_QUO, \
    174            KC_LALT, Z,       X,       C,       V,       B,            N,       M,       COMM,    DOT,     SLSH,    BSL_RAL, \
    175                                       TAB_RSE, SPC_LSH, ENT_LWR,      ESC_LWR, BSP_RSH, DEL_RSE \
    176   )
    177 #define LAYOUT_base_wrapper(...) LAYOUT_base(__VA_ARGS__)
    178 
    179 #ifdef SWAP_HANDS_ENABLE
    180 #define SW_TG SH_TOGG
    181 #else
    182 #define SW_TG _______
    183 #endif
    184 
    185 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    186 
    187 [_QWERTY] = LAYOUT_base_wrapper(QWERTY_base),
    188 
    189 [_LOWER] = LAYOUT(
    190   _______, KC_UNDS, KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,        KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  F12_RGU,
    191            EQL_LCT, KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC,      KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, MIN_RCT,
    192            PLS_LAL, KC_1,    KC_2,    KC_3,    KC_4,    KC_5,         KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    _______,
    193                                       _______, _______, _______,      _______,  _______, _______
    194 ),
    195 
    196 [_RAISE] = LAYOUT(
    197   _______, KC_NUM,  KC_PSLS, KC_P7,   KC_P8,   KC_P9,   KC_PMNS,      KC_VOLU, KC_HOME, KC_PSCR, KC_PGUP, KC_SCRL, KC_CAPS, _______,
    198            EQL_LCT, KC_PAST, KC_P4,   KC_P5,   KC_P6,   KC_PPLS,      KC_MUTE, KC_LEFT, KC_UP,   KC_RGHT, KC_INS,  APP_RCT,
    199            _______, KC_P0,   KC_P1,   KC_P2,   KC_P3,   KC_PCMM,      KC_VOLD, KC_END,  KC_DOWN, KC_PGDN, KC_PAUS, _______,
    200                                       _______, _______, _______,      _______, _______, _______
    201 ),
    202 
    203 [_ADJUST] = LAYOUT(
    204   QK_BOOT, DB_TOGG, AS_UP,   CH_WMN,  CH_CMK,  CH_QWE,  CH_DVK,       CH_DVK,  CH_QWE,  CH_CMK,  CH_WMN,  AS_UP,   DB_TOGG, QK_BOOT,
    205            AS_RPT,  AS_TOGG, XXXXXXX, XXXXXXX, QWERTY,  PLOVER,       PLOVER,  QWERTY,  XXXXXXX, XXXXXXX, AS_TOGG, AS_RPT,
    206            BL_ADJ,  AS_DOWN, XXXXXXX, XXXXXXX, ISO,     THUMB_ALT, THUMB_ALT,  ISO,     XXXXXXX, XXXXXXX, AS_DOWN, BL_ADJ,
    207                                       _______, SW_TG,   _______,      _______, SW_TG,   _______
    208 ),
    209 #if defined(RGBLIGHT) | defined(BACKLIGHT_ENABLE)
    210 [_BCKLT_ADJ] = LAYOUT(
    211   XXXXXXX, XXXXXXX, XXXXXXX, BL_UP,   UG_VALU, UG_HUED, UG_HUEU,      UG_HUEU, UG_HUED, UG_VALU, BL_UP,   XXXXXXX, XXXXXXX, XXXXXXX,
    212            XXXXXXX, XXXXXXX, BL_DOWN, UG_VALD, UG_SATD, UG_SATU,      UG_SATU, UG_SATD, UG_VALD, BL_DOWN, XXXXXXX, XXXXXXX,
    213            BL_ADJ,  BL_BRTG, BL_TOGG, UG_TOGG, UG_PREV, UG_NEXT,      UG_NEXT, UG_PREV, UG_TOGG, BL_TOGG, BL_BRTG, BL_ADJ,
    214                                       _______, _______, _______,      _______, _______, _______
    215 ),
    216 #endif // defined(RGBLIGHT) | defined(BACKLIGHT_ENABLE)
    217 #ifdef TRAINING_HALFES_LOCK
    218 [_LEFT] = LAYOUT_base(
    219   _______, _______, _______, _______, _______, _______,      XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______,
    220            _______, _______, _______, _______, _______,      XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______,
    221            _______, _______, _______, _______, _______,      XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
    222 ),
    223 
    224 [_RIGHT] = LAYOUT_base(
    225   XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,      _______, _______, _______, _______, _______, _______, _______,
    226            XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,      _______, _______, _______, _______, _______, _______,
    227            XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,      _______, _______, _______, _______, _______
    228 ),
    229 #endif // TRAINING_HALFES_LOCK
    230 
    231 #ifdef STENO_ENABLE
    232 [_PLOVER] = LAYOUT(
    233   EXT_PLV, STN_N1,  STN_N2,  STN_N3,  STN_N4,  STN_N5,  STN_N6,       STN_N7,  STN_N8,  STN_N9,  STN_NA,  STN_NB,  STN_NC,  EXT_PLV,
    234            STN_FN,  STN_S1,  STN_TL,  STN_PL,  STN_HL,  STN_ST1,      STN_ST3, STN_FR,  STN_PR,  STN_LR,  STN_TR,  STN_DR,
    235            XXXXXXX, STN_S2,  STN_KL,  STN_WL,  STN_RL,  STN_ST2,      STN_ST4, STN_RR,  STN_BR,  STN_GR,  STN_SR,  STN_ZR,
    236                                       XXXXXXX, STN_A,   STN_O,        STN_E,   STN_U,   XXXXXXX
    237 ),
    238 #endif // STENO_ENABLE
    239 
    240 [_THUMB_ALT] = LAYOUT(
    241   _______, _______, _______, _______, _______, _______, _______,      _______, _______, _______, _______, _______, _______, _______,
    242            _______, _______, _______, _______, _______, _______,      _______, _______, _______, _______, _______, _______,
    243            _______, _______, _______, _______, _______, _______,      _______, _______, _______, _______, _______, _______,
    244                                       DEL_RSE, BSP_LSH, ESC_LWR,      ENT_LWR, SPC_RSH, TAB_RSE
    245 ),
    246 
    247 [_ISO] = LAYOUT(
    248   _______, _______,         _______, _______, _______, _______, _______,      _______, _______, _______, _______, _______, _______, _______,
    249            LCTL_T(KC_NUBS), _______, _______, _______, _______, _______,      _______, _______, _______, _______, _______, _______,
    250            LALT_T(KC_NUHS), _______, _______, _______, _______, _______,      _______, _______, _______, _______, _______, KC_RALT,
    251                                               _______, _______, _______,      _______, _______, _______
    252 ),
    253 
    254 #ifdef ALT_LAYOUTS_ENABLE
    255 [_DVORAK] = LAYOUT_base_wrapper(DVORAK_base),
    256 [_COLEMAK] = LAYOUT_base_wrapper(COLEMAK_base),
    257 [_WORKMAN] = LAYOUT_base_wrapper(WORKMAN_base),
    258 [_DVK2QWE] = LAYOUT_base_wrapper(DVK2QWE_base),
    259 [_CMK2QWE] = LAYOUT_base_wrapper(CMK2QWE_base),
    260 [_WMN2QWE] = LAYOUT_base_wrapper(WMN2QWE_base),
    261 [_CMK2DVK] = LAYOUT_base_wrapper(CMK2DVK_base),
    262 [_WMN2DVK] = LAYOUT_base_wrapper(WMN2DVK_base),
    263 [_DVK2CMK] = LAYOUT_base_wrapper(DVK2CMK_base),
    264 [_WMN2CMK] = LAYOUT_base_wrapper(WMN2CMK_base),
    265 [_DVK2WMN] = LAYOUT_base_wrapper(DVK2WMN_base),
    266 [_CMK2WMN] = LAYOUT_base_wrapper(CMK2WMN_base)
    267 #endif // ALT_LAYOUTS_ENABLE
    268 };
    269 
    270 layer_state_t layer_state_set_user(layer_state_t state) {
    271   return update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST);
    272 }
    273 
    274 #ifdef DIP_SWITCH_ENABLE
    275 #ifdef ALT_LAYOUTS_ENABLE
    276 void layout_convert(uint8_t statuses) {
    277   switch (0b1111 & statuses) {
    278     case 0b0000:
    279       set_single_persistent_default_layer(_QWERTY);
    280       break;
    281     case 0b0001:
    282       set_single_persistent_default_layer(_DVORAK);
    283       break;
    284     case 0b0010:
    285       set_single_persistent_default_layer(_COLEMAK);
    286       break;
    287     case 0b0011:
    288       set_single_persistent_default_layer(_WORKMAN);
    289       break;
    290     case 0b0100:
    291       set_single_persistent_default_layer(_DVK2QWE);
    292       break;
    293     case 0b0101:
    294       set_single_persistent_default_layer(_QWERTY);
    295       break;
    296     case 0b0110:
    297       set_single_persistent_default_layer(_DVK2CMK);
    298       break;
    299     case 0b0111:
    300       set_single_persistent_default_layer(_DVK2WMN);
    301       break;
    302     case 0b1000:
    303       set_single_persistent_default_layer(_CMK2QWE);
    304       break;
    305     case 0b1001:
    306       set_single_persistent_default_layer(_CMK2DVK);
    307       break;
    308     case 0b1010:
    309       set_single_persistent_default_layer(_QWERTY);
    310       break;
    311     case 0b1011:
    312       set_single_persistent_default_layer(_CMK2WMN);
    313       break;
    314     case 0b1100:
    315       set_single_persistent_default_layer(_WMN2QWE);
    316       break;
    317     case 0b1101:
    318       set_single_persistent_default_layer(_WMN2DVK);
    319       break;
    320     case 0b1110:
    321       set_single_persistent_default_layer(_WMN2CMK);
    322       break;
    323     case 0b1111:
    324       set_single_persistent_default_layer(_QWERTY);
    325       break;
    326    }
    327 }
    328 #endif // ALT_LAYOUTS_ENABLE
    329 #endif // DIP_SWITCH_ENABLE
    330 
    331 void keyboard_post_init_user(void) {
    332   user_config.raw = eeconfig_read_user();
    333   if (user_config.thumb_alt) {
    334      layer_on(_THUMB_ALT);
    335   } else {
    336      layer_off(_THUMB_ALT);
    337   }
    338   if (user_config.iso) {
    339      layer_on(_ISO);
    340   } else {
    341      layer_off(_ISO);
    342   }
    343 }
    344 
    345 #ifdef ALT_LAYOUTS_ENABLE
    346 static char change_layout_input = 0;
    347 static bool change_layout_keystroke = 0;
    348 void change_layout_conversion(uint16_t keycode) {
    349     switch (keycode) {
    350         case CH_WMN:
    351             change_layout_input |= 0b1000 << (change_layout_keystroke << 2);
    352             break;
    353         case CH_CMK:
    354             change_layout_input |= 0b0100 << (change_layout_keystroke << 2);
    355             break;
    356         case CH_DVK:
    357             change_layout_input |= 0b0010 << (change_layout_keystroke << 2);
    358             break;
    359         case CH_QWE:
    360             change_layout_input |= 0b0001 << (change_layout_keystroke << 2);
    361             break;
    362     }
    363     if (change_layout_keystroke == 1) {
    364         switch (change_layout_input) {
    365             case 0b00010001:
    366                 set_single_persistent_default_layer(_QWERTY);
    367                 break;
    368             case 0b00100001:
    369                 set_single_persistent_default_layer(_DVORAK);
    370                 break;
    371             case 0b01000001:
    372                 set_single_persistent_default_layer(_COLEMAK);
    373                 break;
    374             case 0b10000001:
    375                 set_single_persistent_default_layer(_WORKMAN);
    376                 break;
    377             case 0b00010010:
    378                 set_single_persistent_default_layer(_DVK2QWE);
    379                 break;
    380             case 0b00100010:
    381                 set_single_persistent_default_layer(_QWERTY);
    382                 break;
    383             case 0b01000010:
    384                 set_single_persistent_default_layer(_DVK2CMK);
    385                 break;
    386             case 0b10000010:
    387                 set_single_persistent_default_layer(_DVK2WMN);
    388                 break;
    389             case 0b00010100:
    390                 set_single_persistent_default_layer(_CMK2QWE);
    391                 break;
    392             case 0b00100100:
    393                 set_single_persistent_default_layer(_CMK2DVK);
    394                 break;
    395             case 0b01000100:
    396                 set_single_persistent_default_layer(_QWERTY);
    397                 break;
    398             case 0b10000100:
    399                 set_single_persistent_default_layer(_CMK2WMN);
    400                 break;
    401             case 0b00011000:
    402                 set_single_persistent_default_layer(_WMN2QWE);
    403                 break;
    404             case 0b00101000:
    405                 set_single_persistent_default_layer(_WMN2DVK);
    406                 break;
    407             case 0b01001000:
    408                 set_single_persistent_default_layer(_WMN2CMK);
    409                 break;
    410             case 0b10001000:
    411                 set_single_persistent_default_layer(_QWERTY);
    412                 break;
    413         }
    414         change_layout_input = 0;
    415     }
    416     change_layout_keystroke ^= 1;
    417 }
    418 #endif // ALT_LAYOUTS_ENABLE
    419 
    420 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
    421 #ifdef TRAINING_HALFES_LOCK
    422   if (!record->event.pressed) {
    423       lock_cooldown = --lock_cooldown < 0 ? 0 : lock_cooldown;
    424   }
    425   if (lock_cooldown == 0) {
    426       layer_off(_LEFT);
    427       layer_off(_RIGHT);
    428   }
    429 #endif // TRAINING_HALFES_LOCK
    430   switch (keycode) {
    431 #ifdef TRAINING_HALFES_LOCK
    432     case SPC_RSH:
    433     case BSP_RSH:
    434     case DEL_RSE:
    435     case ESC_LWR:
    436     case BSL_RAL:
    437     case RGU_RBR:
    438     case RCT_QUO:
    439     if (record->event.pressed) {
    440         layer_on(_LEFT);
    441         lock_cooldown = lock_timeout;
    442     }
    443     else {
    444         lock_cooldown = 0;
    445         layer_off(_LEFT);
    446     }
    447     break;
    448     case BSP_LSH:
    449     case SPC_LSH:
    450     case TAB_RSE:
    451     case ENT_LWR:
    452     case KC_LCTL:
    453     case KC_LGUI:
    454     case KC_LALT:
    455     if (record->event.pressed) {
    456         layer_on(_RIGHT);
    457         lock_cooldown = lock_timeout;
    458     }
    459     else {
    460         lock_cooldown = 0;
    461         layer_off(_RIGHT);
    462     }
    463     break;
    464 #endif // TRAINING_HALFES_LOCK
    465 #ifdef STENO_ENABLE
    466     case PLOVER:
    467       if (!record->event.pressed) {
    468         layer_off(_RAISE);
    469         layer_off(_LOWER);
    470         layer_off(_ADJUST);
    471         layer_on(_PLOVER);
    472         if (!eeconfig_is_enabled()) {
    473             eeconfig_init();
    474         }
    475         eeconfig_read_keymap(&keymap_config);
    476         keymap_config.nkro = 1;
    477         eeconfig_update_keymap(&keymap_config);
    478       }
    479       return false;
    480     case EXT_PLV:
    481       if (record->event.pressed) {
    482         layer_off(_PLOVER);
    483       }
    484       return false;
    485 #endif // STENO_ENABLE
    486     case QWERTY:
    487       if (record->event.pressed) {
    488         set_single_persistent_default_layer(_QWERTY);
    489       }
    490       return false;
    491 #ifdef ALT_LAYOUTS_ENABLE
    492     case CH_WMN:
    493     case CH_CMK:
    494     case CH_QWE:
    495     case CH_DVK:
    496       if (record->event.pressed) {
    497         change_layout_conversion(keycode);
    498       }
    499       return false;
    500 #endif // ALT_LAYOUTS_ENABLE
    501     case THUMB_ALT:
    502       if (record->event.pressed) {
    503         layer_invert(_THUMB_ALT);
    504         user_config.thumb_alt ^= 1;
    505         eeconfig_update_user(user_config.raw);
    506       }
    507       return false;
    508     case ISO:
    509       if (record->event.pressed) {
    510         layer_invert(_ISO);
    511         user_config.iso ^= 1;
    512         eeconfig_update_user(user_config.raw);
    513       }
    514       return false;
    515   }
    516   return true;
    517 }
    518 
    519 #if defined(DIP_SWITCH_ENABLE)
    520 bool dip_switch_update_user(uint8_t index, bool active) {
    521   switch (index) {
    522 #    if defined(ALT_LAYOUTS_ENABLE)
    523     case 0: // LAYOUT0
    524     case 6:
    525       if (active) {
    526         layout_conversion_dip_state |= 1 << 0;
    527       } else {
    528         layout_conversion_dip_state &= ~(1 << 0);
    529       }
    530       layout_convert(layout_conversion_dip_state);
    531       break;
    532     case 1: // LAYOUT1
    533     case 7:
    534       if (active) {
    535         layout_conversion_dip_state |= 1 << 1;
    536       } else {
    537         layout_conversion_dip_state &= ~(1 << 1);
    538       }
    539       layout_convert(layout_conversion_dip_state);
    540       break;
    541     case 2: // LAYOUT2
    542     case 8:
    543       if (active) {
    544         layout_conversion_dip_state |= 1 << 2;
    545       } else {
    546         layout_conversion_dip_state &= ~(1 << 2);
    547       }
    548       layout_convert(layout_conversion_dip_state);
    549       break;
    550     case 3: // LAYOUT3
    551     case 9:
    552       if (active) {
    553         layout_conversion_dip_state |= 1 << 3;
    554       } else {
    555         layout_conversion_dip_state &= ~(1 << 3);
    556       }
    557       layout_convert(layout_conversion_dip_state);
    558       break;
    559     case 4: // DIP_ISO
    560     case 10:
    561       if (active) {
    562         layer_on(_ISO);
    563       } else {
    564         layer_off(_ISO);
    565       }
    566       break;
    567     case 5:  // FLIP_TH
    568     case 11:
    569       if (active) {
    570         layer_on(_THUMB_ALT);
    571       } else {
    572         layer_off(_THUMB_ALT);
    573       }
    574       break;
    575 #    endif
    576   }
    577 
    578   return true;
    579 }
    580 #endif