~ruther/qmk_firmware

4be9919e9fd7c54c2e046b82e82f5fbc2fdd44e6 — Drashna Jael're 3 years ago a5155b9 + 94b5350
Merge remote-tracking branch 'origin/master' into develop
55 files changed, 1926 insertions(+), 172 deletions(-)

M .github/workflows/format.yaml
M .github/workflows/format_push.yaml
M keyboards/chalice/chalice.h
M keyboards/chalice/info.json
A keyboards/cutie_club/keebcats/dougal/config.h
A keyboards/cutie_club/keebcats/dougal/dougal.c
A keyboards/cutie_club/keebcats/dougal/dougal.h
A keyboards/cutie_club/keebcats/dougal/info.json
A keyboards/cutie_club/keebcats/dougal/keymaps/default/keymap.c
A keyboards/cutie_club/keebcats/dougal/keymaps/via/keymap.c
A keyboards/cutie_club/keebcats/dougal/keymaps/via/rules.mk
A keyboards/cutie_club/keebcats/dougal/readme.md
A keyboards/cutie_club/keebcats/dougal/rules.mk
A keyboards/ergodash/mini/keymaps/yoshimaru46/config.h
A keyboards/ergodash/mini/keymaps/yoshimaru46/keymap.c
A keyboards/ergodash/mini/keymaps/yoshimaru46/readme.md
A keyboards/ergodash/mini/keymaps/yoshimaru46/rules.mk
M keyboards/ffkeebs/puca/info.json
M keyboards/ffkeebs/puca/keymaps/default/keymap.c
A keyboards/ffkeebs/puca/keymaps/default_numpad/keymap.c
A keyboards/ffkeebs/puca/keymaps/default_ortho/keymap.c
M keyboards/ffkeebs/puca/puca.c
M keyboards/ffkeebs/puca/puca.h
M keyboards/ffkeebs/puca/readme.md
M keyboards/ffkeebs/puca/rules.mk
M keyboards/handwired/split89/info.json
M keyboards/handwired/split89/keymaps/default/keymap.c
M keyboards/handwired/split89/split89.h
A keyboards/mechanickeys/miniashen40/config.h
A keyboards/mechanickeys/miniashen40/info.json
A keyboards/mechanickeys/miniashen40/keymaps/default/keymap.c
A keyboards/mechanickeys/miniashen40/keymaps/via/keymap.c
A keyboards/mechanickeys/miniashen40/keymaps/via/rules.mk
A keyboards/mechanickeys/miniashen40/miniashen40.c
A keyboards/mechanickeys/miniashen40/miniashen40.h
A keyboards/mechanickeys/miniashen40/readme.md
A keyboards/mechanickeys/miniashen40/rules.mk
A keyboards/mtbkeys/mtb60/hotswap/config.h
A keyboards/mtbkeys/mtb60/hotswap/hotswap.c
A keyboards/mtbkeys/mtb60/hotswap/hotswap.h
A keyboards/mtbkeys/mtb60/hotswap/info.json
A keyboards/mtbkeys/mtb60/hotswap/keymaps/default/keymap.c
A keyboards/mtbkeys/mtb60/hotswap/readme.md
A keyboards/mtbkeys/mtb60/hotswap/rules.mk
A keyboards/mtbkeys/mtb60/solder/config.h
A keyboards/mtbkeys/mtb60/solder/info.json
A keyboards/mtbkeys/mtb60/solder/keymaps/default/keymap.c
A keyboards/mtbkeys/mtb60/solder/readme.md
A keyboards/mtbkeys/mtb60/solder/rules.mk
A keyboards/mtbkeys/mtb60/solder/solder.c
A keyboards/mtbkeys/mtb60/solder/solder.h
M lib/python/qmk/cli/format/python.py
M lib/python/qmk/cli/list/keymaps.py
M lib/python/qmk/cli/list/layouts.py
M lib/python/qmk/tests/test_cli_commands.py
M .github/workflows/format.yaml => .github/workflows/format.yaml +1 -1
@@ 37,7 37,7 @@ jobs:
      shell: 'bash {0}'
      run: |
        qmk format-c --core-only $(< ~/files.txt)
        qmk format-python
        qmk format-python $(< ~/files.txt)
        qmk format-text $(< ~/files.txt)
        git diff


M .github/workflows/format_push.yaml => .github/workflows/format_push.yaml +1 -1
@@ 25,7 25,7 @@ jobs:
      shell: 'bash {0}'
      run: |
        qmk format-c -a
        qmk format-python
        qmk format-python -a
        qmk format-text -a
        git diff


M keyboards/chalice/chalice.h => keyboards/chalice/chalice.h +31 -31
@@ 17,44 17,44 @@

#pragma once

#define ____ KC_NO
#define ___ KC_NO

#include "quantum.h"

#define LAYOUT_default( \
	  K000,  K001,  K002,  K003,  K004,  K005,  K006,  K007,  K008,  K009,  K010,  K011,  K012,  K013,  K014,        \
	  K100,  K101,  K102,  K103,  K104,  K105,  K106,  K107,  K108,  K109,  K110,  K111,  K112,  K113,  K114, 		 \
	  K200,  K201,  K202,  K203,  K204,  K205,  K206,  K207,  K208,  K209,  K210,  K211,  K212,  K213,               \
	         K301,  K302,  K303,  K304,  K305,  K306,  K307,  K308,  K309,  K310,  K311,  K312,  K313,  K214,        \
	         K401,  K402,         K404,         K406,         K408,         K410,  K411,         K412,  K413,  K314  \
      K00, K10, K01, K11, K02, K12, K03, K13, K04, K14, K05, K15, K06, K16, K46,      \
      K20, K30, K21, K31, K22, K32, K23, K33, K24, K34, K25, K35, K26, K36, K56,      \
      K40, K50, K41, K51, K42, K52, K43, K53, K44, K54, K45, K55, K66, K76,           \
           K60, K70, K61, K71, K62, K72, K63, K73, K64, K74, K65, K75, K86, K96,      \
           K80, K91,      K82,      K92,      K83,      K93, K84,      K94, K85, K95  \
) { \
	{ K000,  K002,  K004,  K006,  K008,  K010,  K012 }, \
	{ K001,  K003,  K005,  K007,  K009,  K011,  K013 }, \
	{ K100,  K102,  K104,  K106,  K108,  K110,  K112 }, \
	{ K101,  K103,  K105,  K107,  K109,  K111,  K113 }, \
	{ K200,  K202,  K204,  K206,  K208,  K210,  K014 }, \
	{ K201,  K203,  K205,  K207,  K209,  K211,  K114 }, \
	{ K301,  K303,  K305,  K307,  K309,  K311,  K212 }, \
	{ K302,  K304,  K306,  K308,  K310,  K312,  K213 }, \
	{ K401,  ____,  K404,  K408,  K411,  K413,  K313 }, \
	{ ____,  K402,  K406,  K410,  K412,  K314,  K214 }  \
    { K00, K01, K02, K03, K04, K05, K06 }, \
    { K10, K11, K12, K13, K14, K15, K16 }, \
    { K20, K21, K22, K23, K24, K25, K26 }, \
    { K30, K31, K32, K33, K34, K35, K36 }, \
    { K40, K41, K42, K43, K44, K45, K46 }, \
    { K50, K51, K52, K53, K54, K55, K56 }, \
    { K60, K61, K62, K63, K64, K65, K66 }, \
    { K70, K71, K72, K73, K74, K75, K76 }, \
    { K80, ___, K82, K83, K84, K85, K86 }, \
    { ___, K91, K92, K93, K94, K95, K96 }  \
}

#define LAYOUT_split_bs( \
	  K000,  K001,  K002,  K003,  K004,  K005,  K006,  K007,  K008,  K009,  K010,  K011,  K012,  K013,  K014,  K403, \
	  K100,  K101,  K102,  K103,  K104,  K105,  K106,  K107,  K108,  K109,  K110,  K111,  K112,  K113,  K114, 		 \
	  K200,  K201,  K202,  K203,  K204,  K205,  K206,  K207,  K208,  K209,  K210,  K211,  K212,  K213,               \
	         K301,  K302,  K303,  K304,  K305,  K306,  K307,  K308,  K309,  K310,  K311,  K312,  K313,  K214,        \
	         K401,  K402,         K404,         K406,         K408,         K410,  K411,         K412,  K413,  K314  \
      K00, K10, K01, K11, K02, K12, K03, K13, K04, K14, K05, K15, K06, K16, K46, K81, \
      K20, K30, K21, K31, K22, K32, K23, K33, K24, K34, K25, K35, K26, K36, K56,      \
      K40, K50, K41, K51, K42, K52, K43, K53, K44, K54, K45, K55, K66, K76,           \
           K60, K70, K61, K71, K62, K72, K63, K73, K64, K74, K65, K75, K86, K96,      \
           K80, K91,      K82,      K92,      K83,      K93, K84,      K94, K85, K95  \
) { \
	{ K000,  K002,  K004,  K006,  K008,  K010,  K012 }, \
	{ K001,  K003,  K005,  K007,  K009,  K011,  K013 }, \
	{ K100,  K102,  K104,  K106,  K108,  K110,  K112 }, \
	{ K101,  K103,  K105,  K107,  K109,  K111,  K113 }, \
	{ K200,  K202,  K204,  K206,  K208,  K210,  K014 }, \
	{ K201,  K203,  K205,  K207,  K209,  K211,  K114 }, \
	{ K301,  K303,  K305,  K307,  K309,  K311,  K212 }, \
	{ K302,  K304,  K306,  K308,  K310,  K312,  K213 }, \
	{ K401,  K403,  K404,  K408,  K411,  K413,  K313 }, \
	{ ____,  K402,  K406,  K410,  K412,  K314,  K214 }  \
    { K00, K01, K02, K03, K04, K05, K06 }, \
    { K10, K11, K12, K13, K14, K15, K16 }, \
    { K20, K21, K22, K23, K24, K25, K26 }, \
    { K30, K31, K32, K33, K34, K35, K36 }, \
    { K40, K41, K42, K43, K44, K45, K46 }, \
    { K50, K51, K52, K53, K54, K55, K56 }, \
    { K60, K61, K62, K63, K64, K65, K66 }, \
    { K70, K71, K72, K73, K74, K75, K76 }, \
    { K80, K81, K82, K83, K84, K85, K86 }, \
    { ___, K91, K92, K93, K94, K95, K96 }  \
}

