system-manager-wakasu
  1/* Copyright 2020 ZSA Technology Labs, Inc <@zsa>
  2 * Copyright 2020 Jack Humbert <jack.humb@gmail.com>
  3 * Copyright 2020 Christopher Courtney, aka Drashna Jael're  (@drashna) <drashna@live.com>
  4 *
  5 * This program is free software: you can redistribute it and/or modify
  6 * it under the terms of the GNU General Public License as published by
  7 * the Free Software Foundation, either version 2 of the License, or
  8 * (at your option) any later version.
  9 *
 10 * This program is distributed in the hope that it will be useful,
 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 13 * GNU General Public License for more details.
 14 *
 15 * You should have received a copy of the GNU General Public License
 16 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 17 */
 18
 19
 20
 21#include QMK_KEYBOARD_H
 22#include "version.h"
 23#include "keymap_us.h"
 24#include "keymap_us_international_linux.h"
 25#include "layermodes.h"
 26
 27enum layers {
 28  BEPO,
 29  ERGL,
 30  QWER,
 31  SYMB,
 32  NUMB,
 33  NAVI,
 34  MOUS,
 35  MODS,
 36};
 37
 38enum custom_keycodes {
 39  VRSN = SAFE_RANGE,
 40  FR_DQUO,
 41  FR_QUOT,
 42  FR_GRAVE,
 43  FR_CIRC,
 44  FR_E_AIGU,
 45  FR_E_AIGU_CAPS,
 46  FR_E_GRAVE,
 47  FR_E_GRAVE_CAPS,
 48  FR_A_GRAVE,
 49  FR_A_GRAVE_CAPS,
 50  NUMWORD,  // Numword layer activation
 51};
 52
 53const key_override_t circ_exclamation_override = ko_make_with_layers(MOD_MASK_SHIFT, KC_CIRC, KC_EXLM, 1 << BEPO);
 54const key_override_t dot_colon_override = ko_make_with_layers(MOD_MASK_SHIFT, KC_DOT, KC_COLN, 1 << BEPO);
 55const key_override_t comma_semicolon_override = ko_make_with_layers(MOD_MASK_SHIFT, HM_HYP_COMM, KC_SCLN, 1 << BEPO);
 56
 57// Right Alt (AltGr) behaviors for bépo layer
 58const key_override_t b_pipe_override = ko_make_with_layers_and_negmods(MOD_BIT_RALT, KC_B, KC_PIPE, 1 << BEPO, MOD_MASK_SHIFT);
 59const key_override_t b_brkp_override = ko_make_with_layers(MOD_BIT_LSHIFT | MOD_BIT_RALT, KC_B, US_BRKP, 1 << BEPO);
 60
 61const key_override_t p_amp_override = ko_make_with_layers_and_negmods(MOD_BIT_RALT, KC_P, KC_AMPR, 1 << BEPO, MOD_MASK_SHIFT);
 62const key_override_t p_sect_override = ko_make_with_layers(MOD_BIT_LSHIFT | MOD_BIT_RALT, KC_P, US_SECT, 1 << BEPO);
 63
 64const key_override_t o_oe_override = ko_make_with_layers_and_negmods(MOD_BIT_RALT, KC_O, US_OE, 1 << BEPO, MOD_MASK_SHIFT);
 65const key_override_t o_oe_cap_override = ko_make_with_layers(MOD_BIT_LSHIFT | MOD_BIT_RALT, KC_O, US_OE_CAP, 1 << BEPO);
 66
 67const key_override_t v_qmark_override = ko_make_with_layers_and_negmods(MOD_BIT_RALT, KC_V, KC_QUES, 1 << BEPO, MOD_MASK_SHIFT);
 68
 69const key_override_t l_fslh_override = ko_make_with_layers_and_negmods(MOD_BIT_RALT, KC_L, KC_SLSH, 1 << BEPO, MOD_MASK_SHIFT);
 70const key_override_t l_pound_override = ko_make_with_layers(MOD_BIT_LSHIFT | MOD_BIT_RALT, KC_L, US_PND, 1 << BEPO);
 71
 72const key_override_t y_lbrc_override = ko_make_with_layers_and_negmods(MOD_BIT_RALT, KC_Y, KC_LCBR, 1 << BEPO, MOD_MASK_SHIFT);
 73const key_override_t y_rsqt_override = ko_make_with_layers(MOD_BIT_LSHIFT | MOD_BIT_RALT, KC_Y, US_RSQT, 1 << BEPO);
 74
 75const key_override_t x_rbrc_override = ko_make_with_layers_and_negmods(MOD_BIT_RALT, KC_X, KC_RCBR, 1 << BEPO, MOD_MASK_SHIFT);
 76const key_override_t x_lsqt_override = ko_make_with_layers(MOD_BIT_LSHIFT | MOD_BIT_RALT, KC_X, US_LSQT, 1 << BEPO);
 77
 78const key_override_t k_tilde_override = ko_make_with_layers_and_negmods(MOD_BIT_RALT, KC_K, KC_TILD, 1 << BEPO, MOD_MASK_SHIFT);
 79
 80const key_override_t q_deg_override = ko_make_with_layers_and_negmods(MOD_BIT_RALT, KC_Q, US_DEG, 1 << BEPO, MOD_MASK_SHIFT);
 81
 82const key_override_t g_mu_override = ko_make_with_layers_and_negmods(MOD_BIT_RALT, KC_G, US_MICR, 1 << BEPO, MOD_MASK_SHIFT);
 83const key_override_t g_dag_override = ko_make_with_layers(MOD_BIT_LSHIFT | MOD_BIT_RALT, KC_G, US_DAGG, 1 << BEPO);
 84
 85const key_override_t h_ddag_override = ko_make_with_layers(MOD_BIT_LSHIFT | MOD_BIT_RALT, KC_H, US_DDAG, 1 << BEPO);
 86
 87const key_override_t agra_bslh_override = ko_make_with_layers_and_negmods(MOD_BIT_RALT, FR_A_GRAVE, KC_BSLS, 1 << BEPO, MOD_MASK_SHIFT);
 88const key_override_t agra_ae_override = ko_make_with_layers(MOD_BIT_LSHIFT | MOD_BIT_RALT, FR_A_GRAVE, US_AE_CAP, 1 << BEPO);
 89
 90const key_override_t c_copy_override = ko_make_with_layers_and_negmods(MOD_BIT_RALT, HM_HYP_C, US_COPY, 1 << BEPO, MOD_MASK_SHIFT);
 91
 92const key_override_t t_tm_override = ko_make_with_layers(MOD_BIT_LSHIFT | MOD_BIT_RALT, HM_CTL_T, US_TM, 1 << BEPO);
 93
 94const key_override_t s_ss_override = ko_make_with_layers_and_negmods(MOD_BIT_RALT, HM_SFT_S, US_SS, 1 << BEPO, MOD_MASK_SHIFT);
 95
 96const key_override_t r_reg_override = ko_make_with_layers_and_negmods(MOD_BIT_RALT, HM_ALT_R, US_REGD, 1 << BEPO, MOD_MASK_SHIFT);
 97
 98const key_override_t n_tilde_override = ko_make_with_layers_and_negmods(MOD_BIT_RALT, HM_GUI_N, KC_TILD, 1 << BEPO, MOD_MASK_SHIFT);
 99
