Przeglądaj źródła

Merge remote-tracking branch 'origin/master' into develop

Drashna Jael're 2 lat temu
rodzic
commit
eeb3f9c043
82 zmienionych plików z 3898 dodań i 966 usunięć
  1. 1 1
      docs/feature_key_lock.md
  2. 1 1
      docs/ja/feature_key_lock.md
  3. 1 1
      docs/serial_driver.md
  4. 4 1
      keyboards/a_dux/keymaps/daliusd/config.h
  5. 336 0
      keyboards/a_dux/keymaps/daliusd/flow.c
  6. 27 0
      keyboards/a_dux/keymaps/daliusd/flow.h
  7. 102 117
      keyboards/a_dux/keymaps/daliusd/keymap.c
  8. 0 195
      keyboards/a_dux/keymaps/daliusd/oneshot.c
  9. 0 65
      keyboards/a_dux/keymaps/daliusd/oneshot.h
  10. 292 7
      keyboards/a_dux/keymaps/daliusd/readme.md
  11. 1 1
      keyboards/a_dux/keymaps/daliusd/rules.mk
  12. 73 1
      keyboards/aurora65/info.json
  13. 52 17
      keyboards/bpiphany/ghost_squid/ghost_squid.h
  14. 120 3
      keyboards/bpiphany/ghost_squid/info.json
  15. 27 30
      keyboards/bpiphany/ghost_squid/keymaps/default/keymap.c
  16. 33 1
      keyboards/bpiphany/ghost_squid/keymaps/default/readme.md
  17. 20 0
      keyboards/cannonkeys/ellipse/config.h
  18. 27 0
      keyboards/cannonkeys/ellipse/halconf.h
  19. 108 0
      keyboards/cannonkeys/ellipse/info.json
  20. 45 0
      keyboards/cannonkeys/ellipse/keymaps/default/keymap.c
  21. 45 0
      keyboards/cannonkeys/ellipse/keymaps/via/keymap.c
  22. 1 0
      keyboards/cannonkeys/ellipse/keymaps/via/rules.mk
  23. 28 0
      keyboards/cannonkeys/ellipse/mcuconf.h
  24. 25 0
      keyboards/cannonkeys/ellipse/readme.md
  25. 2 0
      keyboards/cannonkeys/ellipse/rules.mk
  26. 94 0
      keyboards/cannonkeys/ellipse_hs/info.json
  27. 45 0
      keyboards/cannonkeys/ellipse_hs/keymaps/default/keymap.c
  28. 45 0
      keyboards/cannonkeys/ellipse_hs/keymaps/via/keymap.c
  29. 1 0
      keyboards/cannonkeys/ellipse_hs/keymaps/via/rules.mk
  30. 25 0
      keyboards/cannonkeys/ellipse_hs/readme.md
  31. 2 0
      keyboards/cannonkeys/ellipse_hs/rules.mk
  32. 64 0
      keyboards/controllerworks/mini36/config.h
  33. 22 0
      keyboards/controllerworks/mini36/halconf.h
  34. 154 0
      keyboards/controllerworks/mini36/info.json
  35. 79 0
      keyboards/controllerworks/mini36/keymaps/default/config.h
  36. 68 0
      keyboards/controllerworks/mini36/keymaps/default/keymap.c
  37. 79 0
      keyboards/controllerworks/mini36/keymaps/via/config.h
  38. 68 0
      keyboards/controllerworks/mini36/keymaps/via/keymap.c
  39. 1 0
      keyboards/controllerworks/mini36/keymaps/via/rules.mk
  40. 23 0
      keyboards/controllerworks/mini36/mcuconf.h
  41. 82 0
      keyboards/controllerworks/mini36/mini36.c
  42. 43 0
      keyboards/controllerworks/mini36/readme.md
  43. 3 0
      keyboards/controllerworks/mini36/rules.mk
  44. 61 45
      keyboards/han60/han60.h
  45. 341 317
      keyboards/han60/info.json
  46. 12 15
      keyboards/han60/keymaps/default/keymap.c
  47. 35 0
      keyboards/han60/keymaps/default_ansi_arrow_tsangan/keymap.c
  48. 35 0
      keyboards/han60/keymaps/default_ansi_tsangan/keymap.c
  49. 35 0
      keyboards/han60/keymaps/default_iso_arrow_tsangan/keymap.c
  50. 35 0
      keyboards/han60/keymaps/default_iso_tsangan/keymap.c
  51. 42 0
      keyboards/huytbt/h50/config.h
  52. 17 0
      keyboards/huytbt/h50/h50.c
  53. 35 0
      keyboards/huytbt/h50/h50.h
  54. 72 0
      keyboards/huytbt/h50/info.json
  55. 51 0
      keyboards/huytbt/h50/keymaps/default/keymap.c
  56. 51 0
      keyboards/huytbt/h50/keymaps/via/keymap.c
  57. 1 0
      keyboards/huytbt/h50/keymaps/via/rules.mk
  58. 27 0
      keyboards/huytbt/h50/readme.md
  59. 16 0
      keyboards/huytbt/h50/rules.mk
  60. 7 0
      keyboards/kprepublic/bm40hsrgb/keymaps/dan/config.h
  61. 48 41
      keyboards/kprepublic/bm40hsrgb/keymaps/dan/keymap.c
  62. 16 9
      keyboards/kprepublic/bm40hsrgb/keymaps/dan/readme.md
  63. 1 0
      keyboards/kprepublic/bm40hsrgb/keymaps/dan/rules.mk
  64. 4 1
      keyboards/macro3/info.json
  65. 2 2
      keyboards/macro3/keymaps/default/keymap.c
  66. 1 1
      keyboards/macro3/macro3.h
  67. 311 1
      keyboards/mechbrewery/mb65s/info.json
  68. 2 2
      keyboards/mechbrewery/mb65s/keymaps/ansi_blocker_7u_spc/keymap.c
  69. 1 1
      keyboards/mechbrewery/mb65s/keymaps/ansi_blocker_7u_spc/readme.md
  70. 3 3
      keyboards/mechbrewery/mb65s/keymaps/iso_blocker_tsangan/keymap.c
  71. 75 12
      keyboards/mechbrewery/mb65s/mb65s.h
  72. 0 2
      keyboards/mechbrewery/mb65s/rules.mk
  73. 79 1
      keyboards/mode/m65hi_alpha/info.json
  74. 26 26
      keyboards/mode/m65hi_alpha/keymaps/default/keymap.c
  75. 27 27
      keyboards/mode/m65hi_alpha/keymaps/via/keymap.c
  76. 33 1
      keyboards/mode/m65hi_alpha/m65hi_alpha.h
  77. 80 2
      keyboards/mwstudio/mw65_black/info.json
  78. 4 4
      keyboards/mwstudio/mw65_black/keymaps/default/keymap.c
  79. 4 4
      keyboards/mwstudio/mw65_black/keymaps/via/keymap.c
  80. 37 6
      keyboards/mwstudio/mw65_black/mw65_black.h
  81. 1 1
      keyboards/studiokestra/galatea/rev1/rev1.h
  82. 1 1
      keyboards/studiokestra/galatea/rev2/rev2.h

+ 1 - 1
docs/feature_key_lock.md

@@ -16,7 +16,7 @@ First, enable Key Lock by setting `KEY_LOCK_ENABLE = yes` in your `rules.mk`. Th
 
 ## Caveats
 
-Key Lock is only able to hold standard action keys and [One Shot modifier](one_shot_keys.md) keys (for example, if you have your Shift defined as `OSM(KC_LSFT)`).
+Key Lock is only able to hold standard action keys and [One Shot modifier](one_shot_keys.md) keys (for example, if you have your Shift defined as `OSM(MOD_LSFT)`).
 This does not include any of the QMK special functions (except One Shot modifiers), or shifted versions of keys such as `KC_LPRN`. If it's in the [Basic Keycodes](keycodes_basic.md) list, it can be held.
 
 Switching layers will not cancel the Key Lock. The Key Lock can be cancelled by calling the `cancel_key_lock()` function.

+ 1 - 1
docs/ja/feature_key_lock.md

@@ -21,7 +21,7 @@
 
 ## 注意事項
 
-キーロックは、標準アクションキーと[ワンショットモディファイア](ja/one_shot_keys.md)キー (例えば、Shift を `OSM(KC_LSFT)` と定義した場合)のみを押し続けることができます。
+キーロックは、標準アクションキーと[ワンショットモディファイア](ja/one_shot_keys.md)キー (例えば、Shift を `OSM(MOD_LSFT)` と定義した場合)のみを押し続けることができます。
 これは、QMK の特殊機能(ワンショットモディファイアを除く)、または `KC_LPRN` のような shift を押されたキーのバージョンは含みません。[基本的なキーコード](ja/keycodes_basic.md)リストにある場合、押したままにすることができます。
 
 レイヤーの切り替えは、キーロックを解除しません。

+ 1 - 1
docs/serial_driver.md

@@ -1,6 +1,6 @@
 # 'serial' Driver
 
-The serial driver powers the [Split Keyboard](feature_split_keyboard.md) feature. Several implementations are available, depending on the platform of your split keyboard. Note that none of the drivers support split keyboards with more then two halves.
+The serial driver powers the [Split Keyboard](feature_split_keyboard.md) feature. Several implementations are available, depending on the platform of your split keyboard. Note that none of the drivers support split keyboards with more than two halves.
 
 | Driver                                  | AVR                | ARM                | Connection between halves                                                                     |
 | --------------------------------------- | ------------------ | ------------------ | --------------------------------------------------------------------------------------------- |

+ 4 - 1
keyboards/a_dux/keymaps/daliusd/config.h

@@ -17,7 +17,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 #pragma once
 
-#define UNICODE_SELECTED_MODES UC_MAC, UC_LNX
+#define UNICODE_SELECTED_MODES UC_LNX
 
 #define MOUSEKEY_INTERVAL 12
 #define MOUSEKEY_MAX_SPEED 6
@@ -30,3 +30,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define MOUSEKEY_WHEEL_INTERVAL 50
 // The default is 40
 #define MOUSEKEY_WHEEL_TIME_TO_MAX 100
+
+#define FLOW_COUNT 6
+#define FLOW_LAYERS_COUNT 5

+ 336 - 0
keyboards/a_dux/keymaps/daliusd/flow.c

@@ -0,0 +1,336 @@
+/* Copyright 2022 @daliusd
+ *
+ * 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 "flow.h"
+
+extern const uint16_t flow_config[FLOW_COUNT][2];
+extern const uint16_t flow_layers_config[FLOW_LAYERS_COUNT][2];
+
+// Represents the states a flow key can be in
+typedef enum {
+    flow_up_unqueued,
+    flow_up_queued,
+    flow_up_queued_used,
+    flow_down_unused,
+    flow_down_used,
+} flow_state_t;
+
+#ifdef FLOW_ONESHOT_TERM
+const int g_flow_oneshot_term = FLOW_ONESHOT_TERM;
+#else
+const int g_flow_oneshot_term = 500;
+#endif
+
+#ifdef FLOW_ONESHOT_WAIT_TERM
+const int g_flow_oneshot_wait_term = FLOW_ONESHOT_WAIT_TERM;
+#else
+const int g_flow_oneshot_wait_term = 500;
+#endif
+
+flow_state_t flow_state[FLOW_COUNT] = { [0 ... FLOW_COUNT - 1] = flow_up_unqueued };
+bool flow_pressed[FLOW_COUNT][2] = { [0 ... FLOW_COUNT - 1] = {false, false} };
+uint16_t flow_timers[FLOW_COUNT] = { [0 ... FLOW_COUNT - 1] = 0 };
+bool flow_timeout_timers_active[FLOW_COUNT] = { [0 ... FLOW_COUNT - 1] = false };
+uint16_t flow_timeout_timers_value[FLOW_COUNT] = { [0 ... FLOW_COUNT - 1] = 0 };
+uint16_t flow_timeout_wait_timers_value[FLOW_COUNT] = { [0 ... FLOW_COUNT - 1] = 0 };
+
+flow_state_t flow_layers_state[FLOW_LAYERS_COUNT] = {
+    [0 ... FLOW_LAYERS_COUNT - 1] = flow_up_unqueued
+};
+bool flow_layer_timeout_timers_active[FLOW_LAYERS_COUNT] = { [0 ... FLOW_LAYERS_COUNT - 1] = false };
+uint16_t flow_layer_timeout_timers_value[FLOW_LAYERS_COUNT] = { [0 ... FLOW_LAYERS_COUNT - 1] = 0 };
+uint16_t flow_layer_timeout_wait_timers_value[FLOW_LAYERS_COUNT] = { [0 ... FLOW_LAYERS_COUNT - 1] = 0 };
+
+bool is_flow_ignored_key(uint16_t keycode) {
+    for (int i = 0; i < FLOW_COUNT; i++) {
+        if (flow_config[i][0] == keycode) {
+            return true;
+        }
+    }
+
+    for (int i = 0; i < FLOW_LAYERS_COUNT; i++) {
+        if (flow_layers_config[i][0] == keycode) {
+            return true;
+        }
+    }
+
+    if (keycode == KC_LSFT || keycode == KC_RSFT
+            || keycode == KC_LCTL || keycode == KC_RCTL
+            || keycode == KC_LALT || keycode == KC_RALT
+            || keycode == KC_LGUI || keycode == KC_RGUI) {
+        return true;
+    }
+
+    return false;
+}
+
+bool update_flow_mods(
+    uint16_t keycode,
+    bool pressed
+) {
+    bool pass = true;
+    bool flow_key_list_triggered[FLOW_COUNT] = { [0 ... FLOW_COUNT - 1] = false };
+    bool flow_key_list_pressed[FLOW_COUNT] = { [0 ... FLOW_COUNT - 1] = false };
+
+    bool flow_triggered = false;
+
+    for (uint8_t i = 0; i < FLOW_COUNT; i++) {
+        // Layer key
+        if (keycode == flow_config[i][0]) {
+            if (pressed) {
+                flow_pressed[i][0] = true;
+            } else {
+                flow_pressed[i][0] = false;
+            }
+        // KC mod key
+        } else if (keycode == flow_config[i][1]) {
+            if (pressed) {
+                if (flow_pressed[i][0]) {
+                    flow_pressed[i][1] = true;
+                    flow_key_list_triggered[i] = true;
+                    flow_triggered = true;
+                    flow_key_list_pressed[i] = true;
+                    pass = false;
+                 }
+            } else if (flow_pressed[i][1]) {
+                flow_pressed[i][1] = false;
+                if (flow_pressed[i][0]) {
+                    flow_key_list_triggered[i] = true;
+                    flow_triggered = true;
+                    pass = false;
+                } else if ((flow_state[i] == flow_down_unused)
+                        || (flow_state[i] == flow_down_used)) {
+                    flow_key_list_triggered[i] = true;
+                    flow_triggered = true;
+                    pass = false;
+                }
+            }
+        }
+    }
+
+    for (uint8_t i = 0; i < FLOW_COUNT; i++) {
+        if (flow_key_list_triggered[i]) {
+            if (flow_key_list_pressed[i]) {
+                if (flow_state[i] == flow_up_unqueued) {
+                    register_code(flow_config[i][1]);
+                }
+                flow_timeout_wait_timers_value[i] = timer_read();
+                flow_state[i] = flow_down_unused;
+            } else {
+                // Trigger keyup
+                switch (flow_state[i]) {
+                case flow_down_unused:
+                    if (!flow_pressed[i][1]) {
+                        if (timer_elapsed(flow_timeout_wait_timers_value[i]) > g_flow_oneshot_wait_term) {
+                            flow_state[i] = flow_up_unqueued;
+                            unregister_code(flow_config[i][1]);
+                        } else {
+                            // If we didn't use the mod while trigger was held, queue it.
+                            flow_state[i] = flow_up_queued;
+                            flow_timeout_timers_active[i] = true;
+                            flow_timeout_timers_value[i] = timer_read();
+                        }
+                    }
+                    break;
+                case flow_down_used:
+                    // If we did use the mod while trigger was held, unregister it.
+                    if (!flow_pressed[i][1]) {
+                        flow_state[i] = flow_up_unqueued;
+                        unregister_code(flow_config[i][1]);
+                    }
+                    break;
+                default:
+                    break;
+                }
+            }
+        } else if (!flow_triggered) {
+            if (pressed) {
+                if (!is_flow_ignored_key(keycode)) {
+                    switch (flow_state[i]) {
+                    case flow_up_queued:
+                        flow_state[i] = flow_up_queued_used;
+                        flow_timeout_timers_active[i] = false;
+                        break;
+                    case flow_up_queued_used:
+                        flow_state[i] = flow_up_unqueued;
+                        unregister_code(flow_config[i][1]);
+                        break;
+                    default:
+                        break;
+                    }
+                }
+            } else {
+                if (!is_flow_ignored_key(keycode)) {
+                    // On non-ignored keyup, consider the oneshot used.
+                    switch (flow_state[i]) {
+                    case flow_down_unused:
+                        flow_state[i] = flow_down_used;
+                        break;
+                    case flow_up_queued:
+                        flow_state[i] = flow_up_unqueued;
+                        unregister_code(flow_config[i][1]);
+                        break;
+                    case flow_up_queued_used:
+                        flow_state[i] = flow_up_unqueued;
+                        unregister_code(flow_config[i][1]);
+                        break;
+                    default:
+                        break;
+                    }
+                }
+            }
+        }
+    }
+
+    return pass;
+}
+
+void change_pressed_status(uint16_t keycode, bool pressed) {
+    for (int i = 0; i < FLOW_COUNT; i++) {
+        if (flow_config[i][0] == keycode) {
+            flow_pressed[i][0] = pressed;
+        }
+    }
+}
+
+bool update_flow_layers(
+    uint16_t keycode,
+    bool pressed,
+    keypos_t key_position
+) {
+    uint8_t key_layer = read_source_layers_cache(key_position);
+    bool pass = true;
+
+    for (int i = 0; i < FLOW_LAYERS_COUNT; i++) {
+        uint16_t trigger = flow_layers_config[i][0];
+        uint16_t layer = flow_layers_config[i][1];
+
+        if (keycode == trigger) {
+            if (pressed) {
+                // Trigger keydown
+                if (flow_layers_state[i] == flow_up_unqueued) {
+                    layer_on(layer);
+                    change_pressed_status(trigger, true);
+                }
+                flow_layer_timeout_wait_timers_value[i] = timer_read();
+                flow_layers_state[i] = flow_down_unused;
+                pass = false;
+            } else {
+                // Trigger keyup
+                switch (flow_layers_state[i]) {
+                case flow_down_unused:
+                    if (timer_elapsed(flow_layer_timeout_wait_timers_value[i]) > g_flow_oneshot_wait_term) {
+                        flow_layers_state[i] = flow_up_unqueued;
+                        layer_off(layer);
+                        change_pressed_status(trigger, false);
+                        pass = false;
+                    } else {
+                        // If we didn't use the layer while trigger was held, queue it.
+                        flow_layers_state[i] = flow_up_queued;
+                        flow_layer_timeout_timers_active[i] = true;
+                        flow_layer_timeout_timers_value[i] = timer_read();
+                        pass = false;
+                        change_pressed_status(trigger, true);
+                    }
+                    break;
+                case flow_down_used:
+                    // If we did use the layer while trigger was held, turn off it.
+                    flow_layers_state[i] = flow_up_unqueued;
+                    layer_off(layer);
+                    change_pressed_status(trigger, false);
+                    pass = false;
+                    break;
+                default:
+                    break;
+                }
+            }
+        } else {
+            if (pressed) {
+                if (key_layer == layer) {
+                    // On non-ignored keyup, consider the oneshot used.
+                    switch (flow_layers_state[i]) {
+                    case flow_down_unused:
+                        flow_layers_state[i] = flow_down_used;
+                        break;
+                    case flow_up_queued:
+                        flow_layers_state[i] = flow_up_queued_used;
+                        flow_layer_timeout_timers_active[i] = false;
+                        break;
+                   case flow_up_queued_used:
+                        flow_layers_state[i] = flow_up_unqueued;
+                        layer_off(layer);
+                        change_pressed_status(trigger, false);
+                        pass = false;
+                        break;
+                    default:
+                        break;
+                    }
+                }
+            } else {
+                // Ignore key ups from other layers
+                if (key_layer == layer) {
+                    // On non-ignored keyup, consider the oneshot used.
+                    switch (flow_layers_state[i]) {
+                    case flow_up_queued:
+                        flow_layers_state[i] = flow_up_unqueued;
+                        layer_off(layer);
+                        change_pressed_status(trigger, false);
+                        break;
+                    case flow_up_queued_used:
+                        flow_layers_state[i] = flow_up_unqueued;
+                        layer_off(layer);
+                        change_pressed_status(trigger, false);
+                        break;
+                    default:
+                        break;
+                    }
+                }
+            }
+        }
+    }
+
+    return pass;
+}
+
+bool update_flow(
+    uint16_t keycode,
+    bool pressed,
+    keypos_t key_position
+) {
+    bool pass = update_flow_mods(keycode, pressed);
+    pass = update_flow_layers(keycode, pressed, key_position) & pass;
+    return pass;
+}
+
+void flow_matrix_scan(void) {
+    for (int i = 0; i < FLOW_COUNT; i++) {
+        if (flow_timeout_timers_active[i]
+                && timer_elapsed(flow_timeout_timers_value[i]) > g_flow_oneshot_term) {
+            flow_timeout_timers_active[i] = false;
+            flow_state[i] = flow_up_unqueued;
+            unregister_code(flow_config[i][1]);
+        }
+    }
+
+    for (int i = 0; i < FLOW_LAYERS_COUNT; i++) {
+        if (flow_layer_timeout_timers_active[i]
+                && timer_elapsed(flow_layer_timeout_timers_value[i]) > g_flow_oneshot_term) {
+            flow_layer_timeout_timers_active[i] = false;
+            flow_layers_state[i] = flow_up_unqueued;
+            layer_off(flow_layers_config[i][1]);
+            change_pressed_status(flow_layers_config[i][0], false);
+        }
+    }
+}

+ 27 - 0
keyboards/a_dux/keymaps/daliusd/flow.h

@@ -0,0 +1,27 @@
+/*
+Copyright 2022 Dalius Dobravolskas <dalius.dobravolskas@gmail.com>
+
+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 QMK_KEYBOARD_H
+
+bool update_flow(
+    uint16_t keycode,
+    bool pressed,
+    keypos_t key_position
+);
+
+void flow_matrix_scan(void);

+ 102 - 117
keyboards/a_dux/keymaps/daliusd/keymap.c

@@ -15,7 +15,7 @@
  */
 #include QMK_KEYBOARD_H
 
-#include "oneshot.h"
+#include "flow.h"
 
 // Each layer gets a name for readability, which is then used in the keymap matrix below.
 // The underscores don't mean anything - you can have a layer called STUFF or any other name.