M keyboards/chalice/info.json => keyboards/chalice/info.json +110 -29
@@ 1,25 1,27 @@
{
    "keyboard_name": "Chalice",
    "url": "https://customkbd.com/products/chalice-pre-order",
    "maintainer": "CustomKBD",
    "maintainer": "joshajohnson, CustomKBD",
    "layouts": {
        "LAYOUT_default": {
            "layout": [
                {"label":"Esc", "x":0, "y":0},
                {"label":"~", "x":1.5, "y":0},
                {"label":"!", "x":2.5, "y":0},
                {"label":"@", "x":3.5, "y":0},
                {"label":"#", "x":4.5, "y":0},
                {"label":"$", "x":5.5, "y":0},
                {"label":"%", "x":6.5, "y":0},
                {"label":"^", "x":7.5, "y":0},
                {"label":"&", "x":10.5, "y":0},
                {"label":"*", "x":11.5, "y":0},
                {"label":"(", "x":12.5, "y":0},
                {"label":")", "x":13.5, "y":0},
                {"label":"_", "x":14.5, "y":0},
                {"label":"+", "x":15.5, "y":0},
                {"label":"`~", "x":1.5, "y":0},
                {"label":"1!", "x":2.5, "y":0},
                {"label":"2@", "x":3.5, "y":0},
                {"label":"3#", "x":4.5, "y":0},
                {"label":"4$", "x":5.5, "y":0},
                {"label":"5%", "x":6.5, "y":0},
                {"label":"6^", "x":7.5, "y":0},
                {"label":"7&", "x":10.5, "y":0},
                {"label":"8*", "x":11.5, "y":0},
                {"label":"9(", "x":12.5, "y":0},
                {"label":"0)", "x":13.5, "y":0},
                {"label":"-_", "x":14.5, "y":0},
                {"label":"=+", "x":15.5, "y":0},
                {"label":"Backspace", "x":16.5, "y":0, "w":2},

                {"label":"Insert", "x":0, "y":1},
                {"label":"Tab", "x":1.5, "y":1, "w":1.5},
                {"label":"Q", "x":3, "y":1},
                {"label":"W", "x":4, "y":1},


@@ 31,10 33,10 @@
                {"label":"I", "x":12, "y":1},
                {"label":"O", "x":13, "y":1},
                {"label":"P", "x":14, "y":1},
                {"label":"{", "x":15, "y":1},
                {"label":"}", "x":16, "y":1},
                {"label":"|", "x":17, "y":1, "w":1.5},
                {"label":"Mute", "x":19, "y":0.5},
                {"label":"[{", "x":15, "y":1},
                {"label":"]}", "x":16, "y":1},
                {"label":"\\|", "x":17, "y":1, "w":1.5},

                {"label":"Delete", "x":0, "y":2},
                {"label":"Caps Lock", "x":1.5, "y":2, "w":1.75},
                {"label":"A", "x":3.25, "y":2},


@@ 46,9 48,10 @@
                {"label":"J", "x":11.25, "y":2},
                {"label":"K", "x":12.25, "y":2},
                {"label":"L", "x":13.25, "y":2},
                {"label":":", "x":14.25, "y":2},
                {"label":"\"", "x":15.25, "y":2},
                {"label":";:", "x":14.25, "y":2},
                {"label":"'\"", "x":15.25, "y":2},
                {"label":"Enter", "x":16.25, "y":2, "w":2.25},

                {"label":"Shift", "x":1.5, "y":3, "w":2.25},
                {"label":"Z", "x":3.75, "y":3},
                {"label":"X", "x":4.75, "y":3},


@@ 58,21 61,99 @@
                {"label":"B", "x":9.75, "y":3},
                {"label":"N", "x":10.75, "y":3},
                {"label":"M", "x":11.75, "y":3},
                {"label":"<", "x":12.75, "y":3},
                {"label":">", "x":13.75, "y":3},
                {"label":"?", "x":14.75, "y":3},
                {"label":",<", "x":12.75, "y":3},
                {"label":".>", "x":13.75, "y":3},
                {"label":"/?", "x":14.75, "y":3},
                {"label":"Shift", "x":15.75, "y":3, "w":1.75},
                {"label":"Up", "x":17.75, "y":3.25},
                {"label":"Up", "x":17.5, "y":3},

                {"label":"Ctrl", "x":1.5, "y":4, "w":1.5},
                {"label":"Alt", "x":4.5, "y":4, "w":1.5},
                {"label":"Space", "x":6, "y":4, "w":2},
                {"label":"Fn", "x":8, "y":4},
                {"label":"Space", "x":6, "y":4, "w":2.25},
                {"label":"Fn", "x":8.25, "y":4},
                {"label":"Space", "x":9.75, "y":4, "w":2.75},
                {"label":"Alt", "x":12.5, "y":4, "w":1.5},
                {"label":"Ctrl", "x":15, "y":4, "w":1.5},
                {"label":"Left", "x":16.75, "y":4.25},
                {"label":"Down", "x":17.75, "y":4.25},
                {"label":"Right", "x":18.75, "y":4.25}
                {"label":"Left", "x":16.5, "y":4},
                {"label":"Down", "x":17.5, "y":4},
                {"label":"Right", "x":18.5, "y":4}
            ]
        },
        "LAYOUT_split_bs": {
            "layout": [
                {"label":"Esc", "x":0, "y":0},
                {"label":"`~", "x":1.5, "y":0},
                {"label":"1!", "x":2.5, "y":0},
                {"label":"2@", "x":3.5, "y":0},
                {"label":"3#", "x":4.5, "y":0},
                {"label":"4$", "x":5.5, "y":0},
                {"label":"5%", "x":6.5, "y":0},
                {"label":"6^", "x":7.5, "y":0},
                {"label":"7&", "x":10.5, "y":0},
                {"label":"8*", "x":11.5, "y":0},
                {"label":"9(", "x":12.5, "y":0},
                {"label":"0)", "x":13.5, "y":0},
                {"label":"-_", "x":14.5, "y":0},
                {"label":"=+", "x":15.5, "y":0},
                {"label":"Backspace", "x":16.5, "y":0},
                {"label":"Backspace", "x":17.5, "y":0},

                {"label":"Insert", "x":0, "y":1},
                {"label":"Tab", "x":1.5, "y":1, "w":1.5},
                {"label":"Q", "x":3, "y":1},
                {"label":"W", "x":4, "y":1},
                {"label":"E", "x":5, "y":1},
                {"label":"R", "x":6, "y":1},
                {"label":"T", "x":7, "y":1},
                {"label":"Y", "x":10, "y":1},
                {"label":"U", "x":11, "y":1},
                {"label":"I", "x":12, "y":1},
                {"label":"O", "x":13, "y":1},
                {"label":"P", "x":14, "y":1},
                {"label":"[{", "x":15, "y":1},
                {"label":"]}", "x":16, "y":1},
                {"label":"\\|", "x":17, "y":1, "w":1.5},

                {"label":"Delete", "x":0, "y":2},
                {"label":"Caps Lock", "x":1.5, "y":2, "w":1.75},
                {"label":"A", "x":3.25, "y":2},
                {"label":"S", "x":4.25, "y":2},
                {"label":"D", "x":5.25, "y":2},
                {"label":"F", "x":6.25, "y":2},
                {"label":"G", "x":7.25, "y":2},
                {"label":"H", "x":10.25, "y":2},
                {"label":"J", "x":11.25, "y":2},
                {"label":"K", "x":12.25, "y":2},
                {"label":"L", "x":13.25, "y":2},
                {"label":";:", "x":14.25, "y":2},
                {"label":"'\"", "x":15.25, "y":2},
                {"label":"Enter", "x":16.25, "y":2, "w":2.25},

                {"label":"Shift", "x":1.5, "y":3, "w":2.25},
                {"label":"Z", "x":3.75, "y":3},
                {"label":"X", "x":4.75, "y":3},
                {"label":"C", "x":5.75, "y":3},
                {"label":"V", "x":6.75, "y":3},
                {"label":"B", "x":7.75, "y":3},
                {"label":"B", "x":9.75, "y":3},
                {"label":"N", "x":10.75, "y":3},
                {"label":"M", "x":11.75, "y":3},
                {"label":",<", "x":12.75, "y":3},
                {"label":".>", "x":13.75, "y":3},
                {"label":"/?", "x":14.75, "y":3},
                {"label":"Shift", "x":15.75, "y":3, "w":1.75},
                {"label":"Up", "x":17.5, "y":3},

                {"label":"Ctrl", "x":1.5, "y":4, "w":1.5},
                {"label":"Alt", "x":4.5, "y":4, "w":1.5},
                {"label":"Space", "x":6, "y":4, "w":2.25},
                {"label":"Fn", "x":8.25, "y":4},
                {"label":"Space", "x":9.75, "y":4, "w":2.75},
                {"label":"Alt", "x":12.5, "y":4, "w":1.5},
                {"label":"Ctrl", "x":15, "y":4, "w":1.5},
                {"label":"Left", "x":16.5, "y":4},
                {"label":"Down", "x":17.5, "y":4},
                {"label":"Right", "x":18.5, "y":4}
            ]
        }
    }

A keyboards/cutie_club/keebcats/dougal/config.h => keyboards/cutie_club/keebcats/dougal/config.h +50 -0
@@ 0,0 1,50 @@
/* Copyright 2021 Cutie Club
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#pragma once

#include "config_common.h"

/* USB Device descriptor parameter */
#define VENDOR_ID 0xFB9C
#define PRODUCT_ID 0xB265
#define DEVICE_VER 0x0000
#define MANUFACTURER Cutie Club
#define PRODUCT Keebcats Dougal 65%

/* key matrix size */
#define MATRIX_ROWS 5
#define MATRIX_COLS 16

/*
 * Keyboard Matrix Assignments
 */
#define MATRIX_ROW_PINS { B2, D0, F5, F4, F1 }
#define MATRIX_COL_PINS { E6, F6, F7, C7, C6, B6, B5, B4, D7, D6, D4, D5, D3, D2, D1, B7 }
#define UNUSED_PINS { B0, B1, B3 }

/* COL2ROW, ROW2COL*/
#define DIODE_DIRECTION COL2ROW

/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
#define DEBOUNCE 5

#define LED_CAPS_LOCK_PIN F0

/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE
/* Locking resynchronize hack */
#define LOCKING_RESYNC_ENABLE

A keyboards/cutie_club/keebcats/dougal/dougal.c => keyboards/cutie_club/keebcats/dougal/dougal.c +17 -0
@@ 0,0 1,17 @@
/* Copyright 2021 Cutie Club
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#include "dougal.h"

A keyboards/cutie_club/keebcats/dougal/dougal.h => keyboards/cutie_club/keebcats/dougal/dougal.h +34 -0
@@ 0,0 1,34 @@
/* Copyright 2021 Cutie Club
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#pragma once

#include "quantum.h"

#define LAYOUT_all( \
    k00_00, k00_01, k00_02, k00_03, k00_04, k00_05, k00_06, k00_07, k00_08, k00_09, k00_10, k00_11, k00_12, k00_13, k00_14, k00_15, \
    k01_00, k01_01, k01_02, k01_03, k01_04, k01_05, k01_06, k01_07, k01_08, k01_09, k01_10, k01_11, k01_12, k01_13,         k01_15, \
    k02_00, k02_01, k02_02, k02_03, k02_04, k02_05, k02_06, k02_07, k02_08, k02_09, k02_10, k02_11, k02_12, k02_13,         k02_15, \
    k03_00, k03_01, k03_02, k03_03, k03_04, k03_05, k03_06, k03_07, k03_08, k03_09, k03_10, k03_11, k03_12,         k03_13, k03_15, \
    k04_00, k04_01, k04_02,         k04_04,         k04_06,         k04_08, k04_09, k04_10, k04_11,         k04_12, k04_13, k04_15  \
) \
{ \
    { k00_00, k00_01, k00_02, k00_03, k00_04, k00_05, k00_06, k00_07, k00_08, k00_09, k00_10, k00_11, k00_12, k00_13, k00_14, k00_15 }, \
    { k01_00, k01_01, k01_02, k01_03, k01_04, k01_05, k01_06, k01_07, k01_08, k01_09, k01_10, k01_11, k01_12, k01_13, KC_NO,  k01_15 }, \
    { k02_00, k02_01, k02_02, k02_03, k02_04, k02_05, k02_06, k02_07, k02_08, k02_09, k02_10, k02_11, k02_12, k02_13, KC_NO,  k02_15 }, \
    { k03_00, k03_01, k03_02, k03_03, k03_04, k03_05, k03_06, k03_07, k03_08, k03_09, k03_10, k03_11, k03_12, k03_13, KC_NO,  k03_15 }, \
    { k04_00, k04_01, k04_02, KC_NO,  k04_04, KC_NO,  k04_06, KC_NO,  k04_08, k04_09, k04_10, k04_11, k04_12, k04_13, KC_NO,  k04_15 }  \
}

A keyboards/cutie_club/keebcats/dougal/info.json => keyboards/cutie_club/keebcats/dougal/info.json +84 -0
@@ 0,0 1,84 @@
{
    "keyboard_name": "Keebcats Dougal",
    "url": "",
    "maintainer": "Cutie Club",
    "layouts": {
        "LAYOUT_all": {
            "layout": [
                { "x": 0, "y": 0 },
                { "x": 1, "y": 0 },
                { "x": 2, "y": 0 },
                { "x": 3, "y": 0 },
                { "x": 4, "y": 0 },
                { "x": 5, "y": 0 },
                { "x": 6, "y": 0 },
                { "x": 7, "y": 0 },
                { "x": 8, "y": 0 },
                { "x": 9, "y": 0 },
                { "x": 10, "y": 0 },
                { "x": 11, "y": 0 },
                { "x": 12, "y": 0 },
                { "x": 13, "y": 0 },
                { "x": 14, "y": 0 },
                { "x": 15, "y": 0 },
                { "x": 0, "y": 1, "w": 1.5 },
                { "x": 1.5, "y": 1 },
                { "x": 2.5, "y": 1 },
                { "x": 3.5, "y": 1 },
                { "x": 4.5, "y": 1 },
                { "x": 5.5, "y": 1 },
                { "x": 6.5, "y": 1 },
                { "x": 7.5, "y": 1 },
                { "x": 8.5, "y": 1 },
                { "x": 9.5, "y": 1 },
                { "x": 10.5, "y": 1 },
                { "x": 11.5, "y": 1 },
                { "x": 12.5, "y": 1 },
                { "x": 13.5, "y": 1, "w": 1.5 },
                { "x": 15, "y": 1 },
                { "x": 0, "y": 2, "w": 1.75 },
                { "x": 1.75, "y": 2 },
                { "x": 2.75, "y": 2 },
                { "x": 3.75, "y": 2 },
                { "x": 4.75, "y": 2 },
                { "x": 5.75, "y": 2 },
                { "x": 6.75, "y": 2 },
                { "x": 7.75, "y": 2 },
                { "x": 8.75, "y": 2 },
                { "x": 9.75, "y": 2 },
                { "x": 10.75, "y": 2 },
                { "x": 11.75, "y": 2 },
                { "x": 12.75, "y": 2 },
                { "x": 14, "y": 2 },
                { "x": 15, "y": 2 },
                { "x": 0, "y": 3, "w": 1.25 },
                { "x": 1.25, "y": 3 },
                { "x": 2.25, "y": 3 },
                { "x": 3.25, "y": 3 },
                { "x": 4.25, "y": 3 },
                { "x": 5.25, "y": 3 },
                { "x": 6.25, "y": 3 },
                { "x": 7.25, "y": 3 },
                { "x": 8.25, "y": 3 },
                { "x": 9.25, "y": 3 },
                { "x": 10.25, "y": 3 },
                { "x": 11.25, "y": 3 },
                { "x": 12.25, "y": 3, "w": 1.75 },
                { "x": 14, "y": 3 },
                { "x": 15, "y": 3 },
                { "x": 0, "y": 4, "w": 1.25 },
                { "x": 1.25, "y": 4, "w": 1.25 },
                { "x": 2.5, "y": 4, "w": 1.25 },
                { "x": 3.75, "y": 4, "w": 2.25 },
                { "x": 6, "y": 4, "w": 1.25 },
                { "x": 7.25, "y": 4, "w": 2.75 },
                { "x": 10, "y": 4 },
                { "x": 11, "y": 4 },
                { "x": 12, "y": 4 },
                { "x": 13, "y": 4 },
                { "x": 14, "y": 4 },
                { "x": 15, "y": 4 }
            ]
        }
    }
}

A keyboards/cutie_club/keebcats/dougal/keymaps/default/keymap.c => keyboards/cutie_club/keebcats/dougal/keymaps/default/keymap.c +28 -0
@@ 0,0 1,28 @@
/* Copyright 2021 Cutie Club
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#include QMK_KEYBOARD_H

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    /* Base */
    [0] = LAYOUT_all(
        KC_ESC,     KC_1,     KC_2,     KC_3,     KC_4,     KC_5,     KC_6,     KC_7,     KC_8,     KC_9,     KC_0,     KC_MINS,      KC_EQL,     KC_BSPC, KC_BSPC, KC_DEL,
        KC_TAB,     KC_Q,     KC_W,     KC_E,     KC_R,     KC_T,     KC_Y,     KC_U,     KC_I,     KC_O,     KC_P,     KC_LBRC,      KC_RBRC,    KC_BSLS,          KC_HOME,
        KC_CAPS,    KC_A,     KC_S,     KC_D,     KC_F,     KC_G,     KC_H,     KC_J,     KC_K,     KC_L,     KC_SCLN,  KC_QUOT,      KC_NUHS,    KC_ENT,           KC_PGUP,
        KC_LSFT,    KC_NUBS,  KC_Z,     KC_X,     KC_C,     KC_V,     KC_B,     KC_N,     KC_M,     KC_COMM,  KC_DOT,   KC_SLSH,      KC_RSFT,             KC_UP,   KC_PGDN,
        KC_LCTL,    KC_LGUI,  KC_LALT,            KC_SPC,             KC_SPC,             KC_SPC,             KC_RALT,  KC_RGUI,      KC_RCTRL,   KC_LEFT, KC_DOWN, KC_RIGHT
    )
};

A keyboards/cutie_club/keebcats/dougal/keymaps/via/keymap.c => keyboards/cutie_club/keebcats/dougal/keymaps/via/keymap.c +49 -0
@@ 0,0 1,49 @@
/* Copyright 2021 Cutie Club
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#include QMK_KEYBOARD_H

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    /* Base */
    [0] = LAYOUT_all(
        KC_ESC,     KC_1,     KC_2,     KC_3,     KC_4,     KC_5,     KC_6,     KC_7,     KC_8,     KC_9,     KC_0,     KC_MINS,      KC_EQL,     KC_BSPC, KC_BSPC, KC_DEL,
        KC_TAB,     KC_Q,     KC_W,     KC_E,     KC_R,     KC_T,     KC_Y,     KC_U,     KC_I,     KC_O,     KC_P,     KC_LBRC,      KC_RBRC,    KC_BSLS,          KC_HOME,
        KC_CAPS,    KC_A,     KC_S,     KC_D,     KC_F,     KC_G,     KC_H,     KC_J,     KC_K,     KC_L,     KC_SCLN,  KC_QUOT,      KC_NUHS,    KC_ENT,           KC_PGUP,
        KC_LSFT,    KC_NUBS,  KC_Z,     KC_X,     KC_C,     KC_V,     KC_B,     KC_N,     KC_M,     KC_COMM,  KC_DOT,   KC_SLSH,      KC_RSFT,             KC_UP,   KC_PGDN,
        KC_LCTL,    KC_LGUI,  KC_LALT,            KC_SPC,             KC_SPC,             KC_SPC,             KC_RALT,  KC_RGUI,      KC_RCTRL,   KC_LEFT, KC_DOWN, KC_RIGHT
    ),
    [1] = LAYOUT_all(
        KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,      KC_TRNS,    KC_TRNS, KC_TRNS, KC_TRNS,
        KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,      KC_TRNS,    KC_TRNS,          KC_TRNS,
        KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,      KC_TRNS,    KC_TRNS,          KC_TRNS,
        KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,      KC_TRNS,             KC_TRNS, KC_TRNS,
        KC_TRNS,     KC_TRNS,     KC_TRNS,                  KC_TRNS,                  KC_TRNS,                  KC_TRNS,                  KC_TRNS,     KC_TRNS,      KC_TRNS,    KC_TRNS, KC_TRNS, KC_TRNS
    ),
    [2] = LAYOUT_all(
        KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,      KC_TRNS,    KC_TRNS, KC_TRNS, KC_TRNS,
        KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,      KC_TRNS,    KC_TRNS,          KC_TRNS,
        KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,      KC_TRNS,    KC_TRNS,          KC_TRNS,
        KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,      KC_TRNS,             KC_TRNS, KC_TRNS,
        KC_TRNS,     KC_TRNS,     KC_TRNS,                  KC_TRNS,                  KC_TRNS,                  KC_TRNS,                  KC_TRNS,     KC_TRNS,      KC_TRNS,    KC_TRNS, KC_TRNS, KC_TRNS
    ),
    [3] = LAYOUT_all(
        KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,      KC_TRNS,    KC_TRNS, KC_TRNS, KC_TRNS,
        KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,      KC_TRNS,    KC_TRNS,          KC_TRNS,
        KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,      KC_TRNS,    KC_TRNS,          KC_TRNS,
        KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,     KC_TRNS,      KC_TRNS,             KC_TRNS, KC_TRNS,
        KC_TRNS,     KC_TRNS,     KC_TRNS,                  KC_TRNS,                  KC_TRNS,                  KC_TRNS,                  KC_TRNS,     KC_TRNS,      KC_TRNS,    KC_TRNS, KC_TRNS, KC_TRNS
    )
};

A keyboards/cutie_club/keebcats/dougal/keymaps/via/rules.mk => keyboards/cutie_club/keebcats/dougal/keymaps/via/rules.mk +1 -0
@@ 0,0 1,1 @@
VIA_ENABLE = yes

A keyboards/cutie_club/keebcats/dougal/readme.md => keyboards/cutie_club/keebcats/dougal/readme.md +18 -0
@@ 0,0 1,18 @@
# Dougal

* Keyboard Maintainer: [Cutie Club](https://github.com/cutie-club/)
* Hardware Supported: Atmega32u4 based 65% PCB, with wide compatibility
* Hardware Availability: [Keebcats](https://keebcats.co.uk)

## Bootloader

Enter the bootloader in 2 ways with the default configuration:

* **Bootmagic reset**: Hold down the key at top left key (matrix position 0,0) and plug the device in
* **Physical reset button**: Press the button marked reset on the back of the PCB

Make example for this keyboard (after setting up your build environment):

    make cutie_club/keebcats/dougal:default

See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).

A keyboards/cutie_club/keebcats/dougal/rules.mk => keyboards/cutie_club/keebcats/dougal/rules.mk +21 -0
@@ 0,0 1,21 @@
# MCU name
MCU = atmega32u4

# Bootloader selection
BOOTLOADER = atmel-dfu

# Build Options
#   change yes to no to disable
#
BOOTMAGIC_ENABLE = yes      # Enable Bootmagic
MOUSEKEY_ENABLE = yes       # Mouse keys
EXTRAKEY_ENABLE = yes       # Audio control and System control
CONSOLE_ENABLE = no         # Console for debug
COMMAND_ENABLE = no         # Commands for debug and configuration
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
SLEEP_LED_ENABLE = no       # Breathing sleep LED during USB suspend
# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
NKRO_ENABLE = no            # USB Nkey Rollover
BACKLIGHT_ENABLE = no       # Enable keyboard backlight functionality
RGBLIGHT_ENABLE = no        # Enable keyboard RGB underglow
AUDIO_ENABLE = no           # Audio output

A keyboards/ergodash/mini/keymaps/yoshimaru46/config.h => keyboards/ergodash/mini/keymaps/yoshimaru46/config.h +33 -0
@@ 0,0 1,33 @@
/*
This is the c configuration file for the keymap

Copyright 2012 Jun Wako <wakojun@gmail.com>
Copyright 2015 Jack Humbert

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#pragma once


/* Use I2C or Serial, not both */

#define USE_SERIAL
// #define USE_I2C

/* Select hand configuration */

#define MASTER_LEFT
// #define MASTER_RIGHT
// #define EE_HANDS

A keyboards/ergodash/mini/keymaps/yoshimaru46/keymap.c => keyboards/ergodash/mini/keymaps/yoshimaru46/keymap.c +111 -0
@@ 0,0 1,111 @@
/* Copyright 2021 Yoshihiro Saito
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>
 */

#include QMK_KEYBOARD_H

enum layers {
    _QWERTY,
    _LOWER,
    _RAISE,
    _ADJUST,
};

enum custom_keycodes {
    QWERTY = SAFE_RANGE,
    LOWER,
    RAISE,
    ADJUST,
};

// Shift + ( = <
const key_override_t left_paren_angle_bracket_override = ko_make_basic(MOD_MASK_SHIFT, KC_LEFT_PAREN, KC_LEFT_ANGLE_BRACKET);

// Shift + ) = >
const key_override_t right_paren_angle_bracket_override = ko_make_basic(MOD_MASK_SHIFT, KC_RIGHT_PAREN, KC_RIGHT_ANGLE_BRACKET);

const key_override_t **key_overrides = (const key_override_t *[]){
	&left_paren_angle_bracket_override,
	&right_paren_angle_bracket_override,
	NULL
};

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  /* Qwerty */
    [_QWERTY] = LAYOUT(
    KC_GESC, KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_LPRN,                           KC_RPRN, KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_BSPC,
    KC_TAB,  KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_LBRC,                           KC_RBRC, KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_DEL,
    KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    XXXXXXX,                           XXXXXXX, KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_QUOT,
    XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,          KC_LGUI, LOWER,   CTL_T(KC_SPC), KC_SFTENT, RAISE,   KC_RGUI,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
  ),

  /* Lower */
  [_LOWER] = LAYOUT(
    XXXXXXX, KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC, KC_F11,                            KC_GRV,  KC_CIRC, KC_AMPR, KC_ASTR, XXXXXXX, XXXXXXX, XXXXXXX,
    XXXXXXX, KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F12,                            KC_TILD, KC_BSLS, KC_MINS, KC_EQL,  XXXXXXX, XXXXXXX, XXXXXXX,
    XXXXXXX, KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  XXXXXXX,                           XXXXXXX, KC_PIPE, KC_UNDS, KC_PLUS, XXXXXXX, XXXXXXX, XXXXXXX,
    XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,          _______, XXXXXXX, _______,       _______,   XXXXXXX, _______,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
  ),

  /* Raise */
  [_RAISE] = LAYOUT(
    XXXXXXX, KC_P1,   KC_P2,   KC_P3,   KC_P4,   KC_P5,   XXXXXXX,                           XXXXXXX, KC_P6,   KC_P7,   KC_P8,   KC_P9,   KC_P0,   XXXXXXX,
    XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,                           XXXXXXX, KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT, XXXXXXX, XXXXXXX,
    XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,                           XXXXXXX, KC_MPRV, KC_VOLD, KC_VOLU, KC_MNXT, XXXXXXX, XXXXXXX,
    XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,          _______, XXXXXXX, _______,       _______,   XXXXXXX, _______,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
  ),

  /* Adjust */
  [_ADJUST] = LAYOUT(
    XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX ,XXXXXXX,                           XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
    XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX ,XXXXXXX,                           XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
    XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX ,XXXXXXX,                           XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
    XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,          _______ ,_______, _______,       _______,   XXXXXXX, _______,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
  ),
};

bool process_record_user(uint16_t keycode, keyrecord_t *record) {
    switch (keycode) {
        case LOWER:
            if (record->event.pressed) {
                layer_on(_LOWER);
                update_tri_layer(_LOWER, _RAISE, _ADJUST);
            } else {
                layer_off(_LOWER);
                update_tri_layer(_LOWER, _RAISE, _ADJUST);
            }
            return false;
            break;
        case RAISE:
            if (record->event.pressed) {
                layer_on(_RAISE);
                update_tri_layer(_LOWER, _RAISE, _ADJUST);
            } else {
                layer_off(_RAISE);
                update_tri_layer(_LOWER, _RAISE, _ADJUST);
            }
            return false;
            break;
        case ADJUST:
            if (record->event.pressed) {
                layer_on(_ADJUST);
            } else {
                layer_off(_ADJUST);
            }
            return false;
            break;
    }
    return true;
}

A keyboards/ergodash/mini/keymaps/yoshimaru46/readme.md => keyboards/ergodash/mini/keymaps/yoshimaru46/readme.md +4 -0
@@ 0,0 1,4 @@
# yoshimaru46's keymap for Ergodash mini

This is the yoshimaru46's keymap configuration for Ergodash mini.
There are three layers, QWERTY(default), LOWER, and RAISE.

A keyboards/ergodash/mini/keymaps/yoshimaru46/rules.mk => keyboards/ergodash/mini/keymaps/yoshimaru46/rules.mk +4 -0
@@ 0,0 1,4 @@
BACKLIGHT_ENABLE = no
RGBLIGHT_ENABLE = no
AUDIO_ENABLE = no
KEY_OVERRIDE_ENABLE = yes

