forked from mirrors/qmk_userspace
		
	Merge remote-tracking branch 'origin/master' into develop
This commit is contained in:
		
				commit
				
					
						eeb3f9c043
					
				
			
		
					 82 changed files with 3906 additions and 974 deletions
				
			
		| 
						 | 
				
			
			@ -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.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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,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                                                                     |
 | 
			
		||||
| --------------------------------------- | ------------------ | ------------------ | --------------------------------------------------------------------------------------------- |
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
									
								
								keyboards/a_dux/keymaps/daliusd/flow.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										336
									
								
								keyboards/a_dux/keymaps/daliusd/flow.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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
									
								
								keyboards/a_dux/keymaps/daliusd/flow.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								keyboards/a_dux/keymaps/daliusd/flow.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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);
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
  //                                └────────┘   └────────┘       └────────┘   └────────┘
 | 
			
		||||
  ),
 | 
			
		||||
 | 
			
		||||
  [_MISC] = LAYOUT(
 | 
			
		||||
  //┌────────┬────────┬────────┬────────┬────────┐                         ┌────────┬────────┬────────┬────────┬────────┐
 | 
			
		||||
     QK_BOOT,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,                          KC_BRID ,KC_BRIU ,XXXXXXX ,KC_PSCR ,K_PRINT ,
 | 
			
		||||
  //├────────┼────────┼────────┼────────┼────────┤                         ├────────┼────────┼────────┼────────┼────────┤
 | 
			
		||||
     XXXXXXX ,XXXXXXX ,DB_TOGG ,XXXXXXX ,XXXXXXX ,                          KC_MPRV ,KC_MPLY ,XXXXXXX ,KC_MNXT ,XXXXXXX ,
 | 
			
		||||
  //├────────┼────────┼────────┼────────┼────────┤                         ├────────┼────────┼────────┼────────┼────────┤
 | 
			
		||||
     XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,                          KC_VOLD ,KC_VOLU ,XXXXXXX ,XXXXXXX ,UC_MOD  ,
 | 
			
		||||
  //└────────┴────────┴────────┴────┬───┴────┬───┼────────┐       ┌────────┼───┬────┴───┬────┴────────┴────────┴────────┘
 | 
			
		||||
                                     XXXXXXX ,    XXXXXXX ,        XXXXXXX ,    XXXXXXX
 | 
			
		||||
                                     KC_BTN1 ,    KC_BTN2 ,        _______ ,    XXXXXXX
 | 
			
		||||
  //                                └────────┘   └────────┘       └────────┘   └────────┘
 | 
			
		||||
  ),
 | 
			
		||||
 | 
			
		||||
  [_FUNC] = LAYOUT(
 | 
			
		||||
  //┌────────┬────────┬────────┬────────┬────────┐                         ┌────────┬────────┬────────┬────────┬────────┐
 | 
			
		||||
     XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,                          KC_F1   ,KC_F2   ,KC_F3   ,KC_F4   ,KC_F5   ,
 | 
			
		||||
     KC_F1   ,KC_F2   ,KC_F3   ,KC_F4   ,KC_F5   ,                          XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,
 | 
			
		||||
  //├────────┼────────┼────────┼────────┼────────┤                         ├────────┼────────┼────────┼────────┼────────┤
 | 
			
		||||
     XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,                          KC_F6   ,KC_F7   ,KC_F8   ,KC_F9   ,KC_F10  ,
 | 
			
		||||
     KC_F6   ,KC_F7   ,KC_F8   ,KC_F9   ,KC_F10  ,                          XXXXXXX ,XXXXXXX ,KC_RCTL ,KC_RGUI ,KC_RALT ,
 | 
			
		||||
  //├────────┼────────┼────────┼────────┼────────┤                         ├────────┼────────┼────────┼────────┼────────┤
 | 
			
		||||
     XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,                          KC_F11  ,KC_F12  ,XXXXXXX ,XXXXXXX ,XXXXXXX ,
 | 
			
		||||
     KC_F11  ,KC_F12  ,XXXXXXX ,XXXXXXX ,XXXXXXX ,                          XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,
 | 
			
		||||
  //└────────┴────────┴────────┴────┬───┴────┬───┼────────┐       ┌────────┼───┬────┴───┬────┴────────┴────────┴────────┘
 | 
			
		||||
                                     XXXXXXX ,    XXXXXXX ,        XXXXXXX ,    XXXXXXX
 | 
			
		||||
  //                                └────────┘   └────────┘       └────────┘   └────────┘
 | 
			
		||||
  ),
 | 
			
		||||
 | 
			
		||||
  [_LT_MAC] = LAYOUT(
 | 
			
		||||
  //┌────────┬────────┬────────┬────────┬────────┐                         ┌────────┬────────┬────────┬────────┬────────┐
 | 
			
		||||
     KC_EXLM ,KC_AT   ,KC_HASH ,KC_DLR  ,KC_PERC ,                          KC_CIRC ,KC_AMPR ,KC_ASTR ,KC_PLUS ,XXXXXXX ,
 | 
			
		||||
  //├────────┼────────┼────────┼────────┼────────┤                         ├────────┼────────┼────────┼────────┼────────┤
 | 
			
		||||
     KC_1    ,KC_2    ,KC_3    ,KC_4    ,KC_5    ,                          KC_6    ,KC_7    ,KC_8    ,KC_EQL  ,XXXXXXX ,
 | 
			
		||||
  //├────────┼────────┼────────┼────────┼────────┤                         ├────────┼────────┼────────┼────────┼────────┤
 | 
			
		||||
     XXXXXXX ,KC_BSPC ,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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
layer_state_t layer_state_set_user(layer_state_t state) {
 | 
			
		||||
    return update_tri_layer_state(state, _SYM, _NAV, _NUMB);
 | 
			
		||||
void matrix_scan_user(void) {
 | 
			
		||||
    flow_matrix_scan();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool lang_layer_on = false;
 | 
			
		||||
 | 
			
		||||
layer_state_t layer_state_set_user(layer_state_t state) {
 | 
			
		||||
    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;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
| 
						 | 
				
			
			@ -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.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,4 +2,4 @@ UNICODE_ENABLE = no
 | 
			
		|||
UNICODEMAP_ENABLE = yes
 | 
			
		||||
#CONSOLE_ENABLE = yes
 | 
			
		||||
 | 
			
		||||
SRC += oneshot.c
 | 
			
		||||
SRC += flow.c
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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}
 | 
			
		||||
            ]
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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 }  \
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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,8 +93,7 @@
 | 
			
		|||
                {"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":"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},
 | 
			
		||||
| 
						 | 
				
			
			@ -122,6 +125,120 @@
 | 
			
		|||
                {"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},
 | 
			
		||||
                {"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":"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},
 | 
			
		||||
                {"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}
 | 
			
		||||
            ]
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
									
								
								keyboards/cannonkeys/ellipse/config.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								keyboards/cannonkeys/ellipse/config.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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
									
								
								keyboards/cannonkeys/ellipse/halconf.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								keyboards/cannonkeys/ellipse/halconf.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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
									
								
								keyboards/cannonkeys/ellipse/info.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										108
									
								
								keyboards/cannonkeys/ellipse/info.json
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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
									
								
								keyboards/cannonkeys/ellipse/keymaps/default/keymap.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								keyboards/cannonkeys/ellipse/keymaps/default/keymap.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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
									
								
								keyboards/cannonkeys/ellipse/keymaps/via/keymap.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								keyboards/cannonkeys/ellipse/keymaps/via/keymap.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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
									
								
								keyboards/cannonkeys/ellipse/keymaps/via/rules.mk
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								keyboards/cannonkeys/ellipse/keymaps/via/rules.mk
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
VIA_ENABLE = yes
 | 
			
		||||
							
								
								
									
										28
									
								
								keyboards/cannonkeys/ellipse/mcuconf.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								keyboards/cannonkeys/ellipse/mcuconf.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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
									
								
								keyboards/cannonkeys/ellipse/readme.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								keyboards/cannonkeys/ellipse/readme.md
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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
									
								
								keyboards/cannonkeys/ellipse/rules.mk
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								keyboards/cannonkeys/ellipse/rules.mk
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,2 @@
 | 
			
		|||
# Wildcard to allow APM32 MCU
 | 
			
		||||
DFU_SUFFIX_ARGS = -v FFFF -p FFFF
 | 
			
		||||
							
								
								
									
										94
									
								
								keyboards/cannonkeys/ellipse_hs/info.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										94
									
								
								keyboards/cannonkeys/ellipse_hs/info.json
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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
									
								
								keyboards/cannonkeys/ellipse_hs/keymaps/default/keymap.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								keyboards/cannonkeys/ellipse_hs/keymaps/default/keymap.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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
									
								
								keyboards/cannonkeys/ellipse_hs/keymaps/via/keymap.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								keyboards/cannonkeys/ellipse_hs/keymaps/via/keymap.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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
									
								
								keyboards/cannonkeys/ellipse_hs/keymaps/via/rules.mk
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								keyboards/cannonkeys/ellipse_hs/keymaps/via/rules.mk
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
VIA_ENABLE = yes
 | 
			
		||||
							
								
								
									
										25
									
								
								keyboards/cannonkeys/ellipse_hs/readme.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								keyboards/cannonkeys/ellipse_hs/readme.md
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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
									
								
								keyboards/cannonkeys/ellipse_hs/rules.mk
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								keyboards/cannonkeys/ellipse_hs/rules.mk
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,2 @@
 | 
			
		|||
# Wildcard to allow APM32 MCU
 | 
			
		||||
DFU_SUFFIX_ARGS = -v FFFF -p FFFF
 | 
			
		||||
							
								
								
									
										64
									
								
								keyboards/controllerworks/mini36/config.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								keyboards/controllerworks/mini36/config.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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
									
								
								keyboards/controllerworks/mini36/halconf.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								keyboards/controllerworks/mini36/halconf.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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
									
								
								keyboards/controllerworks/mini36/info.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										154
									
								
								keyboards/controllerworks/mini36/info.json
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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
									
								
								keyboards/controllerworks/mini36/keymaps/default/config.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								keyboards/controllerworks/mini36/keymaps/default/config.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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
									
								
								keyboards/controllerworks/mini36/keymaps/default/keymap.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								keyboards/controllerworks/mini36/keymaps/default/keymap.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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
									
								
								keyboards/controllerworks/mini36/keymaps/via/config.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								keyboards/controllerworks/mini36/keymaps/via/config.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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
									
								
								keyboards/controllerworks/mini36/keymaps/via/keymap.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								keyboards/controllerworks/mini36/keymaps/via/keymap.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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
									
								
								keyboards/controllerworks/mini36/keymaps/via/rules.mk
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								keyboards/controllerworks/mini36/keymaps/via/rules.mk
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
VIA_ENABLE = yes
 | 
			
		||||
							
								
								
									
										23
									
								
								keyboards/controllerworks/mini36/mcuconf.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								keyboards/controllerworks/mini36/mcuconf.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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
									
								
								keyboards/controllerworks/mini36/mini36.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								keyboards/controllerworks/mini36/mini36.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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
									
								
								keyboards/controllerworks/mini36/readme.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								keyboards/controllerworks/mini36/readme.md
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,43 @@
 | 
			
		|||
# mini36
 | 
			
		||||
 | 
			
		||||

 | 
			
		||||

 | 
			
		||||
 | 
			
		||||
*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
									
								
								keyboards/controllerworks/mini36/rules.mk
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								keyboards/controllerworks/mini36/rules.mk
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,3 @@
 | 
			
		|||
SERIAL_DRIVER = vendor
 | 
			
		||||
WS2812_DRIVER = vendor
 | 
			
		||||
OLED_DRIVER   = SSD1306
 | 
			
		||||
| 
						 | 
				
			
			@ -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 }  \
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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}
 | 
			
		||||
            ]
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
									
								
								keyboards/han60/keymaps/default_ansi_arrow_tsangan/keymap.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								keyboards/han60/keymaps/default_ansi_arrow_tsangan/keymap.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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
									
								
								keyboards/han60/keymaps/default_ansi_tsangan/keymap.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								keyboards/han60/keymaps/default_ansi_tsangan/keymap.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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
									
								
								keyboards/han60/keymaps/default_iso_arrow_tsangan/keymap.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								keyboards/han60/keymaps/default_iso_arrow_tsangan/keymap.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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
									
								
								keyboards/han60/keymaps/default_iso_tsangan/keymap.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								keyboards/han60/keymaps/default_iso_tsangan/keymap.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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
									
								
								keyboards/huytbt/h50/config.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								keyboards/huytbt/h50/config.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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
									
								
								keyboards/huytbt/h50/h50.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								keyboards/huytbt/h50/h50.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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
									
								
								keyboards/huytbt/h50/h50.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								keyboards/huytbt/h50/h50.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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
									
								
								keyboards/huytbt/h50/info.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								keyboards/huytbt/h50/info.json
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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
									
								
								keyboards/huytbt/h50/keymaps/default/keymap.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								keyboards/huytbt/h50/keymaps/default/keymap.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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
									
								
								keyboards/huytbt/h50/keymaps/via/keymap.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								keyboards/huytbt/h50/keymaps/via/keymap.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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
									
								
								keyboards/huytbt/h50/keymaps/via/rules.mk
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								keyboards/huytbt/h50/keymaps/via/rules.mk
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
VIA_ENABLE = yes
 | 
			
		||||
							
								
								
									
										27
									
								
								keyboards/huytbt/h50/readme.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								keyboards/huytbt/h50/readme.md
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,27 @@
 | 
			
		|||
# H50
 | 
			
		||||
 | 
			
		||||

 | 
			
		||||
 | 
			
		||||
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
									
								
								keyboards/huytbt/h50/rules.mk
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								keyboards/huytbt/h50/rules.mk
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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
									
								
								keyboards/kprepublic/bm40hsrgb/keymaps/dan/config.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								keyboards/kprepublic/bm40hsrgb/keymaps/dan/config.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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.
 | 
			
		||||
 | 
			
		||||

 | 
			
		||||
> * Case: Poseidon PSD40 Case
 | 
			
		||||
| 
						 | 
				
			
			@ -8,6 +10,11 @@
 | 
			
		|||
> * Keycaps: WOB ABS Cherry Profile
 | 
			
		||||
> * Switches: Gazzew Boba u4t (62g 2 stage long spring)
 | 
			
		||||
 | 
			
		||||

 | 
			
		||||
> * 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_** |  ESC | KOR | WIN |   ALT |    FN |  SPC |          |        - |     = | DEL |      \ | ENT |
 | 
			
		||||
| **_4_** |  ESC | KOR | WIN |   ALT |    FN |  SPC |          |        - |     = | DEL |      \\ | 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 |  [  |  ]  |  ALT | TRN |  SPC ||       _ |     + |  INS |         | ENT |
 | 
			
		||||
| **_2_** | CTL | LFT | DN  | UP  | RHT | C+/ | PGU |  [  |  ]  |  )  |  :  |  "  |
 | 
			
		||||
