[Keymap] add noroadsleft userspace; add and update keymaps (#11686)

master
James Young 2021-02-10 11:17:42 -08:00 committed by GitHub
parent 4b2ab84c71
commit 5a73558a21
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 773 additions and 504 deletions

View File

@ -0,0 +1,24 @@
/* Copyright 2020 James Young (@noroadsleft)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#undef MANUFACTURER
#undef PRODUCT
#define MANUFACTURER KBDfans
#define PRODUCT KBD75 rev1
#define BACKLIGHT_BREATHING

View File

@ -0,0 +1,212 @@
/* Copyright 2020 James Young (@noroadsleft)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "noroadsleft.h"
//#include "version.h"
#include "sendstring_dvorak.h"
#define LAYOUT_75_ansi_wkl( \
K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015, \
K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K114, K115, \
K200, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, \
K300, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K315, \
K400, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K413, K414, K415, \
K500, K501, K506, K510, K512, K513, K514, K515 \
) { \
{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \
{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, KC_NO, K114, K115 }, \
{ K200, KC_NO, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215 }, \
{ K300, KC_NO, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, KC_NO, K315 }, \
{ K400, KC_NO, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, KC_NO, K413, K414, K415 }, \
{ K500, K501, KC_NO, KC_NO, KC_NO, KC_NO, K506, KC_NO, KC_NO, KC_NO, K510, KC_NO, K512, K513, K514, K515 } \
}
enum layer_names {
_QW,
_DV,
_Q2,
_FN,
_SY
};
enum custom_keycodes {
GO_Q2 = KEYMAP_SAFE_RANGE,
Q2_ENT
};
unsigned char q2InputMode = 0;
// Tap Dance declarations
enum tap_dances {
LAG,
RAG,
};
// Tap Dance definitions
qk_tap_dance_action_t tap_dance_actions[] = {
// Tap once for Escape, twice for Caps Lock
[LAG] = ACTION_TAP_DANCE_DOUBLE(KC_LALT, KC_LGUI),
[RAG] = ACTION_TAP_DANCE_DOUBLE(KC_RALT, KC_RGUI),
};
#define FN_CAPS LT(_FN,KC_CAPS)
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_QW] = LAYOUT_75_ansi_wkl(
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, _______, _______, MO(_SY),
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_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,
FN_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,
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, TD(LAG), KC_SPC, TD(RAG), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
),
[_DV] = LAYOUT_75_ansi_wkl(
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, _______, _______, MO(_SY),
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_LBRC, KC_RBRC, KC_BSPC, KC_HOME,
KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, KC_EQL, KC_BSLS, KC_PGUP,
FN_CAPS, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS, KC_ENT, KC_PGDN,
KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT, KC_UP, KC_END,
KC_LCTL, TD(LAG), KC_SPC, TD(RAG), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
),
[_Q2] = LAYOUT_75_ansi_wkl(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
KC_GRV, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, Q2_ENT, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, KC_LALT, _______, KC_RALT, _______, _______, _______, _______
),
[_FN] = LAYOUT_75_ansi_wkl(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, _______,
_______, KC_CALC, KC_APP, G_PUSH, _______, _______, KC_INS, KC_HOME, KC_UP, KC_END, KC_PGUP, KC_PSCR, KC_SLCK, KC_PAUS, _______,
_______, M_SALL, _______, G_FTCH, _______, _______, KC_DEL, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, _______, _______, _______,
_______, M_UNDO, M_CUT, M_COPY, M_PASTE, G_BRCH, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______
),
[_SY] = LAYOUT_75_ansi_wkl(
_______, TO(_QW), TO(_DV), _______, GO_Q2, _______, _______, _______, RESET, EEP_RST, DEBUG, _______, VRSN, _______, _______, _______,
_______, _______, M_MDSWP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, _______,
_______, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, BL_DEC, BL_TOGG, BL_INC, BL_BRTG, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______
),
};
bool led_update_user(led_t led_state) {
writePin(B2, !led_state.caps_lock);
return false;
}
bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case G_PUSH:
if (record->event.pressed) {
SEND_STRING("git push origin ");
};
return false;
case G_FTCH:
if (record->event.pressed) {
if ( get_mods() & MOD_MASK_SHIFT ) {
clear_mods();
SEND_STRING("git pull upstream ");
} else {
SEND_STRING("git fetch upstream ");
}
};
return false;
case G_BRCH:
if (record->event.pressed) {
if ( get_mods() & MOD_MASK_SHIFT ) {
clear_mods();
SEND_STRING("master");
} else {
SEND_STRING("$(git branch-name)");
}
};
return false;
case GO_Q2:
if (record->event.pressed) {
layer_move(_QW);
layer_on(_Q2);
};
return false;
case Q2_ENT:
if (record->event.pressed) {
if (q2InputMode == 0) {
tap_code(KC_ENT);
q2InputMode = 1;
layer_on(_DV);
//layer_on(_Q2);
} else if (q2InputMode == 1) {
tap_code(KC_ENT);
q2InputMode = 0;
layer_off(_DV);
} else {
tap_code(KC_ENT);
}
};
return false;
case KC_ESC:
if (record->event.pressed) {
if (q2InputMode > 0) {
tap_code(KC_ESC);
q2InputMode = 0;
layer_off(_DV);
} else {
tap_code(KC_ESC);
}
};
return false;
case KC_GRV:
if (IS_LAYER_ON(_Q2) == true) {
if (record->event.pressed) {
if (q2InputMode == 0) {
tap_code(KC_GRV);
q2InputMode = 2;
layer_on(_DV);
} else if (q2InputMode == 1) {
tap_code(KC_GRV);
q2InputMode = 2;
} else {
tap_code(KC_GRV);
q2InputMode = 0;
layer_off(_DV);
}
return false;
}
};
return true;
case KC_Z:
if (record->event.pressed) {
if ( get_mods() & MOD_MASK_RALT ) {
register_code(KC_NUBS);
} else {
register_code(KC_Z);
}
} else {
if ( get_mods() & MOD_MASK_RALT ) {
unregister_code(KC_NUBS);
} else {
unregister_code(KC_Z);
}
};
return false;
default:
return true;
}
}

View File

@ -0,0 +1,6 @@
BOOTMAGIC_ENABLE = lite
CONSOLE_ENABLE = yes
TAP_DANCE_ENABLE = yes
VIA_ENABLE = no
LTO_ENABLE = yes

View File

@ -1,3 +1,19 @@
/* Copyright 2018-2020 James Young (@noroadsleft)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#define PERMISSIVE_HOLD // https://docs.qmk.fm/#/feature_advanced_keycodes?id=permissive-hold

View File

@ -1,8 +1,23 @@
#include QMK_KEYBOARD_H
#include "version.h"
#include <sendstring_dvorak.h>
//#include <sendstring_colemak.h>
#include <print.h>
/* Copyright 2018-2020 James Young (@noroadsleft)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "noroadsleft.h"
#include "sendstring_dvorak.h"
//#include "sendstring_colemak.h"
#include "print.h"
/**********************
@ -10,83 +25,33 @@
**********************/
enum layer_names {
// BASE LAYERS
// SHORT CODES
_QWERTY = 0,
_QW = _QWERTY,
_DVORAK,
_DV = _DVORAK,
_COLEMAK,
_CM = _COLEMAK,
_MAC,
_MC = _MAC,
_QUAKE2,
_Q2 = _QUAKE2,
_QUAKE2_DVORAK,
_QD = _QUAKE2_DVORAK,
_QUAKE2_CONSOLE,
_QC = _QUAKE2_CONSOLE,
// FUNCTION LAYERS
_FUNCWIN,
_FW = _FUNCWIN,
_FUNCMAC,
_FM = _FUNCMAC,
_FUNCQ2,
_FQ = _FUNCQ2,
_QW, // QWERTY
_DV, // Dvorak
_CM, // Colemak
// QUAKE 2 OVERLAY
_Q2, // Quake 2
// FUNCTION LAYER
_FN, // Function
// OTHER LAYERS
_NUMPAD,
_NP = _NUMPAD,
_MACROS,
_MA = _MACROS,
_SYSTEM,
_SY = _SYSTEM,
_NP, // Numpad
_MA, // Macros
_SY, // System
};
// KEYCODE DEFINITIONS
#define NO_CHNG KC_TRNS // Note for me for keys I need to leave as Pass-through
#define FW_CAPS LT(_FUNCWIN, KC_CAPS) // _FUNCWIN when held, Caps Lock when tapped
#define FM_CAPS LT(_FUNCMAC, KC_CAPS) // _FUNCMAC when held, Caps Lock when tapped
#define Q2_CAPS LT(_FUNCQ2, KC_CAPS) // _FUNCQ2 when held, Caps Lock when tapped
#define WN_SALL LCTL(DV_A) // Windows/Linux Select All
#define WN_UNDO LCTL(DV_Z) // Windows/Linux Undo
#define WN_CUT LCTL(DV_X) // Windows/Linux Cut
#define WN_COPY LCTL(DV_C) // Windows/Linux Copy
#define WN_PSTE LCTL(DV_V) // Windows/Linux Paste
#define FN_CAPS LT(_FN, KC_CAPS) // Function Layer when held, Caps Lock when tapped
#define Q2_CAPS LT(_FQ, KC_CAPS) // Quake 2 Function Layer when held, Caps Lock when tapped
#define CTL_GRV MT(MOD_LCTL, KC_GRV) // Left Control when held, Grave accent when tapped
#define MC_PSCR LGUI(LSFT(KC_3)) // MacOS Print Screen (Command + Shift + 3)
#define MC_HOME LGUI(KC_LEFT) // MacOS Home (Command + Left Arrow)
#define MC_END LGUI(KC_RGHT) // MacOS End (Command + Right Arrow)
#define MC_SALL LGUI(KC_A) // MacOS Select All
//#define MC_UNDO LGUI(KC_Z) // MacOS Undo // replaced by macro
#define MC_CUT LGUI(KC_X) // MacOS Cut
#define MC_COPY LGUI(KC_C) // MacOS Copy
//#define MC_PSTE LGUI(KC_V) // MacOS Paste // replaced by macro
// MACRO DEFINITIONS
enum custom_keycodes {
F_CAPS = SAFE_RANGE,
T_L3DED,
G_PUSH,
G_FTCH,
G_COMM,
G_RST,
G_C10R,
G_BRCH,
SIGNA,
GO_Q2,
Q2_ON,
Q2_OFF,
Q2_ESC,
Q2_GRV,
MC_UNDO,
MC_PSTE,
NUBS_Z,
VRSN
GO_Q2 = KEYMAP_SAFE_RANGE,
Q2_ENT
};
@ -94,158 +59,90 @@ enum custom_keycodes {
** MODIFIER MASKS **
*******************/
#define MOD_MASK_RALT (MOD_BIT(KC_RALT))
unsigned char q2InputMode = 0;
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
switch(keycode) {
// these are our macros!
case F_CAPS:
/*
* Objective: write a macro that checks the current layers that are
* enabled, and activates the appropriate function layer.
*/
if ( biton32(layer_state) == _MAC ) {
if (record->event.pressed) {
layer_on(_FUNCMAC);
} else {
layer_off(_FUNCMAC);
}
} else {
if (record->event.pressed) {
layer_on(_FUNCWIN);
} else {
layer_off(_FUNCWIN);
}
};
return false;
case T_L3DED:
if (record->event.pressed) {
SEND_STRING("lavak3DED ");
};
return false;
case G_PUSH:
if (record->event.pressed) {
SEND_STRING("git push origin ");
};
return false;
case G_FTCH:
if (record->event.pressed) {
if ( get_mods() & MOD_MASK_SHIFT ) {
clear_mods();
SEND_STRING("git pull upstream ");
} else {
SEND_STRING("git fetch upstream ");
}
};
return false;
case G_COMM:
if (record->event.pressed) {
SEND_STRING("git commit -m \"\"" SS_TAP(X_LEFT));
layer_off(_MACROS);
};
return false;
case G_BRCH:
if (record->event.pressed) {
if ( get_mods() & MOD_MASK_SHIFT ) {
clear_mods();
SEND_STRING("master");
} else {
SEND_STRING("$(git branch-name)");
}
layer_off(_MACROS);
};
return false;
case SIGNA:
if (record->event.pressed) {
SEND_STRING("\\- @noroadsleft" SS_TAP(X_ENTER));
layer_off(_MACROS);
};
return false;
case GO_Q2:
if (record->event.pressed) {
//default_layer_set(_QWERTY);
layer_move(_QWERTY); // TO(_QWERTY);
layer_on(_QUAKE2);
//layer_off(_SYSTEM);
//default_layer_set(_QW);
layer_move(_QW); // TO(_QW);
layer_on(_Q2);
//layer_off(_SY);
};
return false;
case Q2_ON:
case Q2_ENT:
if (record->event.pressed) {
SEND_STRING(SS_TAP(X_ENTER));
layer_on(_DVORAK);
layer_on(_QUAKE2_DVORAK);
};
return false;
case Q2_OFF:
if (record->event.pressed) {
SEND_STRING(SS_TAP(X_ENTER));
layer_move(_QWERTY); // TO(_QWERTY);
layer_on(_QUAKE2);
};
return false;
case Q2_ESC:
if (record->event.pressed) {
SEND_STRING(SS_TAP(X_ESCAPE));
layer_move(_QWERTY); // TO(_QWERTY);
layer_on(_QUAKE2);
};
return false;
case Q2_GRV:
if (record->event.pressed) {
SEND_STRING(SS_TAP(X_GRAVE));
layer_on(_DVORAK);
layer_on(_QUAKE2_DVORAK);
layer_on(_QUAKE2_CONSOLE);
};
return false;
case MC_UNDO:
if (record->event.pressed) {
if ( get_mods() & MOD_MASK_SHIFT ) {
SEND_STRING( SS_DOWN(X_LSHIFT) SS_DOWN(X_LGUI) SS_TAP(X_Z) SS_UP(X_LGUI) SS_UP(X_LSHIFT) );
if (q2InputMode == 0) {
tap_code(KC_ENT);
q2InputMode = 1;
layer_on(_DV);
//layer_on(_Q2);
} else if (q2InputMode == 1) {
tap_code(KC_ENT);
q2InputMode = 0;
layer_off(_DV);
} else {
SEND_STRING( SS_DOWN(X_LGUI) SS_TAP(X_Z) SS_UP(X_LGUI) );
tap_code(KC_ENT);
}
};
return false;
case MC_PSTE:
case KC_ESC:
if (record->event.pressed) {
if ( get_mods() & MOD_MASK_SHIFT ) {
SEND_STRING( SS_DOWN(X_LSHIFT) SS_DOWN(X_LGUI) SS_DOWN(X_LALT) SS_TAP(X_V) SS_UP(X_LALT) SS_UP(X_LGUI) SS_UP(X_LSHIFT) );
if (q2InputMode > 0) {
tap_code(KC_ESC);
q2InputMode = 0;
layer_off(_DV);
} else {
SEND_STRING( SS_DOWN(X_LGUI) SS_TAP(X_V) SS_UP(X_LGUI) );
tap_code(KC_ESC);
}
};
return false;
case NUBS_Z:
case KC_GRV:
if (IS_LAYER_ON(_Q2) == true) {
if (record->event.pressed) {
if (q2InputMode == 0) {
tap_code(KC_GRV);
q2InputMode = 2;
layer_on(_DV);
} else if (q2InputMode == 1) {
tap_code(KC_GRV);
q2InputMode = 2;
} else {
tap_code(KC_GRV);
q2InputMode = 0;
layer_off(_DV);
}
}
};
return false;
case KC_Z:
if (record->event.pressed) {
if ( get_mods() & MOD_MASK_RALT ) {
SEND_STRING( SS_DOWN(X_NONUS_BSLASH) );
register_code(KC_NUBS);
} else {
SEND_STRING( SS_DOWN(X_Z) );
register_code(KC_Z);
}
} else {
if ( get_mods() & MOD_MASK_RALT ) {
SEND_STRING( SS_UP(X_NONUS_BSLASH) );
unregister_code(KC_NUBS);
} else {
SEND_STRING( SS_UP(X_Z) );
unregister_code(KC_Z);
}
};
return false;
case VRSN:
if (record->event.pressed) {
SEND_STRING( QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION );
}
return false;
case KC_1 ... KC_0:
if (record->event.pressed) {
if ( get_mods() & MOD_MASK_RALT ) {
register_code( keycode + 0x3b );
register_code( keycode + 0x3B );
} else {
register_code( keycode );
}
} else {
if ( get_mods() & MOD_MASK_RALT ) {
unregister_code( keycode + 0x3b );
unregister_code( keycode + 0x3B );
} else {
unregister_code( keycode );
}
@ -279,47 +176,30 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
****************/
/* QWERTY */
[_QWERTY] = LAYOUT_60_ansi(
// 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, \
FW_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, NUBS_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, \
CTL_GRV, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(_MA), MO(_FW), KC_RCTL \
[_QW] = LAYOUT_60_ansi(
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
FN_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,
CTL_GRV, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(_MA), MO(_FN), KC_RCTL
),
/* Dvorak */
[_DVORAK] = LAYOUT_60_ansi(
// 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_LBRC, KC_RBRC, KC_BSPC, \
KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, KC_EQL, KC_BSLS, \
FW_CAPS, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS, KC_ENT, \
KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT, \
CTL_GRV, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(_MA), MO(_FW), KC_RCTL \
[_DV] = LAYOUT_60_ansi(
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_LBRC, KC_RBRC, KC_BSPC,
KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, KC_EQL, KC_BSLS,
FN_CAPS, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS, KC_ENT,
KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT,
CTL_GRV, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(_MA), MO(_FN), KC_RCTL
),
/* Colemak */
[_COLEMAK] = LAYOUT_60_ansi(
// 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \
KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_LBRC, KC_RBRC, KC_BSLS, \
FW_CAPS, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, KC_ENT, \
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, \
CTL_GRV, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(_MA), MO(_FW), KC_RCTL \
),
/****************
** OS OVERLAYS **
****************/
/* Mac */
[_MAC] = LAYOUT_60_ansi(
// 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
FM_CAPS, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
_______, _______, _______, _______, _______, _______, MO(_FM), _______ \
[_CM] = LAYOUT_60_ansi(
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC,
KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_LBRC, KC_RBRC, KC_BSLS,
FN_CAPS, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, KC_ENT,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
CTL_GRV, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(_MA), MO(_FN), KC_RCTL
),
/*********************
@ -327,65 +207,25 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
*********************/
/* Quake 2 */
[_QUAKE2] = LAYOUT_60_ansi(
// 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
Q2_CAPS, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, Q2_ON, \
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
_______, _______, _______, _______, _______, _______, MO(_FQ), _______ \
),
[_QUAKE2_DVORAK] = LAYOUT_60_ansi(
// 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
Q2_ESC, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
Q2_CAPS, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, Q2_OFF, \
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
_______, _______, _______, _______, _______, _______, MO(_FQ), _______ \
),
[_QUAKE2_CONSOLE] = LAYOUT_60_ansi(
// 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
Q2_ESC, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
Q2_CAPS, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_ENT, \
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
_______, _______, _______, _______, _______, _______, MO(_FQ), _______ \
[_Q2] = LAYOUT_60_ansi(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, Q2_ENT,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
KC_GRV, _______, _______, _______, _______, _______, _______, _______
),
/********************
** FUNCTION LAYERS **
********************/
/* Windows Fn layer */
[_FUNCWIN] = LAYOUT_60_ansi(
// 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
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_CALC, KC_APP, _______, _______, _______, KC_INS, KC_HOME, KC_UP, KC_END, KC_PGUP, KC_PSCR, KC_SLCK, KC_PAUS, \
NO_CHNG, WN_SALL, _______, _______, _______, _______, KC_DEL, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, _______, KC_PENT, \
_______, WN_UNDO, WN_CUT, WN_COPY, WN_PSTE, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, TG(_SY), _______, \
_______, _______, _______, TG(_NP), _______, TG(_MA), NO_CHNG, _______ \
),
/* MacOS Fn layer */
[_FUNCMAC] = LAYOUT_60_ansi(
// 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
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_INS, MC_HOME, KC_UP, MC_END, KC_PGUP, MC_PSCR, _______, _______, \
NO_CHNG, MC_SALL, _______, _______, _______, _______, KC_DEL, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, _______, _______, \
_______, MC_UNDO, MC_CUT, MC_COPY, MC_PSTE, _______, _______, _______, _______, _______, TG(_SY), _______, \
_______, _______, _______, TG(_NP), _______, _______, NO_CHNG, _______ \
),
/* Quake 2 Fn layer */
[_FUNCQ2] = LAYOUT_60_ansi(
// 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
Q2_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_INS, KC_HOME, KC_UP, KC_END, KC_PGUP, KC_PSCR, KC_SLCK, KC_PAUS, \
NO_CHNG, _______, _______, _______, _______, _______, KC_DEL, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, _______, KC_ENT, \
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, TG(_SY), _______, \
_______, _______, _______, _______, _______, _______, NO_CHNG, _______ \
/* Fn layer */
[_FN] = LAYOUT_60_ansi(
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_CALC, KC_APP, _______, _______, _______, KC_INS, KC_HOME, KC_UP, KC_END, KC_PGUP, KC_PSCR, KC_SLCK, KC_PAUS,
NO_CHNG, M_SALL, _______, _______, _______, _______, KC_DEL, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, _______, KC_PENT,
_______, M_UNDO, M_CUT, M_COPY, M_PASTE, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, TG(_SY), _______,
_______, _______, _______, TG(_NP), _______, _______, NO_CHNG, _______
),
/*****************
@ -393,33 +233,30 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
*****************/
/* Numpad layer */
[_NUMPAD] = LAYOUT_60_ansi(
// 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
_______, _______, _______, _______, _______, _______, _______, KC_P7, KC_P8, KC_P9, _______, _______, _______, _______, \
_______, _______, _______, _______, KC_E, KC_F, _______, KC_P4, KC_P5, KC_P6, KC_PAST, KC_PSLS, KC_PEQL, _______, \
_______, _______, _______, _______, KC_C, KC_D, _______, KC_P1, KC_P2, KC_P3, KC_PPLS, KC_PMNS, KC_PENT, \
_______, _______, _______, _______, KC_A, KC_B, _______, KC_P0, _______, KC_PDOT, _______, _______, \
_______, _______, _______, TG(_NP), _______, _______, NO_CHNG, _______ \
[_NP] = LAYOUT_60_ansi(
_______, _______, _______, _______, _______, _______, _______, KC_P7, KC_P8, KC_P9, _______, _______, _______, _______,
_______, _______, _______, _______, KC_E, KC_F, _______, KC_P4, KC_P5, KC_P6, KC_PAST, KC_PSLS, KC_PEQL, _______,
_______, _______, _______, _______, KC_C, KC_D, _______, KC_P1, KC_P2, KC_P3, KC_PPLS, KC_PMNS, KC_PENT,
_______, _______, _______, _______, KC_A, KC_B, _______, KC_P0, _______, KC_PDOT, _______, _______,
_______, _______, _______, TG(_NP), _______, _______, NO_CHNG, _______
),
/* Macro layer */
[_MACROS] = LAYOUT_60_ansi(
// 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
TG(_MA), _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, DM_REC1, DM_REC2, _______, \
_______, _______, _______, G_PUSH, _______, _______, _______, _______, _______, _______, _______, DM_PLY1, DM_PLY2, DM_RSTP, \
_______, _______, _______, G_FTCH, G_COMM, _______, _______, _______, _______, _______, _______, _______, _______, \
_______, _______, _______, _______, _______, G_BRCH, SIGNA, _______, _______, _______, _______, _______, \
_______, _______, _______, _______, _______, _______, NO_CHNG, _______ \
[_MA] = LAYOUT_60_ansi(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, DM_REC1, DM_REC2, _______,
_______, _______, _______, G_PUSH, _______, _______, _______, _______, _______, _______, _______, DM_PLY1, DM_PLY2, DM_RSTP,
_______, _______, _______, G_FTCH, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, G_BRCH, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, NO_CHNG, _______
),
/* System layer */
[_SYSTEM] = LAYOUT_60_ansi(
// 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
TG(_SY), TO(_QW), TO(_DV), TO(_CM), GO_Q2, XXXXXXX, XXXXXXX, XXXXXXX, RESET, XXXXXXX, DEBUG, XXXXXXX, VRSN, XXXXXXX, \
XXXXXXX, XXXXXXX, TG(_MC), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
XXXXXXX, XXXXXXX, XXXXXXX, BL_DEC, BL_TOGG, BL_INC, BL_BRTG, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, NO_CHNG, XXXXXXX \
[_SY] = LAYOUT_60_ansi(
TG(_SY), TO(_QW), TO(_DV), TO(_CM), GO_Q2, XXXXXXX, XXXXXXX, XXXXXXX, RESET, XXXXXXX, DEBUG, XXXXXXX, VRSN, XXXXXXX,
XXXXXXX, XXXXXXX, M_MDSWP, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, BL_DEC, BL_TOGG, BL_INC, BL_BRTG, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, NO_CHNG, XXXXXXX
),
};

View File

@ -27,15 +27,12 @@ Descriptions of the physical locations of keys will use the key's function in a
- Layer 0: QWERTY `_QW`
- Layer 1: Hardware Dvorak `_DV`
- Layer 2: Hardware Colemak `_CM`
- [OS Overlays](./readme_ch2.md)
- Layer 3: MacOS Overlay `_MC`
- [Quake 2 Overlays](./readme_ch3.md)
- Layers 4, 5 and 6: Quake 2 `_Q2`, Quake 2 Dvorak `_QD`, and Quake 2 Console `_QC`
- [Function Layers](./readme_ch4.md)
- Layer 7: Windows Fn layer `_FW`
- Layer 8: MacOS-oriented Fn layer `_FM`
- Layer 9: Quake 2 Fn layer `_FQ`
- [Other Layers](./readme_ch5.md)
- Layer 10: Numpad layer `_NP`
- Layer 11: Macro layer `_MA`
- Layer 12: System layer `_SY`
- [Quake 2 Overlays](./readme_ch2.md)
- Layers 3, 4 and 5: Quake 2 `_Q2`, Quake 2 Dvorak `_QD`, and Quake 2 Console `_QC`
- [Function Layers](./readme_ch3.md)
- Layer 6: Fn layer `_FN`
- Layer 7: Quake 2 Fn layer `_FQ`
- [Other Layers](./readme_ch4.md)
- Layer 8: Numpad layer `_NP`
- Layer 9: Macro layer `_MA`
- Layer 10: System layer `_SY`

View File

@ -2,10 +2,9 @@
- [Table of Contents](./readme.md)
1. **Base Layers**
2. [**OS Overlays**](./readme_ch2.md)
3. [Quake 2 Overlays](./readme_ch3.md)
4. [Function Layers](./readme_ch4.md)
5. [Other Layers](./readme_ch5.md)
2. [Quake 2 Overlays](./readme_ch2.md)
3. [Function Layers](./readme_ch3.md)
4. [Other Layers](./readme_ch4.md)
----
@ -19,7 +18,7 @@ Standard QWERTY layout, with four QMK features:
- The `Caps Lock` key has been replaced with a dual function `LT()` key, which opens the Windows Fn layer when held, and is `Caps Lock` when tapped
- The Left `Control` key has been replaced with a `MT(MOD_CTRL, KC_GRV)` key, which is <code>&#96; ~</code> when tapped and `Ctrl` when held.
![QWERTY layer](https://raw.githubusercontent.com/noroadsleft/qmk_images/master/keyboards/kc60/keymaps/noroadsleft/layer_00.png)
![QWERTY layer](https://raw.githubusercontent.com/noroadsleft/qmk_images/master/keyboards/kc60/keymaps/noroadsleft/QWERTY.png)
----
@ -30,7 +29,7 @@ Standard QWERTY layout, with four QMK features:
A hardware-based Dvorak Simplified layout. At my weekend job, I use a shared computer that runs MacOS Sierra, in US QWERTY layout. In this layer, I can leave the system in QWERTY, plug my keyboard in, and still type in Dvorak.
![Hardware Dvorak layer](https://raw.githubusercontent.com/noroadsleft/qmk_images/master/keyboards/kc60/keymaps/noroadsleft/layer_01.png)
![Hardware Dvorak layer](https://raw.githubusercontent.com/noroadsleft/qmk_images/master/keyboards/kc60/keymaps/noroadsleft/Dvorak.png)
----
@ -41,9 +40,9 @@ A hardware-based Dvorak Simplified layout. At my weekend job, I use a shared com
A hardware-based Colemak layout. Been thinking of trying it, so it's here.
![Hardware Colemak layer](https://raw.githubusercontent.com/noroadsleft/qmk_images/master/keyboards/kc60/keymaps/noroadsleft/layer_02.png)
![Hardware Colemak layer](https://raw.githubusercontent.com/noroadsleft/qmk_images/master/keyboards/kc60/keymaps/noroadsleft/Colemak.png)
----
Next Chapter: [OS Overlays](./readme_ch2.md)
Next Chapter: [Quake 2 Overlays](./readme_ch2.md)

View File

@ -2,23 +2,35 @@
- [Table of Contents](./readme.md)
1. [Base Layers](./readme_ch1.md)
2. **OS Overlays**
3. [Quake 2 Overlays](./readme_ch3.md)
4. [Function Layers](./readme_ch4.md)
5. [Other Layers](./readme_ch5.md)
2. **Quake 2 Overlays**
3. [Function Layers](./readme_ch3.md)
4. [Other Layers](./readme_ch4.md)
----
## Layer 3: Layer 3: MacOS Overlay `_MC`
## Layers 3, 4 and 5: Quake 2 `_Q2`, Quake 2 Dvorak `_QD`, and Quake 2 Console `_QC`
### Toggled by holding either `Fn` and tapping `/?` key, then tapping `W`.
### Accessed by holding either `Fn` key and tapping the `/?` key, then tapping `4$`
This layer overrides the `Fn` keys on whichever base layer is currently enabled, sending the keyboard to the MacOS-oriented Fn layer `_FM`, instead of the Windows Fn layer `_FW`.
These layers were born out of the confusion I have had trying to use the in-game chat and the console in [Quake 2](https://en.wikipedia.org/wiki/Quake_II). When Quake 2 came out, alternate keyboard layouts weren't really a thing. As a result, all in-game text input is hard-locked to US QWERTY, regardless of what the operating system is using for its input method.
![MacOS Overlay](https://raw.githubusercontent.com/noroadsleft/qmk_images/master/keyboards/kc60/keymaps/noroadsleft/layer_03.png)
I'm attempting to solve this by some creative use of QMK's macro feature. The keycode in the System layer that enables these layers, [`GO_Q2`](./keymap.c#L387), is a [macro](./keymap.c#L101-L108) that sets the default layer to the QWERTY layer, then turns the Quake 2 layer `_Q2` on. The result is a partially-overwritten QWERTY layer, that has some keycodes with some creative layer switching.
When I hit the `Enter` key (bound in-game to text chat), the [macro keycode](./keymap.c#L109-L115) I've created sends the keycode for `Enter`, then follows with enabling the Hardware Dvorak layer and its corresponding overlay. Now the game is in text chat mode, and my keyboard is in Dvorak. When I hit `Enter` again, another `Enter` [keycode macro](./keymap.c#L116-L122) is sent, which sends the message, then the macro brings me back to the standard QWERTY+Quake 2 setup. Hitting `Escape` instead runs a [macro](./keymap.c#L123-L129) that cancels the sending of the message, and undoes the layers.
I have been testing this configuration for a few months. Sometimes I end up still in Dvorak mode without any text input systems (in-game chat or the console) running, but it pretty much always happens when I'm focused on the game, so I don't know the cause yet.
### Layer 3: Quake 2
![Quake 2](https://raw.githubusercontent.com/noroadsleft/qmk_images/master/keyboards/kc60/keymaps/noroadsleft/Quake%202.png)
### Layer 4: Quake 2 Dvorak
![Quake 2 Dvorak](https://raw.githubusercontent.com/noroadsleft/qmk_images/master/keyboards/kc60/keymaps/noroadsleft/Quake%202%20Dvorak.png)
### Layer 5: Quake 2 Console
![Quake 2 Console](https://raw.githubusercontent.com/noroadsleft/qmk_images/master/keyboards/kc60/keymaps/noroadsleft/Quake%202%20Console.png)
----
Next Chapter: [Quake 2 Overlays](./readme_ch3.md)
Next Chapter: [Function Layers](./readme_ch3.md)

View File

@ -2,36 +2,39 @@
- [Table of Contents](./readme.md)
1. [Base Layers](./readme_ch1.md)
2. [OS Overlays](./readme_ch2.md)
3. **Quake 2 Overlays**
4. [Function Layers](./readme_ch4.md)
5. [Other Layers](./readme_ch5.md)
2. [Quake 2 Overlays](./readme_ch2.md)
3. **Function Layers**
4. [Other Layers](./readme_ch4.md)
----
## Layers 4, 5 and 6: Quake 2 `_Q2`, Quake 2 Dvorak `_QD`, and Quake 2 Console `_QC`
## Layer 6: Fn layer - `_FN`
### Accessed by holding either `Fn` key and tapping the `/?` key, then tapping `4$`
### Accessed by holding either `Fn` key from any base layer
These layers were born out of the confusion I have had trying to use the in-game chat and the console in [Quake 2](https://en.wikipedia.org/wiki/Quake_II). When Quake 2 came out, alternate keyboard layouts weren't really a thing. As a result, all in-game text input is hard-locked to US QWERTY, regardless of what the operating system is using for its input method.
Arrows, Navigation keys (Insert, Home, Page Up, etc.), and Function keys are here. Also has keys for Calculator, Menu, Volume Control, and shortcuts for Select All, Undo, Cut, Copy, and Paste. Numpad Enter for when I'm working in Adobe Photoshop, because it treats Numpad Enter differently from the regular Enter key.
I'm attempting to solve this by some creative use of QMK's macro feature. The keycode in the System layer that enables these layers, [`GO_Q2`](./keymap.c#L418), is a [macro](./keymap.c#L164-L171) that sets the default layer to the QWERTY layer, then turns the Quake 2 layer `_Q2` on. The result is a partially-overwritten QWERTY layer, that has some keycodes with some creative layer switching.
When I hit the `Enter` key (bound in-game to text chat), the [macro keycode](./keymap.c#L172-L178) I've created sends the keycode for `Enter`, then follows with enabling the Hardware Dvorak layer and its corresponding overlay. Now the game is in text chat mode, and my keyboard is in Dvorak. When I hit `Enter` again, another `Enter` [keycode macro](./keymap.c#L179-L185) is sent, which sends the message, then the macro brings me back to the standard QWERTY+Quake 2 setup. Hitting `Escape` instead runs a [macro](./keymap.c#L186-L192) that cancels the sending of the message, and undoes the layers.
I have been testing this configuration for a few months. Sometimes I end up still in Dvorak mode without any text input systems (in-game chat or the console) running, but it pretty much always happens when I'm focused on the game, so I don't know the cause yet.
### Layer 4: Quake 2
![Quake 2](https://raw.githubusercontent.com/noroadsleft/qmk_images/master/keyboards/kc60/keymaps/noroadsleft/layer_04.png)
### Layer 5: Quake 2 Dvorak
![Quake 2 Dvorak](https://raw.githubusercontent.com/noroadsleft/qmk_images/master/keyboards/kc60/keymaps/noroadsleft/layer_05.png)
### Layer 6: Quake 2 Console
![Quake 2 Console](https://raw.githubusercontent.com/noroadsleft/qmk_images/master/keyboards/kc60/keymaps/noroadsleft/layer_06.png)
![Windows Fn layer](https://raw.githubusercontent.com/noroadsleft/qmk_images/master/keyboards/kc60/keymaps/noroadsleft/Fn.png)
----
Next Chapter: [Function Layers](./readme_ch4.md)
## Layer 7: Quake 2 Fn layer - `_FQ`
### Accessed by holding either `Fn` key while either Quake 2 overlay is active.
Based on the Windows function layer, but removes some functions that are pointless to have while in the game.
![Quake 2 Fn layer](https://raw.githubusercontent.com/noroadsleft/qmk_images/master/keyboards/kc60/keymaps/noroadsleft/Quake%202%20Fn.png)
Keycode(s) Sent | Notes
:-------------------------------- | :----
[`Q2_GRV`](./keymap.c#L130-L137) | Sends `KC_GRV`, then enables the Dvorak, Quake 2 Dvorak, and Quake 2 Console layers.
----
Next Chapter: [Other Layers](./readme_ch4.md)

View File

@ -2,51 +2,109 @@
- [Table of Contents](./readme.md)
1. [Base Layers](./readme_ch1.md)
2. [OS Overlays](./readme_ch2.md)
3. [Quake 2 Overlays](./readme_ch3.md)
4. **Function Layers**
5. [Other Layers](./readme_ch5.md)
2. [Quake 2 Overlays](./readme_ch2.md)
3. [Function Layers](./readme_ch3.md)
4. **Other Layers**
----
## Layer 7: Windows Fn layer - `_FW`
## Layer 8: Numpad layer - `_NP`
### Accessed by holding either `Fn` key in Layer 0
### Accessed by holding either `Fn` key and tapping `Space`, from any of the Base Layers
Arrows, Navigation keys (Insert, Home, Page Up, etc.), and Function keys are here. Also has keys for Calculator, Menu, Volume Control, and shortcuts for Select All, Undo, Cut, Copy, and Paste. Numpad Enter for when I'm working in Adobe Photoshop, because it treats Numpad Enter differently from the regular Enter key.
Puts a Numpad on the right-hand side of the keyboard. A through F included for hexadecimal input. Tapping `Space` returns to the previous Base Layer.
![Windows Fn layer](https://raw.githubusercontent.com/noroadsleft/qmk_images/master/keyboards/kc60/keymaps/noroadsleft/layer_07.png)
![Numpad layer](https://raw.githubusercontent.com/noroadsleft/qmk_images/master/keyboards/kc60/keymaps/noroadsleft/Numpad.png)
----
## Layer 8: MacOS-oriented Fn layer - `_FM`
## Layer 9: Macro layer - `_MA`
### Accessed by holding either `Fn` key in Layer 1
### Accessed by holding the right-side `Win` key
Based on my Windows Fn layer, but swaps a few functions for a MacOS environment. Arrow, Navigation, and Function keys are basically unchanged from Layer 2. This layer enables using either `Fn` key as a sort of simulated `Command` key, which I find easier to reach and use.
Has some macros that I use in Git, some frequently-typed strings, and keys for use with the [Dynamic Macros feature](https://docs.qmk.fm/#/feature_dynamic_macros).
![MacOS-oriented Fn layer](https://raw.githubusercontent.com/noroadsleft/qmk_images/master/keyboards/kc60/keymaps/noroadsleft/layer_08.png)
Tapping `Esc` exits the Macro layer, if the macro used doesn't do it automatically.
![Macro layer](https://raw.githubusercontent.com/noroadsleft/qmk_images/master/keyboards/kc60/keymaps/noroadsleft/Macro.png)
### Macros
#### [G_PUSH](./keymap.c#L71-L75)
Output: `git push origin `
Everything from here down is related to Git or GitHub.
#### [G_FTCH](./keymap.c#L76-L85)
| Condition | Output |
| :-------- | :----- |
| If <kbd>Shift</kbd> is active | `git pull upstream ` |
| Otherwise | `git fetch upstream ` |
#### [G_BRCH](./keymap.c#L86-L95)
| Condition | Output |
| :-------- | :----- |
| If <kbd>Shift</kbd> is active | `master` |
| Otherwise | `$(git branch-name)` |
`$(git branch-name)` is a [git alias](./readme_git.md) that returns the name of the current branch.
#### [SIGNA](./keymap.c#L96-L100)
Output: `\- @noroadsleft` <kbd>Enter</kbd>
Sometimes on GitHub, I sign my comments. Types my GitHub name in Markdown syntax, and then taps the `Enter` key.
#### "Macro Mode" Macros and Customized Keycodes
Some of my macros and keycodes do different things depending on the value of the [`macroMode` variable](./keymap.c#L65), which is toggled between `0` and `1` by the [`M_MDSWP` custom keycode](./keymap.c#L238-L242). This is mainly at attempt to make various shortcuts the same key combinations between Windows/Linux and MacOS (which I use at home and work, respectively).
| Keycode | `macroMode == 0` | `macroMode == 1` | `macroMode == 1` with Shift |
| :------------------------------ | :--------------- | :--------------- | :--------------------------- |
| [M_SALL](./keymap.c#L138-L146) | `Ctrl+A` | `Cmd+A` | `Cmd+A` |
| [M_UNDO](./keymap.c#L147-L159) | `Ctrl+Z` | `Cmd+Z` | `Cmd+Shift+Z` |
| [M_CUT](./keymap.c#L160-L168) | `Ctrl+X` | `Cmd+X` | `Cmd+X` |
| [M_COPY](./keymap.c#L169-L177) | `Ctrl+C` | `Cmd+C` | `Cmd+C` |
| [M_PASTE](./keymap.c#L178-L190) | `Ctrl+V` | `Cmd+V` | `Cmd+Shift+Opt+V` |
| `KC_HOME` | `KC_HOME` | `Cmd+Left` | `Cmd+Left` |
| `KC_END` | `KC_END` | `Cmd+Right` | `Cmd+Right` |
| `KC_PSCR` | `KC_PSCR` | `Cmd+Shift+3` | `Cmd+Shift+3` |
#### [Emulated Non-US Backslash](./keymap.c#L218-L232)
Sometimes I type in languages from countries that use ISO layout, but my keyboard is ANSI, so I have one key fewer. This macro simulates the Non-US Backslash key if I use Right Alt + Z.
#### [VRSN](./keymap.c#L233-L237)
Outputs a string that tells me the Git commit from which my flashed firmware was built. Looks something like:
kc60/noroadsleft @ 0.6.326-6-gae6d7b-dirty
#### [Emulated Numeric Keypad](./keymap.c#L243-L257)
If I hold the Right Alt key, the number row (`KC_1` through `KC_0`) will output numpad keycodes instead of number row keycodes, enabling quicker access to characters like ™ and °.
#### [Emulated Extended Function Keys](./keymap.c#L258-L272)
Similar to the emulated numpad, if I hold the Right Alt key with the Fn key, the function row (`KC_F1` through `KC_F12`) will output keycodes `KC_F13` throught `KC_F24`.
----
### Layer 10: System layer - `_SY`
#### Accessed by holding either `Fn` key and tapping the `/?` key
This is where I change my keyboard function. Base layer select on `1` through `3`, Backlight controls on `C` through `N`, Reset on `8*`, Debug on `0)`.
![System layer](https://raw.githubusercontent.com/noroadsleft/qmk_images/master/keyboards/kc60/keymaps/noroadsleft/System.png)
----
## Layer 9: Quake 2 Fn layer - `_FQ`
### Accessed by holding either `Fn` key while either Quake 2 overlay is active.
Based on the Windows function layer, but removes some functions that are pointless to have while in the game.
![Quake 2 Fn layer](https://raw.githubusercontent.com/noroadsleft/qmk_images/master/keyboards/kc60/keymaps/noroadsleft/layer_09.png)
Keycode(s) Sent | Notes
:-------------------------------- | :----
[`Q2_GRV`](./keymap.c#L193-L200) | Sends `KC_GRV`, then enables the Dvorak, Quake 2 Dvorak, and Quake 2 Console layers.
----
Next Chapter: [Other Layers](./readme_ch5.md)
[Back to the index.](./)

View File

@ -1,125 +0,0 @@
# @noroadsleft's KC60 keymap
- [Table of Contents](./readme.md)
1. [Base Layers](./readme_ch1.md)
2. [OS Overlays](./readme_ch2.md)
3. [Quake 2 Overlays](./readme_ch3.md)
4. [Function Layers](./readme_ch4.md)
5. **Other Layers**
----
## Layer 10: Numpad layer - `_NP`
### Accessed by holding either `Fn` key and tapping `Space`, from any of the Base Layers
Puts a Numpad on the right-hand side of the keyboard. A through F included for hexadecimal input. Tapping `Space` returns to the previous Base Layer.
![Numpad layer](https://raw.githubusercontent.com/noroadsleft/qmk_images/master/keyboards/kc60/keymaps/noroadsleft/layer_10.png)
----
## Layer 11: Macro layer - `_MA`
### Accessed by holding the `Fn` key and tapping the right-side `Win` key
Has some macros that I use in Git, some frequently-typed strings, and keys for use with the [Dynamic Macros feature](https://docs.qmk.fm/#/feature_dynamic_macros).
Tapping `Esc` exits the Macro layer, if the macro used doesn't do it automatically.
![Macro layer](https://raw.githubusercontent.com/noroadsleft/qmk_images/master/keyboards/kc60/keymaps/noroadsleft/layer_11.png)
### Macros
#### [G_PUSH](./keymap.c#L126-L130)
Output: `git push origin `
Everything from here down is related to Git or GitHub.
#### [G_FTCH](./keymap.c#L131-L140)
| Condition | Output |
| :-------- | :----- |
| If <kbd>Shift</kbd> is active | `git pull upstream ` |
| Otherwise | `git fetch upstream ` |
#### [G_COMM](./keymap.c#L141-L146)
Output: `git commit -m ""` <kbd>Left</kbd>
Readies a `git commit` command, moves the cursor between the quotation marks, then disables the Macro layer.
#### [G_BRCH](./keymap.c#L147-L157)
| Condition | Output |
| :-------- | :----- |
| If <kbd>Shift</kbd> is active | `master` |
| Otherwise | `$(git branch-name)` |
`$(git branch-name)` is a [git alias](./readme_git.md) that returns the name of the current branch. This macro disables the Macro layer when finished.
#### [SIGNA](./keymap.c#L158-L163)
Output: `\- @noroadsleft` <kbd>Enter</kbd>
Sometimes on GitHub, I sign my comments. Types my GitHub name in Markdown syntax, and then taps the `Enter` key. Disables the Macro layer when finished.
#### [MC_UNDO](./keymap.c#L201-L209)
| Condition | Output |
| :-------- | :----- |
| If <kbd>Shift</kbd> is active | <kbd>Shift</kbd> + <kbd>Command</kbd> + <kbd>Z</kbd> |
| Otherwise | <kbd>Command</kbd> + <kbd>Z</kbd> |
An Undo shortcut that turns to Redo if <kbd>Shift</kbd> is being held. I'm not sure that part is required to get that behavior, but it works as desired, so I'm not messing with it.
#### [MC_PSTE](./keymap.c#L210-L218)
| Condition | Output |
| :-------- | :----- |
| If <kbd>Shift</kbd> is active | <kbd>Shift</kbd> + <kbd>Command</kbd> + <kbd>Option</kbd> + <kbd>V</kbd> |
| Otherwise | <kbd>Command</kbd> + <kbd>V</kbd> |
The program I use this in uses <kbd>Shift</kbd> + <kbd>Command</kbd> + <kbd>Option</kbd> + <kbd>V</kbd> to paste while maintaining formatting (typeface, text size, etc.). Sometimes I want this and sometimes I don't. Using <kbd>Shift</kbd> changes the behavior.
#### [NUBS_Z](./keymap.c#L219-L233)
| Condition | Output |
| :-------- | :----- |
| If Right <kbd>Alt</kbd> is active | `KC_NUBS` |
| Otherwise | `KC_Z` |
Sometimes I type in languages from countries that use ISO layout, but my keyboard is ANSI, so I have one key fewer. This macro simulates the Non-US Backslash key if I use Right Alt + Z.
#### [VRSN](./keymap.c#L234-L238)
Outputs a string that tells me the Git commit from which my flashed firmware was built. Looks something like:
kc60/noroadsleft @ 0.6.326-6-gae6d7b-dirty
#### [Emulated Numeric Keypad](./keymap.c#L239-L253)
If I hold the Right Alt key, the number row (`KC_1` through `KC_0`) will output numpad keycodes instead of number row keycodes, enabling quicker access to characters like ™ and °.
#### [Emulated Extended Function Keys](./keymap.c#L254-L268)
Similar to the emulated numpad, if I hold the Right Alt key with the Fn key, the function row (`KC_F1` through `KC_F12`) will output keycodes `KC_F13` throught `KC_F24`.
----
### Layer 12: System layer - `_SY`
#### Accessed by holding either `Fn` key and tapping the `/?` key
This is where I change my keyboard function. Base layer select on `1` through `3`, Backlight controls on `C` through `N`, Reset on `8*`, Debug on `0)`.
![System layer](https://raw.githubusercontent.com/noroadsleft/qmk_images/master/keyboards/kc60/keymaps/noroadsleft/layer_12.png)
----
[Back to the index.](./)

View File

@ -1,8 +1,6 @@
# https://github.com/qmk/qmk_firmware/issues/3448#issuecomment-406636125
# EXTRAFLAGS += -flto
LTO_ENABLE = yes
MOUSEKEY_ENABLE = no # Mouse keys
# COMMAND_ENABLE = no # Commands for debug and configuration
SPACE_CADET_ENABLE = no # Space Cadet
DYNAMIC_MACRO_ENABLE = yes
LTO_ENABLE = yes

View File

@ -0,0 +1,153 @@
/* Copyright 2020 James Young (@noroadsleft)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "noroadsleft.h"
#include "version.h"
/*******************
** MODIFIER MASKS **
*******************/
bool macroMode = 0;
__attribute__((weak))
bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { return true; };
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
if (!process_record_keymap(keycode, record)) {
return false;
}
switch (keycode) {
case VRSN:
if (record->event.pressed) {
SEND_STRING(QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
}
return false;
case G_PUSH:
if (record->event.pressed) {
SEND_STRING("git push origin ");
};
return false;
case G_FTCH:
if (record->event.pressed) {
if ( get_mods() & MOD_MASK_SHIFT ) {
clear_mods();
SEND_STRING("git pull upstream ");
} else {
SEND_STRING("git fetch upstream ");
}
};
return false;
case G_BRCH:
if (record->event.pressed) {
if ( get_mods() & MOD_MASK_SHIFT ) {
clear_mods();
SEND_STRING("master");
} else {
SEND_STRING("$(git branch-name)");
}
};
return false;
case M_SALL:
if (record->event.pressed) {
if ( macroMode == 1 ) {
SEND_STRING(SS_LGUI("a"));
} else {
SEND_STRING(SS_LCTL("a"));
}
}
return false;
case M_UNDO:
if (record->event.pressed) {
if ( macroMode == 1 ) {
if ( get_mods() & MOD_MASK_SHIFT ) {
SEND_STRING(SS_LSFT(SS_LGUI("z")));
} else {
SEND_STRING(SS_LGUI("z"));
}
} else {
SEND_STRING(SS_LCTL("z"));
}
}
return false;
case M_CUT:
if (record->event.pressed) {
if ( macroMode == 1 ) {
SEND_STRING(SS_LGUI("x"));
} else {
SEND_STRING(SS_LCTL("x"));
}
}
return false;
case M_COPY:
if (record->event.pressed) {
if ( macroMode == 1 ) {
SEND_STRING(SS_LGUI("c"));
} else {
SEND_STRING(SS_LCTL("c"));
}
}
return false;
case M_PASTE:
if (record->event.pressed) {
if ( macroMode == 1 ) {
if ( get_mods() & MOD_MASK_SHIFT ) {
SEND_STRING(SS_LSFT(SS_LALT(SS_LGUI("v"))));
} else {
SEND_STRING(SS_LGUI("v"));
}
} else {
SEND_STRING(SS_LCTL("v"));
}
}
return false;
case M_MDSWP:
if (record->event.pressed) {
macroMode ^= 1;
}
return false;
case KC_1 ... KC_0:
if (record->event.pressed) {
if (get_mods() & MOD_MASK_RALT) {
register_code(keycode + 0x3B);
} else {
register_code(keycode);
}
} else {
if (get_mods() & MOD_MASK_RALT) {
unregister_code(keycode + 0x3B);
} else {
unregister_code(keycode);
}
}
return false;
case KC_F1 ... KC_F12:
if (record->event.pressed) {
if (get_mods() & MOD_MASK_RALT) {
register_code(keycode + 0x2E);
} else {
register_code(keycode);
}
} else {
if (get_mods() & MOD_MASK_RALT) {
unregister_code(keycode + 0x2E);
} else {
unregister_code(keycode);
}
}
return false;
} // switch()
return true;
};

View File

@ -0,0 +1,38 @@
/* Copyright 2020 James Young (@noroadsleft)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include QMK_KEYBOARD_H
#define MOD_MASK_RALT (MOD_BIT(KC_RALT))
extern bool macroMode;
enum userspace_keycodes {
VRSN = SAFE_RANGE,
G_PUSH,
G_FTCH,
G_BRCH,
M_SALL,
M_UNDO,
M_CUT,
M_COPY,
M_PASTE,
M_MDSWP,
KEYMAP_SAFE_RANGE
};
bool process_record_keymap(uint16_t keycode, keyrecord_t *record);

View File

@ -0,0 +1,40 @@
# @noroadsleft's Userspace
This directory holds the code that's the same for every keyboard I use in QMK, which is currently:
| Status | Keyboard |
| :----------------- | :------- |
| :heavy_check_mark: | `kc60`
| :heavy_check_mark: | `kbdfans/kbd75/rev1`
## Features
### Emulated Non-US Backslash
Sends `KC_NUBS` when the Z key is tapped while the Right Alt key is being held.
### Emulated Numeric Keypad
Turns number row keycodes into their numeric keypad equivalents while the Right Alt key is being held.
### Emulated F13-F24
Turns F1-F12 into F13-F24 while the Right Alt key is being held.
## License
Copyright 2020 noroadsleft
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.

View File

@ -0,0 +1 @@
SRC += noroadsleft.c