M keyboards/ffkeebs/puca/info.json => keyboards/ffkeebs/puca/info.json +79 -9
@@ 2,35 2,105 @@
    "keyboard_name": "Puca",
    "url": "https://ffkeebs.com/collections/puca/",
    "maintainer": "Sleepdealr",
    "layout_aliases": {
        "LAYOUT": "LAYOUT_all"
    },
    "layouts": {
        "LAYOUT": {
        "LAYOUT_all": {
            "layout": [
                { "label": "Rotary", "x": 0.5, "y": 0 },
                { "label": "Pg Up", "x": 2, "y": 0 },
                { "label": "Pg Dn", "x": 3, "y": 0 },

                { "label": "Layer Toggle", "x": 0, "y": 1.25 },
                { "label": "/", "x": 1, "y": 1.25 },
                { "label": "*", "x": 2, "y": 1.25 },
                { "label": "-", "x": 3, "y": 1.25 },

                { "label": "7", "x": 0, "y": 2.25 },
                { "label": "8", "x": 1, "y": 2.25 },
                { "label": "9", "x": 2, "y": 2.25 },
                { "label": "+", "x": 3, "y": 2.25, "h": 2 },
                { "label": "+", "x": 4, "y": 2.25 },
                { "label": "+", "x": 3, "y": 2.25 },
                { "label": "+", "x": 4, "y": 2.25, "h": 2 },

                { "label": "4", "x": 0, "y": 3.25 },
                { "label": "5", "x": 1, "y": 3.25 },
                { "label": "6", "x": 2, "y": 3.25 },
                { "label": "|", "x": 3, "y": 3.25 },

                { "label": "1", "x": 0, "y": 4.25 },
                { "label": "2", "x": 1, "y": 4.25 },
                { "label": "3", "x": 2, "y": 4.25 },
                { "label": "Enter", "x": 3, "y": 4.25 },
                { "label": "Enter", "x": 4, "y": 4.25, "h": 2 },

                { "label": "0", "x": 0, "y": 5.25 },
                { "label": "00", "x": 1, "y": 5.25 },
                { "label": ".", "x": 2, "y": 5.25 },
                { "label": ".", "x": 3, "y": 5.25 },

                { "label": "0", "x": 0, "y": 6.25, "w": 2 }
            ]
        },
        "LAYOUT_numpad": {
            "layout": [
                { "label": "Rotary", "x": 0.5, "y": 0 },
                { "label": "Pg Up", "x": 2, "y": 0 },
                { "label": "Pg Dn", "x": 3, "y": 0 },

                { "label": "Layer Toggle", "x": 0, "y": 1.25 },
                { "label": "/", "x": 1, "y": 1.25 },
                { "label": "*", "x": 2, "y": 1.25 },
                { "label": "-", "x": 3, "y": 1.25 },

                { "label": "7", "x": 0, "y": 2.25 },
                { "label": "8", "x": 1, "y": 2.25 },
                { "label": "9", "x": 2, "y": 2.25 },

                { "label": "4", "x": 0, "y": 3.25 },
                { "label": "5", "x": 1, "y": 3.25 },
                { "label": "6", "x": 2, "y": 3.25 },
                { "label": "|", "x": 4, "y": 3.25 },
                { "label": "+", "x": 3, "y": 2.25, "h": 2 },

                { "label": "1", "x": 0, "y": 4.25 },
                { "label": "2", "x": 1, "y": 4.25 },
                { "label": "3", "x": 2, "y": 4.25 },
                { "label": "Enter", "x": 3, "y": 4.25, "h": 2 },
                { "label": "Enter", "x": 4, "y": 4.25 },

                { "label": "0", "x": 0, "y": 5.25, "w": 2 },
                { "label": ".", "x": 2, "y": 5.25 },
                { "label": ".", "x": 4, "y": 5.25 },
                { "label": "0", "x": 0, "y": 6.25 },
                { "label": "00", "x": 1, "y": 6.25 }
                { "label": "Enter", "x": 3, "y": 4.25, "h": 2 }
            ]
        },
        "LAYOUT_ortho": {
            "layout": [
                { "label": "Rotary", "x": 0.5, "y": 0 },
                { "label": "Pg Up", "x": 2, "y": 0 },
                { "label": "Pg Dn", "x": 3, "y": 0 },

                { "label": "Layer Toggle", "x": 0, "y": 1.25 },
                { "label": "/", "x": 1, "y": 1.25 },
                { "label": "*", "x": 2, "y": 1.25 },
                { "label": "-", "x": 3, "y": 1.25 },

                { "label": "7", "x": 0, "y": 2.25 },
                { "label": "8", "x": 1, "y": 2.25 },
                { "label": "9", "x": 2, "y": 2.25 },
                { "label": "+", "x": 3, "y": 2.25 },

                { "label": "4", "x": 0, "y": 3.25 },
                { "label": "5", "x": 1, "y": 3.25 },
                { "label": "6", "x": 2, "y": 3.25 },
                { "label": "|", "x": 3, "y": 3.25 },

                { "label": "1", "x": 0, "y": 4.25 },
                { "label": "2", "x": 1, "y": 4.25 },
                { "label": "3", "x": 2, "y": 4.25 },
                { "label": "Enter", "x": 3, "y": 4.25 },

                { "label": "0", "x": 0, "y": 5.25 },
                { "label": "00", "x": 1, "y": 5.25 },
                { "label": ".", "x": 2, "y": 5.25 },
                { "label": "Enter", "x": 3, "y": 5.25 }
            ]
        }
    }

M keyboards/ffkeebs/puca/keymaps/default/keymap.c => keyboards/ffkeebs/puca/keymaps/default/keymap.c +20 -32
@@ 1,4 1,4 @@
/* Copyright 2021 Sleepdealer
/* Copyright 2021 Sleepdealer, James Young for QMK (@noroadsleft)
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by


@@ 15,38 15,26 @@
 */
#include QMK_KEYBOARD_H

// 00 Functionality
enum custom_keycodes {
    MC_00 = SAFE_RANGE,
};

bool process_record_user(uint16_t keycode, keyrecord_t *record) {
    switch (keycode) {
        case MC_00:
            if (record->event.pressed) {
                SEND_STRING("00");
            }
            break;
    }
    return true;
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {

    [0] = LAYOUT_all(
        KC_MUTE,          KC_PGUP, KC_PGDN,
        TG(1),   KC_PSLS, KC_PAST, KC_PMNS,
        KC_P7,   KC_P8,   KC_P9,   KC_PPLS,  KC_PPLS,
        KC_P4,   KC_P5,   KC_P6,   KC_PIPE,
        KC_P1,   KC_P2,   KC_P3,   KC_ENTER, KC_ENTER,
        KC_P0,   MC_00,   KC_PDOT, KC_PDOT,
        KC_P0
    ),

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    LAYOUT(
        KC_MUTE,         KC_PGUP, KC_PGDN,
		TG(1),  KC_PSLS, KC_PAST, KC_PMNS,
		KC_P7,  KC_P8,   KC_P9,   KC_PPLS,  KC_PPLS,
		KC_P4,  KC_P5,   KC_P6,   KC_PIPE,
		KC_P1,  KC_P2,   KC_P3,   KC_ENTER, KC_ENTER,
		KC_P0,  MC_00,   KC_PDOT, KC_PDOT,   
                KC_P0),
    LAYOUT(
    [1] = LAYOUT_all(
        KC_TRNS,          RGB_HUI, RGB_VAI,
		TG(1),   RGB_TOG, RGB_HUD, RGB_VAD,
		KC_PGUP, KC_UP,   KC_PGDN, RGB_MOD,  RGB_MOD,
		KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS,
		KC_INS,  KC_HOME, KC_END,  RGB_RMOD, RGB_RMOD,
		KC_ESC,  KC_TRNS, KC_DEL,  KC_TRNS, 
        KC_ESC)
        TG(1),   RGB_TOG, RGB_HUD, RGB_VAD,
        KC_PGUP, KC_UP,   KC_PGDN, RGB_MOD,  RGB_MOD,
        KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS,
        KC_INS,  KC_HOME, KC_END,  RGB_RMOD, RGB_RMOD,
        KC_ESC,  KC_TRNS, KC_DEL,  KC_TRNS,
        KC_ESC
    ),

};

A keyboards/ffkeebs/puca/keymaps/default_numpad/keymap.c => keyboards/ffkeebs/puca/keymaps/default_numpad/keymap.c +38 -0
@@ 0,0 1,38 @@
/* Copyright 2021 Sleepdealer, James Young for QMK (@noroadsleft)
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
#include QMK_KEYBOARD_H

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {

    [0] = LAYOUT_numpad(
        KC_MUTE,          KC_PGUP, KC_PGDN,
        TG(1),   KC_PSLS, KC_PAST, KC_PMNS,
        KC_P7,   KC_P8,   KC_P9,
        KC_P4,   KC_P5,   KC_P6,   KC_PPLS,
        KC_P1,   KC_P2,   KC_P3,
        KC_P0,            KC_PDOT, KC_ENTER
    ),

    [1] = LAYOUT_numpad(
        _______,          RGB_HUI, RGB_VAI,
        TG(1),   RGB_TOG, RGB_HUD, RGB_VAD,
        KC_PGUP, KC_UP,   KC_PGDN,
        KC_LEFT, KC_DOWN, KC_RGHT, RGB_MOD,
        KC_INS,  KC_HOME, KC_END,
        KC_ESC,           KC_DEL,  RGB_RMOD
    ),

};

A keyboards/ffkeebs/puca/keymaps/default_ortho/keymap.c => keyboards/ffkeebs/puca/keymaps/default_ortho/keymap.c +38 -0
@@ 0,0 1,38 @@
/* Copyright 2021 Sleepdealer, James Young for QMK (@noroadsleft)
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
#include QMK_KEYBOARD_H

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {

    [0] = LAYOUT_ortho(
        KC_MUTE,          KC_PGUP, KC_PGDN,
        TG(1),   KC_PSLS, KC_PAST, KC_PMNS,
        KC_P7,   KC_P8,   KC_P9,   KC_PPLS,
        KC_P4,   KC_P5,   KC_P6,   KC_PIPE,
        KC_P1,   KC_P2,   KC_P3,   KC_ENTER,
        KC_P0,   MC_00,   KC_PDOT, KC_ENTER
    ),

    [1] = LAYOUT_ortho(
        _______,          RGB_HUI, RGB_VAI,
        TG(1),   RGB_TOG, RGB_HUD, RGB_VAD,
        KC_PGUP, KC_UP,   KC_PGDN, RGB_MOD,
        KC_LEFT, KC_DOWN, KC_RGHT, XXXXXXX,
        KC_INS,  KC_HOME, KC_END,  RGB_RMOD,
        KC_ESC,  XXXXXXX, KC_DEL,  XXXXXXX
    )

};

M keyboards/ffkeebs/puca/puca.c => keyboards/ffkeebs/puca/puca.c +14 -0
@@ 15,6 15,20 @@
 */
#include "puca.h"

bool process_record_kb(uint16_t keycode, keyrecord_t* record) {
    if (!process_record_user(keycode, record)) {
        return false;
    }
    switch (keycode) {
        case MC_00:
            if (record->event.pressed) {
                SEND_STRING("00");
            }
            break;
    }
    return true;
}

bool encoder_update_kb(uint8_t index, bool clockwise) {
    if (!encoder_update_user(index, clockwise)) { return false; }
    if (clockwise) {

M keyboards/ffkeebs/puca/puca.h => keyboards/ffkeebs/puca/puca.h +78 -18
@@ 16,26 16,86 @@

#pragma once

// K24 is 2U Plus
// K44 is 2u Enter
// K54 is 2u 0
#include "quantum.h"

/* Keycodes defined here can be used by any keymap. If you wish to
 * define additional keycodes for your personal keymap only, assign
 * your first custom keycode to `= NEW_SAFE_RANGE`.
 *
 * See `process_record_kb()` in `puca.c`.
 */
enum keyboard_keycodes {
    MC_00 = SAFE_RANGE,
    NEW_SAFE_RANGE,
};

#define XXX KC_NO

#include "quantum.h"
/*
 *   ┌───┐ ┌───┬───┐
 *   │00 │ │02 │03 │
 *   └───┘ └───┴───┘
 * ┌───┬───┬───┬───┐
 * │10 │11 │12 │13 │
 * ├───┼───┼───┼───┤   ┌───┐
 * │20 │21 │22 │23 │   │   │
 * ├───┼───┼───┼───┤   │24 │ 2u Plus
 * │30 │31 │32 │33 │   │   │
 * ├───┼───┼───┼───┤   ├───┤
 * │40 │41 │42 │43 │   │   │
 * ├───┼───┼───┼───┤   │44 │ 2u Enter
 * │50 │51 │52 │53 │   │   │
 * └───┴───┴───┴───┘   └───┘
 * ┌───────┐
 * │54     │ 2u 0
 * └───────┘
 */

#define LAYOUT_all( \
      K00,    K02, K03,      \
    K10, K11, K12, K13,      \
    K20, K21, K22, K23,  K24,\
    K30, K31, K32, K33,      \
    K40, K41, K42, K43,  K44,\
    K50, K51, K52, K53,      \
      K54                    \
) { \
    { K00, XXX, K02, K03, XXX }, \
    { K10, K11, K12, K13, XXX }, \
    { K20, K21, K22, K23, K24 }, \
    { K30, K31, K32, K33, XXX }, \
    { K40, K41, K42, K43, K44 }, \
    { K50, K51, K52, K53, K54 }, \
}

#define LAYOUT_numpad( \
      K00,    K02, K03, \
    K10, K11, K12, K13, \
    K20, K21, K22,      \
    K30, K31, K32, K24, \
    K40, K41, K42,      \
      K54,    K52, K44  \
) { \
    { K00, XXX, K02, K03, XXX }, \
    { K10, K11, K12, K13, XXX }, \
    { K20, K21, K22, XXX, K24 }, \
    { K30, K31, K32, XXX, XXX }, \
    { K40, K41, K42, XXX, K44 }, \
    { XXX, XXX, K52, XXX, K54 }, \
}

#define LAYOUT( \
        K00,          K02,   K03,       \
        K10,   K11,   K12,   K13,       \
        K20,   K21,   K22,   K23,   K24,\
        K30,   K31,   K32,   K33,       \
        K40,   K41,   K42,   K43,   K44,\
        K50,   K51,   K52,   K53,       \
        K54                             \
#define LAYOUT_ortho( \
      K00,    K02, K03, \
    K10, K11, K12, K13, \
    K20, K21, K22, K23, \
    K30, K31, K32, K33, \
    K40, K41, K42, K43, \
    K50, K51, K52, K53  \
) { \
      { K00,   KC_NO, K02,   K03,   KC_NO },    \
      { K10,   K11,   K12,   K13,   KC_NO },    \
      { K20,   K21,   K22,   K23,   K24   },    \
      { K30,   K31,   K32,   K33,   KC_NO },    \
      { K40,   K41,   K42,   K43,   K44   },    \
      { K50,   K51,   K52,   K53,   K54   },    \
    { K00, XXX, K02, K03, XXX }, \
    { K10, K11, K12, K13, XXX }, \
    { K20, K21, K22, K23, XXX }, \
    { K30, K31, K32, K33, XXX }, \
    { K40, K41, K42, K43, XXX }, \
    { K50, K51, K52, K53, XXX }, \
}

M keyboards/ffkeebs/puca/readme.md => keyboards/ffkeebs/puca/readme.md +1 -1
@@ 2,7 2,7 @@

* Keyboard Maintainer: [Sleepdealer](https://github.com/Sleepdealr)
* Hardware Supported: Puca Pad
* Hardware Availability: Puca GB
* Hardware Availability: [Puca GB](https://ffkeebs.com/collections/puca)

## Bootloader


M keyboards/ffkeebs/puca/rules.mk => keyboards/ffkeebs/puca/rules.mk +3 -3
@@ 19,7 19,7 @@ NKRO_ENABLE = no            # USB Nkey Rollover
BACKLIGHT_ENABLE = no       # Enable keyboard backlight functionality
RGBLIGHT_ENABLE = yes       # Enable keyboard RGB underglow

ENCODER_ENABLE = yes 		#Rotary encoder
ENCODER_ENABLE = yes        # Enable rotary encoder support
OLED_ENABLE = yes           # Enable OLED support

OLED_ENABLE = yes	#OLED
LTO_ENABLE = yes			# Enable Link Time Optimization to reduce firmware size
LTO_ENABLE = yes            # Enable Link Time Optimization to reduce firmware size

M keyboards/handwired/split89/info.json => keyboards/handwired/split89/info.json +96 -1
@@ 4,7 4,102 @@
    "url": "https://github.com/jurassic73/split89",
    "layouts": {
        "LAYOUT": {
            "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"F1", "x":2, "y":0}, {"label":"F2", "x":3, "y":0}, {"label":"F3", "x":4, "y":0}, {"label":"F4", "x":5, "y":0}, {"label":"F5", "x":6, "y":0}, {"label":"F6", "x":10.25, "y":0}, {"label":"F7", "x":11.25, "y":0}, {"label":"F8", "x":12.25, "y":0}, {"label":"F9", "x":13.75, "y":0}, {"label":"F10", "x":14.75, "y":0}, {"label":"F11", "x":15.75, "y":0}, {"label":"F12", "x":16.75, "y":0}, {"label":"PrtSc", "x":18, "y":0}, {"label":"Scroll Lock", "x":19, "y":0}, {"label":"Pause", "x":20, "y":0}, {"label":"~", "x":0, "y":1.5}, {"label":"!", "x":1, "y":1.5}, {"label":"@", "x":2, "y":1.5}, {"label":"#", "x":3, "y":1.5}, {"label":"$", "x":4, "y":1.5}, {"label":"%", "x":5, "y":1.5}, {"label":"^", "x":6, "y":1.5}, {"label":"&", "x":9.75, "y":1.5}, {"label":"*", "x":10.75, "y":1.5}, {"label":"(", "x":11.75, "y":1.5}, {"label":")", "x":12.75, "y":1.5}, {"label":"_", "x":13.75, "y":1.5}, {"label":"+", "x":14.75, "y":1.5}, {"label":"Backspace", "x":15.75, "y":1.5, "w":2}, {"label":"Insert", "x":18, "y":1.5}, {"label":"Home", "x":19, "y":1.5}, {"label":"PgUp", "x":20, "y":1.5}, {"label":"Tab", "x":0, "y":2.5, "w":1.5}, {"label":"Q", "x":1.5, "y":2.5}, {"label":"W", "x":2.5, "y":2.5}, {"label":"E", "x":3.5, "y":2.5}, {"label":"R", "x":4.5, "y":2.5}, {"label":"T", "x":5.5, "y":2.5}, {"label":"Y", "x":9.25, "y":2.5}, {"label":"U", "x":10.25, "y":2.5}, {"label":"I", "x":11.25, "y":2.5}, {"label":"O", "x":12.25, "y":2.5}, {"label":"P", "x":13.25, "y":2.5}, {"label":"{", "x":14.25, "y":2.5}, {"label":"}", "x":15.25, "y":2.5}, {"label":"|", "x":16.25, "y":2.5, "w":1.5}, {"label":"Delete", "x":18, "y":2.5}, {"label":"End", "x":19, "y":2.5}, {"label":"PgDn", "x":20, "y":2.5}, {"label":"Caps Lock", "x":0, "y":3.5, "w":1.75}, {"label":"A", "x":1.75, "y":3.5}, {"label":"S", "x":2.75, "y":3.5}, {"label":"D", "x":3.75, "y":3.5}, {"label":"F", "x":4.75, "y":3.5}, {"label":"G", "x":5.75, "y":3.5}, {"label":"H", "x":9.5, "y":3.5}, {"label":"J", "x":10.5, "y":3.5}, {"label":"K", "x":11.5, "y":3.5}, {"label":"L", "x":12.5, "y":3.5}, {"label":":", "x":13.5, "y":3.5}, {"label":"\"", "x":14.5, "y":3.5}, {"label":"Enter", "x":15.5, "y":3.5, "w":2.25}, {"label":"Shift", "x":0, "y":4.5, "w":2.25}, {"label":"Z", "x":2.25, "y":4.5}, {"label":"X", "x":3.25, "y":4.5}, {"label":"C", "x":4.25, "y":4.5}, {"label":"V", "x":5.25, "y":4.5}, {"label":"B", "x":6.25, "y":4.5}, {"label":"N", "x":10, "y":4.5}, {"label":"M", "x":11, "y":4.5}, {"label":"<", "x":12, "y":4.5}, {"label":">", "x":13, "y":4.5}, {"label":"?", "x":14, "y":4.5}, {"label":"Shift", "x":15, "y":4.5, "w":2.75}, {"label":"\u2191", "x":19, "y":4.5}, {"label":"Ctrl", "x":0, "y":5.5, "w":1.25}, {"label":"Fn", "x":1.25, "y":5.5, "w":1.25}, {"label":"Win", "x":2.5, "y":5.5, "w":1.25}, {"label":"Alt", "x":3.75, "y":5.5, "w":1.25}, {"x":5, "y":5.5, "w":2.25}, {"x":10, "y":5.5, "w":2.75}, {"label":"Alt", "x":12.75, "y":5.5, "w":1.25}, {"label":"Win", "x":14, "y":5.5, "w":1.25}, {"label":"Menu", "x":15.25, "y":5.5, "w":1.25}, {"label":"Ctrl", "x":16.5, "y":5.5, "w":1.25}, {"label":"\u2190", "x":18, "y":5.5}, {"label":"\u2193", "x":19, "y":5.5}, {"label":"\u2192", "x":20, "y":5.5}]
            "layout": [
                {"label":"Esc", "x":0, "y":0},
                {"label":"F1", "x":2, "y":0},
                {"label":"F2", "x":3, "y":0},
                {"label":"F3", "x":4, "y":0},
                {"label":"F4", "x":5, "y":0},
                {"label":"F5", "x":6, "y":0},
                {"label":"F6", "x":8.5, "y":0},
                {"label":"F7", "x":9.5, "y":0},
                {"label":"F8", "x":10.5, "y":0},
                {"label":"F9", "x":12.0, "y":0},
                {"label":"F10", "x":13.0, "y":0},
                {"label":"F11", "x":14.0, "y":0},
                {"label":"F12", "x":15.0, "y":0},
                {"label":"PrtSc", "x":16.25, "y":0},
                {"label":"Scroll Lock", "x":17.25, "y":0},
                {"label":"Pause", "x":18.25, "y":0},

                {"label":"`~", "x":0, "y":1.25},
                {"label":"1!", "x":1, "y":1.25},
                {"label":"2@", "x":2, "y":1.25},
                {"label":"3#", "x":3, "y":1.25},
                {"label":"4$", "x":4, "y":1.25},
                {"label":"5%", "x":5, "y":1.25},
                {"label":"6^", "x":6, "y":1.25},
                {"label":"7&", "x":8.0, "y":1.25},
                {"label":"8*", "x":9.0, "y":1.25},
                {"label":"9(", "x":10.0, "y":1.25},
                {"label":"0)", "x":11.0, "y":1.25},
                {"label":"-_", "x":12.0, "y":1.25},
                {"label":"=+", "x":13.0, "y":1.25},
                {"label":"Backspace", "x":14.0, "y":1.25, "w":2},
                {"label":"Insert", "x":16.25, "y":1.25},
                {"label":"Home", "x":17.25, "y":1.25},
                {"label":"PgUp", "x":18.25, "y":1.25},

                {"label":"Tab", "x":0, "y":2.25, "w":1.5},
                {"label":"Q", "x":1.5, "y":2.25},
                {"label":"W", "x":2.5, "y":2.25},
                {"label":"E", "x":3.5, "y":2.25},
                {"label":"R", "x":4.5, "y":2.25},
                {"label":"T", "x":5.5, "y":2.25},
                {"label":"Y", "x":7.5, "y":2.25},
                {"label":"U", "x":8.5, "y":2.25},
                {"label":"I", "x":9.5, "y":2.25},
                {"label":"O", "x":10.5, "y":2.25},
                {"label":"P", "x":11.5, "y":2.25},
                {"label":"[{", "x":12.5, "y":2.25},
                {"label":"]}", "x":13.5, "y":2.25},
                {"label":"\\|", "x":14.5, "y":2.25, "w":1.5},
                {"label":"Delete", "x":16.25, "y":2.25},
                {"label":"End", "x":17.25, "y":2.25},
                {"label":"PgDn", "x":18.25, "y":2.25},

                {"label":"Caps Lock", "x":0, "y":3.25, "w":1.75},
                {"label":"A", "x":1.75, "y":3.25},
                {"label":"S", "x":2.75, "y":3.25},
                {"label":"D", "x":3.75, "y":3.25},
                {"label":"F", "x":4.75, "y":3.25},
                {"label":"G", "x":5.75, "y":3.25},
                {"label":"H", "x":7.75, "y":3.25},
                {"label":"J", "x":8.75, "y":3.25},
                {"label":"K", "x":9.75, "y":3.25},
                {"label":"L", "x":10.75, "y":3.25},
                {"label":";:", "x":11.75, "y":3.25},
                {"label":"'\"", "x":12.75, "y":3.25},
                {"label":"Enter", "x":13.75, "y":3.25, "w":2.25},

                {"label":"Shift", "x":0, "y":4.25, "w":2.25},
                {"label":"Z", "x":2.25, "y":4.25},
                {"label":"X", "x":3.25, "y":4.25},
                {"label":"C", "x":4.25, "y":4.25},
                {"label":"V", "x":5.25, "y":4.25},
                {"label":"B", "x":6.25, "y":4.25},
                {"label":"N", "x":8.25, "y":4.25},
                {"label":"M", "x":9.25, "y":4.25},
                {"label":",<", "x":10.25, "y":4.25},
                {"label":".>", "x":11.25, "y":4.25},
                {"label":"/?", "x":12.25, "y":4.25},
                {"label":"Shift", "x":13.25, "y":4.25, "w":2.75},
                {"label":"\u2191", "x":17.25, "y":4.25},

                {"label":"Ctrl", "x":0, "y":5.25, "w":1.25},
                {"label":"Fn", "x":1.25, "y":5.25, "w":1.25},
                {"label":"Win", "x":2.5, "y":5.25, "w":1.25},
                {"label":"Alt", "x":3.75, "y":5.25, "w":1.25},
                {"label":"Space", "x":5, "y":5.25, "w":2.25},
                {"label":"Space", "x":8.25, "y":5.25, "w":2.75},
                {"label":"Alt", "x":11.0, "y":5.25, "w":1.25},
                {"label":"Win", "x":12.25, "y":5.25, "w":1.25},
                {"label":"Menu", "x":13.5, "y":5.25, "w":1.25},
                {"label":"Ctrl", "x":14.75, "y":5.25, "w":1.25},
                {"label":"\u2190", "x":16.25, "y":5.25},
                {"label":"\u2193", "x":17.25, "y":5.25},
                {"label":"\u2192", "x":18.25, "y":5.25}
            ]
        }
    }
}

M keyboards/handwired/split89/keymaps/default/keymap.c => keyboards/handwired/split89/keymaps/default/keymap.c +14 -14
@@ 23,20 23,20 @@ enum layer_names {
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    /* Base */
    [0] = LAYOUT(
        KC_ESC,  KC_F1,  KC_F2,        KC_F3,  KC_F4,  KC_F5,     KC_F6,  KC_F7,  KC_F8,  KC_F9,   KC_F10, KC_F11,     KC_F12,    KC_PSCR, KC_SLCK, KC_PAUS,
        KC_GRV,KC_1,    KC_2,   KC_3,         KC_4,   KC_5,   KC_6,      KC_7,   KC_8,   KC_9,   KC_0,    KC_MINS, KC_EQL,    KC_BSPC,   KC_INS,  KC_HOME, KC_PGUP,
        KC_TAB,KC_Q,   KC_W,         KC_E,   KC_R,   KC_T,      KC_U,   KC_I,   KC_O,   KC_P,    KC_LBRC, KC_RBRC,   KC_BSLS,   KC_DEL,  KC_END,  KC_PGDN,
        KC_CAPS,  KC_A,   KC_S,         KC_D,   KC_F,   KC_G,      KC_Y,   KC_J,   KC_K,   KC_L,    KC_SCLN,KC_QUOT,    KC_ENT,
        KC_LSFT, KC_Z,   KC_X,         KC_C,   KC_V,   KC_B,      KC_H,   KC_M,   KC_COMM,KC_DOT,  KC_SLSH, KC_RSHIFT, KC_UP,
         KC_LCTL,MO(1),KC_LGUI,KC_LALT,KC_SPACE,    KC_N,   KC_SPACE, KC_RALT,KC_RGUI, KC_APP,  KC_RCTL,   KC_LEFT,   KC_DOWN, KC_RGHT
        ),
        KC_ESC,           KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,               KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,     KC_PSCR, KC_SLCK, KC_PAUS,
        KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,                KC_7,    KC_8,    KC_9,    KC_0,    KC_MINS, KC_EQL,  KC_BSPC,    KC_INS,  KC_HOME, KC_PGUP,
        KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,                KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_LBRC, KC_RBRC, KC_BSLS,    KC_DEL,  KC_END,  KC_PGDN,
        KC_CAPS, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,                KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT,          KC_ENT,
        KC_LSFT,          KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,                KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH,          KC_RSFT,             KC_UP,
        KC_LCTL, MO(1),   KC_LGUI, KC_LALT,                   KC_SPC,              KC_SPC,                    KC_RALT, KC_RGUI, KC_APP,  KC_RCTL,    KC_LEFT, KC_DOWN, KC_RGHT
    ),
    /* Volume */
    [1] = LAYOUT(
      KC_TRNS,KC_TRNS,KC_TRNS,      KC_TRNS,KC_TRNS,KC_TRNS,  KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,  KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
      KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,      KC_TRNS,KC_TRNS,KC_TRNS,  KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,  KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
      KC_TRNS,KC_TRNS,KC_TRNS,      KC_TRNS,KC_TRNS,KC_TRNS,  KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,  KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
      KC_TRNS,KC_TRNS,KC_TRNS,      KC_TRNS,KC_TRNS,KC_TRNS,  KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,  KC_TRNS,
      KC_TRNS,KC_TRNS,KC_TRNS,      KC_TRNS,KC_TRNS,KC_TRNS,  KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,             KC_VOLU,
      KC_TRNS,KC_TRNS,      KC_TRNS,KC_TRNS,KC_MEDIA_PLAY_PAUSE,  KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,  KC_MPRV,   KC_VOLD, KC_MNXT
        ),
        KC_TRNS,          KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,             KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,    KC_TRNS, KC_TRNS, KC_TRNS,
        KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,             KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,    KC_TRNS, KC_TRNS, KC_TRNS,
        KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,             KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,    KC_TRNS, KC_TRNS, KC_TRNS,
        KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,             KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS,
        KC_TRNS,          KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,             KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS,             KC_VOLU,
        KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,                   KC_MPLY,             KC_TRNS,                   KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,    KC_MPRV, KC_VOLD, KC_MNXT
    ),
};