| **_3_** | SFT | CAPS| INS | HOM | END | PGD | PRN |  (  |  ,  |  .  |  /  | RET |
 | 
			
		||||
| **_4_** | RGB |  [  |  ]   | ALT | TRN |  SPC ||       _ |     + |  DEL |       \| | 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 |        , |      + |        . |    0 | SPC |         |   LY1 |  LY2 |  LY3 |  LY4 |  LY5 |
 | 
			
		||||
>This layer is the numpad.
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										1
									
								
								keyboards/kprepublic/bm40hsrgb/keymaps/dan/rules.mk
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								keyboards/kprepublic/bm40hsrgb/keymaps/dan/rules.mk
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
TAP_DANCE_ENABLE = yes
 | 
			
		||||
| 
						 | 
				
			
			@ -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},
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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, _______, _______, _______
 | 
			
		||||
    )
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,7 +5,7 @@
 | 
			
		|||
 | 
			
		||||
#include "quantum.h"
 | 
			
		||||
 | 
			
		||||
#define LAYOUT( \
 | 
			
		||||
#define LAYOUT_ortho_2x4( \
 | 
			
		||||
    K00, K01, K02, K03, \
 | 
			
		||||
    K10, K11, K12, K13  \
 | 
			
		||||
) \
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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},
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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,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`
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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,          _______, _______,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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, \
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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 }
 | 
			
		||||
          ]
 | 
			
		||||
      }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
    )
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
    )
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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 } \
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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}
 | 
			
		||||
            ]
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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(
 | 
			
		||||
        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
 | 
			
		||||
        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
 | 
			
		||||
        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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(
 | 
			
		||||
        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
 | 
			
		||||
        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
 | 
			
		||||
        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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 }  \
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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  \
 | 
			
		||||
) { \
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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  \
 | 
			
		||||
) { \
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue