main
  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_TILD,
 49  FR_A_GRAVE,
 50  FR_A_GRAVE_CAPS,
 51  NUMWORD,  // Numword layer activation
 52};
 53
 54const key_override_t circ_exclamation_override = ko_make_with_layers(MOD_MASK_SHIFT, KC_CIRC, KC_EXLM, 1 << BEPO);
 55const key_override_t dot_colon_override = ko_make_with_layers(MOD_MASK_SHIFT, KC_DOT, KC_COLN, 1 << BEPO);
 56const key_override_t comma_semicolon_override = ko_make_with_layers(MOD_MASK_SHIFT, HM_HYP_COMM, KC_SCLN, 1 << BEPO);
 57
 58// row 1
 59const key_override_t b_pipe_override = ko_make_with_layers_and_negmods(MOD_BIT_RALT, KC_B, KC_PIPE, 1 << BEPO, MOD_MASK_SHIFT);
 60const key_override_t b_brkp_override = ko_make_with_layers(MOD_BIT_LSHIFT | MOD_BIT_RALT, KC_B, US_BRKP, 1 << BEPO);
 61
 62const key_override_t space_underscore_override = ko_make_with_layers_and_negmods(MOD_BIT_RALT, KC_SPC, KC_UNDS, 1 << BEPO, MOD_MASK_SHIFT);
 63
 64const key_override_t *key_overrides[] = {
 65  &circ_exclamation_override,
 66  &dot_colon_override,
 67  &comma_semicolon_override,
 68
 69  &b_pipe_override,
 70  &b_brkp_override,
 71  &space_underscore_override,
 72};
 73
 74void leader_start_user(void) {
 75    // Visual feedback when leader mode activates (optional)
 76}
 77
 78void leader_end_user(void) {
 79    // ====== LAYOUT SWITCHING ======
 80    // Leader + l + <key> for layout changes
 81    if (leader_sequence_two_keys(KC_L, KC_B)) {
 82        layer_move(BEPO);
 83    } else if (leader_sequence_two_keys(KC_L, KC_E)) {
 84        layer_move(ERGL);
 85    } else if (leader_sequence_two_keys(KC_L, KC_Q)) {
 86        layer_move(QWER);
 87    }
 88
 89    // ====== DEVELOPMENT PATTERNS ======
 90    // Leader + c + <key> for code snippets
 91    else if (leader_sequence_two_keys(KC_C, KC_N)) {
 92        SEND_STRING("nil");
 93    } else if (leader_sequence_two_keys(KC_C, KC_E)) {
 94        SEND_STRING("if err != nil {" SS_TAP(X_ENT) SS_TAP(X_TAB));
 95    } else if (leader_sequence_two_keys(KC_C, KC_L)) {
 96        SEND_STRING("console.log()");
 97        SEND_STRING(SS_TAP(X_LEFT));
 98    } else if (leader_sequence_two_keys(KC_C, KC_P)) {
 99        SEND_STRING("fmt.Println()");
100        SEND_STRING(SS_TAP(X_LEFT));
101    } else if (leader_sequence_two_keys(KC_C, KC_F)) {
102        SEND_STRING("function() {}");
103        SEND_STRING(SS_TAP(X_LEFT) SS_TAP(X_LEFT));
104    } else if (leader_sequence_two_keys(KC_C, KC_A)) {
105        SEND_STRING("() => {}");
106        SEND_STRING(SS_TAP(X_LEFT) SS_TAP(X_LEFT));
107    }
108
109    // ====== PERSONAL MACROS ======
110    // Leader + m + <key> for personal macros
111    else if (leader_sequence_two_keys(KC_M, KC_E)) {
112        SEND_STRING("vincent@sbr.pm"); // TODO: Update with your email
113    } else if (leader_sequence_two_keys(KC_M, KC_G)) {
114        SEND_STRING("Vincent Demeester <vincent@sbr.pm>"); // Git signature
115    } else if (leader_sequence_two_keys(KC_M, KC_S)) {
116        SEND_STRING("--" SS_TAP(X_ENT) "Vincent Demeester" SS_TAP(X_ENT) "vincent@sbr.pm");
117    } else if (leader_sequence_two_keys(KC_M, KC_T)) {
118        // ISO 8601 timestamp - you might want to use a more dynamic approach
119        SEND_STRING(SS_LCTL("u")); // This is a placeholder - QMK can't generate current date
120    }
121
122    // ====== PYTHON PATTERNS ======
123    // Leader + p + <key> for Python code snippets
124    else if (leader_sequence_two_keys(KC_P, KC_I)) {
125        SEND_STRING("if __name__ == \"__main__\":" SS_TAP(X_ENT) SS_TAP(X_TAB));
126    } else if (leader_sequence_two_keys(KC_P, KC_D)) {
127        SEND_STRING("def ():" SS_TAP(X_ENT) SS_TAP(X_TAB));
128        SEND_STRING(SS_TAP(X_UP) SS_TAP(X_LEFT) SS_TAP(X_LEFT) SS_TAP(X_LEFT) SS_TAP(X_LEFT));
129    } else if (leader_sequence_two_keys(KC_P, KC_C)) {
130        SEND_STRING("class :" SS_TAP(X_ENT) SS_TAP(X_TAB));
131        SEND_STRING(SS_TAP(X_UP) SS_TAP(X_LEFT) SS_TAP(X_LEFT));
132    } else if (leader_sequence_two_keys(KC_P, KC_P)) {
133        SEND_STRING("print(f\"\")");
134        SEND_STRING(SS_TAP(X_LEFT) SS_TAP(X_LEFT));
135    } else if (leader_sequence_two_keys(KC_P, KC_T)) {
136        SEND_STRING("try:" SS_TAP(X_ENT) SS_TAP(X_TAB));
137        SEND_STRING(SS_TAP(X_ENT) SS_LSFT(SS_TAP(X_TAB)) "except Exception as e:" SS_TAP(X_ENT) SS_TAP(X_TAB));
138    } else if (leader_sequence_two_keys(KC_P, KC_W)) {
139        SEND_STRING("with open(\"\", \"r\") as f:" SS_TAP(X_ENT) SS_TAP(X_TAB));
140        SEND_STRING(SS_TAP(X_UP) SS_TAP(X_LEFT) SS_TAP(X_LEFT) SS_TAP(X_LEFT) SS_TAP(X_LEFT) SS_TAP(X_LEFT) SS_TAP(X_LEFT) SS_TAP(X_LEFT) SS_TAP(X_LEFT) SS_TAP(X_LEFT) SS_TAP(X_LEFT) SS_TAP(X_LEFT));
141    }
142
143    // ====== EMACS LISP PATTERNS ======
144    // Leader + e + <key> for Emacs Lisp snippets
145    else if (leader_sequence_two_keys(KC_E, KC_D)) {
146        SEND_STRING("(defun  ()" SS_TAP(X_ENT));
147        SEND_STRING(SS_TAP(X_UP) SS_TAP(X_LEFT) SS_TAP(X_LEFT) SS_TAP(X_LEFT));
148    } else if (leader_sequence_two_keys(KC_E, KC_I)) {
149        SEND_STRING("(interactive)");
150    } else if (leader_sequence_two_keys(KC_E, KC_L)) {
151        SEND_STRING("(let ((");
152    } else if (leader_sequence_two_keys(KC_E, KC_S)) {
153        SEND_STRING("(setq  )");
154        SEND_STRING(SS_TAP(X_LEFT) SS_TAP(X_LEFT));
155    } else if (leader_sequence_two_keys(KC_E, KC_M)) {
156        SEND_STRING("(message \"\")");
157        SEND_STRING(SS_TAP(X_LEFT) SS_TAP(X_LEFT));
158    } else if (leader_sequence_two_keys(KC_E, KC_R)) {
159        SEND_STRING("(require ')");
160        SEND_STRING(SS_TAP(X_LEFT));
161    }
162
163    // ====== NIX PATTERNS ======
164    // Leader + n + <key> for Nix snippets
165    else if (leader_sequence_two_keys(KC_N, KC_F)) {
166        SEND_STRING("{ pkgs, ... }:");
167    } else if (leader_sequence_two_keys(KC_N, KC_L)) {
168        SEND_STRING("let" SS_TAP(X_ENT) SS_TAP(X_TAB) SS_TAP(X_ENT) "in" SS_TAP(X_ENT));
169        SEND_STRING(SS_TAP(X_UP) SS_TAP(X_UP));
170    } else if (leader_sequence_two_keys(KC_N, KC_W)) {
171        SEND_STRING("with pkgs; [" SS_TAP(X_ENT) SS_TAP(X_TAB) SS_TAP(X_ENT) "]");
172        SEND_STRING(SS_TAP(X_UP));
173    } else if (leader_sequence_two_keys(KC_N, KC_I)) {
174        SEND_STRING("inherit ;");
175        SEND_STRING(SS_TAP(X_LEFT) SS_TAP(X_LEFT));
176    } else if (leader_sequence_two_keys(KC_N, KC_B)) {
177        SEND_STRING("buildInputs = [ ];");
178        SEND_STRING(SS_TAP(X_LEFT) SS_TAP(X_LEFT) SS_TAP(X_LEFT));
179    } else if (leader_sequence_two_keys(KC_N, KC_P)) {
180        SEND_STRING("pkgs.writeShellScriptBin \"\" ''");
181        SEND_STRING(SS_TAP(X_ENT) SS_TAP(X_TAB) SS_TAP(X_ENT) "''");
182        SEND_STRING(SS_TAP(X_UP) SS_TAP(X_UP) SS_TAP(X_LEFT) SS_TAP(X_LEFT) SS_TAP(X_LEFT));
183    }
184
185    // ====== IMPORT PATTERNS ======
186    // Leader + i + <key> for common imports
187    else if (leader_sequence_two_keys(KC_I, KC_P)) {
188        SEND_STRING("import ");
189    } else if (leader_sequence_two_keys(KC_I, KC_F)) {
190        SEND_STRING("from  import ");
191        SEND_STRING(SS_TAP(X_LEFT) SS_TAP(X_LEFT) SS_TAP(X_LEFT) SS_TAP(X_LEFT) SS_TAP(X_LEFT) SS_TAP(X_LEFT) SS_TAP(X_LEFT) SS_TAP(X_LEFT));
192    } else if (leader_sequence_two_keys(KC_I, KC_N)) {
193        SEND_STRING("{ pkgs }: {" SS_TAP(X_ENT) SS_TAP(X_TAB) SS_TAP(X_ENT) "}");
194        SEND_STRING(SS_TAP(X_UP));
195    } else if (leader_sequence_two_keys(KC_I, KC_E)) {
196        SEND_STRING("(use-package " SS_TAP(X_ENT) SS_TAP(X_TAB));
197        SEND_STRING(SS_TAP(X_UP) SS_TAP(X_END));
198    }
199
200    // ====== APPLICATION SHORTCUTS ======
201    // Leader + a + <key> for application launches
202    // These use the configured niri keybindings
203    else if (leader_sequence_two_keys(KC_A, KC_D)) {
204        SEND_STRING(SS_LGUI("d")); // Mod+D for fuzzel (app launcher)
205    } else if (leader_sequence_two_keys(KC_A, KC_E)) {
206        SEND_STRING(SS_LGUI(SS_LSFT(SS_TAP(X_ENT)))); // Mod+Shift+Enter for Emacs client
207    } else if (leader_sequence_two_keys(KC_A, KC_T)) {
208        SEND_STRING(SS_LGUI(SS_TAP(X_ENT))); // Mod+Enter for Terminal (kitty)
209    } else if (leader_sequence_two_keys(KC_A, KC_J)) {
210        SEND_STRING(SS_LGUI(SS_LCTL("d"))); // Mod+Control+D for emoji picker (rofimoji)
211    } else if (leader_sequence_two_keys(KC_A, KC_V)) {
212        SEND_STRING(SS_LGUI(SS_LCTL("v"))); // Mod+Control+V for clipboard history (cliphist)
213    } else if (leader_sequence_two_keys(KC_A, KC_R)) {
214        SEND_STRING(SS_LGUI(SS_LSFT("d"))); // Mod+Shift+D for raffi launcher
215    }
216}
217
218#define COMBO_REF_DEFAULT QWER
219
220uint8_t combo_ref_from_layer(uint8_t layer){
221  switch (get_highest_layer(layer_state)){
222  case BEPO: return QWER;
223  default: return QWER;
224  }
225  return layer;  // important if default is not in case.
226}
227
228enum combos {
229  TO_BEPO, TO_ERGOL, TO_QWERTY,
230  TOGGLE_MOUSE,
231  BEPO_ESC, QWERTY_ESC,
232  // Experiments
233  PIPE, AROBASE, HASH, DOLLAR, SLASH, BSLASH, AMPR, MINUS, UNDERSCORE, EQUAL,
234  LEADER,
235  LPRN, RPRN, LCBR, RCBR, LBRC, RBRC, LABK, RABK,
236  DQUO, TILDE, PRCNT, GRAVE, STAR, PLUS,
237};
238
239const uint16_t PROGMEM combo_to_bepo[] = {LT(NAVI,KC_BSPC), OS_LSFT, COMBO_END};
240const uint16_t PROGMEM combo_to_ergol[] = {KC_Q, KC_P, COMBO_END};  // Q+P opposite corners
241const uint16_t PROGMEM combo_to_qwerty[] = {KC_SPC, LT(SYMB, KC_ENT), COMBO_END};  // Space+Symb
242const uint16_t PROGMEM combo_toggle_mouse[] = {KC_Q, KC_R, COMBO_END};
243
244const uint16_t PROGMEM combo_bepo_escape[] = {HM_ALT_R, HM_GUI_N, COMBO_END};
245const uint16_t PROGMEM combo_qwe_escape[] = {HM_ALT_L, HM_GUI_SCLN, COMBO_END};
246
247const uint16_t PROGMEM combo_qwe_pipe[] = {KC_Q, KC_W, COMBO_END};       // |
248const uint16_t PROGMEM combo_qwe_arobase[] = {KC_W, KC_E, COMBO_END};    // @
249const uint16_t PROGMEM combo_qwe_hash[] = {KC_E, KC_R, COMBO_END};       // #
250const uint16_t PROGMEM combo_qwe_ampr[] = {KC_R, KC_T, COMBO_END};       // &
251const uint16_t PROGMEM combo_qwe_dollar[] = {KC_R, HM_CTL_F, COMBO_END}; // $
252const uint16_t PROGMEM combo_qwe_slash[] = {KC_E, HM_SFT_D, COMBO_END};  // /
253const uint16_t PROGMEM combo_qwe_bslash[] = {HM_SFT_D, KC_C, COMBO_END}; // antislash
254const uint16_t PROGMEM combo_qwe_minus[] = {KC_W, HM_ALT_S, COMBO_END};  // -
255const uint16_t PROGMEM combo_qwe_unds[] = {HM_CTL_F, KC_V, COMBO_END};   // _
256const uint16_t PROGMEM combo_qwe_equal[] = {HM_ALT_S, KC_X, COMBO_END};  // = 
257
258const uint16_t PROGMEM combo_qwe_leader[] = {KC_DEL, KC_RALT, COMBO_END}; // Del+RAlt - right side thumb cluster, very deliberate
259
260const uint16_t PROGMEM combo_qwe_lprn[] = {KC_I, HM_SFT_K, COMBO_END};    // (
261const uint16_t PROGMEM combo_qwe_rprn[] = {HM_SFT_K, KC_COMM, COMBO_END}; // )
262const uint16_t PROGMEM combo_qwe_lcbr[] = {KC_U, HM_CTL_J, COMBO_END};    // {
263const uint16_t PROGMEM combo_qwe_rcbr[] = {HM_CTL_J, KC_M, COMBO_END};    // }
264const uint16_t PROGMEM combo_qwe_lbrc[] = {KC_O, HM_ALT_L, COMBO_END};    // [
265const uint16_t PROGMEM combo_qwe_rbrc[] = {HM_ALT_L, KC_DOT, COMBO_END};  // ]
266const uint16_t PROGMEM combo_qwe_labk[] = {KC_U, KC_I, COMBO_END};        // <
267const uint16_t PROGMEM combo_qwe_rabk[] = {KC_I, KC_O, COMBO_END};        // >
268
269const uint16_t PROGMEM combo_qwe_dquo[] = {KC_Y, HM_HYP_H, COMBO_END};       // "
270const uint16_t PROGMEM combo_qwe_tilde[] = {KC_T, HM_HYP_G, COMBO_END};      // ~
271const uint16_t PROGMEM combo_qwe_prcnt[] = {HM_HYP_G, KC_B, COMBO_END};      // %
272const uint16_t PROGMEM combo_qwe_grave[] = {HM_HYP_H, KC_N, COMBO_END};      // ` (non-dead)
273const uint16_t PROGMEM combo_qwe_star[] = {KC_P, HM_GUI_SCLN, COMBO_END};    // *
274const uint16_t PROGMEM combo_qwe_plus[] = {HM_GUI_SCLN, KC_SLSH, COMBO_END}; // +
275
276combo_t key_combos[] = {
277  // Layers
278  [TO_BEPO] = COMBO(combo_to_bepo, TO(BEPO)),
279  [TO_ERGOL] = COMBO(combo_to_ergol, TO(ERGL)),
280  [TO_QWERTY] = COMBO(combo_to_qwerty, TO(QWER)),
281  [TOGGLE_MOUSE] = COMBO(combo_toggle_mouse, TG(MOUS)),
282  // Others
283  [QWERTY_ESC] = COMBO(combo_qwe_escape, KC_ESC),
284  [BEPO_ESC] = COMBO(combo_bepo_escape, KC_ESC),
285  // Experiments
286  [PIPE] = COMBO(combo_qwe_pipe, KC_PIPE),
287  [AROBASE] = COMBO(combo_qwe_arobase, KC_AT),
288  [HASH] = COMBO(combo_qwe_hash, KC_HASH),
289  [DOLLAR] = COMBO(combo_qwe_dollar, KC_DLR),
290  [SLASH] = COMBO(combo_qwe_slash, KC_SLSH),
291  [BSLASH] = COMBO(combo_qwe_bslash, KC_BSLS),
292  [AMPR] = COMBO(combo_qwe_ampr, KC_AMPR),
293  [MINUS] = COMBO(combo_qwe_minus, KC_PMNS),
294  [UNDERSCORE] = COMBO(combo_qwe_unds, KC_UNDS),
295  [EQUAL] = COMBO(combo_qwe_equal, KC_EQL),
296
297  [LEADER] = COMBO(combo_qwe_leader, QK_LEAD),
298  
299  [LPRN] = COMBO(combo_qwe_lprn, KC_LPRN),
300  [RPRN] = COMBO(combo_qwe_rprn, KC_RPRN),
301  [LCBR] = COMBO(combo_qwe_lcbr, KC_LCBR),
302  [RCBR] = COMBO(combo_qwe_rcbr, KC_RCBR),
303  [LBRC] = COMBO(combo_qwe_lbrc, KC_LBRC),
304  [RBRC] = COMBO(combo_qwe_rbrc, KC_RBRC),
305  [LABK] = COMBO(combo_qwe_labk, KC_LABK),
306  [RABK] = COMBO(combo_qwe_rabk, KC_RABK),
307
308  [DQUO] = COMBO(combo_qwe_dquo, FR_DQUO),
309  [TILDE] = COMBO(combo_qwe_tilde, FR_TILD),
310  [PRCNT] = COMBO(combo_qwe_prcnt, KC_PERC),
311  [GRAVE] = COMBO(combo_qwe_grave, FR_GRAVE),
312  [STAR] = COMBO(combo_qwe_star, KC_ASTR),
313  [PLUS] = COMBO(combo_qwe_plus, KC_PLUS),
314};
315
316bool combo_should_trigger(uint16_t combo_index, combo_t *combo, uint16_t keycode, keyrecord_t *record) {
317  switch (combo_index) {
318  case BEPO_ESC:
319    if (layer_state_is(BEPO)) {
320      return true;
321    }
322    return false;
323  case QWERTY_ESC:
324    if (layer_state_is(QWER)) {
325      return true;
326    }
327    return false;
328  }
329  return true;
330}
331
332tap_dance_action_t tap_dance_actions[] = {
333};
334
335const char chordal_hold_layout[MATRIX_ROWS][MATRIX_COLS] PROGMEM = LAYOUT(
336  'L', 'L', 'L', 'L', 'L', 'L', 'L', 'R', 'R', 'R', 'R', 'R', 'R', 'R',
337  'L', 'L', 'L', 'L', 'L', 'L', 'L', 'R', 'R', 'R', 'R', 'R', 'R', 'R',
338  'L', 'L', 'L', 'L', 'L', 'L', 'L', 'R', 'R', 'R', 'R', 'R', 'R', 'R',
339  'L', 'L', 'L', 'L', 'L', 'L',           'R', 'R', 'R', 'R', 'R', 'R',
340  'L', 'L', 'L', 'L', 'L', 'L',           'R', 'R', 'R', 'R', 'R', 'R',
341                 'L', 'L', 'L',           'R', 'R', 'R'
342);
343
344// clang-format off
345const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
346  // ┌─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┐             ┌─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┐
347  // │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │             │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │
348  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤             ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
349  // │   TAB   │    B    │    É    │    P    │    O    │    È    │ XXXXXXX │             │ XXXXXXX │    ^    │    V    │    D    │    L    │    J    │    Z    │
350  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤             ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
351  // │ NUMWORD │  GUI/A  │  ALT/U  │  SFT/I  │  CTL/E  │  HYP/,  │ XXXXXXX │             │ XXXXXXX │  HYP/C  │  CTL/T  │  SFT/S  │  ALT/R  │  GUI/N  │ SYMB/M  │
352  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┘             └─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
353  // │   GRV   │    À    │    Y    │    X    │    .    │    K    │                                 │    '    │    Q    │    G    │    H    │    F    │    W    │
354  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼───────────────┐     ┌───────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
355  // │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ MODS/DEL│         │     REPEAT    │     │  ALT-REP  │         │  RALT   │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │
356  // └─────────┴─────────┴─────────┴─────────┴─────────┼─────────┼─────────┬─────┤     ├─────┬─────┼─────────┼─────────┴─────────┴─────────┴─────────┴─────────┘
357  //                                                   │ NUMB/SPC│ NAVI/BSP│ XXX │     │ XXX │SHIFT│ SYMB/ENT│
358  //                                                   └─────────┴─────────┴─────┘     └─────┴─────┴─────────┘
359  [BEPO] = LAYOUT(
360    XXXXXXX,  XXXXXXX,     XXXXXXX,     XXXXXXX,      XXXXXXX,         XXXXXXX,         XXXXXXX,    XXXXXXX,  XXXXXXX,         XXXXXXX,     XXXXXXX,     XXXXXXX,      XXXXXXX,         XXXXXXX,
361    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,
362    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),
363    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,
364    XXXXXXX,  XXXXXXX,     XXXXXXX,     XXXXXXX,      LT(MOUS,KC_DEL),                  QK_REP,     QK_AREP,                   KC_RALT,     XXXXXXX,     XXXXXXX,      XXXXXXX,         XXXXXXX,
365                                                      KC_SPC,          LT(NAVI,KC_BSPC), XXXXXXX,    XXXXXXX,  OS_LSFT,         LT(SYMB,KC_ENT)
366  ),
367
368  // ┌─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┐             ┌─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┐
369  // │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │             │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │
370  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤             ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
371  // │   TAB   │    Q    │    W    │    E    │    R    │    T    │ XXXXXXX │             │ XXXXXXX │    Y    │    U    │    I    │    O    │    P    │    [    │
372  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤             ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
373  // │ NUMWORD │  GUI/A  │  ALT/S  │  SFT/D  │  CTL/F  │  HYP/G  │ XXXXXXX │             │ XXXXXXX │  HYP/H  │  CTL/J  │  SFT/K  │  ALT/L  │  GUI/;  │    "    │
374  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┘             └─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
375  // │   GRV   │    Z    │    X    │    C    │    V    │    B    │                                 │    N    │    M    │    ,    │    .    │    /    │    ]    │
376  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼───────────────┐     ┌───────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
377  // │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │   DEL   │         │     REPEAT    │     │  ALT-REP  │         │  RALT   │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │
378  // └─────────┴─────────┴─────────┴─────────┴─────────┼─────────┼─────────┬─────┤     ├─────┬─────┼─────────┼─────────┴─────────┴─────────┴─────────┴─────────┘
379  //                                                   │ NUMB/SPC│ NAVI/BSP│ XXX │     │ XXX │SHIFT│ SYMB/ENT│
380  //                                                   └─────────┴─────────┴─────┘     └─────┴─────┴─────────┘
381  [ERGL] = LAYOUT(
382    XXXXXXX,  XXXXXXX,     XXXXXXX,   XXXXXXX,   XXXXXXX,     XXXXXXX,         XXXXXXX,    XXXXXXX,  XXXXXXX,      XXXXXXX,     XXXXXXX,   XXXXXXX,      XXXXXXX,      XXXXXXX,
383    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,
384    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,
385    KC_GRV,   KC_Z,        KC_X,      KC_C,      KC_V,        KC_B,                                  KC_N,         KC_M,        KC_COMM,   KC_DOT,       KC_SLSH,      KC_RBRC,
386    XXXXXXX,  XXXXXXX,     XXXXXXX,   XXXXXXX,   LT(MOUS,KC_DEL),              QK_REP,     QK_AREP,                KC_RALT,     XXXXXXX,   XXXXXXX,      XXXXXXX,      XXXXXXX,
387                                                 KC_SPC,          LT(NAVI,KC_BSPC), XXXXXXX,    XXXXXXX,  OS_LSFT,      LT(SYMB,KC_ENT)
388  ),
389
390  // ┌─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┐             ┌─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┐
391  // │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │             │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │
392  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤             ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
393  // │   TAB   │    Q    │    W    │    E    │    R    │    T    │ XXXXXXX │             │ XXXXXXX │    Y    │    U    │    I    │    O    │    P    │    [    │
394  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤             ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
395  // │ NUMWORD │  GUI/A  │  ALT/S  │  SFT/D  │  CTL/F  │  HYP/G  │ XXXXXXX │             │ XXXXXXX │  HYP/H  │  CTL/J  │  SFT/K  │  ALT/L  │  GUI/;  │    "    │
396  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┘             └─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
397  // │   GRV   │    Z    │    X    │    C    │    V    │    B    │                                 │    N    │    M    │    ,    │    .    │    /    │    ]    │
398  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼───────────────┐     ┌───────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
399  // │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │   DEL   │         │     REPEAT    │     │  ALT-REP  │         │  RALT   │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │
400  // └─────────┴─────────┴─────────┴─────────┴─────────┼─────────┼─────────┬─────┤     ├─────┬─────┼─────────┼─────────┴─────────┴─────────┴─────────┴─────────┘
401  //                                                   │ NUMB/SPC│ NAVI/BSP│ XXX │     │ XXX │SHIFT│ SYMB/ENT│
402  //                                                   └─────────┴─────────┴─────┘     └─────┴─────┴─────────┘
403  [QWER] = LAYOUT(
404    XXXXXXX,  XXXXXXX,     XXXXXXX,   XXXXXXX,   XXXXXXX,     XXXXXXX,         XXXXXXX,    XXXXXXX,  XXXXXXX,      XXXXXXX,     XXXXXXX,   XXXXXXX,      XXXXXXX,      XXXXXXX,
405    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,
406    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,
407    KC_GRV,   KC_Z,        KC_X,      KC_C,      KC_V,        KC_B,                                  KC_N,         KC_M,        KC_COMM,   KC_DOT,       KC_SLSH,      KC_RBRC,
408    XXXXXXX,  XXXXXXX,     XXXXXXX,   XXXXXXX,   LT(MOUS,KC_DEL),              QK_REP,     QK_AREP,                KC_RALT,     XXXXXXX,   XXXXXXX,      XXXXXXX,      XXXXXXX,
409                                                 KC_SPC,          LT(NAVI,KC_BSPC), XXXXXXX,    XXXXXXX,  OS_LSFT,      LT(SYMB,KC_ENT)
410  ),
411
412  // ┌─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┐             ┌─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┐
413  // │  VRSN   │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │             │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │
414  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤             ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
415  // │    \    │    `    │    <    │    >    │    -    │    |    │ XXXXXXX │             │ XXXXXXX │    ^    │    {    │    }    │    $    │    ^    │ XXXXXXX │
416  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤             ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
417  // │ XXXXXXX │    !    │    *    │    /    │    =    │    &    │ XXXXXXX │             │ XXXXXXX │    #    │    (    │    )    │    ;    │    "    │ XXXXXXX │
418  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┘             └─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
419  // │ XXXXXXX │    ~    │    [    │    ]    │    +    │    %    │                                 │    @    │    :    │    ,    │    .    │    '    │ XXXXXXX │
420  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼───────────────┐     ┌───────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
421  // │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │  _____  │         │   RGB VAL+    │     │  RGB TOG  │         │  _____  │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │
422  // └─────────┴─────────┴─────────┴─────────┴─────────┼─────────┼─────────┬─────┤     ├─────┬─────┼─────────┼─────────┴─────────┴─────────┴─────────┴─────────┘
423  //                                                   │ XXXXXXX │ XXXXXXX │ XXX │     │ XXX │_____│  _____  │
424  //                                                   └─────────┴─────────┴─────┘     └─────┴─────┴─────────┘
425  [SYMB] = LAYOUT(
426    VRSN,     XXXXXXX,   XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,   XXXXXXX,    XXXXXXX,  XXXXXXX,   XXXXXXX,  XXXXXXX,  XXXXXXX,   XXXXXXX,  XXXXXXX,
427    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,
428    XXXXXXX,  KC_EXLM,   KC_PAST,  KC_PSLS,  KC_EQL,   KC_AMPR,   XXXXXXX,    XXXXXXX,  KC_HASH,   KC_LPRN,  KC_RPRN,  KC_SCLN,   FR_DQUO,  XXXXXXX,
429    XXXXXXX,  FR_TILD,   KC_LBRC,  KC_RBRC,  KC_PLUS,  KC_PERC,                         KC_AT,     KC_COLN,  KC_COMM,  KC_DOT,    FR_QUOT,  XXXXXXX,
430    XXXXXXX,  XXXXXXX,   XXXXXXX,  XXXXXXX,  _______,             RM_VALU,    RM_TOGG,             _______,  XXXXXXX,  XXXXXXX,   XXXXXXX,  XXXXXXX,
431                                              XXXXXXX,  XXXXXXX,   XXXXXXX,    XXXXXXX,  _______,   _______
432  ),
433
434  // ┌─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┐             ┌─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┐
435  // │  VRSN   │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │             │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │
436  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤             ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
437  // │  _____  │   F1    │   F2    │   F3    │   F4    │   F5    │  _____  │             │  _____  │  _____  │    7    │    8    │    9    │    *    │    /    │
438  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤             ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
439  // │  _____  │   F6    │   F7    │   F8    │   F9    │   F10   │  _____  │             │  _____  │  _____  │    4    │    5    │    6    │    -    │    +    │
440  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┘             └─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
441  // │  _____  │   F11   │   F12   │   F13   │   F14   │   F15   │                                 │  _____  │    1    │    2    │    3    │    .    │    ,    │
442  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼───────────────┐     ┌───────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
443  // │ EE CLR  │  _____  │  _____  │  _____  │  _____  │         │     _____     │     │   _____   │         │    0    │  _____  │  _____  │  _____  │  _____  │
444  // └─────────┴─────────┴─────────┴─────────┴─────────┼─────────┼─────────┬─────┤     ├─────┬─────┼─────────┼─────────┴─────────┴─────────┴─────────┴─────────┘
445  //                                                   │  _____  │  _____  │ ___ │     │ ___ │_____│  _____  │
446  //                                                   └─────────┴─────────┴─────┘     └─────┴─────┴─────────┘
447  [NUMB] = LAYOUT(
448    VRSN,     XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,    XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,
449    _______,  KC_F1,    KC_F2,    KC_F3,    KC_F4,    KC_F5,    _______,    _______,  _______,  KC_7,     KC_8,     KC_9,     KC_PAST,  KC_PSLS,
450    _______,  KC_F6,    KC_F7,    KC_F8,    KC_F9,    KC_F10,   _______,    _______,  _______,  KC_4,     KC_5,     KC_6,     KC_PMNS,  KC_PPLS,
451    _______,  KC_F11,   KC_F12,   KC_F13,   KC_F14,   KC_F15,                         _______,  KC_1,     KC_2,     KC_3,     KC_PDOT,  KC_PCMM,
452    EE_CLR,   _______,  _______,  _______,  _______,            _______,    _______,            KC_0,     _______,  _______,  _______,  _______,
453                                            _______,  _______,  _______,    _______,  _______,  _______
454  ),
455
456  // ┌─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┐             ┌─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┐
457  // │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │             │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │
458  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤             ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
459  // │  VRSN   │  _____  │    @    │    {    │    }    │    |    │  _____  │             │  _____  │  PRTSCR │  HOME   │   UP    │   END   │  PG UP  │  BOOT   │
460  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤             ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
461  // │  _____  │  _____  │ MED PRV │ MED PLY │ MED NXT │  _____  │  _____  │             │  _____  │  _____  │  LEFT   │  DOWN   │  RIGHT  │  PG DN  │  _____  │
462  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┘             └─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
463  // │  _____  │  _____  │  _____  │  _____  │  _____  │  _____  │                                 │  MUTE   │  _____  │  _____  │  _____  │  _____  │  _____  │
464  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼───────────────┐     ┌───────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
465  // │ EE CLR  │  _____  │  _____  │  _____  │  _____  │         │    VOL DN     │     │   VOL UP  │         │  _____  │  _____  │  _____  │  _____  │  _____  │
466  // └─────────┴─────────┴─────────┴─────────┴─────────┼─────────┼─────────┬─────┤     ├─────┬─────┼─────────┼─────────┴─────────┴─────────┴─────────┴─────────┘
467  //                                                   │  _____  │  _____  │ ___ │     │ ___ │_____│  _____  │
468  //                                                   └─────────┴─────────┴─────┘     └─────┴─────┴─────────┘
469  [NAVI] = LAYOUT(
470    XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,    XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,
471    VRSN,     _______,  KC_AT,    KC_LCBR,  KC_RCBR,  KC_PIPE,  _______,    _______,  KC_PSCR,  KC_HOME,  KC_UP,    KC_END,   KC_PGUP,  QK_BOOT,
472    _______,  _______,  KC_MPRV,  KC_MPLY,  KC_MNXT,  _______,  _______,    _______,  _______,  KC_LEFT,  KC_DOWN,  KC_RGHT,  KC_PGDN,  _______,
473    _______,  _______,  _______,  _______,  _______,  _______,                        KC_MUTE,  _______,  _______,  _______,  _______,  _______,
474    EE_CLR,   _______,  _______,  _______,  _______,            KC_VOLD,    KC_VOLU,            _______,  _______,  _______,  _______,  _______,
475                                            _______,  _______,  _______,    _______,  _______,  _______
476  ),
477  
478
479  // ┌─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┐             ┌─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┐
480  // │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │             │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │  BOOT   │
481  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤             ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
482  // │  _____  │  _____  │  _____  │  WHL U  │  _____  │  _____  │  _____  │             │  _____  │  _____  │  _____  │  MS UP  │  _____  │  _____  │  _____  │
483  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤             ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
484  // │  _____  │  _____  │  WHL L  │  WHL D  │  WHL R  │  _____  │  _____  │             │  _____  │  _____  │  MS LFT │  MS DN  │  MS RGT │  _____  │  _____  │
485  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┘             └─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
486  // │  _____  │  _____  │  _____  │  _____  │  _____  │  _____  │                                 │  _____  │  _____  │  _____  │  _____  │  _____  │  _____  │
487  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼───────────────┐     ┌───────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
488  // │ EE CLR  │  _____  │  _____  │  _____  │  _____  │         │    VOL DN     │     │   VOL UP  │         │  _____  │  _____  │  _____  │  _____  │  _____  │
489  // └─────────┴─────────┴─────────┴─────────┴─────────┼─────────┼─────────┬─────┤     ├─────┬─────┼─────────┼─────────┴─────────┴─────────┴─────────┴─────────┘
490  //                                                   │  BTN 1  │  BTN 3  │ ___ │     │ ___ │BTN 3│  BTN 2  │
491  //                                                   └─────────┴─────────┴─────┘     └─────┴─────┴─────────┘
492  [MOUS] = LAYOUT(
493    XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,    XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  QK_BOOT,
494    _______,  _______,  _______,  MS_WHLU,  _______,  _______,  _______,    _______,  _______,  _______,  MS_UP,    _______,  _______,  _______,
495    _______,  _______,  MS_WHLL,  MS_WHLD,  MS_WHLR,  _______,  _______,    _______,  _______,  MS_LEFT,  MS_DOWN,  MS_RGHT,  _______,  _______,
496    _______,  _______,  _______,  _______,  _______,  _______,                        _______,  _______,  _______,  _______,  _______,  _______,
497    EE_CLR,   _______,  _______,  _______,  _______,            KC_VOLD,    KC_VOLU,            MS_BTN3,  _______,  _______,  _______,  _______,
498                                            _______,  _______,  _______,    _______,  MS_BTN1,  MS_BTN2
499  ),
500
501  // ┌─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┐             ┌─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┐
502  // │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │             │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │ XXXXXXX │  BOOT   │
503  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤             ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
504  // │  _____  │  _____  │  _____  │  _____  │  _____  │  _____  │  _____  │             │  _____  │  _____  │  _____  │  MS UP  │  _____  │  _____  │  _____  │
505  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤             ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
506  // │  _____  │   GUI   │   ALT   │  SHIFT  │   CTL   │  HYPER  │  _____  │             │  _____  │  _____  │   CTL   │  SHIFT  │   ALT   │   GUI   │  _____  │
507  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┘             └─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
508  // │  _____  │  _____  │  _____  │  _____  │  _____  │  _____  │                                 │  _____  │  _____  │  _____  │  _____  │  _____  │  _____  │
509  // ├─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼───────────────┐     ┌───────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
510  // │ EE CLR  │  _____  │  _____  │  _____  │  _____  │         │    VOL DN     │     │   VOL UP  │         │  _____  │  _____  │  _____  │  _____  │  _____  │
511  // └─────────┴─────────┴─────────┴─────────┴─────────┼─────────┼─────────┬─────┤     ├─────┬─────┼─────────┼─────────┴─────────┴─────────┴─────────┴─────────┘
512  //                                                   │  BTN 1  │  BTN 3  │ ___ │     │ ___ │BTN 3│  BTN 2  │
513  //                                                   └─────────┴─────────┴─────┘     └─────┴─────┴─────────┘
514  [MODS] = LAYOUT(
515    XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,    XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  QK_BOOT,
516    _______,  _______,  _______,  _______,  _______,  _______,  _______,    _______,  _______,  _______,  MS_UP,    _______,  _______,  _______,
517    _______,  OS_LGUI,  OS_LALT,  OS_LSFT,  OS_LCTL,  OS_HYPR,  _______,    _______,  _______,  OS_LCTL,  OS_LSFT,  OS_LALT,  OS_LGUI,  _______,
518    _______,  _______,  _______,  _______,  _______,  _______,                        _______,  _______,  _______,  _______,  _______,  _______,
519    EE_CLR,   _______,  _______,  _______,  _______,            KC_VOLD,    KC_VOLU,            MS_BTN3,  _______,  _______,  _______,  _______,
520                                            _______,  _______,  _______,    _______,  MS_BTN1,  MS_BTN2
521  ),
522};
523
524bool process_record_user(uint16_t keycode, keyrecord_t *record) {
525  uint8_t current_layer = get_highest_layer(layer_state);
526  uint8_t mod_state = get_mods();
527
528  // Process numword before other logic
529  if (!process_num_word(keycode, record)) {
530    return false;
531  }
532
533  // Handle NUMWORD separately since it needs both press and release
534  if (keycode == NUMWORD) {
535    process_num_word_activation(NUMB, record);
536    return false;
537  }
538
539  if (record->event.pressed) {
540    switch (keycode) {
541    case VRSN:
542      SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
543      return false;
544    case SFTLLCK:
545      if (record->tap.count) {
546	if (record->event.pressed) {
547	  // Toggle the lock on the highest layer.
548	  layer_lock_invert(get_highest_layer(layer_state));
549	}
550	return false;
551      }
552      break;
553    case FR_DQUO:
554      if (record->event.pressed) {
555	// if layer is bepo, and shift is on, send ?
556	if (IS_LAYER_ON_STATE(current_layer, BEPO) && (get_mods() & MOD_MASK_SHIFT)) {
557	  del_mods(MOD_MASK_SHIFT);
558	  SEND_STRING(SS_TAP(X_1));
559	  set_mods(mod_state);
560	} else {
561	  SEND_STRING(FR_DQUO_M);
562	}
563      }
564      break;
565    case FR_QUOT:
566      // if layer is bepo, and shift is on, send ?
567      if (IS_LAYER_ON_STATE(current_layer, BEPO) && (get_mods() & MOD_MASK_SHIFT)) {
568	del_mods(MOD_MASK_SHIFT);
569	SEND_STRING(SS_LSFT(SS_TAP(X_SLASH)));
570	set_mods(mod_state);
571      } else {
572	SEND_STRING(FR_QUOT_M);
573      }
574      break;
575    case FR_GRAVE:
576      if (record->event.pressed) {
577	SEND_STRING(FR_GRAVE_M);
578      }
579      break;
580    case FR_CIRC:
581      if (record->event.pressed) {
582	SEND_STRING(FR_CIRC_M);
583      }
584      break;
585    case FR_TILD:
586      if (record->event.pressed) {
587	SEND_STRING(FR_TILD_M);
588      }
589      break;
590    case FR_E_AIGU:
591      if (record->event.pressed) {
592	if (get_mods() & MOD_MASK_SHIFT) {
593	  // É
594	  del_mods(MOD_MASK_SHIFT);
595	  SEND_STRING(FR_E_AIGU_CAPS_M);
596	  set_mods(mod_state);
597	} else {
598	  // é
599	  SEND_STRING(FR_E_AIGU_M);
600	}
601      }
602      break;
603    case FR_E_AIGU_CAPS:
604      if (record->event.pressed) {
605	SEND_STRING(FR_E_AIGU_CAPS_M);
606      }
607      break;
608    case FR_E_GRAVE:
609      if (record->event.pressed) {
610	if (get_mods() & MOD_MASK_SHIFT) {
611	  // 
612	  del_mods(MOD_MASK_SHIFT);
613	  SEND_STRING(FR_E_GRAVE_CAPS_M);
614	  set_mods(mod_state);
615	} else {
616	  // è
617	  SEND_STRING(FR_E_GRAVE_M); 
618	}
619      }
620      break;
621    case FR_E_GRAVE_CAPS:
622      if (record->event.pressed) {
623	SEND_STRING(FR_E_GRAVE_CAPS_M);
624      }
625      break;
626    case FR_A_GRAVE:
627      if (record->event.pressed) {
628	if (get_mods() & MOD_MASK_SHIFT) {
629	  del_mods(MOD_MASK_SHIFT);
630	  SEND_STRING(FR_A_GRAVE_CAPS_M);
631	  set_mods(mod_state);
632	} else {
633	  // à
634	  SEND_STRING(FR_A_GRAVE_M); 
635	}
636      }
637      break;
638    case FR_A_GRAVE_CAPS:
639      if (record->event.pressed) {
640	SEND_STRING(FR_A_GRAVE_CAPS_M);
641      }
642      break;
643    }
644  }
645  return true;
646}
647
648extern rgb_config_t rgb_matrix_config;
649
650// Line 2 home-row (7 12 17 22 [27] and [63] 58 53 48 43)
651void my_set_rgb_matrix_color_homerow(uint8_t red, uint8_t green, uint8_t blue) {
652  rgb_matrix_set_color(7, red, green, blue);
653  rgb_matrix_set_color(12, red, green, blue);
654  rgb_matrix_set_color(17, red, green, blue);
655  rgb_matrix_set_color(22, red, green, blue);
656    
657  rgb_matrix_set_color(58, red, green, blue);
658  rgb_matrix_set_color(53, red, green, blue);
659  rgb_matrix_set_color(48, red, green, blue);
660  rgb_matrix_set_color(43, red, green, blue);
661}
662
663void my_set_rgb_matrix_color_line(int line,  uint8_t red, uint8_t green, uint8_t blue) {
664  if (line == 0 || line == 1 || line == 2) {
665    // Left
666    rgb_matrix_set_color(line, red, green, blue);
667    rgb_matrix_set_color(line+5, red, green, blue);
668    rgb_matrix_set_color(line+10, red, green, blue);
669    rgb_matrix_set_color(line+15, red, green, blue);
670    rgb_matrix_set_color(line+20, red, green, blue);
671    rgb_matrix_set_color(line+25, red, green, blue);
672    /* rgb_matrix_set_color(line+29, red, green, blue); */
673    // Right
674    /* rgb_matrix_set_color(line+65, red, green, blue); */
675    rgb_matrix_set_color(line+61, red, green, blue);
676    rgb_matrix_set_color(line+56, red, green, blue);
677    rgb_matrix_set_color(line+51, red, green, blue);
678    rgb_matrix_set_color(line+46, red, green, blue);
679    rgb_matrix_set_color(line+41, red, green, blue);
680    rgb_matrix_set_color(line+36, red, green, blue);
681  } else if (line == 3) {
682    // Left
683    rgb_matrix_set_color(3, red, green, blue);
684    rgb_matrix_set_color(8, red, green, blue);
685    rgb_matrix_set_color(13, red, green, blue);
686    rgb_matrix_set_color(18, red, green, blue);
687    rgb_matrix_set_color(23, red, green, blue);
688    rgb_matrix_set_color(28, red, green, blue);
689    // Right
690    rgb_matrix_set_color(64, red, green, blue);
691    rgb_matrix_set_color(59, red, green, blue);
692    rgb_matrix_set_color(54, red, green, blue);
693    rgb_matrix_set_color(49, red, green, blue);
694    rgb_matrix_set_color(44, red, green, blue);
695    rgb_matrix_set_color(39, red, green, blue);
696  } else if (line == 4) {
697    // Left
698    /* rgb_matrix_set_color(4, red, green, blue); */
699    /* rgb_matrix_set_color(9, red, green, blue); */
700    /* rgb_matrix_set_color(14, red, green, blue); */
701    /* rgb_matrix_set_color(19, red, green, blue); */
702    rgb_matrix_set_color(24, red, green, blue);
703    rgb_matrix_set_color(32, red, green, blue);
704    rgb_matrix_set_color(33, red, green, blue);
705    /* rgb_matrix_set_color(34, red, green, blue); */
706    rgb_matrix_set_color(35, red, green, blue);
707    // Right
708    rgb_matrix_set_color(60, red, green, blue);
709    /* rgb_matrix_set_color(55, red, green, blue); */
710    /* rgb_matrix_set_color(50, red, green, blue); */
711    /* rgb_matrix_set_color(45, red, green, blue); */
712    /* rgb_matrix_set_color(40, red, green, blue); */
713    rgb_matrix_set_color(68, red, green, blue);
714    rgb_matrix_set_color(69, red, green, blue);
715    /* rgb_matrix_set_color(70, red, green, blue); */
716    rgb_matrix_set_color(71, red, green, blue);
717  }
718}
719
720// matrix, to set key with. maybe there is a better way but used ascii generator so i can easily set those visually
721//    ┌────┬────┬────┬────┬────┬────┬────┐             ┌────┬────┬────┬────┬────┬────┬────┐
722//    │ 0  │ 5  │ 10 │ 15 │ 20 │ 25 │ 29 │             │ 65 │ 61 │ 56 │ 51 │ 46 │ 41 │ 36 │
723//    ├────┼────┼────┼────┼────┼────┼────┤             ├────┼────┼────┼────┼────┼────┼────┤
724//    │ 1  │ 6  │ 11 │ 16 │ 21 │ 26 │ 30 │             │ 66 │ 62 │ 57 │ 52 │ 47 │ 42 │ 37 │
725//    ├────┼────┼────┼────┼────┼────┼────┤             ├────┼────┼────┼────┼────┼────┼────┤
726//    │ 2  │ 7  │ 12 │ 17 │[22]│ 27 │ 31 │             │ 67 │ 63 │[58]│ 53 │ 48 │ 43 │ 38 │
727//    ├────┼────┼────┼────┼────┼────┼────┘             └────┼────┼────┼────┼────┼────┼────┤
728//    │ 3  │ 8  │ 13 │ 18 │ 23 │ 28 │                       │ 64 │ 59 │ 54 │ 49 │ 44 │ 39 │
729//    ├────┼────┼────┼────┼────┼────┼─────────┐   ┌─────────┼────┼────┼────┼────┼────┼────┤
730//    │ 4  │ 9  │ 14 │ 19 │ 24 │    │   35    │   │   71    │    │ 60 │ 55 │ 50 │ 45 │ 40 │
731//    └────┴────┴────┴────┴────┼────┼────┬────┤   ├────┬────┼────┼────┴────┴────┴────┴────┘
732//                             │ 32 │ 33 │ 34 │   │ 70 │ 69 │ 68 │
733//                             └────┴────┴────┘   └────┴────┴────┘
734// Runs constantly in the background, in a loop.
735bool rgb_matrix_indicators_user(void) {
736  if (rgb_matrix_get_flags() & (LED_FLAG_KEYLIGHT | LED_FLAG_MODIFIER)) {
737    switch (get_highest_layer(layer_state)) {
738    case BEPO:
739      rgb_matrix_set_color_all(RGB_OFF);
740      // Line 1
741      my_set_rgb_matrix_color_line(1,213,144,0);
742      // Line 2
743      my_set_rgb_matrix_color_line(2,27,213,0);
744      my_set_rgb_matrix_color_homerow(206,255,206);
745      // Line 3
746      my_set_rgb_matrix_color_line(3,0,255,167);
747      // Line 4
748      my_set_rgb_matrix_color_line(4,0,113,255);
749      break;
750    case ERGL:
751      rgb_matrix_set_color_all(RGB_OFF);
752      // ERGOL layer
753      rgb_matrix_set_color(34, 0, 113, 255);
754      rgb_matrix_set_color(70, 0, 113, 255);
755      // Line 1
756      my_set_rgb_matrix_color_line(1,213,144,0);
757      // Line 2
758      my_set_rgb_matrix_color_line(2,27,213,0);
759      my_set_rgb_matrix_color_homerow(206,255,206);
760      // Line 3
761      my_set_rgb_matrix_color_line(3,0,255,167);
762      // Line 4
763      my_set_rgb_matrix_color_line(4,0,113,255);
764      break;
765    case QWER:
766      rgb_matrix_set_color_all(RGB_OFF);
767      // QWERTY layer
768      rgb_matrix_set_color(34, 27,213,0);
769      rgb_matrix_set_color(70, 27,213,0);
770      // Line 1
771      my_set_rgb_matrix_color_line(1,213,144,0);
772      // Line 2
773      my_set_rgb_matrix_color_line(2,27,213,0);
774      my_set_rgb_matrix_color_homerow(206,255,206);
775      // Line 3
776      my_set_rgb_matrix_color_line(3,0,255,167);
777      // Line 4
778      my_set_rgb_matrix_color_line(4,0,113,255);
779      break;
780    case NUMB:
781      rgb_matrix_set_color_all(RGB_OFF);
782      
783      rgb_matrix_set_color(0, RGB_RED);
784
785      rgb_matrix_set_color(6, 0, 55, 255); // FX
786      rgb_matrix_set_color(11, 0, 55, 255); // FX
787      rgb_matrix_set_color(16, 0, 55, 255); // FX
788      rgb_matrix_set_color(21, 0, 55, 255); // FX
789      rgb_matrix_set_color(26, 0, 55, 255); // FX
790      rgb_matrix_set_color(7, 0, 55, 255); // FX
791      rgb_matrix_set_color(12, 0, 55, 255); // FX
792      rgb_matrix_set_color(17, 0, 55, 255); // FX
793      rgb_matrix_set_color(22, 0, 55, 255); // FX
794      rgb_matrix_set_color(27, 0, 55, 255); // FX
795      rgb_matrix_set_color(8, 0, 55, 255); // FX
796      rgb_matrix_set_color(13, 0, 55, 255); // FX
797
798    
799      rgb_matrix_set_color(18, 0, 183, 255); // FX
800      rgb_matrix_set_color(23, 0, 183, 255); // FX
801      rgb_matrix_set_color(28, 0, 183, 255); // FX
802      
803      rgb_matrix_set_color(60, 255, 255, 255); // 0
804      rgb_matrix_set_color(47, 255, 199, 0);     // number
805      rgb_matrix_set_color(48, 255, 199, 0);     // number
806      rgb_matrix_set_color(49, 255, 199, 0);     // number
807      rgb_matrix_set_color(52, 255, 199, 0);     // number
808      rgb_matrix_set_color(53, 255, 199, 0);     // number
809      rgb_matrix_set_color(54, 255, 199, 0);     // number
810      rgb_matrix_set_color(57, 255, 199, 0);     // number
811      rgb_matrix_set_color(58, 255, 199, 0);     // number
812      rgb_matrix_set_color(59, 255, 199, 0);     // number
813
814      rgb_matrix_set_color(42, 183, 255, 0);     // calc
815      rgb_matrix_set_color(43, 183, 255, 0);     // calc
816      rgb_matrix_set_color(44, 183, 255, 0);     // calc
817      rgb_matrix_set_color(37, 183, 255, 0);     // calc
818      rgb_matrix_set_color(38, 183, 255, 0);     // calc
819      rgb_matrix_set_color(39, 183, 255, 0);     // calc
820      break;
821    case SYMB:
822      rgb_matrix_set_color_all(RGB_OFF);
823      // () {} [] <>
824      rgb_matrix_set_color(11, 27, 213, 0);
825      rgb_matrix_set_color(16, 27, 213, 0);
826      rgb_matrix_set_color(13, 27, 213, 0);
827      rgb_matrix_set_color(18, 27, 213, 0);
828      rgb_matrix_set_color(57, 27, 213, 0);
829      rgb_matrix_set_color(58, 27, 213, 0);
830      rgb_matrix_set_color(52, 27, 213, 0);
831      rgb_matrix_set_color(53, 27, 213, 0);
832
833      // +-=/*
834      rgb_matrix_set_color(23, 29, 204, 67);
835      rgb_matrix_set_color(12, 29, 204, 67);
836      rgb_matrix_set_color(17, 29, 204, 67);
837      rgb_matrix_set_color(22, 29, 204, 67);
838      rgb_matrix_set_color(21, 29, 204, 67);
839      rgb_matrix_set_color(1, 29, 204, 67); // anti-slash
840
841      // `!~|&%^#
842      rgb_matrix_set_color(6, 255, 199, 0);
843      rgb_matrix_set_color(7, 255, 199, 0);
844      rgb_matrix_set_color(8, 255, 199, 0);
845      rgb_matrix_set_color(26, 255, 199, 0);
846      rgb_matrix_set_color(27, 255, 199, 0);
847      rgb_matrix_set_color(28, 255, 199, 0);
848      rgb_matrix_set_color(62, 255, 199, 0);
849      rgb_matrix_set_color(42, 255, 199, 0);
850      rgb_matrix_set_color(63, 255, 199, 0);
851      
852      // "'
853      rgb_matrix_set_color(43, 204, 202, 29);
854      rgb_matrix_set_color(44, 204, 202, 29);
855
856      // :;,.
857      rgb_matrix_set_color(59, 29, 120, 204);
858      rgb_matrix_set_color(54, 29, 120, 204);
859      rgb_matrix_set_color(48, 29, 120, 204);
860      rgb_matrix_set_color(49, 29, 120, 204);
861
862      // @ $
863      rgb_matrix_set_color(47, 174, 29, 204);
864      rgb_matrix_set_color(64, 174, 29, 204);
865      
866      break;
867    case NAVI:
868      rgb_matrix_set_color_all(RGB_OFF);
869
870      rgb_matrix_set_color(1, RGB_RED);
871      rgb_matrix_set_color(37, RGB_RED);
872
873      // Arrows
874      rgb_matrix_set_color(52, 0, 113, 255);
875      rgb_matrix_set_color(53, 0, 113, 255);
876      rgb_matrix_set_color(58, 0, 113, 255);
877      rgb_matrix_set_color(48, 0, 113, 255);
878      // Home, End, PgUp, PgDown 
879      rgb_matrix_set_color(57, 13, 0, 255);
880      rgb_matrix_set_color(47, 13, 0, 255);
881      rgb_matrix_set_color(42, 13, 0, 255);
882      rgb_matrix_set_color(43, 13, 0, 255);
883
884      // Media
885      rgb_matrix_set_color(12, 27, 213, 0);
886      rgb_matrix_set_color(17, 27, 213, 0);
887      rgb_matrix_set_color(22, 27, 213, 0);
888
889      // Volume
890      rgb_matrix_set_color(35, 170, 0, 255);
891      rgb_matrix_set_color(71, 170, 0, 255);
892      rgb_matrix_set_color(64, 170, 0, 255);
893
894      // PrintScreen
895      rgb_matrix_set_color(62, 255, 255, 255);
896      break;
897    case MOUS:
898      rgb_matrix_set_color_all(RGB_OFF);
899      // mouse movements
900      rgb_matrix_set_color(52, 0, 113, 255);
901      rgb_matrix_set_color(53, 0, 113, 255);
902      rgb_matrix_set_color(58, 0, 113, 255);
903      rgb_matrix_set_color(48, 0, 113, 255);
904      // wheel (inverted-T: E=up, S=left, D=down, F=right)
905      rgb_matrix_set_color(16, 13, 0, 255);
906      rgb_matrix_set_color(12, 13, 0, 255);
907      rgb_matrix_set_color(17, 13, 0, 255);
908      rgb_matrix_set_color(22, 13, 0, 255);
909      // clicks: BTN1=69(shift), BTN2=68(sym/ent), BTN3=60(ralt)
910      rgb_matrix_set_color(69, 170, 0, 255);
911      rgb_matrix_set_color(68, 170, 0, 255);
912      rgb_matrix_set_color(60, 170, 0, 255);
913      break;
914    default:
915      rgb_matrix_set_color_all(RGB_OFF);
916      break;
917    }
918  }
919  return false;
920}
921
922void caps_word_set_user(bool active) {
923  if (active) {
924    rgb_matrix_set_color(40, 255, 255, 255);
925  } else {
926    rgb_matrix_set_color(40, RGB_OFF);
927  }
928}