M keyboards/handwired/split89/split89.h => keyboards/handwired/split89/split89.h +20 -18
@@ 18,6 18,8 @@

#include "quantum.h"

#define XXX KC_NO

/* This is a shortcut to help you visually see your layout.
 *
 * The first section contains all of the arguments representing the physical


@@ 27,24 29,24 @@
 * represents the switch matrix which includes blanks in the wired out matrix.
 */
#define LAYOUT( \
    k00,      k01, k02, k03, k04, k05,       k06, k07, k08, k09, k10, k11, k12, k13, k14, k15, \
    k32, k16, k17, k18, k19, k20, k21,     k22, k23, k24, k25, k26, k27,  k28,  k29, k30, k31, \
    k48, k33, k34, k35, k36, k37,       k54, k38, k39, k40, k41, k42, k43, k44, k45, k46, k47, \
    k61, k49, k50, k51, k52, k53,         k67, k55, k56, k57, k58, k59,    k60, \
    k74,   k62, k63, k64, k65, k66,         k80, k68, k69, k70, k71,       k72,      k73, \
    k75, k76, k77, k78,    k79,             k81,          k82, k83, k84, k85,   k86, k87, k88 \
    K04,      K05, K06, K07, K08, K09,        K60, K61, K62, K63, K64, K65, K66,   K67, K68, K69, \
    K24, K14, K15, K16, K17, K18, K19,        K70, K71, K72, K73, K74, K75, K76,   K77, K78, K79, \
    K34, K25, K26, K27, K28, K29,        K39, K90, K80, K81, K82, K83, K84, K85,   K86, K87, K88, \
    K89, K44, K35, K36, K37, K38,        K49, KA0, K91, K92, K93, K94,      K95,                  \
    K96,      K54, K45, K46, K47, K48,        K59, KB0, KA1, KA2, KA3,      KA4,        KA6,      \
    KA8, K55, K56, K57,           K58,        KB1,           KB3, KB4, KB5, KB6,   KB7, KB8, KB9  \
    ) \
    { \
      { KC_NO, KC_NO, KC_NO, KC_NO, k00, k01, k02, k03, k04, k05 }, \
      { KC_NO, KC_NO, KC_NO, KC_NO, k16, k17, k18, k19, k20, k21 },  \
      { KC_NO, KC_NO, KC_NO, KC_NO, k32, k33, k34, k35, k36, k37 },  \
      { KC_NO, KC_NO, KC_NO, KC_NO, k48, k49, k50, k51, k52, k53 },  \
      { KC_NO, KC_NO, KC_NO, KC_NO, k61, k62, k63, k64, k65, k66, },  \
      { KC_NO, KC_NO, KC_NO, KC_NO, k74, k75, k76, k77, k78, k79, },  \
      { k06, k07, k08, k09, k10, k11, k12, k13, k14, k15 }, \
      { k22, k23, k24, k25, k26, k27, k28, k29, k30, k31 },  \
      { k38, k39, k40, k41, k42, k43, k44, k45, k46, k47 },  \
      { k54, k55, k56, k57, k58, k59, k60, KC_NO, KC_NO, KC_NO },  \
      { k67, k68, k69, k70, k71, KC_NO, k72, KC_NO, k73, KC_NO },  \
      { k80, k81, KC_NO, k82, k83, k84, k85, k86, k87, k88 }  \
      { XXX, XXX, XXX, XXX, K04, K05, K06, K07, K08, K09 }, \
      { XXX, XXX, XXX, XXX, K14, K15, K16, K17, K18, K19 }, \
      { XXX, XXX, XXX, XXX, K24, K25, K26, K27, K28, K29 }, \
      { XXX, XXX, XXX, XXX, K34, K35, K36, K37, K38, K39 }, \
      { XXX, XXX, XXX, XXX, K44, K45, K46, K47, K48, K49 }, \
      { XXX, XXX, XXX, XXX, K54, K55, K56, K57, K58, K59 }, \
      { K60, K61, K62, K63, K64, K65, K66, K67, K68, K69 }, \
      { K70, K71, K72, K73, K74, K75, K76, K77, K78, K79 }, \
      { K80, K81, K82, K83, K84, K85, K86, K87, K88, K89 }, \
      { K90, K91, K92, K93, K94, K95, K96, XXX, XXX, XXX }, \
      { KA0, KA1, KA2, KA3, KA4, XXX, KA6, XXX, KA8, XXX }, \
      { KB0, KB1, XXX, KB3, KB4, KB5, KB6, KB7, KB8, KB9 }  \
}

