qmk_firmware

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

keymap.c (32461B)


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