qmk_firmware

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

keymap.c (29320B)


      1 /* Copyright 2021 Richard Nunez <antebios1@gmail.com>
      2  *
      3  * This program is free software: you can redistribute it and/or modify
      4  * it under the terms of the GNU General Public License as published by
      5  * the Free Software Foundation, either version 2 of the License, or
      6  * (at your option) any later version.
      7  *
      8  * This program is distributed in the hope that it will be useful,
      9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     11  * GNU General Public License for more details.
     12  *
     13  * You should have received a copy of the GNU General Public License
     14  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
     15  */
     16 
     17 #include QMK_KEYBOARD_H
     18 
     19 // Keep track of key presses for Modifier
     20 typedef struct {
     21   bool is_press_action;
     22   int state;
     23 } tap;
     24 
     25 // Key Tap enumerator
     26 enum {
     27   SINGLE_TAP = 1,
     28   SINGLE_HOLD = 2,
     29   DOUBLE_TAP = 3,
     30   DOUBLE_HOLD = 4,
     31   TRIPLE_TAP = 5,
     32   TRIPLE_HOLD = 6
     33 };
     34 
     35 // Each layer gets a name for readability, which is then used in the keymap matrix below.
     36 // The underscores don't mean anything - you can have a layer called STUFF or any other name.
     37 // Layer names don't all need to be of the same length, obviously, and you can also skip them
     38 // entirely and just use numbers.
     39 enum custom_layer {
     40   _QWERTY,
     41   _ALT,
     42   _CTRL,
     43   _LOWER,
     44   _RAISE,
     45   _MOUSE,
     46   _ADJUST,
     47 };
     48 
     49 enum custom_keycodes {
     50   LOWER = SAFE_RANGE,
     51   RAISE,
     52   ADJUST
     53 };
     54 
     55 #define QWERTY PDF(_QWERTY)
     56 #define MOUSE PDF(_MOUSE)
     57 
     58 // TAP DANCE ***********************************************************
     59 //Tap Dance Declarations
     60 enum {
     61   ALT_OSL1 = 0,
     62   CTL_OSL1,
     63   TD_DEL_BSPC ,
     64   TD_ESC_GRAVE,
     65   TD_TAB_TILDE,
     66   TD_9_LPRN,
     67   TD_0_RPRN,
     68   TD_MINS_UNDS,
     69   TD_EQL_PLUS,
     70   TD_LBRC_LCBR,
     71   TD_RBRC_RCBR,
     72   TD_SCLN_COLN,
     73   TD_QUOT_DQT,
     74   TD_COMM_LABK,
     75   TD_DOT_RABK,
     76   TD_SLSH_QUES,
     77   TD_BSLS_PIPE,
     78 
     79   TD_PGUP_HOME,
     80   TD_PGDN_END,
     81 
     82   TD_Q_LrALT,
     83   TD_W_Lyr2,
     84   TD_E_Lyr3,
     85   TD_R_LrKey,
     86   TD_T_LrMS,
     87 
     88   TD_SHIFT_CAPS,
     89   TD_SPC_ENT,
     90 
     91   TD_LayerDn,
     92   TD_LayerUp
     93 };
     94 
     95 
     96 // Alt key action:
     97 // SINGLE_TAP = toggle layer, then wait for keypress on called layer, then switch back to original layer.
     98 // SINGLE_HOLD = will work as normal sending the keypress.
     99 // DOUBLE_TAP = 3,
    100 // DOUBLE_HOLD = will then toggle layer and keep sending the Alt keycode until next keypress, then switch back to original layer.
    101 // TRIPLE_TAP = 5,
    102 // TRIPLE_HOLD = 6
    103 // // Alt held down, then use as normal.
    104 //
    105 // Alt tapped, then hold Alt,
    106 int cur_dance (tap_dance_state_t *state);
    107 void alt_finished (tap_dance_state_t *state, void *user_data);
    108 void alt_reset (tap_dance_state_t *state, void *user_data);
    109 
    110 int cur_dance (tap_dance_state_t *state) {
    111   if (state->count == 1) {
    112     if (state->pressed) return SINGLE_HOLD;
    113     else return SINGLE_TAP;
    114   }
    115   else if (state->count == 2) {
    116     if (state->pressed) return DOUBLE_HOLD;
    117     else return DOUBLE_TAP;
    118   }
    119   else if (state->count == 3) {
    120     if (state->interrupted || !state->pressed)  return TRIPLE_TAP;
    121     else return TRIPLE_HOLD;
    122   }
    123   else return 8;
    124 }
    125 
    126 static tap alttap_state = {
    127   .is_press_action = true,
    128   .state = 0
    129 };
    130 
    131 void alt_finished (tap_dance_state_t *state, void *user_data) {
    132   alttap_state.state = cur_dance(state);
    133   switch (alttap_state.state) {
    134     case SINGLE_TAP: set_oneshot_layer(_ALT, ONESHOT_START); clear_oneshot_layer_state(ONESHOT_PRESSED); break;
    135     case SINGLE_HOLD: register_code(KC_LALT); break;
    136     case DOUBLE_TAP: set_oneshot_layer(_ALT, ONESHOT_START); set_oneshot_layer(_ALT, ONESHOT_PRESSED); break;
    137     case DOUBLE_HOLD: register_code(KC_LALT); layer_on(_ALT); break;
    138     //Last case is for fast typing. Assuming your key is `f`:
    139     //For example, when typing the word `buffer`, and you want to make sure that you send `ff` and not `Esc`.
    140     //In order to type `ff` when typing fast, the next character will have to be hit within the `TAPPING_TERM`, which by default is 200ms.
    141   }
    142 }
    143 
    144 void alt_reset (tap_dance_state_t *state, void *user_data) {
    145   switch (alttap_state.state) {
    146     case SINGLE_TAP: break;
    147     case SINGLE_HOLD: unregister_code(KC_LALT); break;
    148     case DOUBLE_TAP: break;
    149     case DOUBLE_HOLD: layer_off(_ALT); unregister_code(KC_LALT); break;
    150   }
    151   alttap_state.state = 0;
    152 }
    153 
    154 // Ctrl tapped, then hold Ctrl,
    155 void ctl_finished (tap_dance_state_t *state, void *user_data);
    156 void ctl_reset (tap_dance_state_t *state, void *user_data);
    157 
    158 static tap ctltap_state = {
    159   .is_press_action = true,
    160   .state = 0
    161 };
    162 
    163 void ctl_finished (tap_dance_state_t *state, void *user_data) {
    164   ctltap_state.state = cur_dance(state);
    165   switch (ctltap_state.state) {
    166     case SINGLE_TAP: set_oneshot_mods(MOD_BIT(KC_LCTL)); break;
    167     case SINGLE_HOLD: register_code(KC_LCTL); break;
    168     case DOUBLE_TAP: set_oneshot_layer(_CTRL, ONESHOT_START); set_oneshot_layer(_CTRL, ONESHOT_PRESSED); break;
    169     case DOUBLE_HOLD: register_code(KC_LCTL); layer_on(_CTRL); break;
    170     //Last case is for fast typing. Assuming your key is `f`:
    171     //For example, when typing the word `buffer`, and you want to make sure that you send `ff` and not `Esc`.
    172     //In order to type `ff` when typing fast, the next character will have to be hit within the `TAPPING_TERM`, which by default is 200ms.
    173   }
    174 }
    175 
    176 void ctl_reset (tap_dance_state_t *state, void *user_data) {
    177   switch (ctltap_state.state) {
    178     case SINGLE_TAP: break;
    179     case SINGLE_HOLD: unregister_code(KC_LCTL); break;
    180     case DOUBLE_TAP: break;
    181     case DOUBLE_HOLD: layer_off(_CTRL); unregister_code(KC_LCTL); break;
    182   }
    183   ctltap_state.state = 0;
    184 }
    185 
    186 
    187 // Layer Down tap dance
    188 void layerDown_finished (tap_dance_state_t *state, void *user_data);
    189 void layerDown_reset (tap_dance_state_t *state, void *user_data);
    190 
    191 static tap layerdn_tap_state = {
    192   .is_press_action = true,
    193   .state = 0
    194 };
    195 
    196 void layerDown_finished (tap_dance_state_t *state, void *user_data) {
    197   layerdn_tap_state.state = cur_dance(state);
    198   switch (layerdn_tap_state.state) {
    199     case SINGLE_TAP: break;
    200     case SINGLE_HOLD: layer_on(_LOWER); break;
    201     case DOUBLE_TAP: layer_move(_QWERTY); break;
    202     case DOUBLE_HOLD: break;
    203   }
    204 }
    205 
    206 void layerDown_reset (tap_dance_state_t *state, void *user_data) {
    207   switch (layerdn_tap_state.state) {
    208     case SINGLE_TAP: break;
    209     case SINGLE_HOLD: layer_off(_LOWER); break;
    210     case DOUBLE_TAP: break;
    211     case DOUBLE_HOLD: break;
    212   }
    213   layerdn_tap_state.state = 0;
    214 }
    215 
    216 
    217 
    218 
    219 // Shift key action:
    220 // Shift held down, then use as normal and use Shift Mode of key.
    221 // Shift tapped, then Capitlize next keystroke only.
    222 // Shift double-tapped, then CAPSLOCK
    223 // Shift double-tapped again, CAPS UNLOCKED
    224 // void dance_onshot_lsft(tap_dance_state_t *state, void *user_data) {
    225 void lshift_finished (tap_dance_state_t *state, void *user_data);
    226 void lshift_reset (tap_dance_state_t *state, void *user_data);
    227 
    228 static tap lshifttap_state = {
    229   .is_press_action = true,
    230   .state = 0
    231 };
    232 
    233 void lshift_finished (tap_dance_state_t *state, void *user_data) {
    234   lshifttap_state.state = cur_dance(state);
    235   switch (lshifttap_state.state) {
    236     case SINGLE_TAP: set_oneshot_mods(MOD_BIT(KC_LSFT)); break;
    237     case SINGLE_HOLD: register_code(KC_LSFT); break;
    238     case DOUBLE_TAP: tap_code (KC_CAPS); break;
    239     case DOUBLE_HOLD: break;
    240   }
    241 }
    242 
    243 void lshift_reset (tap_dance_state_t *state, void *user_data) {
    244   switch (lshifttap_state.state) {
    245     case SINGLE_TAP: break;
    246     case SINGLE_HOLD: unregister_code(KC_LSFT); break;
    247     case DOUBLE_TAP: break;
    248     case DOUBLE_HOLD: break;
    249   }
    250   lshifttap_state.state = 0;
    251 }
    252 
    253 
    254 
    255 //Tap Dance Definitions
    256 tap_dance_action_t tap_dance_actions[] = {
    257    [TD_DEL_BSPC]  = ACTION_TAP_DANCE_DOUBLE(KC_DEL, KC_BSPC),
    258    [TD_ESC_GRAVE]  = ACTION_TAP_DANCE_DOUBLE(KC_ESC, KC_GRAVE),
    259    [TD_TAB_TILDE]  = ACTION_TAP_DANCE_DOUBLE(KC_TAB, KC_TILDE),
    260 
    261    [TD_9_LPRN]  = ACTION_TAP_DANCE_DOUBLE(KC_9, KC_LPRN),
    262    [TD_0_RPRN]  = ACTION_TAP_DANCE_DOUBLE(KC_0, KC_RPRN),
    263 
    264    [TD_MINS_UNDS]  = ACTION_TAP_DANCE_DOUBLE(KC_MINS, KC_UNDS),
    265    [TD_EQL_PLUS]  = ACTION_TAP_DANCE_DOUBLE(KC_EQL, KC_PLUS),
    266 
    267    [TD_LBRC_LCBR]  = ACTION_TAP_DANCE_DOUBLE(KC_LBRC, KC_LCBR),
    268    [TD_RBRC_RCBR]  = ACTION_TAP_DANCE_DOUBLE(KC_RBRC, KC_RCBR),
    269 
    270    [TD_SCLN_COLN]  = ACTION_TAP_DANCE_DOUBLE(KC_SCLN, KC_COLN),
    271    [TD_QUOT_DQT]  = ACTION_TAP_DANCE_DOUBLE(KC_QUOT, KC_DQT),
    272 
    273    [TD_COMM_LABK]  = ACTION_TAP_DANCE_DOUBLE(KC_COMM, KC_LABK),
    274    [TD_DOT_RABK]  = ACTION_TAP_DANCE_DOUBLE(KC_DOT, KC_RABK),
    275    [TD_SLSH_QUES]  = ACTION_TAP_DANCE_DOUBLE(KC_SLSH, KC_QUES),
    276    [TD_BSLS_PIPE]  = ACTION_TAP_DANCE_DOUBLE(KC_BSLS, KC_PIPE),
    277 
    278    [TD_PGUP_HOME]  = ACTION_TAP_DANCE_DOUBLE(KC_PGUP, KC_HOME),
    279    [TD_PGDN_END]   = ACTION_TAP_DANCE_DOUBLE(KC_PGUP, KC_END),
    280 
    281    [TD_Q_LrALT] = ACTION_TAP_DANCE_LAYER_MOVE(KC_Q, _ALT),
    282    [TD_R_LrKey] = ACTION_TAP_DANCE_LAYER_MOVE(KC_R, _RAISE),
    283    [TD_T_LrMS]  = ACTION_TAP_DANCE_LAYER_MOVE(KC_T, _MOUSE),
    284 
    285    [TD_SHIFT_CAPS] = ACTION_TAP_DANCE_FN_ADVANCED(NULL,lshift_finished, lshift_reset),
    286    [TD_SPC_ENT]    = ACTION_TAP_DANCE_DOUBLE(KC_SPACE, KC_ENT),
    287 
    288    [ALT_OSL1]     = ACTION_TAP_DANCE_FN_ADVANCED(NULL,alt_finished, alt_reset),
    289    [CTL_OSL1]     = ACTION_TAP_DANCE_FN_ADVANCED(NULL,ctl_finished, ctl_reset),
    290    [TD_LayerDn]   =  ACTION_TAP_DANCE_FN_ADVANCED(NULL,layerDown_finished, layerDown_reset)
    291 
    292 };
    293 
    294 // Fillers to make layering more clear
    295 // #define _______ KC_TRNS
    296 // #define XXXXXXX KC_NO
    297 
    298 #define KC_L1 LOWER
    299 #define KC_L2 RAISE
    300 // MO(_LOWER)
    301 // MO(_RAISE)
    302 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    303 
    304 /* Qwerty
    305  * ,-----------------------------------------------------------------------------------------------------.
    306  * | DEL/Bksp |   1  |   2  |   3  |   4  |   5  |  DEL | Bksp |   6  |   7  |   8  |   9  |   0  |   -  |
    307  * |----------+------+------+------+------+------+------+------+------+------+------+------+------+------|
    308  * | Tab      |   Q  |   W  |   E  |   R  |   T  |  [   |   ]  |   Y  |   U  |   I  |   O  |   P  |   =  |
    309  * |----------+------+------+------+------+------+-------------+------+------+------+------+------+------|
    310  * | Enter    |   A  |   S  |   D  |   F  |   G  | PGUP | HOME |   H  |   J  |   K  |   L  |   ;  |   '  |
    311  * |----------+------+------+------+------+------+------|------+------+------+------+------+------+------|
    312  * | Shift    |   Z  |   X  |   C  |   V  |   B  | PGDN | END  |   N  |   M  |   ,  |   .  |   /  |   \  |
    313  * |----------+------+------+------+------+------+------+------+------+------+------+------+------+------|
    314  * | Ctrl     | Win  | Alt  |Lower |Raise | Space/Enter |    Space    | <--  |   v  |   ^  | -->  | Esc  |
    315  * `----------------------------------------------------------------------------------------------------'
    316  */
    317   [_QWERTY] = LAYOUT(
    318   //,-----------------+--------------+-------------+--------------+--------------+--------------+-----------------+-----------------+------+--------+----------------+---------------+---------------+-----------------.
    319      TD(TD_DEL_BSPC)  , KC_1         , KC_2        , KC_3         , KC_4         , KC_5         , KC_DELETE       ,  KC_BSPC        , KC_6 , KC_7   , KC_8           , TD(TD_9_LPRN) , TD(TD_0_RPRN) ,TD(TD_MINS_UNDS),
    320   //|-----------------+--------------+-------------+--------------+--------------+--------------+-----------------+-----------------+------+--------+----------------+---------------+---------------+-----------------|
    321      TD(TD_TAB_TILDE) ,TD(TD_Q_LrALT), KC_W        , KC_E         ,TD(TD_R_LrKey), TD(TD_T_LrMS), TD(TD_LBRC_LCBR), TD(TD_RBRC_RCBR), KC_Y , KC_U   , KC_I           , KC_O          , KC_P           ,TD(TD_EQL_PLUS),
    322   //|-----------------+--------------+-------------+--------------+--------------+--------------+-----------------+-----------------+------+--------+----------------+---------------+----------------+----------------|
    323       KC_ENT          , KC_A         , KC_S        , KC_D         , KC_F         , KC_G         , KC_PGUP         , KC_HOME         , KC_H , KC_J   , KC_K           , KC_L          ,TD(TD_SCLN_COLN),TD(TD_QUOT_DQT),
    324   //|-----------------+--------------+-------------+--------------+--------------+--------------+-----------------+-----------------+------+--------+----------------+---------------+----------------+----------------|
    325      TD(TD_SHIFT_CAPS), KC_Z         , KC_X        , KC_C         , KC_V         , KC_B         , KC_PGDN         , KC_END          , KC_N , KC_M   ,TD(TD_COMM_LABK),TD(TD_DOT_RABK),TD(TD_SLSH_QUES),TD(TD_BSLS_PIPE),
    326   //|-----------------+--------------+-------------+--------------+--------------+--------------+-----------------+-----------------+------+--------+----------------+---------------+----------------+----------------|
    327       TD(CTL_OSL1)    , KC_LGUI      , TD(ALT_OSL1),TD(TD_LayerDn), KC_L2        ,        TD(TD_SPC_ENT)          ,       TD(TD_SPC_ENT)   , KC_LEFT, KC_DOWN        , KC_UP         ,  KC_RIGHT      ,TD(TD_ESC_GRAVE)
    328   //`-----------------+--------------+-------------+--------------+--------------+--------------------------------+------------------------+--------+----------------+---------------+----------------+----------------'
    329   ),
    330 
    331 /* ALT Layout
    332  * ,-----------------------------------------------------------------------------------------------------.
    333  * | DEL/Bksp |   1  |   2  |   3  |   4  |   5  |  DEL | Bksp |   6  |   7  |   8  |   9  |   0  |   -  |
    334  * |----------+------+------+------+------+------+------+------+------+------+------+------+------+------|
    335  * | Tab      |   Q  |   W  |   E  |   R  |   T  |  [   |   ]  |   Y  |   U  |   I  |   O  |   P  |   =  |
    336  * |----------+------+------+------+------+------+-------------+------+------+------+------+------+------|
    337  * | Enter    |   A  |   S  |   D  |   F  |   G  | PGUP | HOME |   H  |   J  |   K  |   L  |   ;  |   '  |
    338  * |----------+------+------+------+------+------+------|------+------+------+------+------+------+------|
    339  * | Shift    |   Z  |   X  |   C  |   V  |   B  | PGDN | END  |   N  |   M  |   ,  |   .  |   /  |   \  |
    340  * |----------+------+------+------+------+------+------+------+------+------+------+------+------+------|
    341  * | Ctrl     | Win  | Alt  |  Fn  |Lower | Space/Enter |    Space    | <--  |   v  |   ^  | -->  | Esc  |
    342  * `----------------------------------------------------------------------------------------------------'
    343  */
    344   [_ALT] = LAYOUT(
    345   //,-----------------+-------------+-------------+--------------+--------------+---------+-----------------+-----------------+---------+---------+----------------+---------------+---------------+----------------.
    346      KC_TRNS          , KC_F1       , KC_F2       , KC_F3        , KC_F4        , KC_F5   , KC_TRNS         , KC_TRNS         , KC_F6   , KC_F7   , KC_F8          , KC_F9         , KC_F10        , KC_F11,
    347   //|-----------------+-------------+-------------+--------------+--------------+---------+-----------------+-----------------+---------+---------+----------------+---------------+---------------+----------------|
    348      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_F12,
    349   //|-----------------+-------------+-------------+--------------+--------------+---------+-----------------+-----------------+---------+---------+----------------+---------------+---------------+----------------|
    350   // KC_ENT           , KC_A        , KC_S        , KC_D         , KC_F         , KC_G    , KC_PGUP         , KC_HOME         , KC_H    , KC_J    , KC_K           , KC_L          ,TD(TD_SCLN_COLN),TD(TD_QUOT_DQT),
    351      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,
    352   //|-----------------+-------------+-------------+--------------+--------------+---------+-----------------+-----------------+---------+---------+----------------+---------------+---------------+----------------|
    353      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,
    354   //|-----------------+-------------+-------------+--------------+--------------+---------+-----------------+-----------------+---------+---------+----------------+---------------+---------------+----------------|
    355      TD(CTL_OSL1)     , KC_LGUI     , TD(ALT_OSL1),TD(TD_LayerDn), KC_L2        ,   TD(TD_SPC_ENT)          ,           TD(TD_SPC_ENT)  , KC_TRNS , KC_TRNS        , KC_TRNS       ,  KC_TRNS      ,TD(TD_ESC_GRAVE)
    356   //`-----------------+-------------+-------------+--------------+--------------+---------------------------+---------------------------+---------+----------------+---------------+---------------+----------------'
    357   ),
    358 
    359 /* CTRL Layout
    360  * ,-----------------------------------------------------------------------------------------------------.
    361  * | DEL/Bksp |  F1  |  F2  |  F3  |  F4  |  F5  |  DEL | Bksp |  F6  |  F7  |  F8  |  F9  |  F10 |  F11 |
    362  * |----------+------+------+------+------+------+------+------+------+------+------+------+------+------|
    363  * | Tab      |   Q  |   W  |   E  |   R  |   T  |  [   |   ]  |   Y  |   U  |   I  |   O  |   P  |  F12 |
    364  * |----------+------+------+------+------+------+-------------+------+------+------+------+------+------|
    365  * | Enter    |   A  |   S  |   D  |   F  |   G  | PGUP | HOME |   H  |   J  |   K  |   L  |   ;  |   '  |
    366  * |----------+------+------+------+------+------+------|------+------+------+------+------+------+------|
    367  * | Shift    |   Z  |   X  |   C  |   V  |   B  | PGDN | END  |   N  |   M  |   ,  |   .  |   /  |   \  |
    368  * |----------+------+------+------+------+------+------+------+------+------+------+------+------+------|
    369  * | Ctrl     | Win  | Alt  |  Fn  |Lower | Space/Enter |    Space    | <--  |   v  |   ^  | -->  | Esc  |
    370  * `----------------------------------------------------------------------------------------------------'
    371  */
    372   [_CTRL] = LAYOUT(
    373   //,-----------------+-------------+-------------+--------------+--------------+---------+-----------------+-----------------+---------+---------+----------------+---------------+---------------+----------------.
    374      KC_TRNS          , KC_F1       , KC_F2       , KC_F3        , KC_F4        , KC_F5   , KC_TRNS         , KC_TRNS         , KC_F6   , KC_F7   , KC_F8          , KC_F9         , KC_F10        , KC_F11,
    375   //|-----------------+-------------+-------------+--------------+--------------+---------+-----------------+-----------------+---------+---------+----------------+---------------+---------------+----------------|
    376      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_F12,
    377   //|-----------------+-------------+-------------+--------------+--------------+---------+-----------------+-----------------+---------+---------+----------------+---------------+---------------+----------------|
    378      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,
    379   //|-----------------+-------------+-------------+--------------+--------------+---------+-----------------+-----------------+---------+---------+----------------+---------------+---------------+----------------|
    380      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,
    381   //|-----------------+-------------+-------------+--------------+--------------+---------+-----------------+-----------------+---------+---------+----------------+---------------+---------------+----------------|
    382      TD(CTL_OSL1)     , KC_LGUI     , TD(ALT_OSL1),TD(TD_LayerDn), KC_L2        ,   TD(TD_SPC_ENT)          ,         TD(TD_SPC_ENT)    , KC_TRNS , KC_TRNS        , KC_TRNS       ,  KC_TRNS      ,TD(TD_ESC_GRAVE)
    383   //`-----------------+-------------+-------------+--------------+--------------+---------------------------+---------------------------+---------+----------------+---------------+---------------+----------------'
    384   ),
    385 
    386 /* Lower
    387  * ,-------------------------------------------------------------------------------------------------.
    388  * |  `   |  F1  |  F2  |  F3  |  F4  |  F5  |      |      |  F6  |  F7  |  F8  |  F9  |  F10 |  F11 |
    389  * |------+------+------+------+------+------+------+-------------+------+------+------+------+------|
    390  * |  ~   |      |  UP  |      |      |      |      |      | Prev | Next | Vol- | Vol+ | Play |  F12 |
    391  * |------+------+------+------+------+------+------+-------------+------+------+------+------+------|
    392  * |Enter | LEFT | DOWN |RIGHT |      |      |      |      |      |      | MUTE |      |      |      |
    393  * |------+------+------+------+------+------+------|------+------+------+------+------+------+------|
    394  * |      |      |      |      |      |      |      |      |      |      |      |      |      |      |
    395  * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
    396  * |      |      |      |      |      |             |             |      |      |      |      |      |
    397  * `------------------------------------------------------------------------------------------+------'
    398  */
    399 [_LOWER] = LAYOUT(
    400   KC_GRV ,  KC_F1 , KC_F2  , KC_F3   ,   KC_F4,   KC_F5, KC_INS , _______,   KC_F6,   KC_F7,   KC_F8,   KC_F9,  KC_F10, KC_F11,
    401   KC_TILD, _______, KC_UP  , _______ , _______, _______, _______, _______, KC_MPRV, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY, KC_F12,
    402   KC_ENT , KC_LEFT, KC_DOWN, KC_RIGHT, _______, _______, _______, _______, _______, _______, KC_MUTE, _______, _______, _______,
    403   _______, _______, _______, _______ , _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
    404   _______, _______, _______, _______ , _______,      _______    ,      _______    , _______, _______, _______, _______, _______
    405 ),
    406 
    407 /* Raise
    408  * ,-------------------------------------------------------------------------------------------------.
    409  * |      |      |      |      |      |      |      |      |      |      |      |      |      |      |
    410  * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
    411 
    412  * ,-------------------------------------------------------------------------------------------------.
    413  * | Bksp |      |      |      |      |      |      |      |      |  7   |  8   |  9   |      |      |
    414  * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
    415  * |      |      |      |      |      |      |      |      |      |  4   |  5   |  6   |  -   |  /   |
    416  * |------+------+------+------+------+-------------+------+------+------+------+------+------+------|
    417  * |      |      |      |      |      |      |      |      |      |  1   |  2   |  3   |  +   |  *   |
    418  * |------+------+------+------+------+------|------+------+------+------+------+------+------+------|
    419  * |      |      |      |      |      |      |      |      |      |  0   |  ,   |  .   |  =   |      |
    420  * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
    421  * |CtAlDl|      |      |      |      |             |       Enter |      |      |      |      |      |
    422  * `-------------------------------------------------------------------------------------------------'
    423  */
    424 /*
    425 KC_INS
    426 KC_PSCR
    427 KC_SCRL
    428 KC_PAUS
    429 
    430 */
    431 
    432 [_RAISE] = LAYOUT(
    433   KC_BSPC           , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,  KC_7  , KC_8   , KC_9   , _______, _______,
    434   XXXXXXX           , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,  KC_4  , KC_5   , KC_6   , KC_MINS, KC_SLSH,
    435   XXXXXXX           , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,  KC_1  , KC_2   , KC_3   , KC_PLUS, KC_ASTR,
    436   XXXXXXX           , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,  KC_0  , KC_COMM, KC_DOT , KC_EQL , XXXXXXX,
    437   LALT(LCTL(KC_DEL)), _______, _______, _______, _______,     _______     ,     KC_ENT      , _______, _______, _______, _______, _______
    438 ),
    439 
    440 /* Adjust (Lower + Raise)
    441  * ,-------------------------------------------------------------------------------------------------.
    442  * |      |      |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |
    443  * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
    444  * |      |      |      |      |Reset |      |      |      |      |      |      |      |      |  Del |
    445  * |------+------+------+------+------+------+------+-------------+------+------+------+------+------|
    446  * |      |      |      |      |      |Audoff|Aud on|AGnorm|AGswap|Qwerty|Colemk|Dvorak|      |      |
    447  * |------+------+------+------+------+------+------+------|------+------+------+------+------+------|
    448  * |      |      |      |Voice-|Voice+|Musoff|Mus on|      |      |      |      |      |      |      |
    449  * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
    450  * |      |      |      |      |      |      |      |             |      |      |      |      |      |
    451  * `-------------------------------------------------------------------------------------------------'
    452  */
    453 [_ADJUST] = LAYOUT(
    454   _______, _______,   KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,  KC_F10,  KC_F11,  KC_F12,
    455   XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,   QK_BOOT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_DEL,
    456   XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, AU_ON,   AU_OFF,  AG_NORM, AG_SWAP, QWERTY,  XXXXXXX, XXXXXXX, XXXXXXX, _______,
    457   XXXXXXX, XXXXXXX, XXXXXXX, AU_PREV,  AU_NEXT,  MU_ON,   MU_OFF,  MI_ON,   MI_OFF,  XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
    458   XXXXXXX, _______, _______, _______, _______,     _______,            _______,    _______,_______,_______, _______, _______
    459 )
    460 ,
    461 
    462 /* Layer 3 - Mouse Controls
    463  * ,-------------------------------------------------------------------------------------------------.
    464  * |      |  F1  |  F2  |  F3  |  F4  |  F5  |      |      |  F6  |  F7  |  F8  |  F9  |  F10 |  F11 |
    465  * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
    466  * |SPEED0|      |MS UP |      |      |      |      |      |      |      |WHUP  |      |      |  F12 |
    467  * |------+------+------+------+------+------+------+-------------+------+------+------+------+------|
    468  * |SPEED1|MSLeft|MS DN |MSRite|      |      |      |      |      |WHLeft|WHDN  |WHRite|      |      |
    469  * |------+------+------+------+------+------+------+------|------+------+------+------+------+------|
    470  * |SPEED2|      |      |      |      |      |      |      |      | BTN1 | BTN2 | BTN3 |      |      |
    471  * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
    472  * | Ctrl | Win  | Alt  |Lower |Raise | Space/Enter |    Space    | <--  |   v  |   ^  | -->  | Esc  |
    473  * `-------------------------------------------------------------------------------------------------'
    474  */
    475 [_MOUSE] = LAYOUT(
    476   _______     , KC_F1     , KC_F2       , KC_F3          , KC_F4  , KC_F5  , XXXXXXX, XXXXXXX, KC_F6  , KC_F7        , KC_F8        , KC_F9         , KC_F10  , KC_F11,
    477   MS_ACL0     , XXXXXXX   , MS_UP       , XXXXXXX        , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX      , MS_WHLU      , XXXXXXX       , XXXXXXX , KC_F12,
    478   MS_ACL1     , MS_LEFT   , MS_DOWN     , MS_RGHT        , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, MS_WHLL      , MS_WHLD      , MS_WHLR       , XXXXXXX , XXXXXXX,
    479   MS_ACL2     , XXXXXXX   , XXXXXXX     , XXXXXXX        , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, MS_BTN1      , MS_BTN2      , MS_BTN3       , XXXXXXX , XXXXXXX,
    480   TD(CTL_OSL1), KC_LGUI   , TD(ALT_OSL1), TD(TD_LayerDn) , KC_L2 ,  TD(TD_SPC_ENT)  ,     KC_SPACE    , KC_LEFT      , KC_DOWN      , KC_UP         , KC_RIGHT, TD(TD_ESC_GRAVE)
    481 )
    482 
    483 };
    484 
    485 
    486 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
    487   switch (keycode) {
    488     case KC_TRNS:
    489     case KC_NO:
    490       /* Always cancel one-shot layer when another key gets pressed */
    491       if (record->event.pressed && is_oneshot_layer_active())
    492       clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
    493       return true;
    494     case QK_BOOT:
    495       /* Don't allow reset from oneshot layer state */
    496       if (record->event.pressed && is_oneshot_layer_active()){
    497         clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
    498         return false;
    499       }
    500       return true;
    501     case LOWER:
    502       if (record->event.pressed) {
    503         layer_on(_LOWER);
    504         update_tri_layer(_LOWER, _RAISE, _ADJUST);
    505       } else {
    506         layer_off(_LOWER);
    507         update_tri_layer(_LOWER, _RAISE, _ADJUST);
    508       }
    509       return false;
    510     case RAISE:
    511       if (record->event.pressed) {
    512         layer_on(_RAISE);
    513         update_tri_layer(_LOWER, _RAISE, _ADJUST);
    514       } else {
    515         layer_off(_RAISE);
    516         update_tri_layer(_LOWER, _RAISE, _ADJUST);
    517       }
    518       return false;
    519   }
    520   return true;
    521 };
    522