A keyboards/mechanickeys/miniashen40/config.h => keyboards/mechanickeys/miniashen40/config.h +53 -0
@@ 0,0 1,53 @@
/* Copyright 2021 jfescobar18
  * 
  * This program is free software: you can redistribute it and/or modify 
  * it under the terms of the GNU General Public License as published by 
  * the Free Software Foundation, either version 2 of the License, or 
  * (at your option) any later version. 
  * 
  * This program is distributed in the hope that it will be useful, 
  * but WITHOUT ANY WARRANTY; without even the implied warranty of 
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
  * GNU General Public License for more details. 
  * 
  * You should have received a copy of the GNU General Public License 
  * along with this program.  If not, see <http://www.gnu.org/licenses/>. 
*/

#pragma once

#include "config_common.h"

/* USB Device descriptor parameter */
#define VENDOR_ID       0x4D4B // MechanicKeys
#define PRODUCT_ID      0x6D6E
#define DEVICE_VER      0x0001
#define MANUFACTURER    MechanicKeys
#define PRODUCT         MINI ASHEN 40

/* key matrix size */
#define MATRIX_ROWS 4
#define MATRIX_COLS 13

/*
 * Keyboard Matrix Assignments
 *
 * Change this to how you wired your keyboard
 * COLS: AVR pins used for columns, left to right
 * ROWS: AVR pins used for rows, top to bottom
 * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)
 *         ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
 *
*/
#define MATRIX_ROW_PINS { B1, B2, B3, B4 }
#define MATRIX_COL_PINS { C5, C4, C3, D0, C2, D1, C1, C0, D4, B0, D7, D6, B5 }
#define UNUSED_PINS

/* COL2ROW or ROW2COL */
#define DIODE_DIRECTION COL2ROW

/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
#define DEBOUNCE 5

/* define if matrix has ghost (lacks anti-ghosting diodes) */
//#define MATRIX_HAS_GHOST
\ No newline at end of file

A keyboards/mechanickeys/miniashen40/info.json => keyboards/mechanickeys/miniashen40/info.json +15 -0
@@ 0,0 1,15 @@
{
  "keyboard_name": "Mini Ashen 40",
  "url": "",
  "maintainer": "qmk",
  "layouts": {
    "LAYOUT": {
      "layout": [
        {"label": "Tab", "x": 0, "y": 0}, {"label": "Q", "x": 1, "y": 0}, {"label": "W", "x": 2, "y": 0}, {"label": "E", "x": 3, "y": 0}, {"label": "R", "x": 4, "y": 0}, {"label": "T", "x": 5, "y": 0}, {"label": "Y", "x": 6, "y": 0}, {"label": "U", "x": 7, "y": 0}, {"label": "I", "x": 8, "y": 0}, {"label": "O", "x": 9, "y": 0}, {"label": "P", "x": 10, "y": 0}, {"label": "Del", "x": 11, "y": 0}, {"label": "M1", "x": 12.25, "y": 0}, {"label": "M2", "x": 13.25, "y": 0},
        {"label": "Ctrl", "x": 0, "y": 1, "w":1.25}, {"label": "A", "x": 1.25, "y": 1}, {"label": "S", "x": 2.25, "y": 1}, {"label": "D", "x": 3.25, "y": 1}, {"label": "F", "x": 4.25, "y": 1}, {"label": "G", "x": 5.25, "y": 1}, {"label": "H", "x": 6.25, "y": 1}, {"label": "J", "x": 7.25, "y": 1}, {"label": "K", "x": 8.25, "y": 1}, {"label": "L", "x": 9.25, "y": 1}, {"label": "Enter", "x": 10.25, "y": 1, "w":1.75}, {"label": "M3", "x": 12.25, "y": 1}, {"label": "M4", "x": 13.25, "y": 1},
        {"label": "Shift", "x": 0, "y": 2, "w":1.75}, {"label": "Z", "x": 1.75, "y": 2}, {"label": "X", "x": 2.75, "y": 2}, {"label": "C", "x": 3.75, "y": 2}, {"label": "V", "x": 4.75, "y": 2}, {"label": "B", "x": 5.75, "y": 2}, {"label": "N", "x": 6.75, "y": 2}, {"label": "M", "x": 7.75, "y": 2}, {"label": ",", "x": 8.75, "y": 2}, {"label": ".", "x": 9.75, "y": 2}, {"label": "Fn", "x": 10.75, "y": 2, "w":1.25}, {"label": "Up", "x": 12.25, "y": 2.25},
        {"label": "Alt", "x": 1, "y": 3}, {"label": "OS", "x": 2, "y": 3, "w": 1.5}, {"label": "", "x": 3.5, "y": 3, "w": 2.75}, {"label": "", "x": 6.25, "y": 3, "w": 2.25}, {"label": "Os", "x": 8.5, "y": 3, "w": 1.5}, {"label": "Alt", "x": 10, "y": 3}, {"label": "Left", "x": 11.25, "y": 3.25}, {"label": "Down", "x": 12.25, "y": 3.25}, {"label": "Right", "x": 13.25, "y": 3.25}
      ]
    }
  }
}
\ No newline at end of file

A keyboards/mechanickeys/miniashen40/keymaps/default/keymap.c => keyboards/mechanickeys/miniashen40/keymaps/default/keymap.c +47 -0
@@ 0,0 1,47 @@
/* Copyright 2021 jfescobar18
  * 
  * This program is free software: you can redistribute it and/or modify 
  * it under the terms of the GNU General Public License as published by 
  * the Free Software Foundation, either version 2 of the License, or 
  * (at your option) any later version. 
  * 
  * This program is distributed in the hope that it will be useful, 
  * but WITHOUT ANY WARRANTY; without even the implied warranty of 
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
  * GNU General Public License for more details. 
  * 
  * You should have received a copy of the GNU General Public License 
  * along with this program.  If not, see <http://www.gnu.org/licenses/>. 
*/

#include QMK_KEYBOARD_H

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  [0] = LAYOUT( /* 0: qwerty */ 
    KC_GESC,       KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,             KC_MPRV,  KC_MNXT,
    CTL_T(KC_TAB), KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_ENT,           KC_MUTE,  KC_MPLY,
    KC_LSFT,       KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  MO(1),            KC_UP,   KC_BSPC,
                   KC_LALT, KC_LGUI,          KC_SPC,                             KC_SPC,  KC_RGUI, KC_RALT, KC_LEFT, KC_DOWN, KC_RGHT
  ),

  [1] = LAYOUT( /* 1: Symbols */ 
    KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_MINS,          KC_TRNS, KC_TRNS,
    MO(2),   KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LBRC, KC_RBRC, KC_SCLN, KC_QUOT, KC_BSLS,          KC_TRNS, KC_TRNS,
    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_SLSH, KC_TRNS,          KC_TRNS, KC_EQL,
             KC_TRNS, KC_TRNS,          KC_TRNS,                            KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
  ),

  [2] = LAYOUT( /* 2: Fn */ 
    KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,           KC_TRNS, KC_TRNS,
    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS, KC_TRNS,
    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS, KC_F12,
             KC_TRNS, KC_TRNS,          KC_TRNS,                            KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
  ),

  [3] = LAYOUT( /*3: Empty */ 
    RESET,   KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS, KC_TRNS,
    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS, KC_TRNS,
    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS, KC_TRNS,
             KC_TRNS, KC_TRNS,          KC_TRNS,                            KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
  ),
};

A keyboards/mechanickeys/miniashen40/keymaps/via/keymap.c => keyboards/mechanickeys/miniashen40/keymaps/via/keymap.c +47 -0
@@ 0,0 1,47 @@
/* Copyright 2021 Francisco Escobar
  * 
  * This program is free software: you can redistribute it and/or modify 
  * it under the terms of the GNU General Public License as published by 
  * the Free Software Foundation, either version 2 of the License, or 
  * (at your option) any later version. 
  * 
  * This program is distributed in the hope that it will be useful, 
  * but WITHOUT ANY WARRANTY; without even the implied warranty of 
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
  * GNU General Public License for more details. 
  * 
  * You should have received a copy of the GNU General Public License 
  * along with this program.  If not, see <http://www.gnu.org/licenses/>. 
*/ 

#include QMK_KEYBOARD_H

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  [0] = LAYOUT( /* 0: qwerty */ 
    KC_GESC,       KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,             KC_MPRV,  KC_MNXT,
    CTL_T(KC_TAB), KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_ENT,           KC_MUTE,  KC_MPLY,
    KC_LSFT,       KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  MO(1),            KC_UP,   KC_BSPC,
                   KC_LALT, KC_LGUI,          KC_SPC,                             KC_SPC,  KC_RGUI, KC_RALT, KC_LEFT, KC_DOWN, KC_RGHT
  ),

  [1] = LAYOUT( /* 1: Symbols */ 
    KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_MINS,          KC_TRNS, KC_TRNS,
    MO(2),   KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LBRC, KC_RBRC, KC_SCLN, KC_QUOT, KC_BSLS,          KC_TRNS, KC_TRNS,
    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_SLSH, KC_TRNS,          KC_TRNS, KC_EQL,
             KC_TRNS, KC_TRNS,          KC_TRNS,                            KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
  ),

  [2] = LAYOUT( /* 2: Fn */ 
    KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,           KC_TRNS, KC_TRNS,
    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS, KC_TRNS,
    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS, KC_F12,
             KC_TRNS, KC_TRNS,          KC_TRNS,                            KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
  ),

  [3] = LAYOUT( /*3: Empty */ 
    RESET,   KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS, KC_TRNS,
    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS, KC_TRNS,
    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS, KC_TRNS,
             KC_TRNS, KC_TRNS,          KC_TRNS,                            KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
  ),
};

A keyboards/mechanickeys/miniashen40/keymaps/via/rules.mk => keyboards/mechanickeys/miniashen40/keymaps/via/rules.mk +2 -0
@@ 0,0 1,2 @@
VIA_ENABLE = yes
LTO_ENABLE = yes

A keyboards/mechanickeys/miniashen40/miniashen40.c => keyboards/mechanickeys/miniashen40/miniashen40.c +17 -0
@@ 0,0 1,17 @@
/* Copyright 2021 jfescobar18
  * 
  * This program is free software: you can redistribute it and/or modify 
  * it under the terms of the GNU General Public License as published by 
  * the Free Software Foundation, either version 2 of the License, or 
  * (at your option) any later version. 
  * 
  * This program is distributed in the hope that it will be useful, 
  * but WITHOUT ANY WARRANTY; without even the implied warranty of 
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
  * GNU General Public License for more details. 
  * 
  * You should have received a copy of the GNU General Public License 
  * along with this program.  If not, see <http://www.gnu.org/licenses/>. 
*/

#include "miniashen40.h"

A keyboards/mechanickeys/miniashen40/miniashen40.h => keyboards/mechanickeys/miniashen40/miniashen40.h +42 -0
@@ 0,0 1,42 @@
/* Copyright 2021 jfescobar18
  * 
  * This program is free software: you can redistribute it and/or modify 
  * it under the terms of the GNU General Public License as published by 
  * the Free Software Foundation, either version 2 of the License, or 
  * (at your option) any later version. 
  * 
  * This program is distributed in the hope that it will be useful, 
  * but WITHOUT ANY WARRANTY; without even the implied warranty of 
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
  * GNU General Public License for more details. 
  * 
  * You should have received a copy of the GNU General Public License 
  * along with this program.  If not, see <http://www.gnu.org/licenses/>. 
*/

#pragma once

#include "quantum.h"

#define XXX KC_NO

/* This is a shortcut to help you visually see your layout.
 *
 * The first section contains all of the arguments representing the physical
 * layout of the board and position of the keys.
 *
 * The second converts the arguments into a two-dimensional array which
 * represents the switch matrix.
 */
#define LAYOUT( \
  K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, \
  K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, \
  K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, \
  K30, K31,      K33,           K36,      K38, K39, K3A, K3B, K3C  \
) \
{ \
  { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C }, \
  { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C }, \
  { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C }, \
  { K30, K31, XXX, K33, XXX, XXX, K36, XXX, K38, K39, K3A, K3B, K3C } \
}

A keyboards/mechanickeys/miniashen40/readme.md => keyboards/mechanickeys/miniashen40/readme.md +40 -0
@@ 0,0 1,40 @@
# Mini Ashen 40