100const key_override_t space_underscore_override = ko_make_with_layers_and_negmods(MOD_BIT_RALT, LT(NUMB, KC_SPC), KC_UNDS, 1 << BEPO, MOD_MASK_SHIFT);
101
102const key_override_t *key_overrides[] = {
103  &circ_exclamation_override,
104  &dot_colon_override,
105  &comma_semicolon_override,
106
107  // RAlt behaviors
108  &b_pipe_override,
109  &b_brkp_override,
110  &p_amp_override,
111  &p_sect_override,
112  &o_oe_override,
113  &o_oe_cap_override,
114  &v_qmark_override,
115  &l_fslh_override,
116  &l_pound_override,
117  &y_lbrc_override,
118  &y_rsqt_override,
119  &x_rbrc_override,
120  &x_lsqt_override,
121  &k_tilde_override,
122  &q_deg_override,
123  &g_mu_override,
124  &g_dag_override,
125  &h_ddag_override,
126  &agra_bslh_override,
127  &agra_ae_override,
128  &c_copy_override,
129  &t_tm_override,
130  &s_ss_override,
131  &r_reg_override,
132  &n_tilde_override,
133  &space_underscore_override,
134};
135
136void leader_start_user(void) {
137}
138
139void leader_end_user(void) {
140    if (leader_sequence_one_key(KC_F)) {
141        // Leader, f => Types the below string
142        SEND_STRING("QMK is awesome.");
143    }
144}
145
146#define COMBO_REF_DEFAULT QWER
147
148uint8_t combo_ref_from_layer(uint8_t layer){
149  switch (get_highest_layer(layer_state)){
150  case BEPO: return QWER;
151  default: return QWER;
152  }
153  return layer;  // important if default is not in case.
154}
155
156enum combos {
157  TO_BEPO, TO_ERGOL, TO_QWERTY,
158  TOGGLE_MOUSE,
159  BEPO_ESC, QWERTY_ESC,
160  // Experiments
161  PIPE, AROBASE, HASH, DOLLAR, SLASH, BSLASH, AMPR, MINUS, UNDERSCORE, EQUAL,
162  LEADER,
163  LPRN, RPRN, LCBR, RCBR, LBRC, RBRC, LABK, RABK,
164};
165
166const uint16_t PROGMEM combo_to_bepo[] = {LT(NAVI,KC_BSPC), OS_LSFT, COMBO_END};
167const uint16_t PROGMEM combo_to_ergol[] = {LT(NUMB,KC_SPC), LT(SYMB, KC_ENT), COMBO_END};
168const uint16_t PROGMEM combo_to_qwerty[] = {KC_DEL, KC_RALT, COMBO_END};
169const uint16_t PROGMEM combo_toggle_mouse[] = {KC_Q, KC_R, COMBO_END};
170
171const uint16_t PROGMEM combo_bepo_escape[] = {HM_ALT_R, HM_GUI_N, COMBO_END};
172const uint16_t PROGMEM combo_qwe_escape[] = {HM_ALT_L, HM_GUI_SCLN, COMBO_END};
173
174const uint16_t PROGMEM combo_qwe_pipe[] = {KC_Q, KC_W, COMBO_END};       // |
175const uint16_t PROGMEM combo_qwe_arobase[] = {KC_W, KC_E, COMBO_END};    // @
176const uint16_t PROGMEM combo_qwe_hash[] = {KC_E, KC_R, COMBO_END};       // #
177const uint16_t PROGMEM combo_qwe_ampr[] = {KC_R, KC_T, COMBO_END};       // &
178const uint16_t PROGMEM combo_qwe_dollar[] = {KC_R, HM_CTL_F, COMBO_END}; // $
179const uint16_t PROGMEM combo_qwe_slash[] = {KC_E, HM_SFT_D, COMBO_END};  // /
180const uint16_t PROGMEM combo_qwe_bslash[] = {HM_SFT_D, KC_C, COMBO_END}; // antislash
181const uint16_t PROGMEM combo_qwe_minus[] = {KC_W, HM_ALT_S, COMBO_END};  // -
182const uint16_t PROGMEM combo_qwe_unds[] = {HM_CTL_F, KC_V, COMBO_END};   // _
183const uint16_t PROGMEM combo_qwe_equal[] = {HM_ALT_S, KC_X, COMBO_END};  // = 
184
185const uint16_t PROGMEM combo_qwe_leader[] = {HM_SFT_D, HM_CTL_F, COMBO_END}; // FIXME: change this most likely.
186
187const uint16_t PROGMEM combo_qwe_lprn[] = {KC_I, HM_SFT_K, COMBO_END};    // (
188const uint16_t PROGMEM combo_qwe_rprn[] = {HM_SFT_K, KC_COMM, COMBO_END}; // )
189const uint16_t PROGMEM combo_qwe_lcbr[] = {KC_U, HM_CTL_J, COMBO_END};    // {
190const uint16_t PROGMEM combo_qwe_rcbr[] = {HM_CTL_J, KC_M, COMBO_END};    // }
191const uint16_t PROGMEM combo_qwe_lbrc[] = {KC_O, HM_ALT_L, COMBO_END};    // [
192const uint16_t PROGMEM combo_qwe_rbrc[] = {HM_ALT_L, KC_DOT, COMBO_END};  // ]
193const uint16_t PROGMEM combo_qwe_labk[] = {KC_U, KC_I, COMBO_END};        // <
194const uint16_t PROGMEM combo_qwe_rabk[] = {KC_I, KC_O, COMBO_END};        // >
195
196combo_t key_combos[] = {
197  // Layers
198  [TO_BEPO] = COMBO(combo_to_bepo, TO(BEPO)),
199  [TO_ERGOL] = COMBO(combo_to_ergol, TO(ERGL)),
200  [TO_QWERTY] = COMBO(combo_to_qwerty, TO(QWER)),
201  [TOGGLE_MOUSE] = COMBO(combo_toggle_mouse, TG(MOUS)),
202  // Others
203  [QWERTY_ESC] = COMBO(combo_qwe_escape, KC_ESC),
204  [BEPO_ESC] = COMBO(combo_bepo_escape, KC_ESC),
205  // Experiments
206  [PIPE] = COMBO(combo_qwe_pipe, KC_PIPE),
207  [AROBASE] = COMBO(combo_qwe_arobase, KC_AT),
208  [HASH] = COMBO(combo_qwe_hash, KC_HASH),
209  [DOLLAR] = COMBO(combo_qwe_dollar, KC_DLR),
210  [SLASH] = COMBO(combo_qwe_slash, KC_SLSH),
211  [BSLASH] = COMBO(combo_qwe_bslash, KC_BSLS),
212  [AMPR] = COMBO(combo_qwe_ampr, KC_AMPR),
213  [MINUS] = COMBO(combo_qwe_minus, KC_PMNS),
214  [UNDERSCORE] = COMBO(combo_qwe_unds, KC_UNDS),
215  [EQUAL] = COMBO(combo_qwe_equal, KC_EQL),
216
217  [LEADER] = COMBO(combo_qwe_leader, QK_LEAD),
218  
219  [LPRN] = COMBO(combo_qwe_lprn, KC_LPRN),
220  [RPRN] = COMBO(combo_qwe_rprn, KC_RPRN),
221  [LCBR] = COMBO(combo_qwe_lcbr, KC_LCBR),
222  [RCBR] = COMBO(combo_qwe_rcbr, KC_RCBR),
223  [LBRC] = COMBO(combo_qwe_lbrc, KC_LBRC),
224  [RBRC] = COMBO(combo_qwe_rbrc, KC_RBRC),
225  [LABK] = COMBO(combo_qwe_labk, KC_LABK),
226  [RABK] = COMBO(combo_qwe_rabk, KC_RABK),
227};
228
229bool combo_should_trigger(uint16_t combo_index, combo_t *combo, uint16_t keycode, keyrecord_t *record) {
230  switch (combo_index) {
231  case BEPO_ESC:
232    if (layer_state_is(BEPO)) {
233      return true;
234    }
235    return false;
236  case QWERTY_ESC:
237    if (layer_state_is(QWER)) {
238      return true;
239    }
240    return false;
241  }
242  return true;
243}
244
245tap_dance_action_t tap_dance_actions[] = {
246};
247
248const char chordal_hold_layout[MATRIX_ROWS][MATRIX_COLS] PROGMEM = LAYOUT(
249  'L', 'L', 'L', 'L', 'L', 'L', 'L', 'R', 'R', 'R', 'R', 'R', 'R', 'R',
250  'L', 'L', 'L', 'L', 'L', 'L', 'L', 'R', 'R', 'R', 'R', 'R', 'R', 'R',
251  'L', 'L', 'L', 'L', 'L', 'L', 'L', 'R', 'R', 'R', 'R', 'R', 'R', 'R',
252  'L', 'L', 'L', 'L', 'L', 'L',           'R', 'R', 'R', 'R', 'R', 'R',
253  'L', 'L', 'L', 'L', 'L', 'L',           'R', 'R', 'R', 'R', 'R', 'R',
254                 'L', 'L', 'L',           'R', 'R', 'R'
255);
256
257// clang-format off
258const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
259  // ┌─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┐             ┌─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┐
260  // │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │             │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │
261  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤             ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
262  // │   TAB   │    B    │    É    │    P    │    O    │    È    │ XXXXXXX │             │ XXXXXXX │    ^    │    V    │    D    │    L    │    J    │    Z    │
263  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤             ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
264  // │ NUMWORD │  GUI/A  │  ALT/U  │  SFT/I  │  CTL/E  │  HYP/,  │ XXXXXXX │             │ XXXXXXX │  HYP/C  │  CTL/T  │  SFT/S  │  ALT/R  │  GUI/N  │ SYMB/M  │
265  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┘             └─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
266  // │   GRV   │    À    │    Y    │    X    │    .    │    K    │                                 │    '    │    Q    │    G    │    H    │    F    │    W    │
267  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼───────────────┐     ┌───────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
268  // │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ MODS/DEL│         │     REPEAT    │     │  ALT-REP  │         │  RALT   │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │
269  // └─────────┴─────────┴─────────┴─────────┴─────────┼─────────┼─────────┬─────┤     ├─────┬─────┼─────────┼─────────┴─────────┴─────────┴─────────┴─────────┘
270  //                                                   │ NUMB/SPC│ NAVI/BSP│ XXX │     │ XXX │SHIFT│ SYMB/ENT│
271  //                                                   └─────────┴─────────┴─────┘     └─────┴─────┴─────────┘
272  [BEPO] = LAYOUT(
273    XXXXXXX,  XXXXXXX,     XXXXXXX,     XXXXXXX,      XXXXXXX,         XXXXXXX,         XXXXXXX,    XXXXXXX,  XXXXXXX,         XXXXXXX,     XXXXXXX,     XXXXXXX,      XXXXXXX,         XXXXXXX,
274    KC_TAB,   KC_B,        FR_E_AIGU,   KC_P,         KC_O,            FR_E_GRAVE,      XXXXXXX,    XXXXXXX,  KC_CIRC,         KC_V,        KC_D,        KC_L,         KC_J,            KC_Z,
275    NUMWORD,  HM_GUI_A,    HM_ALT_U,    HM_SFT_I,     HM_CTL_E,        HM_HYP_COMM,     XXXXXXX,    XXXXXXX,  HM_HYP_C,        HM_CTL_T,    HM_SFT_S,    HM_ALT_R,     HM_GUI_N,        LT(SYMB,KC_M),
276    KC_GRV,   FR_A_GRAVE,  KC_Y,        KC_X,         KC_DOT,          KC_K,                                  FR_QUOT,         KC_Q,        KC_G,        KC_H,         KC_F,            KC_W,
277    XXXXXXX,  XXXXXXX,     XXXXXXX,     XXXXXXX,      LT(MODS,KC_DEL),                  QK_REP,     QK_AREP,                   KC_RALT,     XXXXXXX,     XXXXXXX,      XXXXXXX,         XXXXXXX,
278                                                      LT(NUMB,KC_SPC), LT(NAVI,KC_BSPC), XXXXXXX,    XXXXXXX,  OS_LSFT,         LT(SYMB,KC_ENT)
279  ),
280
281  // ┌─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┐             ┌─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┐
282  // │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │             │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │
283  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤             ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
284  // │   TAB   │    Q    │    W    │    E    │    R    │    T    │ XXXXXXX │             │ XXXXXXX │    Y    │    U    │    I    │    O    │    P    │    [    │
285  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤             ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
286  // │ NUMWORD │  GUI/A  │  ALT/S  │  SFT/D  │  CTL/F  │  HYP/G  │ XXXXXXX │             │ XXXXXXX │  HYP/H  │  CTL/J  │  SFT/K  │  ALT/L  │  GUI/;  │    "    │
287  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┘             └─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
288  // │   GRV   │    Z    │    X    │    C    │    V    │    B    │                                 │    N    │    M    │    ,    │    .    │    /    │    ]    │
289  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼───────────────┐     ┌───────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
290  // │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │   DEL   │         │     REPEAT    │     │  ALT-REP  │         │  RALT   │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │
291  // └─────────┴─────────┴─────────┴─────────┴─────────┼─────────┼─────────┬─────┤     ├─────┬─────┼─────────┼─────────┴─────────┴─────────┴─────────┴─────────┘
292  //                                                   │ NUMB/SPC│ NAVI/BSP│ XXX │     │ XXX │SHIFT│ SYMB/ENT│
293  //                                                   └─────────┴─────────┴─────┘     └─────┴─────┴─────────┘
294  [ERGL] = LAYOUT(
295    XXXXXXX,  XXXXXXX,     XXXXXXX,   XXXXXXX,   XXXXXXX,     XXXXXXX,         XXXXXXX,    XXXXXXX,  XXXXXXX,      XXXXXXX,     XXXXXXX,   XXXXXXX,      XXXXXXX,      XXXXXXX,
296    KC_TAB,   KC_Q,        KC_W,      KC_E,      KC_R,        KC_T,            XXXXXXX,    XXXXXXX,  KC_Y,         KC_U,        KC_I,      KC_O,         KC_P,         KC_LBRC,
297    NUMWORD,  HM_GUI_A,    HM_ALT_S,  HM_SFT_D,  HM_CTL_F,    HM_HYP_G,        XXXXXXX,    XXXXXXX,  HM_HYP_H,     HM_CTL_J,    HM_SFT_K,  HM_ALT_L,     HM_GUI_SCLN,  KC_QUOT,
298    KC_GRV,   KC_Z,        KC_X,      KC_C,      KC_V,        KC_B,                                  KC_N,         KC_M,        KC_COMM,   KC_DOT,       KC_SLSH,      KC_RBRC,
299    XXXXXXX,  XXXXXXX,     XXXXXXX,   XXXXXXX,   KC_DEL,                       QK_REP,     QK_AREP,                KC_RALT,     XXXXXXX,   XXXXXXX,      XXXXXXX,      XXXXXXX,
300                                                 LT(NUMB,KC_SPC), LT(NAVI,KC_BSPC), XXXXXXX,    XXXXXXX,  OS_LSFT,      LT(SYMB,KC_ENT)
301  ),
302
303  // ┌─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┐             ┌─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┐
304  // │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │             │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │
305  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤             ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
306  // │   TAB   │    Q    │    W    │    E    │    R    │    T    │ XXXXXXX │             │ XXXXXXX │    Y    │    U    │    I    │    O    │    P    │    [    │
307  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤             ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
308  // │ NUMWORD │  GUI/A  │  ALT/S  │  SFT/D  │  CTL/F  │  HYP/G  │ XXXXXXX │             │ XXXXXXX │  HYP/H  │  CTL/J  │  SFT/K  │  ALT/L  │  GUI/;  │    "    │
309  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┘             └─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
310  // │   GRV   │    Z    │    X    │    C    │    V    │    B    │                                 │    N    │    M    │    ,    │    .    │    /    │    ]    │
311  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼───────────────┐     ┌───────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
312  // │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │   DEL   │         │     REPEAT    │     │  ALT-REP  │         │  RALT   │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │
313  // └─────────┴─────────┴─────────┴─────────┴─────────┼─────────┼─────────┬─────┤     ├─────┬─────┼─────────┼─────────┴─────────┴─────────┴─────────┴─────────┘
314  //                                                   │ NUMB/SPC│ NAVI/BSP│ XXX │     │ XXX │SHIFT│ SYMB/ENT│
315  //                                                   └─────────┴─────────┴─────┘     └─────┴─────┴─────────┘
316  [QWER] = LAYOUT(
317    XXXXXXX,  XXXXXXX,     XXXXXXX,   XXXXXXX,   XXXXXXX,     XXXXXXX,         XXXXXXX,    XXXXXXX,  XXXXXXX,      XXXXXXX,     XXXXXXX,   XXXXXXX,      XXXXXXX,      XXXXXXX,
318    KC_TAB,   KC_Q,        KC_W,      KC_E,      KC_R,        KC_T,            XXXXXXX,    XXXXXXX,  KC_Y,         KC_U,        KC_I,      KC_O,         KC_P,         KC_LBRC,
319    NUMWORD,  HM_GUI_A,    HM_ALT_S,  HM_SFT_D,  HM_CTL_F,    HM_HYP_G,        XXXXXXX,    XXXXXXX,  HM_HYP_H,     HM_CTL_J,    HM_SFT_K,  HM_ALT_L,     HM_GUI_SCLN,  KC_QUOT,
320    KC_GRV,   KC_Z,        KC_X,      KC_C,      KC_V,        KC_B,                                  KC_N,         KC_M,        KC_COMM,   KC_DOT,       KC_SLSH,      KC_RBRC,
321    XXXXXXX,  XXXXXXX,     XXXXXXX,   XXXXXXX,   KC_DEL,                       QK_REP,     QK_AREP,                KC_RALT,     XXXXXXX,   XXXXXXX,      XXXXXXX,      XXXXXXX,
322                                                 LT(NUMB,KC_SPC), LT(NAVI,KC_BSPC), XXXXXXX,    XXXXXXX,  OS_LSFT,      LT(SYMB,KC_ENT)
323  ),
324
325  // ┌─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┐             ┌─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┐
326  // │  VRSN   │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │             │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │
327  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤             ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
328  // │    \    │    `    │    <    │    >    │    -    │    |    │ XXXXXXX │             │ XXXXXXX │    ^    │    {    │    }    │    $    │    ^    │ XXXXXXX │
329  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤             ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
330  // │ XXXXXXX │    !    │    *    │    /    │    =    │    &    │ XXXXXXX │             │ XXXXXXX │    #    │    (    │    )    │    ;    │    "    │ XXXXXXX │
331  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┘             └─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
332  // │ XXXXXXX │    ~    │    [    │    ]    │    +    │    %    │                                 │    @    │    :    │    ,    │    .    │    '    │ XXXXXXX │
333  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼───────────────┐     ┌───────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
334  // │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │  _____  │         │   RGB VAL+    │     │  RGB TOG  │         │  _____  │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │
335  // └─────────┴─────────┴─────────┴─────────┴─────────┼─────────┼─────────┬─────┤     ├─────┬─────┼─────────┼─────────┴─────────┴─────────┴─────────┴─────────┘
336  //                                                   │ XXXXXXX │ XXXXXXX │ XXX │     │ XXX │_____│  _____  │
337  //                                                   └─────────┴─────────┴─────┘     └─────┴─────┴─────────┘
338  [SYMB] = LAYOUT(
339    VRSN,     XXXXXXX,   XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,   XXXXXXX,    XXXXXXX,  XXXXXXX,   XXXXXXX,  XXXXXXX,  XXXXXXX,   XXXXXXX,  XXXXXXX,
340    KC_BSLS,  FR_GRAVE,  KC_LABK,  KC_RABK,  KC_PMNS,  KC_PIPE,   XXXXXXX,    XXXXXXX,  KC_CIRC,   KC_LCBR,  KC_RCBR,  KC_DLR,    FR_CIRC,  XXXXXXX,
341    XXXXXXX,  KC_EXLM,   KC_PAST,  KC_PSLS,  KC_EQL,   KC_AMPR,   XXXXXXX,    XXXXXXX,  KC_HASH,   KC_LPRN,  KC_RPRN,  KC_SCLN,   FR_DQUO,  XXXXXXX,
342    XXXXXXX,  KC_TILD,   KC_LBRC,  KC_RBRC,  KC_PLUS,  KC_PERC,                         KC_AT,     KC_COLN,  KC_COMM,  KC_DOT,    FR_QUOT,  XXXXXXX,
343    XXXXXXX,  XXXXXXX,   XXXXXXX,  XXXXXXX,  _______,             RM_VALU,    RM_TOGG,             _______,  XXXXXXX,  XXXXXXX,   XXXXXXX,  XXXXXXX,
344                                              XXXXXXX,  XXXXXXX,   XXXXXXX,    XXXXXXX,  _______,   _______
345  ),
346
347  // ┌─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┐             ┌─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┐
348  // │  VRSN   │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │             │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │
349  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤             ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
350  // │  _____  │   F1    │   F2    │   F3    │   F4    │   F5    │  _____  │             │  _____  │  _____  │    7    │    8    │    9    │    *    │    /    │
351  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤             ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
352  // │  _____  │   F6    │   F7    │   F8    │   F9    │   F10   │  _____  │             │  _____  │  _____  │    4    │    5    │    6    │    -    │    +    │
353  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┘             └─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
354  // │  _____  │   F11   │   F12   │   F13   │   F14   │   F15   │                                 │  _____  │    1    │    2    │    3    │    .    │    ,    │
355  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼───────────────┐     ┌───────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
356  // │ EE CLR  │  _____  │  _____  │  _____  │  _____  │         │     _____     │     │   _____   │         │    0    │  _____  │  _____  │  _____  │  _____  │
357  // └─────────┴─────────┴─────────┴─────────┴─────────┼─────────┼─────────┬─────┤     ├─────┬─────┼─────────┼─────────┴─────────┴─────────┴─────────┴─────────┘
358  //                                                   │  _____  │  _____  │ ___ │     │ ___ │_____│  _____  │
359  //                                                   └─────────┴─────────┴─────┘     └─────┴─────┴─────────┘
360  [NUMB] = LAYOUT(
361    VRSN,     XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,    XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,
362    _______,  KC_F1,    KC_F2,    KC_F3,    KC_F4,    KC_F5,    _______,    _______,  _______,  KC_7,     KC_8,     KC_9,     KC_PAST,  KC_PSLS,
363    _______,  KC_F6,    KC_F7,    KC_F8,    KC_F9,    KC_F10,   _______,    _______,  _______,  KC_4,     KC_5,     KC_6,     KC_PMNS,  KC_PPLS,
364    _______,  KC_F11,   KC_F12,   KC_F13,   KC_F14,   KC_F15,                         _______,  KC_1,     KC_2,     KC_3,     KC_PDOT,  KC_PCMM,
365    EE_CLR,   _______,  _______,  _______,  _______,            _______,    _______,            KC_0,     _______,  _______,  _______,  _______,
366                                            _______,  _______,  _______,    _______,  _______,  _______
367  ),
368
369  // ┌─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┐             ┌─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┐
370  // │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │             │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │
371  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤             ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
372  // │  VRSN   │  _____  │    @    │    {    │    }    │    |    │  _____  │             │  _____  │  PRTSCR │  HOME   │   UP    │   END   │  PG UP  │  BOOT   │
373  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤             ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
374  // │  _____  │  _____  │ MED PRV │ MED PLY │ MED NXT │  _____  │  _____  │             │  _____  │  _____  │  LEFT   │  DOWN   │  RIGHT  │  PG DN  │  _____  │
375  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┘             └─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
376  // │  _____  │  _____  │  _____  │  _____  │  _____  │  _____  │                                 │  MUTE   │  _____  │  _____  │  _____  │  _____  │  _____  │
377  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼───────────────┐     ┌───────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
378  // │ EE CLR  │  _____  │  _____  │  _____  │  _____  │         │    VOL DN     │     │   VOL UP  │         │  _____  │  _____  │  _____  │  _____  │  _____  │
379  // └─────────┴─────────┴─────────┴─────────┴─────────┼─────────┼─────────┬─────┤     ├─────┬─────┼─────────┼─────────┴─────────┴─────────┴─────────┴─────────┘
380  //                                                   │  _____  │  _____  │ ___ │     │ ___ │_____│  _____  │
381  //                                                   └─────────┴─────────┴─────┘     └─────┴─────┴─────────┘
382  [NAVI] = LAYOUT(
383    XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,    XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,
384    VRSN,     _______,  KC_AT,    KC_LCBR,  KC_RCBR,  KC_PIPE,  _______,    _______,  KC_PSCR,  KC_HOME,  KC_UP,    KC_END,   KC_PGUP,  QK_BOOT,
385    _______,  _______,  KC_MPRV,  KC_MPLY,  KC_MNXT,  _______,  _______,    _______,  _______,  KC_LEFT,  KC_DOWN,  KC_RGHT,  KC_PGDN,  _______,
386    _______,  _______,  _______,  _______,  _______,  _______,                        KC_MUTE,  _______,  _______,  _______,  _______,  _______,
387    EE_CLR,   _______,  _______,  _______,  _______,            KC_VOLD,    KC_VOLU,            _______,  _______,  _______,  _______,  _______,
388                                            _______,  _______,  _______,    _______,  _______,  _______
389  ),
390  
391
392  // ┌─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┐             ┌─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┐
393  // │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │             │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │  BOOT   │
394  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤             ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
395  // │  _____  │  _____  │  _____  │  _____  │  _____  │  _____  │  _____  │             │  _____  │  _____  │  _____  │  MS UP  │  _____  │  _____  │  _____  │
396  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤             ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
397  // │  _____  │  WHL L  │  WHL U  │  WHL D  │  WHL R  │  _____  │  _____  │             │  _____  │  _____  │  MS LFT │  MS DN  │  MS RGT │  _____  │  _____  │
398  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┘             └─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
399  // │  _____  │  _____  │  _____  │  _____  │  _____  │  _____  │                                 │  _____  │  _____  │  _____  │  _____  │  _____  │  _____  │
400  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼───────────────┐     ┌───────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
401  // │ EE CLR  │  _____  │  _____  │  _____  │  _____  │         │    VOL DN     │     │   VOL UP  │         │  _____  │  _____  │  _____  │  _____  │  _____  │
402  // └─────────┴─────────┴─────────┴─────────┴─────────┼─────────┼─────────┬─────┤     ├─────┬─────┼─────────┼─────────┴─────────┴─────────┴─────────┴─────────┘
403  //                                                   │  BTN 1  │  BTN 3  │ ___ │     │ ___ │BTN 3│  BTN 2  │
404  //                                                   └─────────┴─────────┴─────┘     └─────┴─────┴─────────┘
405  [MOUS] = LAYOUT(
406    XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,    XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  QK_BOOT,
407    _______,  _______,  _______,  _______,  _______,  _______,  _______,    _______,  _______,  _______,  MS_UP,    _______,  _______,  _______,
408    _______,  MS_WHLL,  MS_WHLU,  MS_WHLD,  MS_WHLR,  _______,  _______,    _______,  _______,  MS_LEFT,  MS_DOWN,  MS_RGHT,  _______,  _______,
409    _______,  _______,  _______,  _______,  _______,  _______,                        _______,  _______,  _______,  _______,  _______,  _______,
410    EE_CLR,   _______,  _______,  _______,  _______,            KC_VOLD,    KC_VOLU,            _______,  _______,  _______,  _______,  _______,
411                                            MS_BTN1,  MS_BTN3,  _______,    _______,  MS_BTN3,  MS_BTN2
412  ),
413
414  // ┌─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┐             ┌─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┐
415  // │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │             │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │  BOOT   │
416  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤             ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
417  // │  _____  │  _____  │  _____  │  _____  │  _____  │  _____  │  _____  │             │  _____  │  _____  │  _____  │  MS UP  │  _____  │  _____  │  _____  │
418  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤             ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
419  // │  _____  │   GUI   │   ALT   │  SHIFT  │   CTL   │  HYPER  │  _____  │             │  _____  │  _____  │   CTL   │  SHIFT  │   ALT   │   GUI   │  _____  │
420  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┘             └─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
421  // │  _____  │  _____  │  _____  │  _____  │  _____  │  _____  │                                 │  _____  │  _____  │  _____  │  _____  │  _____  │  _____  │
422  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼───────────────┐     ┌───────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
423  // │ EE CLR  │  _____  │  _____  │  _____  │  _____  │         │    VOL DN     │     │   VOL UP  │         │  _____  │  _____  │  _____  │  _____  │  _____  │
424  // └─────────┴─────────┴─────────┴─────────┴─────────┼─────────┼─────────┬─────┤     ├─────┬─────┼─────────┼─────────┴─────────┴─────────┴─────────┴─────────┘
425  //                                                   │  BTN 1  │  BTN 3  │ ___ │     │ ___ │BTN 3│  BTN 2  │
426  //                                                   └─────────┴─────────┴─────┘     └─────┴─────┴─────────┘
427  [MODS] = LAYOUT(
428    XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,    XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  QK_BOOT,
429    _______,  _______,  _______,  _______,  _______,  _______,  _______,    _______,  _______,  _______,  MS_UP,    _______,  _______,  _______,
430    _______,  OS_LGUI,  OS_LALT,  OS_LSFT,  OS_LCTL,  OS_HYPR,  _______,    _______,  _______,  OS_LCTL,  OS_LSFT,  OS_LALT,  OS_LGUI,  _______,
431    _______,  _______,  _______,  _______,  _______,  _______,                        _______,  _______,  _______,  _______,  _______,  _______,
432    EE_CLR,   _______,  _______,  _______,  _______,            KC_VOLD,    KC_VOLU,            _______,  _______,  _______,  _______,  _______,
433                                            MS_BTN1,  MS_BTN3,  _______,    _______,  MS_BTN3,  MS_BTN2
434  ),
435};
436
437bool process_record_user(uint16_t keycode, keyrecord_t *record) {
438  uint8_t current_layer = get_highest_layer(layer_state);
439  uint8_t mod_state = get_mods();
440
441  // Process numword before other logic
442  if (!process_num_word(keycode, record)) {
443    return false;
444  }
445
446  // Handle NUMWORD separately since it needs both press and release
447  if (keycode == NUMWORD) {
448    process_num_word_activation(NUMB, record);
449    return false;
450  }
451
452  if (record->event.pressed) {
453    switch (keycode) {
454    case VRSN:
455      SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
456      return false;
457    case SFTLLCK:
458      if (record->tap.count) {
459	if (record->event.pressed) {
460	  // Toggle the lock on the highest layer.
461	  layer_lock_invert(get_highest_layer(layer_state));
462	}
463	return false;
464      }
465      break;
466    case FR_DQUO:
467      if (record->event.pressed) {
468	// if layer is bepo, and shift is on, send ?
469	if (IS_LAYER_ON_STATE(current_layer, BEPO) && (get_mods() & MOD_MASK_SHIFT)) {
470	  del_mods(MOD_MASK_SHIFT);
471	  SEND_STRING(SS_TAP(X_1));
472	  set_mods(mod_state);
473	} else {
474	  SEND_STRING(FR_DQUO_M);
475	}
476      }
477      break;
478    case FR_QUOT:
479      // if layer is bepo, and shift is on, send ?
480      if (IS_LAYER_ON_STATE(current_layer, BEPO) && (get_mods() & MOD_MASK_SHIFT)) {
481	del_mods(MOD_MASK_SHIFT);
482	SEND_STRING(SS_LSFT(SS_TAP(X_SLASH)));
483	set_mods(mod_state);
484      } else {
485	SEND_STRING(FR_QUOT_M);
486      }
487      break;
488    case FR_GRAVE:
489      if (record->event.pressed) {
490	SEND_STRING(FR_GRAVE_M);
491      }
492      break;
493    case FR_CIRC:
494      if (record->event.pressed) {
495	SEND_STRING(FR_CIRC_M);
496      }
497      break;
498    case FR_E_AIGU:
499      if (record->event.pressed) {
500	if (get_mods() & MOD_MASK_SHIFT) {
501	  // É
502	  del_mods(MOD_MASK_SHIFT);
503	  SEND_STRING(FR_E_AIGU_CAPS_M);
504	  set_mods(mod_state);
505	} else {
506	  // é
507	  SEND_STRING(FR_E_AIGU_M);
508	}
509      }
510      break;
511    case FR_E_AIGU_CAPS:
512      if (record->event.pressed) {
513	SEND_STRING(FR_E_AIGU_CAPS_M);
514      }
515      break;
516    case FR_E_GRAVE:
517      if (record->event.pressed) {
518	if (get_mods() & MOD_MASK_SHIFT) {
519	  // 
520	  del_mods(MOD_MASK_SHIFT);
521	  SEND_STRING(FR_E_GRAVE_CAPS_M);
522	  set_mods(mod_state);
523	} else {
524	  // è
525	  SEND_STRING(FR_E_GRAVE_M); 
526	}
527      }
528      break;
529    case FR_E_GRAVE_CAPS:
530      if (record->event.pressed) {
531	SEND_STRING(FR_E_GRAVE_CAPS_M);
532      }
533      break;
534    case FR_A_GRAVE:
535      if (record->event.pressed) {
536	if (get_mods() & MOD_MASK_SHIFT) {
537	  del_mods(MOD_MASK_SHIFT);
538	  SEND_STRING(FR_A_GRAVE_CAPS_M);
539	  set_mods(mod_state);
540	} else {
541	  // à
542	  SEND_STRING(FR_A_GRAVE_M); 
543	}
544      }
545      break;
546    case FR_A_GRAVE_CAPS:
547      if (record->event.pressed) {
548	SEND_STRING(FR_A_GRAVE_CAPS_M);
549      }
550      break;
551    }
552  }
553  return true;
554}
555
556extern rgb_config_t rgb_matrix_config;
557
558// Line 2 home-row (7 12 17 22 [27] and [63] 58 53 48 43)
559void my_set_rgb_matrix_color_homerow(uint8_t red, uint8_t green, uint8_t blue) {
560  rgb_matrix_set_color(7, red, green, blue);
561  rgb_matrix_set_color(12, red, green, blue);
562  rgb_matrix_set_color(17, red, green, blue);
563  rgb_matrix_set_color(22, red, green, blue);
564    
565  rgb_matrix_set_color(58, red, green, blue);
566  rgb_matrix_set_color(53, red, green, blue);
567  rgb_matrix_set_color(48, red, green, blue);
568  rgb_matrix_set_color(43, red, green, blue);
569}
570
571void my_set_rgb_matrix_color_line(int line,  uint8_t red, uint8_t green, uint8_t blue) {
572  if (line == 0 || line == 1 || line == 2) {
573    // Left
574    rgb_matrix_set_color(line, red, green, blue);
575    rgb_matrix_set_color(line+5, red, green, blue);
576    rgb_matrix_set_color(line+10, red, green, blue);
577    rgb_matrix_set_color(line+15, red, green, blue);
578    rgb_matrix_set_color(line+20, red, green, blue);
579    rgb_matrix_set_color(line+25, red, green, blue);
580    /* rgb_matrix_set_color(line+29, red, green, blue); */
581    // Right
582    /* rgb_matrix_set_color(line+65, red, green, blue); */
583    rgb_matrix_set_color(line+61, red, green, blue);
584    rgb_matrix_set_color(line+56, red, green, blue);
585    rgb_matrix_set_color(line+51, red, green, blue);
586    rgb_matrix_set_color(line+46, red, green, blue);
587    rgb_matrix_set_color(line+41, red, green, blue);
588    rgb_matrix_set_color(line+36, red, green, blue);
589  } else if (line == 3) {
590    // Left
591    rgb_matrix_set_color(3, red, green, blue);
592    rgb_matrix_set_color(8, red, green, blue);
593    rgb_matrix_set_color(13, red, green, blue);
594    rgb_matrix_set_color(18, red, green, blue);
595    rgb_matrix_set_color(23, red, green, blue);
596    rgb_matrix_set_color(28, red, green, blue);
597    // Right
598    rgb_matrix_set_color(64, red, green, blue);
599    rgb_matrix_set_color(59, red, green, blue);
600    rgb_matrix_set_color(54, red, green, blue);
601    rgb_matrix_set_color(49, red, green, blue);
602    rgb_matrix_set_color(44, red, green, blue);
603    rgb_matrix_set_color(39, red, green, blue);
604  } else if (line == 4) {
605    // Left
606    /* rgb_matrix_set_color(4, red, green, blue); */
607    /* rgb_matrix_set_color(9, red, green, blue); */
608    /* rgb_matrix_set_color(14, red, green, blue); */
609    /* rgb_matrix_set_color(19, red, green, blue); */
610    rgb_matrix_set_color(24, red, green, blue);
611    rgb_matrix_set_color(32, red, green, blue);
612    rgb_matrix_set_color(33, red, green, blue);
613    /* rgb_matrix_set_color(34, red, green, blue); */
614    rgb_matrix_set_color(35, red, green, blue);
615    // Right
616    rgb_matrix_set_color(60, red, green, blue);
617    /* rgb_matrix_set_color(55, red, green, blue); */
618    /* rgb_matrix_set_color(50, red, green, blue); */
619    /* rgb_matrix_set_color(45, red, green, blue); */
620    /* rgb_matrix_set_color(40, red, green, blue); */
621    rgb_matrix_set_color(68, red, green, blue);
622    rgb_matrix_set_color(69, red, green, blue);
623    /* rgb_matrix_set_color(70, red, green, blue); */
624    rgb_matrix_set_color(71, red, green, blue);
625  }
626}
627
628// matrix, to set key with. maybe there is a better way but used ascii generator so i can easily set those visually
629//    ┌────┬────┬────┬────┬────┬────┬────┐             ┌────┬────┬────┬────┬────┬────┬────┐
630//    │ 0  │ 5  │ 10 │ 15 │ 20 │ 25 │ 29 │             │ 65 │ 61 │ 56 │ 51 │ 46 │ 41 │ 36 │
631//    ├────┼────┼────┼────┼────┼────┼────┤             ├────┼────┼────┼────┼────┼────┼────┤
632//    │ 1  │ 6  │ 11 │ 16 │ 21 │ 26 │ 30 │             │ 66 │ 62 │ 57 │ 52 │ 47 │ 42 │ 37 │
633//    ├────┼────┼────┼────┼────┼────┼────┤             ├────┼────┼────┼────┼────┼────┼────┤
634//    │ 2  │ 7  │ 12 │ 17 │[22]│ 27 │ 31 │             │ 67 │ 63 │[58]│ 53 │ 48 │ 43 │ 38 │
635//    ├────┼────┼────┼────┼────┼────┼────┘             └────┼────┼────┼────┼────┼────┼────┤
636//    │ 3  │ 8  │ 13 │ 18 │ 23 │ 28 │                       │ 64 │ 59 │ 54 │ 49 │ 44 │ 39 │
637//    ├────┼────┼────┼────┼────┼────┼─────────┐   ┌─────────┼────┼────┼────┼────┼────┼────┤
638//    │ 4  │ 9  │ 14 │ 19 │ 24 │    │   35    │   │   71    │    │ 60 │ 55 │ 50 │ 45 │ 40 │
639//    └────┴────┴────┴────┴────┼────┼────┬────┤   ├────┬────┼────┼────┴────┴────┴────┴────┘
640//                             │ 32 │ 33 │ 34 │   │ 70 │ 69 │ 68 │
641//                             └────┴────┴────┘   └────┴────┴────┘
642// Runs constantly in the background, in a loop.
643bool rgb_matrix_indicators_user(void) {
644  if (rgb_matrix_get_flags() & (LED_FLAG_KEYLIGHT | LED_FLAG_MODIFIER)) {
645    switch (get_highest_layer(layer_state)) {
646    case BEPO:
647      rgb_matrix_set_color_all(RGB_OFF);
648      // Line 1
649      my_set_rgb_matrix_color_line(1,213,144,0);
650      // Line 2
651      my_set_rgb_matrix_color_line(2,27,213,0);
652      my_set_rgb_matrix_color_homerow(206,255,206);
653      // Line 3
654      my_set_rgb_matrix_color_line(3,0,255,167);
655      // Line 4
656      my_set_rgb_matrix_color_line(4,0,113,255);
657      break;
658    case ERGL:
659      rgb_matrix_set_color_all(RGB_OFF);
660      // ERGOL layer
661      rgb_matrix_set_color(34, 0, 113, 255);
662      rgb_matrix_set_color(70, 0, 113, 255);
663      // Line 1
664      my_set_rgb_matrix_color_line(1,213,144,0);
665      // Line 2
666      my_set_rgb_matrix_color_line(2,27,213,0);
667      my_set_rgb_matrix_color_homerow(206,255,206);
668      // Line 3
669      my_set_rgb_matrix_color_line(3,0,255,167);
670      // Line 4
671      my_set_rgb_matrix_color_line(4,0,113,255);
672      break;
673    case QWER:
674      rgb_matrix_set_color_all(RGB_OFF);
675      // QWERTY layer
676      rgb_matrix_set_color(34, 27,213,0);
677      rgb_matrix_set_color(70, 27,213,0);
678      // Line 1
679      my_set_rgb_matrix_color_line(1,213,144,0);
680      // Line 2
681      my_set_rgb_matrix_color_line(2,27,213,0);
682      my_set_rgb_matrix_color_homerow(206,255,206);
683      // Line 3
684      my_set_rgb_matrix_color_line(3,0,255,167);
685      // Line 4
686      my_set_rgb_matrix_color_line(4,0,113,255);
687      break;
688    case NUMB:
689      rgb_matrix_set_color_all(RGB_OFF);
690      
691      rgb_matrix_set_color(0, RGB_RED);
692
693      rgb_matrix_set_color(6, 0, 55, 255); // FX
694      rgb_matrix_set_color(11, 0, 55, 255); // FX
695      rgb_matrix_set_color(16, 0, 55, 255); // FX
696      rgb_matrix_set_color(21, 0, 55, 255); // FX
697      rgb_matrix_set_color(26, 0, 55, 255); // FX
698      rgb_matrix_set_color(7, 0, 55, 255); // FX
699      rgb_matrix_set_color(12, 0, 55, 255); // FX
700      rgb_matrix_set_color(17, 0, 55, 255); // FX
701      rgb_matrix_set_color(22, 0, 55, 255); // FX
702      rgb_matrix_set_color(27, 0, 55, 255); // FX
703      rgb_matrix_set_color(8, 0, 55, 255); // FX
704      rgb_matrix_set_color(13, 0, 55, 255); // FX
705
706    
707      rgb_matrix_set_color(18, 0, 183, 255); // FX
708      rgb_matrix_set_color(23, 0, 183, 255); // FX
709      rgb_matrix_set_color(28, 0, 183, 255); // FX
710      
711      rgb_matrix_set_color(60, 255, 255, 255); // 0
712      rgb_matrix_set_color(47, 255, 199, 0);     // number
713      rgb_matrix_set_color(48, 255, 199, 0);     // number
714      rgb_matrix_set_color(49, 255, 199, 0);     // number
715      rgb_matrix_set_color(52, 255, 199, 0);     // number
716      rgb_matrix_set_color(53, 255, 199, 0);     // number
717      rgb_matrix_set_color(54, 255, 199, 0);     // number
718      rgb_matrix_set_color(57, 255, 199, 0);     // number
719      rgb_matrix_set_color(58, 255, 199, 0);     // number
720      rgb_matrix_set_color(59, 255, 199, 0);     // number
721
722      rgb_matrix_set_color(42, 183, 255, 0);     // calc
723      rgb_matrix_set_color(43, 183, 255, 0);     // calc
724      rgb_matrix_set_color(44, 183, 255, 0);     // calc
725      rgb_matrix_set_color(37, 183, 255, 0);     // calc
726      rgb_matrix_set_color(38, 183, 255, 0);     // calc
727      rgb_matrix_set_color(39, 183, 255, 0);     // calc
728      break;
729    case SYMB:
730      rgb_matrix_set_color_all(RGB_OFF);
731      // () {} [] <>
732      rgb_matrix_set_color(11, 27, 213, 0);
733      rgb_matrix_set_color(16, 27, 213, 0);
734      rgb_matrix_set_color(13, 27, 213, 0);
735      rgb_matrix_set_color(18, 27, 213, 0);
736      rgb_matrix_set_color(57, 27, 213, 0);
737      rgb_matrix_set_color(58, 27, 213, 0);
738      rgb_matrix_set_color(52, 27, 213, 0);
739      rgb_matrix_set_color(53, 27, 213, 0);
740
741      // +-=/*
742      rgb_matrix_set_color(23, 29, 204, 67);
743      rgb_matrix_set_color(12, 29, 204, 67);
744      rgb_matrix_set_color(17, 29, 204, 67);
745      rgb_matrix_set_color(22, 29, 204, 67);
746      rgb_matrix_set_color(21, 29, 204, 67);
747      rgb_matrix_set_color(1, 29, 204, 67); // anti-slash
748
749      // `!~|&%^#
750      rgb_matrix_set_color(6, 255, 199, 0);
751      rgb_matrix_set_color(7, 255, 199, 0);
752      rgb_matrix_set_color(8, 255, 199, 0);
753      rgb_matrix_set_color(26, 255, 199, 0);
754      rgb_matrix_set_color(27, 255, 199, 0);
755      rgb_matrix_set_color(28, 255, 199, 0);
756      rgb_matrix_set_color(62, 255, 199, 0);
757      rgb_matrix_set_color(42, 255, 199, 0);
758      rgb_matrix_set_color(63, 255, 199, 0);
759      
760      // "'
761      rgb_matrix_set_color(43, 204, 202, 29);
762      rgb_matrix_set_color(44, 204, 202, 29);
763
764      // :;,.
765      rgb_matrix_set_color(59, 29, 120, 204);
766      rgb_matrix_set_color(54, 29, 120, 204);
767      rgb_matrix_set_color(48, 29, 120, 204);
768      rgb_matrix_set_color(49, 29, 120, 204);
769
770      // @ $
771      rgb_matrix_set_color(47, 174, 29, 204);
772      rgb_matrix_set_color(64, 174, 29, 204);
773      
774      break;
775    case NAVI:
776      rgb_matrix_set_color_all(RGB_OFF);
777
778      rgb_matrix_set_color(1, RGB_RED);
779      rgb_matrix_set_color(37, RGB_RED);
780
781      // Arrows
782      rgb_matrix_set_color(52, 0, 113, 255);
783      rgb_matrix_set_color(53, 0, 113, 255);
784      rgb_matrix_set_color(58, 0, 113, 255);
785      rgb_matrix_set_color(48, 0, 113, 255);
786      // Home, End, PgUp, PgDown 
787      rgb_matrix_set_color(57, 13, 0, 255);
788      rgb_matrix_set_color(47, 13, 0, 255);
789      rgb_matrix_set_color(42, 13, 0, 255);
790      rgb_matrix_set_color(43, 13, 0, 255);
791
792      // Media
793      rgb_matrix_set_color(12, 27, 213, 0);
794      rgb_matrix_set_color(17, 27, 213, 0);
795      rgb_matrix_set_color(22, 27, 213, 0);
796
797      // Volume
798      rgb_matrix_set_color(35, 170, 0, 255);
799      rgb_matrix_set_color(71, 170, 0, 255);
800      rgb_matrix_set_color(64, 170, 0, 255);
801
802      // PrintScreen
803      rgb_matrix_set_color(62, 255, 255, 255);
804      break;
805    case MOUS:
806      rgb_matrix_set_color_all(RGB_OFF);
807      // mouse movements
808      rgb_matrix_set_color(52, 0, 113, 255);
809      rgb_matrix_set_color(53, 0, 113, 255);
810      rgb_matrix_set_color(58, 0, 113, 255);
811      rgb_matrix_set_color(48, 0, 113, 255);
812      // wheel
813
814      rgb_matrix_set_color(7, 13, 0, 255);
815      rgb_matrix_set_color(12, 13, 0, 255);
816      rgb_matrix_set_color(17, 13, 0, 255);
817      rgb_matrix_set_color(22, 13, 0, 255);
818      // clicks
819      rgb_matrix_set_color(32, 170, 0, 255);
820      rgb_matrix_set_color(33, 170, 0, 255);
821      rgb_matrix_set_color(68, 170, 0, 255);
822      rgb_matrix_set_color(69, 170, 0, 255);
823      break;
824    default:
825      rgb_matrix_set_color_all(RGB_OFF);
826      break;
827    }
828  }
829  return false;
830}
831
832void caps_word_set_user(bool active) {
833  if (active) {
834    rgb_matrix_set_color(40, 255, 255, 255);
835  } else {
836    rgb_matrix_set_color(40, RGB_OFF);
837  }
838}