@@ -25,11 +25,12 @@ enum layers {
     _QWERTY,
     _SYM,
     _NAV,
-    _NUMB,
+    _MISC,
     _TMUX,
     _MOUSE,
-    _MISC,
     _FUNC,
+    _LT_MAC,
+    _LT_LINUX,
 };
 
 enum custom_keycodes {
@@ -41,22 +42,40 @@ enum custom_keycodes {
   TM_SLCT,
   TM_SRCH,
   TM_URL,
-  OS_CTRL,
-  OS_ALT,
-  OS_GUI,
-  OS_TMUX,
   OS_MISC,
+  OS_TMUX,
   OS_FUNC,
+  LT_OSLNX,
 };
 
 // Shortcut to make keymap more readable
 
 #define L_NAV       MO(_NAV)
 #define L_SYM       MO(_SYM)
-#define L_MOUSE     TG(_MOUSE)
+#define L_MOUSE     MO(_MOUSE)
 
 #define K_PRINT     (QK_LCTL | QK_LSFT | QK_LGUI | KC_4)
+#define K_VIDEO     (QK_LSFT | QK_LGUI | KC_5)
+
+// flow_config should correspond to following format:
+// * layer keycode
+// * modifier keycode
+const uint16_t flow_config[FLOW_COUNT][2] = {
+    {L_NAV, KC_LALT},
+    {L_NAV, KC_LGUI},
+    {L_NAV, KC_LCTL},
+    {L_SYM, KC_RCTL},
+    {L_SYM, KC_RGUI},
+    {L_SYM, KC_RALT},
+};
 
+const uint16_t flow_layers_config[FLOW_LAYERS_COUNT][2] = {
+    {OS_MISC, _MISC},
+    {OS_TMUX, _TMUX},
+    {OS_FUNC, _FUNC},
+};
+
+// Unicode characters
 enum unicode_names {
     SNEK,
     EURO,
@@ -96,7 +115,7 @@ const uint32_t PROGMEM unicode_map[] = {
     [LT_S_I] = 0x12f, // į
     [LT_L_I] = 0x12e, // Į
     [LT_S_S] = 0x161, // š
-    [LT_L_S] = 0x160, // Š'
+    [LT_L_S] = 0x160, // Š
     [LT_S_U1] = 0x173, // ų
     [LT_L_U1] = 0x172, // Ų
     [LT_S_U2] = 0x16b, // ū
@@ -110,14 +129,23 @@ const uint32_t PROGMEM unicode_map[] = {
 #define K_SNEK      X(SNEK)
 #define K_EURO      X(EURO)
 #define K_LT_A      XP(LT_S_A, LT_L_A)
+#define K_LT_AU     X(LT_L_A)
 #define K_LT_C      XP(LT_S_C, LT_L_C)
+#define K_LT_CU     X(LT_L_C)
 #define K_LT_E1     XP(LT_S_E1, LT_L_E1)
+#define K_LT_E1U    X(LT_L_E1)
 #define K_LT_E2     XP(LT_S_E2, LT_L_E2)
+#define K_LT_E2U    X(LT_L_E2)
 #define K_LT_I      XP(LT_S_I, LT_L_I)
+#define K_LT_IU     X(LT_L_I)
 #define K_LT_S      XP(LT_S_S, LT_L_S)
+#define K_LT_SU     X(LT_L_S)
 #define K_LT_U1     XP(LT_S_U1, LT_L_U1)
+#define K_LT_U1U    X(LT_L_U1)
 #define K_LT_U2     XP(LT_S_U2, LT_L_U2)
+#define K_LT_U2U    X(LT_L_U2)
 #define K_LT_Z      XP(LT_S_Z, LT_L_Z)
+#define K_LT_ZU     X(LT_L_Z)
 #define K_LT_OB     X(LT_OB)
 #define K_LT_CB     X(LT_CB)
 
@@ -139,35 +167,35 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
   //┌────────┬────────┬────────┬────────┬────────┐                         ┌────────┬────────┬────────┬────────┬────────┐
      KC_EXLM ,KC_AT   ,KC_HASH ,KC_DLR  ,KC_PERC ,                          KC_CIRC ,KC_AMPR ,KC_ASTR ,KC_LPRN ,KC_RPRN ,
   //├────────┼────────┼────────┼────────┼────────┤                         ├────────┼────────┼────────┼────────┼────────┤
-     KC_GRV  ,KC_PLUS ,KC_LBRC ,KC_RBRC ,K_LT_OB ,                          KC_MINS ,OS_ALT  ,OS_CTRL ,OS_GUI  ,KC_PIPE ,
+     XXXXXXX ,KC_GRV  ,KC_LBRC ,KC_RBRC ,KC_PLUS ,                          KC_MINS ,KC_PIPE ,KC_RCTL ,KC_RGUI ,KC_RALT ,
   //├────────┼────────┼────────┼────────┼────────┤                         ├────────┼────────┼────────┼────────┼────────┤
-     K_SNEK  ,KC_EQL  ,KC_LCBR ,KC_RCBR ,K_LT_CB ,                          KC_UNDS ,KC_QUOT ,KC_DQT  ,K_EURO  ,KC_BSLS ,
+     KC_DEL  ,KC_BSPC ,KC_LCBR ,KC_RCBR ,KC_EQL  ,                          KC_UNDS ,KC_QUOT ,KC_DQT  ,OS_MISC ,KC_BSLS ,
   //└────────┴────────┴────────┴────┬───┴────┬───┼────────┐       ┌────────┼───┬────┴───┬────┴────────┴────────┴────────┘
-                                     _______ ,    _______ ,        _______ ,    _______
+                                     _______ ,    _______ ,        _______ ,    XXXXXXX
   //                                └────────┘   └────────┘       └────────┘   └────────┘
   ),
 
   [_NAV] = LAYOUT(
   //┌────────┬────────┬────────┬────────┬────────┐                         ┌────────┬────────┬────────┬────────┬────────┐
-     KC_TILDE,L_MOUSE ,OS_FUNC ,OS_MISC ,OS_TMUX ,                          K_LT_A  ,K_LT_C  ,K_LT_E1 ,K_LT_E2 ,K_LT_I  ,
+     KC_1    ,KC_2    ,KC_3    ,KC_4    ,KC_5    ,                          KC_6    ,KC_7    ,KC_8    ,KC_9    ,KC_0    ,
   //├────────┼────────┼────────┼────────┼────────┤                         ├────────┼────────┼────────┼────────┼────────┤
-     KC_TAB  ,OS_GUI  ,OS_CTRL ,OS_ALT  ,KC_ENT  ,                          KC_LEFT ,KC_DOWN ,KC_UP   ,KC_RIGHT,KC_END  ,
+     KC_LALT ,KC_LGUI ,KC_LCTL ,KC_TAB  ,KC_ENT  ,                          KC_LEFT ,KC_DOWN ,KC_UP   ,KC_RIGHT,KC_PGUP ,
   //├────────┼────────┼────────┼────────┼────────┤                         ├────────┼────────┼────────┼────────┼────────┤
-     KC_DELT ,KC_BSPC ,KC_ESC  ,KC_PGDN ,KC_PGUP ,                          KC_HOME ,K_LT_S  ,K_LT_U1 ,K_LT_U2 ,K_LT_Z  ,
+     KC_LSFT ,KC_BSPC ,KC_ESC  ,KC_TILDE,OS_TMUX ,                          OS_FUNC ,L_MOUSE ,KC_COMM ,KC_DOT  ,KC_PGDN ,
   //└────────┴────────┴────────┴────┬───┴────┬───┼────────┐       ┌────────┼───┬────┴───┬────┴────────┴────────┴────────┘
-                                     _______ ,    _______ ,        _______ ,    _______
+                                     XXXXXXX ,    _______ ,        _______ ,    _______
   //                                └────────┘   └────────┘       └────────┘   └────────┘
   ),
 
-  [_NUMB] = LAYOUT(
+  [_MISC] = LAYOUT(
   //┌────────┬────────┬────────┬────────┬────────┐                         ┌────────┬────────┬────────┬────────┬────────┐
-     KC_1    ,KC_2    ,KC_3    ,KC_4    ,KC_5    ,                          XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,
+     RESET   ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,                          KC_BRID ,KC_BRIU ,KC_PSCR ,XXXXXXX ,K_PRINT ,
   //├────────┼────────┼────────┼────────┼────────┤                         ├────────┼────────┼────────┼────────┼────────┤
-     KC_6    ,KC_7    ,KC_8    ,KC_9    ,KC_0    ,                          XXXXXXX ,OS_ALT  ,OS_CTRL ,OS_GUI  ,XXXXXXX ,
+     XXXXXXX ,XXXXXXX ,DEBUG   ,LT_OSLNX,XXXXXXX ,                          KC_MPRV ,KC_MPLY ,KC_MNXT ,XXXXXXX ,K_VIDEO ,
   //├────────┼────────┼────────┼────────┼────────┤                         ├────────┼────────┼────────┼────────┼────────┤
-     KC_DELT ,KC_BSPC ,XXXXXXX ,XXXXXXX ,XXXXXXX ,                          XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,
+     XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,                          KC_VOLD ,KC_VOLU ,XXXXXXX ,XXXXXXX ,XXXXXXX ,
   //└────────┴────────┴────────┴────┬───┴────┬───┼────────┐       ┌────────┼───┬────┴───┬────┴────────┴────────┴────────┘
-                                     _______ ,    _______ ,        _______ ,    _______
+                                     XXXXXXX ,    XXXXXXX ,        XXXXXXX ,    XXXXXXX
   //                                └────────┘   └────────┘       └────────┘   └────────┘
   ),
 
@@ -185,127 +213,59 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 
   [_MOUSE] = LAYOUT(
   //┌────────┬────────┬────────┬────────┬────────┐                         ┌────────┬────────┬────────┬────────┬────────┐
-     XXXXXXX ,L_MOUSE ,KC_MS_U ,KC_BTN3 ,KC_WH_U ,                          XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,
+     XXXXXXX ,XXXXXXX ,KC_MS_U ,KC_BTN3 ,KC_WH_U ,                          XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,
   //├────────┼────────┼────────┼────────┼────────┤                         ├────────┼────────┼────────┼────────┼────────┤
-     XXXXXXX ,KC_MS_L ,KC_MS_D ,KC_MS_R ,KC_WH_D ,                          XXXXXXX ,KC_LALT ,KC_LCTL ,KC_LGUI ,XXXXXXX ,
+     XXXXXXX ,KC_MS_L ,KC_MS_D ,KC_MS_R ,KC_WH_D ,                          XXXXXXX ,XXXXXXX ,KC_RCTL ,KC_RGUI ,KC_RALT ,
   //├────────┼────────┼────────┼────────┼────────┤                         ├────────┼────────┼────────┼────────┼────────┤
-     XXXXXXX ,XXXXXXX ,KC_ESC  ,XXXXXXX ,XXXXXXX ,                          XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,
+     XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,                          XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,
   //└────────┴────────┴────────┴────┬───┴────┬───┼────────┐       ┌────────┼───┬────┴───┬────┴────────┴────────┴────────┘
-                                     KC_BTN1 ,    KC_BTN2 ,        XXXXXXX ,    XXXXXXX
+                                     KC_BTN1 ,    KC_BTN2 ,        _______ ,    XXXXXXX
   //                                └────────┘   └────────┘       └────────┘   └────────┘
   ),
 
-  [_MISC] = LAYOUT(
+  [_FUNC] = LAYOUT(
   //┌────────┬────────┬────────┬────────┬────────┐                         ┌────────┬────────┬────────┬────────┬────────┐
-     QK_BOOT,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,                          KC_BRID ,KC_BRIU ,XXXXXXX ,KC_PSCR ,K_PRINT ,
+     KC_F1   ,KC_F2   ,KC_F3   ,KC_F4   ,KC_F5   ,                          XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,
   //├────────┼────────┼────────┼────────┼────────┤                         ├────────┼────────┼────────┼────────┼────────┤
-     XXXXXXX ,XXXXXXX ,DB_TOGG ,XXXXXXX ,XXXXXXX ,                          KC_MPRV ,KC_MPLY ,XXXXXXX ,KC_MNXT ,XXXXXXX ,
+     KC_F6   ,KC_F7   ,KC_F8   ,KC_F9   ,KC_F10  ,                          XXXXXXX ,XXXXXXX ,KC_RCTL ,KC_RGUI ,KC_RALT ,
   //├────────┼────────┼────────┼────────┼────────┤                         ├────────┼────────┼────────┼────────┼────────┤
-     XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,                          KC_VOLD ,KC_VOLU ,XXXXXXX ,XXXXXXX ,UC_MOD  ,
+     KC_F11  ,KC_F12  ,XXXXXXX ,XXXXXXX ,XXXXXXX ,                          XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,
   //└────────┴────────┴────────┴────┬───┴────┬───┼────────┐       ┌────────┼───┬────┴───┬────┴────────┴────────┴────────┘
                                      XXXXXXX ,    XXXXXXX ,        XXXXXXX ,    XXXXXXX
   //                                └────────┘   └────────┘       └────────┘   └────────┘
   ),
 
-  [_FUNC] = LAYOUT(
+  [_LT_MAC] = LAYOUT(
   //┌────────┬────────┬────────┬────────┬────────┐                         ┌────────┬────────┬────────┬────────┬────────┐
-     XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,                          KC_F1   ,KC_F2   ,KC_F3   ,KC_F4   ,KC_F5   ,
+     KC_EXLM ,KC_AT   ,KC_HASH ,KC_DLR  ,KC_PERC ,                          KC_CIRC ,KC_AMPR ,KC_ASTR ,KC_PLUS ,XXXXXXX ,
   //├────────┼────────┼────────┼────────┼────────┤                         ├────────┼────────┼────────┼────────┼────────┤
-     XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,                          KC_F6   ,KC_F7   ,KC_F8   ,KC_F9   ,KC_F10  ,
+     KC_1    ,KC_2    ,KC_3    ,KC_4    ,KC_5    ,                          KC_6    ,KC_7    ,KC_8    ,KC_EQL  ,XXXXXXX ,
   //├────────┼────────┼────────┼────────┼────────┤                         ├────────┼────────┼────────┼────────┼────────┤
-     XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,                          KC_F11  ,KC_F12  ,XXXXXXX ,XXXXXXX ,XXXXXXX ,
+     XXXXXXX ,KC_BSPC ,XXXXXXX ,XXXXXXX ,XXXXXXX ,                          XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,
   //└────────┴────────┴────────┴────┬───┴────┬───┼────────┐       ┌────────┼───┬────┴───┬────┴────────┴────────┴────────┘
-                                     XXXXXXX ,    XXXXXXX ,        XXXXXXX ,    XXXXXXX
+                                     XXXXXXX ,    XXXXXXX ,        _______ ,    XXXXXXX
+  //                                └────────┘   └────────┘       └────────┘   └────────┘
+  ),
+
+  [_LT_LINUX] = LAYOUT(
+  //┌────────┬────────┬────────┬────────┬────────┐                         ┌────────┬────────┬────────┬────────┬────────┐
+     K_LT_AU ,K_LT_CU ,K_LT_E1U,K_LT_E2U,K_LT_IU ,                          K_LT_SU ,K_LT_U1U,K_LT_U2U,K_LT_ZU ,XXXXXXX ,
+  //├────────┼────────┼────────┼────────┼────────┤                         ├────────┼────────┼────────┼────────┼────────┤
+     K_LT_A  ,K_LT_C  ,K_LT_E1 ,K_LT_E2 ,K_LT_I  ,                          K_LT_S  ,K_LT_U1 ,K_LT_U2 ,K_LT_Z  ,XXXXXXX ,
+  //├────────┼────────┼────────┼────────┼────────┤                         ├────────┼────────┼────────┼────────┼────────┤
+     XXXXXXX ,KC_BSPC ,XXXXXXX ,K_SNEK  ,K_LT_OB ,                          K_LT_CB ,K_EURO  ,XXXXXXX ,XXXXXXX ,XXXXXXX ,
+  //└────────┴────────┴────────┴────┬───┴────┬───┼────────┐       ┌────────┼───┬────┴───┬────┴────────┴────────┴────────┘
+                                     XXXXXXX ,    XXXXXXX ,        _______ ,    XXXXXXX
   //                                └────────┘   └────────┘       └────────┘   └────────┘
   ),
 };
 
 #define TMUX_PREFIX SS_DOWN(X_LCTL) "b" SS_UP(X_LCTL)
 
-bool is_oneshot_cancel_key(uint16_t keycode) {
-    switch (keycode) {
-    case L_SYM:
-    case L_NAV:
-        return true;
-    default:
-        return false;
-    }
-}
-
-bool is_oneshot_layer_cancel_key(uint16_t keycode) {
-    switch (keycode) {
-    case L_SYM:
-    case L_NAV:
-        return true;
-    default:
-        return false;
-    }
-}
-
-bool is_oneshot_ignored_key(uint16_t keycode) {
-    switch (keycode) {
-    case L_SYM:
-    case L_NAV:
-    case OS_CTRL:
-    case OS_ALT:
-    case OS_GUI:
-    case OS_TMUX:
-    case OS_MISC:
-    case KC_LSFT:
-        return true;
-    default:
-        return false;
-    }
-}
-
-bool is_oneshot_mod_key(uint16_t keycode) {
-    switch (keycode) {
-    case OS_CTRL:
-    case OS_ALT:
-    case OS_GUI:
-        return true;
-    default:
-        return false;
-    }
-}
-
-oneshot_state os_ctrl_state = os_up_unqueued;
-oneshot_state os_alt_state = os_up_unqueued;
-oneshot_state os_cmd_state = os_up_unqueued;
-oneshot_state os_tmux_state = os_up_unqueued;
-oneshot_state os_misc_state = os_up_unqueued;
-oneshot_state os_func_state = os_up_unqueued;
+bool lt_os_is_linux = false;
 
 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
-    update_oneshot(
-        &os_ctrl_state, KC_LCTL, OS_CTRL,
-        keycode, record
-    );
-    update_oneshot(
-        &os_alt_state, KC_LALT, OS_ALT,
-        keycode, record
-    );
-    update_oneshot(
-        &os_cmd_state, KC_LGUI, OS_GUI,
-        keycode, record
-    );
-
-    bool handled = true;
-    handled = update_oneshot_layer(
-        &os_tmux_state, _TMUX, OS_TMUX,
-        keycode, record
-    ) & handled;
-
-    handled = update_oneshot_layer(
-        &os_misc_state, _MISC, OS_MISC,
-        keycode, record
-    ) & handled;
-
-    handled = update_oneshot_layer(
-        &os_func_state, _FUNC, OS_FUNC,
-        keycode, record
-    ) & handled;
-    if (!handled) return false;
+    if (!update_flow(keycode, record->event.pressed, record->event.key)) return false;
 
     switch (keycode) {
         case TM_LEFT:
@@ -340,10 +300,35 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
             if (!record->event.pressed) return true;
             SEND_STRING(TMUX_PREFIX SS_LCTL("u"));
             return false;
+        case LT_OSLNX:
+            if (!record->event.pressed) return true;
+            lt_os_is_linux = !lt_os_is_linux;
+            return false;
     }
     return true;
 }
 
+void matrix_scan_user(void) {
+    flow_matrix_scan();
+}
+
+bool lang_layer_on = false;
+
 layer_state_t layer_state_set_user(layer_state_t state) {
-    return update_tri_layer_state(state, _SYM, _NAV, _NUMB);
+    state = update_tri_layer_state(state, _SYM, _NAV, lt_os_is_linux ? _LT_LINUX : _LT_MAC);
+
+    uint8_t hl = get_highest_layer(state);
+    if (hl == _LT_MAC) {
+        if (!lang_layer_on) {
+            tap_code16(LCTL(KC_SPC));
+            lang_layer_on = true;
+        }
+    } else {
+        if (lang_layer_on) {
+            tap_code16(LCTL(KC_SPC));
+            lang_layer_on = false;
+        }
+    }
+
+    return state;
 }

+ 0 - 195
keyboards/a_dux/keymaps/daliusd/oneshot.c

@@ -1,195 +0,0 @@
-/* Copyright 2021 @daliusd
- *
- * 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 "print.h"
-#include "oneshot.h"
-
-void update_oneshot(
-    oneshot_state *state,
-    uint16_t mod,
-    uint16_t trigger,
-    uint16_t keycode,
-    keyrecord_t *record
-) {
-    if (keycode == trigger) {
-        if (record->event.pressed) {
-            // Trigger keydown
-            if (*state == os_up_unqueued) {
-                register_code(mod);
-            }
-            *state = os_down_unused;
-            dprintf("trigger down (on?), mod: %d, ? -> os_down_unused\n", mod);
-        } else {
-            // Trigger keyup
-            switch (*state) {
-            case os_down_unused:
-                // If we didn't use the mod while trigger was held, queue it.
-                *state = os_up_queued;
-                dprintf("trigger up, mod: %d, os_down_unused -> os_up_queued\n", mod);
-                break;
-            case os_down_used:
-                // If we did use the mod while trigger was held, unregister it.
-                *state = os_up_unqueued;
-                unregister_code(mod);
-                dprintf("trigger up (off), mod: %d, os_down_used -> os_up_unqueued\n", mod);
-                break;
-            default:
-                break;
-            }
-        }
-    } else {
-        if (record->event.pressed) {
-            if (is_oneshot_cancel_key(keycode) && *state != os_up_unqueued) {
-                // Cancel oneshot on designated cancel keydown.
-                *state = os_up_unqueued;
-                unregister_code(mod);
-                dprintf("cancel (off), mod: %d, ? -> os_up_unqueued\n", mod);
-            }
-            if (!is_oneshot_ignored_key(keycode)) {
-                switch (*state) {
-                case os_up_queued:
-                    *state = os_up_queued_used;
-                    dprintf("key up (off), mod: %d, os_up_queued -> os_up_queued_used\n", mod);
-                    break;
-                case os_up_queued_used:
-                    *state = os_up_unqueued;
-                    unregister_code(mod);
-                    dprintf("key up (off), mod: %d, os_up_queued_used -> os_up_unqueued\n", mod);
-                    break;
-                default:
-                    break;
-                }
-            }
-        } else {
-            if (!is_oneshot_ignored_key(keycode)) {
-                // On non-ignored keyup, consider the oneshot used.
-                switch (*state) {
-                case os_down_unused:
-                    *state = os_down_used;
-                    dprintf("key up, mod: %d, os_down_unused -> os_down_used\n", mod);
-                    break;
-                case os_up_queued:
-                    *state = os_up_unqueued;
-                    unregister_code(mod);
-                    dprintf("key up (off), mod: %d, os_up_queued -> os_up_unqueued\n", mod);
-                    break;
-                case os_up_queued_used:
-                    *state = os_up_unqueued;
-                    unregister_code(mod);
-                    dprintf("key up (off), mod: %d, os_up_queued_used -> os_up_unqueued\n", mod);
-                    break;
-                default:
-                    break;
-                }
-            }
-        }
-    }
-}
-
-bool update_oneshot_layer(
-    oneshot_state *state,
-    uint16_t layer,
-    uint16_t trigger,
-    uint16_t keycode,
-    keyrecord_t *record
-) {
-    if (keycode == trigger) {
-        if (record->event.pressed) {
-            // Trigger keydown
-            if (*state == os_up_unqueued) {
-                layer_on(layer);
-            }
-            *state = os_down_unused;
-            dprintf("trigger down (on?), layer: %d, ? -> os_down_unused\n", layer);
-            return false;
-        } else {
-            // Trigger keyup
-            switch (*state) {
-            case os_down_unused:
-                // If we didn't use the layer while trigger was held, queue it.
-                *state = os_up_queued;
-                dprintf("trigger up, layer: %d, os_down_unused -> os_up_queued\n", layer);
-                return false;
-            case os_down_used:
-                // If we did use the layer while trigger was held, turn off it.
-                *state = os_up_unqueued;
-                layer_off(layer);
-                dprintf("trigger up (off), layer: %d, os_down_used -> os_up_unqueued\n", layer);
-                return false;
-            default:
-                break;
-            }
-        }
-    } else {
-        if (record->event.pressed) {
-            if (is_oneshot_layer_cancel_key(keycode) && *state != os_up_unqueued) {
-                // Cancel oneshot layer on designated cancel keydown.
-                *state = os_up_unqueued;
-                layer_off(layer);
-                dprintf("cancel (off), layer: %d, ? -> os_up_unqueued\n", layer);
-                return false;
-            }
-            uint8_t key_layer = read_source_layers_cache(record->event.key);
-            if (key_layer == layer) {
-                // On non-ignored keyup, consider the oneshot used.
-                switch (*state) {
-                case os_down_unused:
-                    *state = os_down_used;
-                    dprintf("key down, layer: %d, os_down_unused -> os_down_used\n", layer);
-                    return true;
-                case os_up_queued:
-                    if (is_oneshot_mod_key(keycode)) {
-                        *state = os_up_unqueued;
-                        layer_off(layer);
-                        dprintf("key down, layer: %d, os_up_queued -> os_up_unqueued\n", layer);
-                        return false;
-                    } else {
-                        *state = os_up_queued_used;
-                        dprintf("key down, layer: %d, os_up_queued -> os_up_queued_used\n", layer);
-                    }
-                    return true;
-               case os_up_queued_used:
-                    *state = os_up_unqueued;
-                    layer_off(layer);
-                    dprintf("key down (off), layer: %d, os_up_queued_used -> os_up_unqueued\n", layer);
-                    return false;
-                default:
-                    break;
-                }
-            }
-        } else {
-            // Ignore key ups from other layers
-            uint8_t key_layer = read_source_layers_cache(record->event.key);
-            if (key_layer == layer) {
-                // On non-ignored keyup, consider the oneshot used.
-                switch (*state) {
-                case os_up_queued:
-                    *state = os_up_unqueued;
-                    layer_off(layer);
-                    dprintf("key up (off), layer: %d, os_up_queued -> os_up_unqueued\n", layer);
-                    return true;
-                case os_up_queued_used:
-                    *state = os_up_unqueued;
-                    layer_off(layer);
-                    dprintf("key up (off), layer: %d, os_up_queued_used -> os_up_unqueued\n", layer);
-                    return true;
-                default:
-                    break;
-                }
-            }
-        }
-    }
-    return true;
-}

+ 0 - 65
keyboards/a_dux/keymaps/daliusd/oneshot.h

@@ -1,65 +0,0 @@
-/* Copyright 2021 @daliusd
- *
- * 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 QMK_KEYBOARD_H
-
-// Represents the four states a oneshot key can be in
-typedef enum {
-    os_up_unqueued,
-    os_up_queued,
-    os_up_queued_used,
-    os_down_unused,
-    os_down_used,
-} oneshot_state;
-
-// Custom oneshot mod implementation that doesn't rely on timers. If a mod is
-// used while it is held it will be unregistered on keyup as normal, otherwise
-// it will be queued and only released after the next non-mod keyup.
-void update_oneshot(
-    oneshot_state *state,
-    uint16_t mod,
-    uint16_t trigger,
-    uint16_t keycode,
-    keyrecord_t *record
-);
-
-// Oneshot implementation for layers
-bool update_oneshot_layer(
-    oneshot_state *state,
-    uint16_t layer,
-    uint16_t trigger,
-    uint16_t keycode,
-    keyrecord_t *record
-);
-
-// To be implemented by the consumer. Layers one shot implementation needs to
-// know which keys are used as oneshot mods
-bool is_oneshot_mod_key(
-    uint16_t keycode
-);
-
-// To be implemented by the consumer. Defines keys to cancel oneshot mods.
-bool is_oneshot_cancel_key(uint16_t keycode);
-
-// To be implemented by the consumer. Defines keys to cancel oneshot layers.
-bool is_oneshot_layer_cancel_key(uint16_t keycode);
-
-// To be implemented by the consumer. Defines keys to ignore when determining
-// whether a oneshot mod has been used. Setting this to modifiers and layer
-// change keys allows stacking multiple oneshot modifiers, and carrying them
-// between layers.
-bool is_oneshot_ignored_key(uint16_t keycode);

+ 292 - 7
keyboards/a_dux/keymaps/daliusd/readme.md

@@ -1,21 +1,306 @@
 # My 34 keys layout
 
-This are my principles for layout:
+This is my principles for layout:
 
 * I am using Callum style layout. Here you can read explanation by
   Callum himself and his reasoning for not using mod-tap:
   [here](../../../../users/callum/readme.md)
 
 * There should be only one way to type key. Key can be on
-  different layer but it must maintain its physical location.
+  different layer but it must maintain its physical location. I
+  broke this rule for Shift key only.
 
 * The less features are used the better.
 
-* trilayer is cool.
+* There is simple TMUX layer.
 
-* There is 🐍 key for no reason.
+* Common keys must be accessible using two keys if possible.
 
-As well I have added one shot layers compatible with Callum's one
-shot keys.
+* It should be possible to work with left keyboard side and mouse
+  in right hand without lifting hands for some scenarios (that's
+  why I had to duplicate Shift key).
 
-There is simple TMUX layer as well.
+## Improvements over Callum
+
+* I have added one shot layers compatible with Callum's one shot
+  keys.
+
+* There is one issue with accidental uppercase characters fixed
+  that exists in original Callum layout's implementation.
+
+* Another annoying feature of Callum layer is one shot keys are
+  frozen until you cancel them. This is problem when you use one
+  hand for keyboard and another for mouse. E.g. you click Ctrl and
+  mouse to get some menu (on Mac OS X), and then you want to click
+  some item in that menu. You have to remember to cancel one shot in such
+  situation. I have added two settings two handle situations like
+  this:
+
+  * `FLOW_ONESHOT_WAIT_TERM` - if hold one shot key longer than
+    `FLOW_ONESHOT_WAIT_TERM` ms then mod key / layer key is not
+    treated as one shot key (defaults to 500ms).
+
+  * `FLOW_ONESHOT_TERM` - if you do not click another key in
+  `FLOW_ONESHOT_TERM` ms then one shot key / layer key is treated
+  as normal key. Therefore if you lift it after `FLOW_ONESHOT_TERM`
+  it will not be treated as one shot (defaults to 500ms).
+
+  After adding those two settings I have found out that I don't
+  need one shot cancel key anymore so I have removed it.
+
+Since differences are significant I named this layout `flow`.
+
+## Using flow with your keyboard
+
+Copy `flow.c` and `flow.h` to keyboard folder.
+
+Add following line to `rules.mk`:
+
+```make
+SRC += flow.c
+```
+
+Define following in `config.h` for modifiers and layers:
+
+```c
+#define FLOW_COUNT 7
+#define FLOW_LAYERS_COUNT 3
+```
+
+In your `keymap.c` add and configure like this:
+
+```c
+#include "flow.h"
+
+...
+
+// flow_config should correspond to following format:
+// * layer keycode
+// * modifier keycode
+const uint16_t flow_config[FLOW_COUNT][2] = {
+    {L_NAV, KC_LALT},
+    {L_NAV, KC_LGUI},
+    {L_NAV, KC_LCTL},
+    {L_NAV, KC_LSFT},
+    {L_SYM, KC_LCTL},
+    {L_SYM, KC_LGUI},
+    {L_SYM, KC_LALT},
+};
+
+
+// for layers configuration follow this format:
+// * custom layer key
+// * layer name
+const uint16_t flow_layers_config[FLOW_LAYERS_COUNT][2] = {
+    {OS_TMUX, _TMUX},
+    {OS_MISC, _MISC},
+    {OS_FUNC, _FUNC},
+};
+
+...
+
+// Add following to handle flow
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+    if (!update_flow(keycode, record->event.pressed, record->event.key)) return false;
+    return true;
+}
+
+void matrix_scan_user(void) {
+    flow_matrix_scan();
+}
+
+```
+
+## Lithuanian letters
+
+There are at least two ways how to enter Lithuanian letters: to
+use Unicode support from QMK or to switch OS language when
+necessary. Unicode support has some problems:
+
+* it is OS specific (you need to change Unicode input mode based
+  on your OS and I sometimes switch between Mac OS X and Ubuntu).
+  This is minor issue but it is still issue.
+
+* There is bug in Mac OS X and I can't enter `Š` using unicode
+  input method.
+
+* Unicode Hex Input in Mac OS X is not perfect and there are some
+  minor issue while using it.
+
+On Linux Unicode support meanwhile works perfectly.
+
+This leaves us with other option to use OS language switching as
+you most probably have done before. Still there is space for
+improvement. E.g. I have added Lithuanian letters to trilayer and
+trilayer activation toggles OS language (this works because I use
+only two languages). Check `layer_state_set_user` implementation
+for details.
+
+# Rejected ideas
+
+## Mods as combos
+
+Sometimes when I press `NAV (layer key) + S + Tab` to get `Command
++ Tab` I ended up with `S + Nav + Tab`. This happened because I
+did that really fast and sometimes clicked S slightly earlier than
+NAV layer key. Initially I have solved this problem using Combo
+keys, but that's additional dependency and combo keys are not
+ideal for Callum layer. You need to release both keys to trigger
+Combo key release. Therefore I have written custom code that
+allows pressing S some milliseconds earlier. This is controlled by
+FLOW_TERM and defaults to 10. I do not recommend setting this to
+higher than 30.
+
+This idea was rejected because it looks like 10ms did not made
+that big difference.
+
+## Swapper
+
+Idea of swapper is to have key that registers Mode key (e.g.
+Command while layer and some key is pressed) to simulate two key
+combo, e.g. Command + Tab. Overall I found that 3 keys combo that
+I have currently for swapping windows is equally good as 2 keys
+swapper. Another problem with swapper is that it is OS specific.
+Still if you want here is swapper implementation I have used:
+
+```c
+bool active;
+
+void update_swapper(
+    uint16_t trigger,
+    uint16_t keycode,
+    bool pressed
+) {
+    if (keycode == trigger) {
+        if (pressed) {
+            if (!active) {
+                active = true;
+                register_code(KC_LGUI);
+            }
+            register_code(KC_TAB);
+        } else {
+            unregister_code(KC_TAB);
+        }
+    } else if (active && keycode != KC_LSFT && keycode != KC_LEFT && keycode != KC_RIGHT) {
+        unregister_code(KC_LGUI);
+        active = false;
+    }
+}
+```
+
+## Combos
+
+I have seen that some people use two letter horizontal combos for
+some actions, e.g. XC for Command+C, CV for Command+V, JK for ESC
+and etc. I found that this kind of kicks me out of the flow when
+working as it requires different kind of action and I need to
+pause to make that action.
+
+## Comma-space
+
+I have noticed that I put space after comma `,` usually. That
+means I can use comma + letter for something else with backspace,
+e.g. for Lithuanian letters. Performance wise that works OK, but
+practically that does not feel really good. Trilayer with language
+layer switch works better.
+
+Still if you are interested here is comma-space implementation:
+
+```c
+void swap_layout(void) {
+    uint8_t saved_mods = get_mods();
+    clear_mods();
+    tap_code16(LCTL(KC_SPC));
+    set_mods(saved_mods);
+}
+
+void press_with_layout_swap(uint16_t keycode) {
+    tap_code16(KC_BSPC);
+    swap_layout();
+    tap_code16(keycode);
+    swap_layout();
+}
+
+bool comma_pressed = false;
+
+bool update_commaspace(
+    uint16_t keycode,
+    bool pressed
+) {
+    if (keycode == KC_COMM) {
+        if (!(get_mods() & MOD_MASK_SHIFT)) {
+            comma_pressed = true;
+        }
+    } else if (comma_pressed) {
+        if (keycode != KC_LSFT) {
+            comma_pressed = false;
+        }
+
+        switch(keycode) {
+            case KC_Q:
+                if (pressed) {
+                    press_with_layout_swap(KC_1);
+                    return false;
+                }
+                break;
+            case KC_W:
+                if (pressed) {
+                    press_with_layout_swap(KC_2);
+                    return false;
+                }
+                break;
+            case KC_E:
+                if (pressed) {
+                    press_with_layout_swap(KC_3);
+                    return false;
+                }
+                break;
+            case KC_R:
+                if (pressed) {
+                    press_with_layout_swap(KC_4);
+                    return false;
+                }
+                break;
+            case KC_T:
+                if (pressed) {
+                    press_with_layout_swap(KC_5);
+                    return false;
+                }
+                break;
+            case KC_Y:
+                if (pressed) {
+                    press_with_layout_swap(KC_6);
+                    return false;
+                }
+                break;
+            case KC_U:
+                if (pressed) {
+                    press_with_layout_swap(KC_7);
+                    return false;
+                }
+                break;
+            case KC_I:
+                if (pressed) {
+                    press_with_layout_swap(KC_8);
+                    return false;
+                }
+                break;
+            case KC_O:
+                if (pressed) {
+                    press_with_layout_swap(KC_EQL);
+                    return false;
+                }
+                break;
+        }
+    }
+
+    return true;
+};
+```
+
+## Using one shot layers on top layer keys (NAV and SYM)
+
+While this looked promising and fun it was really easy to get lost
+in which layer you actually are. You can still use it as `flow`
+supports this scenario, but I do not recommend it.

+ 1 - 1
keyboards/a_dux/keymaps/daliusd/rules.mk

@@ -2,4 +2,4 @@ UNICODE_ENABLE = no
 UNICODEMAP_ENABLE = yes
 #CONSOLE_ENABLE = yes
 
-SRC += oneshot.c
+SRC += flow.c

+ 73 - 1
keyboards/aurora65/info.json

@@ -10,7 +10,79 @@
     },
     "layouts": {
         "LAYOUT_65_ansi_blocker": {
-            "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, "w":2}, {"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, "w":2.25}, {"x":15, "y":2}, {"x":0, "y":3, "w":2.25}, {"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":6.25}, {"x":10, "y":4, "w":1.5}, {"x":11.5, "y":4, "w":1.5}, {"x":13, "y":4}, {"x":14, "y":4}, {"x":15, "y":4}]
+            "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, "w":2},
+                {"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, "w":2.25},
+                {"x":15, "y":2},
+
+                {"x":0, "y":3, "w":2.25},
+                {"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":6.25},
+                {"x":10, "y":4, "w":1.25},
+                {"x":11.25, "y":4, "w":1.25},
+                {"x":13, "y":4},
+                {"x":14, "y":4},
+                {"x":15, "y":4}
+            ]
         }
     }
 }

+ 52 - 17
keyboards/bpiphany/ghost_squid/ghost_squid.h

@@ -24,21 +24,56 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 #define  ___ KC_NO
 
-#define LAYOUT( \
-	KJ6,      KI4, KH4, KH2, KH6, KA7, KE6, KD2, KD4, KB4, KB7, KB6, KB0,   KC7, KC5, KA5,                       \
-	KJ4, KJ7, KI7, KH7, KG7, KG4, KF4, KF7, KE7, KD7, KR7, KR4, KE4, KB2,   KL4, KO4, KQ4,   KK1, KL1, KQ1, KQ0, \
-	KJ2, KJ5, KI5, KH5, KG5, KG2, KF2, KF5, KE5, KD5, KR5, KR2, KE2, KB3,   KK4, KO7, KQ7,   KK5, KL5, KQ5, KO5, \
-	KI2, KJ3, KI3, KH3, KG3, KG6, KF6, KF3, KE3, KD3, KR3, KR6,      KB1,                    KK2, KL2, KQ2,      \
-	KN2, KI6, KJ1, KI1, KH1, KG1, KG0, KF0, KF1, KE1, KD1, KR0,      KN3,        KO6,        KK3, KL3, KQ3, KO3, \
-	KA4, KP2, KC6,                KK6,                KC0, KM3, KD0, KA1,   KO0, KK0, KL0,   KL6,      KQ6       \
-	) { /*        00-A  01-B  02-C  03-D  04-E  05-F  06-G  07-H  08-I  09-J  10-K  11-L  12-M  13-N  14-O  15-P  16-Q  17-R */ \
-		/* 0 */  { ___ , KB0 , KC0 , KD0 , ___ , KF0 , KG0 , ___ , ___ , ___ , KK0 , KL0 , ___ , ___ , KO0 , ___ , KQ0 , KR0 }, \
-		/* 1 */  { KA1 , KB1 , ___ , KD1 , KE1 , KF1 , KG1 , KH1 , KI1 , KJ1 , KK1 , KL1 , ___ , ___ , ___ , ___ , KQ1 , ___ }, \
-		/* 2 */  { ___ , KB2 , ___ , KD2 , KE2 , KF2 , KG2 , KH2 , KI2 , KJ2 , KK2 , KL2 , ___ , KN2 , ___ , KP2 , KQ2 , KR2 }, \
-		/* 3 */  { ___ , KB3 , ___ , KD3 , KE3 , KF3 , KG3 , KH3 , KI3 , KJ3 , KK3 , KL3 , KM3 , KN3 , KO3 , ___ , KQ3 , KR3 }, \
-		/* 4 */  { KA4 , KB4 , ___ , KD4 , KE4 , KF4 , KG4 , KH4 , KI4 , KJ4 , KK4 , KL4 , ___ , ___ , KO4 , ___ , KQ4 , KR4 }, \
-		/* 5 */  { KA5 , ___ , KC5 , KD5 , KE5 , KF5 , KG5 , KH5 , KI5 , KJ5 , KK5 , KL5 , ___ , ___ , KO5 , ___ , KQ5 , KR5 }, \
-		/* 6 */  { ___ , KB6 , KC6 , ___ , KE6 , KF6 , KG6 , KH6 , KI6 , KJ6 , KK6 , KL6 , ___ , ___ , KO6 , ___ , KQ6 , KR6 }, \
-		/* 7 */  { KA7 , KB7 , KC7 , KD7 , KE7 , KF7 , KG7 , KH7 , KI7 , KJ7 , ___ , ___ , ___ , ___ , KO7 , ___ , KQ7 , KR7 }  \
-	}
+/*
+ *              ┌───┐   ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐
+ *              │J6 │   │I4 │H4 │H2 │H6 │ │A7 │E6 │D2 │D4 │ │B4 │B7 │B6 │B0 │ │C7 │C5 │A5 │
+ *              └───┘   └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘
+ *              ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ ┌───┬───┬───┐ ┌───┬───┬───┬───┐
+ *              │J4 │J7 │I7 │H7 │G7 │G4 │F4 │F7 │E7 │D7 │R7 │R4 │E4 │B2     │ │L4 │O4 │Q4 │ │K1 │L1 │Q1 │Q0 │
+ *              ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ ├───┼───┼───┤ ├───┼───┼───┼───┤      ┌─────┐
+ *              │J2   │J5 │I5 │H5 │G5 │G2 │F2 │F5 │E5 │D5 │R5 │R2 │E2 │B3   │ │K4 │O7 │Q7 │ │K5 │L5 │Q5 │O5 │      │     │
+ *  2.25u       ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ └───┴───┴───┘ ├───┼───┼───┤   │   ┌──┴┐B1  │ ISO Enter
+ *  LShift      │I2    │J3 │I3 │H3 │G3 │G6 │F6 │F3 │E3 │D3 │R3 │R6 │B1      │               │K2 │L2 │Q2 │   │   │B3 │    │
+ * ┌────────┐   ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤     ┌───┐     ├───┼───┼───┼───┤   └───┴────┘
+ * │N2      │   │N2  │I6 │J1 │I1 │H1 │G1 │G0 │F0 │F1 │E1 │D1 │R0 │N3        │     │O6 │     │K3 │L3 │Q3 │O3 │
+ * └────────┘   ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ ┌───┼───┼───┐ ├───┴───┼───┤   │
+ *              │A4  │P2  │C6  │K6                      │C0  │M3  │D0  │A1  │ │O0 │K0 │L0 │ │L6     │Q6 │   │
+ *              └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ └───┴───┴───┘ └───────┴───┴───┘
+ */
+
+#define LAYOUT_fullsize_ansi( \
+    KJ6,      KI4, KH4, KH2, KH6, KA7, KE6, KD2, KD4, KB4, KB7, KB6, KB0,   KC7, KC5, KA5,                       \
+    KJ4, KJ7, KI7, KH7, KG7, KG4, KF4, KF7, KE7, KD7, KR7, KR4, KE4, KB2,   KL4, KO4, KQ4,   KK1, KL1, KQ1, KQ0, \
+    KJ2, KJ5, KI5, KH5, KG5, KG2, KF2, KF5, KE5, KD5, KR5, KR2, KE2, KB3,   KK4, KO7, KQ7,   KK5, KL5, KQ5, KO5, \
+    KI2, KJ3, KI3, KH3, KG3, KG6, KF6, KF3, KE3, KD3, KR3, KR6,      KB1,                    KK2, KL2, KQ2,      \
+    KN2,      KJ1, KI1, KH1, KG1, KG0, KF0, KF1, KE1, KD1, KR0,      KN3,        KO6,        KK3, KL3, KQ3, KO3, \
+    KA4, KP2, KC6,                KK6,                KC0, KM3, KD0, KA1,   KO0, KK0, KL0,   KL6,      KQ6       \
+    ) { /*        00-A  01-B  02-C  03-D  04-E  05-F  06-G  07-H  08-I  09-J  10-K  11-L  12-M  13-N  14-O  15-P  16-Q  17-R */ \
+        /* 0 */  { ___ , KB0 , KC0 , KD0 , ___ , KF0 , KG0 , ___ , ___ , ___ , KK0 , KL0 , ___ , ___ , KO0 , ___ , KQ0 , KR0 }, \
+        /* 1 */  { KA1 , KB1 , ___ , KD1 , KE1 , KF1 , KG1 , KH1 , KI1 , KJ1 , KK1 , KL1 , ___ , ___ , ___ , ___ , KQ1 , ___ }, \
+        /* 2 */  { ___ , KB2 , ___ , KD2 , KE2 , KF2 , KG2 , KH2 , KI2 , KJ2 , KK2 , KL2 , ___ , KN2 , ___ , KP2 , KQ2 , KR2 }, \
+        /* 3 */  { ___ , KB3 , ___ , KD3 , KE3 , KF3 , KG3 , KH3 , KI3 , KJ3 , KK3 , KL3 , KM3 , KN3 , KO3 , ___ , KQ3 , KR3 }, \
+        /* 4 */  { KA4 , KB4 , ___ , KD4 , KE4 , KF4 , KG4 , KH4 , KI4 , KJ4 , KK4 , KL4 , ___ , ___ , KO4 , ___ , KQ4 , KR4 }, \
+        /* 5 */  { KA5 , ___ , KC5 , KD5 , KE5 , KF5 , KG5 , KH5 , KI5 , KJ5 , KK5 , KL5 , ___ , ___ , KO5 , ___ , KQ5 , KR5 }, \
+        /* 6 */  { ___ , KB6 , KC6 , ___ , KE6 , KF6 , KG6 , KH6 , ___ , KJ6 , KK6 , KL6 , ___ , ___ , KO6 , ___ , KQ6 , KR6 }, \
+        /* 7 */  { KA7 , KB7 , KC7 , KD7 , KE7 , KF7 , KG7 , KH7 , KI7 , KJ7 , ___ , ___ , ___ , ___ , KO7 , ___ , KQ7 , KR7 }  \
+    }
+
+#define LAYOUT_fullsize_iso( \
+    KJ6,      KI4, KH4, KH2, KH6, KA7, KE6, KD2, KD4, KB4, KB7, KB6, KB0,   KC7, KC5, KA5,                       \
+    KJ4, KJ7, KI7, KH7, KG7, KG4, KF4, KF7, KE7, KD7, KR7, KR4, KE4, KB2,   KL4, KO4, KQ4,   KK1, KL1, KQ1, KQ0, \
+    KJ2, KJ5, KI5, KH5, KG5, KG2, KF2, KF5, KE5, KD5, KR5, KR2, KE2,        KK4, KO7, KQ7,   KK5, KL5, KQ5, KO5, \
+    KI2, KJ3, KI3, KH3, KG3, KG6, KF6, KF3, KE3, KD3, KR3, KR6, KB3, KB1,                    KK2, KL2, KQ2,      \
+    KN2, KI6, KJ1, KI1, KH1, KG1, KG0, KF0, KF1, KE1, KD1, KR0,      KN3,        KO6,        KK3, KL3, KQ3, KO3, \
+    KA4, KP2, KC6,                KK6,                KC0, KM3, KD0, KA1,   KO0, KK0, KL0,   KL6,      KQ6       \
+    ) { /*        00-A  01-B  02-C  03-D  04-E  05-F  06-G  07-H  08-I  09-J  10-K  11-L  12-M  13-N  14-O  15-P  16-Q  17-R */ \
+        /* 0 */  { ___ , KB0 , KC0 , KD0 , ___ , KF0 , KG0 , ___ , ___ , ___ , KK0 , KL0 , ___ , ___ , KO0 , ___ , KQ0 , KR0 }, \
+        /* 1 */  { KA1 , KB1 , ___ , KD1 , KE1 , KF1 , KG1 , KH1 , KI1 , KJ1 , KK1 , KL1 , ___ , ___ , ___ , ___ , KQ1 , ___ }, \
+        /* 2 */  { ___ , KB2 , ___ , KD2 , KE2 , KF2 , KG2 , KH2 , KI2 , KJ2 , KK2 , KL2 , ___ , KN2 , ___ , KP2 , KQ2 , KR2 }, \
+        /* 3 */  { ___ , KB3 , ___ , KD3 , KE3 , KF3 , KG3 , KH3 , KI3 , KJ3 , KK3 , KL3 , KM3 , KN3 , KO3 , ___ , KQ3 , KR3 }, \
+        /* 4 */  { KA4 , KB4 , ___ , KD4 , KE4 , KF4 , KG4 , KH4 , KI4 , KJ4 , KK4 , KL4 , ___ , ___ , KO4 , ___ , KQ4 , KR4 }, \
+        /* 5 */  { KA5 , ___ , KC5 , KD5 , KE5 , KF5 , KG5 , KH5 , KI5 , KJ5 , KK5 , KL5 , ___ , ___ , KO5 , ___ , KQ5 , KR5 }, \
+        /* 6 */  { ___ , KB6 , KC6 , ___ , KE6 , KF6 , KG6 , KH6 , KI6 , KJ6 , KK6 , KL6 , ___ , ___ , KO6 , ___ , KQ6 , KR6 }, \
+        /* 7 */  { KA7 , KB7 , KC7 , KD7 , KE7 , KF7 , KG7 , KH7 , KI7 , KJ7 , ___ , ___ , ___ , ___ , KO7 , ___ , KQ7 , KR7 }  \
+    }
 

+ 120 - 3
keyboards/bpiphany/ghost_squid/info.json

@@ -8,8 +8,12 @@
         "pid": "0x6050",
         "device_version": "1.0.4"
     },