![Mini Ashen 40](https://i.imgur.com/0k3gFZCh.jpeg)

![Mini Ashen 40](https://i.imgur.com/B1w8qwPh.jpeg)

![Mini Ashen 40](https://i.imgur.com/LqxXW0Rh.jpeg)

A 40% keyboard with some extras
  - Arrows
  - Mini macro cluster
  - Full assembly with only through hole components

* Keyboard Maintainer: [jfescobar18](https://github.com/jfescobar18)
* Hardware Supported: Mini Ashen 40 PCB and Case
* Hardware Availability: [MechanicKeys](https://www.facebook.com/MechanicKeys-104963764775280)

Make example for this keyboard (after setting up your build environment):

    make mechanickeys/miniashen40:default

Flashing example for this keyboard:

    make mechanickeys/miniashen40:default:flash
    
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).

## Bootloader

Enter the bootloader in 3 ways:

* **Bootmagic reset**: Hold down the key at (0,0) in the matrix (usually the top left key or Escape) and plug in the keyboard
* **Physical**: 
  1. Press and hold `BOOT` switch
  2. Tap `RESET` switch
  3. Release `BOOT` switch
* **Keycode in layout**: Press the key mapped to `RESET` if it is available

## Flash bootloader
* [Follow this instructions](https://github.com/jfescobar18/USBaspLoader)

A keyboards/mechanickeys/miniashen40/rules.mk => keyboards/mechanickeys/miniashen40/rules.mk +21 -0
@@ 0,0 1,21 @@
# MCU name
MCU = atmega328p

# Bootloader selection
BOOTLOADER = usbasploader

# Build Options
#   change yes to no to disable
#
BOOTMAGIC_ENABLE = yes      # Enable Bootmagic Lite
MOUSEKEY_ENABLE = yes       # Mouse keys
EXTRAKEY_ENABLE = yes       # Audio control and System control
CONSOLE_ENABLE = no         # Console for debug
COMMAND_ENABLE = no         # Commands for debug and configuration
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
SLEEP_LED_ENABLE = no       # Breathing sleep LED during USB suspend
# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
NKRO_ENABLE = no            # USB Nkey Rollover
BACKLIGHT_ENABLE = no       # Enable keyboard backlight functionality
RGBLIGHT_ENABLE = no        # Enable keyboard RGB underglow
AUDIO_ENABLE = no           # Audio output

A keyboards/mtbkeys/mtb60/hotswap/config.h => keyboards/mtbkeys/mtb60/hotswap/config.h +79 -0
@@ 0,0 1,79 @@
/*
Copyright 2021 MTBKeys

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#pragma once

#include "config_common.h"

/* USB Device descriptor parameter */
#define VENDOR_ID    0xFEED
#define PRODUCT_ID   0x0001
#define DEVICE_VER   0x0001
#define MANUFACTURER MTBKeys
#define PRODUCT      honeyboard60

/* key matrix size */
#define MATRIX_ROWS 5
#define MATRIX_COLS 15

/* key matrix pinout */
#define MATRIX_ROW_PINS { D6, D7, B4, B5, D5 }
#define MATRIX_COL_PINS { D0, D1, D2, D3, B7, B6, F7, C6, C7, F6, F4, F1, F0, F5, E6 }
#define UNUSED_PINS

/* diode direction: COL2ROW or ROW2COL */
#define DIODE_DIRECTION ROW2COL

/* Pin WS2812 RGB LEDs are connected to */
#define RGB_DI_PIN D4

#ifdef RGB_DI_PIN
#   define RGBLED_NUM 16
#   define RGBLIGHT_HUE_STEP 8
#   define RGBLIGHT_SAT_STEP 8
#   define RGBLIGHT_VAL_STEP 8
#   define RGBLIGHT_LIMIT_VAL 255 /* The maximum brightness level */
#   define RGBLIGHT_SLEEP         /* Turn RGB light off when the host goes to sleep */
#   define RGBLIGHT_EFFECT_ALTERNATING
#   define RGBLIGHT_EFFECT_BREATHING
#   define RGBLIGHT_EFFECT_CHRISTMAS
#   define RGBLIGHT_EFFECT_KNIGHT
#   define RGBLIGHT_EFFECT_RAINBOW_MOOD
#   define RGBLIGHT_EFFECT_RAINBOW_SWIRL
#   define RGBLIGHT_EFFECT_RGB_TEST
#   define RGBLIGHT_EFFECT_SNAKE
#   define RGBLIGHT_EFFECT_STATIC_GRADIENT
#   define RGBLIGHT_EFFECT_TWINKLE
#   define RGBLIGHT_DEFAULT_MODE RGBLIGHT_MODE_RAINBOW_SWIRL /* Set default RGB */
#endif /* RGB_DI_PIN */

/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
#define DEBOUNCE 5

/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE

/* Locking resynchronize hack */
#define LOCKING_RESYNC_ENABLE

/* disable these deprecated features by default */
#define NO_ACTION_MACRO
#define NO_ACTION_FUNCTION

/* Bootmagic Lite key configuration */
#define BOOTMAGIC_LITE_ROW 0
#define BOOTMAGIC_LITE_COLUMN 0

A keyboards/mtbkeys/mtb60/hotswap/hotswap.c => keyboards/mtbkeys/mtb60/hotswap/hotswap.c +17 -0
@@ 0,0 1,17 @@
/* Copyright 2021 MTBKeys
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#include "hotswap.h"

A keyboards/mtbkeys/mtb60/hotswap/hotswap.h => keyboards/mtbkeys/mtb60/hotswap/hotswap.h +33 -0
@@ 0,0 1,33 @@
/* Copyright 2021 MTBKeys
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#pragma once

#include "quantum.h"

#define LAYOUT( \
    k00, k10, k20, k30, k40, k50, k60, k70, k80, k90, ka0, kb0, kc0,      ke0, \
         k11, k21, k31, k41, k51, k61, k71, k81, k91, ka1, kb1, kc1, kd1, ke1, \
    k02,      k22, k32, k42, k52, k62, k72, k82, k92, ka2, kb2, kc2, kd2,      \
    k03,      k23, k33, k43, k53, k63, k73, k83, k93, ka3, kb3,      kd3,      \
    k04, k14, k24,                k64,                ka4, kb4,      kd4, ke4  \
) { \
    { k00,   k10,   k20, k30,   k40,   k50,   k60, k70,   k80,   k90,   ka0, kb0, kc0,   KC_NO, ke0   }, \
    { KC_NO, k11,   k21, k31,   k41,   k51,   k61, k71,   k81,   k91,   ka1, kb1, kc1,   kd1,   ke1   }, \
    { k02,   KC_NO, k22, k32,   k42,   k52,   k62, k72,   k82,   k92,   ka2, kb2, kc2,   kd2,   KC_NO }, \
    { k03,   KC_NO, k23, k33,   k43,   k53,   k63, k73,   k83,   k93,   ka3, kb3, KC_NO, kd3,   KC_NO }, \
    { k04,   k14,   k24, KC_NO, KC_NO, KC_NO, k64, KC_NO, KC_NO, KC_NO, ka4, kb4, kd4,   KC_NO, ke4   }  \
}

A keyboards/mtbkeys/mtb60/hotswap/info.json => keyboards/mtbkeys/mtb60/hotswap/info.json +72 -0
@@ 0,0 1,72 @@
{
    "keyboard_name": "MTB60",
    "url": "mtbkeys.com",
    "maintainer": "MTBKeys",
    "layouts": {
        "LAYOUT_all": {
            "layout": [
                {"label": "Esc"       , "x":  0, "y": 0        },
                {"label": "!"         , "x":  1, "y": 0        },
                {"label": "@"         , "x":  2, "y": 0        },
                {"label": "#"         , "x":  3, "y": 0        },
                {"label": "$"         , "x":  4, "y": 0        },
                {"label": "%"         , "x":  5, "y": 0        },
                {"label": "^"         , "x":  6, "y": 0        },
                {"label": "&"         , "x":  7, "y": 0        },
                {"label": "*"         , "x":  8, "y": 0        },
                {"label": "("         , "x":  9, "y": 0        },
                {"label": ")"         , "x": 10, "y": 0        },
                {"label": "_"         , "x": 11, "y": 0        },
                {"label": "+"         , "x": 12, "y": 0        },
                {"label": "Back Space", "x": 13, "y": 0, "w": 2},
                {"label": "Tab", "x":  0  , "y": 1, "w": 1.5},
                {"label": "Q"  , "x":  1.5, "y": 1          },
                {"label": "W"  , "x":  2.5, "y": 1          },
                {"label": "E"  , "x":  3.5, "y": 1          },
                {"label": "R"  , "x":  4.5, "y": 1          },
                {"label": "T"  , "x":  5.5, "y": 1          },
                {"label": "Y"  , "x":  6.5, "y": 1          },
                {"label": "U"  , "x":  7.5, "y": 1          },
                {"label": "I"  , "x":  8.5, "y": 1          },
                {"label": "O"  , "x":  9.5, "y": 1          },
                {"label": "P"  , "x": 10.5, "y": 1          },
                {"label": "{"  , "x": 11.5, "y": 1          },
                {"label": "}"  , "x": 12.5, "y": 1          },
                {"label": "|"  , "x": 13.5, "y": 1, "w": 1.5},
                {"label": "Caps Lock", "x":  0   , "y": 2, "w": 1.75},
                {"label": "A"        , "x":  1.75, "y": 2           },
                {"label": "S"        , "x":  2.75, "y": 2           },
                {"label": "D"        , "x":  3.75, "y": 2           },
                {"label": "F"        , "x":  4.75, "y": 2           },
                {"label": "G"        , "x":  5.75, "y": 2           },
                {"label": "H"        , "x":  6.75, "y": 2           },
                {"label": "J"        , "x":  7.75, "y": 2           },
                {"label": "K"        , "x":  8.75, "y": 2           },
                {"label": "L"        , "x":  9.75, "y": 2           },
                {"label": ":"        , "x": 10.75, "y": 2           },
                {"label": "\""       , "x": 11.75, "y": 2           },
                {"label": "Enter"    , "x": 12.75, "y": 2, "w": 2.25},
                {"label": "Left Shift" , "x":  0   , "y": 3, "w": 2.25},
                {"label": "Z"          , "x":  2.25, "y": 3           },
                {"label": "X"          , "x":  3.25, "y": 3           },
                {"label": "C"          , "x":  4.25, "y": 3           },
                {"label": "V"          , "x":  5.25, "y": 3           },
                {"label": "B"          , "x":  6.25, "y": 3           },
                {"label": "N"          , "x":  7.25, "y": 3           },
                {"label": "M"          , "x":  8.25, "y": 3           },
                {"label": "<"          , "x":  9.25, "y": 3           },
                {"label": ">"          , "x": 10.25, "y": 3           },
                {"label": "?"          , "x": 11.25, "y": 3           },
                {"label": "Right Shift", "x": 12.25, "y": 3, "w": 2.75},
                {"label": "Left Ctrl" , "x":  0   , "y": 4, "w": 1.25},
                {"label": "GUI"       , "x":  1.25, "y": 4, "w": 1.25},
                {"label": "Left Alt"  , "x":  2.5 , "y": 4, "w": 1.25},
                {"label": "Space"     , "x":  3.75, "y": 4, "w": 6.25},
                {"label": "Right Ctrl", "x": 10   , "y": 4, "w": 1.25},
                {"label": "GUI"       , "x": 11.25, "y": 4, "w": 1.25},
                {"label": "MO(1)"     , "x": 12.5 , "y": 4, "w": 1.25},
                {"label": "Right Ctrl", "x": 13.75, "y": 4, "w": 1.25}
            ]
        }
    }
}

A keyboards/mtbkeys/mtb60/hotswap/keymaps/default/keymap.c => keyboards/mtbkeys/mtb60/hotswap/keymaps/default/keymap.c +39 -0
@@ 0,0 1,39 @@
/* Copyright 2021 MTBKeys
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
#include QMK_KEYBOARD_H

// Defines names for use in layer keycodes and the keymap
enum layer_names {
    _BASE,  ///< Default Layer
    _FN     ///< Function Layer
};

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    [_BASE] = LAYOUT(
        KC_ESC, KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_MINS, KC_EQL,  KC_BSPC,
        KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_LBRC, KC_RBRC, KC_BSLS,
        KC_CAPS, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT,          KC_ENT,
        KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_RSFT,
        KC_LCTL, KC_LGUI, KC_LALT,                   KC_SPC,                                      KC_RALT, KC_RGUI, MO(_FN), KC_RCTL
    ),
    [_FN] = LAYOUT(
        KC_GRV,  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,   KC_DEL,
        _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, _______, _______,
        _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP,  KC_RIGHT, _______, _______,          _______,
        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
        _______, _______, _______,                   _______,                                     _______, _______, _______, RGB_TOG
    )
};

A keyboards/mtbkeys/mtb60/hotswap/readme.md => keyboards/mtbkeys/mtb60/hotswap/readme.md +26 -0
@@ 0,0 1,26 @@
# MTB60 (Hotswap Edition)

## Details

* Keyboard Maintainer: [MTBKeys](https://mtbkeys.com/)
* Hardware Supported: MTB60 PCB (Hotswap edition)
* Hardware Availability: [HB60 on MTBKeys Website](https://mtbkeys.com/)

## Building Firmware

Make example for this keyboard (after setting up your build environment):

    make mtbkeys/mtb60/hotswap:default

Flashing example for this keyboard:

    make mtbkeys/mtb60/hotswap:default:flash

## Bootloader

Enter the bootloader in 2 ways:

1. **Bootmagic reset**: Hold down the key at (0,0) in the matrix (usually the top left key or Escape) and plug in the keyboard
2. **Physical reset button**: Briefly press the button on the back of the PCB

See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).

A keyboards/mtbkeys/mtb60/hotswap/rules.mk => keyboards/mtbkeys/mtb60/hotswap/rules.mk +21 -0
@@ 0,0 1,21 @@
# MCU name
MCU = atmega32u4

# Bootloader selection
BOOTLOADER = atmel-dfu

# Build Options
#   change yes to no to disable
#
BOOTMAGIC_ENABLE = yes      # Enable Bootmagic Lite
MOUSEKEY_ENABLE = yes       # Mouse keys
EXTRAKEY_ENABLE = yes       # Audio control and System control
CONSOLE_ENABLE = no         # Console for debug
COMMAND_ENABLE = no         # Commands for debug and configuration
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
SLEEP_LED_ENABLE = no       # Breathing sleep LED during USB suspend
# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
NKRO_ENABLE = no            # USB Nkey Rollover
BACKLIGHT_ENABLE = no       # Enable keyboard backlight functionality
RGBLIGHT_ENABLE = yes       # Enable keyboard RGB underglow
AUDIO_ENABLE = no           # Audio output

A keyboards/mtbkeys/mtb60/solder/config.h => keyboards/mtbkeys/mtb60/solder/config.h +79 -0
@@ 0,0 1,79 @@
/*
Copyright 2021 MTBKeys

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#pragma once

#include "config_common.h"

/* USB Device descriptor parameter */
#define VENDOR_ID    0xFEED
#define PRODUCT_ID   0x0000
#define DEVICE_VER   0x0001
#define MANUFACTURER MTBKeys
#define PRODUCT      MTB60

/* key matrix size */
#define MATRIX_ROWS 5
#define MATRIX_COLS 15

/* key matrix pinout */
#define MATRIX_ROW_PINS { D0, D1, F4, F1, D2 }
#define MATRIX_COL_PINS { E6, F0, F5, F6, F7, D5, D3, C7, C6, B6, B5, B4, D7, D6, D4 }
#define UNUSED_PINS

/* diode direction: COL2ROW or ROW2COL */
#define DIODE_DIRECTION ROW2COL

/* Pin WS2812 RGB LEDs are connected to */
#define RGB_DI_PIN B0

#ifdef RGB_DI_PIN
#   define RGBLED_NUM 16
#   define RGBLIGHT_HUE_STEP 8
#   define RGBLIGHT_SAT_STEP 8
#   define RGBLIGHT_VAL_STEP 8
#   define RGBLIGHT_LIMIT_VAL 255 /* The maximum brightness level */
#   define RGBLIGHT_SLEEP         /* Turn RGB light off when the host goes to sleep */
#   define RGBLIGHT_EFFECT_ALTERNATING
#   define RGBLIGHT_EFFECT_BREATHING
#   define RGBLIGHT_EFFECT_CHRISTMAS
#   define RGBLIGHT_EFFECT_KNIGHT
#   define RGBLIGHT_EFFECT_RAINBOW_MOOD
#   define RGBLIGHT_EFFECT_RAINBOW_SWIRL
#   define RGBLIGHT_EFFECT_RGB_TEST
#   define RGBLIGHT_EFFECT_SNAKE
#   define RGBLIGHT_EFFECT_STATIC_GRADIENT
#   define RGBLIGHT_EFFECT_TWINKLE
#   define RGBLIGHT_DEFAULT_MODE RGBLIGHT_MODE_RAINBOW_SWIRL /* Set default RGB */
#endif /* RGB_DI_PIN */

/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
#define DEBOUNCE 5

/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE

/* Locking resynchronize hack */
#define LOCKING_RESYNC_ENABLE

/* disable these deprecated features by default */
#define NO_ACTION_MACRO
#define NO_ACTION_FUNCTION

/* Bootmagic Lite key configuration */
#define BOOTMAGIC_LITE_ROW 0
#define BOOTMAGIC_LITE_COLUMN 0

A keyboards/mtbkeys/mtb60/solder/info.json => keyboards/mtbkeys/mtb60/solder/info.json +75 -0
@@ 0,0 1,75 @@
{
    "keyboard_name": "MTB60",
    "url": "mtbkeys.com",
    "maintainer": "MTBKeys",
    "layouts": {
        "LAYOUT_all": {
            "layout": [
                {"label": "Esc"       , "x":  0, "y": 0},
                {"label": "!"         , "x":  1, "y": 0},
                {"label": "@"         , "x":  2, "y": 0},
                {"label": "#"         , "x":  3, "y": 0},
                {"label": "$"         , "x":  4, "y": 0},
                {"label": "%"         , "x":  5, "y": 0},
                {"label": "^"         , "x":  6, "y": 0},
                {"label": "&"         , "x":  7, "y": 0},
                {"label": "*"         , "x":  8, "y": 0},
                {"label": "("         , "x":  9, "y": 0},
                {"label": ")"         , "x": 10, "y": 0},
                {"label": "_"         , "x": 11, "y": 0},
                {"label": "+"         , "x": 12, "y": 0},
                {"label": "Back Space", "x": 13, "y": 0},
                {"label": "Delete"    , "x": 14, "y": 0},
                {"label": "Tab", "x":  0  , "y": 1, "w": 1.5},
                {"label": "Q"  , "x":  1.5, "y": 1          },
                {"label": "W"  , "x":  2.5, "y": 1          },
                {"label": "E"  , "x":  3.5, "y": 1          },
                {"label": "R"  , "x":  4.5, "y": 1          },
                {"label": "T"  , "x":  5.5, "y": 1          },
                {"label": "Y"  , "x":  6.5, "y": 1          },
                {"label": "U"  , "x":  7.5, "y": 1          },
                {"label": "I"  , "x":  8.5, "y": 1          },
                {"label": "O"  , "x":  9.5, "y": 1          },
                {"label": "P"  , "x": 10.5, "y": 1          },
                {"label": "{"  , "x": 11.5, "y": 1          },
                {"label": "}"  , "x": 12.5, "y": 1          },
                {"label": "|"  , "x": 13.5, "y": 1, "w": 1.5},
                {"label": "Caps Lock", "x":  0   , "y": 2, "w": 1.75},
                {"label": "A"        , "x":  1.75, "y": 2           },
                {"label": "S"        , "x":  2.75, "y": 2           },
                {"label": "D"        , "x":  3.75, "y": 2           },
                {"label": "F"        , "x":  4.75, "y": 2           },
                {"label": "G"        , "x":  5.75, "y": 2           },
                {"label": "H"        , "x":  6.75, "y": 2           },
                {"label": "J"        , "x":  7.75, "y": 2           },
                {"label": "K"        , "x":  8.75, "y": 2           },
                {"label": "L"        , "x":  9.75, "y": 2           },
                {"label": ":"        , "x": 10.75, "y": 2           },
                {"label": "\""       , "x": 11.75, "y": 2           },
                {"label": "Enter"    , "x": 12.75, "y": 2, "w": 2.25},
                {"label": "Left Shift" , "x":  0   , "y": 3, "w": 2.25},
                {"label": "Z"          , "x":  2.25, "y": 3           },
                {"label": "X"          , "x":  3.25, "y": 3           },
                {"label": "C"          , "x":  4.25, "y": 3           },
                {"label": "V"          , "x":  5.25, "y": 3           },
                {"label": "B"          , "x":  6.25, "y": 3           },
                {"label": "N"          , "x":  7.25, "y": 3           },
                {"label": "M"          , "x":  8.25, "y": 3           },
                {"label": "<"          , "x":  9.25, "y": 3           },
                {"label": ">"          , "x": 10.25, "y": 3           },
                {"label": "?"          , "x": 11.25, "y": 3           },
                {"label": "Right Shift", "x": 12.25, "y": 3, "w": 2.75},
                {"label": "Left Ctrl" , "x":  0   , "y": 4, "w": 1.25},
                {"label": "GUI"       , "x":  1.25, "y": 4, "w": 1.25},
                {"label": "Left Alt"  , "x":  2.5 , "y": 4, "w": 1.25},
                {"label": "Space"     , "x":  3.75, "y": 4, "w": 2.25},
                {"label": "Space"     , "x":  6   , "y": 4, "w": 1.25},
                {"label": "Space"     , "x":  7.25, "y": 4, "w": 2.75},
                {"label": "Right Ctrl", "x": 10   , "y": 4, "w": 1.25},
                {"label": "GUI"       , "x": 11.25, "y": 4, "w": 1.25},
                {"label": "MO(1)"     , "x": 12.5 , "y": 4, "w": 1.25},
                {"label": "Right Ctrl", "x": 13.75, "y": 4, "w": 1.25}
            ]
        }
    }
}

A keyboards/mtbkeys/mtb60/solder/keymaps/default/keymap.c => keyboards/mtbkeys/mtb60/solder/keymaps/default/keymap.c +40 -0
@@ 0,0 1,40 @@
/* Copyright 2021 MTBKeys
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
#include QMK_KEYBOARD_H

// Defines names for use in layer keycodes and the keymap
enum layer_names {
    _BASE,
    _FN
};

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    /* Base */
    [_BASE] = LAYOUT(
        KC_ESC, KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_MINS, KC_EQL,  KC_BSPC, KC_BSPC,
        KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_LBRC, KC_RBRC, KC_BSLS,
        KC_CAPS, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT,          KC_ENT,
        KC_LSFT, KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_RSFT, KC_RSFT, KC_RSFT,
        KC_LCTL, KC_LGUI, KC_LALT,                   KC_SPC,  KC_SPC,  KC_SPC,                    KC_RALT, KC_RGUI, MO(_FN), KC_RGUI, KC_RCTL
    ),
    [_FN] = LAYOUT(
        KC_GRV,  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12, _______, _______,
        _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, _______, _______,
        _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP,  KC_RIGHT, _______, _______,          _______,
        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
        _______, _______, _______,                   _______, _______, _______,          _______, _______, _______, _______, _______
    )
};

A keyboards/mtbkeys/mtb60/solder/readme.md => keyboards/mtbkeys/mtb60/solder/readme.md +26 -0
@@ 0,0 1,26 @@
# MTB60 (Solder Edition)

## Details

* Keyboard Maintainer: [MTBKeys](https://mtbkeys.com/)
* Hardware Supported: MTB60 PCB (Solder edition)
* Hardware Availability: [HB60 on MTBKeys Website](https://mtbkeys.com/)

## Building Firmware

Make example for this keyboard (after setting up your build environment):

    make mtbkeys/mtb60/solder:default

Flashing example for this keyboard:

    make mtbkeys/mtb60/solder:default:flash

## Bootloader

Enter the bootloader in 2 ways:

1. **Bootmagic reset**: Hold down the key at (0,0) in the matrix (usually the top left key or Escape) and plug in the keyboard
2. **Physical reset button**: Briefly press the button on the back of the PCB

See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).

A keyboards/mtbkeys/mtb60/solder/rules.mk => keyboards/mtbkeys/mtb60/solder/rules.mk +21 -0
@@ 0,0 1,21 @@
# MCU name
MCU = atmega32u4

# Bootloader selection
BOOTLOADER = atmel-dfu

# Build Options
#   change yes to no to disable
#
BOOTMAGIC_ENABLE = yes      # Enable Bootmagic Lite
MOUSEKEY_ENABLE = yes       # Mouse keys
EXTRAKEY_ENABLE = yes       # Audio control and System control
CONSOLE_ENABLE = no         # Console for debug
COMMAND_ENABLE = no         # Commands for debug and configuration
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
SLEEP_LED_ENABLE = no       # Breathing sleep LED during USB suspend
# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
NKRO_ENABLE = no            # USB Nkey Rollover
BACKLIGHT_ENABLE = no       # Enable keyboard backlight functionality
RGBLIGHT_ENABLE = yes        # Enable keyboard RGB underglow
AUDIO_ENABLE = no           # Audio output

A keyboards/mtbkeys/mtb60/solder/solder.c => keyboards/mtbkeys/mtb60/solder/solder.c +17 -0
@@ 0,0 1,17 @@
/* Copyright 2021 MTBKeys
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#include "solder.h"

A keyboards/mtbkeys/mtb60/solder/solder.h => keyboards/mtbkeys/mtb60/solder/solder.h +33 -0
@@ 0,0 1,33 @@
/* Copyright 2021 MTBKeys
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#pragma once

#include "quantum.h"

#define LAYOUT( \
    k00, k10, k20, k30, k40, k50, k60, k70, k80, k90, ka0, kb0, kc0, kd0, ke0, \
         k11, k21, k31, k41, k51, k61, k71, k81, k91, ka1, kb1, kc1, kd1, ke1, \
    k02,      k22, k32, k42, k52, k62, k72, k82, k92, ka2, kb2, kc2, kd2,      \
    k03, k13, k23, k33, k43, k53, k63, k73, k83, k93, ka3, kb3, kc3, kd3, ke3, \
    k04, k14,      k34, k44,      k64,      k84,      ka4, kb4, kc4, kd4, ke4  \
) { \
    { k00,   k10,   k20,   k30, k40, k50,   k60, k70,   k80, k90,   ka0, kb0, kc0, kd0, ke0   }, \
    { KC_NO, k11,   k21,   k31, k41, k51,   k61, k71,   k81, k91,   ka1, kb1, kc1, kd1, ke1   }, \
    { k02,   KC_NO, k22,   k32, k42, k52,   k62, k72,   k82, k92,   ka2, kb2, kc2, kd2, KC_NO }, \
    { k03,   k13,   k23,   k33, k43, k53,   k63, k73,   k83, k93,   ka3, kb3, kc3, kd3, ke3   }, \
    { k04,   k14,   KC_NO, k34, k44, KC_NO, k64, KC_NO, k84, KC_NO, ka4, kb4, kc4, kd4, ke4   }  \
}

M lib/python/qmk/cli/format/python.py => lib/python/qmk/cli/format/python.py +54 -12
@@ 4,23 4,65 @@ from subprocess import CalledProcessError, DEVNULL

from milc import cli

from qmk.path import normpath

@cli.argument('-n', '--dry-run', arg_only=True, action='store_true', help="Don't actually format.")
@cli.subcommand("Format python code according to QMK's style.", hidden=False if cli.config.user.developer else True)
def format_python(cli):
    """Format python code according to QMK's style.
    """
py_file_suffixes = ('py',)
py_dirs = ['lib/python']


def yapf_run(files):
    edit = '--diff' if cli.args.dry_run else '--in-place'
    yapf_cmd = ['yapf', '-vv', '--recursive', edit, 'lib/python']
    yapf_cmd = ['yapf', '-vv', '--recursive', edit, *files]
    try:
        cli.run(yapf_cmd, check=True, capture_output=False, stdin=DEVNULL)
        cli.log.info('Python code in `lib/python` is correctly formatted.')
        return True
        cli.log.info('Successfully formatted the python code.')

    except CalledProcessError:
        if cli.args.dry_run:
            cli.log.error('Python code in `lib/python` is incorrectly formatted!')
        cli.log.error(f'Python code in {",".join(py_dirs)} incorrectly formatted!')
        return False


def filter_files(files):
    """Yield only files to be formatted and skip the rest
    """

    for file in files:
        if file and file.name.split('.')[-1] in py_file_suffixes:
            yield file
        else:
            cli.log.error('Error formatting python code!')
            cli.log.debug('Skipping file %s', file)


@cli.argument('-n', '--dry-run', arg_only=True, action='store_true', help="Don't actually format.")
@cli.argument('-b', '--base-branch', default='origin/master', help='Branch to compare to diffs to.')
@cli.argument('-a', '--all-files', arg_only=True, action='store_true', help='Format all files.')
@cli.argument('files', nargs='*', arg_only=True, type=normpath, help='Filename(s) to format.')
@cli.subcommand("Format python code according to QMK's style.", hidden=False if cli.config.user.developer else True)
def format_python(cli):
    """Format python code according to QMK's style.
    """
    # Find the list of files to format
    if cli.args.files:
        files = list(filter_files(cli.args.files))

        if not files:
            cli.log.error('No Python files in filelist: %s', ', '.join(map(str, cli.args.files)))
            exit(0)

        if cli.args.all_files:
            cli.log.warning('Filenames passed with -a, only formatting: %s', ','.join(map(str, files)))

    elif cli.args.all_files:
        files = py_dirs

    else:
        git_diff_cmd = ['git', 'diff', '--name-only', cli.args.base_branch, *py_dirs]
        git_diff = cli.run(git_diff_cmd, stdin=DEVNULL)
        files = list(filter(None, git_diff.stdout.split('\n')))

    # Sanity check
    if not files:
        cli.log.error('No changed files detected. Use "qmk format-python -a" to format all files')
        return False

    return False
    return yapf_run(files)

M lib/python/qmk/cli/list/keymaps.py => lib/python/qmk/cli/list/keymaps.py +5 -0
@@ 13,5 13,10 @@ from qmk.keyboard import keyboard_completer, keyboard_folder
def list_keymaps(cli):
    """List the keymaps for a specific keyboard
    """
    if not cli.config.list_keymaps.keyboard:
        cli.log.error('Missing required arguments: --keyboard')
        cli.subcommands['list-keymaps'].print_help()
        return False

    for name in qmk.keymap.list_keymaps(cli.config.list_keymaps.keyboard):
        print(name)

M lib/python/qmk/cli/list/layouts.py => lib/python/qmk/cli/list/layouts.py +5 -0
@@ 13,6 13,11 @@ from qmk.info import info_json
def list_layouts(cli):
    """List the layouts for a specific keyboard
    """
    if not cli.config.list_layouts.keyboard:
        cli.log.error('Missing required arguments: --keyboard')
        cli.subcommands['list-layouts'].print_help()
        return False

    info_data = info_json(cli.config.list_layouts.keyboard)
    for name in sorted(info_data.get('community_layouts', [])):
        print(name)

M lib/python/qmk/tests/test_cli_commands.py => lib/python/qmk/tests/test_cli_commands.py +2 -2
@@ 81,9 81,9 @@ def test_hello():


def test_format_python():
    result = check_subcommand('format-python', '--dry-run')
    result = check_subcommand('format-python', '-n', '-a')
    check_returncode(result)
    assert 'Python code in `lib/python` is correctly formatted.' in result.stdout
    assert 'Successfully formatted the python code.' in result.stdout


def test_list_keyboards():