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