+    "community_layouts": [
+        "fullsize_ansi",
+        "fullsize_iso"
+    ],
     "layouts": {
-        "LAYOUT": {
+        "LAYOUT_fullsize_ansi": {
             "layout": [
                 {"label":"Esc", "x":0, "y":0},
                 {"label":"F1", "x":2, "y":0},
@@ -66,7 +70,7 @@
                 {"label":"\\|", "x":13.5, "y":2.25, "w":1.5},
                 {"label":"Delete", "x":15.25, "y":2.25},
                 {"label":"End", "x":16.25, "y":2.25},
-                {"label":"Page DownDN", "x":17.25, "y":2.25},
+                {"label":"Page Down", "x":17.25, "y":2.25},
                 {"label":"7", "x":18.5, "y":2.25},
                 {"label":"8", "x":19.5, "y":2.25},
                 {"label":"9", "x":20.5, "y":2.25},
@@ -89,6 +93,119 @@
                 {"label":"5", "x":19.5, "y":3.25},
                 {"label":"6", "x":20.5, "y":3.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":7.25, "y":4.25},
+                {"label":"M", "x":8.25, "y":4.25},
+                {"label":",<", "x":9.25, "y":4.25},
+                {"label":".>", "x":10.25, "y":4.25},
+                {"label":"/?", "x":11.25, "y":4.25},
+                {"label":"Shift", "x":12.25, "y":4.25, "w":2.75},
+                {"label":"\u2191", "x":16.25, "y":4.25},
+                {"label":"1", "x":18.5, "y":4.25},
+                {"label":"2", "x":19.5, "y":4.25},
+                {"label":"3", "x":20.5, "y":4.25},
+                {"label":"Enter", "x":21.5, "y":4.25, "h":2},
+
+                {"label":"Ctrl", "x":0, "y":5.25, "w":1.25},
+                {"label":"GUI", "x":1.25, "y":5.25, "w":1.25},
+                {"label":"Alt", "x":2.5, "y":5.25, "w":1.25},
+                {"label":"Space", "x":3.75, "y":5.25, "w":6.25},
+                {"label":"Alt", "x":10, "y":5.25, "w":1.25},
+                {"label":"GUI", "x":11.25, "y":5.25, "w":1.25},
+                {"label":"Fn", "x":12.5, "y":5.25, "w":1.25},
+                {"label":"Ctrl", "x":13.75, "y":5.25, "w":1.25},
+                {"label":"\u2190", "x":15.25, "y":5.25},
+                {"label":"\u2193", "x":16.25, "y":5.25},
+                {"label":"\u2192", "x":17.25, "y":5.25},
+                {"label":"0", "x":18.5, "y":5.25, "w":2},
+                {"label":".", "x":20.5, "y":5.25}
+            ]
+        },
+        "LAYOUT_fullsize_iso": {
+            "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.5, "y":0},
+                {"label":"F6", "x":7.5, "y":0},
+                {"label":"F7", "x":8.5, "y":0},
+                {"label":"F8", "x":9.5, "y":0},
+                {"label":"F9", "x":11, "y":0},
+                {"label":"F10", "x":12, "y":0},
+                {"label":"F11", "x":13, "y":0},
+                {"label":"F12", "x":14, "y":0},
+                {"label":"Print Screen,", "x":15.25, "y":0},
+                {"label":"Scroll Lock", "x":16.25, "y":0},
+                {"label":"Pause", "x":17.25, "y":0},
+
+                {"label":"`\u00ac", "x":0, "y":1.25},
+                {"label":"1!", "x":1, "y":1.25},
+                {"label":"2\"", "x":2, "y":1.25},
+                {"label":"3\u00a3", "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":7, "y":1.25},
+                {"label":"8*", "x":8, "y":1.25},
+                {"label":"9(", "x":9, "y":1.25},
+                {"label":"0)", "x":10, "y":1.25},
+                {"label":"-_", "x":11, "y":1.25},
+                {"label":"=+", "x":12, "y":1.25},
+                {"label":"Backspace", "x":13, "y":1.25, "w":2},
+                {"label":"Insert", "x":15.25, "y":1.25},
+                {"label":"Home", "x":16.25, "y":1.25},
+                {"label":"Page Up", "x":17.25, "y":1.25},
+                {"label":"Num Lock", "x":18.5, "y":1.25},
+                {"label":"/", "x":19.5, "y":1.25},
+                {"label":"*", "x":20.5, "y":1.25},
+                {"label":"-", "x":21.5, "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":6.5, "y":2.25},
+                {"label":"U", "x":7.5, "y":2.25},
+                {"label":"I", "x":8.5, "y":2.25},
+                {"label":"O", "x":9.5, "y":2.25},
+                {"label":"P", "x":10.5, "y":2.25},
+                {"label":"[{", "x":11.5, "y":2.25},
+                {"label":"]}", "x":12.5, "y":2.25},
+                {"label":"Delete", "x":15.25, "y":2.25},
+                {"label":"End", "x":16.25, "y":2.25},
+                {"label":"Page Down", "x":17.25, "y":2.25},
+                {"label":"7", "x":18.5, "y":2.25},
+                {"label":"8", "x":19.5, "y":2.25},
+                {"label":"9", "x":20.5, "y":2.25},
+                {"label":"+", "x":21.5, "y":2.25, "h": 2},
+
+                {"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":6.75, "y":3.25},
+                {"label":"J", "x":7.75, "y":3.25},
+                {"label":"K", "x":8.75, "y":3.25},
+                {"label":"L", "x":9.75, "y":3.25},
+                {"label":";:", "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":2.25, "w":1.25, "h":2},
+                {"label":"4", "x":18.5, "y":3.25},
+                {"label":"5", "x":19.5, "y":3.25},
+                {"label":"6", "x":20.5, "y":3.25},
+
                 {"label":"Shift", "x":0, "y":4.25, "w":1.25},
                 {"label":"\\|", "x":1.25, "y":4.25},
                 {"label":"Z", "x":2.25, "y":4.25},
@@ -112,7 +229,7 @@
                 {"label":"GUI", "x":1.25, "y":5.25, "w":1.25},
                 {"label":"Alt", "x":2.5, "y":5.25, "w":1.25},
                 {"label":"Space", "x":3.75, "y":5.25, "w":6.25},
-                {"label":"Alt", "x":10, "y":5.25, "w":1.25},
+                {"label":"AltGr", "x":10, "y":5.25, "w":1.25},
                 {"label":"GUI", "x":11.25, "y":5.25, "w":1.25},
                 {"label":"Fn", "x":12.5, "y":5.25, "w":1.25},
                 {"label":"Ctrl", "x":13.75, "y":5.25, "w":1.25},

+ 27 - 30
keyboards/bpiphany/ghost_squid/keymaps/default/keymap.c

@@ -25,50 +25,47 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ Backsp│ │INS│HOM│PgU│ │NUM│ / │ * │ - │
 * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ ├───┼───┼───┤ ├───┼───┼───┼───┤
 * │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │     │ │DEL│END│PgD│ │ 7 │ 8 │ 9 │   │
-* ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │ └───┴───┴───┘ ├───┼───┼───┤ + │
+* ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ Ent│ └───┴───┴───┘ ├───┼───┼───┤ + │
 * │ Caps │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ \ │    │               │ 7 │ 8 │ 9 │   │
 * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤     ┌───┐     ├───┼───┼───┼───┤
 * │Shif│ # │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │    Shift │     │ ↑ │     │ 1 │ 2 │ 3 │   │
-* ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ ┌───┼───┼───┐ ├───┴───┼───┤
-* │Ctrl│GUI │Alt │                        │ Alt│ GUI│Fn  │Ctrl│ │ ← │ ↓ │ → │ │   0   │ , │   │ 
+* ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ ┌───┼───┼───┐ ├───┴───┼───┤Ent
+* │Ctrl│GUI │Alt │                        │ Alt│ GUI│Fn  │Ctrl│ │ ← │ ↓ │ → │ │   0   │ , │   │
 * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ └───┴───┴───┘ └───────┴───┴───┘
 */
 
 enum layer_names {
-    KM_QWERTY,
-    KM_MEDIA,
-    KM_GUI_LOCK
+    _QW,
+    _MD
 };
 
 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-	/* Layer 0: Standard ISO layer */
-	[KM_QWERTY] = 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_SCRL,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_NUM, KC_PSLS,KC_PAST,KC_PMNS,
-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_P7,  KC_P8,  KC_P9,  KC_PPLS,
-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_P4,  KC_P5,  KC_P6,
-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_P1,  KC_P2,  KC_P3,  KC_PENT,
-KC_LCTL, KC_LGUI,KC_LALT,                       KC_SPC,                          KC_RALT,KC_RGUI,MO(KM_MEDIA),KC_RCTL,   KC_LEFT,KC_DOWN,KC_RGHT,    KC_P0,          KC_PDOT),
-	/* Layer 1: Function layer */
-	[KM_MEDIA] = LAYOUT(
-_______,_______,_______,_______,_______,  KC_MEDIA_PLAY_PAUSE, KC_MEDIA_STOP, KC_MEDIA_PREV_TRACK, KC_MEDIA_NEXT_TRACK,  TG(KM_GUI_LOCK),KC_MUTE, KC_VOLD, KC_VOLU,_______,_______, QK_BOOT,
-_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,
-_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,
-_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,
-_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,  _______,_______,
-_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______),
-	[KM_GUI_LOCK] = LAYOUT(
-_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______,
-_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,
-_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,
-_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,
-_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,
-_______,KC_NO,_______,_______,_______,KC_NO,_______,_______,_______,_______,_______,_______,_______)
+
+    /* Layer 0: Standard ISO layer */
+    [_QW] = LAYOUT_fullsize_iso(
+        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_SCRL, 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_NUM,  KC_PSLS, KC_PAST, KC_PMNS,
+        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_DEL,  KC_END,  KC_PGDN,    KC_P7,   KC_P8,   KC_P9,   KC_PPLS,
+        KC_CLCK, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT, KC_BSLS, KC_ENT,                                   KC_P4,   KC_P5,   KC_P6,
+        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_P1,   KC_P2,   KC_P3,   KC_PENT,
+        KC_LCTL, KC_LGUI, KC_LALT,                            KC_SPC,                             KC_RALT, KC_RGUI, MO(_MD), KC_RCTL,    KC_LEFT, KC_DOWN, KC_RGHT,    KC_P0,            KC_PDOT
+    ),
+
+    /* Layer 1: Function layer */
+    [_MD] = LAYOUT_fullsize_iso(
+        _______,          _______, _______, _______, _______, KC_MPLY, KC_MSTP, KC_MPRV, KC_MNXT, GUI_TOG, KC_MUTE, KC_VOLD, KC_VOLU,    _______, _______, QK_BOOT,
+        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,    _______, _______, _______,    _______, _______, _______, _______,
+        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,             _______, _______, _______,    _______, _______, _______, _______,
+        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,                                  _______, _______, _______,
+        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,          _______,             _______,             _______, _______, _______, _______,
+        _______, _______, _______,                            _______,                            _______, _______, _______, _______,    _______, _______, _______,    _______,          _______
+    ),
+
 };
 
 
 layer_state_t layer_state_set_user(layer_state_t state) {
-    if (IS_LAYER_ON_STATE(state, KM_GUI_LOCK)) {
+    if (IS_LAYER_ON_STATE(state, _MD)) {
         fn_led_on();
     } else {
         fn_led_off();

+ 33 - 1
keyboards/bpiphany/ghost_squid/keymaps/default/readme.md

@@ -1 +1,33 @@
-# Default layout desc TODO
+# Ghost Squid Default Keymap
+
+## Base Layer
+
+```
+ ┌───┐   ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐     ┌───────────┐
+ │ESC│   │F1 │F2 │F3 │F4 │ │F5 │F6 │F7 │F8 │ │F9 │F10│F11│F12│ │PRT│SCR│PAU│     │Ghost Squid│
+ └───┘   └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘     └───────────┘
+ ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ ┌───┬───┬───┐ ┌───┬───┬───┬───┐
+ │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ Backsp│ │INS│HOM│PgU│ │NUM│ / │ * │ - │
+ ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ ├───┼───┼───┤ ├───┼───┼───┼───┤
+ │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │     │ │DEL│END│PgD│ │ 7 │ 8 │ 9 │   │
+ ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ Ent│ └───┴───┴───┘ ├───┼───┼───┤ + │
+ │ Caps │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ \ │    │               │ 7 │ 8 │ 9 │   │
+ ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤     ┌───┐     ├───┼───┼───┼───┤
+ │Shif│ # │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │    Shift │     │ ↑ │     │ 1 │ 2 │ 3 │   │
+ ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ ┌───┼───┼───┐ ├───┴───┼───┤Ent│
+ │Ctrl│GUI │Alt │                        │ Alt│ GUI│Fn  │Ctrl│ │ ← │ ↓ │ → │ │   0   │ , │   │
+ └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ └───┴───┴───┘ └───────┴───┴───┘
+
+```
+
+## Function Layer
+
+* `Fn` + `F5`  =  Play
+* `Fn` + `F6`  =  Stop
+* `Fn` + `F7`  =  Previous Track
+* `Fn` + `F8`  =  Next Track
+* `Fn` + `F9`  =  Toggle GUI key
+* `Fn` + `F10` =  Mute
+* `Fn` + `F11` =  Volume Down
+* `Fn` + `F12` =  Volume Up
+* `Fn` + `Pause` = Reset to Bootloader

+ 20 - 0
keyboards/cannonkeys/ellipse/config.h

@@ -0,0 +1,20 @@
+/* Copyright 2022 Andrew Kannan
+ *
+ * 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
+
+#define BACKLIGHT_PWM_DRIVER    PWMD3
+#define BACKLIGHT_PWM_CHANNEL   1
+#define BACKLIGHT_PAL_MODE      1

+ 27 - 0
keyboards/cannonkeys/ellipse/halconf.h

@@ -0,0 +1,27 @@
+/* Copyright 2020 QMK
+ *
+ * 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/>.
+ */
+
+/*
+ * This file was auto-generated by:
+ *    `qmk chibios-confmigrate -i keyboards/cannonkeys/an_c/halconf.h -r platforms/chibios/common/configs/halconf.h`
+ */
+
+#pragma once
+
+#define HAL_USE_PWM TRUE
+
+#include_next <halconf.h>
+

+ 108 - 0
keyboards/cannonkeys/ellipse/info.json

@@ -0,0 +1,108 @@
+{
+    "manufacturer": "CannonKeys",
+    "keyboard_name": "Ellipse",
+    "maintainer": "awkannan",
+    "bootloader": "stm32-dfu",
+    "diode_direction": "COL2ROW",
+    "features": {
+        "bootmagic": true,
+        "command": false,
+        "console": false,
+        "extrakey": true,
+        "mousekey": true,
+        "nkro": true,
+        "backlight": true,
+    },
+    "matrix_pins": {
+        "cols": ["B11", "B10", "B2", "A9", "A15", "B3", "B4", "B5", "B6", "B7", "B8", "B9", "C13", "C14", "C15"],
+        "rows": ["B1", "B0", "A7", "A5", "A4"]
+    },
+    "backlight": {
+        "breathing": true,
+        "breathing_period": 5,
+        "levels": 15,
+        "pin": "A6"
+    },
+    "indicators": {
+        "caps_lock": "A3",
+        "on_state": 0
+    },
+    "processor": "STM32F072",
+    "url": "https://cannonkeys.com/",
+    "usb": {
+        "device_version": "1.0.0",
+        "vid": "0xCA04",
+        "pid": "0x0015"
+    },
+    "layouts": {
+        "LAYOUT_all": {
+            "layout": [
+                { "label": "Esc", "matrix": [0, 0], "x": 0.0, "y": 0.0 },
+                { "label": "!", "matrix": [0, 1], "x": 1.0, "y": 0.0 },
+                { "label": "@", "matrix": [0, 2], "x": 2.0, "y": 0.0 },
+                { "label": "#", "matrix": [0, 3], "x": 3.0, "y": 0.0 },
+                { "label": "$", "matrix": [0, 4], "x": 4.0, "y": 0.0 },
+                { "label": "%", "matrix": [0, 5], "x": 5.0, "y": 0.0 },
+                { "label": "^", "matrix": [0, 6], "x": 6.0, "y": 0.0 },
+                { "label": "&", "matrix": [0, 7], "x": 7.0, "y": 0.0 },
+                { "label": "*", "matrix": [0, 8], "x": 8.0, "y": 0.0 },
+                { "label": "(", "matrix": [0, 9], "x": 9.0, "y": 0.0 },
+                { "label": ")", "matrix": [0, 10], "x": 10.0, "y": 0.0 },
+                { "label": "_", "matrix": [0, 11], "x": 11.0, "y": 0.0 },
+                { "label": "+", "matrix": [0, 12], "x": 12.0, "y": 0.0 },
+                { "label": "Bksp", "matrix": [0, 13], "x": 13.0, "y": 0.0 },
+                { "label": "Del", "matrix": [0, 14], "x": 14.0, "y": 0.0 },
+                { "label": "Tab", "matrix": [1, 0], "w": 1.5, "x": 0.0, "y": 1.0 },
+                { "label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1.0 },
+                { "label": "W", "matrix": [1, 2], "x": 2.5, "y": 1.0 },
+                { "label": "E", "matrix": [1, 3], "x": 3.5, "y": 1.0 },
+                { "label": "R", "matrix": [1, 4], "x": 4.5, "y": 1.0 },
+                { "label": "T", "matrix": [1, 5], "x": 5.5, "y": 1.0 },
+                { "label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1.0 },
+                { "label": "U", "matrix": [1, 7], "x": 7.5, "y": 1.0 },
+                { "label": "I", "matrix": [1, 8], "x": 8.5, "y": 1.0 },
+                { "label": "O", "matrix": [1, 9], "x": 9.5, "y": 1.0 },
+                { "label": "P", "matrix": [1, 10], "x": 10.5, "y": 1.0 },
+                { "label": "{", "matrix": [1, 11], "x": 11.5, "y": 1.0 },
+                { "label": "}", "matrix": [1, 12], "x": 12.5, "y": 1.0 },
+                { "label": "|", "matrix": [1, 14], "w": 1.5, "x": 13.5, "y": 1.0 },
+                { "label": "Caps Lock", "matrix": [2, 0], "w": 1.75, "x": 0.0, "y": 2.0 },
+                { "label": "A", "matrix": [2, 1], "x": 1.75, "y": 2.0 },
+                { "label": "S", "matrix": [2, 2], "x": 2.75, "y": 2.0 },
+                { "label": "D", "matrix": [2, 3], "x": 3.75, "y": 2.0 },
+                { "label": "F", "matrix": [2, 4], "x": 4.75, "y": 2.0 },
+                { "label": "G", "matrix": [2, 5], "x": 5.75, "y": 2.0 },
+                { "label": "H", "matrix": [2, 6], "x": 6.75, "y": 2.0 },
+                { "label": "J", "matrix": [2, 7], "x": 7.75, "y": 2.0 },
+                { "label": "K", "matrix": [2, 8], "x": 8.75, "y": 2.0 },
+                { "label": "L", "matrix": [2, 9], "x": 9.75, "y": 2.0 },
+                { "label": ":", "matrix": [2, 10], "x": 10.75, "y": 2.0 },
+                { "label": "\"", "matrix": [2, 11], "x": 11.75, "y": 2.0 },
+                { "label": "\\", "matrix": [2, 12], "x": 12.75, "y": 2.0 },
+                { "label": "Enter", "matrix": [2, 14], "w": 2.25, "x": 12.75, "y": 2.0 },
+                { "label": "Shift", "matrix": [3, 0], "w": 1.25, "x": 0.0, "y": 3.0 },
+                { "label": "|", "matrix": [3, 1], "x": 1.25, "y": 3.0 },
+                { "label": "Z", "matrix": [3, 2], "x": 2.25, "y": 3.0 },
+                { "label": "X", "matrix": [3, 3], "x": 3.25, "y": 3.0 },
+                { "label": "C", "matrix": [3, 4], "x": 4.25, "y": 3.0 },
+                { "label": "V", "matrix": [3, 5], "x": 5.25, "y": 3.0 },
+                { "label": "B", "matrix": [3, 6], "x": 6.25, "y": 3.0 },
+                { "label": "N", "matrix": [3, 7], "x": 7.25, "y": 3.0 },
+                { "label": "M", "matrix": [3, 8], "x": 8.25, "y": 3.0 },
+                { "label": "<", "matrix": [3, 9], "x": 9.25, "y": 3.0 },
+                { "label": ">", "matrix": [3, 10], "x": 10.25, "y": 3.0 },
+                { "label": "?", "matrix": [3, 11], "x": 11.25, "y": 3.0 },
+                { "label": "Shift", "matrix": [3, 12], "w": 1.75, "x": 12.25, "y": 3.0 },
+                { "label": "Fn", "matrix": [3, 14], "x": 14.0, "y": 3.0 },
+                { "label": "Ctrl", "matrix": [4, 0], "w": 1.25, "x": 0.0, "y": 4.0 },
+                { "label": "Win", "matrix": [4, 1], "w": 1.25, "x": 1.25, "y": 4.0 },
+                { "label": "Alt", "matrix": [4, 2], "w": 1.25, "x": 2.5, "y": 4.0 },
+                { "matrix": [4, 6], "w": 6.25, "x": 3.75, "y": 4.0 },
+                { "label": "Alt", "matrix": [4, 10], "w": 1.25, "x": 10.0, "y": 4.0 },
+                { "label": "Win", "matrix": [4, 11], "w": 1.25, "x": 11.25, "y": 4.0 },
+                { "label": "Fn", "matrix": [4, 12], "w": 1.25, "x": 12.5, "y": 4.0 },
+                { "label": "Menu", "matrix": [4, 14], "w": 1.25, "x": 13.75, "y": 4.0 }
+            ]
+        }
+    }
+}

+ 45 - 0
keyboards/cannonkeys/ellipse/keymaps/default/keymap.c

@@ -0,0 +1,45 @@
+// Copyright 2022 Andrew Kannan (@awkannan)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include QMK_KEYBOARD_H
+
+enum layer_names {
+    _BASE,
+    _FN1,
+    _FN2,
+    _FN3
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+  [_BASE] = LAYOUT_all(
+    QK_GESC, 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_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_CAPS, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT,      KC_BSLS, KC_ENT,
+    KC_LSFT, KC_BSLS, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH,    KC_RSFT, MO(_FN1),
+    KC_LCTL, KC_LGUI, KC_LALT,                            KC_SPC,                                         KC_RALT, MO(_FN1), KC_RGUI, KC_RCTL
+  ),
+
+  [_FN1] = LAYOUT_all(
+    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, KC_DEL,
+    RGB_TOG, RGB_MOD, KC_UP,   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+    BL_BRTG, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+    BL_INC,  BL_DEC, BL_TOGG, _______, _______, _______, _______, _______, _______, _______, _______,                   _______, _______,
+    _______,  _______, _______,                           _______,                                     _______, _______, _______, QK_BOOT
+  ),
+
+  [_FN2] = LAYOUT_all(
+    _______, _______,   _______,   _______,   _______,   _______,   _______,   _______,   _______,   _______,   _______,  _______,  _______,  _______, _______,
+    _______, _______, _______,   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+    _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+    _______,  _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,                   _______, _______,
+    _______,  _______, _______,                            _______,                                     _______, _______, _______, _______
+  ),
+
+  [_FN3] = LAYOUT_all(
+    _______, _______,   _______,   _______,   _______,   _______,   _______,   _______,   _______,   _______,   _______,  _______,  _______,  _______, _______,
+    _______, _______, _______,   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+    _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+    _______,  _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,                   _______, _______,
+    _______,  _______, _______,                            _______,                                     _______, _______, _______, _______
+  )
+};

+ 45 - 0
keyboards/cannonkeys/ellipse/keymaps/via/keymap.c

@@ -0,0 +1,45 @@
+// Copyright 2022 Andrew Kannan (@awkannan)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include QMK_KEYBOARD_H
+
+enum layer_names {
+    _BASE,
+    _FN1,
+    _FN2,
+    _FN3
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+  [_BASE] = LAYOUT_all(
+    QK_GESC, 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_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_CAPS, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT,      KC_BSLS, KC_ENT,
+    KC_LSFT, KC_BSLS, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH,    KC_RSFT, MO(_FN1),
+    KC_LCTL, KC_LGUI, KC_LALT,                            KC_SPC,                                         KC_RALT, MO(_FN1), KC_RGUI, KC_RCTL
+  ),
+
+  [_FN1] = LAYOUT_all(
+    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, KC_DEL,
+    RGB_TOG, RGB_MOD, KC_UP,   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+    BL_BRTG, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+    BL_INC,  BL_DEC, BL_TOGG, _______, _______, _______, _______, _______, _______, _______, _______,                   _______, _______,
+    _______,  _______, _______,                           _______,                                     _______, _______, _______, QK_BOOT
+  ),
+
+    [_FN2] = LAYOUT_all(
+    _______, _______,   _______,   _______,   _______,   _______,   _______,   _______,   _______,   _______,   _______,  _______,  _______,  _______, _______,
+    _______, _______, _______,   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+    _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+    _______,  _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,                   _______, _______,
+    _______,  _______, _______,                            _______,                                     _______, _______, _______, _______
+  ),
+
+  [_FN3] = LAYOUT_all(
+    _______, _______,   _______,   _______,   _______,   _______,   _______,   _______,   _______,   _______,   _______,  _______,  _______,  _______, _______,
+    _______, _______, _______,   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+    _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+    _______,  _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,                   _______, _______,
+    _______,  _______, _______,                            _______,                                     _______, _______, _______, _______
+  )
+};

+ 1 - 0
keyboards/cannonkeys/ellipse/keymaps/via/rules.mk

@@ -0,0 +1 @@
+VIA_ENABLE = yes

+ 28 - 0
keyboards/cannonkeys/ellipse/mcuconf.h

@@ -0,0 +1,28 @@
+/* Copyright 2020 QMK
+ *
+ * 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/>.
+ */
+
+/*
+ * This file was auto-generated by:
+ *    `qmk chibios-confmigrate -i keyboards/cannonkeys/an_c/mcuconf.h -r platforms/chibios/GENERIC_STM32_F072XB/configs/mcuconf.h`
+ */
+
+#pragma once
+
+#include_next <mcuconf.h>
+
+#undef STM32_PWM_USE_TIM3
+#define STM32_PWM_USE_TIM3 TRUE
+

+ 25 - 0
keyboards/cannonkeys/ellipse/readme.md

@@ -0,0 +1,25 @@
+# Ellipse
+
+*An ellipse inspired 60% keyboard with 3 mounting styles from Skepur*
+
+* Keyboard Maintainer: [Andrew Kannan](https://github.com/awkannan)
+* Hardware Supported: STM32F072CBT6
+* Hardware Availability: [CannonKeys](https://cannonkeys.com)
+
+Make example for this keyboard (after setting up your build environment):
+
+    make cannonkeys/ellipse:default
+
+Flashing example for this keyboard:
+
+    make cannonkeys/ellipse: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 reset button**: Swap the boot switch on the back of the PCB to "1" and hit the reset button
+* **Keycode in layout**: Press the key mapped to `RESET` if it is available

+ 2 - 0
keyboards/cannonkeys/ellipse/rules.mk

@@ -0,0 +1,2 @@
+# Wildcard to allow APM32 MCU
+DFU_SUFFIX_ARGS = -v FFFF -p FFFF

+ 94 - 0
keyboards/cannonkeys/ellipse_hs/info.json

@@ -0,0 +1,94 @@
+{
+    "manufacturer": "CannonKeys",
+    "keyboard_name": "Ellipse HS",
+    "maintainer": "awkannan",
+    "bootloader": "stm32-dfu",
+    "diode_direction": "COL2ROW",
+    "features": {
+        "bootmagic": true,
+        "command": false,
+        "console": false,
+        "extrakey": true,
+        "mousekey": true,
+        "nkro": true
+    },
+    "matrix_pins": {
+        "cols": ["B11", "B10", "B2", "A9", "A15", "B3", "B4", "B5", "B6", "B7", "B8", "B9", "C13", "C14", "C15"],
+        "rows": ["B1", "B0", "A7", "A5", "A4"]
+    },
+    "processor": "STM32F072",
+    "url": "https://cannonkeys.com/",
+    "usb": {
+        "device_version": "1.0.0",
+        "vid": "0xCA04",
+        "pid": "0x0016"
+    },
+    "layouts": {
+        "LAYOUT_all": {
+            "layout": [
+                { "label": "Esc", "matrix": [0, 0], "x": 0.0, "y": 0.0 },
+                { "label": "!", "matrix": [0, 1], "x": 1.0, "y": 0.0 },
+                { "label": "@", "matrix": [0, 2], "x": 2.0, "y": 0.0 },
+                { "label": "#", "matrix": [0, 3], "x": 3.0, "y": 0.0 },
+                { "label": "$", "matrix": [0, 4], "x": 4.0, "y": 0.0 },
+                { "label": "%", "matrix": [0, 5], "x": 5.0, "y": 0.0 },
+                { "label": "^", "matrix": [0, 6], "x": 6.0, "y": 0.0 },
+                { "label": "&", "matrix": [0, 7], "x": 7.0, "y": 0.0 },
+                { "label": "*", "matrix": [0, 8], "x": 8.0, "y": 0.0 },
+                { "label": "(", "matrix": [0, 9], "x": 9.0, "y": 0.0 },
+                { "label": ")", "matrix": [0, 10], "x": 10.0, "y": 0.0 },
+                { "label": "_", "matrix": [0, 11], "x": 11.0, "y": 0.0 },
+                { "label": "+", "matrix": [0, 12], "x": 12.0, "y": 0.0 },
+                { "label": "Del", "matrix": [0, 13], "x": 13.0, "y": 0.0 },
+                { "label": "Bksp", "matrix": [0, 14], "x": 14.0, "y": 0.0 },
+                { "label": "Tab", "matrix": [1, 0], "w": 1.5, "x": 0.0, "y": 1.0 },
+                { "label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1.0 },
+                { "label": "W", "matrix": [1, 2], "x": 2.5, "y": 1.0 },
+                { "label": "E", "matrix": [1, 3], "x": 3.5, "y": 1.0 },
+                { "label": "R", "matrix": [1, 4], "x": 4.5, "y": 1.0 },
+                { "label": "T", "matrix": [1, 5], "x": 5.5, "y": 1.0 },
+                { "label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1.0 },
+                { "label": "U", "matrix": [1, 7], "x": 7.5, "y": 1.0 },
+                { "label": "I", "matrix": [1, 8], "x": 8.5, "y": 1.0 },
+                { "label": "O", "matrix": [1, 9], "x": 9.5, "y": 1.0 },
+                { "label": "P", "matrix": [1, 10], "x": 10.5, "y": 1.0 },
+                { "label": "{", "matrix": [1, 11], "x": 11.5, "y": 1.0 },
+                { "label": "}", "matrix": [1, 12], "x": 12.5, "y": 1.0 },
+                { "label": "|", "matrix": [1, 14], "w": 1.5, "x": 13.5, "y": 1.0 },
+                { "label": "Caps Lock", "matrix": [2, 0], "w": 1.75, "x": 0.0, "y": 2.0 },
+                { "label": "A", "matrix": [2, 1], "x": 1.75, "y": 2.0 },
+                { "label": "S", "matrix": [2, 2], "x": 2.75, "y": 2.0 },
+                { "label": "D", "matrix": [2, 3], "x": 3.75, "y": 2.0 },
+                { "label": "F", "matrix": [2, 4], "x": 4.75, "y": 2.0 },
+                { "label": "G", "matrix": [2, 5], "x": 5.75, "y": 2.0 },
+                { "label": "H", "matrix": [2, 6], "x": 6.75, "y": 2.0 },
+                { "label": "J", "matrix": [2, 7], "x": 7.75, "y": 2.0 },
+                { "label": "K", "matrix": [2, 8], "x": 8.75, "y": 2.0 },
+                { "label": "L", "matrix": [2, 9], "x": 9.75, "y": 2.0 },
+                { "label": ":", "matrix": [2, 10], "x": 10.75, "y": 2.0 },
+                { "label": "\"", "matrix": [2, 11], "x": 11.75, "y": 2.0 },
+                { "label": "Enter", "matrix": [2, 14], "w": 2.25, "x": 12.75, "y": 2.0 },
+                { "label": "Shift", "matrix": [3, 0], "w": 2.25, "x": 0.0, "y": 3.0 },
+                { "label": "Z", "matrix": [3, 2], "x": 2.25, "y": 3.0 },
+                { "label": "X", "matrix": [3, 3], "x": 3.25, "y": 3.0 },
+                { "label": "C", "matrix": [3, 4], "x": 4.25, "y": 3.0 },
+                { "label": "V", "matrix": [3, 5], "x": 5.25, "y": 3.0 },
+                { "label": "B", "matrix": [3, 6], "x": 6.25, "y": 3.0 },
+                { "label": "N", "matrix": [3, 7], "x": 7.25, "y": 3.0 },
+                { "label": "M", "matrix": [3, 8], "x": 8.25, "y": 3.0 },
+                { "label": "<", "matrix": [3, 9], "x": 9.25, "y": 3.0 },
+                { "label": ">", "matrix": [3, 10], "x": 10.25, "y": 3.0 },
+                { "label": "?", "matrix": [3, 11], "x": 11.25, "y": 3.0 },
+                { "label": "Shift", "matrix": [3, 12], "w": 1.75, "x": 12.25, "y": 3.0 },
+                { "label": "Fn", "matrix": [3, 14], "x": 14.0, "y": 3.0 },
+                { "label": "Ctrl", "matrix": [4, 0], "w": 1.5, "x": 0.0, "y": 4.0 },
+                { "label": "Win", "matrix": [4, 1], "x": 1.5, "y": 4.0 },
+                { "label": "Alt", "matrix": [4, 2], "w": 1.5, "x": 2.5, "y": 4.0 },
+                { "matrix": [4, 6], "w": 7.0, "x": 4.0, "y": 4.0 },
+                { "label": "Alt", "matrix": [4, 11], "w": 1.5, "x": 11.0, "y": 4.0 },
+                { "label": "Win", "matrix": [4, 12], "x": 12.5, "y": 4.0 },
+                { "label": "Menu", "matrix": [4, 14], "w": 1.5, "x": 13.5, "y": 4.0 }
+            ]
+        }
+    }
+}

+ 45 - 0
keyboards/cannonkeys/ellipse_hs/keymaps/default/keymap.c

@@ -0,0 +1,45 @@
+// Copyright 2022 Andrew Kannan (@awkannan)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include QMK_KEYBOARD_H
+
+enum layer_names {
+    _BASE,
+    _FN1,
+    _FN2,
+    _FN3
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+  [_BASE] = LAYOUT_all(
+    QK_GESC, 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_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_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, MO(_FN1),
+    KC_LCTL, KC_LGUI, KC_LALT,                            KC_SPC,                                         KC_RALT, KC_RGUI, KC_RCTL
+  ),
+
+  [_FN1] = LAYOUT_all(
+    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, KC_DEL,
+    RGB_TOG, RGB_MOD, KC_UP,   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+    BL_BRTG, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+    BL_INC,  BL_TOGG, _______, _______, _______, _______, _______, _______, _______, _______,                   _______, _______,
+    _______,  _______, _______,                           _______,                                     _______, _______, QK_BOOT
+  ),
+
+  [_FN2] = LAYOUT_all(
+    _______, _______,   _______,   _______,   _______,   _______,   _______,   _______,   _______,   _______,   _______,  _______,  _______,  _______, _______,
+    _______, _______, _______,   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+    _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+    _______,  _______, _______, _______, _______, _______, _______, _______, _______, _______,                   _______, _______,
+    _______,  _______, _______,                            _______,                                     _______, _______, _______
+  ),
+
+  [_FN3] = LAYOUT_all(
+    _______, _______,   _______,   _______,   _______,   _______,   _______,   _______,   _______,   _______,   _______,  _______,  _______,  _______, _______,
+    _______, _______, _______,   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+    _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+    _______,  _______, _______, _______, _______, _______, _______, _______, _______, _______,                   _______, _______,
+    _______,  _______, _______,                            _______,                                     _______, _______, _______
+  )
+};

+ 45 - 0
keyboards/cannonkeys/ellipse_hs/keymaps/via/keymap.c

@@ -0,0 +1,45 @@
+// Copyright 2022 Andrew Kannan (@awkannan)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include QMK_KEYBOARD_H
+
+enum layer_names {
+    _BASE,
+    _FN1,
+    _FN2,
+    _FN3
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+  [_BASE] = LAYOUT_all(
+    QK_GESC, 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_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_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, MO(_FN1),
+    KC_LCTL, KC_LGUI, KC_LALT,                            KC_SPC,                                         KC_RALT, KC_RGUI, KC_RCTL
+  ),
+
+  [_FN1] = LAYOUT_all(
+    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, KC_DEL,
+    _______, _______, KC_UP,   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+    _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+    _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,                   _______, _______,
+    _______,  _______, _______,                           _______,                                     _______, _______, QK_BOOT
+  ),
+
+  [_FN2] = LAYOUT_all(
+    _______, _______,   _______,   _______,   _______,   _______,   _______,   _______,   _______,   _______,   _______,  _______,  _______,  _______, _______,
+    _______, _______, _______,   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+    _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+    _______,  _______, _______, _______, _______, _______, _______, _______, _______, _______,                   _______, _______,
+    _______,  _______, _______,                            _______,                                     _______, _______, _______
+  ),
+
+  [_FN3] = LAYOUT_all(
+    _______, _______,   _______,   _______,   _______,   _______,   _______,   _______,   _______,   _______,   _______,  _______,  _______,  _______, _______,
+    _______, _______, _______,   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+    _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+    _______,  _______, _______, _______, _______, _______, _______, _______, _______, _______,                   _______, _______,
+    _______,  _______, _______,                            _______,                                     _______, _______, _______
+  )
+};

+ 1 - 0
keyboards/cannonkeys/ellipse_hs/keymaps/via/rules.mk

@@ -0,0 +1 @@
+VIA_ENABLE = yes

+ 25 - 0
keyboards/cannonkeys/ellipse_hs/readme.md

@@ -0,0 +1,25 @@
+# Ellipse Hotswap
+
+*A ellipse inspired 60% keyboard with 3 mounting styles from Skepur*
+
+* Keyboard Maintainer: [Andrew Kannan](https://github.com/awkannan)
+* Hardware Supported: STM32F072CBT6
+* Hardware Availability: [CannonKeys](https://cannonkeys.com)
+
+Make example for this keyboard (after setting up your build environment):
+
+    make cannonkeys/ellipse_hs:default
+
+Flashing example for this keyboard:
+
+    make cannonkeys/ellipse_hs: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 reset button**: Swap the boot switch on the back of the PCB to "1" and hit the reset button
+* **Keycode in layout**: Press the key mapped to `RESET` if it is available

+ 2 - 0
keyboards/cannonkeys/ellipse_hs/rules.mk

@@ -0,0 +1,2 @@
+# Wildcard to allow APM32 MCU
+DFU_SUFFIX_ARGS = -v FFFF -p FFFF

+ 64 - 0
keyboards/controllerworks/mini36/config.h

@@ -0,0 +1,64 @@
+/*
+ * Copyright 2022 Kevin Gee <info@controller.works>
+ * 
+ * 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"
+
+/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
+/* #define DEBOUNCE 5 */
+
+#define WS2812_PIO_USE_PIO1
+#define RGBLED_NUM 48
+#define DRIVER_LED_TOTAL RGBLED_NUM
+#define RGB_MATRIX_SPLIT \
+        { 24, 24 }
+
+#define SPLIT_TRANSPORT_MIRROR
+#define SPLIT_LAYER_STATE_ENABLE
+#define SPLIT_LED_STATE_ENABLE
+#define SPLIT_MODS_ENABLE
+
+#define I2C_DRIVER I2CD1
+#define I2C1_SCL_PIN GP25
+#define I2C1_SDA_PIN GP24
+
+/* #define EE_HANDS  */
+/* #define MASTER_LEFT */
+/* #define MASTER_RIGHT */
+
+/* Top left key on left half */
+#define BOOTMAGIC_LITE_ROW    0
+#define BOOTMAGIC_LITE_COLUMN 0
+/* Top right key on right half */
+#define BOOTMAGIC_LITE_ROW_RIGHT    0
+#define BOOTMAGIC_LITE_COLUMN_RIGHT 0
+/*
+ * Feature disable options
+ *  These options are also useful to firmware size reduction.
+ */
+
+/* disable debug print */
+//#define NO_DEBUG
+
+/* disable print */
+//#define NO_PRINT
+
+/* disable action features */
+//#define NO_ACTION_LAYER
+//#define NO_ACTION_TAPPING
+//#define NO_ACTION_ONESHOT

+ 22 - 0
keyboards/controllerworks/mini36/halconf.h

@@ -0,0 +1,22 @@
+/*
+ * Copyright 2022 Kevin Gee <info@controller.works>
+ * 
+ * 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
+
+#define HAL_USE_I2C TRUE
+
+#include_next "halconf.h"

+ 154 - 0
keyboards/controllerworks/mini36/info.json

@@ -0,0 +1,154 @@
+{
+    "manufacturer": "Controller Works",
+    "keyboard_name": "mini36",
+    "maintainer": "controller-works",
+    "processor": "RP2040",
+    "url": "https://controller.works/products/mini36-low-profile-ergonomic-keyboard",
+    "tags": ["split", "RP2040", "choc v1", "choc spaced" ],    
+    "usb": {
+        "device_version": "1.0.0",
+        "pid": "0x0004",
+        "vid": "0x4357"
+    },
+    "bootloader": "rp2040",
+    "diode_direction": "COL2ROW",
+    "build": {
+        "lto":true
+    },
+    "matrix_pins": {
+        "direct": [
+            ["GP3",  "GP4",   "GP5",  "GP6",  "GP7"],
+            ["GP9",  "GP10", "GP11", "GP12", "GP13"],
+            ["GP15", "GP16", "GP17", "GP18", "GP19"],
+            ["GP20", "GP21", "GP22",   null,   null]
+        ]
+    },
+    "rgblight": {
+        "pin": "GP0"
+     },
+    "split": {
+        "enabled": true,
+        "matrix_pins": {
+            "right": {
+                "direct": [
+                    ["GP7",   "GP6",  "GP5",  "GP4",  "GP3"],
+                    ["GP13", "GP12", "GP11", "GP10",  "GP9"],
+                    ["GP19", "GP18", "GP17", "GP16", "GP15"],
+                    ["GP22", "GP21", "GP20",   null,   null]                    
+                ]
+            }
+        },
+        "soft_serial_pin": "GP1",
+        "transport": {
+            "protocol": "serial"
+        }
+    },
+    "features": {
+        "bootmagic": true,
+        "command": false,
+        "console": false,
+        "extrakey": true,
+        "mousekey": true,
+        "nkro": true,
+        "rgb_matrix": true,
+        "oled": true
+    },
+    
+    "rgb_matrix": {
+        "driver": "WS2812",
+        "layout": [
+            { "flags": 2, "x": 71, "y": 4 },
+            { "flags": 2, "x": 32, "y": 2 },
+            { "flags": 2, "x": 0, "y": 24 },
+            { "flags": 2, "x": 16, "y": 51 },
+            { "flags": 2, "x": 63, "y": 58 },
+            { "flags": 2, "x": 94, "y": 55 },
+            { "flags": 1, "matrix": [3, 2], "x": 90,  "y": 64 },
+            { "flags": 4, "matrix": [2, 4], "x": 79,  "y": 39 },
+            { "flags": 4, "matrix": [1, 4], "x": 79,  "y": 22 },
+            { "flags": 4, "matrix": [0, 4], "x": 79,  "y": 5 },
+            { "flags": 4, "matrix": [0, 3], "x": 61,  "y": 2 },
+            { "flags": 4, "matrix": [1, 3], "x": 61,  "y": 19 },
+            { "flags": 4, "matrix": [2, 3], "x": 61,  "y": 37 },
+            { "flags": 1, "matrix": [3, 1], "x": 74,  "y": 58 },
+            { "flags": 1, "matrix": [3, 0], "x": 53,  "y": 55 },
+            { "flags": 4, "matrix": [2, 2], "x": 43,  "y": 34 },
+            { "flags": 4, "matrix": [1, 2], "x": 43,  "y": 17 },
+            { "flags": 4, "matrix": [0, 2], "x": 43,  "y": 0 },
+            { "flags": 4, "matrix": [0, 1], "x": 25,  "y": 2 },
+            { "flags": 4, "matrix": [1, 1], "x": 25,  "y": 19 },
+            { "flags": 4, "matrix": [2, 1], "x": 25,  "y": 37 },
+            { "flags": 4, "matrix": [2, 0], "x": 7,  "y": 41 },
+            { "flags": 4, "matrix": [1, 0], "x": 7,  "y": 24 },
+            { "flags": 4, "matrix": [0, 0], "x": 7,  "y": 7 },
+            { "flags": 2, "x": 153, "y": 4 },
+            { "flags": 2, "x": 192, "y": 2 },
+            { "flags": 2, "x": 224, "y": 24 },
+            { "flags": 2, "x": 204, "y": 53 },
+            { "flags": 2, "x": 161, "y": 57 },
+            { "flags": 2, "x": 130, "y": 55 },
+            { "flags": 1, "matrix": [7, 0], "x": 134,  "y": 64 },
+            { "flags": 4, "matrix": [6, 0], "x": 145,  "y": 39 },
+            { "flags": 4, "matrix": [5, 0], "x": 145,  "y": 22 },
+            { "flags": 4, "matrix": [4, 0], "x": 145,  "y": 5 },
+            { "flags": 4, "matrix": [4, 1], "x": 163,  "y": 2 },
+            { "flags": 4, "matrix": [5, 1], "x": 163,  "y": 19 },
+            { "flags": 4, "matrix": [6, 1], "x": 163,  "y": 37 },
+            { "flags": 1, "matrix": [7, 1], "x": 150,  "y": 58 },
+            { "flags": 1, "matrix": [7, 2], "x": 171,  "y": 55 },
+            { "flags": 4, "matrix": [6, 2], "x": 181,  "y": 34 },
+            { "flags": 4, "matrix": [5, 2], "x": 181,  "y": 17 },
+            { "flags": 4, "matrix": [4, 2], "x": 181,  "y": 0 },
+            { "flags": 4, "matrix": [4, 3], "x": 199,  "y": 2 },
+            { "flags": 4, "matrix": [5, 3], "x": 199,  "y": 19 },
+            { "flags": 4, "matrix": [6, 3], "x": 199,  "y": 37 },
+            { "flags": 4, "matrix": [6, 4], "x": 217,  "y": 41 },
+            { "flags": 4, "matrix": [5, 4], "x": 217,  "y": 24 },
+            { "flags": 4, "matrix": [4, 4], "x": 217,  "y": 7 }
+          ]
+    },
+
+    "community_layouts": ["split_3x5_3"],
+    "layouts": {
+        "LAYOUT_split_3x5_3": {
+            "layout": [
+                { "matrix": [0, 0], "x": 0, "y": 0.25 },
+                { "matrix": [0, 1], "x": 1, "y": 0.125 },
+                { "matrix": [0, 2], "x": 2, "y": 0 },
+                { "matrix": [0, 3], "x": 3, "y": 0.125 },
+                { "matrix": [0, 4], "x": 4, "y": 0.25 },
+                { "matrix": [4, 0], "x": 7, "y": 0.25 },
+                { "matrix": [4, 1], "x": 8, "y": 0.125 },
+                { "matrix": [4, 2], "x": 9, "y": 0 },
+                { "matrix": [4, 3], "x": 10, "y": 0.125 },
+                { "matrix": [4, 4], "x": 11, "y": 0.25 },
+                { "matrix": [1, 0], "x": 0, "y": 1.25 },
+                { "matrix": [1, 1], "x": 1, "y": 1.125 },
+                { "matrix": [1, 2], "x": 2, "y": 1 },
+                { "matrix": [1, 3], "x": 3, "y": 1.125 },
+                { "matrix": [1, 4], "x": 4, "y": 1.25 },
+                { "matrix": [5, 0], "x": 7, "y": 1.25 },
+                { "matrix": [5, 1], "x": 8, "y": 1.125 },
+                { "matrix": [5, 2], "x": 9, "y": 1 },
+                { "matrix": [5, 3], "x": 10, "y": 1.125 },
+                { "matrix": [5, 4], "x": 11, "y": 1.25 },
+                { "matrix": [2, 0], "x": 0, "y": 2.25 },
+                { "matrix": [2, 1], "x": 1, "y": 2.125 },
+                { "matrix": [2, 2], "x": 2, "y": 2 },
+                { "matrix": [2, 3], "x": 3, "y": 2.125 },
+                { "matrix": [2, 4], "x": 4, "y": 2.25 },
+                { "matrix": [6, 0], "x": 7, "y": 2.25 },
+                { "matrix": [6, 1], "x": 8, "y": 2.125 },
+                { "matrix": [6, 2], "x": 9, "y": 2 },
+                { "matrix": [6, 3], "x": 10, "y": 2.125 },
+                { "matrix": [6, 4], "x": 11, "y": 2.25 },
+                { "matrix": [3, 0], "x": 2.5, "y": 3.25 },
+                { "matrix": [3, 1], "x": 3.5, "y": 3.5 },
+                { "matrix": [3, 2], "x": 4.5, "y": 3.75, "h":1.5 },
+                { "matrix": [7, 0], "x": 6.5, "y": 3.75, "h":1.5 },
+                { "matrix": [7, 1], "x": 7.5, "y": 3.5 },
+                { "matrix": [7, 2], "x": 8.5, "y": 3.25 }
+            ]
+          }
+    }
+}

+ 79 - 0
keyboards/controllerworks/mini36/keymaps/default/config.h

@@ -0,0 +1,79 @@
+/*
+ * Copyright 2022 Kevin Gee <info@controller.works>
+ * 
+ * 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
+#ifdef RGB_MATRIX_ENABLE
+//#    define SPLIT_TRANSPORT_MIRROR
+#   define RGB_MATRIX_KEYPRESSES // reacts to keypresses
+// #   define RGB_MATRIX_KEYRELEASES // reacts to keyreleases (instead of keypresses)
+// #   define RGB_DISABLE_AFTER_TIMEOUT 0 // number of ticks to wait until disabling effects
+#   define RGB_DISABLE_WHEN_USB_SUSPENDED // turn off effects when suspended
+#   define RGB_MATRIX_FRAMEBUFFER_EFFECTS
+// #   define RGB_MATRIX_LED_PROCESS_LIMIT (DRIVER_LED_TOTAL + 4) / 5 // limits the number of LEDs to process in an animation per task run (increases keyboard responsiveness)
+// #   define RGB_MATRIX_LED_FLUSH_LIMIT 16 // limits in milliseconds how frequently an animation will update the LEDs. 16 (16ms) is equivalent to limiting to 60fps (increases keyboard responsiveness)
+#    define RGB_MATRIX_MAXIMUM_BRIGHTNESS 150 // limits maximum brightness of LEDs to 150 out of 255. Higher may cause the controller to crash.
+#    define RGB_MATRIX_HUE_STEP 8
+#    define RGB_MATRIX_SAT_STEP 8
+#    define RGB_MATRIX_VAL_STEP 8
+#    define RGB_MATRIX_SPD_STEP 10
+
+#    define ENABLE_RGB_MATRIX_ALPHAS_MODS
+#    define ENABLE_RGB_MATRIX_GRADIENT_UP_DOWN
+#    define ENABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT
+#    define ENABLE_RGB_MATRIX_BREATHING
+#    define ENABLE_RGB_MATRIX_BAND_SAT
+#    define ENABLE_RGB_MATRIX_BAND_VAL
+#    define ENABLE_RGB_MATRIX_BAND_PINWHEEL_SAT
+#    define ENABLE_RGB_MATRIX_BAND_PINWHEEL_VAL
+#    define ENABLE_RGB_MATRIX_BAND_SPIRAL_SAT
+#    define ENABLE_RGB_MATRIX_BAND_SPIRAL_VAL
+#    define ENABLE_RGB_MATRIX_CYCLE_ALL
+#    define ENABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT
+#    define ENABLE_RGB_MATRIX_CYCLE_UP_DOWN
+#    define ENABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON
+#    define ENABLE_RGB_MATRIX_CYCLE_OUT_IN
+#    define ENABLE_RGB_MATRIX_CYCLE_OUT_IN_DUAL
+#    define ENABLE_RGB_MATRIX_CYCLE_PINWHEEL
+#    define ENABLE_RGB_MATRIX_CYCLE_SPIRAL
+#    define ENABLE_RGB_MATRIX_DUAL_BEACON
+#    define ENABLE_RGB_MATRIX_RAINBOW_BEACON
+#    define ENABLE_RGB_MATRIX_RAINBOW_PINWHEELS
+#    define ENABLE_RGB_MATRIX_RAINDROPS
+#    define ENABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS
+#    define ENABLE_RGB_MATRIX_HUE_BREATHING
+#    define ENABLE_RGB_MATRIX_HUE_PENDULUM
+#    define ENABLE_RGB_MATRIX_HUE_WAVE
+#    define ENABLE_RGB_MATRIX_PIXEL_RAIN
+#    define ENABLE_RGB_MATRIX_PIXEL_FLOW
+#    define ENABLE_RGB_MATRIX_PIXEL_FRACTAL
+// enabled only if RGB_MATRIX_FRAMEBUFFER_EFFECTS is defined
+#    define ENABLE_RGB_MATRIX_TYPING_HEATMAP
+#    define ENABLE_RGB_MATRIX_DIGITAL_RAIN
+// enabled only of RGB_MATRIX_KEYPRESSES or RGB_MATRIX_KEYRELEASES is defined
+#    define ENABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE
+#    define ENABLE_RGB_MATRIX_SOLID_REACTIVE
+#    define ENABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE
+#    define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE
+#    define ENABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS
+#    define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTICROSS
+#    define ENABLE_RGB_MATRIX_SOLID_REACTIVE_NEXUS
+#    define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTINEXUS
+#    define ENABLE_RGB_MATRIX_SPLASH
+#    define ENABLE_RGB_MATRIX_MULTISPLASH
+#    define ENABLE_RGB_MATRIX_SOLID_SPLASH
+#    define ENABLE_RGB_MATRIX_SOLID_MULTISPLASH
+#endif

+ 68 - 0
keyboards/controllerworks/mini36/keymaps/default/keymap.c

@@ -0,0 +1,68 @@
+/*
+ * Copyright 2022 Kevin Gee <info@controller.works>
+ * 
+ * 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_split_3x5_3(
+  //,--------------------------------------------.                    ,--------------------------------------------.
+         KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,                         KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,
+  //|--------+--------+--------+--------+--------|                    |--------+--------+--------+--------+--------|
+ LCTL_T(KC_A),    KC_S,    KC_D,    KC_F,    KC_G,                         KC_H,    KC_J,    KC_K,    KC_L, KC_SCLN,
+  //|--------+--------+--------+--------+--------|                    |--------+--------+--------+--------+--------|
+ LSFT_T(KC_Z),    KC_X,    KC_C,    KC_V,    KC_B,                         KC_N,    KC_M, KC_COMM,  KC_DOT, KC_SLSH,
+  //|--------+--------+--------+--------+--------+--------|  |--------+--------+--------+--------+--------+--------|
+                                 KC_LGUI,   MO(1),  KC_SPC,     KC_SPC,   MO(2), GUI_T(KC_TAB)
+                            //`--------------------------'  `--------------------------'
+
+  ),
+
+  [1] = LAYOUT_split_3x5_3(
+  //,--------------------------------------------.                    ,--------------------------------------------.
+         KC_1,    KC_2,    KC_3,    KC_4,    KC_5,                         KC_6,    KC_7,    KC_8,    KC_9,    KC_0,
+  //|--------+--------+--------+--------+--------|                    |--------+--------+--------+--------+--------|
+       KC_TAB, XXXXXXX, XXXXXXX, XXXXXXX, KC_PGUP,                      XXXXXXX,   KC_UP, XXXXXXX, XXXXXXX, XXXXXXX,
+  //|--------+--------+--------+--------+--------|                    |--------+--------+--------+--------+--------|
+      KC_MPRV, KC_MPLY, KC_MNXT, XXXXXXX, KC_PGDN,                      KC_LEFT, KC_DOWN, KC_RIGHT, XXXXXXX, XXXXXXX,
+  //|--------+--------+--------+--------+--------+--------|  |--------+--------+--------+--------+--------+--------|
+                                 KC_LGUI, _______,  KC_ESC,     KC_ENT,   MO(3), KC_RALT
+                             //`--------------------------'  `--------------------------'
+  ),
+
+  [2] = LAYOUT_split_3x5_3(
+  //,--------------------------------------------.                    ,--------------------------------------------.
+      KC_EXLM,   KC_AT, KC_HASH,  KC_DLR, KC_PERC,                      KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN,
+  //|--------+--------+--------+--------+--------|                    |--------+--------+--------+--------+--------|
+        KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,                      KC_MINS,  KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS,
+  //|--------+--------+--------+--------+--------|                    |--------+--------+--------+--------+--------|
+        KC_F6,   KC_F7,   KC_F8,   KC_F9,  KC_F10,                      KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE,
+  //|--------+--------+--------+--------+--------+--------|  |--------+--------+--------+--------+--------+--------|
+                                 KC_LGUI,   MO(3),  KC_ESC,     KC_DEL, _______, KC_RALT
+                             //`--------------------------'  `--------------------------'
+  ),
+
+  [3] = LAYOUT_split_3x5_3(
+  //,--------------------------------------------.                    ,--------------------------------------------.
+      QK_BOOT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,                      XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+  //|--------+--------+--------+--------+--------|                    |--------+--------+--------+--------+--------|
+      RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, RGB_SPI,                      XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+  //|--------+--------+--------+--------+--------|                    |--------+--------+--------+--------+--------|
+      RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, RGB_SPD,                      XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+  //|--------+--------+--------+--------+--------+--------|  |--------+--------+--------+--------+--------+--------|
+                                 KC_LGUI, _______,  KC_SPC,     KC_ENT, _______, KC_RALT
+                             //`--------------------------'  `--------------------------'
+  )
+};

+ 79 - 0
keyboards/controllerworks/mini36/keymaps/via/config.h

@@ -0,0 +1,79 @@
+/*
+ * Copyright 2022 Kevin Gee <info@controller.works>
+ * 
+ * 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
+#ifdef RGB_MATRIX_ENABLE
+//#    define SPLIT_TRANSPORT_MIRROR
+#   define RGB_MATRIX_KEYPRESSES // reacts to keypresses
+// #   define RGB_MATRIX_KEYRELEASES // reacts to keyreleases (instead of keypresses)
+// #   define RGB_DISABLE_AFTER_TIMEOUT 0 // number of ticks to wait until disabling effects
+#   define RGB_DISABLE_WHEN_USB_SUSPENDED // turn off effects when suspended
+#   define RGB_MATRIX_FRAMEBUFFER_EFFECTS
+// #   define RGB_MATRIX_LED_PROCESS_LIMIT (DRIVER_LED_TOTAL + 4) / 5 // limits the number of LEDs to process in an animation per task run (increases keyboard responsiveness)
+// #   define RGB_MATRIX_LED_FLUSH_LIMIT 16 // limits in milliseconds how frequently an animation will update the LEDs. 16 (16ms) is equivalent to limiting to 60fps (increases keyboard responsiveness)
+#    define RGB_MATRIX_MAXIMUM_BRIGHTNESS 150 // limits maximum brightness of LEDs to 150 out of 255. Higher may cause the controller to crash.
+#    define RGB_MATRIX_HUE_STEP 8
+#    define RGB_MATRIX_SAT_STEP 8
+#    define RGB_MATRIX_VAL_STEP 8
+#    define RGB_MATRIX_SPD_STEP 10
+
+#    define ENABLE_RGB_MATRIX_ALPHAS_MODS
+#    define ENABLE_RGB_MATRIX_GRADIENT_UP_DOWN
+#    define ENABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT
+#    define ENABLE_RGB_MATRIX_BREATHING
+#    define ENABLE_RGB_MATRIX_BAND_SAT
+#    define ENABLE_RGB_MATRIX_BAND_VAL
+#    define ENABLE_RGB_MATRIX_BAND_PINWHEEL_SAT
+#    define ENABLE_RGB_MATRIX_BAND_PINWHEEL_VAL
+#    define ENABLE_RGB_MATRIX_BAND_SPIRAL_SAT
+#    define ENABLE_RGB_MATRIX_BAND_SPIRAL_VAL
+#    define ENABLE_RGB_MATRIX_CYCLE_ALL
+#    define ENABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT
+#    define ENABLE_RGB_MATRIX_CYCLE_UP_DOWN
+#    define ENABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON
+#    define ENABLE_RGB_MATRIX_CYCLE_OUT_IN
+#    define ENABLE_RGB_MATRIX_CYCLE_OUT_IN_DUAL
+#    define ENABLE_RGB_MATRIX_CYCLE_PINWHEEL
+#    define ENABLE_RGB_MATRIX_CYCLE_SPIRAL
+#    define ENABLE_RGB_MATRIX_DUAL_BEACON
+#    define ENABLE_RGB_MATRIX_RAINBOW_BEACON
+#    define ENABLE_RGB_MATRIX_RAINBOW_PINWHEELS
+#    define ENABLE_RGB_MATRIX_RAINDROPS
+#    define ENABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS
+#    define ENABLE_RGB_MATRIX_HUE_BREATHING
+#    define ENABLE_RGB_MATRIX_HUE_PENDULUM
+#    define ENABLE_RGB_MATRIX_HUE_WAVE
+#    define ENABLE_RGB_MATRIX_PIXEL_RAIN
+#    define ENABLE_RGB_MATRIX_PIXEL_FLOW
+#    define ENABLE_RGB_MATRIX_PIXEL_FRACTAL
+// enabled only if RGB_MATRIX_FRAMEBUFFER_EFFECTS is defined
+#    define ENABLE_RGB_MATRIX_TYPING_HEATMAP
+#    define ENABLE_RGB_MATRIX_DIGITAL_RAIN
+// enabled only of RGB_MATRIX_KEYPRESSES or RGB_MATRIX_KEYRELEASES is defined
+#    define ENABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE
+#    define ENABLE_RGB_MATRIX_SOLID_REACTIVE
+#    define ENABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE
+#    define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE
+#    define ENABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS
+#    define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTICROSS
+#    define ENABLE_RGB_MATRIX_SOLID_REACTIVE_NEXUS
+#    define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTINEXUS
+#    define ENABLE_RGB_MATRIX_SPLASH
+#    define ENABLE_RGB_MATRIX_MULTISPLASH
+#    define ENABLE_RGB_MATRIX_SOLID_SPLASH
+#    define ENABLE_RGB_MATRIX_SOLID_MULTISPLASH
+#endif

+ 68 - 0
keyboards/controllerworks/mini36/keymaps/via/keymap.c

@@ -0,0 +1,68 @@
+/*
+ * Copyright 2022 Kevin Gee <info@controller.works>
+ * 
+ * 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_split_3x5_3(
+  //,--------------------------------------------.                    ,--------------------------------------------.
+         KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,                         KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,
+  //|--------+--------+--------+--------+--------|                    |--------+--------+--------+--------+--------|
+ LCTL_T(KC_A),    KC_S,    KC_D,    KC_F,    KC_G,                         KC_H,    KC_J,    KC_K,    KC_L, KC_SCLN,
+  //|--------+--------+--------+--------+--------|                    |--------+--------+--------+--------+--------|
+ LSFT_T(KC_Z),    KC_X,    KC_C,    KC_V,    KC_B,                         KC_N,    KC_M, KC_COMM,  KC_DOT, KC_SLSH,
+  //|--------+--------+--------+--------+--------+--------|  |--------+--------+--------+--------+--------+--------|
+                                 KC_LGUI,   MO(1),  KC_SPC,     KC_SPC,   MO(2), GUI_T(KC_TAB)
+                            //`--------------------------'  `--------------------------'
+
+  ),
+
+  [1] = LAYOUT_split_3x5_3(
+  //,--------------------------------------------.                    ,--------------------------------------------.
+         KC_1,    KC_2,    KC_3,    KC_4,    KC_5,                         KC_6,    KC_7,    KC_8,    KC_9,    KC_0,
+  //|--------+--------+--------+--------+--------|                    |--------+--------+--------+--------+--------|
+       KC_TAB, XXXXXXX, XXXXXXX, XXXXXXX, KC_PGUP,                      XXXXXXX,   KC_UP, XXXXXXX, XXXXXXX, XXXXXXX,
+  //|--------+--------+--------+--------+--------|                    |--------+--------+--------+--------+--------|
+      KC_MPRV, KC_MPLY, KC_MNXT, XXXXXXX, KC_PGDN,                      KC_LEFT, KC_DOWN, KC_RIGHT, XXXXXXX, XXXXXXX,
+  //|--------+--------+--------+--------+--------+--------|  |--------+--------+--------+--------+--------+--------|
+                                 KC_LGUI, _______,  KC_ESC,     KC_ENT,   MO(3), KC_RALT
+                             //`--------------------------'  `--------------------------'
+  ),
+
+  [2] = LAYOUT_split_3x5_3(
+  //,--------------------------------------------.                    ,--------------------------------------------.
+      KC_EXLM,   KC_AT, KC_HASH,  KC_DLR, KC_PERC,                      KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN,
+  //|--------+--------+--------+--------+--------|                    |--------+--------+--------+--------+--------|
+        KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,                      KC_MINS,  KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS,
+  //|--------+--------+--------+--------+--------|                    |--------+--------+--------+--------+--------|
+        KC_F6,   KC_F7,   KC_F8,   KC_F9,  KC_F10,                      KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE,
+  //|--------+--------+--------+--------+--------+--------|  |--------+--------+--------+--------+--------+--------|
+                                 KC_LGUI,   MO(3),  KC_ESC,     KC_DEL, _______, KC_RALT
+                             //`--------------------------'  `--------------------------'
+  ),
+
+  [3] = LAYOUT_split_3x5_3(
+  //,--------------------------------------------.                    ,--------------------------------------------.
+      QK_BOOT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,                      XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+  //|--------+--------+--------+--------+--------|                    |--------+--------+--------+--------+--------|
+      RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, RGB_SPI,                      XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+  //|--------+--------+--------+--------+--------|                    |--------+--------+--------+--------+--------|
+      RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, RGB_SPD,                      XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+  //|--------+--------+--------+--------+--------+--------|  |--------+--------+--------+--------+--------+--------|
+                                 KC_LGUI, _______,  KC_SPC,     KC_ENT, _______, KC_RALT
+                             //`--------------------------'  `--------------------------'
+  )
+};

+ 1 - 0
keyboards/controllerworks/mini36/keymaps/via/rules.mk

@@ -0,0 +1 @@
+VIA_ENABLE = yes

+ 23 - 0
keyboards/controllerworks/mini36/mcuconf.h

@@ -0,0 +1,23 @@
+/*
+ * Copyright 2022 Kevin Gee <info@controller.works>
+ *
+ * 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_next "mcuconf.h"
+
+#undef RP_I2C_USE_I2C0
+#define RP_I2C_USE_I2C0 TRUE

+ 82 - 0
keyboards/controllerworks/mini36/mini36.c

@@ -0,0 +1,82 @@
+/*
+ * Copyright 2022 Kevin Gee <info@controller.works>
+ * 
+ * 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 "quantum.h"
+
+#ifdef OLED_ENABLE
+
+static void render_logo(void) {
+    static const char PROGMEM raw_logo[] = {
+        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 12, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 12, 12,  0,  0,  0,  0,  0,  0,  0,  6,  6,  6,  6,  6,134,230,126, 30,  6,  0,  0,  0,  0,  0,128,192, 96, 56, 28,  6,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,248,252,  6,  3,  3,  3,  3,  7,254,252,  6,  3,  3,  3,  3,  6,252,248,  0,  0,  0,  0,  0,  0,255,255,  0,  0,  0,  0,  0,  0,248,252,  6,  3,  3,  3,  3,  3,  3,  6,252,248,  0,  0,  0,  0,  0,  0,255,255,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 28, 31, 27, 24, 48,224,192,  0,  0,240,252, 62, 27, 25, 24, 24, 24, 24, 48,224,192,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
+        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,127,  0,  0,  0,  0,  0,  0,127,127,  0,  0,  0,  0,  0,  0,127,127,  0,  0,  0,  0,  0,  0,127,127,  0,  0,  0,  0,  0,  0,127,127,  0,  0,  0,  0,  0,  0,  0,  0,127,127,  0,  0,  0,  0,  0,  0,127,127,  0,  0,  0,  0,  0, 12, 24, 48, 96, 96, 96, 96, 96, 96, 48, 31, 15,  0,  0, 15, 31, 48, 96, 96, 96, 96, 96, 96, 48, 31, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    };
+    oled_write_raw_P(raw_logo, sizeof(raw_logo));
+}
+
+oled_rotation_t oled_init_kb(oled_rotation_t rotation) {
+    if (!is_keyboard_master()) {
+        return OLED_ROTATION_180;  // flips the display 180 degrees if offhand
+    }
+
+    return rotation;
+}
+
+bool render_status(void) {
+    // Host Keyboard Layer Status
+    oled_write_P(PSTR("Layer: "), false);
+
+    switch (get_highest_layer(layer_state)) {
+        case 0:
+            oled_write_P(PSTR("BASE\n"), false);
+            break;
+        case 1:
+            oled_write_P(PSTR("LOWER\n"), false);
+            break;
+        case 2:
+            oled_write_P(PSTR("RAISE\n"), false);
+            break;
+        case 3:
+            oled_write_P(PSTR("ADJUST\n"), false);
+            break;            
+        default:
+            // Or use the write_ln shortcut over adding '\n' to the end of your string
+            oled_write_ln_P(PSTR("Undefined"), false);
+    }
+
+    // Host Keyboard LED Status
+    led_t led_state = host_keyboard_led_state();
+    oled_write_P(led_state.num_lock ? PSTR("NUM ") : PSTR("    "), false);
+    oled_write_P(led_state.caps_lock ? PSTR("CAP ") : PSTR("    "), false);
+    oled_write_P(led_state.scroll_lock ? PSTR("SCR ") : PSTR("    "), false);
+    
+    return false;
+}
+
+bool oled_task_kb(void) {
+    if (!oled_task_user()) {
+        return false;
+    }
+    if (is_keyboard_master()) {
+        render_status();  // Renders the current keyboard state (layer, lock, caps, scroll, etc)
+    } else {
+        render_logo();  // Renders a static logo
+        oled_scroll_left();  // Turns on scrolling
+    }
+    return false;
+}
+
+#endif

+ 43 - 0
keyboards/controllerworks/mini36/readme.md

@@ -0,0 +1,43 @@
+# mini36
+
+![mini36](https://i.imgur.com/JwhiE9ll.png)
+![mini36PCB](https://i.imgur.com/6NjZ8Cql.jpg)
+
+*A pre-built, low profile, split mechanical keyboard with 36 keys based on the RP2040 processor*
+
+* Keyboard Maintainer: [Kevin Gee](https://github.com/controller-works)
+* Hardware Supported: *mini36 split ergonomic keyboard*
+* Hardware Availability: *https://controller.works/products/mini36-low-profile-ergonomic-keyboard* Hardware is available as pre-built units only.
+
+Make example for this keyboard (after setting up your build environment):
+
+```sh
+    make controllerworks/mini36:default
+```
+
+Flashing example for this keyboard:
+
+```sh
+    make controllerworks/mini36: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).
+
+## Features
+- Highly integrated design with microcontroller, USB and TRRS connectors, and OLED all integrated on the main board with no secondary modules
+- RP2040 processor by Raspberry Pi Foundation running at 130 MHz with 16MB flash memory
+- CNC milled aluminum case with only 8mm thickness
+- "PCB art" shine through back plate with gold surface finish
+- 128x32 OLED on each keyboard half
+- 36 per-key RGB LEDs and 12 backlight RGB LEDS are individually addressable
+- ESD and over-current protection on USB and TRRS connectors
+- Reset and boot tactile switches
+- USB C host connection
+- Hot swap connectors for Kailh Chocolate PG1350 switches
+- Chocolate key spacing (18mm horizontal x 17mm vertical) 
+## Bootloader
+
+Enter the bootloader in 3 ways:
+
+* **Bootmagic reset**: Hold down the upper left key on the left hand keyboard half or the upper right key on the right hand keyboard half while plugging in USB
+* **Physical reset button**: Press the RST button twice, rapidly
+* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available

+ 3 - 0
keyboards/controllerworks/mini36/rules.mk

@@ -0,0 +1,3 @@
+SERIAL_DRIVER = vendor
+WS2812_DRIVER = vendor
+OLED_DRIVER   = SSD1306

+ 61 - 45
keyboards/han60/han60.h

@@ -26,78 +26,94 @@
  * The second converts the arguments into a two-dimensional array which
  * represents the switch matrix.
  */
- 
+
 #define XXX KC_NO
 
+/*
+ *              ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐          ┌───────┐
+ *              │00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0A │0B │0C │0D │2D │          │0D     │ 2u Backspace
+ *              ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤          └─┬─────┤
+ *              │10   │11 │12 │13 │14 │15 │16 │17 │18 │19 │1A │1B │1C │1D   │            │     │
+ *  2.25u       ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤         ┌──┴┐2C  │ ISO Enter
+ *  LShift      │20    │21 │22 │23 │24 │25 │26 │27 │28 │29 │2A │2B │2C      │         │1D │    │
+ * ┌────────┐   ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤   ┌─────┴┬──┴┬───┤
+ * │30      │   │30  │40 │31 │32 │33 │34 │35 │36 │37 │38 │39 │3A │3B        │   │3B    │3D │4D │ 1.75u/1u/1u
+ * └────────┘   ├────┴┬──┴┬──┴──┬┴───┴───┴───┴───┴───┴───┴──┬┴───┴┬───┬─────┤   └──────┴───┴───┘
+ *              │41   │42 │43   │44                         │47   │49 │4B   │ Tsangan/WKL
+ *              └─────┴───┴─────┴───────────────────────────┴─────┴───┴─────┘
+ *              ┌─────┬───┬─────┬───────────────────────────┬───┬───┬───┬───┐
+ *              │41   │42 │43   │44                         │47 │48 │4A │4C │ Arrow
+ *              └─────┴───┴─────┴───────────────────────────┴───┴───┴───┴───┘
+ */
 
 #define LAYOUT_all( \
-	K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K2D, \
-	K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
-	K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B,      K2C,      \
-	K30, K40, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, K4D, \
-	K41, K42, K43,                K44,           K47, K48, K49, K4A, K4B, K4C  \
+    K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K2D, \
+    K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
+    K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B,      K2C, \
+    K30, K40, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, K4D, \
+    K41, K42, K43,                K44,           K47, K48, K49, K4A, K4B, K4C  \
 ) { \
     { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D }, \
     { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D }, \
-	{ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D }, \
-	{ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, XXX, K3D }, \
-	{ K40, K41, K42, K43, K44, XXX, XXX, K47, K48, K49, K4A, K4B, K4C, K4D }  \
+    { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D }, \
+    { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, XXX, K3D }, \
+    { K40, K41, K42, K43, K44, XXX, XXX, K47, K48, K49, K4A, K4B, K4C, K4D }  \
 }
 
-#define LAYOUT_tsangan( \
-	K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \
-	K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
-	K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B,      K2C, \
-	K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A,           K3B, \
-	K41, K42, K43,                K44,                     K47, K49, K4B  \
+#define LAYOUT_60_ansi_tsangan( \
+    K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \
+    K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
+    K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B,      K2C, \
+    K30,      K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A,      K3B, \
+    K41, K42, K43,                K44,                     K47, K49, K4B  \
 ) { \
     { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D }, \
     { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D }, \
-	{ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D }, \
-	{ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, XXX, XXX }, \
-	{ XXX, K41, K42, K43, K44, XXX, XXX, K47, XXX, K49, XXX, K4B, XXX, XXX }  \
+    { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, XXX }, \
+    { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, XXX, XXX }, \
+    { XXX, K41, K42, K43, K44, XXX, XXX, K47, XXX, K49, XXX, K4B, XXX, XXX }  \
 }
 
-#define LAYOUT_tsangan_arrowkeys( \
-	K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \
-	K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
-	K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B,      K2C, \
-	K30, K31, K32, K33, K34, K35, K36, K37, K38, K39,      K3B, K3D, K4D, \
-	K41, K42, K43,                K44,                K47, K48, K4A, K4C  \
+#define LAYOUT_60_ansi_arrow_tsangan( \
+    K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \
+    K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
+    K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B,      K2C, \
+    K30,      K31, K32, K33, K34, K35, K36, K37, K38, K39, K3B, K3D, K4D, \
+    K41, K42, K43,                K44,                K47, K48, K4A, K4C  \
 ) { \
     { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D }, \
     { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D }, \
-	{ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D }, \
-	{ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, XXX, K3B, XXX, K3D }, \
-	{ XXX, K41, K42, K43, K44, XXX, XXX, K47, K48, XXX, K4A, XXX, K4C, K4D }  \
+    { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, XXX }, \
+    { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, XXX, K3B, XXX, K3D }, \
+    { XXX, K41, K42, K43, K44, XXX, XXX, K47, K48, XXX, K4A, XXX, K4C, K4D }  \
 }
 
-#define LAYOUT_tsangan_iso( \
-	K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \
-	K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K2C, \
-	K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K1D, \
-	K30, K40, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A,      K3B, \
-	K41, K42, K43,                K44,                     K47, K49, K4B  \
+#define LAYOUT_60_iso_tsangan( \
+    K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \
+    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, K1D, K2C, \
+    K30, K40, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A,      K3B, \
+    K41, K42, K43,                K44,                     K47, K49, K4B  \
 ) { \
     { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D }, \
     { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D }, \
-	{ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D }, \
-	{ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, XXX, XXX }, \
-	{ K40, K41, K42, K43, K44, XXX, XXX, K47, XXX, K49, XXX, K4B, XXX, XXX }  \
+    { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, XXX }, \
+    { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, XXX, XXX }, \
+    { K40, K41, K42, K43, K44, XXX, XXX, K47, XXX, K49, XXX, K4B, XXX, XXX }  \
 }
 
-#define LAYOUT_tsangan_iso_arrowkeys( \
-	K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \
-	K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K2C, \
-	K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K1D, \
-	K30, K40, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3B, K3D, K4D, \
-	K41, K42, K43,                K44,                K47, K48, K4A, K4C  \
+#define LAYOUT_60_iso_arrow_tsangan( \
+    K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \
+    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, K1D, K2C, \
+    K30, K40, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3B, K3D, K4D, \
+    K41, K42, K43,                K44,                K47, K48, K4A, K4C  \
 ) { \
     { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D }, \
     { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D }, \
-	{ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D }, \
-	{ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, XXX, K3B, XXX, K3D }, \
-	{ K40, K41, K42, K43, K44, XXX, XXX, K47, K48, XXX, K4A, XXX, K4C, K4D }  \
+    { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, XXX }, \
+    { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, XXX, K3B, XXX, K3D }, \
+    { K40, K41, K42, K43, K44, XXX, XXX, K47, K48, XXX, K4A, XXX, K4C, K4D }  \
 }
 
 

+ 341 - 317
keyboards/han60/info.json

@@ -8,338 +8,362 @@
         "pid": "0xFB60",
         "device_version": "0.0.1"
     },
+    "layout_aliases": {
+        "LAYOUT_tsangan": "LAYOUT_60_ansi_tsangan",
+        "LAYOUT_tsangan_arrowkeys": "LAYOUT_60_ansi_arrow_tsangan"
+    },
     "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 },
-                { "w": 1.5, "x": 0, "y": 1 },
-                { "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 },
-                { "w": 1.5, "x": 13.5, "y": 1 },
-                { "w": 1.75, "x": 0, "y": 2 },
-                { "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 },
-                { "w": 2.25, "x": 12.75, "y": 2 },
-                { "w": 1.25, "x": 0, "y": 3 },
-                { "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 },
-                { "w": 1.75, "x": 11.25, "y": 3 },
-                { "x": 13, "y": 3 },
-                { "x": 14, "y": 3 },
-                { "w": 1.5, "x": 0, "y": 4 },
-                { "x": 1.5, "y": 4 },
-                { "w": 1.5, "x": 2.5, "y": 4 },
-                { "w": 7, "x": 4, "y": 4 },
-                { "x": 11, "y": 4 },
-                { "x": 12, "y": 4 },
-                { "x": 12.5, "y": 4 },
-                { "x": 13, "y": 4 },
-                { "w": 1.5, "x": 13.5, "y": 4 },
-                { "x": 14, "y": 4 }
+                {"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":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":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, "w":2.25},
+
+                {"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":0.75},
+                {"x":13, "y":3},
+                {"x":14, "y":3},
+
+                {"x":0, "y":4, "w":1.5},
+                {"x":1.5, "y":4},
+                {"x":2.5, "y":4, "w":1.5},
+                {"x":4, "y":4, "w":7},
+                {"x":11, "y":4},
+                {"x":12, "y":4, "w":0.6},
+                {"x":12.6, "y":4, "w":0.6},
+                {"x":13.2, "y":4, "w":0.6},
+                {"x":13.8, "y":4, "w":0.6},
+                {"x":14.4, "y":4, "w":0.6}
             ]
         },
-		"LAYOUT_tsangan": {
+        "LAYOUT_60_ansi_tsangan": {
             "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 },
-                { "w": 2, "x": 13, "y": 0 },
-                { "w": 1.5, "x": 0, "y": 1 },
-                { "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 },
-                { "w": 1.5, "x": 13.5, "y": 1 },
-                { "w": 1.75, "x": 0, "y": 2 },
-                { "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 },
-                { "w": 2.25, "x": 12.75, "y": 2 },
-                { "w": 2.25, "x": 0, "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 },
-                { "w": 2.75, "x": 12.25, "y": 3 },
-                { "w": 1.5, "x": 0, "y": 4 },
-                { "x": 1.5, "y": 4 },
-                { "w": 1.5, "x": 2.5, "y": 4 },
-                { "w": 7, "x": 4, "y": 4 },
-                { "w": 1.5, "x": 11, "y": 4 },
-                { "x": 12.5, "y": 4 },
-                { "w": 1.5, "x": 13.5, "y": 4 }
+                {"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, "w":2},
+
+                {"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":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, "w":2.25},
+
+                {"x":0, "y":3, "w":2.25},
+                {"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":2.75},
+
+                {"x":0, "y":4, "w":1.5},
+                {"x":1.5, "y":4},
+                {"x":2.5, "y":4, "w":1.5},
+                {"x":4, "y":4, "w":7},
+                {"x":11, "y":4, "w":1.5},
+                {"x":12.5, "y":4},
+                {"x":13.5, "y":4, "w":1.5}
             ]
         },
-		"LAYOUT_tsangan_arrowkeys": {
+        "LAYOUT_60_ansi_arrow_tsangan": {
             "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 },
-                { "w": 2, "x": 13, "y": 0 },
-                { "w": 1.5, "x": 0, "y": 1 },
-                { "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 },
-                { "w": 1.5, "x": 13.5, "y": 1 },
-                { "w": 1.75, "x": 0, "y": 2 },
-                { "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 },
-                { "w": 2.25, "x": 12.75, "y": 2 },
-                { "w": 2.25, "x": 0, "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 },
-                { "w": 1.75, "x": 11.25, "y": 3 },
-                { "x": 13, "y": 3 },
-                { "x": 14, "y": 3 },
-                { "w": 1.5, "x": 0, "y": 4 },
-                { "x": 1.5, "y": 4 },
-                { "w": 1.5, "x": 2.5, "y": 4 },
-                { "w": 7, "x": 4, "y": 4 },
-                { "x": 11, "y": 4 },
-                { "x": 12, "y": 4 },
-                { "x": 13, "y": 4 },
-                { "x": 14, "y": 4 }
+                {"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, "w":2},
+
+                {"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":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, "w":2.25},
+
+                {"x":0, "y":3, "w":2.25},
+                {"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, "w":1.75},
+                {"x":13, "y":3},
+                {"x":14, "y":3},
+
+                {"x":0, "y":4, "w":1.5},
+                {"x":1.5, "y":4},
+                {"x":2.5, "y":4, "w":1.5},
+                {"x":4, "y":4, "w":7},
+                {"x":11, "y":4},
+                {"x":12, "y":4},
+                {"x":13, "y":4},
+                {"x":14, "y":4}
             ]
         },
-        "LAYOUT_tsangan_iso": {
+        "LAYOUT_60_iso_tsangan": {
             "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 },
-                { "w": 2, "x": 13, "y": 0 },
-                { "w": 1.5, "x": 0, "y": 1 },
-                { "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 },
-                { "h": 2, "w": 1.25, "x": 13.75, "y": 1 },
-                { "w": 1.75, "x": 0, "y": 2 },
-                { "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 },
-                { "w": 1.25, "x": 0, "y": 3 },
-                { "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 },
-                { "w": 2.75, "x": 12.25, "y": 3 },
-                { "w": 1.5, "x": 0, "y": 4 },
-                { "x": 1.5, "y": 4 },
-                { "w": 1.5, "x": 2.5, "y": 4 },
-                { "w": 7, "x": 4, "y": 4 },
-                { "w": 1.5, "x": 11, "y": 4 },
-                { "x": 12.5, "y": 4 },
-                { "w": 1.5, "x": 13.5, "y": 4 }
+                {"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, "w":2},
+
+                {"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":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":13.75, "y":1, "w":1.25, "h":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":2.75},
+
+                {"x":0, "y":4, "w":1.5},
+                {"x":1.5, "y":4},
+                {"x":2.5, "y":4, "w":1.5},
+                {"x":4, "y":4, "w":7},
+                {"x":11, "y":4, "w":1.5},
+                {"x":12.5, "y":4},
+                {"x":13.5, "y":4, "w":1.5}
             ]
         },
-        "LAYOUT_tsangan_iso_arrowkeys": {
+        "LAYOUT_60_iso_arrow_tsangan": {
             "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 },
-                { "w": 2, "x": 13, "y": 0 },
-                { "w": 1.5, "x": 0, "y": 1 },
-                { "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 },
-                { "h": 2, "w": 1.25, "x": 13.75, "y": 1 },
-                { "w": 1.75, "x": 0, "y": 2 },
-                { "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 },
-                { "w": 1.25, "x": 0, "y": 3 },
-                { "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 },
-                { "w": 1.75, "x": 11.25, "y": 3 },
-                { "x": 13, "y": 3 },
-                { "x": 14, "y": 3 },
-                { "w": 1.5, "x": 0, "y": 4 },
-                { "x": 1.5, "y": 4 },
-                { "w": 1.5, "x": 2.5, "y": 4 },
-                { "w": 7, "x": 4, "y": 4 },
-                { "x": 11, "y": 4 },
-                { "x": 12, "y": 4 },
-                { "x": 13, "y": 4 },
-                { "x": 14, "y": 4 }
+                {"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, "w":2},
+
+                {"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":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":13.75, "y":1, "w":1.25, "h":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, "w":1.75},
+                {"x":13, "y":3},
+                {"x":14, "y":3},
+
+                {"x":0, "y":4, "w":1.5},
+                {"x":1.5, "y":4},
+                {"x":2.5, "y":4, "w":1.5},
+                {"x":4, "y":4, "w":7},
+                {"x":11, "y":4},
+                {"x":12, "y":4},
+                {"x":13, "y":4},
+                {"x":14, "y":4}
             ]
         }
     }

+ 12 - 15
keyboards/han60/keymaps/default/keymap.c

@@ -18,21 +18,18 @@
 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
     /* BASE */
     [0] = LAYOUT_all(
-     QK_GESC,  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_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_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_GRAVE, 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_SLSH,  	
-	 KC_LCTL,  KC_LCMD,  KC_LALT,                              KC_SPACE,                    KC_RALT,  KC_LEFT, MO(1),    KC_DOWN,  KC_RCTL,  KC_RGHT 	
-    ), 
-	/* FN */
+        QK_GESC, 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_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_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_GRV,  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_SLSH,
+        KC_LCTL, KC_LCMD, KC_LALT,                            KC_SPC,                    KC_RALT, KC_LEFT, MO(1),   KC_DOWN, KC_RCTL, KC_RGHT
+    ),
+    /* FN */
     [1] = LAYOUT_all(
-     QK_BOOT,   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,  KC_TRNS, 
-     KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  KC_TRNS,
-     KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_UP,   KC_TRNS, KC_TRNS,           KC_TRNS,
-     KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS,  KC_TRNS, KC_TRNS,	
-	 KC_TRNS, KC_TRNS, KC_TRNS,                            KC_TRNS,                   KC_TRNS, KC_TRNS, MO(1),   KC_TRNS,  KC_TRNS, KC_TRNS 
+        QK_BOOT, 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,  _______,
+        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+        _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_UP,   _______, _______,          _______,
+        _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______,
+        _______, _______, _______,                            _______,                   _______, _______, MO(1),   _______, _______, _______
     )
 };
-
-
-

+ 35 - 0
keyboards/han60/keymaps/default_ansi_arrow_tsangan/keymap.c

@@ -0,0 +1,35 @@
+/* Copyright 2021 farhandsome
+ *
+ * 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_60_ansi_tsangan_arrowkeys(
+        QK_GESC, 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_RSFT, KC_UP,   KC_SLSH,
+        KC_LCTL, KC_LCMD, KC_LALT,                            KC_SPC,                             MO(1),   KC_LEFT, KC_DOWN, KC_RGHT
+    ),
+    /* FN */
+    [1] = LAYOUT_60_ansi_tsangan_arrowkeys(
+        QK_BOOT, 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,
+        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,          _______,
+        _______,          _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+        _______, _______, _______,                            _______,                            MO(1),   _______, _______, _______
+    )
+};

+ 35 - 0
keyboards/han60/keymaps/default_ansi_tsangan/keymap.c

@@ -0,0 +1,35 @@
+/* Copyright 2021 farhandsome
+ *
+ * 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_60_ansi_tsangan(
+        QK_GESC, 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_LCMD, KC_LALT,                            KC_SPC,                                      KC_RALT, MO(1),   KC_RCTL
+    ),
+    /* FN */
+    [1] = LAYOUT_60_ansi_tsangan(
+        QK_BOOT, 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,
+        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+        _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_UP,   _______, _______,          _______,
+        _______,          _______, _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT,          _______,
+        _______, _______, _______,                            _______,                                     _______, MO(1),   _______
+    )
+};

+ 35 - 0
keyboards/han60/keymaps/default_iso_arrow_tsangan/keymap.c

@@ -0,0 +1,35 @@
+/* Copyright 2021 farhandsome
+ *
+ * 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_60_iso_tsangan_arrowkeys(
+        QK_GESC, 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_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_LSFT, KC_NUBS, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_RSFT, KC_UP,   KC_SLSH,
+        KC_LCTL, KC_LCMD, KC_LALT,                            KC_SPC,                             MO(1),   KC_LEFT, KC_DOWN, KC_RGHT
+    ),
+    /* FN */
+    [1] = LAYOUT_60_iso_tsangan_arrowkeys(
+        QK_BOOT, 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,
+        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+        _______, _______, _______,                            _______,                            MO(1),   _______, _______, _______
+    )
+};

+ 35 - 0
keyboards/han60/keymaps/default_iso_tsangan/keymap.c

@@ -0,0 +1,35 @@
+/* Copyright 2021 farhandsome
+ *
+ * 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_60_iso_tsangan(
+        QK_GESC, 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_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_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_LCTL, KC_LCMD, KC_LALT,                            KC_SPC,                                      KC_RALT, MO(1),   KC_RCTL
+    ),
+    /* FN */
+    [1] = LAYOUT_60_iso_tsangan(
+        QK_BOOT, 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,
+        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+        _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_UP,   _______, _______, _______, _______,
+        _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT,          _______,
+        _______, _______, _______,                            _______,                                     _______, MO(1),   _______
+    )
+};

+ 42 - 0
keyboards/huytbt/h50/config.h

@@ -0,0 +1,42 @@
+/* Copyright 2022 Huy Ta (@huytbt)
+ *
+ * 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"
+
+/* key matrix size */
+#define MATRIX_ROWS 4
+#define MATRIX_COLS 14
+
+/*
+ * Keyboard Matrix Assignments
+ * COLS: AVR pins used for columns, left to right
+ * ROWS: AVR pins used for rows, top to bottom
+ */
+#define MATRIX_ROW_PINS { D1, D0, D4, C6 }
+#define MATRIX_COL_PINS { F4, F5, F6, F7, B1, B3, B2, B6, D7, E6, B4, B5, D2, D3 }
+
+#define LED_CAPS_LOCK_PIN D5
+
+/* COL2ROW or ROW2COL */
+#define DIODE_DIRECTION COL2ROW
+
+/* define if matrix has ghost */
+// #define MATRIX_HAS_GHOST
+
+/* Set 0 if debouncing isn't needed */
+#define DEBOUNCE 5

+ 17 - 0
keyboards/huytbt/h50/h50.c

@@ -0,0 +1,17 @@
+/* Copyright 2022 Huy Ta (@huytbt)
+ *
+ * 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 "h50.h"

+ 35 - 0
keyboards/huytbt/h50/h50.h

@@ -0,0 +1,35 @@
+/* Copyright 2022 Huy Ta (@huytbt)
+ *
+ * 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
+
+/* h50 keymap definition macro
+ */
+#define LAYOUT( \
+    k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D, \
+    k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, \
+    k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2D, \
+    k30, k31, k32, k33,      k35,      k37,      k39, k3A, k3B, k3C, k3D \
+) { \
+    { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D }, \
+    { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D }, \
+    { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2D }, \
+    { k30, k31, k32, k33, XXX, k35, XXX, k37, XXX, k39, k3A, k3B, k3C, k3D } \
+}

+ 72 - 0
keyboards/huytbt/h50/info.json

@@ -0,0 +1,72 @@
+{
+  "keyboard_name": "H50",
+  "url": "https://github.com/huytbt/h50-keyboard",
+  "maintainer": "huytbt",
+  "usb": {
+    "vid": "0x4859",
+    "pid": "0x0002",
+    "device_version": "0.0.1"
+  },
+  "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": "[", "x": 11, "y": 0 },
+        { "label": "]", "x": 12, "y": 0 },
+        { "label": "Back<br>Space", "x": 13, "y": 0 },
+
+        { "label": "Caps", "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": ";", "x": 10.25, "y": 1 },
+        { "label": "'", "x": 11.25, "y": 1 },
+        { "label": "Enter", "x": 12.25, "y": 1, "w": 1.75 },
+        { "label": "PGUP", "x": 14, "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": "/", "x": 10.75, "y": 2 },
+        { "label": "Shift", "x": 11.75, "y": 2, "w": 1.25 },
+        { "label": "Up", "x": 13, "y": 2 },
+        { "label": "PGDN", "x": 14, "y": 2 },
+
+        { "label": "Ctrl", "x": 0, "y": 3, "w": 1.25 },
+        { "label": "Alt", "x": 1.25, "y": 3, "w": 1.25 },
+        { "label": "Super", "x": 2.5, "y": 3, "w": 1.25 },
+        { "x": 3.75, "y": 3, "w": 1.75 },
+        { "x": 5.5, "y": 3, "w": 1.75 },
+        { "label": "Fn1", "x": 7.25, "y": 3, "w": 1.75 },
+        { "label": "Fn2", "x": 9, "y": 3, "w": 1.25 },
+        { "label": "Fn3", "x": 10.25, "y": 3, "w": 1.25 },
+        { "label": "Left", "x": 12, "y": 3 },
+        { "label": "Down", "x": 13, "y": 3 },
+        { "label": "Right", "x": 14, "y": 3 }
+      ]
+    }
+  }
+}

+ 51 - 0
keyboards/huytbt/h50/keymaps/default/keymap.c

@@ -0,0 +1,51 @@
+/* Copyright 2022 Huy Ta (@huytbt)
+ *
+ * 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
+
+/* this keymap is to provide a basic keyboard layout for testing the matrix
+ * for more practical and complicated keymap refer to other keymaps in the same folder
+ */
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+  [0] = LAYOUT(
+    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_BSPC,
+    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_PGUP,
+    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_PGDN,
+    KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_SPC, MO(1), MO(2), MO(3), KC_LEFT, KC_DOWN, KC_RGHT
+  ),
+
+  [1] = LAYOUT(
+    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_BSLS,
+    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME,
+    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_END,
+    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+  ),
+
+  [2] = 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_DEL,
+    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME,
+    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_END,
+    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+  ),
+
+  [3] = LAYOUT(
+    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_TRNS,
+    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+  ),
+};

+ 51 - 0
keyboards/huytbt/h50/keymaps/via/keymap.c

@@ -0,0 +1,51 @@
+/* Copyright 2022 Huy Ta (@huytbt)
+ *
+ * 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
+
+/* this keymap is to provide a basic keyboard layout for testing the matrix
+ * for more practical and complicated keymap refer to other keymaps in the same folder
+ */
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+  [0] = LAYOUT(
+    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_BSPC,
+    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_PGUP,
+    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_PGDN,
+    KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_SPC, MO(1), MO(2), MO(3), KC_LEFT, KC_DOWN, KC_RGHT
+  ),
+
+  [1] = LAYOUT(
+    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_BSLS,
+    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME,
+    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_END,
+    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+  ),
+
+  [2] = 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_DEL,
+    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME,
+    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_END,
+    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+  ),
+
+  [3] = LAYOUT(
+    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_TRNS,
+    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+  ),
+};

+ 1 - 0
keyboards/huytbt/h50/keymaps/via/rules.mk

@@ -0,0 +1 @@
+VIA_ENABLE = yes

+ 27 - 0
keyboards/huytbt/h50/readme.md

@@ -0,0 +1,27 @@
+# H50
+
+![h50](https://i.imgur.com/1dB2mfMh.jpeg)
+
+The H50 is a mini keyboard with a 50 percent layout. The keyboard consists of 53 keys.
+
+* Keyboard Maintainer: [huytbt](https://github.com/huytbt)
+* Hardware Supported: Handwired
+* Hardware Availability: You can follow the build guide here <https://github.com/huytbt/h50-keyboard>
+
+Make example for this keyboard (after setting up your build environment):
+
+    make huytbt/h50:default
+
+Flashing example for this keyboard:
+
+    make huytbt/h50: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 reset button**: Briefly press the button on the back of the PCB - some may have pads you must short instead
+* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available

+ 16 - 0
keyboards/huytbt/h50/rules.mk

@@ -0,0 +1,16 @@
+# 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
+NKRO_ENABLE = no            # Enable N-Key Rollover
+BACKLIGHT_ENABLE = no       # Disable keyboard backlight functionality

+ 7 - 0
keyboards/kprepublic/bm40hsrgb/keymaps/dan/config.h

@@ -0,0 +1,7 @@
+// Copyright 2021 Dan Kim (@syntax-magic)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#define TAPPING_TERM 168
+#define TAPPING_TERM_PER_KEY

+ 48 - 41
keyboards/kprepublic/bm40hsrgb/keymaps/dan/keymap.c

@@ -41,42 +41,53 @@ enum layers {
 #define CLEAN TG(_CLEAN)
 #define RGB MO(_RGB)
 
+// Tap dance declarations
+enum {
+    TD_LNG1_LNG2,
+    TD_PAST_PSLS
+};
+
+qk_tap_dance_action_t tap_dance_actions[] = {
+    [TD_LNG1_LNG2] = ACTION_TAP_DANCE_DOUBLE(KC_LNG1, KC_LNG2),
+    [TD_PAST_PSLS] = ACTION_TAP_DANCE_DOUBLE(KC_PAST, KC_PSLS)
+};
+
 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 
 /* ALPHA
  * ,-----------------------------------------------------------------------------------.
- * | Tab  |   Q  |   W  |   E  |   R  |   T  |   Y  |   U  |   I  |   O  |   P  | Bksp |
+ * |  Tab |   Q  |   W  |   E  |   R  |   T  |   Y  |   U  |   I  |   O  |   P  | Bksp |
  * |------+------+------+------+------+------+------+------+------+------+------+------|
  * | Ctrl |   A  |   S  |   D  |   F  |   G  |   H  |   J  |   K  |   L  |   ;  |  '   |
  * |------+------+------+------+------+------+------+------+------+------+------+------|
  * | Shift|   Z  |   X  |   C  |   V  |   B  |   N  |   M  |   ,  |   .  |   /  |Return|
  * |------+------+------+------+------+------+------+------+------+------+------+------|
- * |ESC/NP|  KOR | Win  | Alt  |LEFTFN|    Space    |RFN/- |   =  |Delete|  \   | Enter|
+ * |ESC/NU|KOR/HN|  Win |  Alt |LEFTFN|    Space    |RFN/- |   =  |Delete|   \  | Enter|
  * `-----------------------------------------------------------------------------------'
  */
 [_ALPHA] = LAYOUT_planck_mit(
-    KC_TAB,             KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,   KC_Y,   KC_U,                 KC_I,    KC_O,    KC_P,    KC_BSPC,
-    KC_LCTL,            KC_A,    KC_S,    KC_D,    KC_F,    KC_G,   KC_H,   KC_J,                 KC_K,    KC_L,    KC_SCLN, KC_QUOT,
-    KC_LSFT,            KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,   KC_N,   KC_M,                 KC_COMM, KC_DOT,  KC_SLSH, KC_ENT ,
-    LT(NUMPAD, KC_ESC), KC_LNG1, KC_LGUI, KC_LALT, LEFTFN,     KC_SPC,      LT(RIGHTFN, KC_MINS), KC_EQL,  KC_DEL,  KC_BSLS, KC_PENT
+    KC_TAB,             KC_Q,             KC_W,    KC_E,    KC_R,   KC_T, KC_Y, KC_U,                 KC_I,    KC_O,    KC_P,    KC_BSPC,
+    KC_LCTL,            KC_A,             KC_S,    KC_D,    KC_F,   KC_G, KC_H, KC_J,                 KC_K,    KC_L,    KC_SCLN, KC_QUOT,
+    KC_LSFT,            KC_Z,             KC_X,    KC_C,    KC_V,   KC_B, KC_N, KC_M,                 KC_COMM, KC_DOT,  KC_SLSH, KC_ENT,
+    LT(NUMPAD, KC_ESC), TD(TD_LNG1_LNG2), KC_LGUI, KC_LALT, LEFTFN,   KC_SPC,   LT(RIGHTFN, KC_MINS), KC_EQL,  KC_DEL,  KC_BSLS, KC_PENT
 ),
 
 /* LEFTFN
  * ,-----------------------------------------------------------------------------------.
  * |   `  |   1  |   2  |   3  |   4  |   5  |   6  |   7  |   8  |   9  |   0  | Bksp |
  * |------+------+------+------+------+------+------+------+------+------+------+------|
- * | Ctrl | Left | Down | Up   |Right |CTRL+/|HANJA |   [  |   ]  |   )  |   :  |  "   |
+ * | Ctrl | Left | Down | Up   |Right |Ctrl+/| PGUP |   [  |   ]  |   )  |   :  |  "   |
  * |------+------+------+------+------+------+------+------+------+------+------+------|
- * | Shift| PGUP | PGDN | Home | End  | CAPS |PRNTSR|   (  |   ,  |   .  |   /  |Return|
+ * | Shift|CapLck| Ins  | Home | End  | PGDN |PrntSc|   (  |   ,  |   .  |   /  |Return|
  * |------+------+------+------+------+------+------+------+------+------+------+------|
- * | RGB  |   [  |   ]  | Alt  | Trns |    Space    |   _  |   +  | INS  |   |  | Enter|
+ * | RGB  |   [  |   ]  | Alt  | Trns |    Space    |   _  |   +  |Delete|   |  | Enter|
  * `-----------------------------------------------------------------------------------'
  */
 [_LEFTFN] = LAYOUT_planck_mit(
-    KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,     KC_5,           KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_BSPC,
-    KC_LCTL, KC_LEFT, KC_DOWN, KC_UP,   KC_RIGHT, LCTL(KC_SLSH),  KC_LNG2, KC_LBRC, KC_RBRC, KC_RPRN, KC_COLN, KC_DQUO,
-    KC_LSFT, KC_PGUP, KC_PGDN, KC_HOME, KC_END,   KC_CAPS,        KC_PSCR, KC_LPRN, KC_COMM, KC_DOT,  KC_SLSH, KC_ENT,
-    RGB,     KC_LBRC, KC_RBRC, KC_LALT, KC_TRNS,           KC_SPC,         KC_UNDS, KC_PLUS, KC_INS,  KC_PIPE, KC_PENT
+    KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,     KC_5,          KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_BSPC,
+    KC_LCTL, KC_LEFT, KC_DOWN, KC_UP,   KC_RIGHT, LCTL(KC_SLSH), KC_PGUP, KC_LBRC, KC_RBRC, KC_RPRN, KC_COLN, KC_DQUO,
+    KC_LSFT, KC_CAPS, KC_INS,  KC_HOME, KC_END,   KC_PGDN,       KC_PSCR, KC_LPRN, KC_COMM, KC_DOT,  KC_SLSH, KC_ENT,
+    RGB,     KC_LBRC, KC_RBRC, KC_LALT, KC_TRNS,        KC_SPC,           KC_UNDS, KC_PLUS, KC_DEL,  KC_PIPE, KC_PENT
 ),
 
 /* RIGHTFN
@@ -99,23 +110,22 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 
 /* NUMPAD
  * ,-----------------------------------------------------------------------------------.
- * |   *  |   7  |   8  |   9  | NumLk|      |      |      |      |      |      | Bksp |
+ * | *or/ |   7  |   8  |   9  | NumLk|      |      |      |      |      |      | Bksp |
  * |------+------+------+------+------+------+------+------+------+------+------+------|
  * |  Alt |   4  |   5  |   6  |Return|      |      |      |      |      | Shift|      |
  * |------+------+------+------+------+------+------+------+------+------+------+------|
- * |   -  |   1  |   2  |   3  | Bksp |      |      |      |      |      | Ctrl |Return|
+ * |   -  |   1  |   2  |   3  | Bksp |      |      |      |   ,  |   .  | Ctrl |Return|
  * |------+------+------+------+------+------+------+------+------+------+------+------|
  * | Trns |   ,  |   +  |   .  |   0  |    Space    |LEAGUE| PUBG | OVWCh|  SC  |TETRIS|
  * `-----------------------------------------------------------------------------------'
  */
 [_NUMPAD] = LAYOUT_planck_mit(
-    KC_ASTR, KC_P7,   KC_P8,   KC_P9,   KC_NUM,  KC_NO, KC_NO, KC_NO,  KC_NO, KC_NO,     KC_NO,     KC_BSPC,
-    KC_LALT, KC_P4,   KC_P5,   KC_P6,   KC_ENT,  KC_NO, KC_NO, KC_NO,  KC_NO, KC_NO,     KC_LSFT,   KC_NO,
-    KC_PMNS, KC_P1,   KC_P2,   KC_P3,   KC_BSPC, KC_NO, KC_NO, KC_NO,  KC_NO, KC_NO,     KC_LCTL,   KC_ENT,
-    KC_TRNS, KC_COMM, KC_PPLS, KC_PDOT, KC_0,       KC_SPC,    LEAGUE, PUBG,  OVERWATCH, STARCRAFT, TETRIS
+    TD(TD_PAST_PSLS), KC_P7,   KC_P8,   KC_P9,   KC_NUM,  KC_NO,     KC_NO, KC_NO,  KC_NO,   KC_NO,     KC_NO,     KC_BSPC,
+    KC_LALT,          KC_P4,   KC_P5,   KC_P6,   KC_ENT,  KC_NO,     KC_NO, KC_NO,  KC_NO,   KC_NO,     KC_LSFT,   KC_NO,
+    KC_PMNS,          KC_P1,   KC_P2,   KC_P3,   KC_BSPC, KC_NO,     KC_NO, KC_NO,  KC_COMM, KC_DOT,    KC_LCTL,   KC_ENT,
+    KC_TRNS,          KC_COMM, KC_PPLS, KC_PDOT, KC_P0,       KC_SPC,       LEAGUE, PUBG,    OVERWATCH, STARCRAFT, TETRIS
 ),
 
-
 /* LEAGUE
  * ,-----------------------------------------------------------------------------------.
  * | Tab  |   Q  |   W  |   E  |   R  |   5  |   Y  |      |      |   O  |   P  | ESC  |
@@ -248,21 +258,21 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 };
 
 /*
-
 // Key Matrix to LED Index
 { 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11},
 {12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23},
 {24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35},
 {36, 37, 38, 39, 40,   41,   42, 43, 44, 45, 46}
-
 */
-
 bool rgb_matrix_indicators_user(void) {
-    uint8_t red[3] = {50, 5, 0};
-    uint8_t yellow[3] = {50, 50, 0};
-    uint8_t blue[3] = {0, 15, 50};
-    uint8_t green[3] = {15, 33, 1};
+    uint8_t red[3] = {22, 2, 0};
+    uint8_t yellow[3] = {20, 22, 0};
+    uint8_t blue[3] = {0, 6, 20};
+    uint8_t green[3] = {14, 22, 0};
+    uint8_t purple[3] = {6, 0, 22};
+    uint8_t pink[3] = {17, 0, 22};
     uint8_t white[3] = {255, 255, 255};
+    uint8_t wasd[4] = {2, 13, 14, 15};
 
     switch (get_highest_layer(layer_state)) {
         case _ALPHA:
@@ -274,54 +284,51 @@ bool rgb_matrix_indicators_user(void) {
         case _NUMPAD:
             break;
         case _LEAGUE:
-            rgb_matrix_set_color(15, yellow[0], yellow[1], yellow[2]);
             rgb_matrix_set_color(16, red[0], red[1], red[2]);
+            rgb_matrix_set_color(15, yellow[0], yellow[1], yellow[2]);
             rgb_matrix_set_color(29, blue[0], blue[1], blue[2]);
-            rgb_matrix_set_color(42, green[0], green[1], green[2]);
-
+            rgb_matrix_set_color(10, purple[0], purple[1], purple[2]);
             break;
-
         case _PUBG:
             rgb_matrix_set_color(43, green[0], green[1], green[2]);
-
             break;
-
         case _OVERWATCH:
             rgb_matrix_set_color(44, green[0], green[1], green[2]);
             break;
-
         case _STARCRAFT:
             rgb_matrix_set_color(45, green[0], green[1], green[2]);
             break;
-
         case _TETRIS:
-            rgb_matrix_set_color(46, green[0], green[1], green[2]);
+            for (int i = 0; i < sizeof wasd; i++) {
+                rgb_matrix_set_color(wasd[i], pink[0], pink[1], pink[2]);
+            }
             break;
-
         case _CLEAN:
             rgb_matrix_set_color_all(white[0], white[1], white[2]);
             break;
-
         case _RGB:
             break;
     }
 
     led_t led_state = host_keyboard_led_state();
-
     //Capslock led
     if (led_state.caps_lock) {
         rgb_matrix_set_color(12, green[0], green[1], green[2]);
     }
-
     //Numlock led
     if (led_state.num_lock) {
     } else {
         rgb_matrix_set_color(11, green[0], green[1], green[2]);
     }
-
     //Scroll lock led
     if (led_state.scroll_lock) {
         rgb_matrix_set_color(23, green[0], green[1], green[2]);
     }
     return false;
 }
+
+// Turn of RGB Matrix Effect
+void keyboard_post_init_user(void) {
+    rgb_matrix_mode_noeeprom(RGB_MATRIX_SOLID_COLOR);
+    rgb_matrix_sethsv_noeeprom(HSV_OFF);
+}

+ 16 - 9
keyboards/kprepublic/bm40hsrgb/keymaps/dan/readme.md

@@ -1,6 +1,8 @@
 # Dan's KPrepublic BM40 Keymap
 
->This is my personal keymap with an LED indicator support for num lock, caps lock and scroll lock. 
+> ** There isn't a qmk firmware for the new bm40 v2 pcb yet. Check with your vendor before purchasing.  
+>  
+>This is my personal keymap with an LED indicator support for num lock, caps lock and scroll lock.
 
 ![](https://i.imgur.com/2yclc1B.jpg)
 > * Case: Poseidon PSD40 Case
@@ -8,6 +10,11 @@
 > * Keycaps: WOB ABS Cherry Profile
 > * Switches: Gazzew Boba u4t (62g 2 stage long spring)
 
+![](https://i.imgur.com/imqhjZW.jpg)
+> * Case: JJ40 Aluminium Acclive Case with Acrylic Diffuser
+> * Keycaps: YMDK DSA Keycaps
+> * Artisan: Rodríguez Cap by Polykeys
+
 ### BM40 LED INDEX
 **_Numlock (11) Capslock (12) Scroll lock (23)_**
 
@@ -37,19 +44,19 @@
 | **_1_** | TAB |  Q  |  W  |  E  |  R  |  T  |  Y  |  U  |  I  |  O  |  P  | BSP |
 | **_2_** | CTL |  A  |  S  |  D  |  F  |  G  |  H  |  J  |  K  |  L  |  ;  |  '  |
 | **_3_** | SFT |  Z  |  X  |  C  |  V  |  B  |  N  |  M  |  ,  |  .  |  /  | RET |
-| **_4_** | &nbsp;ESC | KOR | WIN | &nbsp;&nbsp;ALT | &nbsp;&nbsp;&nbsp;FN | &nbsp;SPC | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- | &nbsp;&nbsp;&nbsp;&nbsp;= | DEL | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ | ENT |
+| **_4_** | &nbsp;ESC | KOR | WIN | &nbsp;&nbsp;ALT | &nbsp;&nbsp;&nbsp;FN | &nbsp;SPC | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- | &nbsp;&nbsp;&nbsp;&nbsp;= | DEL | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\\ | ENT |
 >This is a base layer for typing.
 
 <br />
-
+,
 ### LEFTFN MO(FN)
 
 |         | _A_ | _B_ | _C_ | _D_ | _E_ | _F_ | _G_ | _H_ | _I_ | _J_ | _K_ | _L_ |
 |---------|----:|----:|----:|----:|----:|----:|----:|----:|----:|----:|----:|----:|
 | **_1_** |  \` |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  8  |  9  |  0  | BSP |
-| **_2_** | CTL | LFT | DN  | UP  | RHT | C+/ | HAN |  [  |  ]  |  )  |  :  |  "  |
-| **_3_** | SFT | PGU | PGD | HOM | END | CAP | PRN |  (  |  ,  |  .  |  /  | RET |
-| **_4_** | RGB |  [  |  ]  | &nbsp;ALT | TRN | &nbsp;SPC || &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_ | &nbsp;&nbsp;&nbsp;&nbsp;+ | &nbsp;INS | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | ENT |
+| **_2_** | CTL | LFT | DN  | UP  | RHT | C+/ | PGU |  [  |  ]  |  )  |  :  |  "  |
+| **_3_** | SFT | CAPS| INS | HOM | END | PGD | PRN |  (  |  ,  |  .  |  /  | RET |
+| **_4_** | RGB |  [  |  ]&nbsp;  | ALT | TRN | &nbsp;SPC || &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_ | &nbsp;&nbsp;&nbsp;&nbsp;+ | &nbsp;DEL | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\| | ENT |
 >This is the layer dedicated to number, symbol and navigation keys. ie) arrow keys
 
 <br />
@@ -70,9 +77,9 @@
 
 |         | _A_ | _B_ | _C_ | _D_ | _E_ | _F_ | _G_ | _H_ | _I_ | _J_ | _K_ | _L_ |
 |---------|----:|----:|----:|----:|----:|----:|----:|----:|----:|----:|----:|----:|
-| **_1_** |  *  |  7  |  8  |  9  | NUM |     |     |     |     |     |     | BSP |
-| **_2_** | ALT |  4  |  5  |  6  | RET |     |     |     |     |     |     |     |
-| **_3_** |  -  |  1  |  2  |  3  | BSP |     |     |     |     |     |     | RET |
+| **_1_** | *or/|  7  |  8  |  9  | NUM |     |     |     |     |     |     | BSP |
+| **_2_** | ALT |  4  |  5  |  6  | RET |     |     |     |     |     | SFT |     |
+| **_3_** |  -  |  1  |  2  |  3  | BSP |     |     |     |  ,  |  .  | CTL | RET |
 | **_4_** | TRN | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;, | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;. | &nbsp;&nbsp;&nbsp;0 | SPC | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | &nbsp;&nbsp;LY1 | &nbsp;LY2 | &nbsp;LY3 | &nbsp;LY4 | &nbsp;LY5 |
 >This layer is the numpad.
 

+ 1 - 0
keyboards/kprepublic/bm40hsrgb/keymaps/dan/rules.mk

@@ -0,0 +1 @@
+TAP_DANCE_ENABLE = yes

+ 4 - 1
keyboards/macro3/info.json

@@ -8,8 +8,11 @@
         "pid": "0x3388",
         "device_version": "0.0.3"
     },
+    "layout_aliases": {
+        "LAYOUT": "LAYOUT_ortho_2x4"
+    },
     "layouts": {
-        "LAYOUT": {
+        "LAYOUT_ortho_2x4": {
             "layout": [
                 {"x": 0, "y": 0},
                 {"x": 1, "y": 0},

+ 2 - 2
keyboards/macro3/keymaps/default/keymap.c

@@ -6,11 +6,11 @@
 #include QMK_KEYBOARD_H
 
 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-    [0] = LAYOUT(
+    [0] = LAYOUT_ortho_2x4(
         KC_MUTE, KC_MPLY, KC_MRWD, LT(1,KC_MFFD),
         C(KC_Z), C(KC_X), C(KC_C), C(KC_V)
     ),
-    [1] = LAYOUT(
+    [1] = LAYOUT_ortho_2x4(
         _______, _______, _______, _______,
         QK_BOOT, _______, _______, _______
     )

+ 1 - 1
keyboards/macro3/macro3.h

@@ -5,7 +5,7 @@
 
 #include "quantum.h"
 
-#define LAYOUT( \
+#define LAYOUT_ortho_2x4( \
     K00, K01, K02, K03, \
     K10, K11, K12, K13  \
 ) \

+ 311 - 1
keyboards/mechbrewery/mb65s/info.json

@@ -8,6 +8,16 @@
         "pid": "0x3635",
         "device_version": "0.0.1"
     },
+    "community_layouts": [
+        "65_ansi_blocker",
+        "65_ansi_blocker_split_bs",
+        "65_ansi_blocker_tsangan",
+        "65_ansi_blocker_tsangan_split_bs",
+        "65_iso_blocker",
+        "65_iso_blocker_split_bs",
+        "65_iso_blocker_tsangan",
+        "65_iso_blocker_tsangan_split_bs"
+    ],
     "layouts": {
         "LAYOUT_all": {
             "layout": [
@@ -86,6 +96,81 @@
                 {"x":15, "y":4}
             ]
         },
+        "LAYOUT_65_ansi_blocker": {
+            "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, "w":2},
+                {"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, "w":2.25},
+                {"x":15, "y":2},
+
+                {"x":0, "y":3, "w":2.25},
+                {"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":6.25},
+                {"x":10, "y":4, "w":1.25},
+                {"x":11.25, "y":4, "w":1.25},
+                {"x":13, "y":4},
+                {"x":14, "y":4},
+                {"x":15, "y":4}
+            ]
+        },
         "LAYOUT_65_ansi_blocker_split_bs": {
             "layout": [
                 {"x":0, "y":0},
@@ -162,6 +247,82 @@
                 {"x":15, "y":4}
             ]
         },
+        "LAYOUT_65_iso_blocker": {
+            "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, "w":2},
+                {"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":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":13.75, "y":1, "w":1.25, "h":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":6.25},
+                {"x":10, "y":4, "w":1.25},
+                {"x":11.25, "y":4, "w":1.25},
+                {"x":13, "y":4},
+                {"x":14, "y":4},
+                {"x":15, "y":4}
+            ]
+        },
         "LAYOUT_65_iso_blocker_split_bs": {
             "layout": [
                 {"x":0, "y":0},
@@ -240,6 +401,80 @@
             ]
         },
         "LAYOUT_65_ansi_blocker_tsangan": {
+            "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, "w":2},
+                {"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, "w":2.25},
+                {"x":15, "y":2},
+
+                {"x":0, "y":3, "w":2.25},
+                {"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.5},
+                {"x": 1.5, "y": 4},
+                {"x": 2.5, "y": 4, "w": 1.5},
+                {"x": 4, "y": 4, "w": 7},
+                {"x":11, "y":4, "w":1.5},
+                {"x":13, "y":4},
+                {"x":14, "y":4},
+                {"x":15, "y":4}
+            ]
+        },
+        "LAYOUT_65_ansi_blocker_tsangan_split_bs": {
             "layout": [
                 {"x":0, "y":0},
                 {"x":1, "y":0},
@@ -314,7 +549,82 @@
                 {"x":15, "y":4}
             ]
         },
-        "LAYOUT_65_iso_blocker_7u_spc": {
+        "LAYOUT_65_iso_blocker_tsangan": {
+            "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, "w":2},
+                {"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":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":13.75, "y":1, "w":1.25, "h":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.5},
+                {"x": 1.5, "y": 4},
+                {"x": 2.5, "y": 4, "w": 1.5},
+                {"x": 4, "y": 4, "w": 7},
+                {"x":11, "y":4, "w":1.5},
+                {"x":13, "y":4},
+                {"x":14, "y":4},
+                {"x":15, "y":4}
+            ]
+        },
+        "LAYOUT_65_iso_blocker_tsangan_split_bs": {
             "layout": [
                 {"x":0, "y":0},
                 {"x":1, "y":0},

+ 2 - 2
keyboards/mechbrewery/mb65s/keymaps/ansi_blocker_7u_spc/keymap.c

@@ -31,7 +31,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
      * |Ctrl|LGUI|Alt |          Space         |Alt |Fn  | |Lef|Dow|Rig|
      * `---------------------------------------------------------------'
      */
-    [0] = LAYOUT_65_ansi_blocker_tsangan(
+    [0] = LAYOUT_65_ansi_blocker_tsangan_split_bs(
         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_DEL, KC_HOME,
         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_PGUP,
         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_PGDN,
@@ -52,7 +52,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
      * |    |    |    |                        |    |    | |   |   |   |
      * `---------------------------------------------------------------'
      */
-    [1] = LAYOUT_65_ansi_blocker_tsangan(
+    [1] = LAYOUT_65_ansi_blocker_tsangan_split_bs(
         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,  KC_DEL,  _______,
         KC_CAPS,          _______, KC_UP,   _______, _______, _______, _______, _______, KC_INS,  _______, KC_PSCR, KC_SCRL, KC_PAUS, _______, _______,
         _______,          KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGUP,          _______, _______,

+ 1 - 1
keyboards/mechbrewery/mb65s/keymaps/ansi_blocker_7u_spc/readme.md

@@ -1,4 +1,4 @@
 # Keymap by tuananhnguyen204, supported by thaoOil, phamMinhThuy, nguyenHuyenTrang
 ANSI layout with split backspace.
 
-Made with `LAYOUT_65_ansi_blocker_tsangan`
+Made with `LAYOUT_65_ansi_blocker_tsangan_split_bs`

+ 3 - 3
keyboards/mechbrewery/mb65s/keymaps/iso_blocker_tsangan/keymap.c

@@ -32,8 +32,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
      * │Ctrl│LGUI│LAlt│          Space         │RAlt│Fn  │ │ ← │ ↓ │ → │
      * └────┴────┴────┴────────────────────────┴────┴────┘ └───┴───┴───┘
      */
-    [0] = LAYOUT_65_iso_blocker_7u_spc(
-        QK_GESC, 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_HOME,
+    [0] = LAYOUT_65_iso_blocker_tsangan_split_bs(
+        KC_GESC, 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_HOME,
         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_PGUP,
         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_PGDN,
         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_END,
@@ -53,7 +53,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
      * │    │    │    │                        │    │    │ │   │   │   │
      * └────┴────┴────┴────────────────────────┴────┴────┘ └───┴───┴───┘
      */
-    [1] = LAYOUT_65_iso_blocker_7u_spc(
+    [1] = LAYOUT_65_iso_blocker_tsangan_split_bs(
         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,  _______, _______,
         KC_CAPS, _______, KC_UP,   _______, _______, _______, _______, _______, KC_INS,  _______, KC_PSCR, KC_SCRL, KC_PAUS,                   _______,
         _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGUP,          _______, _______,

+ 75 - 12
keyboards/mechbrewery/mb65s/mb65s.h

@@ -21,17 +21,20 @@
 #define XXX KC_NO
 
 /*
- * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐    ┌───────┐
- * │00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0A │0B │0C │0D │0E │0F │    │0E     │ 2u Backspace
- * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┼───┤    └─┬─────┤
- * │10   │12 │13 │14 │15 │16 │17 │18 │19 │1A │1B │1C │1D │1E   │1F │      │     │
- * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┼───┤   ┌──┴┐2D  │ ISO Enter
- * │20    │22 │23 │24 │25 │26 │27 │28 │29 │2A │2B │2C │2D      │2F │   │1E │    │
- * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┼───┤   └───┴────┘
- * │30  │31 │32 │33 │34 │35 │36 │37 │38 │39 │3A │3B │3D    │3E │3F │
- * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬─┬───┼───┼───┤
- * │40  │41  │43  │46                      │4A  │4B  │ │4D │4E │4F │
- * └────┴────┴────┴────────────────────────┴────┴────┘ └───┴───┴───┘
+ *              ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐    ┌───────┐
+ *              │00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0A │0B │0C │0D │0E │0F │    │0E     │ 2u Backspace
+ *              ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┼───┤    └─┬─────┤
+ *              │10   │12 │13 │14 │15 │16 │17 │18 │19 │1A │1B │1C │1D │1E   │1F │      │     │
+ *  2.25u       ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┼───┤   ┌──┴┐2D  │ ISO Enter
+ *  LShift      │20    │22 │23 │24 │25 │26 │27 │28 │29 │2A │2B │2C │2D      │2F │   │1E │    │
+ * ┌────────┐   ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┼───┤   └───┴────┘
+ * │30      │   │30  │31 │32 │33 │34 │35 │36 │37 │38 │39 │3A │3B │3D    │3E │3F │
+ * └────────┘   ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬─┬───┼───┼───┤
+ *              │40  │41  │43  │46                      │4A  │4B  │ │4D │4E │4F │
+ *              └────┴────┴────┴────────────────────────┴────┴────┘ └───┴───┴───┘
+ *              ┌─────┬───┬─────┬───────────────────────────┬─────┐
+ *              │40   │41 │43   │46                         │4B   │ Tsangan
+ *              └─────┴───┴─────┴───────────────────────────┴─────┘
  */
 
 /* This a shortcut to help you visually see your layout.
@@ -57,6 +60,21 @@
     { K40, K41, XXX, K43, XXX, XXX, K46, XXX, XXX, XXX, K4A, K4B, XXX, K4D, K4E, K4F }, \
 }
 
+#define LAYOUT_65_ansi_blocker( \
+    K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C,      K0E, K0F, \
+    K10,      K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, K1F, \
+    K20,      K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D,      K2F, \
+    K30,      K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B,      K3D, K3E, K3F, \
+    K40, K41,      K43,           K46,                K4A, K4B,      K4D, K4E, K4F  \
+) \
+{ \
+    { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, XXX, K0E, K0F }, \
+    { K10, XXX, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, K1F }, \
+    { K20, XXX, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, XXX, K2F }, \
+    { K30, XXX, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, XXX, K3D, K3E, K3F }, \
+    { K40, K41, XXX, K43, XXX, XXX, K46, XXX, XXX, XXX, K4A, K4B, XXX, K4D, K4E, K4F }, \
+}
+
 #define LAYOUT_65_ansi_blocker_split_bs( \
     K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, \
     K10,      K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, K1F, \
@@ -72,6 +90,21 @@
     { K40, K41, XXX, K43, XXX, XXX, K46, XXX, XXX, XXX, K4A, K4B, XXX, K4D, K4E, K4F }, \
 }
 
+#define LAYOUT_65_iso_blocker( \
+    K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C,      K0E, K0F, \
+    K10,      K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D,      K1F, \
+    K20,      K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K1E, K2D, K2F, \
+    K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B,      K3D, K3E, K3F, \
+    K40, K41,      K43,           K46,                K4A, K4B,      K4D, K4E, K4F  \
+) \
+{ \
+    { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, XXX, K0E, K0F }, \
+    { K10, XXX, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, K1F }, \
+    { K20, XXX, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, XXX, K2F }, \
+    { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, XXX, K3D, K3E, K3F }, \
+    { K40, K41, XXX, K43, XXX, XXX, K46, XXX, XXX, XXX, K4A, K4B, XXX, K4D, K4E, K4F }, \
+}
+
 #define LAYOUT_65_iso_blocker_split_bs( \
     K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, \
     K10,      K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D,      K1F, \
@@ -88,6 +121,21 @@
 }
 
 #define LAYOUT_65_ansi_blocker_tsangan( \
+    K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C,      K0E, K0F, \
+    K10,      K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, K1F, \
+    K20,      K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D,      K2F, \
+    K30,      K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B,      K3D, K3E, K3F, \
+    K40, K41,      K43,           K46,                     K4B,      K4D, K4E, K4F  \
+) \
+{ \
+    { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, XXX, K0E, K0F }, \
+    { K10, XXX, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, K1F }, \
+    { K20, XXX, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, XXX, K2F }, \
+    { K30, XXX, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, XXX, K3D, K3E, K3F }, \
+    { K40, K41, XXX, K43, XXX, XXX, K46, XXX, XXX, XXX, XXX, K4B, XXX, K4D, K4E, K4F }, \
+}
+
+#define LAYOUT_65_ansi_blocker_tsangan_split_bs( \
     K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, \
     K10,      K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, K1F, \
     K20,      K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D,      K2F, \
@@ -102,7 +150,22 @@
     { K40, K41, XXX, K43, XXX, XXX, K46, XXX, XXX, XXX, XXX, K4B, XXX, K4D, K4E, K4F }, \
 }
 
-#define LAYOUT_65_iso_blocker_7u_spc( \
+#define LAYOUT_65_iso_blocker_tsangan( \
+    K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C,      K0E, K0F, \
+    K10,      K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D,      K1F, \
+    K20,      K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K1E, K2D, K2F, \
+    K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B,      K3D, K3E, K3F, \
+    K40, K41,      K43,           K46,                     K4B,      K4D, K4E, K4F  \
+) \
+{ \
+    { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, XXX, K0E, K0F }, \
+    { K10, XXX, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, K1F }, \
+    { K20, XXX, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, XXX, K2F }, \
+    { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, XXX, K3D, K3E, K3F }, \
+    { K40, K41, XXX, K43, XXX, XXX, K46, XXX, XXX, XXX, XXX, K4B, XXX, K4D, K4E, K4F }, \
+}
+
+#define LAYOUT_65_iso_blocker_tsangan_split_bs( \
     K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, \
     K10,      K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, K1F, \
     K20,      K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D,      K2F, \

+ 0 - 2
keyboards/mechbrewery/mb65s/rules.mk

@@ -17,5 +17,3 @@ BACKLIGHT_ENABLE = no      # Enable keyboard backlight functionality
 RGBLIGHT_ENABLE = no        # Enable keyboard RGB underglow
 AUDIO_ENABLE = no           # Audio output
 LTO_ENABLE = yes
-
-LAYOUTS = 65_ansi_blocker_split_bs 65_iso_blocker_split_bs 65_ansi_blocker_tsangan

+ 79 - 1
keyboards/mode/m65hi_alpha/info.json

@@ -8,8 +8,11 @@
     "pid": "0x6574",
     "device_version": "0.6.5"
   },
+  "layout_aliases": {
+      "LAYOUT_all": "LAYOUT_65_iso_blocker"
+  },
   "layouts": {
-      "LAYOUT_all": {
+      "LAYOUT_65_iso_blocker": {
           "layout": [
               { "label": "K00", "x": 0, "y": 0 },
               { "label": "K01", "x": 1, "y": 0 },
@@ -84,6 +87,81 @@
               { "label": "K5D", "x": 14, "y": 4 },
               { "label": "K5E", "x": 15, "y": 4 }
           ]
+      },
+      "LAYOUT_65_iso_blocker_tsangan": {
+          "layout": [
+              { "label": "K00", "x": 0, "y": 0 },
+              { "label": "K01", "x": 1, "y": 0 },
+              { "label": "K02", "x": 2, "y": 0 },
+              { "label": "K03", "x": 3, "y": 0 },
+              { "label": "K04", "x": 4, "y": 0 },
+              { "label": "K05", "x": 5, "y": 0 },
+              { "label": "K06", "x": 6, "y": 0 },
+              { "label": "K07", "x": 7, "y": 0 },
+              { "label": "K08", "x": 8, "y": 0 },
+              { "label": "K09", "x": 9, "y": 0 },
+              { "label": "K0A", "x": 10, "y": 0 },
+              { "label": "K0B", "x": 11, "y": 0 },
+              { "label": "K0C", "x": 12, "y": 0 },
+              { "label": "K0D", "x": 13, "y": 0, "w": 2 },
+              { "label": "K0E", "x": 15, "y": 0 },
+
+              { "label": "K10", "x": 0, "y": 1, "w": 1.5 },
+              { "label": "K11", "x": 1.5, "y": 1 },
+              { "label": "K12", "x": 2.5, "y": 1 },
+              { "label": "K13", "x": 3.5, "y": 1 },
+              { "label": "K14", "x": 4.5, "y": 1 },
+              { "label": "K15", "x": 5.5, "y": 1 },
+              { "label": "K16", "x": 6.5, "y": 1 },
+              { "label": "K17", "x": 7.5, "y": 1 },
+              { "label": "K18", "x": 8.5, "y": 1 },
+              { "label": "K19", "x": 9.5, "y": 1 },
+              { "label": "K1A", "x": 10.5, "y": 1 },
+              { "label": "K1B", "x": 11.5, "y": 1 },
+              { "label": "K1C", "x": 12.5, "y": 1 },
+              { "label": "K1E", "x": 15, "y": 1 },
+
+              { "label": "K20", "x": 0, "y": 2, "w": 1.75 },
+              { "label": "K21", "x": 1.75, "y": 2 },
+              { "label": "K22", "x": 2.75, "y": 2 },
+              { "label": "K23", "x": 3.75, "y": 2 },
+              { "label": "K24", "x": 4.75, "y": 2 },
+              { "label": "K25", "x": 5.75, "y": 2 },
+              { "label": "K26", "x": 6.75, "y": 2 },
+              { "label": "K27", "x": 7.75, "y": 2 },
+              { "label": "K28", "x": 8.75, "y": 2 },
+              { "label": "K29", "x": 9.75, "y": 2 },
+              { "label": "K2A", "x": 10.75, "y": 2 },
+              { "label": "K2B", "x": 11.75, "y": 2 },
+              { "label": "K2C", "x": 12.75, "y": 2 },
+              { "label": "K2D", "x": 13.75, "y": 1, "w": 1.25, "h": 2 },
+              { "label": "K2E", "x": 15, "y": 2 },
+
+              { "label": "K30", "x": 0, "y": 3, "w": 1.25 },
+              { "label": "K31", "x": 1.25, "y": 3 },
+              { "label": "K32", "x": 2.25, "y": 3 },
+              { "label": "K33", "x": 3.25, "y": 3 },
+              { "label": "K34", "x": 4.25, "y": 3 },
+              { "label": "K35", "x": 5.25, "y": 3 },
+              { "label": "K36", "x": 6.25, "y": 3 },
+              { "label": "K37", "x": 7.25, "y": 3 },
+              { "label": "K38", "x": 8.25, "y": 3 },
+              { "label": "K39", "x": 9.25, "y": 3 },
+              { "label": "K3A", "x": 10.25, "y": 3 },
+              { "label": "K3B", "x": 11.25, "y": 3 },
+              { "label": "K3C", "x": 12.25, "y": 3, "w": 1.75 },
+              { "label": "K3D", "x": 14, "y": 3 },
+              { "label": "K3E", "x": 15, "y": 3 },
+
+              { "label": "K40", "x": 0, "y": 4, "w": 1.5 },
+              { "label": "K41", "x": 1.5, "y": 4 },
+              { "label": "K42", "x": 2.5, "y": 4, "w": 1.5 },
+              { "label": "K56", "x": 4, "y": 4, "w": 7 },
+              { "label": "K5B", "x": 11, "y": 4, "w": 1.5 },
+              { "label": "K5C", "x": 13, "y": 4 },
+              { "label": "K5D", "x": 14, "y": 4 },
+              { "label": "K5E", "x": 15, "y": 4 }
+          ]
       }
   }
 }

+ 26 - 26
keyboards/mode/m65hi_alpha/keymaps/default/keymap.c

@@ -18,32 +18,32 @@ 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_all(
+    [0] = LAYOUT_65_iso_blocker(
         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_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_PGDN,
+        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_PGUP,
         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_PGDN,
-	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_END ,
-        KC_LCTL, KC_LGUI, KC_LALT,                            KC_SPC ,                            KC_RALT, MO(1)  , KC_LEFT, KC_DOWN, KC_RGHT 
-	),
-   [1] = LAYOUT_all(
-	QK_BOOT  , 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_TRNS, KC_MUTE, 
-	KC_TRNS, KC_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_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLD, 
-	KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, 
-	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
-	),
-   [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_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_END ,
+        KC_LCTL, KC_LGUI, KC_LALT,                            KC_SPC ,                            KC_RALT, MO(1)  , KC_LEFT, KC_DOWN, KC_RGHT
+    ),
+    [1] = LAYOUT_65_iso_blocker(
+        QK_BOOT, 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_TRNS, KC_MUTE,
+        KC_TRNS, KC_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_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLD,
+        KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY,
+        KC_TRNS, KC_TRNS, KC_TRNS,                            KC_TRNS,                            KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+    ),
+    [2] = LAYOUT_65_iso_blocker(
+        KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+        KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS,
+        KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+        KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, 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_65_iso_blocker(
+        KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+        KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS,
+        KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+        KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+        KC_TRNS, KC_TRNS, KC_TRNS,                            KC_TRNS,                            KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+    )
 };

+ 27 - 27
keyboards/mode/m65hi_alpha/keymaps/via/keymap.c

@@ -18,32 +18,32 @@ 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_all(
+    [0] = LAYOUT_65_iso_blocker(
         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_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_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_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_END ,
-        KC_LCTL, KC_LGUI, KC_LALT,                            KC_SPC ,                            KC_RALT, MO(1)  , KC_LEFT, KC_DOWN, KC_RGHT 
-	),
-   [1] = LAYOUT_all(
-	QK_BOOT  , 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_TRNS, KC_MUTE, 
-	KC_TRNS, KC_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_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLD, 
-	KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, 
-	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
-	),
-   [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_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_PGUP,
+        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_PGDN,
+        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_END ,
+        KC_LCTL, KC_LGUI, KC_LALT,                            KC_SPC ,                            KC_RALT, MO(1)  , KC_LEFT, KC_DOWN, KC_RGHT
+    ),
+    [1] = LAYOUT_65_iso_blocker(
+        QK_BOOT  , 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_TRNS, KC_MUTE,
+        KC_TRNS, KC_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_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLD,
+        KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY,
+        KC_TRNS, KC_TRNS, KC_TRNS,                            KC_TRNS,                            KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+    ),
+    [2] = LAYOUT_65_iso_blocker(
+        KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+        KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS,
+        KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+        KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, 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_65_iso_blocker(
+        KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+        KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS,
+        KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+        KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+        KC_TRNS, KC_TRNS, KC_TRNS,                            KC_TRNS,                            KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+    )
 };

+ 33 - 1
keyboards/mode/m65hi_alpha/m65hi_alpha.h

@@ -21,7 +21,24 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 #define ___ KC_NO
 
-#define LAYOUT_all( \
+/*
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┬───┐
+ * │00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0A │0B │0C │0D     │0E │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┼───┤
+ * │10   │11 │12 │13 │14 │15 │16 │17 │18 │19 │1A │1B │1C │     │1E │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐2D  ├───┤
+ * │20    │21 │22 │23 │24 │25 │26 │27 │28 │29 │2A │2B │2C │    │2E │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴┬───┼───┤
+ * │30  │31 │32 │33 │34 │35 │36 │37 │38 │39 │3A │3B │3C    │3D │3E │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬─┬───┼───┼───┤
+ * │40  │41  │42  │56                      │5A  │5B  │ │5C │5D │5E │
+ * └────┴────┴────┴────────────────────────┴────┴────┘ └───┴───┴───┘
+ * ┌─────┬───┬─────┬───────────────────────────┬─────┐
+ * │40   │41 │42   │56                         │5B   │ Tsangan
+ * └─────┴───┴─────┴───────────────────────────┴─────┘
+ */
+
+#define LAYOUT_65_iso_blocker( \
 	K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, \
 	K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C,      K1E, \
 	K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2E, \
@@ -35,3 +52,18 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 	{ K40, K41, K42, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___ }, \
 	{ ___, ___, ___, ___, ___, ___, K56, ___, ___, ___, K5A, K5B, K5C, K5D, K5E } \
 }
+
+#define LAYOUT_65_iso_blocker_tsangan( \
+	K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, \
+	K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C,      K1E, \
+	K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2E, \
+	K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E, \
+	K40, K41, K42,                K56,                     K5B, K5C, K5D, K5E \
+) { \
+	{ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E }, \
+	{ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, ___, K1E }, \
+	{ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2E }, \
+	{ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E }, \
+	{ K40, K41, K42, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___ }, \
+	{ ___, ___, ___, ___, ___, ___, K56, ___, ___, ___, ___, K5B, K5C, K5D, K5E } \
+}

+ 80 - 2
keyboards/mwstudio/mw65_black/info.json

@@ -2,14 +2,17 @@
     "keyboard_name": "MW65 Black",
     "manufacturer": "MWStudio",
     "url": "",
-    "maintainer": "qmk",
+    "maintainer": "TW59420",
     "usb": {
         "vid": "0x7BA1",
         "pid": "0x6500",
         "device_version": "0.0.1"
     },
+    "layout_aliases": {
+        "LAYOUT": "LAYOUT_65_ansi_blocker"
+    },
     "layouts": {
-        "LAYOUT": {
+        "LAYOUT_65_ansi_blocker": {
             "layout": [
                 {"label":"ESC", "x":0, "y":0},
                 {"label":"1", "x":1, "y":0},
@@ -84,6 +87,81 @@
                 {"label":"\u2193", "x":14, "y":4},
                 {"label":"\u2192", "x":15, "y":4}
             ]
+        },
+        "LAYOUT_65_ansi_blocker_tsangan": {
+            "layout": [
+                {"label":"ESC", "x":0, "y":0},
+                {"label":"1", "x":1, "y":0},
+                {"label":"2", "x":2, "y":0},
+                {"label":"3", "x":3, "y":0},
+                {"label":"4", "x":4, "y":0},
+                {"label":"5", "x":5, "y":0},
+                {"label":"6", "x":6, "y":0},
+                {"label":"7", "x":7, "y":0},
+                {"label":"8", "x":8, "y":0},
+                {"label":"9", "x":9, "y":0},
+                {"label":"0", "x":10, "y":0},
+                {"label":"-", "x":11, "y":0},
+                {"label":"=", "x":12, "y":0},
+                {"label":"Backspace", "x":13, "y":0, "w":2},
+                {"label":"Delete", "x":15, "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":"PgUp", "x":15, "y":1},
+
+                {"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":"\\", "x":12.75, "y":2},
+                {"label":"Enter", "x":13.75, "y":2, "w":1.25},
+                {"label":"PgDn", "x":15, "y":2},
+
+                {"label":"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":"Shift", "x":12.25, "y":3, "w":1.75},
+                {"label":"\u2191", "x":14, "y":3},
+                {"label":"End", "x":15, "y":3},
+
+                {"label":"Ctrl", "x":0, "y":4, "w":1.5},
+                {"label":"Win", "x":1.5, "y":4},
+                {"label":"Alt", "x":2.5, "y":4, "w":1.5},
+                {"x":4, "y":4, "w":7},
+                {"label":"Fn", "x":11, "y":4, "w":1.5},
+                {"label":"\u2190", "x":13, "y":4},
+                {"label":"\u2193", "x":14, "y":4},
+                {"label":"\u2192", "x":15, "y":4}
+            ]
         }
     }
 }

+ 4 - 4
keyboards/mwstudio/mw65_black/keymaps/default/keymap.c

@@ -18,28 +18,28 @@
 
 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 
-	[0] = LAYOUT(
+	[0] = LAYOUT_65_ansi_blocker(
 		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, RGB_TOG,
 		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_PGUP,
 		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_BSLS, KC_ENT,  KC_PGDN,
 		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_END,
 		KC_LCTL, KC_LGUI, KC_LALT,             KC_SPC,                      KC_RALT, MO(1),            KC_LEFT, KC_DOWN, KC_RIGHT),
 
-	[1] = LAYOUT(
+	[1] = LAYOUT_65_ansi_blocker(
         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, _______, _______, _______, QK_BOOT,   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
         _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
         _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
         _______, _______, _______, _______, _______, _______, _______, _______, _______),
 
-	[2] = LAYOUT(
+	[2] = LAYOUT_65_ansi_blocker(
         _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
         _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
         _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
         _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
         _______, _______, _______, _______, _______, _______, _______, _______, _______),
 
-	[3] = LAYOUT(
+	[3] = LAYOUT_65_ansi_blocker(
         _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
         _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
         _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,

+ 4 - 4
keyboards/mwstudio/mw65_black/keymaps/via/keymap.c

@@ -18,28 +18,28 @@
 
 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 
-	[0] = LAYOUT(
+	[0] = LAYOUT_65_ansi_blocker(
 		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, RGB_TOG,
 		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_PGUP,
 		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_BSLS, KC_ENT,  KC_PGDN,
 		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_END,
 		KC_LCTL, KC_LGUI, KC_LALT,             KC_SPC,                      KC_RALT, MO(1),            KC_LEFT, KC_DOWN, KC_RIGHT),
 
-	[1] = LAYOUT(
+	[1] = LAYOUT_65_ansi_blocker(
         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, _______, _______, _______, QK_BOOT,   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
         _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
         _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
         _______, _______, _______, _______, _______, _______, _______, _______, _______),
 
-	[2] = LAYOUT(
+	[2] = LAYOUT_65_ansi_blocker(
         _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
         _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
         _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
         _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
         _______, _______, _______, _______, _______, _______, _______, _______, _______),
 
-	[3] = LAYOUT(
+	[3] = LAYOUT_65_ansi_blocker(
         _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
         _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
         _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,

+ 37 - 6
keyboards/mwstudio/mw65_black/mw65_black.h

@@ -15,16 +15,47 @@
  */
 #include "quantum.h"
 
-#define LAYOUT( \
+/*                                                           (403┬404) rotary encoder
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┬─┴─┐
+ * │000│001│002│003│004│005│006│007│008│009│010│011│012│013    │014│
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┼───┤      ┌─────┐
+ * │100  │101│102│103│104│105│106│107│108│109│110│111│112│113  │114│      │     │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┼───┤   ┌──┴┐213 │ ISO Enter
+ * │200   │201│202│203│204│205│206│207│208│209│210│211│213     │214│   │212│    │
+ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┼───┤   └───┴────┘
+ * │300     │301│302│303│304│305│306│307│308│309│310│311   │313│314│
+ * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬─┬───┼───┼───┤
+ * │400 │401 │402 │405                     │409 │410 │ │412│413│414│
+ * └────┴────┴────┴────────────────────────┴────┴────┘ └───┴───┴───┘
+ * ┌─────┬───┬─────┬───────────────────────────┬─────┐
+ * │400  │401│402  │405                        │410  │ Tsangan
+ * └─────┴───┴─────┴───────────────────────────┴─────┘
+ */
+
+#define LAYOUT_65_ansi_blocker( \
 	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, K214, \
 	K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311,       K313, K314, \
 	K400, K401, K402,             K405,                   K409, K410,       K412, K413, K414  \
 ) { \
-	{ 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,  K214 }, \
-	{ K300,  K301,  K302,  K303,  K304,  K305,  K306,  K307,  K308,  K309,  K310,  K311,         K313,  K314 }, \
-	{ K400,  K401,  K402,                K405,                       K409,  K410,         K412,  K413,  K414 }  \
+	{ 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,  K214  }, \
+	{ K300,  K301,  K302,  K303,  K304,  K305,  K306,  K307,  K308,  K309,  K310,  K311,  K313,  K314,  KC_NO }, \
+	{ K400,  K401,  K402,  K405,  K409,  K410,  K412,  K413,  K414,  KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }  \
+}
+
+#define LAYOUT_65_ansi_blocker_tsangan( \
+	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, K214, \
+	K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311,       K313, K314, \
+	K400, K401, K402,             K405,                         K410,       K412, K413, K414  \
+) { \
+	{ 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,  K214  }, \
+	{ K300,  K301,  K302,  K303,  K304,  K305,  K306,  K307,  K308,  K309,  K310,  K311,  K313,  K314,  KC_NO }, \
+	{ K400,  K401,  K402,  K405,  ____,  K410,  K412,  K413,  K414,  KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }  \
 }

+ 1 - 1
keyboards/studiokestra/galatea/rev1/rev1.h

@@ -97,7 +97,7 @@
     k00, k10, k01, k02, k12, k03, k13, k04, k14, k05, k15, k06, k16, k07,   k17, k08, k18, \
     k20, k30, k21, k31, k22, k32, k23, k33, k24, k34, k25, k35, k26, k36,   k37, k28, k38, \
     k40, k50, k41, k51, k42, k52, k43, k53, k44, k54, k45, k55, k46,        k57, k48, k58, \
-    k60, k70, k61, k71, k62, k72, k63, k73, k64, k74, k65, k75, k47, k66,                  \
+    k60, k70, k61, k71, k62, k72, k63, k73, k64, k74, k65, k75, k66, k47,                  \
     k80, k90, k81, k91, k82, k92, k83, k93, k84, k94, k85, k95,      k86,        k88,      \
     kA0, kB0, kA1,                kA3,                kA5, kB5, kA6, kA7,   kB7, kA8, kB8  \
 ) { \

+ 1 - 1
keyboards/studiokestra/galatea/rev2/rev2.h

@@ -97,7 +97,7 @@
     k00, k10, k01, k02, k12, k03, k13, k04, k14, k05, k15, k06, k16, k07,   k17, k08, k18, \
     k20, k30, k21, k31, k22, k32, k23, k33, k24, k34, k25, k35, k26, k36,   k37, k28, k38, \
     k40, k50, k41, k51, k42, k52, k43, k53, k44, k54, k45, k55, k46,        k57, k48, k58, \
-    k60, k70, k61, k71, k62, k72, k63, k73, k64, k74, k65, k75, k47, k66,                  \
+    k60, k70, k61, k71, k62, k72, k63, k73, k64, k74, k65, k75, k66, k47,                  \
     k80, k90, k81, k91, k82, k92, k83, k93, k84, k94, k85, k95,      k86,        k88,      \
     kA0, kB0, kA1,                kA3,                kA5, kB5, kA6, kA7,   kB7, kA8, kB8  \
 ) { \