Remove Userspace folders

pull/5613/head
Drashna Jaelre 6 years ago
parent 23a52e40b3
commit 6baec0fffd
No known key found for this signature in database
GPG Key ID: 4C4221222CD5F9F0

@ -1,116 +0,0 @@
#include "333fred.h"
#include "quantum.h"
#include "action.h"
typedef enum {
SINGLE_TAP, SINGLE_HOLD, DOUBLE
} tap_dance_state_enum;
static tap_dance_state_enum tap_dance_state;
static bool tap_dance_active = false;
void tap_dance_sym_vim_finished(qk_tap_dance_state_t *state, void *user_data) {
// Determine the current state
if (state->count == 1) {
if (state->interrupted || state->pressed == 0) tap_dance_state = SINGLE_TAP;
else tap_dance_state = SINGLE_HOLD;
} else {
// Handle any number of other taps as a VIM movement hold
tap_dance_state = DOUBLE;
}
switch (tap_dance_state) {
case SINGLE_TAP:
if (tap_dance_active) {
reset_oneshot_layer();
tap_dance_active = false;
} else {
set_oneshot_layer(SYMB, ONESHOT_START);
tap_dance_active = true;
}
break;
case SINGLE_HOLD:
layer_on(SYMB);
break;
case DOUBLE:
layer_on(VIM);
break;
}
}
void tap_dance_sym_vim_reset(qk_tap_dance_state_t *state, void *user_data) {
switch(tap_dance_state) {
case SINGLE_TAP:
clear_oneshot_layer_state(ONESHOT_PRESSED);
break;
case SINGLE_HOLD:
layer_off(SYMB);
break;
case DOUBLE:
layer_off(VIM);
break;
}
}
void tap_dance_copy_paste_finished(qk_tap_dance_state_t *state, void *user_data) {
bool is_paste = state->count == 2;
// If either the one-shot shift is set, or if shift is being held, count as shift being held.
// We'll clear the one-shot shift if it was held
uint8_t one_shot_mods = get_oneshot_mods();
bool is_shift = false;
if (get_mods() & MOD_MASK_SHIFT) {
is_shift = true;
} else if (one_shot_mods & MOD_MASK_SHIFT) {
set_oneshot_mods(one_shot_mods & ~MOD_MASK_SHIFT);
is_shift = true;
}
if (is_paste) {
if (is_shift) {
SEND_STRING(SS_LSFT(SS_TAP(X_INSERT)));
} else {
SEND_STRING(SS_LCTRL("v"));
}
} else {
if (is_shift) {
SEND_STRING(SS_LCTRL(SS_TAP(X_INSERT)));
} else {
SEND_STRING(SS_LCTRL("c"));
}
}
}
qk_tap_dance_action_t tap_dance_actions[] = {
[TD_SYM_VIM] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, tap_dance_sym_vim_finished, tap_dance_sym_vim_reset),
[TD_COPY_PASTE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, tap_dance_copy_paste_finished, NULL)
};
void tap_dance_process_record(uint16_t keycode) {
if (tap_dance_state == SINGLE_TAP && keycode != TD(TD_SYM_VIM)) {
tap_dance_active = false;
}
}
__attribute__ ((weak))
void matrix_init_rgb(void) {}
__attribute__ ((weak))
void layer_state_set_rgb(uint32_t state) {}
__attribute__ ((weak))
void matrix_scan_user_keyboard(void) {}
void matrix_scan_user() {
static bool first_run = true;
if (first_run) {
first_run = false;
matrix_init_rgb();
}
matrix_scan_user_keyboard();
}
uint32_t layer_state_set_user(uint32_t state) {
layer_state_set_rgb(state);
return state;
}

@ -1,22 +0,0 @@
#pragma once
#include "quantum.h"
#define BASE 0
#define CODE 1 // code layer
#define CODEFLOW 2
#define SYMB 3
#define MDIA 4 // media keys
#define VIM 5
#define GAME 6
#define GAME_ARROW 7
// Tap dance config shared between my keyboards
enum tap_dance_declarations {
TD_SYM_VIM = 0,
TD_COPY_PASTE,
};
void tap_dance_sym_vim_finished(qk_tap_dance_state_t*, void*);
void tap_dance_sym_vim_reset(qk_tap_dance_state_t*, void*);
void tap_dance_process_record(uint16_t);

@ -1,3 +0,0 @@
#pragma once
#define PERMISSIVE_HOLD

@ -1,28 +0,0 @@
#include "quantum.h"
#include "333fred.h"
void matrix_init_rgb(void) {
rgblight_enable_noeeprom();
rgblight_sethsv_noeeprom(270, 255, 20);
}
void layer_state_set_rgb(uint32_t state) {
switch (biton32(state)) {
case BASE:
// purple
rgblight_sethsv_noeeprom(270, 255, 20);
break;
case SYMB:
// blue
rgblight_sethsv_noeeprom(240, 255, 20);
break;
case VIM:
// green
rgblight_sethsv_noeeprom(120, 255, 20);
break;
case GAME:
// red
rgblight_sethsv_noeeprom(0, 255, 20);
break;
}
}

@ -1,5 +0,0 @@
SRC += 333fred.c
ifeq ($(strip $(RGBLIGHT_ENABLE)), yes)
SRC += rgb.c
endif

@ -1,5 +0,0 @@
#include "_example.h"
void my_custom_function(void) {
}

@ -1,8 +0,0 @@
#ifndef USERSPACE
#define USERSPACE
#include "quantum.h"
void my_custom_function(void);
#endif

@ -1,14 +0,0 @@
Copyright <year> <name> <email> @<github_username>
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/>.

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

@ -1,630 +0,0 @@
#include "arkag.h"
/*
Current Layout and Keeb:
https://github.com/arkag/qmk_firmware/blob/master/keyboards/mechmini/v2/keymaps/arkag/keymap.c
*/
#include <stdbool.h>
// Start: Written by Chris Lewis
#ifndef MIN
#define MIN(a,b) (((a)<(b))?(a):(b))
#endif
#ifndef MAX
#define MAX(a,b) (((a)>(b))?(a):(b))
#endif
#define TYPING_SPEED_MAX_VALUE 200
uint8_t typing_speed = 0;
void velocikey_accelerate() {
if (typing_speed < TYPING_SPEED_MAX_VALUE) typing_speed += (TYPING_SPEED_MAX_VALUE / 50);
}
void velocikey_decelerate() {
static uint16_t decay_timer = 0;
if (timer_elapsed(decay_timer) > 500 || decay_timer == 0) {
if (typing_speed > 0) typing_speed -= 1;
//Decay a little faster at half of max speed
if (typing_speed > TYPING_SPEED_MAX_VALUE / 2) typing_speed -= 1;
//Decay even faster at 3/4 of max speed
if (typing_speed > TYPING_SPEED_MAX_VALUE / 4 * 3) typing_speed -= 3;
decay_timer = timer_read();
}
}
uint8_t velocikey_match_speed(uint8_t minValue, uint8_t maxValue) {
return MAX(minValue, maxValue - (maxValue - minValue) * ((float)typing_speed / TYPING_SPEED_MAX_VALUE));
}
// End: Written by Chris Lewis
uint8_t current_os,
mod_primary_mask,
fade_interval,
num_extra_flashes_off = 0;
Color underglow,
flash_color,
saved_color,
hsv_none = {0,0,0};
flashState flash_state = no_flash;
fadeState fade_state = add_fade;
activityState state = boot;
bool aesthetic = false,
shifty = false;
void set_color (Color new, bool update) {
rgblight_sethsv_eeprom_helper(new.h, new.s, new.v, update);
}
void save_color(Color to_save) {
saved_color = to_save;
}
void reset_color(void) {
underglow = saved_color;
}
Color mod_color(Color current_color, bool should_add, uint8_t change_amount) {
save_color(underglow);
int addlim = 359 - change_amount;
int sublim = change_amount;
int leftovers;
if (should_add) {
if (current_color.h <= addlim) {
current_color.h += change_amount;
} else {
leftovers = (359 + change_amount) % 359;
current_color.h = 0 + leftovers;
}
} else {
if (current_color.h >= sublim) {
current_color.h -= change_amount;
} else {
leftovers = change_amount - current_color.h;
current_color.h = 359 - leftovers;
}
}
return current_color;
}
void check_state (void) {
static uint16_t active_timer;
if (!active_timer) {active_timer = timer_read();}
static bool activated, deactivated, slept;
switch (state) {
case active:
if (!activated) {
if (slept) {rgblight_mode_noeeprom(1);}
activated = true;
deactivated = false;
slept = false;
}
fade_interval = velocikey_match_speed(1, 25);
if (timer_elapsed(active_timer) < INACTIVE_DELAY) {return;}
active_timer = timer_read();
state = inactive;
return;
case inactive:
if (!deactivated) {
deactivated = true;
activated = false;
slept = false;
}
velocikey_decelerate();
fade_interval = velocikey_match_speed(1, 25);
if (timer_elapsed(active_timer) < SLEEP_DELAY) {return;}
state = sleeping;
return;
case sleeping:
if (!slept) {
rgblight_mode_noeeprom(5);
slept = true;
activated = false;
deactivated = false;
}
return;
case boot:
return;
}
}
void fade_rgb (void) {
static uint16_t fade_timer;
if (state == boot) {return;}
if (!fade_timer) {fade_timer = timer_read();}
if (timer_elapsed(fade_timer) < fade_interval) {return;}
switch (fade_state) {
case add_fade:
if (underglow.h == 359) {
fade_state = sub_fade;
return;
}
underglow.h = underglow.h + 1;
break;
case sub_fade:
if (underglow.h == 0) {
fade_state = add_fade;
return;
}
underglow.h = underglow.h - 1;
break;
}
fade_timer = timer_read();
if (flash_state == no_flash) {
set_color(underglow, false);
}
}
void flash_rgb (void) {
static uint16_t flash_timer;
switch(flash_state) {
case no_flash:
return;
case flash_off:
if (!flash_timer) {flash_timer = timer_read();}
if (timer_elapsed(flash_timer) >= LED_FLASH_DELAY) {
set_color(hsv_none, false);
flash_timer = timer_read();
flash_state = flash_on;
}
return;
case flash_on:
if (timer_elapsed(flash_timer) >= LED_FLASH_DELAY) {
set_color(flash_color, false);
flash_timer = timer_read();
if (num_extra_flashes_off > 0) {
flash_state = flash_off;
num_extra_flashes_off--;
} else {
set_color(underglow, false);
flash_state = no_flash;
}
}
return;
}
}
void set_os (uint8_t os, bool update) {
current_os = os;
if (update) {
eeprom_update_byte(EECONFIG_USERSPACE, current_os);
}
switch (os) {
case OS_MAC:
set_unicode_input_mode(UC_OSX);
underglow = (Color){ 300, 255, 255 };
mod_primary_mask = MOD_GUI_MASK;
break;
case OS_WIN:
set_unicode_input_mode(UC_WINC);
underglow = (Color){ 180, 255, 255 };
mod_primary_mask = MOD_CTL_MASK;
break;
case OS_NIX:
set_unicode_input_mode(UC_LNX);
underglow = (Color){ 60, 255, 255 };
mod_primary_mask = MOD_CTL_MASK;
break;
default:
underglow = (Color){ 0, 0, 255 };
mod_primary_mask = MOD_CTL_MASK;
}
set_color(underglow, update);
flash_color = underglow;
flash_state = flash_off;
state = boot;
num_extra_flashes_off = 1;
}
// register GUI if Mac or Ctrl if other
void pri_mod(bool press) {
if (press) {
if (current_os == OS_MAC) {
register_code(KC_LGUI);
} else {
register_code(KC_LCTL);
}
} else {
if (current_os == OS_MAC) {
unregister_code(KC_LGUI);
} else {
unregister_code(KC_LCTL);
}
}
}
// register Ctrl if Mac or GUI if other
void sec_mod(bool press) {
if (press) {
if (current_os == OS_MAC) {
register_code(KC_LCTL);
} else {
register_code(KC_LGUI);
}
} else {
if (current_os == OS_MAC) {
unregister_code(KC_LCTL);
} else {
unregister_code(KC_LGUI);
}
}
}
void surround_type(uint8_t num_of_chars, uint16_t keycode, bool use_shift) {
if (use_shift) {
register_code(KC_LSFT);
}
for (int i = 0; i < num_of_chars; i++) {
tap_code(keycode);
}
if (use_shift) {
unregister_code(KC_LSFT);
}
for (int i = 0; i < (num_of_chars/2); i++) {
tap_code(KC_LEFT);
}
}
void long_keystroke(size_t num_of_keys, uint16_t keys[]) {
for (int i = 0; i < num_of_keys-1; i++) {
register_code(keys[i]);
}
tap_code(keys[num_of_keys-1]);
for (int i = 0; i < num_of_keys-1; i++) {
unregister_code(keys[i]);
}
}
void dance_grv (qk_tap_dance_state_t *state, void *user_data) {
if (state->count == 1) {
tap_code(KC_GRV);
if (aesthetic) {
tap_code(KC_SPACE);
}
} else if (state->count == 2) {
surround_type(2, KC_GRAVE, false);
} else {
surround_type(6, KC_GRAVE, false);
}
}
void dance_quot (qk_tap_dance_state_t *state, void *user_data) {
if (state->count == 1) {
tap_code(KC_QUOT);
if (aesthetic) {
tap_code(KC_SPACE);
}
} else if (state->count == 2) {
surround_type(2, KC_QUOTE, false);
} else if (state->count == 3) {
surround_type(2, KC_QUOTE, true);
}
}
void dance_hyph (qk_tap_dance_state_t *state, void *user_data) {
if (state->count == 1) {
tap_code(KC_MINS);
if (aesthetic) {
tap_code(KC_SPACE);
}
} else if (state->count == 2) {
register_code(KC_LSFT);
tap_code(KC_MINS);
if (aesthetic) {
tap_code(KC_SPACE);
}
unregister_code(KC_LSFT);
} else if (state->count == 3) {
send_unicode_hex_string("2014");
}
}
void dance_obrck (qk_tap_dance_state_t *state, void *user_data) {
if (state->count == 1) {
tap_code(KC_LBRC);
if (aesthetic) {
tap_code(KC_SPACE);
}
} else if (state->count == 2) {
register_code(KC_LSFT);
tap_code(KC_9);
if (aesthetic) {
tap_code(KC_SPACE);
}
unregister_code(KC_LSFT);
}
}
void dance_cbrck (qk_tap_dance_state_t *state, void *user_data) {
if (state->count == 1) {
tap_code(KC_RBRC);
if (aesthetic) {
tap_code(KC_SPACE);
}
} else if (state->count == 2) {
register_code(KC_LSFT);
tap_code(KC_0);
if (aesthetic) {
tap_code(KC_SPACE);
}
unregister_code(KC_LSFT);
}
}
void dance_game (qk_tap_dance_state_t *state, void *user_data) {
if (state->count == 1) {
} else if (state->count == 2) {
} else if (state->count == 3) {
uint8_t layer = biton32(layer_state);
if (layer == _QWERTY) {
layer_off(_QWERTY);
layer_on(_GAMING);
// swirling rgb
rgblight_mode_noeeprom(12);
} else {
layer_off(_GAMING);
layer_on(_QWERTY);
rgblight_mode_noeeprom(1);
}
}
}
void matrix_init_user(void) {
current_os = eeprom_read_byte(EECONFIG_USERSPACE);
set_os(current_os, false);
}
LEADER_EXTERNS();
void matrix_scan_user(void) {
check_state();
flash_rgb();
fade_rgb();
LEADER_DICTIONARY() {
leading = false;
leader_end();
// begin OS functions
SEQ_TWO_KEYS(KC_P, KC_B) {
if (current_os == OS_WIN) {
long_keystroke(2, (uint16_t[]){KC_LGUI, KC_PAUSE});
} else {
return;
}
}
SEQ_TWO_KEYS(KC_LSFT, M_PMOD) {
if (current_os == OS_WIN) {
long_keystroke(3, (uint16_t[]){KC_LCTL, KC_LSFT, KC_ESC});
} else {
}
}
SEQ_TWO_KEYS(KC_S, KC_S) {
if (current_os == OS_MAC) {
long_keystroke(3, (uint16_t[]){KC_LGUI, KC_LSFT, KC_4});
} else if (current_os == OS_WIN) {
long_keystroke(3, (uint16_t[]){KC_LGUI, KC_LSFT, KC_S});
} else {
return;
}
}
SEQ_THREE_KEYS(KC_C, KC_A, KC_D) {
if (current_os == OS_WIN) {
long_keystroke(3, (uint16_t[]){KC_LCTL, KC_LALT, KC_DEL});
} else {
}
}
SEQ_FOUR_KEYS(KC_C, KC_A, KC_L, KC_C) {
if (current_os == OS_WIN) {
SEND_STRING(SS_TAP(X_CALCULATOR));
} else if (current_os == OS_MAC) {
SEND_STRING(SS_DOWN(X_LGUI) SS_TAP(X_SPACE) SS_UP(X_LGUI) "calculator" SS_TAP(X_ENTER));
}
}
// end OS functions
// begin format functions
SEQ_ONE_KEY(KC_B) {
surround_type(4, KC_8, true);
}
SEQ_ONE_KEY(KC_I) {
surround_type(2, KC_8, true);
}
SEQ_ONE_KEY(KC_U) {
surround_type(4, KC_MINS, true);
}
SEQ_ONE_KEY(KC_S) {
surround_type(4, KC_GRAVE, true);
}
SEQ_ONE_KEY(KC_C) {
send_unicode_hex_string("00E7");
}
SEQ_TWO_KEYS(KC_C, KC_C) {
surround_type(2, KC_GRAVE, false);
}
SEQ_THREE_KEYS(KC_C, KC_C, KC_C) {
surround_type(6, KC_GRAVE, false);
}
SEQ_ONE_KEY(KC_E) {
send_unicode_hex_string("00E8");
}
SEQ_TWO_KEYS(KC_E, KC_E) {
send_unicode_hex_string("00E9");
}
// end format functions
// start fancy functions
SEQ_THREE_KEYS(KC_C, KC_C, KC_ENT) {
surround_type(6, KC_GRAVE, false);
pri_mod(true);
tap_code(KC_V);
pri_mod(false);
tap_code(KC_RGHT);
tap_code(KC_RGHT);
tap_code(KC_RGHT);
tap_code(KC_ENTER);
}
// end fancy functions
// start typing functions
SEQ_TWO_KEYS(KC_T, KC_M) {
// ™
send_unicode_hex_string("2122");
}
SEQ_TWO_KEYS(KC_D, KC_D) {
SEND_STRING(".\\Administrator");
}
SEQ_THREE_KEYS(KC_L, KC_O, KC_D) {
// ಠ__ಠ
send_unicode_hex_string("0CA0 005F 005F 0CA0");
}
SEQ_FOUR_KEYS(KC_R, KC_E, KC_P, KC_O) {
SEND_STRING("https://github.com/qmk/qmk_firmware/tree/master/users/arkag");
}
SEQ_FOUR_KEYS(KC_F, KC_L, KC_I, KC_P) {
// (╯‵Д′)╯彡┻━┻
send_unicode_hex_string("0028 256F 2035 0414 2032 0029 256F 5F61 253B 2501 253B");
}
SEQ_FIVE_KEYS(KC_U, KC_F, KC_L, KC_I, KC_P) {
// ┬─┬ノ( º _ º )
send_unicode_hex_string("252C 2500 252C 30CE 0028 0020 00BA 0020 005F 0020 00BA 0020 30CE 0029");
}
SEQ_FIVE_KEYS(KC_L, KC_E, KC_N, KC_N, KC_Y) {
// ( ͡° ͜ʖ ͡°)
send_unicode_hex_string("0028 0020 0361 00B0 0020 035C 0296 0020 0361 00B0 0029");
}
SEQ_FIVE_KEYS(KC_S, KC_H, KC_R, KC_U, KC_G) {
// ¯\_(ツ)_/¯
send_unicode_hex_string("00AF 005C 005F 0028 30C4 0029 005F 002F 00AF");
}
// end typing functions
}
}
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
if (aesthetic) {
switch (keycode) {
case KC_A ... KC_0:
case KC_SPACE ... KC_SLASH:
if (record->event.pressed) {
state = active;
velocikey_accelerate();
tap_code(keycode);
tap_code(KC_SPACE);
}
return false;
case KC_BSPACE:
if (record->event.pressed) {
state = active;
velocikey_accelerate();
tap_code(keycode);
tap_code(keycode);
}
return false;
default: // Do nothing
break;
}
}
if (shifty) {
switch (keycode) {
case KC_A ... KC_Z:
if (record->event.pressed) {
int shift = rand() % 2;
state = active;
velocikey_accelerate();
if (shift == 1){
register_code(KC_LSFT);
}
tap_code(keycode);
if (shift == 1){
unregister_code(KC_LSFT);
}
}
return false;
case KC_SPC:
if (record->event.pressed) {
state = active;
velocikey_accelerate();
tap_code(keycode);
}
return false;
default: // Do nothing
break;
}
}
switch (keycode) {
case M_PMOD:
pri_mod(record->event.pressed);
return false;
case M_SMOD:
sec_mod(record->event.pressed);
return false;
case M_OS:
if (record->event.pressed){
set_os((current_os+1) % _OS_COUNT, true);
}
return false;
case M_SPC:
if(record->event.pressed){
if (aesthetic) {
aesthetic = false;
rgblight_mode_noeeprom(1);
} else {
aesthetic = true;
shifty = false;
// snake mode
rgblight_mode_noeeprom(20);
}
return false;
}
case M_SFT:
if(record->event.pressed){
if (shifty) {
shifty = false;
rgblight_mode_noeeprom(1);
} else {
shifty = true;
aesthetic = false;
// knight mode
rgblight_mode_noeeprom(23);
}
return false;
}
default:
if (record->event.pressed) {
state = active;
velocikey_accelerate();
}
return true;
}
}
//Tap Dance Definitions
qk_tap_dance_action_t tap_dance_actions[] = {
[TD_GRV_3GRV] = ACTION_TAP_DANCE_FN (dance_grv),
[TD_SING_DOUB] = ACTION_TAP_DANCE_FN (dance_quot),
[TD_HYPH_UNDR] = ACTION_TAP_DANCE_FN (dance_hyph),
[TD_BRCK_PARN_O] = ACTION_TAP_DANCE_FN (dance_obrck),
[TD_BRCK_PARN_C] = ACTION_TAP_DANCE_FN (dance_cbrck),
[TD_LALT_RALT] = ACTION_TAP_DANCE_DOUBLE (KC_LALT, KC_RALT),
[TD_GAME] = ACTION_TAP_DANCE_FN (dance_game),
};

@ -1,139 +0,0 @@
#pragma once
#include "quantum.h"
#include "process_keycode/process_tap_dance.h"
#define EECONFIG_USERSPACE (uint8_t *)20
#define LRALT TD(TD_LALT_RALT)
#define QUOTE TD(TD_SING_DOUB)
#define GRAVE TD(TD_GRV_3GRV)
#define OBRACK TD(TD_BRCK_PARN_O)
#define CBRACK TD(TD_BRCK_PARN_C)
#define THREE TD(TD_3_GRV_ACT)
#define STRIKE TD(TD_STRK_SHOT)
#define HYPHEN TD(TD_HYPH_UNDR)
#define CEDILLA TD(TD_C_CED)
#define GAME TD(TD_GAME)
#define RAISE MO(1)
#define LOWER MO(2)
#define MEDIA MO(3)
#define FUNCT MO(4)
#define KEEB MO(5)
#define MOD_CTL_MASK (MOD_BIT(KC_LCTL) | MOD_BIT(KC_RCTL))
#define MOD_GUI_MASK (MOD_BIT(KC_LGUI) | MOD_BIT(KC_RGUI))
#define MOD_SFT_MASK (MOD_BIT(KC_LSFT) | MOD_BIT(KC_RSFT))
#define LED_FLASH_DELAY 150
#define ACCEL_DELAY 500
#define DEACCEL_DELAY 500
#define INACTIVE_DELAY 250
#define SLEEP_DELAY 180000
enum {
_QWERTY = 0,
_RAISE,
_LOWER,
_MEDIA,
_FUNCT,
_KEEB,
_GAMING,
};
typedef enum {
OS_MAC, // Don't assign values
OS_WIN,
OS_NIX,
_OS_COUNT,
} OS;
typedef struct {
uint16_t h;
uint8_t s;
uint8_t v;
} Color;
typedef enum {
no_flash = 0,
flash_off,
flash_on,
} flashState;
typedef enum {
add_fade = 0,
sub_fade,
} fadeState;
typedef enum {
active = 0,
inactive,
sleeping,
boot,
} activityState;
enum custom_keycodes {
M_PMOD = SAFE_RANGE,
M_SMOD,
M_OS,
M_SFT,
M_SPC,
};
enum tapdances {
TD_3_GRV_ACT = 0,
TD_C_CED,
TD_GRV_3GRV,
TD_SLSH_HTTP,
TD_SING_DOUB,
TD_HYPH_UNDR,
TD_SPECIAL,
TD_BRCK_PARN_O,
TD_BRCK_PARN_C,
TD_LALT_RALT,
TD_GAME,
};
void velocikey_accelerate(void);
void velocikey_decelerate(void);
uint8_t velocikey_match_speed(uint8_t minValue, uint8_t maxValue);
void set_color (Color new, bool update);
void save_color(Color to_save);
void reset_color(void);
Color mod_color(Color current_color, bool should_add, uint8_t change_amount);
void reverse_fade (void);
void check_state (void);
void fade_rgb (void);
void flash_rgb (void);
void set_os (uint8_t os, bool update);
void tap_key(uint8_t keycode);
void pri_mod(bool press);
void sec_mod(bool press);
void surround_type(uint8_t num_of_chars, uint16_t keycode, bool use_shift);
void long_keystroke(size_t num_of_keys, uint16_t keys[]);
void dance_grv (qk_tap_dance_state_t *state, void *user_data);
void dance_quot (qk_tap_dance_state_t *state, void *user_data);
void dance_strk (qk_tap_dance_state_t *state, void *user_data);
void dance_3 (qk_tap_dance_state_t *state, void *user_data);
void dance_c (qk_tap_dance_state_t *state, void *user_data);
void dance_game (qk_tap_dance_state_t *state, void *user_data);
int cur_dance (qk_tap_dance_state_t *state);
void spc_finished (qk_tap_dance_state_t *state, void *user_data);
void spc_reset (qk_tap_dance_state_t *state, void *user_data);

@ -1,6 +0,0 @@
#pragma once
#define TAPPING_TERM 200
#define LEADER_TIMEOUT 300
#define LEADER_PER_KEY_TIMING

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 MiB

@ -1,42 +0,0 @@
# Shot on Pixel 2 XL with Cheap Lamp at Work
![mmm, tasty](mechmini2.jpg)
# I don't know what I'm doing
Some links:
* [Layout File: Mech Mini 2](layout_mm2)
* [Userspace Header](arkag_h)
* [Userspace Main](arkag_c)
Here's a list of some things I have working with my currently [keyboard](mm2_home):
* Reactive (sort of) fading while typing, ported from [Velocikey](https://github.com/qmk/qmk_firmware/pull/3754).
* OS Switching, storing to EEPROM
* OS Specific Macros and Shortcuts(WIN+SHIFT+S for Windows and CMD+SHIFT+4 for MacOS)
* Flashing RGB LED on OS change
* Hex Unicode Macros dependent on OS(half works on Windows due to [WinCompose](https://github.com/SamHocevar/wincompose) not functioning properly just yet).
* "Sleep" function activates after 3 minutes (breathing).
* Markdown style macros for surround type __eve__ ~~ryw~~ *her* **eee** (apparently only certain places support underline and strikethrough ಠ__ಠ)
# License Stuff
Copyright 2018 arkag arkag@pm.me
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/>.
[arkag_c]: /users/arkag/arkag.c
[arkag_h]: /users/arkag/arkag.h
[layout_mm2]: /keyboards/mechmini/v2/keymaps/arkag/keymap.c
[mm2_home]: https://cartel.ltd/projects/mechmini2/

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

@ -1,51 +0,0 @@
# Overview
I have mostly ortholinear keyboards, which share a lot of functions.
For this purpose, I collected them here.
I have the following keymaps:
* Gherkin (Does not use the user space)
* XD75RE (Uses different keymap)
* Let's Split
* Let's Split It Up
* Planck
# Layout
I use DVORAK with an unorthodox Turkish layout.
If you wanna grab my code, and you used a layout with a persistent base
layer change, change it to layer 0 before proceeding.
# Layers
* **Dvorak**: Base layer,with dvorak layout.
* **Alternative**: Has alternate characters.
* **Game**: Toggled from *Function*, comfortable for gaming use.
* **Numeric**: Has numericals and symbols. Can be locked.
* **Function**: Layer has media and function keys.
* **Mouse**: Manipulates mouse. Can be locked.
* **Music** Allows playing sounds.
# Functionality
* **RGB Backlight**: With layer indication, and ability to change base layer lighting mode.
* **Secrets**: By placing a secrets.h, and not tracking it, passwords can be stored.
* **Mouse**: Mouse emulation, complete with diagonal keys.
* **Turkish**: An AltGr-like overlay that allows some non-common letters, in unicode.
I suggest checking out how I enabled Turkish keys,
how I planned out RGB lighting,
and my mouse implementation;
they might offer some insight into fringe user cases.
# Issues
All features are too big for the 32kB bootloader.
Offenders are audio and rgb lights; it comes down to one or the other.
~The Proton board, and rev 6 might fix that.~
# Credits
I have previously written my keymap by myself before, but I rewrote it here,

@ -1,633 +0,0 @@
#include "bbaserdem.h"
/*---------------*\
|*-----MOUSE-----*|
\*---------------*/
#ifdef MOUSEKEY_ENABLE
#include "mousekey.h"
#endif
/*-------------*\
|*-----RGB-----*|
\*-------------*/
#ifdef RGBLIGHT_ENABLE
#include "rgblight.h"
#endif
/*-------------*\
|*---UNICODE---*|
\*-------------*/
#ifdef UNICODE_ENABLE
#endif
/*-----------------*\
|*-----SECRETS-----*|
\*-----------------*/
// Enabled by adding a non-tracked secrets.h to this dir.
#if (__has_include("secrets.h"))
#include "secrets.h"
#endif
/*---------------*\
|*-----MUSIC-----*|
\*---------------*/
#ifdef AUDIO_ENABLE
float tone_game[][2] = SONG(ZELDA_PUZZLE);
float tone_return[][2] = SONG(ZELDA_TREASURE);
float tone_linux[][2] = SONG(UNICODE_LINUX);
float tone_windows[][2] = SONG(UNICODE_WINDOWS);
#endif
/*-------------------*\
|*-----TAP-DANCE-----*|
\*-------------------*/
#ifdef TAP_DANCE_ENABLE
qk_tap_dance_action_t tap_dance_actions[] = {
// Shift on double tap of semicolon
[SCL] = ACTION_TAP_DANCE_DOUBLE( KC_SCLN, KC_COLN )
};
#endif
/* In keymaps, instead of writing _user functions, write _keymap functions
* The __attribute__((weak)) allows for empty definitions here, and during
* compilation, if these functions are defined elsewhere, they are written
* over. This allows to include custom code from keymaps in the generic code
* in this file.
*/
__attribute__ ((weak)) void matrix_init_keymap(void) { }
__attribute__ ((weak)) void matrix_scan_keymap(void) { }
__attribute__ ((weak)) bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
return true;
}
__attribute__ ((weak)) uint32_t layer_state_set_keymap (uint32_t state) {
return state;
}
__attribute__ ((weak)) void led_set_keymap(uint8_t usb_led) { }
/* ----------------------- *\
* -----RGB Functions----- *
\* ----------------------- */
#ifdef RGBLIGHT_ENABLE
// Storage variables
extern rgblight_config_t rgblight_config;
bool base_sta; // Keeps track if in saveable state
bool base_tog; // Whether base state is active or not
int base_hue; // Hue value of base state
int base_sat; // Saturation value of base state
int base_val; // Brightness value of base state
uint8_t base_mod; // Animation mode of the base state
// Save the current state of the rgb mode
void rgblight_saveBase(void) {
base_hue = rgblight_config.hue;
base_sat = rgblight_config.sat;
base_val = rgblight_config.val;
base_mod = rgblight_config.mode;
base_tog = rgblight_config.enable;
base_sta = false; // If saving, that means base layer is being left
}
// Load the base state back
void rgblight_loadBase(void) {
// Don't do anything if not enabled
if ( !base_sta ) {
if ( base_tog ) {
rgblight_enable();
rgblight_mode( base_mod );
rgblight_sethsv( base_hue, base_sat, base_val );
} else {
rgblight_disable();
}
}
// Mark that base is loaded, and to be saved before leaving
base_sta = true;
}
// Set to plain HSV color
void rgblight_colorStatic( int hu, int sa, int va ) {
// First, it must be enabled or color change is not written
rgblight_enable();
rgblight_mode(1);
rgblight_sethsv(hu,sa,va);
}
/* HSV values
* white ( 0, 0, 255)
* red ( 0, 255, 255)
* coral ( 16, 176, 255)
* orange ( 39, 255, 255)
* goldenrod ( 43, 218, 218)
* gold ( 51, 255, 255)
* yellow ( 60, 255, 255)
* chartreuse ( 90, 255, 255)
* green (120, 255, 255)
* springgreen (150, 255, 255)
* turquoise (174, 90, 112)
* teal (180, 255, 128)
* cyan (180, 255, 255)
* azure (186, 102, 255)
* blue (240, 255, 255)
* purple (270, 255, 255)
* magenta (300, 255, 255)
* pink (330, 128, 255)
*/
// Set RGBLIGHT state depending on layer
void rgblight_change( uint8_t this_layer ) {
// Save state, if saving is requested
if ( base_sta ) {
rgblight_saveBase();
}
// Change RGB light
switch ( this_layer ) {
case _DV:
// Load base layer
rgblight_loadBase();
break;
case _AL:
// Do yellow for alternate
rgblight_colorStatic( 60,255,255);
break;
case _GA:
// Do purple for game
rgblight_colorStatic(285,255,255);
break;
case _NU:
// Do azure for number
rgblight_colorStatic(186,200,255);
break;
case _SE:
// Do red for settings
rgblight_colorStatic( 16,255,255);
break;
case _MO:
// Do green for mouse
rgblight_colorStatic(120,255,255);
break;
case _MU:
// Do orange for music
rgblight_colorStatic( 39,255,255);
break;
default:
// Something went wrong
rgblight_colorStatic( 0,255,255);
break;
}
}
#endif
/*---------------------*\
|*-----MATRIX INIT-----*|
\*---------------------*/
void matrix_init_user (void) {
// Keymap specific things, do it first thing to allow for delays etc
matrix_init_keymap();
// Correct unicode
#ifdef UNICODE_ENABLE
set_unicode_input_mode(UC_LNX);
#endif
// Make beginning layer DVORAK
set_single_persistent_default_layer(_DV);
//--RGB light initialize base layer
#ifdef RGBLIGHT_ENABLE
// Base hue is white, and RGB disabled
base_hue = 100;
base_sat = 0;
base_val = 255;
base_mod = 2;
base_tog = false;
rgblight_enable();
rgblight_mode(base_mod);
rgblight_sethsv(base_hue,base_sat,base_val);
rgblight_disable();
rgblight_loadBase();
#endif
}
/*---------------------*\
|*-----MATRIX SCAN-----*|
\*---------------------*/
void matrix_scan_user (void) {
// Keymap specific, do it first
matrix_scan_keymap();
}
/*------------------*\
|*-----KEYCODES-----*|
\*------------------*/
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
// Shift check
bool is_capital = ( keyboard_report->mods & (MOD_BIT(KC_LSFT)|MOD_BIT(KC_RSFT)) );
static bool lock_flag = false;
uint8_t layer = biton32 (layer_state);
switch (keycode) {
// Secrets implementation
#if (__has_include("secrets.h"))
case SECRET1:
if( !record->event.pressed ) {
send_string_P( secret[ keycode - SECRET1 ] );
}
return false;
break;
case SECRET2:
if( !record->event.pressed ) {
send_string_P( secret[ keycode - SECRET2 ] );
}
return false;
break;
case SECRET3:
if( !record->event.pressed ) {
send_string_P( secret[ keycode - SECRET3 ] );
}
return false;
break;
#endif
// If these keys are pressed, load base layer config, and mark saving
#ifdef RGBLIGHT_ENABLE
case RGB_TOG:
case RGB_MOD:
case RGB_VAI:
case RGB_VAD:
case RGB_SAI:
case RGB_SAD:
case RGB_HUI:
case RGB_HUD:
if ( !base_sta ) {
rgblight_loadBase();
}
return true;
break;
#endif
// Lock functionality: These layers are locked if the LOCKED buttons are
// pressed. Otherwise, they are momentary toggles
case K_LOCK:
if (record->event.pressed) {
lock_flag = !lock_flag;
}
return false;
break;
case K_MOUSE:
if (record->event.pressed) {
layer_on(_MO);
lock_flag = false;
} else {
if ( lock_flag ) {
lock_flag = false;
} else {
layer_off(_MO);
}
}
return false;
break;
case K_NUMBR:
if (record->event.pressed) {
layer_on(_NU);
lock_flag = false;
} else {
if ( lock_flag ) {
lock_flag = false;
} else {
layer_off(_NU);
}
}
return false;
break;
// Layer switches with sound
case K_GAMES:
if (record->event.pressed) {
// On press, turn off layer if active
if ( layer == _GA ) {
#ifdef AUDIO_ENABLE
stop_all_notes();
PLAY_SONG(tone_return);
#endif
layer_off(_GA);
}
} else {
// After click, turn on layer if accessed from setting
if ( layer == _SE ) {
#ifdef AUDIO_ENABLE
stop_all_notes();
PLAY_SONG(tone_game);
#endif
layer_on(_GA);
layer_off(_SE);
}
}
return false;
break;
case MU_TOG:
if (record->event.pressed) {
// On press, turn off layer if active
if ( layer == _SE ) {
layer_off(_SE);
layer_on(_MU);
} else {
layer_off(_MU);
}
}
return true;
break;
//------UNICODE
// Unicode switches with sound
#ifdef UNICODE_ENABLE
case UNI_LI:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
stop_all_notes();
PLAY_SONG(tone_linux);
#endif
set_unicode_input_mode(UC_LNX);
}
return false;
break;
case UNI_WN:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
stop_all_notes();
PLAY_SONG(tone_windows);
#endif
set_unicode_input_mode(UC_WIN);
}
return false;
break;
// Turkish letters, with capital functionality
case TUR_A:
if (record->event.pressed) {
if ( is_capital ) {
unicode_input_start();
register_hex(0x00c2);
unicode_input_finish();
} else {
unicode_input_start();
register_hex(0x00e2);
unicode_input_finish();
}
}
return false;
break;
case TUR_O:
if (record->event.pressed) {
if ( is_capital ) {
unicode_input_start();
register_hex(0x00d6);
unicode_input_finish();
} else {
unicode_input_start();
register_hex(0x00f6);
unicode_input_finish();
}
}
return false;
break;
case TUR_U:
if (record->event.pressed) {
if ( is_capital ) {
unicode_input_start();
register_hex(0x00dc);
unicode_input_finish();
} else {
unicode_input_start();
register_hex(0x00fc);
unicode_input_finish();
}
}
return false;
break;
case TUR_I:
if (record->event.pressed) {
if ( is_capital ) {
unicode_input_start();
register_hex(0x0130);
unicode_input_finish();
} else {
unicode_input_start();
register_hex(0x0131);
unicode_input_finish();
}
}
return false;
break;
case TUR_G:
if (record->event.pressed) {
if ( is_capital ) {
unicode_input_start();
register_hex(0x011e);
unicode_input_finish();
} else {
unicode_input_start();
register_hex(0x011f);
unicode_input_finish();
}
}
return false;
break;
case TUR_C:
if (record->event.pressed) {
if ( is_capital ) {
unicode_input_start();
register_hex(0x00c7);
unicode_input_finish();
} else {
unicode_input_start();
register_hex(0x00e7);
unicode_input_finish();
}
}
return false;
break;
case TUR_S:
if (record->event.pressed) {
if ( is_capital ) {
unicode_input_start();
register_hex(0x015e);
unicode_input_finish();
} else {
unicode_input_start();
register_hex(0x015f);
unicode_input_finish();
}
}
return false;
break;
#endif
//-------Diagonal mouse movements
#ifdef MOUSEKEY_ENABLE
case MO_NE:
if( record->event.pressed ) {
mousekey_on(MO_N);
mousekey_on(MO_E);
mousekey_send();
} else {
mousekey_off(MO_N);
mousekey_off(MO_E);
mousekey_send();
}
return false;
break;
case MO_NW:
if( record->event.pressed ) {
mousekey_on(MO_N);
mousekey_on(MO_W);
mousekey_send();
} else {
mousekey_off(MO_N);
mousekey_off(MO_W);
mousekey_send();
}
return false;
break;
case MO_SE:
if( record->event.pressed ) {
mousekey_on(MO_S);
mousekey_on(MO_E);
mousekey_send();
} else {
mousekey_off(MO_S);
mousekey_off(MO_E);
mousekey_send();
}
return false;
break;
case MO_SW:
if( record->event.pressed ) {
mousekey_on(MO_S);
mousekey_on(MO_W);
mousekey_send();
} else {
mousekey_off(MO_S);
mousekey_off(MO_W);
mousekey_send();
}
return false;
break;
case MO_S_NE:
if( record->event.pressed ) {
mousekey_on(MO_S_N);
mousekey_on(MO_S_E);
mousekey_send();
} else {
mousekey_off(MO_S_N);
mousekey_off(MO_S_E);
mousekey_send();
}
return false;
break;
case MO_S_NW:
if( record->event.pressed ) {
mousekey_on(MO_S_N);
mousekey_on(MO_S_W);
mousekey_send();
} else {
mousekey_off(MO_S_N);
mousekey_off(MO_S_W);
mousekey_send();
}
return false;
break;
case MO_S_SE:
if( record->event.pressed ) {
mousekey_on(MO_S_S);
mousekey_on(MO_S_E);
mousekey_send();
} else {
mousekey_off(MO_S_S);
mousekey_off(MO_S_E);
mousekey_send();
}
return false;
break;
case MO_S_SW:
if( record->event.pressed ) {
mousekey_on(MO_S_S);
mousekey_on(MO_S_W);
mousekey_send();
} else {
mousekey_off(MO_S_S);
mousekey_off(MO_S_W);
mousekey_send();
}
return false;
break;
#endif
//------DOUBLE PRESS, with added left navigation
case DBL_SPC:
if( record->event.pressed ) {
SEND_STRING(" "SS_TAP(X_LEFT));
}
return false;
break;
case DBL_ANG:
if( record->event.pressed ) {
SEND_STRING("<>"SS_TAP(X_LEFT));
}
return false;
break;
case DBL_PAR:
if( record->event.pressed ) {
SEND_STRING("()"SS_TAP(X_LEFT));
}
return false;
break;
case DBL_SQR:
if( record->event.pressed ) {
SEND_STRING("[]"SS_TAP(X_LEFT));
}
return false;
break;
case DBL_BRC:
if( record->event.pressed ) {
SEND_STRING("{}"SS_TAP(X_LEFT));
}
return false;
break;
case DBL_QUO:
if( record->event.pressed ) {
SEND_STRING("\'\'"SS_TAP(X_LEFT));
}
return false;
break;
case DBL_DQT:
if( record->event.pressed ) {
SEND_STRING("\"\""SS_TAP(X_LEFT));
}
return false;
break;
case DBL_GRV:
if( record->event.pressed ) {
SEND_STRING("``"SS_TAP(X_LEFT));
}
return false;
break;
// END OF KEYCODES
}
return process_record_keymap(keycode, record);
}
/*----------------------*\
|*-----LAYER CHANGE-----*|
\*----------------------*/
uint32_t layer_state_set_user(uint32_t state) {
state = layer_state_set_keymap (state);
#ifdef RGBLIGHT_ENABLE
// Change RGB lighting depending on the last layer activated
rgblight_change( biton32(state) );
#endif
return state;
}

@ -1,268 +0,0 @@
#ifndef USERSPACE
#define USERSPACE
#include "quantum.h"
#define XXX KC_NO
// Layers
#define _DV 0 // Base layer
#define _AL 1 // Alt char overlay
#define _GA 2 // Game layer
#define _NU 3 // Numbers layer
#define _SE 4 // Settings layer
#define _MO 5 // Mouse emulation
#define _MU 6 // Music mode
// Define short macros
#define UNDO LCTL(KC_Z)
#define REDO LCTL(KC_Y)
#define COPY LCTL(KC_C)
#define CUT LCTL(KC_X)
#define PASTE LCTL(KC_V)
// Rename mouse keys with 7 letters
#ifdef MOUSEKEY_ENABLE
#define MO_S_N KC_MS_WH_UP
#define MO_S_S KC_MS_WH_DOWN
#define MO_S_E KC_MS_WH_RIGHT
#define MO_S_W KC_MS_WH_LEFT
#define MO_N KC_MS_UP
#define MO_S KC_MS_DOWN
#define MO_E KC_MS_RIGHT
#define MO_W KC_MS_LEFT
#define MO_CL_L KC_MS_BTN1
#define MO_CL_R KC_MS_BTN2
#define MO_CL_M KC_MS_BTN3
#define MO_CL_4 KC_MS_BTN4
#define MO_CL_5 KC_MS_BTN5
#define MO_AC_0 KC_MS_ACCEL0
#define MO_AC_1 KC_MS_ACCEL1
#define MO_AC_2 KC_MS_ACCEL2
#else
#define MO_S_N KC_NO
#define MO_S_S KC_NO
#define MO_S_E KC_NO
#define MO_S_W KC_NO
#define MO_N KC_NO
#define MO_S KC_NO
#define MO_E KC_NO
#define MO_W KC_NO
#define MO_CL_L KC_NO
#define MO_CL_R KC_NO
#define MO_CL_M KC_NO
#define MO_CL_1 KC_NO
#define MO_CL_2 KC_NO
#define MO_AC_0 KC_NO
#define MO_AC_1 KC_NO
#define MO_AC_2 KC_NO
#endif
// Rename music keys with <8 letters
#ifdef AUDIO_ENABLE
#define MU_REC KC_LCTL
#define MU_STOP KC_LALT
#define MU_PLAY KC_LGUI
#define MU_PLAY KC_LGUI
#define MU_FAST KC_UP
#define MU_SLOW KC_DOWN
#define MU_MASK KC_A
#else
#define MU_REC KC_NO
#define MU_STOP KC_NO
#define MU_PLAY KC_NO
#define MU_PLAY KC_NO
#define MU_FAST KC_NO
#define MU_SLOW KC_NO
#define MU_MASK KC_NO
#endif
// Define non-capitalized UTF shortcuts here
#ifdef UNICODE_ENABLE
#define PHY_HBR UC(0x0127)
#define PHY_DEG UC(0x00b0)
#define CUR_LIR UC(0x20ba)
#define CUR_BIT UC(0x20bf)
#define CUR_EUR UC(0x20ac)
#define CUR_BPN UC(0x00a3)
#define CUR_YEN UC(0x00a5)
#else
#define PHY_HBR KC_NO
#define PHY_DEG KC_NO
#define CUR_LIR KC_NO
#define CUR_BIT KC_NO
#define CUR_EUR KC_NO
#define CUR_BPN KC_NO
#define CUR_YEN KC_NO
#endif
// Custom keycodes
enum userspace_custom_keycodes {
// Turkish letters, with shifting
TUR_A = SAFE_RANGE,
TUR_C,
TUR_G,
TUR_I,
TUR_O,
TUR_S,
TUR_U,
// Unicode mode switch
UNI_LI,
UNI_WN,
// Double keys
DBL_SPC,
DBL_ANG,
DBL_PAR,
DBL_SQR,
DBL_BRC,
DBL_QUO,
DBL_DQT,
DBL_GRV,
// Diagonal mouse movements
MO_NE,
MO_NW,
MO_SE,
MO_SW,
MO_S_NE,
MO_S_NW,
MO_S_SE,
MO_S_SW,
// Layer switches and lock functionality
K_MOUSE,
K_NUMBR,
K_LOCK,
K_GAMES,
// Secret macros
SECRET1,
SECRET2,
SECRET3
};
// Do tap dancable semicolon key if available
#ifdef TAP_DANCE_ENABLE
enum {
SCL = 0
};
#define MY_SCL TD(SCL)
#else
#define MY_SCL KC_SCLN
#endif
// Shared keymaps
#define LAYOUT_planck_wrapper(...) LAYOUT_planck_grid(__VA_ARGS__)
#define LAYOUT_letssplit_wrapper(...) LAYOUT_ortho_4x12(__VA_ARGS__)
/* Dvorak
* ,------------------------------------------------------------------------.
* | Esc | ' " | , | . | P | Y || F | G | C | R | L | Bkp |
* |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----|
* | Tab | A | O | E | U | I || D | H | T | N | S | / ? |
* |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----|
* | SYM | ; : | Q | J | K | X || B | M | W | V | Z | SET |
* |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----|
* | TUR | OS | Ctrl| Alt | Shf | Spc || Ent | Lft | Dwn | Up | Rght| MSE |
* `------------------------------------------------------------------------' */
#define DVORAK \
KC_ESC, KC_QUOT,KC_COMM,KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC, \
KC_TAB, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH, \
K_NUMBR,MY_SCL, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, MO(_SE), \
MO(_AL),KC_LGUI,KC_LCTL,KC_LALT,KC_LSFT,KC_SPC, KC_ENT, KC_LEFT,KC_DOWN,KC_UP, KC_RGHT,K_MOUSE
/* Alternative character overlay
* ,------------------------------------------------------------------------.
* | | ' ' | Undo| Redo|Pound| Yen || | G | C | |TLira| Del |
* |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----|
* | | A | O | Euro| U | I ||Degre|Plank| | | S | Ins |
* |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----|
* | | " " | Cut | Copy|Paste| || BTC | < > | ( ) | [ ] | { } | PgUp|
* |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----|
* | | | | | | || | Home|PgDwn| PgUp| End | |
* `------------------------------------------------------------------------' */
#define ALTCHAR \
_______,DBL_QUO,UNDO, REDO, CUR_BPN,CUR_YEN,_______,TUR_G, TUR_C, _______,CUR_LIR,KC_DEL , \
_______,TUR_A, TUR_O, CUR_EUR,TUR_U, TUR_I, PHY_DEG,PHY_HBR,_______,_______,TUR_S, KC_INS , \
_______,DBL_DQT,CUT, COPY, PASTE, DBL_GRV,CUR_BIT,DBL_ANG,DBL_PAR,DBL_SQR,DBL_BRC,_______, \
_______,_______,_______,_______,_______,DBL_SPC,_______,KC_HOME,KC_PGDN,KC_PGUP,KC_END, _______
/* Game layer
* ,------------------------------------------------------------------------.
* | OFF | Q | W | E | R | T || Esc | 7 | 8 | 9 |NumLk|Bkspc|
* |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----|
* | Tab | A | S | D | F | G || F1 | 4 | 5 | 6 | \ | Ent |
* |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----|
* | | Z | X | C | V | B || F2 | 1 | 2 | 3 | ^ | |
* |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----|
* | / | ` | | | | Spc || Spc | Ent | 0 | < | v | > |
* `------------------------------------------------------------------------' */
#define GAME \
K_GAMES,KC_Q, KC_W, KC_E, KC_R, KC_T, KC_ESC, KC_P7, KC_P8, KC_P9, KC_NLCK,KC_BSPC, \
KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_F1, KC_P4, KC_P5, KC_P6, KC_BSLS,KC_ENT , \
_______,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_F2, KC_P1, KC_P2, KC_P3, KC_UP, _______, \
KC_SLSH,KC_GRV, _______,_______,_______,KC_SPC, KC_SPC, KC_ENT, KC_P0, KC_LEFT,KC_DOWN,KC_RGHT
/* Symbols layer
* ,------------------------------------------------------------------------.
* | OFF | ` | ~ | [ | ] | { || } | - | _ | = | + | |
* |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----|
* | | 1 | 2 | 3 | 4 | 5 || 6 | 7 | 8 | 9 | 0 | \ |
* |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----|
* | | ! | @ | # | $ | % || ^ | & | * | ( | ) | LCK |
* |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----|
* | | | | | | | || | | | | | |
* `------------------------------------------------------------------------' */
#define NUMBERS \
K_NUMBR,KC_GRV, KC_TILD,KC_LBRC,KC_RBRC,KC_LCBR,KC_RCBR,KC_MINS,KC_UNDS,KC_EQL, KC_PLUS,_______, \
_______,KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSLS, \
_______,KC_EXLM,KC_AT, KC_HASH,KC_DLR, KC_PERC,KC_CIRC,KC_AMPR,KC_ASTR,KC_LPRN,KC_RPRN,K_LOCK , \
KC_PIPE,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______
/* Settings layer
* ,------------------------------------------------------------------------.
* |BLLed| F1 | F2 | F3 | F4 | Lin || Win | Wake| |Hue -|Hue +|Reset|
* |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----|
* | | F5 | F6 | F7 | F8 | || | |RGBto|Sat -|Sat +| |
* |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----|
* | Game| F9 | F10 | F11 | F12 |Vol 0||PrtSc| |RGBan|Bri -|Bri +| |
* |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----|
* |Musir| | | | |Vol -||Vol +| Prev| Stop|TogMu| Next| |
* `------------------------------------------------------------------------' */
#define SETTINGS \
BL_STEP,KC_F1, KC_F2, KC_F3, KC_F4, UNI_LI, UNI_WN, KC_WAKE,_______,RGB_HUD,RGB_HUI,RESET , \
_______,KC_F5, KC_F6, KC_F7, KC_F8, _______,_______,_______,RGB_TOG,RGB_SAD,RGB_SAI,_______, \
K_GAMES,KC_F9, KC_F10, KC_F11, KC_F12, KC_MUTE,KC_PSCR,_______,RGB_MOD,RGB_VAD,RGB_VAI,_______, \
MU_TOG, _______,_______,_______,_______,KC_VOLD,KC_VOLU,KC_MPRV,KC_MSTP,KC_MPLY,KC_MNXT,_______
/* Mouse layer
* ,------------------------------------------------------------------------.
* |Ulock| \ | ^ | / |.....|.....||.....|.....| |\|.| |^| | |/|.| |
* |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----|
* | | < | Mid | > |Btn 4|.....||.....|Btn 5| <-- | Mid | --> | |
* |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----|
* | | / | v | \ |.....|.....||.....|.....| |/| | |v| | |\| | LCK |
* |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----|
* | | | | | | Left||Right| | |Accl0|Accl1|Accl2|
* `------------------------------------------------------------------------' */
#define MOUSE \
K_MOUSE,MO_NW, MO_N, MO_NE, XXX, XXX ,XXX, XXX, MO_S_NW,MO_S_N, MO_S_NE,_______, \
_______,MO_W, MO_CL_M,MO_E, MO_CL_4,XXX ,XXX, MO_CL_5,MO_S_W, MO_CL_M,MO_S_E, _______, \
_______,MO_SW, MO_S, MO_SE, XXX, XXX ,XXX, XXX, MO_S_SW,MO_S_S, MO_S_SE,K_LOCK , \
_______,_______,_______,_______,_______,MO_CL_L,MO_CL_R,_______,MO_AC_0,MO_AC_1,MO_AC_2,_______
/* Music layer
* ,------------------------------------------------------------------------.
* |.....|.....|.....|.....|.....|.....||.....|.....|.....|.....|.....|.....|
* |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----|
* |.....|.....|.....|.....|.....|.....||.....|.....|.....|.....|.....|.....|
* |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----|
* |.....|.....|.....|.....|.....|.....||.....|.....|.....|.....|.....|.....|
* |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----|
* | togg| rec | stop| play| slow| fast||modes|.....|.....|.....|.....|.....|
* `------------------------------------------------------------------------'
*/
#define MUSIC \
MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK, \
MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK, \
MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK, \
MU_TOG, MU_REC, MU_STOP,MU_PLAY,MU_SLOW,MU_FAST,MU_MOD, MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK
#endif

@ -1,9 +0,0 @@
#ifndef USERSPACE_CONFIG_H
#define USERSPACE_CONFIG_H
#ifdef TAP_DANCE_ENABLE
#define TAPPING_TERM 300
#define TAPPING_TOGGLE 1
#endif
#endif // !USERSPACE_CONFIG_H

@ -1,24 +0,0 @@
SRC += bbaserdem.c
EXTRAFLAGS += -flto # Used to make code smaller
# ENABLE
UNICODE_ENABLE = yes # Used for unicode character emulation
EXTRAKEY_ENABLE = yes # OS signals like volume control
# DISABLE
ifndef BLUETOOTH_ENABLE
BLUETOOTH_ENABLE = no # No bluetooth
endif
COMMAND_ENABLE = no # Some bootmagic thing i dont use
BOOTMAGIC_ENABLE = no # Access to EEPROM settings, not needed
CONSOLE_ENABLE = no # Allows console output with a command
SLEEP_LED_ENABLE = no # Breathes LED's when computer is asleep. Untested.
NKRO_ENABLE = no # Default is 6KRO which is plenty
MIDI_ENABLE = no # Untested feature
FAUXCLICKY_ENABLE = no # Emulates clicks using speaker
KEY_LOCK_ENABLE = no # Allows locking any key. Not used
API_SYSEX_ENABLE = no # Allows OS to send signals.
KEY_LOCK_ENABLE = no # Allows locking any key. Not used
# Disabling this makes it compile, i dont know why
# VARIABLE_TRACE = no # Allows debugging variables

@ -1,32 +0,0 @@
#include "billypython.h"
__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 CLEAR:
if (record->event.pressed) {
SEND_STRING(SS_LCTRL("a") SS_TAP(X_DELETE));
}
return false;
default:
return true;
}
}
__attribute__((weak))
uint32_t layer_state_set_keymap(uint32_t state) {
return state;
}
uint32_t layer_state_set_user(uint32_t state) {
return layer_state_set_keymap(state);
}

@ -1,34 +0,0 @@
#pragma once
#include "quantum.h"
#ifdef TAP_DANCE_ENABLE
#include "tap_dance.h"
#endif
#ifdef LAYER_FN
#define FN MO(L_FN)
#define FN_CAPS LT(L_FN, KC_CAPS)
#define FN_FNLK TT(L_FN)
#endif
#define TOP LCTL(KC_HOME)
#define BOTTOM LCTL(KC_END)
enum keycodes_user {
CLEAR = SAFE_RANGE,
RANGE_KEYMAP,
};
enum layers_user {
L_BASE,
#ifdef LAYER_FN
L_FN,
#endif
L_RANGE_KEYMAP,
};
bool process_record_keymap(uint16_t keycode, keyrecord_t *record);
uint32_t layer_state_set_keymap(uint32_t state);

@ -1,17 +0,0 @@
#pragma once
#define FORCE_NKRO
#define MOUSEKEY_DELAY 50
#define MOUSEKEY_INTERVAL 15
#define MOUSEKEY_MAX_SPEED 4
#define MOUSEKEY_TIME_TO_MAX 50
#define MOUSEKEY_WHEEL_MAX_SPEED 1
#define MOUSEKEY_WHEEL_TIME_TO_MAX 50
#define NO_ACTION_FUNCTION
#define NO_ACTION_MACRO
#define PERMISSIVE_HOLD
#define TAPPING_TERM 200
#define TAPPING_TOGGLE 2

@ -1,6 +0,0 @@
SRC += billypython.c
ifeq ($(strip $(TAP_DANCE_ENABLE)), yes)
SRC += tap_dance.c
endif
EXTRAFLAGS += -flto

@ -1,33 +0,0 @@
#include "tap_dance.h"
#define ACTION_TAP_DANCE_DOUBLE_MODS(mod1, mod2) { \
.fn = { td_double_mods_each, NULL, td_double_mods_reset }, \
.user_data = &(qk_tap_dance_pair_t){ mod1, mod2 }, \
}
void td_double_mods_each(qk_tap_dance_state_t *state, void *user_data) {
qk_tap_dance_pair_t *mods = (qk_tap_dance_pair_t *)user_data;
// Single tap → mod1, double tap → mod2, triple tap etc. → mod1+mod2
if (state->count == 1 || state->count == 3) {
register_code(mods->kc1);
} else if (state->count == 2) {
unregister_code(mods->kc1);
register_code(mods->kc2);
}
// Prevent tap dance from sending kc1 and kc2 as weak mods
state->weak_mods &= ~(MOD_BIT(mods->kc1) | MOD_BIT(mods->kc2));
}
void td_double_mods_reset(qk_tap_dance_state_t *state, void *user_data) {
qk_tap_dance_pair_t *mods = (qk_tap_dance_pair_t *)user_data;
if (state->count == 1 || state->count >= 3) {
unregister_code(mods->kc1);
}
if (state->count >= 2) {
unregister_code(mods->kc2);
}
}
qk_tap_dance_action_t tap_dance_actions[] = {
[TD_RSF_RCT] = ACTION_TAP_DANCE_DOUBLE_MODS(KC_RSFT, KC_RCTL),
};

@ -1,9 +0,0 @@
#pragma once
#include "quantum.h"
#define RSF_RCT TD(TD_RSF_RCT)
enum tap_dance {
TD_RSF_RCT,
};

@ -1,189 +0,0 @@
/*
Copyright 2018 Jacob Jerrell <jacob.jerrell@gmail.com> @JacobJerrell
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 "bocaj.h"
userspace_config_t userspace_config;
#if (defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE))
#define BOCAJ_UNICODE_MODE UC_OSX
#else
// set to 2 for UC_WIN, set to 4 for UC_WINC
#define BOCAJ_UNICODE_MODE 2
#endif
void tap(uint16_t keycode){ register_code(keycode); unregister_code(keycode); };
// Add reconfigurable functions here, for keymap customization
// This allows for a global, userspace functions, and continued
// customization of the keymap. Use _keymap instead of _user
// functions in the keymaps
__attribute__ ((weak))
void matrix_init_keymap(void) {}
__attribute__ ((weak))
void startup_keymap(void) {}
__attribute__ ((weak))
void suspend_power_down_keymap(void) {}
__attribute__ ((weak))
void suspend_wakeup_init_keymap(void) {}
__attribute__ ((weak))
void matrix_scan_keymap(void) {}
__attribute__ ((weak))
bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
return true;
}
__attribute__ ((weak))
void matrix_scan_secrets(void) {}
__attribute__ ((weak))
uint32_t layer_state_set_keymap (uint32_t state) {
return state;
}
__attribute__ ((weak))
uint32_t default_layer_state_set_keymap (uint32_t state) {
return state;
}
__attribute__ ((weak))
void led_set_keymap(uint8_t usb_led) {}
// Call user matrix init, set default RGB colors and then
// call the keymap's init function
void matrix_init_user(void) {
userspace_config.raw = eeconfig_read_user();
#if (defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE))
set_unicode_input_mode(BOCAJ_UNICODE_MODE);
get_unicode_input_mode();
#endif //UNICODE_ENABLE
matrix_init_keymap();
}
void startup_user (void) {
startup_keymap();
}
void suspend_power_down_user(void)
{
suspend_power_down_keymap();
}
void suspend_wakeup_init_user(void)
{
suspend_wakeup_init_keymap();
#ifdef KEYBOARD_ergodox_ez
wait_ms(10);
#endif
}
void eeconfig_init_user(void) {
userspace_config.raw = 0;
eeconfig_update_user(userspace_config.raw);
#if (defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE))
set_unicode_input_mode(BOCAJ_UNICODE_MODE);
get_unicode_input_mode();
#else
eeprom_update_byte(EECONFIG_UNICODEMODE, BOCAJ_UNICODE_MODE);
#endif
}
LEADER_EXTERNS();
// No global matrix scan code, so just run keymap's matrix
// scan function
void matrix_scan_user(void) {
static bool has_ran_yet;
if (!has_ran_yet) {
has_ran_yet = true;
startup_user();
}
LEADER_DICTIONARY() {
leading = false;
leader_end();
// Mac Save (Leader -> s)
SEQ_ONE_KEY(KC_S) {
SEND_STRING(SS_LGUI("s"));
}
// Mac copy line down (Leader -> d, d)
SEQ_TWO_KEYS(KC_D, KC_D) {
register_code(KC_LSHIFT);
register_code(KC_HOME);
unregister_code(KC_HOME);
unregister_code(KC_LSHIFT);
SEND_STRING(SS_LGUI("c"));
tap(KC_END);
tap(KC_ENTER);
SEND_STRING(SS_LGUI("v"));
}
// Mac copy line up (Leader -> u, u)
SEQ_TWO_KEYS(KC_U, KC_U) {
register_code(KC_LSHIFT);
register_code(KC_HOME);
unregister_code(KC_HOME);
unregister_code(KC_LSHIFT);
SEND_STRING(SS_LGUI("c"));
tap(KC_UP);
tap(KC_END);
tap(KC_ENTER);
SEND_STRING(SS_LGUI("v"));
}
// Mac VS Debug
SEQ_ONE_KEY(KC_D) {
tap(KC_F5);
}
// Mac VS Stop Debug
SEQ_TWO_KEYS(KC_S, KC_D) {
register_code(KC_LSHIFT);
tap(KC_F5);
unregister_code(KC_LSHIFT);
}
// Start Diablo 3
SEQ_ONE_KEY(KC_3) {
SEND_STRING(SS_LCTRL(" "));
SEND_STRING("Diablo");
tap(KC_ENTER);
}
SEQ_ONE_KEY(KC_B) {
SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION " ");
tap(KC_ENTER);
SEND_STRING ("Built at: " QMK_BUILDDATE);
}
#ifndef NO_SECRETS
matrix_scan_secrets();
#endif // !NO_SECRETS
}
#ifdef TAP_DANCE_ENABLE // Run Diablo 3 macro checking code.
run_diablo_macro_check();
#endif // TAP_DANCE_ENABLE
matrix_scan_keymap();
}

@ -1,85 +0,0 @@
/*
Copyright 2018 Jacob Jerrell <jacob.jerrell@gmail.com> @JacobJerrell
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"
#include "version.h"
#include "eeprom.h"
#include "wrappers.h"
#include "process_records.h"
#ifdef TAP_DANCE_ENABLE
#include "tap_dances.h"
#endif // TAP_DANCE_ENABLE
/* Layer Names */
enum userspace_layers {
_WORKMAN = 0,
_WINWORKMAN,
_QWERTY,
_LOWER,
_ADJUST,
_DIABLO,
};
#if (defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE))
#define BOCAJ_UNICODE_MODE UC_OSX
#else
// set to 2 for UC_WIN, set to 4 for UC_WINC
#define BOCAJ_UNICODE_MODE 2
#endif
/*
define modifiers here, since MOD_* doesn't seem to work for these
*/
#define MODS_SHIFT_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT))
#define MODS_CTRL_MASK (MOD_BIT(KC_LCTL)|MOD_BIT(KC_RCTRL))
#define MODS_ALT_MASK (MOD_BIT(KC_LALT)|MOD_BIT(KC_RALT))
#define MODS_GUI_MASK (MOD_BIT(KC_LGUI)|MOD_BIT(KC_RGUI))
bool mod_key_press_timer (uint16_t code, uint16_t mod_code, bool pressed);
bool mod_key_press (uint16_t code, uint16_t mod_code, bool pressed, uint16_t this_timer);
bool send_game_macro(const char *str, keyrecord_t *record, bool override);
void matrix_init_keymap(void);
void shutdown_keymap(void);
void suspend_power_down_keymap(void);
void suspend_wakeup_init_keymap(void);
void matrix_scan_keymap(void);
uint32_t layer_state_set_keymap (uint32_t state);
uint32_t default_layer_state_set_keymap (uint32_t state);
void led_set_keymap(uint8_t usb_led);
void eeconfig_init_keymap(void);
void tap(uint16_t keycode);
typedef union {
uint8_t raw;
} userspace_config_t;
extern userspace_config_t userspace_config;
// If Tap Dancing is enabled, we manage that here.
// If it is not, then we define the KC_D3_# codes gracefully
#ifdef TAP_DANCE_ENABLE
#define KC_D3_1 TD(TD_D3_1)
#define KC_D3_2 TD(TD_D3_2)
#define KC_D3_3 TD(TD_D3_3)
#define KC_D3_4 TD(TD_D3_4)
#else // !TAP_DANCE_ENABLE
#define KC_D3_1 KC_1
#define KC_D3_2 KC_2
#define KC_D3_3 KC_3
#define KC_D3_4 KC_4
#endif // TAP_DANCE_ENABLE

@ -1,33 +0,0 @@
#pragma once
#ifndef QMK_KEYS_PER_SCAN
#define QMK_KEYS_PER_SCAN 4
#endif // QMK KEYS PER SCAN
// this makes it possible to do rolling combos (zx) with keys that
// convert to other keys on hold (z becomes ctrl when you hold it,
// and when this option isn't enabled, z rapidly followed by x
// actually sends Ctrl-x. That's bad.)
#define IGNORE_MOD_TAP_INTERRUPT
#undef PERMISSIVE_HOLD
#define PREVENT_STUCK_MODIFIERS
#ifdef TAPPING_TERM
#undef TAPPING_TERM
#endif // TAPPING_TERM
#define TAPPING_TERM 175
#define RETRO_TAPPING
// Disable action_get_macro and fn_actions, since we don't use these
// and it saves on space in the firmware.
#ifndef NO_DEBUG
#define NO_DEBUG
#endif // !NO_DEBUG
#if !defined(NO_PRINT) && !defined(CONSOLE_ENABLE)
#define NO_PRINT
#endif // !NO_PRINT
#define NO_ACTION_MACRO
#define NO_ACTION_FUNCTION
#define MACRO_TIMER 5

@ -1,149 +0,0 @@
#include "bocaj.h"
#include QMK_KEYBOARD_H
uint16_t copy_paste_timer;
uint16_t grave_layer_timer;
uint16_t heal_layer_timer;
__attribute__ ((weak))
bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
return true;
}
// Defines actions tor my global custom keycodes. Defined in bocaj.h file
// Then runs the _keymap's record handler if not processed here
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case KC_MWRK:
if (!record->event.pressed) {
set_single_persistent_default_layer(_WORKMAN);
#if (defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE))
set_unicode_input_mode(0);
#endif
layer_move(0);
ergodox_blink_all_leds();
}
break;
case KC_WWRK:
if (!record->event.pressed) {
set_single_persistent_default_layer(_WINWORKMAN);
#if (defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE))
set_unicode_input_mode(4);
#endif
layer_move(0);
ergodox_blink_all_leds();
}
break;
case KC_MQWR:
if (!record->event.pressed) {
set_single_persistent_default_layer(_QWERTY);
#if (defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE))
set_unicode_input_mode(0);
#endif
layer_move(0);
ergodox_blink_all_leds();
}
break;
case MC_LOCK:
if (!record->event.pressed) {
layer_move(0);
SEND_STRING(SS_LCTRL(SS_LGUI("q")));
}
break;
case KC_MAKE: // Compiles the firmware, and adds the flash command based on keyboard bootloader
if (!record->event.pressed) {
uint8_t temp_mod = get_mods();
uint8_t temp_osm = get_oneshot_mods();
clear_mods();
clear_oneshot_mods();
if (biton32(default_layer_state) == _WINWORKMAN) {
send_string_with_delay_P(PSTR("make " QMK_KEYBOARD ":" QMK_KEYMAP), 10);
} else {
send_string_with_delay_P(PSTR("util/docker_build.sh " QMK_KEYBOARD ":" QMK_KEYMAP), 10);
}
if (temp_mod & MODS_SHIFT_MASK) {
send_string_with_delay_P(PSTR(":teensy"), 10);
}
if (temp_mod & MODS_CTRL_MASK) {
send_string_with_delay_P(PSTR(" -j8 --output-sync"), 10);
}
send_string_with_delay_P(PSTR(SS_TAP(X_ENTER)), 10);
set_mods(temp_mod);
layer_move(0);
}
break;
case KC_DCLR: // reset all Diablo timers, disabling them
#ifdef TAP_DANCE_ENABLE
if (record->event.pressed) {
uint8_t dtime;
for (dtime = 0; dtime < 4; dtime++) {
diablo_key_time[dtime] = diablo_times[0];
}
}
#endif // TAP_DANCE_ENABLE
break;
case JJ_ARRW:
if (!record->event.pressed) {
SEND_STRING("->");
}
return false;
break;
case LM_GRAVE:
if (record->event.pressed) {
grave_layer_timer = timer_read();
} else {
if (timer_elapsed(grave_layer_timer) < TAPPING_TERM) {
uint8_t temp_mod = get_mods();
uint8_t one_shot = get_oneshot_mods();
clear_mods();
if (temp_mod & MODS_SHIFT_MASK || one_shot & MODS_SHIFT_MASK) {
register_code(KC_LSFT);
tap(KC_GRAVE);
unregister_code(KC_LSFT);
} else {
tap(KC_GRAVE);
}
set_mods(temp_mod);
} else {
layer_move(0);
}
}
return false;
break;
case KC_CCCV:
if (record->event.pressed) {
copy_paste_timer = timer_read();
} else {
if (timer_elapsed(copy_paste_timer) > TAPPING_TERM) { // Hold, copy
SEND_STRING(SS_LGUI("c"));
} else {
SEND_STRING(SS_LGUI("v"));
}
}
return false;
break;
#ifdef UNICODE_ENABLE
case UC_FLIP: // (ノಠ痊ಠ)ノ彡┻━┻
if (record->event.pressed) {
send_unicode_hex_string("0028 30CE 0CA0 75CA 0CA0 0029 30CE 5F61 253B 2501 253B");
}
break;
case UC_TABL: // ┬─┬ノ( º _ ºノ)
if (record->event.pressed) {
send_unicode_hex_string("252C 2500 252C 30CE 0028 0020 00BA 0020 005F 0020 00BA 30CE 0029");
}
break;
case UC_SHRG: // ¯\_(ツ)_/¯
if (record->event.pressed) {
send_unicode_hex_string("00AF 005C 005F 0028 30C4 0029 005F 002F 00AF");
}
break;
case UC_DISA: // ಠ_ಠ
if (record->event.pressed) {
send_unicode_hex_string("0CA0 005F 0CA0");
}
break;
#endif
}
return process_record_keymap(keycode, record);
}

@ -1,50 +0,0 @@
#pragma once
#include "bocaj.h"
#if defined(KEYMAP_SAFE_RANGE)
#define PLACEHOLDER_SAFE_RANGE KEYMAP_SAFE_RANGE
#else
#define PLACEHOLDER_SAFE_RANGE SAFE_RANGE
#endif
enum userspace_custom_keycodes {
KC_EPRM = PLACEHOLDER_SAFE_RANGE, // can always be here
KC_MWRK,
KC_WWRK,
KC_MQWR,
KC_VRSN,
LM_GRAVE, // Shift if held, layer change if tapped
JJ_COPY,
JJ_PSTE,
JJ_ARRW,
KC_CCCV,
MC_LOCK,
KC_DCLR,
KC_MAKE,
UC_FLIP, // (ಠ痊ಠ)┻━┻
UC_TABL, // ┬─┬ノ( º _ ºノ)
UC_SHRG, // ¯\_(ツ)_/¯
UC_DISA, // ಠ_ಠ
NEW_SAFE_RANGE //use "NEWPLACEHOLDER for keymap specific codes
};
bool process_record_keymap(uint16_t keycode, keyrecord_t *record);
// One Shot
#define OS_LSFT OSM(MOD_LSFT)
// Space Cadet Hyper/Meh and [/]
#define HYP_LBK ALL_T(KC_LBRACKET)
#define MEH_RBK MEH_T(KC_RBRACKET)
#define GUI_CTR(os, kc) MT( (os == 0) ? (MOD_LGUI) : (MOD_LCTL), kc )
// Layout beauti-/simpli-fication
#define KC_LWEN LT(_LOWER, KC_ENTER)
#define KC_ADJS TT(_ADJUST)
#define KC_NUMS TT(_LOWER)
#define KC_GAME TT(_DIABLO)
// Other Keycodes
#define KC_RST RESET
#define KC_BS KC_BSLASH

@ -1,102 +0,0 @@
# Overview
My personal QMK userspace. First, I must say that the credit for a majority of the code found here belongs to Drashna and/or the people he derived his code from. My Ergodox layout is briefly described in its respective folder. As for explaining this userspace, you could honestly go to Drashna's userspace and read his well put together readme. Regardless, I am mostly writing this as an excercise for myself to better understand what is going on, and where applicable, describe things that I innovated on my own.
## Bocaj.c
### Unicode
I've always had difficulty implementing unicode in QMK, all of this code is literally copy/pasted from Drashna's userspace and lies dormant here until I can take the time to figure it out.
Update: Got it to work in Mac OS which is more important to me than Windows (probably pretty easy to figure out at this point). So I'm a happy table flipping person now!
(ノಠ痊ಠ)ノ彡┻━┻
┬─┬ノ( º _ ºノ)
### Tap Macro
Not sure why this doesn't exist in QMK already (maybe it does?)
```c
void tap(uint16_t keycode){ register_code(keycode); unregister_code(keycode); };
```
### *_keymap functions
We're running *_user functions in the userspace, that way we can add to or reconfigure at the keyboard level. Any *_user functions should call the equivalent *_keymap function at the end. If the *_keymap function isn't defined in the keymap, the `__attribute__ ((weak))` will prevent build problems.
### Startup/Suspend/Shutdown Functions
I have no idea what these do. Non-Ergodox keyboard functions?
### Matrix Scan User
Leader key defines, Diablo macro ancillary function, run matrix_scan_keymap.
#### Leader Key
I've always been interested in this feature, but I've had 0 experience with applications that have similar behavior. My implementation seeks to implement features that I feel VS2017 lacks
## Secrets
Hacked Drashna's secret macro implementation to work with the leader key instead.
TODO: Finish documentation
## Bocaj.h
Layer defines, some macro ancillary defines, setup Diablo macros and failsafe
## Process_Records.c/.h
Again, taking ideas from Drashna to make maintenance simpler. A couple of things that I'm proud of here, but nothing really ground breaking.
* Features
* Change default layer
* KC_MWRK, KC_WWRK, KC_MQWR
* MacOS Lock Screen Macro
* Make macro (Credit: Drashna)
* Need to reconfigure so it runs the docker command if one of the Mac OS layers are default because the AVR install fails on the corporate laptop
* Arrow macro (->) because I find myself telling people how to get to something quite frequently and typing this manually requires moving the right hand to the top-left of the ergodox and then to the bottom right, which feels unnatural.
* LM_GRAVE
* While combining _NUMS and _LOWER, I also needed a place to put F1-12 keys. This required me to relocate the grave key. The most comfortable place to put it was over a key that I frequently use to toggle the numpad. I do have other ways to get to/from this layer but my mind has been wired to use them for different workflows, so I would sit here frozen for a moment trying to tell my fingers where to go
* How it works
* A timer starts when pressed down
* If the timer at release was less than the TAPPING_TERM define
* Get mods
* If Shift was held or one-shot shift was active
* Send `~`
* Else
* Send `
* Else (timer at released was greater than the TAPPING_TERM define)
* Move to the default layer
* KC_CCCV
* Another neat idea I found in Drashna's userspace... highly underutilized in my layout but the inspiration for LM_GRAVE was obviously derived from this code
* Unicode stuff
* All I've ever wanted was a table-flip macro... I managed to get about half of it to work before I gave up and disabled it
## Send_Unicode.c/.h
I have some basic understanding of this, Drashna may already have it documented in his userspace. I'll put it in my own words when I get around to making it work and understanding it better.
## Tap_Dances.c/h
Again, building on Drashna's userspace organization to simplify maintenance of a heavily configured layout. This is all the stuff for the Diablo 3 macros that spam a given skill (1-4) every ~1 second
## Wrappers.h
Traditionally, you would put all of this into the \<username>.h file. But I liked the idea of separating it to simplify modification in the future.
### GUI_CTR(os, kc)
A notable mention in this file is the GUI_CTR(os, kc) custom keycode defined in process_records.h as:
```c
#define GUI_CTR(os, kc) MT( (os == 0) ? (MOD_LGUI) : (MOD_LCTL), kc )
```
I tried several things before coming to this one-liner conclusion. I believe it is quite elegant and it definitely solves the problem I had (separate wrappers for Windows/MacOS layers). But I would love to make this into something more intuitive, like a macro that detects which layer you're on and sends the applicable hotkey when held, or keycode when tapped. Ultimately, I was too tired of thinking about it to come up with a solution like that at this time.
Anyhow, if you set `os == 1`, it sends the Windows CTRL hotkey when held. If you set `os == 0`, it sends the Mac OS GUI hotkey when held. If tapped, it sends the keycode.
This is effectively a slightly more advanced `MOD_T(kc)` keycode.

@ -1,33 +0,0 @@
SRC += bocaj.c \
process_records.c
ifneq ("$(wildcard $(USER_PATH)/secrets.c)","")
SRC += secrets.c
endif
ifeq ($(strip $(TAP_DANCE_ENABLE)), yes)
SRC += tap_dances.c
endif
# Caused problems when building via docker on Mac OS
# EXTRAFLAGS += -flto
ifeq ($(strip $(NO_SECRETS)), yes)
OPT_DEFS += -DNO_SECRETS
endif
ifeq ($(strip $(MACROS_ENABLED)), yes)
OPT_DEFS += -DMACROS_ENABLED
endif
ifeq ($(strip $(UCIS_ENABLE)), yes)
SRC += send_unicode.c
endif
ifeq ($(strip $(UNICODEMAP_ENABLE)), yes)
SRC += send_unicode.c
endif
ifeq ($(strip $(UNICODE_ENABLE)), yes)
SRC += send_unicode.c
endif

@ -1,106 +0,0 @@
// Written by konstantin: vomindoraan
#include "send_unicode.h"
#include <ctype.h>
#include <string.h>
__attribute__((weak))
void send_unicode_hex_string(const char* str) {
if (!str) { return; } // Safety net
while (*str) {
// Find the next code point (token) in the string
for (; *str == ' '; str++);
size_t n = strcspn(str, " "); // Length of the current token
char code_point[n+1];
strncpy(code_point, str, n);
code_point[n] = '\0'; // Make sure it's null-terminated
// Normalize the code point: make all hex digits lowercase
for (char *p = code_point; *p; p++) {
*p = tolower((unsigned char)*p);
}
// Send the code point as a Unicode input string
unicode_input_start();
send_string(code_point);
unicode_input_finish();
str += n; // Move to the first ' ' (or '\0') after the current token
}
}
// (ノಠ痊ಠ)ノ彡┻━┻
// send_unicode_hex_string("0028 30CE 0CA0 75CA 0CA0 0029 30CE 5F61 253B 2501 253B");
//Old code
// (╯°□°)╯ ︵ ┻━┻
#if 0
register_code(KC_RSFT);
tap(KC_9);
unregister_code(KC_RSFT);
process_unicode((0x256F | QK_UNICODE), record); // Arm
process_unicode((0x00B0 | QK_UNICODE), record); // Eye
process_unicode((0x25A1 | QK_UNICODE), record); // Mouth
process_unicode((0x00B0 | QK_UNICODE), record); // Eye
register_code(KC_RSFT);
tap(KC_0);
unregister_code(KC_RSFT);
process_unicode((0x256F | QK_UNICODE), record); // Arm
tap(KC_SPC);
process_unicode((0x0361 | QK_UNICODE), record); // Flippy
tap(KC_SPC);
process_unicode((0x253B | QK_UNICODE), record); // Table
process_unicode((0x2501 | QK_UNICODE), record); // Table
process_unicode((0x253B | QK_UNICODE), record); // Table
#endif
// If you need a good converter: https://r12a.github.io/app-conversion/
uint8_t saved_mods;
void unicode_input_start (void) {
// save current mods
saved_mods = get_mods(); // Save current mods
clear_mods(); // Unregister mods to start from a clean state
switch(get_unicode_input_mode()) {
case UC_OSX:
register_code(KC_LALT);
break;
case UC_LNX:
register_code(KC_LCTL);
register_code(KC_LSFT);
register_code(KC_U);
unregister_code(KC_U);
unregister_code(KC_LSFT);
unregister_code(KC_LCTL);
break;
case UC_WIN:
register_code(KC_LALT);
register_code(KC_PPLS);
unregister_code(KC_PPLS);
break;
case UC_WINC:
register_code(KC_RALT);
unregister_code(KC_RALT);
register_code(KC_U);
unregister_code(KC_U);
break;
}
wait_ms(UNICODE_TYPE_DELAY);
}
void unicode_input_finish (void) {
switch(get_unicode_input_mode()) {
case UC_OSX:
case UC_WIN:
unregister_code(KC_LALT);
break;
case UC_LNX:
register_code(KC_SPC);
unregister_code(KC_SPC);
break;
}
set_mods(saved_mods); // Reregister previously set mods
}

@ -1,71 +0,0 @@
#pragma once
#include "quantum.h"
void send_unicode_hex_string(const char* str);
/* use X(n) to call the */
#ifdef UNICODEMAP_ENABLE
enum unicode_name {
THINK, // thinking face 🤔
GRIN, // grinning face 😊
SMRK, // smirk 😏
WEARY, // good shit 😩
UNAMU, // unamused 😒
SNEK, // snke 🐍
PENGUIN, // 🐧
DRAGON, // 🐉
MONKEY, // 🐒
CHICK, // 🐥
BOAR, // 🐗
OKOK, // 👌
EFFU, // 🖕
INUP, // 👆
THUP, // 👍
THDN, // 👎
BBB, // dat B 🅱
POO, // poop 💩
HUNDR, // 100 💯
EGGPL, // EGGPLANT 🍆
WATER, // wet 💦
TUMBLER, // 🥃
LIT, // fire 🔥
BANG, // ‽
IRONY, // ⸮
DEGREE // °
};
const uint32_t PROGMEM unicode_map[] = {
[THINK] = 0x1F914,
[GRIN] = 0x1F600,
[BBB] = 0x1F171,
[POO] = 0x1F4A9,
[HUNDR] = 0x1F4AF,
[SMRK] = 0x1F60F,
[WEARY] = 0x1F629,
[EGGPL] = 0x1F346,
[WATER] = 0x1F4A6,
[LIT] = 0x1F525,
[UNAMU] = 0x1F612,
[SNEK] = 0x1F40D,
[PENGUIN] = 0x1F427,
[BOAR] = 0x1F417,
[MONKEY] = 0x1F412,
[CHICK] = 0x1F425,
[DRAGON] = 0x1F409,
[OKOK] = 0x1F44C,
[EFFU] = 0x1F595,
[INUP] = 0x1F446,
[THDN] = 0x1F44E,
[THUP] = 0x1F44D,
[TUMBLER] = 0x1F943,
[BANG] = 0x0203D,
[IRONY] = 0x02E2E,
[DEGREE] = 0x000B0
};
#endif // UNICODEMAP_ENABLE

@ -1,64 +0,0 @@
#include "tap_dances.h"
//define diablo macro timer variables
uint16_t diablo_timer[4];
uint8_t diablo_times[] = { 0, 1, 3, 5, 10, 30 };
uint8_t diablo_key_time[4];
// has the correct number of seconds elapsed (as defined by diablo_times)
bool check_dtimer(uint8_t dtimer) { return (timer_elapsed(diablo_timer[dtimer]) < (diablo_key_time[dtimer] * 1000)) ? false : true; };
// Cycle through the times for the macro, starting at 0, for disabled.
// Max of six values, so don't exceed
void diablo_tapdance_master(qk_tap_dance_state_t *state, void *user_data, uint8_t diablo_key) {
if (state->count >= 7) {
diablo_key_time[diablo_key] = diablo_times[0];
reset_tap_dance(state);
} else {
diablo_key_time[diablo_key] = diablo_times[state->count - 1];
}
}
// Would rather have one function for all of this, but no idea how to do that...
void diablo_tapdance1(qk_tap_dance_state_t *state, void *user_data) { diablo_tapdance_master(state, user_data, 0); }
void diablo_tapdance2(qk_tap_dance_state_t *state, void *user_data) { diablo_tapdance_master(state, user_data, 1); }
void diablo_tapdance3(qk_tap_dance_state_t *state, void *user_data) { diablo_tapdance_master(state, user_data, 2); }
void diablo_tapdance4(qk_tap_dance_state_t *state, void *user_data) { diablo_tapdance_master(state, user_data, 3); }
//Tap Dance Definitions
qk_tap_dance_action_t tap_dance_actions[] = {
// tap once to disable, and more to enable timed micros
[TD_D3_1] = ACTION_TAP_DANCE_FN(diablo_tapdance1),
[TD_D3_2] = ACTION_TAP_DANCE_FN(diablo_tapdance2),
[TD_D3_3] = ACTION_TAP_DANCE_FN(diablo_tapdance3),
[TD_D3_4] = ACTION_TAP_DANCE_FN(diablo_tapdance4),
};
// Sends the key press to system, but only if on the Diablo layer
void send_diablo_keystroke(uint8_t diablo_key) {
if (biton32(layer_state) == _DIABLO) {
switch (diablo_key) {
case 0:
tap(KC_1); break;
case 1:
tap(KC_2); break;
case 2:
tap(KC_3); break;
case 3:
tap(KC_4); break;
}
}
}
// Checks each of the 4 timers/keys to see if enough time has elapsed
// Runs the "send string" command if enough time has passed, and resets the timer.
void run_diablo_macro_check(void) {
uint8_t dtime;
for (dtime = 0; dtime < 4; dtime++) {
if (check_dtimer(dtime) && diablo_key_time[dtime]) {
diablo_timer[dtime] = timer_read();
send_diablo_keystroke(dtime);
}
}
}

@ -1,19 +0,0 @@
#pragma once
#include "bocaj.h"
//define diablo macro timer variables
extern uint16_t diablo_timer[4];
extern uint8_t diablo_times[];
extern uint8_t diablo_key_time[4];
void run_diablo_macro_check(void);
#ifdef TAP_DANCE_ENABLE
enum {
TD_D3_1 = 0,
TD_D3_2,
TD_D3_3,
TD_D3_4
};
#endif // TAP_DANCE_ENABLE

@ -1,37 +0,0 @@
#pragma once
#include "bocaj.h"
#if (!defined(LAYOUT) && defined(KEYMAP))
#define LAYOUT KEYMAP
#endif
#define LAYOUT_ergodox_wrapper(...) LAYOUT_ergodox(__VA_ARGS__)
#define LAYOUT_ergodox_pretty_wrapper(...) LAYOUT_ergodox_pretty(__VA_ARGS__)
#define _________________QWERTY_L1__________________ KC_Q, KC_W, KC_E, KC_R, KC_T
#define _________________QWERTY_L2__________________ KC_A, KC_S, GUI_CTR(0, KC_D), KC_F, KC_G
#define _________________QWERTY_L3__________________ KC_Z, KC_X, KC_C, KC_V, KC_B
#define _________________QWERTY_R1__________________ KC_Y, KC_U, KC_I, KC_O, KC_P
#define _________________QWERTY_R2__________________ KC_H, KC_J, GUI_CTR(0, KC_K), KC_L, KC_SCLN
#define _________________QWERTY_R3__________________ KC_N, KC_M, KC_COMM, KC_DOT, KC_SLASH
// Hardware Driven Workman
#define _________________WORKMAN_L1_________________ KC_Q, KC_D, KC_R, KC_W, KC_B
#define _________________WORKMAN_L2_________________ KC_A, KC_S, GUI_CTR(0, KC_H), KC_T, KC_G // GUI_CTR(0, kc) behaves as GUI_T(kc)
#define ________________WWORKMAN_L2_________________ KC_A, KC_S, GUI_CTR(1, KC_H), KC_T, KC_G // GUI_CTR(1, kc) behaves as CTR_T(kc)
#define _________________WORKMAN_L3_________________ KC_Z, KC_X, KC_M, KC_C, KC_V
#define _________________WORKMAN_R1_________________ KC_J, KC_F, KC_U, KC_P, KC_SCLN
#define _________________WORKMAN_R2_________________ KC_Y, KC_N, GUI_CTR(0, KC_E), KC_O, KC_I // GUI_CTR(0, kc) behaves as GUI_T(kc)
#define ________________WWORKMAN_R2_________________ KC_Y, KC_N, GUI_CTR(1, KC_E), KC_O, KC_I // GUI_CTR(1, kc) behaves as CTR_T(kc)
#define _________________WORKMAN_R3_________________ KC_K, KC_L, KC_COMM, KC_DOT, KC_SLASH
#define __________________NUMBER_LEFT_______________ KC_1, KC_2, KC_3, KC_4, KC_5
#define __________________NUMBER_RIGHT______________ KC_6, KC_7, KC_8, KC_9, KC_0
#define __________________FUNCTION_LEFT_____________ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5
#define __________________FUNCTION_RIGHT____________ KC_F6, KC_F7, KC_F8, KC_F9, KC_F10
#define ____________________BLANK___________________ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS

@ -1,39 +0,0 @@
#ifndef USERSPACE
#define USERSPACE
#ifdef BACKLIGHT_ENABLE
#include "backlight.h"
#endif
#include "quantum.h"
#include "config.h"
#ifndef CONFIG_USER_H
#define CONFIG_USER_H
#ifndef NO_DEBUG
#define NO_DEBUG
#endif
#ifndef NO_PRINT
#define NO_PRINT
#endif
/* cbbrowne user configuration */
#define randadd 53
#define randmul 181
#define randmod 167
/* Filler to make layering a bit clearer *
* borrowed from basic keymap */
#define _______ KC_TRNS
#define _____ KC_NO
#define LEADER_TIMEOUT 300
#ifndef LIGHT_CONFIG_H
#define BACKLIGHT_BREATHING
#endif
#endif
#endif

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

@ -1,9 +0,0 @@
#ifndef USERSPACE_CONFIG_H
#define USERSPACE_CONFIG_H
#ifdef TAPPING_TERM
#undef TAPPING_TERM
#endif // TAPPING_TERM
#define TAPPING_TERM 200
#endif // !USERSPACE_CONFIG_H

@ -1,101 +0,0 @@
#include "dhertz.h"
// Add reconfigurable functions here, for keymap customization
// This allows for a global, userspace functions, and continued
// customization of the keymap. Use _keymap instead of _user
// functions in the keymaps
__attribute__ ((weak))
void matrix_init_keymap(void) {}
__attribute__ ((weak))
void matrix_scan_keymap(void) {}
__attribute__ ((weak))
bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
return true;
}
__attribute__ ((weak))
uint32_t layer_state_set_keymap (uint32_t state) {
return state;
}
__attribute__ ((weak))
void led_set_keymap(uint8_t usb_led) {}
__attribute__ ((weak))
void action_function_keymap(keyrecord_t *record, uint8_t id, uint8_t opt) {}
// Call user matrix init, then call the keymap's init function
void matrix_init_user(void) {
matrix_init_keymap();
}
// No global matrix scan code, so just run keymap's matix
// scan function
void matrix_scan_user(void) {
matrix_scan_keymap();
}
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch(keycode) {
case CMD_TAB_CMD:
mod_or_mod_with_macro(record, KC_LGUI, SS_TAP(X_TAB));
return false;
case CMD_GRV_CMD:
mod_or_mod_with_macro(record, KC_RGUI, SS_TAP(X_GRAVE));
return false;
}
if (record->event.pressed) {
switch(keycode) {
case HSH_TLD:
if (get_mods()&(MOD_BIT(KC_LSFT)|MOD_BIT(KC_RSFT))) {
SEND_STRING(SS_TAP(X_NONUS_BSLASH));
} else {
SEND_STRING(SS_LALT("3"));
}
break;
case CTRL_A:
SEND_STRING(SS_LCTRL("a"));
break;
case CMD_ALT_C:
SEND_STRING(SS_LGUI(SS_LALT("c")));
break;
case CMD_SFT_L:
SEND_STRING(SS_LGUI("L"));
break;
case ISO_COUNTRY_CODE:
SEND_STRING("country_iso_alpha2_code");
break;
default:
return process_record_keymap(keycode, record);
}
return false;
}
return process_record_keymap(keycode, record);
}
static uint16_t sunds_timer;
void mod_or_mod_with_macro(keyrecord_t *record, uint16_t kc_mod, char* macro) {
if (record->event.pressed) {
sunds_timer = timer_read();
register_code(kc_mod);
} else {
if (timer_elapsed(sunds_timer) < TAPPING_TERM) {
send_string(macro);
}
unregister_code(kc_mod);
}
}
// Runs state check and changes underglow color and animation
// on layer change, no matter where the change was initiated
// Then runs keymap's layer change check
uint32_t layer_state_set_user (uint32_t state) {
return layer_state_set_keymap (state);
}
void led_set_user(uint8_t usb_led) {
led_set_keymap(usb_led);
}

@ -1,23 +0,0 @@
#ifndef USERSPACE
#define USERSPACE
#include "quantum.h"
#define SRCH_CTL CTL_T(KC_F19)
#define LYR_SPC LT(1, KC_SPC)
#define NC_CTL CTL_T(KC_F18)
enum custom_keycodes {
HSH_TLD = SAFE_RANGE,
CTRL_A,
CMD_ALT_C,
CMD_SFT_L,
ISO_COUNTRY_CODE,
CMD_TAB_CMD,
CMD_GRV_CMD,
NEW_SAFE_RANGE,
};
void mod_or_mod_with_macro(keyrecord_t *record, uint16_t kc_mod, char* cmd_or_macro);
#endif

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

@ -1,460 +0,0 @@
#include "doogle999.h"
static unsigned char inputLocation = 0; // Current index in text input
static double calc(const char input[CALC_BUFFER_SIZE +1]) // Finds value of input char array, relatively small and fast I think
{
char inputToken[CALC_BUFFER_SIZE + 1]; // Input buffer, used when a single token (generally a number) takes up more
unsigned char inputTokenLocation = 0, inputLocation = 0; // Keep track of indices
struct Token tokens[CALC_BUFFER_SIZE + 1]; // Input, converted to tokens, one extra large to accomodate for possible negative sign then open parenthesis as first character
unsigned char tokenCount = 0; // Keep track of index
bool dashAsMinus = false; // Kind of a hacky solution to determining whether to treat a dash as a minus sign or a negative sign
while(inputLocation < CALC_BUFFER_SIZE + 1)
{
char digit = input[inputLocation];
if(inputLocation == 0 && input[inputLocation] == CALC_CHAR_SUB && input[inputLocation + 1] == CALC_CHAR_BEG)
{
tokens[tokenCount].raw.num = 0;
tokens[tokenCount].isNum = true;
tokenCount++;
dashAsMinus = true;
}
if ((digit >= '0' && digit <= '9') || /* valid digit */
(inputTokenLocation != 0 && input[inputLocation] == CALC_CHAR_DEC) || /* valid floating point */
(!dashAsMinus && inputTokenLocation == 0 && input[inputLocation] == CALC_CHAR_SUB)) /* - is negative sign */
{
inputToken[inputTokenLocation] = input[inputLocation];
inputTokenLocation++;
inputLocation++;
continue;
}
if(inputTokenLocation != 0)
{
// sscanf(inputToken, "%lf", &tokens[tokenCount].raw.num); // I would like to use sscanf here, but the small version of stdio.h on the chip doesn't allow sscanf or its sister functions to be used to process floats
tokens[tokenCount].raw.num = atof(inputToken);
tokens[tokenCount].isNum = true;
for(unsigned char i = 0; i < inputTokenLocation + 1; i++)
{
inputToken[i] = '\0';
}
inputTokenLocation = 0;
tokenCount++;
dashAsMinus = true;
continue;
}
/* inputTokenLocation == 0 */
tokens[tokenCount].isNum = false;
tokens[tokenCount].raw.op.c = input[inputLocation];
tokens[tokenCount].raw.op.priority = 0;
tokens[tokenCount].raw.op.ltr = true;
dashAsMinus = false;
switch(input[inputLocation])
{
case CALC_CHAR_BEG:
break;
case CALC_CHAR_END:
dashAsMinus = true;
break;
case CALC_CHAR_ADD:
tokens[tokenCount].raw.op.priority = CALC_PRIO_ADD;
break;
case CALC_CHAR_SUB:
tokens[tokenCount].raw.op.priority = CALC_PRIO_SUB;
break;
case CALC_CHAR_MUL:
tokens[tokenCount].raw.op.priority = CALC_PRIO_MUL;
break;
case CALC_CHAR_DIV:
tokens[tokenCount].raw.op.priority = CALC_PRIO_DIV;
break;
case CALC_CHAR_EXP:
tokens[tokenCount].raw.op.priority = CALC_PRIO_EXP;
tokens[tokenCount].raw.op.ltr = false;
break;
case CALC_CHAR_SIN:
case CALC_CHAR_COS:
case CALC_CHAR_TAN:
case CALC_CHAR_ASN:
case CALC_CHAR_ACS:
case CALC_CHAR_ATN:
case CALC_CHAR_LGE:
case CALC_CHAR_LOG:
case CALC_CHAR_SQT:
break;
case CALC_CHAR_EUL:
tokens[tokenCount].isNum = true;
tokens[tokenCount].raw.num = CALC_VALU_EUL;
dashAsMinus = true;
break;
case CALC_CHAR_PI:
tokens[tokenCount].isNum = true;
tokens[tokenCount].raw.num = CALC_VALU_PI;
dashAsMinus = true;
break;
case '\0':
tokenCount--;
inputLocation = CALC_BUFFER_SIZE;
break;
default:
tokenCount--;
break;
}
tokenCount++;
inputLocation++;
}
struct Token output[CALC_BUFFER_SIZE + 1]; // Final output tokens before evaluation
struct Token opstack[CALC_BUFFER_SIZE + 1]; // Stack of operators
unsigned char outputLocation = 0, opstackLocation = 0; // Keep track of indices
unsigned char numBrackets = 0; // The number of parenthesis
for(unsigned char i = 0; i < tokenCount; i++)
{
if(tokens[i].isNum)
{
output[outputLocation] = tokens[i];
outputLocation++;
}
else if(tokens[i].raw.op.c == CALC_CHAR_BEG)
{
opstack[opstackLocation] = tokens[i];
opstackLocation++;
}
else if(tokens[i].raw.op.c == CALC_CHAR_END)
{
while(opstack[opstackLocation - 1].raw.op.c != CALC_CHAR_BEG)
{
output[outputLocation] = opstack[opstackLocation - 1];
outputLocation++;
opstackLocation--;
}
opstackLocation--;
numBrackets += 2;
}
else if(tokens[i].raw.op.priority == 0)
{
opstack[opstackLocation] = tokens[i];
opstackLocation++;
}
else
{
while(opstackLocation != 0
&& (opstack[opstackLocation - 1].raw.op.priority == 0
|| tokens[i].raw.op.priority < opstack[opstackLocation - 1].raw.op.priority
|| (tokens[i].raw.op.priority == opstack[opstackLocation - 1].raw.op.priority && opstack[opstackLocation - 1].raw.op.ltr))
&& opstack[opstackLocation - 1].raw.op.c != CALC_CHAR_BEG)
{
output[outputLocation] = opstack[opstackLocation - 1];
outputLocation++;
opstackLocation--;
}
opstack[opstackLocation] = tokens[i];
opstackLocation++;
}
}
tokenCount -= numBrackets;
for(signed char i = opstackLocation - 1; i >= 0; i--)
{
output[outputLocation] = opstack[i];
outputLocation++;
opstackLocation--;
}
double answer[CALC_BUFFER_SIZE];
unsigned char answerLocation = 0;
for(unsigned char i = 0; i < tokenCount; i++)
{
if(output[i].isNum)
{
answer[answerLocation] = output[i].raw.num;
answerLocation++;
continue;
}
if(output[i].raw.op.priority == 0)
{
if (answerLocation < 1) { /* not handled here -- ERROR? */ } else
if(answerLocation >= 1)
{
double (*op)(double);
switch(output[i].raw.op.c)
{
case CALC_CHAR_SIN:
op = sin;
break;
case CALC_CHAR_COS:
op = cos;
break;
case CALC_CHAR_TAN:
op = tan;
break;
case CALC_CHAR_ASN:
op = asin;
break;
case CALC_CHAR_ACS:
op = acos;
break;
case CALC_CHAR_ATN:
op = atan;
break;
case CALC_CHAR_LGE:
op = log;
break;
case CALC_CHAR_LOG:
op = log10;
break;
case CALC_CHAR_SQT:
op = sqrt;
break;
default:
continue; /* invalid input */
}
answer[answerLocation - 1] = op(answer[answerLocation - 1]);
}
}
/* priority != 0 */
else if(answerLocation >= 2)
{
switch(output[i].raw.op.c)
{
case CALC_CHAR_ADD:
answer[answerLocation - 2] += answer[answerLocation - 1];
break;
case CALC_CHAR_SUB:
answer[answerLocation - 2] -= answer[answerLocation - 1];
break;
case CALC_CHAR_MUL:
answer[answerLocation - 2] *= answer[answerLocation - 1];
break;
case CALC_CHAR_DIV:
answer[answerLocation - 2] /= answer[answerLocation - 1];
break;
case CALC_CHAR_EXP:
answer[answerLocation - 2] = pow(answer[answerLocation - 2], answer[answerLocation - 1]);
break;
}
answerLocation--;
}
}
return answer[0];
}
/*
* @returns 0 when nothing should happen and QMK should work as usual
* @returns -1 when invalid input was given, QMK should ignore it
* @returns -2 when BSP should be done
* @returns -3 when CALC should be done
* @returns -4 when ENDCALC should be done
* @returns positive value of CALC_* when normal input was processed
*/
static int process_input(const uint16_t keycode, const uint8_t mods, const keyevent_t event)
{
/* handle even when no key was pressed */
if(!event.pressed)
{
switch(keycode)
{
/* QMK should handle those */
case KC_RSFT:
case KC_LSFT:
return 0;
break;
}
/* ??? ignore */
return -1;
}
/* when shift key is pressed handle characters differently */
char characterPressed;
if((get_mods() & MODS_SHIFT_MASK))
{
switch(keycode)
{
case KC_9:
characterPressed = CALC_CHAR_BEG;
break;
case KC_0:
characterPressed = CALC_CHAR_END;
break;
case KC_EQUAL:
characterPressed = CALC_CHAR_ADD;
break;
case KC_KP_PLUS:
characterPressed = CALC_CHAR_ADD;
break;
case KC_6:
characterPressed = CALC_CHAR_EXP;
break;
case KC_8:
characterPressed = CALC_CHAR_MUL;
break;
case KC_KP_ASTERISK:
characterPressed = CALC_CHAR_MUL;
break;
case KC_S:
characterPressed = CALC_CHAR_ASN;
break;
case KC_C:
characterPressed = CALC_CHAR_ACS;
break;
case KC_T:
characterPressed = CALC_CHAR_ATN;
break;
case KC_L:
characterPressed = CALC_CHAR_LOG;
break;
default:
return -1;
break;
}
return characterPressed;
}
/* normal key handling: shift not pressed */
/* digits */
if (keycode == KC_KP_0 || keycode == KC_0) {
return '0';
} else if (keycode >= KC_KP_1 && keycode <= KC_KP_9) {
return keycode - KC_KP_1 +1 + '0';
} else if (keycode >= KC_1 && keycode <= KC_9) {
return keycode - KC_1 +1 + '0';
}
/* other tokens */
switch (keycode) {
case KC_MINUS:
case KC_KP_MINUS:
return characterPressed = CALC_CHAR_SUB;
case KC_SLASH:
case KC_KP_SLASH:
return characterPressed = CALC_CHAR_DIV;
case KC_S:
return characterPressed = CALC_CHAR_SIN;
case KC_C:
return characterPressed = CALC_CHAR_COS;
case KC_T:
return characterPressed = CALC_CHAR_TAN;
case KC_Q:
return characterPressed = CALC_CHAR_SQT;
case KC_L:
return characterPressed = CALC_CHAR_LGE;
case KC_DOT:
case KC_KP_DOT:
return characterPressed = CALC_CHAR_DEC;
case KC_P:
return characterPressed = CALC_CHAR_PI;
case KC_E:
return characterPressed = CALC_CHAR_EUL;
case KC_BSPC:
return -2;
case KC_RSFT:
return 0;
case KC_LSFT:
return 0;
case CALC:
return -3;
case ENDCALC:
return -4;
default:
return -1;
}
}
bool process_record_user(uint16_t keycode, keyrecord_t* record)
{
static char text[CALC_BUFFER_SIZE + 1]; // Used to store input and then output when ready to print
static char backspaceText[CALC_BUFFER_SIZE + 1]; // Pretty dumb waste of memory because only backspace characters, used with send_string to backspace and remove input
if((biton32(layer_state) == CALC_LAYER && CALC_FORCE_NUM_LOCK_INSIDE_CALC) || (biton32(layer_state) != CALC_LAYER && CALC_FORCE_NUM_LOCK_OUTSIDE_CALC))
{
bool numpadKeyPressed = record->event.pressed &&
!(get_mods() & MODS_SHIFT_MASK) &&
/* KC_KP_1, KC_KP_2, ..., KC_KP_0, KC_KP_DOT */
(keycode >= KC_KP_1 && keycode <= KC_KP_DOT);
if(numpadKeyPressed && !(host_keyboard_leds() & (1 << USB_LED_NUM_LOCK)))
{
add_key(KC_NLCK);
send_keyboard_report();
del_key(KC_NLCK);
}
}
if(biton32(layer_state) != CALC_LAYER) { return true; }
int action = process_input(keycode, get_mods(), record->event);
switch(action)
{
case 0:
return true;
case -1:
return false;
case -2:
if(inputLocation > 0)
{
inputLocation--;
text[inputLocation] = '\0';
backspaceText[0] = (char)8;
backspaceText[1] = '\0';
send_string(backspaceText);
}
return false;
case -3:
for(int i = 0; i < inputLocation; i++)
{
backspaceText[i] = (char)8;
}
send_string(backspaceText);
dtostrf(calc(text), CALC_PRINT_SIZE, CALC_PRINT_SIZE, text);
send_string(text);
for(unsigned char i = 0; i < CALC_BUFFER_SIZE; i++)
{
text[i] = '\0';
backspaceText[i] = '\0';
}
inputLocation = 0;
return false;
case -4:
for(unsigned char i = 0; i < CALC_BUFFER_SIZE; i++)
{
text[i] = '\0';
backspaceText[i] = '\0';
}
inputLocation = 0;
layer_off(CALC_LAYER);
return false;
default:
break;
}
char characterPressed = (char)action;
if(inputLocation < CALC_BUFFER_SIZE)
{
text[inputLocation] = characterPressed;
inputLocation++;
char characterToSend[2];
characterToSend[0] = characterPressed;
characterToSend[1] = '\0';
send_string(characterToSend);
}
return false;
}

@ -1,99 +0,0 @@
#ifndef USERSPACE
#define USERSPACE
#include "quantum.h"
#define NO_ACTION_ONESHOT
#define NO_ACTION_MACRO
#define MODS_SHIFT_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT))
// Layer the calculator is on
#define CALC_LAYER 2
// Inside is whether when you are in calc mode it should automatically force numlock, outside is whether it should do it outside of calculator mode
#define CALC_FORCE_NUM_LOCK_INSIDE_CALC true
#define CALC_FORCE_NUM_LOCK_OUTSIDE_CALC true
// Maximum number of characters the calculator can have
#define CALC_BUFFER_SIZE 32
// Minimum width of the printed text / the number of decimal places
#define CALC_PRINT_SIZE 6
/*-----
Special
-----*/
#define CALC_CHAR_BEG '('
#define CALC_CHAR_END ')'
#define CALC_CHAR_DEC '.'
/*-----
Operators - Can add more here such as modulo %, factorial !
-----*/
#define CALC_CHAR_ADD '+'
#define CALC_PRIO_ADD 1
#define CALC_CHAR_SUB '-'
#define CALC_PRIO_SUB 1
#define CALC_CHAR_MUL '*'
#define CALC_PRIO_MUL 2
#define CALC_CHAR_DIV '/'
#define CALC_PRIO_DIV 2
#define CALC_CHAR_EXP '^'
#define CALC_PRIO_EXP 3
/*-----
Functions
-----*/
#define CALC_CHAR_SIN 's'
#define CALC_CHAR_COS 'c'
#define CALC_CHAR_TAN 't'
#define CALC_CHAR_ASN 'S'
#define CALC_CHAR_ACS 'C'
#define CALC_CHAR_ATN 'T'
#define CALC_CHAR_LGE 'l'
#define CALC_CHAR_LOG 'L'
#define CALC_CHAR_SQT 'q'
/*-----
Constants
-----*/
#define CALC_CHAR_EUL 'e'
#define CALC_VALU_EUL 2.71828182845904523536
#define CALC_CHAR_PI 'p'
#define CALC_VALU_PI 3.14159265358979323846
struct OP // Operator/function
{
char c;
unsigned char priority;
bool ltr;
};
union TokenRaw // A token after the input has been processed, can either be a number or an operator/function
{
double num;
struct OP op;
};
struct Token // Encapsulator
{
bool isNum;
union TokenRaw raw;
};
enum CalcFunctions // Hardware calculator key functionality
{
CALC = SAFE_RANGE,
ENDCALC
};
#endif

@ -1,41 +0,0 @@
Copyright 2018 <name> <email> @doogle999
Overview
========
This folder is just for some calculator code for my keyboards.
Making Your Keyboard Into A Calculator
--------------------------------------
If you'd like to make your keyboard into a calculator, you can do it with this userspace (hopefully!)
You can make a keymap for your keyboard of choice named doogle999 and then you can make it regularly.
You should make one layer that is just the functionality for your calculator, so it just has the keys you need (numbers, symbols, some letters for functions). It should also have END_CALC and CALC somewhere. END_CALC gets you out of calculator mode, and CALC evaluates the calculation.
On one of your other keymaps you should make a key that is TO(layer of calculator). This is how you will activate the calculator. You should also define the layer your calculator is on with the define CALC_LAYER in doogle999.h (this means that for all your keyboards, your calculator layer has to be the same layer).
You can change what characters coorespond to what operators and functions and you can add more functions in doogle999.h and doogle999.c, you can also change which characters are sued for which keys. However, as of now standard keys should be used for operations. By that I mean if you want your multiplication sign to be an x, you should change the CALC_CHAR_MUL to an x but you should keep your multiplication keycode on the keymap either as KC_8 (shifted) or KC_KP_ASTERISK. This might be changed in the future so there are custom keycodes so this is less of a pain and more intuitive.
You can look at my dz60 keymap doogle999 for an example.
Issues
------
Unfortunately the chip onboard my dz60 only does single precision floating point numbers, but I have everything set up as double so if your chip supports doubles it should work for you.
This Was Here When I Made The ReadMe
------------------------------------
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/>.

@ -1,14 +0,0 @@
SRC += doogle999.c
CFLAGS += -fstrict-aliasing -ftree-vrp
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
MOUSEKEY_ENABLE = no # Mouse keys(+4700)
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
CONSOLE_ENABLE = no # Console for debug(+400)
COMMAND_ENABLE = no # Commands for debug and configuration
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
AUDIO_ENABLE = no
RGBLIGHT_ENABLE = yes

@ -1,78 +0,0 @@
stages:
- test
- build
- deploy
Tests:
stage: test
variables:
GIT_SUBMODULE_STRATEGY: recursive
tags:
- linux
image: ubuntu:18.10
before_script:
- apt-get update -qy
- apt-get install -y build-essential avr-libc binutils-arm-none-eabi binutils-avr dfu-programmer dfu-util gcc gcc-arm-none-eabi gcc-avr git libnewlib-arm-none-eabi unzip wget zip
- avr-gcc --version
- uname -a
script:
- make test:all
- make planck/rev6:default
QMK Firmware Defaults:
stage: deploy
variables:
GIT_SUBMODULE_STRATEGY: recursive
tags:
- linux
image: ubuntu:18.10
before_script:
- apt-get update -qy
- apt-get install -y build-essential avr-libc binutils-arm-none-eabi binutils-avr dfu-programmer dfu-util gcc gcc-arm-none-eabi gcc-avr git libnewlib-arm-none-eabi unzip wget zip
- avr-gcc --version
- uname -a
script:
- make test:all
- make all:default -j16
Drashna Firmware:
stage: build
variables:
GIT_SUBMODULE_STRATEGY: recursive
tags:
- linux
image: ubuntu:18.10
before_script:
- apt-get update -qy
- apt-get install -y build-essential avr-libc binutils-arm-none-eabi binutils-avr dfu-programmer dfu-util gcc gcc-arm-none-eabi gcc-avr git libnewlib-arm-none-eabi unzip wget zip
- avr-gcc --version
script:
- make iris/rev2:drashna iris/rev2:drashna_old ergodox_ez:drashna ergodox_ez:drashna_glow viterbi/rev1:drashna orthodox/rev1:drashna orthodox/rev3:drashna crkbd:drashna planck/light:drashna planck/rev6:drashna fractal:drashna
artifacts:
name: "$CI_JOB_NAME-$CI_COMMIT_REF_SLUG"
paths:
- ./*.hex
- ./*.bin
expire_in: 1 month
Firmware Deploy:
stage: deploy
dependencies:
- Drashna Firmware
variables:
GIT_SUBMODULE_STRATEGY: recursive
tags:
- linux
image: ubuntu:18.10
before_script:
- apt-get update -qy
- apt-get install -y build-essential avr-libc binutils-arm-none-eabi binutils-avr dfu-programmer dfu-util gcc gcc-arm-none-eabi gcc-avr git libnewlib-arm-none-eabi unzip wget zip
- avr-gcc --version
script:
- make iris/rev2:drashna:production iris/rev2:drashna_old:production ergodox_ez:drashna ergodox_ez:drashna_glow viterbi/rev1:drashna:production orthodox/rev1:drashna:production orthodox/rev3:drashna:production crkbd:drashna:production planck/light:drashna planck/rev6:drashna fractal:drashna:production
artifacts:
name: "$CI_JOB_NAME-$CI_COMMIT_REF_SLUG"
paths:
- ./*.hex
- ./*.bin
expire_in: 1 month

@ -1,85 +0,0 @@
#pragma once
#ifdef AUDIO_ENABLE
#define AUDIO_CLICKY
#define STARTUP_SONG SONG(RICK_ROLL)
#define GOODBYE_SONG SONG(SONIC_RING)
#define DEFAULT_LAYER_SONGS { SONG(QWERTY_SOUND), \
SONG(COLEMAK_SOUND), \
SONG(DVORAK_SOUND), \
SONG(OVERWATCH_THEME) \
}
#define AUDIO_CLICKY_FREQ_RANDOMNESS 1.5f
// #ifdef RGBLIGHT_ENABLE
// #define NO_MUSIC_MODE
// #endif //RGBLIGHT_ENABLE/
// #ifndef __arm__
// #undef NOTE_REST
// #define NOTE_REST 1.00f
// #endif // !__arm__
#define UNICODE_SONG_OSX SONG(RICK_ROLL)
#define UNICODE_SONG_LNX SONG(RICK_ROLL)
#define UNICODE_SONG_WIN SONG(RICK_ROLL)
#define UNICODE_SONG_BSD SONG(RICK_ROLL)
#define UNICODE_SONG_WINC SONG(RICK_ROLL)
#endif // !AUDIO_ENABLE
#ifdef RGBLIGHT_ENABLE
#define RGBLIGHT_SLEEP
#undef RGBLIGHT_ANIMATIONS
#define RGBLIGHT_EFFECT_BREATHING
#define RGBLIGHT_EFFECT_SNAKE
#define RGBLIGHT_EFFECT_KNIGHT
#endif // RGBLIGHT_ENABLE
#ifndef ONESHOT_TAP_TOGGLE
#define ONESHOT_TAP_TOGGLE 2
#endif // !ONESHOT_TAP_TOGGLE
#ifndef ONESHOT_TIMEOUT
#define ONESHOT_TIMEOUT 3000
#endif// !ONESHOT_TIMEOUT
#ifndef QMK_KEYS_PER_SCAN
#define QMK_KEYS_PER_SCAN 4
#endif // !QMK_KEYS_PER_SCAN
// this makes it possible to do rolling combos (zx) with keys that
// convert to other keys on hold (z becomes ctrl when you hold it,
// and when this option isn't enabled, z rapidly followed by x
// actually sends Ctrl-x. That's bad.)
#define IGNORE_MOD_TAP_INTERRUPT
#undef PERMISSIVE_HOLD
//#define TAPPING_FORCE_HOLD
//#define RETRO_TAPPING
#define FORCE_NKRO
#ifndef TAPPING_TOGGLE
#define TAPPING_TOGGLE 1
#endif
#ifdef TAPPING_TERM
#undef TAPPING_TERM
#endif // TAPPING_TERM
#if defined(KEYBOARD_ergodox_ez)
#define TAPPING_TERM 185
#elif defined(KEYBOARD_crkbd)
#define TAPPING_TERM 200
#else
#define TAPPING_TERM 175
#endif
// Disable action_get_macro and fn_actions, since we don't use these
// and it saves on space in the firmware.
#define NO_ACTION_MACRO
#define NO_ACTION_FUNCTION
#define MACRO_TIMER 5

@ -1,248 +0,0 @@
/*
Copyright 2017 Christopher Courtney <drashna@live.com> @drashna
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 "drashna.h"
userspace_config_t userspace_config;
#if (defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE))
#define DRASHNA_UNICODE_MODE UC_WIN
#else
// set to 2 for UC_WIN, set to 4 for UC_WINC
#define DRASHNA_UNICODE_MODE 2
#endif
// This block is for all of the gaming macros, as they were all doing
// the same thing, but with differring text sent.
bool send_game_macro(const char *str, keyrecord_t *record, bool override) {
if (!record->event.pressed || override) {
uint16_t keycode;
if (userspace_config.is_overwatch) {
keycode = KC_BSPC;
} else {
keycode = KC_ENTER;
}
clear_keyboard();
tap_code(keycode);
wait_ms(50);
send_string_with_delay(str, MACRO_TIMER);
wait_ms(50);
tap_code(KC_ENTER);
}
if (override) wait_ms(3000);
return false;
}
bool mod_key_press_timer (uint16_t code, uint16_t mod_code, bool pressed) {
static uint16_t this_timer;
if(pressed) {
this_timer= timer_read();
} else {
if (timer_elapsed(this_timer) < TAPPING_TERM){
register_code(code);
unregister_code(code);
} else {
register_code(mod_code);
register_code(code);
unregister_code(code);
unregister_code(mod_code);
}
}
return false;
}
bool mod_key_press (uint16_t code, uint16_t mod_code, bool pressed, uint16_t this_timer) {
if(pressed) {
this_timer= timer_read();
} else {
if (timer_elapsed(this_timer) < TAPPING_TERM){
register_code(code);
unregister_code(code);
} else {
register_code(mod_code);
register_code(code);
unregister_code(code);
unregister_code(mod_code);
}
}
return false;
}
void bootmagic_lite(void) {
matrix_scan();
#if defined(DEBOUNCING_DELAY) && DEBOUNCING_DELAY > 0
wait_ms(DEBOUNCING_DELAY * 2);
#elif defined(DEBOUNCE) && DEBOUNCE > 0
wait_ms(DEBOUNCE * 2);
#else
wait_ms(30);
#endif
matrix_scan();
if (matrix_get_row(BOOTMAGIC_LITE_ROW) & (1 << BOOTMAGIC_LITE_COLUMN)) {
bootloader_jump();
}
}
// Add reconfigurable functions here, for keymap customization
// This allows for a global, userspace functions, and continued
// customization of the keymap. Use _keymap instead of _user
// functions in the keymaps
__attribute__ ((weak))
void matrix_init_keymap(void) {}
// Call user matrix init, set default RGB colors and then
// call the keymap's init function
void matrix_init_user(void) {
userspace_config.raw = eeconfig_read_user();
#ifdef BOOTLOADER_CATERINA
DDRD &= ~(1<<5);
PORTD &= ~(1<<5);
DDRB &= ~(1<<0);
PORTB &= ~(1<<0);
#endif
#if (defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE))
set_unicode_input_mode(DRASHNA_UNICODE_MODE);
get_unicode_input_mode();
#endif //UNICODE_ENABLE
matrix_init_keymap();
}
__attribute__((weak))
void keyboard_post_init_keymap(void){ }
void keyboard_post_init_user(void){
#ifdef RGBLIGHT_ENABLE
keyboard_post_init_rgb();
#endif
keyboard_post_init_keymap();
}
__attribute__ ((weak))
void shutdown_keymap(void) {}
void shutdown_user (void) {
#ifdef RGBLIGHT_ENABLE
rgblight_enable_noeeprom();
rgblight_mode_noeeprom(1);
rgblight_setrgb_red();
#endif // RGBLIGHT_ENABLE
#ifdef RGB_MATRIX_ENABLE
// uint16_t timer_start = timer_read();
// rgb_matrix_set_color_all( 0xFF, 0x00, 0x00 );
// while(timer_elapsed(timer_start) < 250) { wait_ms(1); }
#endif //RGB_MATRIX_ENABLE
shutdown_keymap();
}
__attribute__ ((weak))
void suspend_power_down_keymap(void) {}
void suspend_power_down_user(void) {
suspend_power_down_keymap();
}
__attribute__ ((weak))
void suspend_wakeup_init_keymap(void) {}
void suspend_wakeup_init_user(void) {
suspend_wakeup_init_keymap();
}
__attribute__ ((weak))
void matrix_scan_keymap(void) {}
// No global matrix scan code, so just run keymap's matrix
// scan function
void matrix_scan_user(void) {
static bool has_ran_yet;
if (!has_ran_yet) {
has_ran_yet = true;
startup_user();
}
#ifdef TAP_DANCE_ENABLE // Run Diablo 3 macro checking code.
run_diablo_macro_check();
#endif // TAP_DANCE_ENABLE
#ifdef RGBLIGHT_ENABLE
matrix_scan_rgb();
#endif // RGBLIGHT_ENABLE
matrix_scan_keymap();
}
__attribute__ ((weak))
uint32_t layer_state_set_keymap (uint32_t state) {
return state;
}
// on layer change, no matter where the change was initiated
// Then runs keymap's layer change check
uint32_t layer_state_set_user(uint32_t state) {
state = update_tri_layer_state(state, _RAISE, _LOWER, _ADJUST);
#ifdef RGBLIGHT_ENABLE
state = layer_state_set_rgb(state);
#endif // RGBLIGHT_ENABLE
return layer_state_set_keymap (state);
}
__attribute__ ((weak))
uint32_t default_layer_state_set_keymap (uint32_t state) {
return state;
}
// Runs state check and changes underglow color and animation
uint32_t default_layer_state_set_user(uint32_t state) {
state = default_layer_state_set_keymap(state);
#if 0
#ifdef RGBLIGHT_ENABLE
state = default_layer_state_set_rgb(state);
#endif // RGBLIGHT_ENABLE
#endif
return state;
}
__attribute__ ((weak))
void led_set_keymap(uint8_t usb_led) {}
// Any custom LED code goes here.
// So far, I only have keyboard specific code,
// So nothing goes here.
void led_set_user(uint8_t usb_led) {
led_set_keymap(usb_led);
}
__attribute__ ((weak))
void eeconfig_init_keymap(void) {}
void eeconfig_init_user(void) {
userspace_config.raw = 0;
userspace_config.rgb_layer_change = true;
eeconfig_update_user(userspace_config.raw);
#if (defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE))
set_unicode_input_mode(DRASHNA_UNICODE_MODE);
get_unicode_input_mode();
#else
eeprom_update_byte(EECONFIG_UNICODEMODE, DRASHNA_UNICODE_MODE);
#endif
}

@ -1,100 +0,0 @@
/*
Copyright 2017 Christopher Courtney <drashna@live.com> @drashna
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"
#include "version.h"
#include "eeprom.h"
#include "wrappers.h"
#include "process_records.h"
#ifdef TAP_DANCE_ENABLE
#include "tap_dances.h"
#endif // TAP_DANCE_ENABLE
#if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE)
#include "rgb_stuff.h"
#endif
/* Define layer names */
enum userspace_layers {
_QWERTY = 0,
_NUMLOCK = 0,
_COLEMAK,
_DVORAK,
_WORKMAN,
_NORMAN,
_MALTRON,
_EUCALYN,
_CARPLAX,
_MODS, /* layer 8 */
_GAMEPAD,
_DIABLO,
_MACROS,
_MEDIA,
_LOWER,
_RAISE,
_ADJUST,
};
/*
define modifiers here, since MOD_* doesn't seem to work for these
*/
bool mod_key_press_timer (uint16_t code, uint16_t mod_code, bool pressed);
bool mod_key_press (uint16_t code, uint16_t mod_code, bool pressed, uint16_t this_timer);
bool send_game_macro(const char *str, keyrecord_t *record, bool override);
void matrix_init_keymap(void);
void shutdown_keymap(void);
void suspend_power_down_keymap(void);
void suspend_wakeup_init_keymap(void);
void matrix_scan_keymap(void);
uint32_t layer_state_set_keymap (uint32_t state);
uint32_t default_layer_state_set_keymap (uint32_t state);
void led_set_keymap(uint8_t usb_led);
void eeconfig_init_keymap(void);
typedef union {
uint32_t raw;
struct {
bool rgb_layer_change :1;
bool is_overwatch :1;
bool nuke_switch :1;
uint8_t unicode_mod :4;
bool swapped_numbers :1;
};
} userspace_config_t;
extern userspace_config_t userspace_config;
/*
Custom Keycodes for Diablo 3 layer
But since TD() doesn't work when tap dance is disabled
We use custom codes here, so we can substitute the right stuff
*/
#ifdef TAP_DANCE_ENABLE
#define KC_D3_1 TD(TD_D3_1)
#define KC_D3_2 TD(TD_D3_2)
#define KC_D3_3 TD(TD_D3_3)
#define KC_D3_4 TD(TD_D3_4)
#else // TAP_DANCE_ENABLE
#define KC_D3_1 KC_1
#define KC_D3_2 KC_2
#define KC_D3_3 KC_3
#define KC_D3_4 KC_4
#endif // TAP_DANCE_ENABLE

@ -1,159 +0,0 @@
#include "drashna.h"
uint16_t copy_paste_timer;
__attribute__ ((weak))
bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
return true;
}
__attribute__ ((weak))
bool process_record_secrets(uint16_t keycode, keyrecord_t *record) {
return true;
}
// Defines actions tor my global custom keycodes. Defined in drashna.h file
// Then runs the _keymap's record handier if not processed here
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
// If console is enabled, it will print the matrix position and status of each key pressed
#ifdef KEYLOGGER_ENABLE
#if defined(KEYBOARD_ergodox_ez) || defined(KEYBOARD_iris_rev2)
xprintf("KL: kc: %u, col: %u, row: %u, pressed: %u\n", keycode, record->event.key.row, record->event.key.col, record->event.pressed);
#else
xprintf("KL: kc: %u, col: %u, row: %u, pressed: %u\n", keycode, record->event.key.col, record->event.key.row, record->event.pressed);
#endif
#endif //KEYLOGGER_ENABLE
switch (keycode) {
case KC_QWERTY ... KC_CARPLAX:
if (record->event.pressed) {
set_single_persistent_default_layer(keycode - KC_QWERTY);
}
break;
case KC_MAKE: // Compiles the firmware, and adds the flash command based on keyboard bootloader
if (!record->event.pressed) {
uint8_t temp_mod = get_mods();
uint8_t temp_osm = get_oneshot_mods();
clear_mods(); clear_oneshot_mods();
send_string_with_delay_P(PSTR("make " QMK_KEYBOARD ":" QMK_KEYMAP), MACRO_TIMER);
#ifndef MAKE_BOOTLOADER
if ( ( temp_mod | temp_osm ) & MOD_MASK_SHIFT )
#endif
{
#if defined(__arm__)
send_string_with_delay_P(PSTR(":dfu-util"), MACRO_TIMER);
#elif defined(BOOTLOADER_DFU)
send_string_with_delay_P(PSTR(":dfu"), MACRO_TIMER);
#elif defined(BOOTLOADER_HALFKAY)
send_string_with_delay_P(PSTR(":teensy"), MACRO_TIMER);
#elif defined(BOOTLOADER_CATERINA)
send_string_with_delay_P(PSTR(":avrdude"), MACRO_TIMER);
#endif // bootloader options
}
if ( ( temp_mod | temp_osm ) & MOD_MASK_CTRL) { send_string_with_delay_P(PSTR(" -j8 --output-sync"), MACRO_TIMER); }
send_string_with_delay_P(PSTR(SS_TAP(X_ENTER)), MACRO_TIMER);
set_mods(temp_mod);
set_oneshot_mods(temp_osm);
}
break;
case VRSN: // Prints firmware version
if (record->event.pressed) {
send_string_with_delay_P(PSTR(QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION ", Built on: " QMK_BUILDDATE), MACRO_TIMER);
}
break;
// These are a serious of gaming macros.
// Only enables for the viterbi, basically,
// to save on firmware space, since it's limited.
#ifdef MACROS_ENABLED
case KC_OVERWATCH: // Toggle's if we hit "ENTER" or "BACKSPACE" to input macros
if (record->event.pressed) { userspace_config.is_overwatch ^= 1; eeconfig_update_user(userspace_config.raw); }
#ifdef RGBLIGHT_ENABLE
userspace_config.is_overwatch ? rgblight_mode_noeeprom(17) : rgblight_mode_noeeprom(18);
#endif //RGBLIGHT_ENABLE
break;
case KC_SALT:
return send_game_macro("Salt, salt, salt...", record, false);
case KC_MORESALT:
return send_game_macro("Please sir, can I have some more salt?!", record, false);
case KC_SALTHARD:
return send_game_macro("Your salt only makes me harder, and even more aggressive!", record, false);
case KC_GOODGAME:
return send_game_macro("Good game, everyone!", record, false);
case KC_GLHF:
return send_game_macro("Good luck, have fun!!!", record, false);
case KC_SYMM:
return send_game_macro("Left click to win!", record, false);
case KC_JUSTGAME:
return send_game_macro("It may be a game, but if you don't want to actually try, please go play AI, so that people that actually want to take the game seriously and \"get good\" have a place to do so without trolls like you throwing games.", record, false);
case KC_TORB:
return send_game_macro("That was positively riveting!", record, false);
case KC_AIM:
send_game_macro("That aim is absolutely amazing. It's almost like you're a machine!", record, true);
return send_game_macro("Wait! That aim is TOO good! You're clearly using an aim hack! CHEATER!", record, false);
case KC_C9:
return send_game_macro("OMG!!! C9!!!", record, false);
case KC_GGEZ:
return send_game_macro("That was a fantastic game, though it was a bit easy. Try harder next time!", record, false);
#endif // MACROS_ENABLED
case KC_DIABLO_CLEAR: // reset all Diablo timers, disabling them
#ifdef TAP_DANCE_ENABLE
if (record->event.pressed) {
uint8_t dtime;
for (dtime = 0; dtime < 4; dtime++) {
diablo_key_time[dtime] = diablo_times[0];
}
}
#endif // TAP_DANCE_ENABLE
break;
case KC_CCCV: // One key copy/paste
if(record->event.pressed){
copy_paste_timer = timer_read();
} else {
if (timer_elapsed(copy_paste_timer) > TAPPING_TERM) { // Hold, copy
register_code(KC_LCTL);
tap_code(KC_C);
unregister_code(KC_LCTL);
} else { // Tap, paste
register_code(KC_LCTL);
tap_code(KC_V);
unregister_code(KC_LCTL);
}
}
break;
#ifdef UNICODE_ENABLE
case UC_FLIP: // (ノಠ痊ಠ)ノ彡┻━┻
if (record->event.pressed) {
send_unicode_hex_string("0028 30CE 0CA0 75CA 0CA0 0029 30CE 5F61 253B 2501 253B");
}
break;
case UC_TABL: // ┬─┬ノ( º _ ºノ)
if (record->event.pressed) {
send_unicode_hex_string("252C 2500 252C 30CE 0028 0020 00BA 0020 005F 0020 00BA 30CE 0029");
}
break;
case UC_SHRG: // ¯\_(ツ)_/¯
if (record->event.pressed) {
send_unicode_hex_string("00AF 005C 005F 0028 30C4 0029 005F 002F 00AF");
}
break;
case UC_DISA: // ಠ_ಠ
if (record->event.pressed) {
send_unicode_hex_string("0CA0 005F 0CA0");
}
break;
#endif
}
return process_record_keymap(keycode, record) &&
#if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE)
process_record_user_rgb(keycode, record) &&
#endif // RGBLIGHT_ENABLE
process_record_secrets(keycode, record);
}

@ -1,105 +0,0 @@
#pragma once
#include "drashna.h"
#if defined(KEYMAP_SAFE_RANGE)
#define PLACEHOLDER_SAFE_RANGE KEYMAP_SAFE_RANGE
#else
#define PLACEHOLDER_SAFE_RANGE SAFE_RANGE
#endif
enum userspace_custom_keycodes {
VRSN = PLACEHOLDER_SAFE_RANGE, // Prints QMK Firmware and board info
KC_QWERTY, // Sets default layer to QWERTY
KC_COLEMAK, // Sets default layer to COLEMAK
KC_DVORAK, // Sets default layer to DVORAK
KC_WORKMAN, // Sets default layer to WORKMAN
KC_NORMAN, // Sets default layer to NORMAN
KC_MALTRON, // Sets default layer to MALTRON
KC_EUCALYN, // Sets default layer to EUCALYN
KC_CARPLAX, // Sets default layer to CARPLAX
KC_DIABLO_CLEAR, // Clears all Diablo Timers
KC_OVERWATCH, // Toggles game macro input mode (so in OW, it defaults to game chat)
KC_SALT, // See drashna.c for details
KC_MORESALT,
KC_SALTHARD,
KC_GOODGAME,
KC_SYMM,
KC_JUSTGAME,
KC_GLHF,
KC_TORB,
KC_AIM,
KC_C9,
KC_GGEZ,
KC_MAKE, // Run keyboard's customized make command
KC_RGB_T, // Toggles RGB Layer Indication mode
KC_SECRET_1, // test1
KC_SECRET_2, // test2
KC_SECRET_3, // test3
KC_SECRET_4, // test4
KC_SECRET_5, // test5
KC_CCCV, // Hold to copy, tap to paste
KC_NUKE, // NUCLEAR LAUNCH DETECTED!!!
UC_FLIP, // (ಠ痊ಠ)┻━┻
UC_TABL, // ┬─┬ノ( º _ ºノ)
UC_SHRG, // ¯\_(ツ)_/¯
UC_DISA, // ಠ_ಠ
NEW_SAFE_RANGE //use "NEWPLACEHOLDER for keymap specific codes
};
bool process_record_secrets(uint16_t keycode, keyrecord_t *record);
bool process_record_keymap(uint16_t keycode, keyrecord_t *record);
#define LOWER MO(_LOWER)
#define RAISE MO(_RAISE)
#define ADJUST MO(_ADJUST)
#define TG_MODS TG(_MODS)
#define TG_GAME TG(_GAMEPAD)
#define KC_SEC1 KC_SECRET_1
#define KC_SEC2 KC_SECRET_2
#define KC_SEC3 KC_SECRET_3
#define KC_SEC4 KC_SECRET_4
#define KC_SEC5 KC_SECRET_5
#define QWERTY KC_QWERTY
#define DVORAK KC_DVORAK
#define COLEMAK KC_COLEMAK
#define WORKMAN KC_WORKMAN
#define KC_RESET RESET
#define KC_RST KC_RESET
#ifdef SWAP_HANDS_ENABLE
#define KC_C1R3 SH_TT
#else // SWAP_HANDS_ENABLE
#define KC_C1R3 KC_BSPC
#endif // SWAP_HANDS_ENABLE
#define BK_LWER LT(_LOWER, KC_BSPC)
#define SP_LWER LT(_LOWER, KC_SPC)
#define DL_RAIS LT(_RAISE, KC_DEL)
#define ET_RAIS LT(_RAISE, KC_ENTER)
/* OSM keycodes, to keep things clean and easy to change */
#define KC_MLSF OSM(MOD_LSFT)
#define KC_MRSF OSM(MOD_RSFT)
#define OS_LGUI OSM(MOD_LGUI)
#define OS_RGUI OSM(MOD_RGUI)
#define OS_LSFT OSM(MOD_LSFT)
#define OS_RSFT OSM(MOD_RSFT)
#define OS_LCTL OSM(MOD_LCTL)
#define OS_RCTL OSM(MOD_RCTL)
#define OS_LALT OSM(MOD_LALT)
#define OS_RALT OSM(MOD_RALT)
#define OS_MEH OSM(MOD_MEH)
#define OS_HYPR OSM(MOD_HYPR)
#define ALT_APP ALT_T(KC_APP)
#define MG_NKRO MAGIC_TOGGLE_NKRO
#define UC_IRNY UC(0x2E2E)
#define UC_CLUE UC(0x203D)

@ -1,193 +0,0 @@
# Overview
This is my personal userspace file. Most of my code exists here, as it's heavily shared.
## Custom userspace handlers
Specifically QMK works by using customized handlers for everything. This allows for multiple levels of customization.
`matrix_scan` calls `matrix_scan_quantum`, which alls `matrix_scan_kb`, which calls `matrix_scan_user`.
`process_record` calls a bunch of stuff, but eventually calls `process_record_kb` which calls `process_record_user`
The same goes for `matrix_init`, `layer_state_set`, `led_set`, and a few other functions.
All (most) `_user` functions are handled here instead. To allow keyboard specific configuration, I've created `_keymap` functions that can be called by the keymap.c files instead.
This allows for keyboard specific configuration while maintaining the ability to customize the board.
My [Ergodox EZ Keymap](https://github.com/qmk/qmk_firmware/blob/master/layouts/community/ergodox/drashna/keymap.c#L297) is a good example of this, as it uses the LEDs as modifier indicators.
## Keyboard Layout Templates
This borrows from @jola5's "Not quite neo" code. This allows me to maintain blocks of keymaps in the userspace, so that I can modify the userspace, and this is reflected in all of the keyboards that use it, at once.
This makes adding tap/hold mods, or other special keycodes or functions to all keyboards super easy, as it's done to all of them at once.
The caveat here is that the keymap needs a processor/wrapper, as it doesn't like the substitutions. However, this is as simple as just pushing it through a define. For instance:
`#define LAYOUT_ergodox_wrapper(...) LAYOUT_ergodox(__VA_ARGS__)`
Once that's been done and you've switched the keymaps to use the "wrapper", it will read the substitution blocks just fine.
Credit goes to @jola5 for first implementing this awesome idea.
## Custom Keycodes
Keycodes are defined in the drashna.h file and need to be included in the keymap.c files, so that they can be used there.
A bunch of macros are present and are only included on boards that are not the Ergodox EZ or Orthodox, as they are not needed for those boards.
Included is a custom macro for compiling my keyboards. This includes the bootloader target (`:teensy`, `:avrdude`, or `:dfu`), and keeps RGBLIGHT, AUDIO and/or FAUXCLICKY enabled, if it previously was (regardless of the rules file).
This also includes a modified RESET keycode as well, that sets the underglow to red.
## Layer Indication
This uses the `layer_state_set_*` command to change the layer color, to indicate which layer it is on. This includes the default keymap, as well.
Since this is done via userspace, it is the same between all systems.
Additionally, there is a custom keycode to toggle layer indication. And all RGB keycodes disable layer indication by default, as well. This way, I can leave special effects doing when I want.
Also. I use `rgblight_sethsv` since it works with animation modes (that support it).
## Diablo Layer
This layer has some special handling.
When Tap Dances are enabled, this layer has the ability to "spam" keypresses.
For instance, tapping the TD "1" twice causes the layer to hit "1" ever 1 second (appoximately). This is useful for auto-hotkeying skills (such as bone armor or devour).
Tappind once disables this, and switching layers temporarily disables this, until you switch back to the layer.
For critics that think this is cheating, search "diablo 3 num lock auto cast". This is just a simpler method, since I no longer own a normal (non QMK) numpad.
## Secret Macros
With help from gitter and Colinta, this adds the ability to add hidden macros from other users.
First, I have several files that are hidden/excluded from Git/GitHub. These contain everything needed for the macros. To hide these files, open `.git/info/exclude` and add `secrets.c` and `secrets.h` to that file, below the comments.
And this requires `KC_SECRET_1` through `KC_SECRET_5` to be defined in your `<name>.h` file to define the keycodes for the new macros.
### .git/info/exclude
```
# git ls-files --others --exclude-from=.git/info/exclude
# Lines that start with '#' are comments.
# For a project mostly in C, the following would be a good set of
# exclude patterns (uncomment them if you want to use them):
# *.[oa]
# *~
/users/drashna/secrets.c
/users/drashna/secrets.h
```
Then you can create these files:
### secrets.c
```c
#include "drashna.h" // replace with your keymap's "h" file, or whatever file stores the keycodes
#if (__has_include("secrets.h") && !defined(NO_SECRETS))
#include "secrets.h"
#else
// `PROGMEM const char secret[][x]` may work better, but it takes up more space in the firmware
// And I'm not familiar enough to know which is better or why...
static const char * const secret[] = {
"test1",
"test2",
"test3",
"test4",
"test5"
};
#endif
bool process_record_secrets(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case KC_SECRET_1 ... KC_SECRET_5: // Secrets! Externally defined strings, not stored in repo
if (!record->event.pressed) {
clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
send_string_with_delay(secret[keycode - KC_SECRET_1], MACRO_TIMER);
}
return false;
break;
}
return true;
}
```
### secrets.h
```c
static const char * const secrets[] = {
"secret1",
"secret2",
"secret3",
"secret4",
"secret5"
};
```
Replacing the strings with the codes that you need.
### name.c
In the `<name>.c` file, you will want to add this to the top:
```c
__attribute__ ((weak))
bool process_record_secrets(uint16_t keycode, keyrecord_t *record) {
return true;
}
```
This is so that the function can be called here, and replaced in the `secrets.c` file, and so it won't error out if it doesn't exist.
And then, in the `process_record_user` function, assuming you have `return process_record_keymap(keycode, record)` here, you'll want to replace the "final" return with the following. Otherwise, you want to replace the `return true;` with `return process_record_secrets(keycode, record);`
```c
return process_record_keymap(keycode, record) && process_record_secrets(keycode, record);
}
```
### rules.mk
Here, you want your `/users/<name>/rules.mk` file to "detect" the existence of the `secrets.c` file, and only add it if the file exists. To do so, add this block:
```make
ifneq ("$(wildcard $(USER_PATH)/secrets.c)","")
SRC += secrets.c
endif
```
Additionally, if you want to make sure that you can disable the function without messing with the file, you need to add this to your `/users/<name>/rules.mk`, so that it catches the flag:
```make
ifeq ($(strip $(NO_SECRETS)), yes)
OPT_DEFS += -DNO_SECRETS
endif
```
Then, if you run `make keyboard:name NO_SECRETS=yes`, it will default to the test strings in your `<name>.c` file, rather than reading from your file.
## Pro Micro Hacking
Well, you can get the QMK DFU bootloader working on the ProMicro. But you need to change fuses.
What worked to get into the firmware properly was:
```
Low: 0x5E High: 0xD9 Extended: 0xC3 Lock: 0x3F
```
The reason that there was some issues before, is that JTAG was still enabled, and using some of the pins that the keyboard uses. Disabling JTAG (either by fuse, or modifying the matrix code for splits fixes the issue).
And for reference, if you want to go back to caterina, the default fuse settings I believe were:
```
Low: 0xFF High: 0xD8 Extended: 0xC3 Lock: 0x3F
```

@ -1,372 +0,0 @@
#include "drashna.h"
#include "rgb_stuff.h"
#include "eeprom.h"
#if defined(RGBLIGHT_ENABLE)
extern rgblight_config_t rgblight_config;
bool has_initialized;
#elif defined(RGB_MATRIX_ENABLE)
extern rgb_config_t rgb_matrix_config;
#endif
#ifdef RGBLIGHT_ENABLE
void rgblight_sethsv_default_helper(uint8_t index) {
rgblight_sethsv_at(rgblight_config.hue, rgblight_config.sat, rgblight_config.val, index);
}
#endif // RGBLIGHT_ENABLE
#ifdef INDICATOR_LIGHTS
void set_rgb_indicators(uint8_t this_mod, uint8_t this_led, uint8_t this_osm) {
if (userspace_config.rgb_layer_change && biton32(layer_state) == 0) {
if ( (this_mod | this_osm) & MOD_MASK_SHIFT || this_led & (1<<USB_LED_CAPS_LOCK) ) {
#ifdef SHFT_LED1
rgblight_sethsv_at(120, 255, 255, SHFT_LED1);
#endif // SHFT_LED1
#ifdef SHFT_LED2
rgblight_sethsv_at(120, 255, 255, SHFT_LED2);
#endif // SHFT_LED2
} else {
#ifdef SHFT_LED1
rgblight_sethsv_default_helper(SHFT_LED1);
#endif // SHFT_LED1
#ifdef SHFT_LED2
rgblight_sethsv_default_helper(SHFT_LED2);
#endif // SHFT_LED2
}
if ( (this_mod | this_osm) & MOD_MASK_CTRL) {
#ifdef CTRL_LED1
rgblight_sethsv_at(0, 255, 255, CTRL_LED1);
#endif // CTRL_LED1
#ifdef CTRL_LED2
rgblight_sethsv_at(0, 255, 255, CTRL_LED2);
#endif // CTRL_LED2
} else {
#ifdef CTRL_LED1
rgblight_sethsv_default_helper(CTRL_LED1);
#endif // CTRL_LED1
#ifdef CTRL_LED2
rgblight_sethsv_default_helper(CTRL_LED2);
#endif // CTRL_LED2
}
if ( (this_mod | this_osm) & MOD_MASK_GUI) {
#ifdef GUI_LED1
rgblight_sethsv_at(51, 255, 255, GUI_LED1);
#endif // GUI_LED1
#ifdef GUI_LED2
rgblight_sethsv_at(51, 255, 255, GUI_LED2);
#endif // GUI_LED2
} else {
#ifdef GUI_LED1
rgblight_sethsv_default_helper(GUI_LED1);
#endif // GUI_LED1
#ifdef GUI_LED2
rgblight_sethsv_default_helper(GUI_LED2);
#endif // GUI_LED2
}
if ( (this_mod | this_osm) & MOD_MASK_ALT) {
#ifdef ALT_LED1
rgblight_sethsv_at(240, 255, 255, ALT_LED1);
#endif // ALT_LED1
#ifdef GUI_LED2
rgblight_sethsv_at(240, 255, 255, ALT_LED2);
#endif // GUI_LED2
} else {
#ifdef GUI_LED1
rgblight_sethsv_default_helper(ALT_LED1);
#endif // GUI_LED1
#ifdef GUI_LED2
rgblight_sethsv_default_helper(ALT_LED2);
#endif // GUI_LED2
}
}
}
void matrix_scan_indicator(void) {
if (has_initialized) {
set_rgb_indicators(get_mods(), host_keyboard_leds(), get_oneshot_mods());
}
}
#endif //INDICATOR_LIGHTS
#ifdef RGBLIGHT_TWINKLE
static rgblight_fadeout lights[RGBLED_NUM];
__attribute__ ((weak))
bool rgblight_twinkle_is_led_used_keymap(uint8_t index) { return false; }
bool rgblight_twinkle_is_led_used(uint8_t index) {
switch (index) {
#ifdef INDICATOR_LIGHTS
#ifdef SHFT_LED1
case SHFT_LED1:
return true;
#endif //SHFT_LED1
#ifdef SHFT_LED2
case SHFT_LED2:
return true;
#endif //SHFT_LED2
#ifdef CTRL_LED1
case CTRL_LED1:
return true;
#endif //CTRL_LED1
#ifdef CTRL_LED2
case CTRL_LED2:
return true;
#endif //CTRL_LED2
#ifdef GUI_LED1
case GUI_LED1:
return true;
#endif //GUI_LED1
#ifdef GUI_LED2
case GUI_LED2:
return true;
#endif //GUI_LED2
#ifdef ALT_LED1
case ALT_LED1:
return true;
#endif //ALT_LED1
#ifdef ALT_LED2
case ALT_LED2:
return true;
#endif //ALT_LED2
#endif //INDICATOR_LIGHTS
default:
return rgblight_twinkle_is_led_used_keymap(index);
}
}
void scan_rgblight_fadeout(void) { // Don't effing change this function .... rgblight_sethsv is supppppper intensive
bool litup = false;
for (uint8_t light_index = 0 ; light_index < RGBLED_NUM ; ++light_index ) {
if (lights[light_index].enabled && timer_elapsed(lights[light_index].timer) > 10) {
rgblight_fadeout *light = &lights[light_index];
litup = true;
if (light->life) {
light->life -= 1;
if (biton32(layer_state) == 0) {
sethsv(light->hue + rand() % 0xF, 255, light->life, (LED_TYPE *)&led[light_index]);
}
light->timer = timer_read();
}
else {
if (light->enabled && biton32(layer_state) == 0) { rgblight_sethsv_default_helper(light_index); }
litup = light->enabled = false;
}
}
}
if (litup && biton32(layer_state) == 0) {
rgblight_set();
}
}
void start_rgb_light(void) {
uint8_t indices[RGBLED_NUM];
uint8_t indices_count = 0;
uint8_t min_life = 0xFF;
uint8_t min_life_index = -1;
for (uint8_t index = 0 ; index < RGBLED_NUM ; ++index ) {
if (rgblight_twinkle_is_led_used(index)) { continue; }
if (lights[index].enabled) {
if (min_life_index == -1 ||
lights[index].life < min_life)
{
min_life = lights[index].life;
min_life_index = index;
}
continue;
}
indices[indices_count] = index;
++indices_count;
}
uint8_t light_index;
if (!indices_count) {
light_index = min_life_index;
}
else {
light_index = indices[rand() % indices_count];
}
rgblight_fadeout *light = &lights[light_index];
light->enabled = true;
light->timer = timer_read();
light->life = 0xC0 + rand() % 0x40;
light->hue = rgblight_config.hue + (rand() % 0xB4) - 0x54;
rgblight_sethsv_at(light->hue, 255, light->life, light_index);
}
#endif
bool process_record_user_rgb(uint16_t keycode, keyrecord_t *record) {
if ((keycode >= QK_MOD_TAP && keycode <= QK_MOD_TAP_MAX) || (keycode >= QK_LAYER_TAP && keycode <= QK_LAYER_TAP_MAX)) {
keycode = keycode & 0xFF;
}
switch (keycode) {
#ifdef RGBLIGHT_TWINKLE
case KC_A ... KC_SLASH:
case KC_F1 ... KC_F12:
case KC_INSERT ... KC_UP:
case KC_KP_SLASH ... KC_KP_DOT:
case KC_F13 ... KC_F24:
case KC_AUDIO_MUTE ... KC_MEDIA_REWIND:
if (record->event.pressed) { start_rgb_light(); }
return true; break;
#endif // RGBLIGHT_TWINKLE
case KC_RGB_T: // This allows me to use underglow as layer indication, or as normal
#if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE)
if (record->event.pressed) {
userspace_config.rgb_layer_change ^= 1;
xprintf("rgblight layer change [EEPROM]: %u\n", userspace_config.rgb_layer_change);
eeconfig_update_user(userspace_config.raw);
if (userspace_config.rgb_layer_change) {
layer_state_set(layer_state); // This is needed to immediately set the layer color (looks better)
}
}
#endif // RGBLIGHT_ENABLE
return false; break;
#ifdef RGBLIGHT_ENABLE
case RGB_MODE_FORWARD ... RGB_MODE_GRADIENT: // quantum_keycodes.h L400 for definitions
if (record->event.pressed) { //This disables layer indication, as it's assumed that if you're changing this ... you want that disabled
if (userspace_config.rgb_layer_change) {
userspace_config.rgb_layer_change = false;
xprintf("rgblight layer change [EEPROM]: %u\n", userspace_config.rgb_layer_change);
eeconfig_update_user(userspace_config.raw);
}
}
return true; break;
#endif // RGBLIGHT_ENABLE
}
return true;
}
void keyboard_post_init_rgb(void) {
#ifdef RGBLIGHT_ENABLE
rgblight_enable_noeeprom();
layer_state_set_user(layer_state);
uint16_t old_hue = rgblight_config.hue;
rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT);
for (uint16_t i = 360; i > 0; i--) {
rgblight_sethsv_noeeprom( ( i + old_hue) % 360, 255, 255);
wait_ms(10);
}
layer_state_set_user(layer_state);
#endif
}
void matrix_scan_rgb(void) {
#ifdef RGBLIGHT_TWINKLE
scan_rgblight_fadeout();
#endif // RGBLIGHT_ENABLE
#ifdef INDICATOR_LIGHTS
matrix_scan_indicator();
#endif
}
uint32_t layer_state_set_rgb(uint32_t state) {
#ifdef RGBLIGHT_ENABLE
if (userspace_config.rgb_layer_change) {
switch (biton32(state)) {
case _MACROS:
rgblight_sethsv_noeeprom_orange();
userspace_config.is_overwatch ? rgblight_effect_snake(RGBLIGHT_MODE_SNAKE + 2) : rgblight_effect_snake(RGBLIGHT_MODE_SNAKE + 3);
break;
case _MEDIA:
rgblight_sethsv_noeeprom_chartreuse();
rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 1);
break;
case _GAMEPAD:
rgblight_sethsv_noeeprom_orange();
rgblight_mode_noeeprom(RGBLIGHT_MODE_SNAKE + 2);
break;
case _DIABLO:
rgblight_sethsv_noeeprom_red();
rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING + 3);
break;
case _RAISE:
rgblight_sethsv_noeeprom_yellow();
rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING + 3);
break;
case _LOWER:
rgblight_sethsv_noeeprom_green();
rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING + 3);
break;
case _ADJUST:
rgblight_sethsv_noeeprom_red();
rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 2);
break;
default: // for any other layers, or the default layer
switch (biton32(default_layer_state)) {
case _COLEMAK:
rgblight_sethsv_noeeprom_magenta(); break;
case _DVORAK:
rgblight_sethsv_noeeprom_springgreen(); break;
case _WORKMAN:
rgblight_sethsv_noeeprom_goldenrod(); break;
case _NORMAN:
rgblight_sethsv_noeeprom_coral(); break;
case _MALTRON:
rgblight_sethsv_noeeprom_yellow(); break;
case _EUCALYN:
rgblight_sethsv_noeeprom_pink(); break;
case _CARPLAX:
rgblight_sethsv_noeeprom_blue(); break;
default:
rgblight_sethsv_noeeprom_cyan(); break;
}
biton32(state) == _MODS ? rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING) : rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT); // if _MODS layer is on, then breath to denote it
break;
}
// layer_state_set_indicator(); // Runs every scan, so need to call this here .... since I can't get it working "right" anyhow
}
#endif // RGBLIGHT_ENABLE
return state;
}
#if 0
uint32_t default_layer_state_set_rgb(uint32_t state) {
#ifdef RGBLIGHT_ENABLE
if (userspace_config.rgb_layer_change) {
rgblight_config_t temp_rgblight_config = rgblight_config;
switch (biton32(state)) {
case _COLEMAK:
temp_rgblight_config.hue = 300;
temp_rgblight_config.val = 255;
temp_rgblight_config.sat = 255;
temp_rgblight_config.mode = 1;
break;
case _DVORAK:
temp_rgblight_config.hue = 150;
temp_rgblight_config.val = 255;
temp_rgblight_config.sat = 255;
temp_rgblight_config.mode = 1;
case _WORKMAN:
temp_rgblight_config.hue = 43;
temp_rgblight_config.val = 218;
temp_rgblight_config.sat = 218;
temp_rgblight_config.mode = 1;
default:
temp_rgblight_config.hue = 180;
temp_rgblight_config.val = 255;
temp_rgblight_config.sat = 255;
temp_rgblight_config.mode = 1;
}
if (temp_rgblight_config.raw != eeconfig_read_rgblight()) {
xprintf("rgblight set default layer hsv [EEPROM]: %u,%u,%u,%u\n", temp_rgblight_config.hue, temp_rgblight_config.sat, temp_rgblight_config.val, temp_rgblight_config.mode);
eeconfig_update_rgblight(temp_rgblight_config.raw);
}
}
#endif // RGBLIGHT_ENABLE
return state;
}
#endif

@ -1,21 +0,0 @@
#pragma once
#include "quantum.h"
#ifdef RGB_MATRIX_ENABLE
#include "rgb_matrix.h"
#endif
typedef struct {
bool enabled;
uint8_t hue;
uint16_t timer;
uint8_t life;
} rgblight_fadeout;
bool process_record_user_rgb(uint16_t keycode, keyrecord_t *record);
void scan_rgblight_fadeout(void);
void keyboard_post_init_rgb(void);
void matrix_scan_rgb(void);
uint32_t layer_state_set_rgb(uint32_t state);
uint32_t default_layer_state_set_rgb(uint32_t state);
void rgblight_sethsv_default_helper(uint8_t index);
void rgb_matrix_set_color_all( uint8_t red, uint8_t green, uint8_t blue );

@ -1,48 +0,0 @@
SRC += drashna.c \
process_records.c
ifneq ("$(wildcard $(USER_PATH)/secrets.c)","")
SRC += secrets.c
endif
ifeq ($(strip $(TAP_DANCE_ENABLE)), yes)
SRC += tap_dances.c
endif
EXTRAFLAGS += -flto
ifeq ($(strip $(NO_SECRETS)), yes)
OPT_DEFS += -DNO_SECRETS
endif
ifeq ($(strip $(RGBLIGHT_ENABLE)), yes)
SRC += rgb_stuff.c
ifeq ($(strip $(INDICATOR_LIGHTS)), yes)
OPT_DEFS += -DINDICATOR_LIGHTS
endif
ifeq ($(strip $(RGBLIGHT_TWINKLE)), yes)
OPT_DEFS += -DRGBLIGHT_TWINKLE
endif
ifeq ($(strip $(RGBLIGHT_NOEEPROM)), yes)
OPT_DEFS += -DRGBLIGHT_NOEEPROM
endif
endif
ifeq ($(strip $(RGB_MATRIX_ENABLE)), yes)
SRC += rgb_stuff.c
endif
ifeq ($(strip $(MACROS_ENABLED)), yes)
OPT_DEFS += -DMACROS_ENABLED
endif
ifdef CONSOLE_ENABLE
ifeq ($(strip $(KEYLOGGER_ENABLE)), yes)
OPT_DEFS += -DKEYLOGGER_ENABLE
endif
endif
ifeq ($(strip $(MAKE_BOOTLOADER)), yes)
OPT_DEFS += -DMAKE_BOOTLOADER
endif

@ -1,71 +0,0 @@
#pragma once
#include "quantum.h"
void send_unicode_hex_string(const char* str);
/* use X(n) to call the */
#ifdef UNICODEMAP_ENABLE
enum unicode_name {
THINK, // thinking face 🤔
GRIN, // grinning face 😊
SMRK, // smirk 😏
WEARY, // good shit 😩
UNAMU, // unamused 😒
SNEK, // snke 🐍
PENGUIN, // 🐧
DRAGON, // 🐉
MONKEY, // 🐒
CHICK, // 🐥
BOAR, // 🐗
OKOK, // 👌
EFFU, // 🖕
INUP, // 👆
THUP, // 👍
THDN, // 👎
BBB, // dat B 🅱
POO, // poop 💩
HUNDR, // 100 💯
EGGPL, // EGGPLANT 🍆
WATER, // wet 💦
TUMBLER, // 🥃
LIT, // fire 🔥
BANG, // ‽
IRONY, // ⸮
DEGREE // °
};
const uint32_t PROGMEM unicode_map[] = {
[THINK] = 0x1F914,
[GRIN] = 0x1F600,
[BBB] = 0x1F171,
[POO] = 0x1F4A9,
[HUNDR] = 0x1F4AF,
[SMRK] = 0x1F60F,
[WEARY] = 0x1F629,
[EGGPL] = 0x1F346,
[WATER] = 0x1F4A6,
[LIT] = 0x1F525,
[UNAMU] = 0x1F612,
[SNEK] = 0x1F40D,
[PENGUIN] = 0x1F427,
[BOAR] = 0x1F417,
[MONKEY] = 0x1F412,
[CHICK] = 0x1F425,
[DRAGON] = 0x1F409,
[OKOK] = 0x1F44C,
[EFFU] = 0x1F595,
[INUP] = 0x1F446,
[THDN] = 0x1F44E,
[THUP] = 0x1F44D,
[TUMBLER] = 0x1F943,
[BANG] = 0x0203D,
[IRONY] = 0x02E2E,
[DEGREE] = 0x000B0
};
#endif // UNICODEMAP_ENABLE

@ -1,64 +0,0 @@
#include "tap_dances.h"
//define diablo macro timer variables
uint16_t diablo_timer[4];
uint8_t diablo_times[] = { 0, 1, 3, 5, 10, 30 };
uint8_t diablo_key_time[4];
// has the correct number of seconds elapsed (as defined by diablo_times)
bool check_dtimer(uint8_t dtimer) { return (timer_elapsed(diablo_timer[dtimer]) < (diablo_key_time[dtimer] * 1000)) ? false : true; };
// Cycle through the times for the macro, starting at 0, for disabled.
// Max of six values, so don't exceed
void diablo_tapdance_master(qk_tap_dance_state_t *state, void *user_data, uint8_t diablo_key) {
if (state->count >= 7) {
diablo_key_time[diablo_key] = diablo_times[0];
reset_tap_dance(state);
} else {
diablo_key_time[diablo_key] = diablo_times[state->count - 1];
}
}
// Would rather have one function for all of this, but no idea how to do that...
void diablo_tapdance1(qk_tap_dance_state_t *state, void *user_data) { diablo_tapdance_master(state, user_data, 0); }
void diablo_tapdance2(qk_tap_dance_state_t *state, void *user_data) { diablo_tapdance_master(state, user_data, 1); }
void diablo_tapdance3(qk_tap_dance_state_t *state, void *user_data) { diablo_tapdance_master(state, user_data, 2); }
void diablo_tapdance4(qk_tap_dance_state_t *state, void *user_data) { diablo_tapdance_master(state, user_data, 3); }
//Tap Dance Definitions
qk_tap_dance_action_t tap_dance_actions[] = {
// tap once to disable, and more to enable timed micros
[TD_D3_1] = ACTION_TAP_DANCE_FN(diablo_tapdance1),
[TD_D3_2] = ACTION_TAP_DANCE_FN(diablo_tapdance2),
[TD_D3_3] = ACTION_TAP_DANCE_FN(diablo_tapdance3),
[TD_D3_4] = ACTION_TAP_DANCE_FN(diablo_tapdance4),
};
// Sends the key press to system, but only if on the Diablo layer
void send_diablo_keystroke(uint8_t diablo_key) {
if (IS_LAYER_ON(_DIABLO)) {
switch (diablo_key) {
case 0:
tap_code(KC_1); break;
case 1:
tap_code(KC_2); break;
case 2:
tap_code(KC_3); break;
case 3:
tap_code(KC_4); break;
}
}
}
// Checks each of the 4 timers/keys to see if enough time has elapsed
// Runs the "send string" command if enough time has passed, and resets the timer.
void run_diablo_macro_check(void) {
uint8_t dtime;
for (dtime = 0; dtime < 4; dtime++) {
if (check_dtimer(dtime) && diablo_key_time[dtime]) {
diablo_timer[dtime] = timer_read();
send_diablo_keystroke(dtime);
}
}
}

@ -1,19 +0,0 @@
#pragma once
#include "drashna.h"
//define diablo macro timer variables
extern uint16_t diablo_timer[4];
extern uint8_t diablo_times[];
extern uint8_t diablo_key_time[4];
void run_diablo_macro_check(void);
#ifdef TAP_DANCE_ENABLE
enum {
TD_D3_1 = 0,
TD_D3_2,
TD_D3_3,
TD_D3_4
};
#endif // TAP_DANCE_ENABLE

@ -1,124 +0,0 @@
#include "template.h"
// Add reconfigurable functions here, for keymap customization
// This allows for a global, userspace functions, and continued
// customization of the keymap. Use _keymap instead of _user
// functions in the keymaps
__attribute__ ((weak))
void matrix_init_keymap(void) {}
// Call user matrix init, then call the keymap's init function
void matrix_init_user(void) {
matrix_init_keymap();
}
__attribute__ ((weak))
void matrix_scan_keymap(void) {}
// No global matrix scan code, so just run keymap's matix
// scan function
void matrix_scan_user(void) {
matrix_scan_keymap();
}
__attribute__ ((weak))
bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
return true;
}
// Defines actions tor my global custom keycodes. Defined in drashna.h file
// Then runs the _keymap's recod handier if not processed here,
// And use "NEWPLACEHOLDER" for new safe range
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case KC_MAKE:
if (!record->event.pressed) {
SEND_STRING("make " QMK_KEYBOARD ":" QMK_KEYMAP
#if (defined(BOOTLOADER_DFU) || defined(BOOTLOADER_LUFA_DFU) || defined(BOOTLOADER_QMK_DFU))
":dfu"
#elif defined(BOOTLOADER_HALFKAY)
":teensy"
#elif defined(BOOTLOADER_CATERINA)
":avrdude"
#endif
SS_TAP(X_ENTER));
}
return false;
break;
case VRSN:
if (record->event.pressed) {
SEND_STRING(QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
}
return false;
break;
}
return process_record_keymap(keycode, record);
}
__attribute__ ((weak))
uint32_t layer_state_set_keymap (uint32_t state) {
return state;
}
uint32_t layer_state_set_user (uint32_t state) {
return layer_state_set_keymap (state);
}
__attribute__ ((weak))
void led_set_keymap(uint8_t usb_led) {}
void led_set_user(uint8_t usb_led) {
led_set_keymap(usb_led);
}
__attribute__ ((weak))
void suspend_power_down_keymap(void) {}
void suspend_power_down_user(void)
{
suspend_power_down_keymap();
}
__attribute__ ((weak))
void suspend_wakeup_init_keymap(void) {}
void suspend_wakeup_init_user(void)
{
suspend_wakeup_init_keymap();
#ifdef KEYBOARD_ergodox_ez
wait_ms(10);
#endif
}
__attribute__ ((weak))
void startup_keymap(void) {}
void startup_user (void) {
#ifdef RGBLIGHT_ENABLE
matrix_init_rgb();
#endif //RGBLIGHT_ENABLE
startup_keymap();
}
__attribute__ ((weak))
void shutdown_keymap(void) {}
void shutdown_user (void) {
shutdown_keymap();
}

@ -1,18 +0,0 @@
#ifndef USERSPACE
#define USERSPACE
#include "quantum.h"
#include "version.h"
#include "eeprom.h"
// Define layer names
#define BASE 0
enum custom_keycodes {
VRSN = SAFE_RANGE, // can always be here
KC_MAKE,
KC_RESET,
NEWPLACEHOLDER //use "NEWPLACEHOLDER for keymap specific codes
};
#endif

@ -1,171 +0,0 @@
#pragma once
#include "drashna.h"
/*
Since our quirky block definitions are basically a list of comma separated
arguments, we need a wrapper in order for these definitions to be
expanded before being used as arguments to the LAYOUT_xxx macro.
*/
#if (!defined(LAYOUT) && defined(KEYMAP))
#define LAYOUT KEYMAP
#endif
#define LAYOUT_ergodox_wrapper(...) LAYOUT_ergodox(__VA_ARGS__)
#define LAYOUT_ergodox_pretty_wrapper(...) LAYOUT_ergodox_pretty(__VA_ARGS__)
#define KEYMAP_wrapper(...) LAYOUT(__VA_ARGS__)
#define LAYOUT_wrapper(...) LAYOUT(__VA_ARGS__)
#define LAYOUT_ortho_4x12_wrapper(...) LAYOUT_ortho_4x12(__VA_ARGS__)
#define LAYOUT_ortho_5x12_wrapper(...) LAYOUT_ortho_5x12(__VA_ARGS__)
/*
Blocks for each of the four major keyboard layouts
Organized so we can quickly adapt and modify all of them
at once, rather than for each keyboard, one at a time.
And this allows for much cleaner blocks in the keymaps.
For instance Tap/Hold for Control on all of the layouts
NOTE: These are all the same length. If you do a search/replace
then you need to add/remove underscores to keep the
lengths consistent.
*/
#define _________________QWERTY_L1_________________ KC_Q, KC_W, KC_E, KC_R, KC_T
#define _________________QWERTY_L2_________________ KC_A, KC_S, KC_D, KC_F, KC_G
#define _________________QWERTY_L3_________________ KC_Z, KC_X, KC_C, KC_V, KC_B
#define _________________QWERTY_R1_________________ KC_Y, KC_U, KC_I, KC_O, KC_P
#define _________________QWERTY_R2_________________ KC_H, KC_J, KC_K, KC_L, KC_SCLN
#define _________________QWERTY_R3_________________ KC_N, KC_M, KC_COMM, KC_DOT, KC_SLASH
#define _________________COLEMAK_L1________________ KC_Q, KC_W, KC_F, KC_P, KC_G
#define _________________COLEMAK_L2________________ KC_A, KC_R, KC_S, KC_T, KC_D
#define _________________COLEMAK_L3________________ KC_Z, KC_X, KC_C, KC_V, KC_B
#define _________________COLEMAK_R1________________ KC_J, KC_L, KC_U, KC_Y, KC_SCLN
#define _________________COLEMAK_R2________________ KC_H, KC_N, KC_E, KC_I, KC_O
#define _________________COLEMAK_R3________________ KC_K, KC_M, KC_COMM, KC_DOT, KC_SLASH
#define ______________COLEMAK_MOD_DH_L1____________ KC_Q, KC_W, KC_F, KC_P, KC_B
#define ______________COLEMAK_MOD_DH_L2____________ KC_A, KC_R, KC_S, KC_T, KC_G
#define ______________COLEMAK_MOD_DH_L3____________ KC_Z, KC_X, KC_C, KC_D, KC_V
#define ______________COLEMAK_MOD_DH_R1____________ KC_J, KC_L, KC_U, KC_Y, KC_SCLN
#define ______________COLEMAK_MOD_DH_R2____________ KC_M, KC_N, KC_E, KC_I, KC_O
#define ______________COLEMAK_MOD_DH_R3____________ KC_K, KC_H, KC_COMM, KC_DOT, KC_SLASH
#define _________________DVORAK_L1_________________ KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y
#define _________________DVORAK_L2_________________ KC_A, KC_O, KC_E, KC_U, KC_I
#define _________________DVORAK_L3_________________ KC_SCLN, KC_Q, KC_J, KC_K, KC_X
#define _________________DVORAK_R1_________________ KC_F, KC_G, KC_C, KC_R, KC_L
#define _________________DVORAK_R2_________________ KC_D, KC_H, KC_T, KC_N, KC_S
#define _________________DVORAK_R3_________________ KC_B, KC_M, KC_W, KC_V, KC_Z
#define ________________DVORAK_AU_L1_______________ KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y
#define ________________DVORAK_AU_L2_______________ KC_O, KC_A, KC_E, KC_I, KC_U
#define ________________DVORAK_AU_L3_______________ KC_SCLN, KC_Q, KC_J, KC_K, KC_X
#define ________________DVORAK_AU_R1_______________ KC_F, KC_G, KC_C, KC_R, KC_L
#define ________________DVORAK_AU_R2_______________ KC_D, KC_H, KC_T, KC_N, KC_S
#define ________________DVORAK_AU_R3_______________ KC_B, KC_M, KC_W, KC_V, KC_Z
#define _________________WORKMAN_L1________________ KC_Q, KC_D, KC_R, KC_W, KC_B
#define _________________WORKMAN_L2________________ KC_A, KC_S, KC_H, KC_T, KC_G
#define _________________WORKMAN_L3________________ KC_Z, KC_X, KC_M, KC_C, KC_V
#define _________________WORKMAN_R1________________ KC_J, KC_F, KC_U, KC_P, KC_SCLN
#define _________________WORKMAN_R2________________ KC_Y, KC_N, KC_E, KC_O, KC_I
#define _________________WORKMAN_R3________________ KC_K, KC_L, KC_COMM, KC_DOT, KC_SLASH
#define _________________NORMAN_L1_________________ KC_Q, KC_W, KC_D, KC_F, KC_K
#define _________________NORMAN_L2_________________ KC_A, KC_S, KC_E, KC_T, KC_G
#define _________________NORMAN_L3_________________ KC_Z, KC_X, KC_C, KC_V, KC_B
#define _________________NORMAN_R1_________________ KC_J, KC_U, KC_R, KC_L, KC_SCLN
#define _________________NORMAN_R2_________________ KC_Y, KC_N, KC_I, KC_O, KC_U
#define _________________NORMAN_R3_________________ KC_P, KC_M, KC_COMM, KC_DOT, KC_SLASH
#define _________________MALTRON_L1________________ KC_Q, KC_P, KC_Y, KC_C, KC_B
#define _________________MALTRON_L2________________ KC_A, KC_N, KC_I, KC_S, KC_F
#define _________________MALTRON_L3________________ KC_SCLN, KC_SLSH, KC_J, KC_G, KC_COMM
#define _________________MALTRON_R1________________ KC_V, KC_M, KC_U, KC_Z, KC_L
#define _________________MALTRON_R2________________ KC_D, KC_T, KC_D, KC_O, KC_R
#define _________________MALTRON_R3________________ KC_DOT, KC_W, KC_K, KC_MINS, KC_X
#define _________________EUCALYN_L1________________ KC_SLSH, KC_COMM, KC_DOT, KC_F, KC_Q
#define _________________EUCALYN_L2________________ KC_A, KC_O, KC_E, KC_I, KC_U
#define _________________EUCALYN_L3________________ KC_Z, KC_X, KC_C, KC_V, KC_W
#define _________________EUCALYN_R1________________ KC_M, KC_R, KC_D, KC_Y, KC_P
#define _________________EUCALYN_R2________________ KC_G, KC_T, KC_K, KC_S, KC_N
#define _________________EUCALYN_R3________________ KC_B, KC_H, KC_J, KC_L, KC_SCLN
#define _____________CARPLAX_QFMLWY_L1_____________ KC_Q, KC_F, KC_M, KC_L, KC_W
#define _____________CARPLAX_QFMLWY_L2_____________ KC_D, KC_S, KC_T, KC_N, KC_R
#define _____________CARPLAX_QFMLWY_L3_____________ KC_Z, KC_V, KC_G, KC_C, KC_X
#define _____________CARPLAX_QFMLWY_R1_____________ KC_Y, KC_U, KC_O, KC_B, KC_J
#define _____________CARPLAX_QFMLWY_R2_____________ KC_I, KC_A, KC_E, KC_H, KC_SCLN
#define _____________CARPLAX_QFMLWY_R3_____________ KC_P, KC_K, KC_COMM, KC_DOT, KC_SLSH
#define _____________CARPLAX_QGMLWB_L1_____________ KC_Q, KC_G, KC_M, KC_L, KC_W
#define _____________CARPLAX_QGMLWB_L2_____________ KC_D, KC_S, KC_T, KC_N, KC_R
#define _____________CARPLAX_QGMLWB_L3_____________ KC_Z, KC_X, KC_C, KC_F, KC_J
#define _____________CARPLAX_QGMLWB_R1_____________ KC_B, KC_Y, KC_U, KC_V, KC_SCLN
#define _____________CARPLAX_QGMLWB_R2_____________ KC_I, KC_A, KC_E, KC_O, KC_H
#define _____________CARPLAX_QGMLWB_R3_____________ KC_K, KC_P, KC_COMM, KC_DOT, KC_SLSH
#define _____________CARPLAX_QGMLWY_L1_____________ KC_Q, KC_G, KC_M, KC_L, KC_W
#define _____________CARPLAX_QGMLWY_L2_____________ KC_D, KC_S, KC_T, KC_N, KC_R
#define _____________CARPLAX_QGMLWY_L3_____________ KC_Z, KC_X, KC_C, KC_V, KC_J
#define _____________CARPLAX_QGMLWY_R1_____________ KC_Y, KC_F, KC_U, KC_B, KC_SCLN
#define _____________CARPLAX_QGMLWY_R2_____________ KC_I, KC_A, KC_E, KC_O, KC_H
#define _____________CARPLAX_QGMLWY_R3_____________ KC_K, KC_P, KC_COMM, KC_DOT, KC_SLSH
#define ________________NUMBER_LEFT________________ KC_1, KC_2, KC_3, KC_4, KC_5
#define ________________NUMBER_RIGHT_______________ KC_6, KC_7, KC_8, KC_9, KC_0
#define _________________FUNC_LEFT_________________ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5
#define _________________FUNC_RIGHT________________ KC_F6, KC_F7, KC_F8, KC_F9, KC_F10
#define ___________________BLANK___________________ _______, _______, _______, _______, _______
#define _________________LOWER_L1__________________ KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC
#define _________________LOWER_L2__________________ _________________FUNC_LEFT_________________
#define _________________LOWER_L3__________________ _________________FUNC_RIGHT________________
#define _________________LOWER_R1__________________ KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN
#define _________________LOWER_R2__________________ _______, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR
#define _________________LOWER_R3__________________ _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
#define _________________RAISE_L1__________________ ________________NUMBER_LEFT________________
#define _________________RAISE_L2__________________ ___________________BLANK___________________
#define _________________RAISE_L3__________________ ___________________BLANK___________________
#define _________________RAISE_R1__________________ ________________NUMBER_RIGHT_______________
#define _________________RAISE_R2__________________ _______, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC
#define _________________RAISE_R3__________________ _______, KC_HOME, KC_PGDN, KC_PGUP, KC_END
#define _________________ADJUST_L1_________________ RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, RGB_TOG
#define _________________ADJUST_L2_________________ MU_TOG , CK_TOGG, AU_ON, AU_OFF, AG_NORM
#define _________________ADJUST_L3_________________ RGB_RMOD,RGB_HUD,RGB_SAD, RGB_VAD, KC_RGB_T
#define _________________ADJUST_R1_________________ KC_SEC1, KC_SEC2, KC_SEC3, KC_SEC4, KC_SEC5
#define _________________ADJUST_R2_________________ AG_SWAP, QWERTY, COLEMAK, DVORAK, WORKMAN
#define _________________ADJUST_R3_________________ MG_NKRO, KC_MUTE, KC_VOLD, KC_VOLU, KC_MNXT

@ -1 +0,0 @@
#include "dudeofawesome.h"

@ -1,25 +0,0 @@
#ifndef USERSPACE
#define USERSPACE
#ifdef TAPPING_TOGGLE
#undef TAPPING_TOGGLE
#endif
#define TAPPING_TOGGLE 2
#ifdef AUDIO_ENABLE
#define WORKMAN_SOUND \
E__NOTE(_GS7), \
ED_NOTE(_E7), \
S__NOTE(_REST), \
E__NOTE(_A6), \
S__NOTE(_REST), \
ED_NOTE(_GS6),
#define NUMPAD_ON_SOUND \
E__NOTE(_C6), \
ED_NOTE(_BF5), \
S__NOTE(_C6), \
ED_NOTE(_BF5),
#endif
#endif

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

@ -1,32 +0,0 @@
#include "edvorakjp.h"
void matrix_init_user(void) {
edvorakjp_status_init();
matrix_init_keymap();
}
__attribute__ ((weak))
void matrix_init_keymap() {}
uint32_t layer_state_set_user(uint32_t state) {
state = update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST);
return layer_state_set_keymap(state);
}
__attribute__ ((weak))
uint32_t layer_state_set_keymap(uint32_t state) {
return state;
}
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
return process_record_keymap(keycode, record) &&\
process_record_edvorakjp_swap_scln(keycode, record) &&\
process_record_edvorakjp_config(keycode, record) &&\
process_record_layer(keycode, record) &&\
process_record_ime(keycode, record);
}
__attribute__ ((weak))
bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
return true;
}

@ -1,70 +0,0 @@
#ifndef EDVORAKJP
#define EDVORAKJP
#include "quantum.h"
#include "action_layer.h"
#define EECONFIG_EDVORAK (uint8_t *)20
extern keymap_config_t keymap_config;
enum edvorakjp_layers {
_EDVORAK = 0,
_LOWER,
_RAISE,
_ADJUST,
_EXTRA,
};
enum edvorakjp_keycodes {
EDVORAK = SAFE_RANGE,
LOWER,
RAISE,
KC_MAC,
KC_WIN,
KC_JPN,
KC_ENG,
NEW_SAFE_RANGE
};
#define KC_LC(k) LCTL_T(KC_##k)
#define KC_LS(k) LSFT_T(KC_##k)
#define KC_LA(k) LALT_T(KC_##k)
#define KC_LG(k) LGUI_T(KC_##k)
#define KC_RC(k) RCTL_T(KC_##k)
#define KC_RS(k) RSFT_T(KC_##k)
#define KC_RG(k) RGUI_T(KC_##k)
#define KC_RA(k) RALT_T(KC_##k)
enum tap_dance_code {
TD_LOWER = 0,
TD_RAISE
};
// base
void dvorakj_layer_off(void);
void matrix_init_user(void);
void matrix_init_keymap(void);
uint32_t layer_state_set_user(uint32_t state);
uint32_t layer_state_set_keymap(uint32_t state);
bool process_record_user(uint16_t keycode, keyrecord_t *record);
bool process_record_keymap(uint16_t keycode, keyrecord_t *record);
// status
void edvorakjp_status_init(void);
bool get_enable_kc_lang(void);
void set_enable_kc_lang(bool new_state);
bool get_japanese_mode(void);
void set_japanese_mode(bool new_state);
/*
* Each process_record_* methods defined here are
* return false if processed, or return true if not processed.
* You can add your original macros in process_record_keymap() in keymap.c.
*/
bool process_record_edvorakjp_swap_scln(uint16_t keycode, keyrecord_t *record);
bool process_record_edvorakjp_config(uint16_t keycode, keyrecord_t *record);
bool process_record_layer(uint16_t keycode, keyrecord_t *record);
bool process_record_ime(uint16_t keycode, keyrecord_t *record);
#endif // EDVORAKJP

@ -1,89 +0,0 @@
#include "edvorakjp.h"
#if TAP_DANCE_ENABLE != yes
static uint16_t time_on_pressed;
#endif
/*
* Each process_record_* methods defined here are
* return false if handle edvorak_keycodes, or return true others.
*/
bool process_record_edvorakjp_swap_scln(uint16_t keycode, keyrecord_t *record) {
#ifdef SWAP_SCLN
static const uint8_t shift_bits = MOD_BIT(KC_LSFT) | MOD_BIT(KC_RSFT);
static uint8_t last_mods_status;
if (keycode == KC_SCLN) {
if (record->event.pressed) {
last_mods_status = get_mods();
// invert shift_bits
if (last_mods_status & shift_bits) {
set_mods(last_mods_status & ~shift_bits);
} else {
set_mods(last_mods_status | MOD_BIT(KC_LSFT));
}
} else {
set_mods(last_mods_status);
last_mods_status = 0;
}
}
#endif
return true;
}
bool process_record_edvorakjp_config(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case KC_MAC:
case KC_WIN:
if (record->event.pressed) {
set_enable_kc_lang(keycode == KC_MAC);
}
return false;
}
return true;
}
bool process_record_layer(uint16_t keycode, keyrecord_t *record) {
#if TAP_DANCE_ENABLE != yes
switch (keycode) {
case LOWER:
if (record->event.pressed) {
layer_on(_LOWER);
time_on_pressed = record->event.time;
} else {
layer_off(_LOWER);
if (TIMER_DIFF_16(record->event.time, time_on_pressed) < TAPPING_TERM) {
set_japanese_mode(false);
}
time_on_pressed = 0;
}
return false;
case RAISE:
if (record->event.pressed) {
layer_on(_RAISE);
time_on_pressed = record->event.time;
} else {
layer_off(_RAISE);
if (TIMER_DIFF_16(record->event.time, time_on_pressed) < TAPPING_TERM) {
set_japanese_mode(true);
}
time_on_pressed = 0;
}
return false;
}
#endif
return true;
}
bool process_record_ime(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case KC_JPN:
case KC_ENG:
if (record->event.pressed) {
set_japanese_mode(keycode == KC_JPN);
}
return false;
}
return true;
}

@ -1,64 +0,0 @@
#include "eeprom.h"
#include "edvorakjp.h"
typedef union {
uint8_t raw;
struct {
bool enable_kc_lang; // for macOS
};
} edvorakjp_config_t;
static edvorakjp_config_t edvorakjp_config;
typedef struct {
bool japanese_mode;
} edvorakjp_state_t;
static edvorakjp_state_t edvorakjp_state;
/*
* private methods
*/
uint8_t eeconfig_read_edvorakjp(void) {
return eeprom_read_byte(EECONFIG_EDVORAK);
}
void eeconfig_update_edvorakjp(uint8_t val) {
eeprom_update_byte(EECONFIG_EDVORAK, val);
}
/*
* public methods
*/
void edvorakjp_status_init(void) {
edvorakjp_state.japanese_mode = false;
edvorakjp_config.raw = eeconfig_read_edvorakjp();
}
bool get_enable_kc_lang(void) {
return edvorakjp_config.enable_kc_lang;
}
void set_enable_kc_lang(bool new_state) {
edvorakjp_config.enable_kc_lang = new_state;
eeconfig_update_edvorakjp(edvorakjp_config.raw);
}
bool get_japanese_mode(void) {
return edvorakjp_state.japanese_mode;
}
void set_japanese_mode(bool new_state) {
edvorakjp_state.japanese_mode = new_state;
if (edvorakjp_state.japanese_mode) {
if (edvorakjp_config.enable_kc_lang) {
SEND_STRING(SS_TAP(X_LANG1));
} else {
SEND_STRING(SS_LALT("`"));
}
} else {
if (edvorakjp_config.enable_kc_lang) {
SEND_STRING(SS_TAP(X_LANG2));
} else {
SEND_STRING(SS_LALT("`"));
}
}
}

@ -1,73 +0,0 @@
#include "edvorakjp.h"
#include "process_keycode/process_tap_dance.h"
enum tap_state {
NONE = 0,
SINGLE_TAP = 1,
DOUBLE_TAP = 2,
HOLD
};
typedef struct {
uint8_t lower;
uint8_t raise;
} td_status_t;
static td_status_t td_status = {NONE, NONE};
int cur_dance(qk_tap_dance_state_t *state) {
if (state->interrupted || !state->pressed) {
return state->count == 1 ? SINGLE_TAP : DOUBLE_TAP;
} else {
return HOLD;
}
}
void td_lower_finished(qk_tap_dance_state_t *state, void *user_data) {
td_status.lower = cur_dance(state);
switch(td_status.lower) {
case SINGLE_TAP:
set_japanese_mode(false);
break;
case DOUBLE_TAP:
set_japanese_mode(false);
register_code(KC_ESC);
break;
case HOLD:
break;
}
layer_on(_LOWER);
}
void td_lower_reset(qk_tap_dance_state_t *state, void *user_data) {
if (td_status.lower == DOUBLE_TAP) {
unregister_code(KC_ESC);
}
layer_off(_LOWER);
td_status.lower = NONE;
}
void td_raise_finished(qk_tap_dance_state_t *state, void *user_data) {
td_status.raise = cur_dance(state);
switch(td_status.raise) {
case DOUBLE_TAP:
// same as single
case SINGLE_TAP:
set_japanese_mode(true);
break;
case HOLD:
break;
}
layer_on(_RAISE);
}
void td_raise_reset(qk_tap_dance_state_t *state, void *user_data) {
layer_off(_RAISE);
td_status.raise = NONE;
}
qk_tap_dance_action_t tap_dance_actions[] = {
[TD_LOWER] =
ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, td_lower_finished, td_lower_reset, 100),
[TD_RAISE] =
ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, td_raise_finished, td_raise_reset, 100)
};

@ -1,67 +0,0 @@
# edvorakjp
epaew's Enhanced Dvorak layout for Japanese Programmer
## Layout overview
This is a sample. You can swap any symbol keys and modifier keys.
- Basic layout (for ansi)
```
//+----+----+----+----+----+----+----+----+----+----+----+----+----+---------+
` , ! , @ , # , $ , % , ^ , & , * , ( , ) , [ , ] , BSPC ,
//+----+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+-------+
TAB , ' , , , . , Y , Q , F , G , R , W , P , / , = , \ ,
//+------++---++---++---++---++---++---++---++---++---++---++---++---+-------+
CAPS , A , O , E , I , U , D , T , N , S , M , - , ENT ,
//+-------+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-----------+
LSFT , : , X , C , V , Z , H , J , K , L , B , RSFT ,
//+------+--+---++----++---+----+----+----+----+-+--+---++----++------+------+
LCTL , LGUI , LALT , SPACE , RALT , RGUI , MENU , RCTL
//+------+------+------+-------------------------+------+------+------+------+
```
And you can see [my iris keyboard layout](../../keyboards/iris/keymaps/edvorakjp/keymap.c) for sample implementation, too.
## for Japanese
- 日本語入力用のキーを追加
- IME 切り替えキー
- 長押しでレイヤー切り替え、短押しでIME切り替え
- macOS(かな/英数)、Windows(Alt+\`)の両方に対応
- Define some custom keys for typing Japanese
- IME switching
- act as LOWER/RAISE when hold, act as IME switching when tapped
- for macOS(かな/英数), for Windows(Alt+\`)
## for Programmer
- Dvorak 配列をベースに、ショートカットでよく利用される XCV は QWERTY 配列の位置を維持
- 一部にVimユーザ用のキー配置を実施
- HJKL キーを横並びで配置
- Shift押下時と非押下時で、";"キーの挙動を入れ替え
`config.h` 内で `#define SWAP_SCLN` の宣言が必要です)
- デフォルトレイヤーには、数字キーの代わりに記号 `!@#$%^&*()` を配置
- mainly based on Dvorak layout, but XCV is available in the same position of QWERTY layout
- for Vim users
- HJKL is lining side by side
- swap the ";" key behavior. i.e. send ":" normally and send ";" when you hold shift.
(need `#define SWAP_SCLN` in your `config.h`)
- we can type `!@#$%^&*()` keys without shift keys in base layer
## License
Copyright 2018 Ryo Maeda epaew.333@gmail.com @epaew
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/>.

@ -1,7 +0,0 @@
SRC += edvorakjp.c \
edvorakjp_process_record.c \
edvorakjp_status.c
ifeq ($(TAP_DANCE_ENABLE), yes)
SRC += edvorakjp_tap_dance.c
endif

@ -1,33 +0,0 @@
#ifndef USERSPACE_CONFIG_H
#define USERSPACE_CONFIG_H
#include "../../config.h"
// Sets good default for the speed of the mouse.
#undef MOUSEKEY_INTERVAL
#undef MOUSEKEY_DELAY
#undef MOUSEKEY_TIME_TO_MAX
#undef MOUSEKEY_MAX_SPEED
#define MOUSEKEY_INTERVAL 20
#define MOUSEKEY_DELAY 100
#define MOUSEKEY_TIME_TO_MAX 60
#define MOUSEKEY_MAX_SPEED 7
#undef MOUSEKEY_WHEEL_MAX_SPEED
#undef MOUSEKEY_WHEEL_TIME_TO_MAX
#undef MOUSEKEY_WHEEL_DELAY
#define MOUSEKEY_WHEEL_MAX_SPEED 5
#define MOUSEKEY_WHEEL_TIME_TO_MAX 60
#define MOUSEKEY_WHEEL_DELAY 100
#undef TAPPING_TOGGLE
#undef TAPPING_TERM
#undef IGNORE_MOD_TAP_INTERRUPT
#define TAPPING_TOGGLE 1
#define TAPPING_TERM 200
#define IGNORE_MOD_TAP_INTERRUPT
#endif

@ -1,637 +0,0 @@
/*
Copyright 2018 Eric Gebhart <e.a.gebhart@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/>.
*/
#include "ericgebhart.h"
#include "quantum.h"
#include "version.h"
#include "action.h"
#include "action_layer.h"
#include "process_keycode/process_tap_dance.h"
#include "keymap_bepo.h"
float tone_copy[][2] = SONG(SCROLL_LOCK_ON_SOUND);
float tone_paste[][2] = SONG(SCROLL_LOCK_OFF_SOUND);
static uint16_t copy_paste_timer;
userspace_config_t userspace_config;
void tap(uint16_t keycode){ register_code(keycode); unregister_code(keycode); };
// Add reconfigurable functions here, for keymap customization
// This allows for a global, userspace functions, and continued
// customization of the keymap. Use _keymap instead of _user
// functions in the keymaps
__attribute__ ((weak))
void matrix_init_keymap(void) {}
__attribute__ ((weak))
void matrix_scan_keymap(void) {}
__attribute__ ((weak))
bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
return true;
}
__attribute__ ((weak))
bool process_record_secrets(uint16_t keycode, keyrecord_t *record) {
return true;
}
__attribute__ ((weak))
uint32_t layer_state_set_keymap (uint32_t state) {
return state;
}
__attribute__ ((weak))
void led_set_keymap(uint8_t usb_led) {}
// Runs just one time when the keyboard initializes.
void matrix_init_user(void) {
//ACTION_DEFAULT_LAYER_SET(DVORAK) ;
}
// check default layerstate to see which layer we are on.
// if (biton32(layer_state) == _DIABLO) { --- current layer
// if (biton32(default_layer_state) == _DIABLO) { --- current default layer
// check for left shift on.
// if (mods & MOD_BIT(KC_LSFT)) register_code(KC_LSFT);
static void switch_default_layer(uint8_t layer) {
default_layer_set(1UL<<layer);
clear_keyboard();
}
// so the keyboard remembers which layer it's in after power disconnect.
/*
uint32_t default_layer_state_set_kb(uint32_t state) {
eeconfig_update_default_layer(state);
return state;
}
*/
// These are the keys for dvorak on bepo. column one is the keycode and mods for
// the unshifted key, the second column is the keycode and mods for the shifted key.
// GR is Good Range. It subtracts SAFE_RANGE from the keycode so we can make a
// reasnably sized array without difficulties. The macro is for the constant declarations
// the function is for when we use it.
const uint8_t key_translations[][2][2] = {
[GR(DB_1)] = {{BP_DQOT, MOD_LSFT}, {BP_DCRC, MOD_LSFT}},
[GR(DB_2)] = {{BP_LGIL, MOD_LSFT}, {BP_AT, MOD_NONE}},
[GR(DB_3)] = {{BP_RGIL, MOD_LSFT}, {BP_DLR, MOD_LSFT}},
[GR(DB_4)] = {{BP_LPRN, MOD_LSFT}, {BP_DLR, MOD_NONE}},
[GR(DB_5)] = {{BP_RPRN, MOD_LSFT}, {BP_PERC, MOD_NONE}},
[GR(DB_6)] = {{BP_AT, MOD_LSFT}, {BP_AT, MOD_BIT(KC_RALT)}},
[GR(DB_7)] = {{BP_PLUS, MOD_LSFT}, {BP_P, MOD_BIT(KC_RALT)}},
[GR(DB_8)] = {{BP_MINS, MOD_LSFT}, {BP_ASTR, MOD_NONE}},
[GR(DB_9)] = {{BP_SLASH, MOD_LSFT}, {BP_LPRN, MOD_NONE}},
[GR(DB_0)] = {{BP_ASTR, MOD_LSFT}, {BP_RPRN, MOD_NONE}},
[GR(DB_GRV)] = {{BP_PERC, MOD_LSFT}, {BP_K, MOD_BIT(KC_RALT)}},
[GR(DB_SCOLON)] = {{BP_COMM, MOD_LSFT}, {BP_DOT, MOD_LSFT}},
[GR(DB_SLASH)] = {{BP_SLASH, MOD_NONE}, {BP_APOS, MOD_LSFT}},
[GR(DB_BACKSLASH)] = {{BP_AGRV, MOD_BIT(KC_RALT)}, {BP_B, MOD_BIT(KC_RALT)}},
[GR(DB_EQL)] = {{BP_EQL, MOD_NONE}, {BP_PLUS, MOD_NONE}},
[GR(DB_COMM)] = {{BP_COMMA, MOD_NONE}, {BP_LGIL, MOD_BIT(KC_RALT)}},
[GR(DB_DOT)] = {{BP_DOT, MOD_NONE}, {BP_RGIL, MOD_BIT(KC_RALT)}},
[GR(DB_QUOT)] = {{BP_APOS, MOD_NONE}, {BP_DQOT, MOD_NONE}},
[GR(DB_MINUS)] = {{BP_MINUS, MOD_NONE}, {KC_SPC, MOD_BIT(KC_RALT)}},
[GR(DB_LPRN)] = {{BP_LPRN, MOD_NONE}, {BP_LPRN, MOD_BIT(KC_RALT)}},
[GR(DB_RPRN)] = {{BP_RPRN, MOD_NONE}, {BP_RPRN, MOD_BIT(KC_RALT)}},
[GR(DB_LBRC)] = {{BP_Y, MOD_BIT(KC_RALT)}, {BP_LPRN, MOD_BIT(KC_RALT)}},
[GR(DB_RBRC)] = {{BP_X, MOD_BIT(KC_RALT)}, {BP_RPRN, MOD_BIT(KC_RALT)}},
// For the symbol layer
[GR(DB_HASH)] = {{BP_DLR, MOD_LSFT}, {BP_DLR, MOD_LSFT}},
[GR(DB_LCBR)] = {{BP_LPRN, MOD_BIT(KC_RALT)}, {BP_LPRN, MOD_BIT(KC_RALT)}},
[GR(DB_RCBR)] = {{BP_LPRN, MOD_BIT(KC_RALT)}, {BP_RPRN, MOD_BIT(KC_RALT)}},
[GR(DB_PIPE)] = {{BP_B, MOD_BIT(KC_RALT)}, {BP_B, MOD_BIT(KC_RALT)}},
[GR(DB_TILD)] = {{BP_K, MOD_BIT(KC_RALT)}, {BP_K, MOD_BIT(KC_RALT)}},
[GR(DB_CIRC)] = {{BP_AT, MOD_BIT(KC_RALT)}, {BP_AT, MOD_BIT(KC_RALT)}},
[GR(DB_LESS)] = {{BP_LGIL, MOD_BIT(KC_RALT)}, {BP_LGIL, MOD_BIT(KC_RALT)}},
[GR(DB_GRTR)] = {{BP_RGIL, MOD_BIT(KC_RALT)}, {BP_RGIL, MOD_BIT(KC_RALT)}},
};
uint8_t gr(uint8_t kc){
return (kc - SAFE_RANGE);
}
// send the right keycode for the right mod.
// remove the mods we are taking care of,
// send our keycodes then restore them.
// all so we can make dvorak keys from bepo keycodes.
void send_keycode(uint8_t kc){
uint8_t tmp_mods = get_mods();
bool is_shifted = ( tmp_mods & (MOD_BIT(KC_LSFT)|MOD_BIT(KC_RSFT)) );
//uint8_t key[2][2] = key_translations[GR(kc)];
// need to turn of the shift if it is on.
unregister_mods((MOD_BIT(KC_LSFT)|MOD_BIT(KC_RSFT)));
if(is_shifted){
register_mods(SHIFTED_MODS(kc));
register_code(SHIFTED_KEY(kc));
unregister_code(SHIFTED_KEY(kc));
unregister_mods(SHIFTED_MODS(kc));
} else{
register_mods(UNSHIFTED_MODS(kc));
register_code(UNSHIFTED_KEY(kc));
unregister_code(UNSHIFTED_KEY(kc));
unregister_mods(UNSHIFTED_MODS(kc));
}
clear_mods();
register_mods(tmp_mods);
}
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
// If console is enabled, it will print the matrix position and status of each key pressed
#ifdef KEYLOGGER_ENABLE
xprintf("KL: row: %u, column: %u, pressed: %u\n", record->event.key.col, record->event.key.row, record->event.pressed);
#endif //KEYLOGGER_ENABLE
// still dont know how to make #&_ And RALT is not ALTGR, That isn't working in the bepo keyboard
// either. No {} either probably for the same reasons. ALtGR is the key to some of these.
switch (keycode) {
// Handle the key translations for Dvorak on bepo. It's best if these are the first
// enums after SAFE_RANGE.
case DB_1:
case DB_2:
case DB_3:
case DB_4:
case DB_5:
case DB_6:
case DB_7:
case DB_8:
case DB_9:
case DB_0:
case DB_GRV:
case DB_SCOLON:
case DB_SLASH:
case DB_BACKSLASH:
case DB_EQL:
case DB_DOT:
case DB_COMM:
case DB_QUOT:
case DB_MINUS:
case DB_LPRN:
case DB_RPRN:
case DB_LBRC:
case DB_RBRC:
if(record->event.pressed)
send_keycode(keycode);
unregister_code(keycode);
break;
case KC_QWERTY:
if (record->event.pressed) {
set_single_persistent_default_layer(QWERTY);
}
return false;
break;
case KC_COLEMAK:
if (record->event.pressed) {
set_single_persistent_default_layer(COLEMAK);
}
return false;
break;
case KC_DVORAK:
if (record->event.pressed) {
set_single_persistent_default_layer(DVORAK);
}
return false;
break;
case KC_WORKMAN:
if (record->event.pressed) {
set_single_persistent_default_layer(WORKMAN);
}
return false;
break;
case KC_MAKE: // Compiles the firmware, and adds the flash command based on keyboard bootloader
if (!record->event.pressed) {
SEND_STRING("make " QMK_KEYBOARD ":" QMK_KEYMAP
#if (defined(BOOTLOADER_DFU) || defined(BOOTLOADER_LUFA_DFU) || defined(BOOTLOADER_QMK_DFU))
":dfu"
#elif defined(BOOTLOADER_HALFKAY)
":teensy"
#elif defined(BOOTLOADER_CATERINA)
":avrdude"
#endif // bootloader options
SS_TAP(X_ENTER));
}
return false;
break;
case KC_RESET: // Custom RESET code
if (!record->event.pressed) {
reset_keyboard();
}
return false;
break;
case EPRM: // Resets EEPROM
if (record->event.pressed) {
eeconfig_init();
default_layer_set(1UL<<eeconfig_read_default_layer());
layer_state_set(layer_state);
}
return false;
break;
case VRSN: // Prints firmware version
if (record->event.pressed) {
SEND_STRING(QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION ", Built on: " QMK_BUILDDATE);
}
return false;
break;
/* Code has been depreciated
case KC_SECRET_1 ... KC_SECRET_5: // Secrets! Externally defined strings, not stored in repo
if (!record->event.pressed) {
clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
send_string(decoy_secret[keycode - KC_SECRET_1]);
}
return false;
break;
*/
// These are a serious of gaming macros.
// Only enables for the viterbi, basically,
// to save on firmware space, since it's limited.
#ifdef MACROS_ENABLED
case KC_OVERWATCH: // Toggle's if we hit "ENTER" or "BACKSPACE" to input macros
if (record->event.pressed) { userspace_config.is_overwatch ^= 1; eeprom_update_byte(EECONFIG_USERSPACE, userspace_config.raw); }
return false; break;
#endif // MACROS_ENABLED
case KC_CCCV: // One key copy/paste
if(record->event.pressed){
copy_paste_timer = timer_read();
} else {
if (timer_elapsed(copy_paste_timer) > TAPPING_TERM) { // Hold, copy
register_code(KC_LCTL);
tap(KC_C);
unregister_code(KC_LCTL);
#ifdef AUDIO_ENABLE
PLAY_SONG(tone_copy);
#endif
} else { // Tap, paste
register_code(KC_LCTL);
tap(KC_V);
unregister_code(KC_LCTL);
#ifdef AUDIO_ENABLE
PLAY_SONG(tone_paste);
#endif
}
}
return false;
break;
case CLICKY_TOGGLE:
#ifdef AUDIO_CLICKY
userspace_config.clicky_enable = clicky_enable;
eeprom_update_byte(EECONFIG_USERSPACE, userspace_config.raw);
#endif
break;
#ifdef UNICODE_ENABLE
case UC_FLIP: // (╯°□°)╯ ︵ ┻━┻
if (record->event.pressed) {
register_code(KC_RSFT);
tap(KC_9);
unregister_code(KC_RSFT);
process_unicode((0x256F | QK_UNICODE), record); // Arm
process_unicode((0x00B0 | QK_UNICODE), record); // Eye
process_unicode((0x25A1 | QK_UNICODE), record); // Mouth
process_unicode((0x00B0 | QK_UNICODE), record); // Eye
register_code(KC_RSFT);
tap(KC_0);
unregister_code(KC_RSFT);
process_unicode((0x256F | QK_UNICODE), record); // Arm
tap(KC_SPC);
process_unicode((0x0361 | QK_UNICODE), record); // Flippy
tap(KC_SPC);
process_unicode((0x253B | QK_UNICODE), record); // Table
process_unicode((0x2501 | QK_UNICODE), record); // Table
process_unicode((0x253B | QK_UNICODE), record); // Table
}
return false;
break;
#endif // UNICODE_ENABLE
}
return true;
// return process_record_keymap(keycode, record) && process_record_secrets(keycode, record);
}
void tap_dance_mouse_btns (qk_tap_dance_state_t *state, void *user_data) {
switch(state->count){
case 1:
register_code(KC_BTN1);
break;
case 2:
register_code(KC_BTN2);
break;
case 3:
register_code(KC_BTN3);
break;
case 4:
register_code(KC_BTN4);
break;
case 5:
register_code(KC_BTN5);
break;
default:
break;
}
reset_tap_dance(state);
}
// counting on all the qwerty layers to be less than dvorak_on_bepo
int on_qwerty(){
uint8_t deflayer = (biton32(default_layer_state));
return (deflayer < DVORAK_ON_BEPO);
}
void tap_dance_df_bepo_layers_switch (qk_tap_dance_state_t *state, void *user_data) {
switch(state->count){
case 1:
switch_default_layer(DVORAK_ON_BEPO);
break;
case 2:
switch_default_layer(BEPO);
break;
case 3:
layer_invert(LAYERS);
break;
default:
break;
}
reset_tap_dance(state);
}
void tap_dance_layer_switch (qk_tap_dance_state_t *state, void *user_data) {
switch(state->count){
case 1:
if(on_qwerty())
layer_invert(SYMB);
else
layer_invert(SYMB_ON_BEPO);
break;
case 2:
layer_invert(MDIA);
break;
case 3:
layer_invert(LAYERS);
default:
break;
}
reset_tap_dance(state);
}
void tap_dance_default_layer_switch (qk_tap_dance_state_t *state, void *user_data) {
switch(state->count){
case 1:
switch_default_layer(DVORAK);
break;
case 2:
switch_default_layer(DVORAK_ON_BEPO);
break;
case 3:
switch_default_layer(BEPO);
break;
default:
break;
}
reset_tap_dance(state);
}
// switch the default layer to another qwerty based layer.
void switch_default_layer_on_qwerty(int count) {
switch(count){
case 1:
switch_default_layer(DVORAK);
break;
case 2:
switch_default_layer(QWERTY);
break;
case 3:
switch_default_layer(COLEMAK);
break;
case 4:
switch_default_layer(WORKMAN);
break;
case 5:
switch_default_layer(NORMAN);
break;
default:
switch_default_layer(DVORAK);
break;
}
}
// switch the default layer to another bepo based layer.
void switch_default_layer_on_bepo(int count) {
switch(count){
case 1:
switch_default_layer(DVORAK_ON_BEPO);
break;
case 2:
switch_default_layer(BEPO);
break;
default:
switch_default_layer(DVORAK_ON_BEPO);
break;
}
}
// tap to change the default layer. Distinguishes between layers that are based on
// a qwerty software keyboard and a bepo software keyboard.
// if shifted, choose layers based on the other software keyboard, otherwise choose only
// layers that work on the current software keyboard.
void tap_dance_default_os_layer_switch (qk_tap_dance_state_t *state, void *user_data) {
//uint8_t shifted = (get_mods() & MOD_BIT(KC_LSFT|KC_RSFT));
bool shifted = ( keyboard_report->mods & (MOD_BIT(KC_LSFT)|MOD_BIT(KC_RSFT)) );
int qwerty = on_qwerty();
// shifted, choose between layers on the other software keyboard
if(shifted){
if (qwerty)
switch_default_layer_on_bepo(state->count);
else
switch_default_layer_on_qwerty(state->count);
// not shifted, choose between layers on the same software keyboard
} else {
if (qwerty)
switch_default_layer_on_qwerty(state->count);
else
switch_default_layer_on_bepo(state->count);
}
reset_tap_dance(state);
}
/* Return an integer that corresponds to what kind of tap dance should be executed.
*
* How to figure out tap dance state: interrupted and pressed.
*
* Interrupted: If the state of a dance dance is "interrupted", that means that another key has been hit
* under the tapping term. This is typically indicitive that you are trying to "tap" the key.
*
* Pressed: Whether or not the key is still being pressed. If this value is true, that means the tapping term
* has ended, but the key is still being pressed down. This generally means the key is being "held".
*
* One thing that is currenlty not possible with qmk software in regards to tap dance is to mimic the "permissive hold"
* feature. In general, advanced tap dances do not work well if they are used with commonly typed letters.
* For example "A". Tap dances are best used on non-letter keys that are not hit while typing letters.
*
* Good places to put an advanced tap dance:
* z,q,x,j,k,v,b, any function key, home/end, comma, semi-colon
*
* Criteria for "good placement" of a tap dance key:
* Not a key that is hit frequently in a sentence
* Not a key that is used frequently to double tap, for example 'tab' is often double tapped in a terminal, or
* in a web form. So 'tab' would be a poor choice for a tap dance.
* Letters used in common words as a double. For example 'p' in 'pepper'. If a tap dance function existed on the
* letter 'p', the word 'pepper' would be quite frustating to type.
*
* For the third point, there does exist the 'DOUBLE_SINGLE_TAP', however this is not fully tested
*
*/
int cur_dance (qk_tap_dance_state_t *state) {
if (state->count == 1) {
if (state->interrupted || !state->pressed) return SINGLE_TAP;
//key has not been interrupted, but they key is still held. Means you want to send a 'HOLD'.
else return SINGLE_HOLD;
}
else if (state->count == 2) {
/*
* DOUBLE_SINGLE_TAP is to distinguish between typing "pepper", and actually wanting a double tap
* action when hitting 'pp'. Suggested use case for this return value is when you want to send two
* keystrokes of the key, and not the 'double tap' action/macro.
*/
if (state->interrupted) return DOUBLE_SINGLE_TAP;
else if (state->pressed) return DOUBLE_HOLD;
else return DOUBLE_TAP;
}
//Assumes no one is trying to type the same letter three times (at least not quickly).
//If your tap dance key is 'KC_W', and you want to type "www." quickly - then you will need to add
//an exception here to return a 'TRIPLE_SINGLE_TAP', and define that enum just like 'DOUBLE_SINGLE_TAP'
if (state->count == 3) {
if (state->interrupted || !state->pressed) return TRIPLE_TAP;
else return TRIPLE_HOLD;
}
else return 8; //magic number. At some point this method will expand to work for more presses
}
//instanalize an instance of 'tap' for the 'x' tap dance.
static tdtap xtap_state = {
.is_press_action = true,
.state = 0
};
/*
This so I can have a single key that acts like LGUI in DVORAK no
matter which keymap is my current default.
It also allows for the
shift gui and ctl gui, on the same key, So the same key is Escape,
and the mostcommon modifiers in my xmonad control keymap, while also
insuring that dvorak is active for the xmonad command key
Single tap = ESC
tap and hold = dvorak with L_GUI
double tap = One shot dvorak layer with LSFT LGUI mods
double hold = dvorak with LCTL LGUI
double single tap = esc.
*/
int get_xmonad_layer(){
int qwerty = on_qwerty();
if (qwerty)
return(XMONAD);
else
return(XMONAD_FR);
}
void x_finished (qk_tap_dance_state_t *state, void *user_data) {
int xmonad_layer = get_xmonad_layer();
xtap_state.state = cur_dance(state);
switch (xtap_state.state) {
case SINGLE_TAP:
register_code(KC_ESC);
break;
case SINGLE_HOLD:
layer_on(xmonad_layer);
set_oneshot_mods (MOD_LGUI);
//set_oneshot_layer (DVORAK, ONESHOT_START);
break;
case DOUBLE_TAP:
set_oneshot_mods ((MOD_LCTL | MOD_LGUI));
layer_on (xmonad_layer);
set_oneshot_layer (xmonad_layer, ONESHOT_START);
break;
case DOUBLE_HOLD:
set_oneshot_mods (MOD_LSFT | MOD_LGUI);
if (xmonad_layer != -1)
layer_on(xmonad_layer);
break;
case DOUBLE_SINGLE_TAP:
register_code(KC_ESC);
unregister_code(KC_ESC);
register_code(KC_ESC);
//Last case is for fast typing. Assuming your key is `f`:
//For example, when typing the word `buffer`, and you want to make sure that you send `ff` and not `Esc`.
//In order to type `ff` when typing fast, the next character will have to be hit within the `TAPPING_TERM`, which by default is 200ms.
}
}
void x_reset (qk_tap_dance_state_t *state, void *user_data) {
int xmonad_layer = get_xmonad_layer();
switch (xtap_state.state) {
case SINGLE_TAP:
unregister_code(KC_ESC);
break;
case SINGLE_HOLD:
layer_off(xmonad_layer);
break;
case DOUBLE_TAP:
set_oneshot_layer (xmonad_layer, ONESHOT_PRESSED);
break;
case DOUBLE_HOLD:
layer_off(xmonad_layer);
break;
case DOUBLE_SINGLE_TAP:
unregister_code(KC_ESC);
}
xtap_state.state = 0;
}
//Tap Dance Definitions
qk_tap_dance_action_t tap_dance_actions[] = {
//Tap once for Esc, twice for Caps Lock
[TD_ESC_CAPS] = ACTION_TAP_DANCE_DOUBLE(KC_ESC, KC_CAPS),
[TD_TAB_BKTAB] = ACTION_TAP_DANCE_DOUBLE(KC_TAB, LSFT(KC_TAB)),
[TD_MDIA_SYMB] = ACTION_TAP_DANCE_FN(tap_dance_layer_switch),
[TD_DVORAK_BEPO] = ACTION_TAP_DANCE_FN(tap_dance_df_bepo_layers_switch),
[TD_DEF_LAYER_SW] = ACTION_TAP_DANCE_FN(tap_dance_default_layer_switch),
[TD_DEF_OS_LAYER_SW] = ACTION_TAP_DANCE_FN(tap_dance_default_os_layer_switch),
[TD_HOME_END] = ACTION_TAP_DANCE_DOUBLE(KC_HOME, KC_END),
[TD_XMONAD_ESC] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, x_finished, x_reset),
[TD_MOUSE_BTNS] = ACTION_TAP_DANCE_FN(tap_dance_mouse_btns)
};

@ -1,429 +0,0 @@
/*
Copyright 2018 Eric Gebhart <e.a.gebhart@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/>.
*/
#include QMK_KEYBOARD_H
#ifndef ericgebhart
#define ericgebhart
#include "quantum.h"
#include "process_keycode/process_tap_dance.h"
void tap(uint16_t keycode);
bool process_record_secrets(uint16_t keycode, keyrecord_t *record);
#define EECONFIG_USERSPACE (uint8_t *)19
typedef union {
uint8_t raw;
struct {
bool clicky_enable :1;
bool rgb_layer_change :1;
bool is_overwatch :1;
bool nuke_switch :1;
};
} userspace_config_t;
#define ___ KC_TRNS
#define XXX KC_NO
// The most portable copy/paste keys (windows (mostly), linux, and some terminal emulators).
#define MK_CUT LSFT(KC_DEL) // shift + delete
#define MK_COPY LCTL(KC_INS) // ctrl + insert
#define MK_PASTE LSFT(KC_INS) // shift + insert
#define DVORAK 0 // dvorak layout (default)
#define QWERTY 1
#define COLEMAK 2
#define WORKMAN 3
#define NORMAN 4
// bepo layers
#define DVORAK_ON_BEPO 6 // dvorak layout (default)
#define BEPO 7 // Bepo
// non-default layers
#define SYMB 8 // symbols and numbers
#define SYMB_ON_BEPO 9 // symbols and numbers
#define MDIA 10 // mouse knd media eys
#define LAYERS 11 // layers and right mousekeys.
#define XMONAD 12 // xmonad ie. dvorak.
#define XMONAD_FR 13 // xmonad ie. dvorak.
// for the creation of dvorak keys on an Bepo keyboard at the OS layer.
// so we can create an array of reasonable size
// for our translation keys. We have to create a
// good range of numbers
#define GR(x) (x-SAFE_RANGE)
uint8_t gr(uint8_t);
void send_keycode(uint8_t);
#define MOD_NONE 0x00
// indexs for the keycode translation table.
#define UNSHIFTED_KEY(key) key_translations[gr(key)][0][0]
#define UNSHIFTED_MODS(key) key_translations[gr(key)][0][1]
#define SHIFTED_KEY(key) key_translations[gr(key)][1][0]
#define SHIFTED_MODS(key) key_translations[gr(key)][1][1]
enum userspace_custom_keycodes {
// keep the keycodes using the send_key function close to SAFE_RANGE
// so the array of keycodes remains a reasonbale size.
DB_1 = SAFE_RANGE, // can always be here
DB_2,
DB_3,
DB_4,
DB_5,
DB_6,
DB_7,
DB_8,
DB_9,
DB_0,
DB_GRV,
DB_SCOLON,
DB_SLASH,
DB_BACKSLASH,
DB_EQL,
DB_DOT,
DB_COMM,
DB_QUOT,
DB_MINUS,
DB_RPRN,
DB_LPRN,
DB_RBRC,
DB_LBRC,
// for symbols layer
DB_HASH,
DB_LCBR,
DB_RCBR,
DB_PIPE,
DB_TILD,
DB_CIRC,
DB_LESS,
DB_GRTR,
// End of dvorak on bepo translation keys.
EPRM,
VRSN,
KC_DVORAK_ON_BEPO,
KC_BEPO,
KC_NORMAN,
KC_QWERTY,
KC_COLEMAK,
KC_DVORAK,
KC_WORKMAN,
KC_MAKE,
KC_RESET,
KC_RGB_T,
KC_SECRET_1,
KC_SECRET_2,
KC_SECRET_3,
KC_SECRET_4,
KC_SECRET_5,
KC_CCCV
};
#define SFTGUI_T(kc) { MT(MOD_LGUI | MOD_LSFT, kc) }
#define SFT_GUI_ESC MT(MOD_LSFT | MOD_LGUI, KC_PGDN) // shift LGUI or Escape.
#define ALT_ENT ALT_T(KC_ENT) // Alt or enter
#define CTL_SPC CTL_T(KC_SPC) // ctrl or space
#define CTL_BSPC CTL_T(KC_BSPC) // ctrl or backspace
#define ALT_DEL ALT_T(KC_DEL) // Alt or delete
#define GUI_ESC GUI_T(KC_ESC) // Gui or escape
#define ALGR_SYMB ALGR_T(TG(SYMB)) // Alt gre or toggle symbol layer
#define KC_SFT_T_U SFT_T(KC_U)
#define KC_SFT_T_H SFT_T(KC_H)
#define KC_LT_SYMB_I LT(SYMB, KC_I)
#define KC_LT_SYMB_D LT(SYMB, KC_D)
// for dvorak on bepo
#define BP_SFT_T_U SFT_T(BP_U)
#define BP_SFT_T_H SFT_T(BP_H)
#define BP_LT_SYMB_D LT(SYMB, BP_D)
// for bepo on bepo
#define BP_SFT_T_T SFT_T(BP_T)
#define BP_LT_SYMB_C LT(SYMB_ON_BEPO, BP_C)
#define BP_LT_SYMB_I LT(SYMB_ON_BEPO, BP_I)
#define BP_SFT_T_E SFT_T(BP_E)
#define BP_SFT_T_ECRC SFT_T(BP_ECRC)
#define BP_SFT_T_CCED SFT_T(BP_CCED)
#define BP_LT_SYMB_COMM LT(SYMB,BP_COMM)
// OSM keycodes, to keep things clean and easy to change
#define KC_MLSF OSM(MOD_LSFT)
#define KC_MRSF OSM(MOD_RSFT)
#define OS_LGUI OSM(MOD_LGUI)
#define OS_RGUI OSM(MOD_RGUI)
#define OS_LSFT OSM(MOD_LSFT)
#define OS_RSFT OSM(MOD_RSFT)
#define OS_LCTL OSM(MOD_LCTL)
#define OS_RCTL OSM(MOD_RCTL)
#define OS_LALT OSM(MOD_LALT)
#define OS_RALT OSM(MOD_RALT)
#define ALT_APP ALT_T(KC_APP)
#define MG_NKRO MAGIC_TOGGLE_NKRO
//// TAP DANCE
typedef struct {
bool is_press_action;
int state;
} tdtap;
enum {
SINGLE_TAP = 1,
SINGLE_HOLD = 2,
DOUBLE_TAP = 3,
DOUBLE_HOLD = 4,
DOUBLE_SINGLE_TAP = 5, //send two single taps
TRIPLE_TAP = 6,
TRIPLE_HOLD = 7
};
//Tap Dance Declarations
enum {
TD_ESC_CAPS = 0,
TD_TAB_BKTAB = 1,
TD_MDIA_SYMB = 2,
TD_HOME_END = 3,
TD_XMONAD_ESC = 4,
TD_DEF_LAYER_SW = 5,
TD_DEF_OS_LAYER_SW = 6,
TD_MOUSE_BTNS = 7,
TD_DVORAK_BEPO = 8
};
// Tap dance
#define TAB_BKTAB TD(TD_TAB_BKTAB) // Tab or backtab tapdance.
#define MDIA_SYMB TD(TD_MDIA_SYMB) // MDIA or Symb layer tapdance toggle.
#define DEF_LAYER_SW TD(TD_DEF_LAYER_SW) // dvorak, dvorak_on_bepo, bepo default layer
#define DEF_OS_LAYER_SW TD(TD_DEF_OS_LAYER_SW) // dvorak, dvorak_on_bepo, bepo default layer
#define HOME_END TD(TD_HOME_END) // home or end tapdance.
#define XMONAD_ESC TD(TD_XMONAD_ESC) // Escape, dvorak, media or symb. - tap and hold tap dance. 1-4
#define DVORAK_ET_BEPO TD(TD_DVORAK_BEPO) // Escape, dvorak, media or symb. - tap and hold tap dance. 1-4
#define TDMOUSE_BTNS TD(TD_MOUSE_BTNS) // hmmm. 1-5
int on_qwerty(void);
int get_xmonad_layer(void);
int cur_dance (qk_tap_dance_state_t *state);
//for the x tap dance. Put it here so it can be used in any keymap
void x_finished (qk_tap_dance_state_t *state, void *user_data);
void x_reset (qk_tap_dance_state_t *state, void *user_data);
// Blocks for each of the four major keyboard layouts
// Organized so we can quickly adapt and modify all of them
// at once, rather than for each keyboard, one at a time.
// And this allows for much cleaner blocks in the keymaps.
// For instance Tap/Hold for Control on all of the layouts
// NOTE: These are all the same length. If you do a search/replace
// then you need to add/remove underscores to keep the
// lengths consistent.
// Since our quirky block definitions are basically a list of comma separated
// arguments, we need a wrapper in order for these definitions to be
// expanded before being used as arguments to the LAYOUT_xxx macro.
#if (!defined(LAYOUT) && defined(KEYMAP))
#define LAYOUT KEYMAP
#endif
#define LAYOUT_ergodox_wrapper(...) LAYOUT_ergodox(__VA_ARGS__)
#define LAYOUT_ergodox_pretty_wrapper(...) LAYOUT_ergodox_pretty(__VA_ARGS__)
#define KEYMAP_wrapper(...) LAYOUT(__VA_ARGS__)
#define LAYOUT_wrapper(...) LAYOUT(__VA_ARGS__)
//Dvorak on a qwerty software layer in the OS
#define ___DVORAK_L1___ KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y
#define ___DVORAK_L2___ KC_A, KC_O, KC_E, KC_SFT_T_U, KC_LT_SYMB_I
#define ___DVORAK_L3___ KC_SCLN, KC_Q, KC_J, KC_K, KC_X
#define ___DVORAK_R1___ KC_F, KC_G, KC_C, KC_R, KC_L
#define ___DVORAK_R2___ KC_LT_SYMB_D, KC_SFT_T_H, KC_T, KC_N, KC_S
#define ___DVORAK_R3___ KC_B, KC_M, KC_W, KC_V, KC_Z
// Dvorak on fr-bepo software layer in the OS.
// for dvorak and all the other qwerty like keyboards on bepo
#define ___NUMBER_BEPO_L___ DB_1, DB_2, DB_3, DB_4, DB_5
#define ___NUMBER_BEPO_R___ DB_6, DB_7, DB_8, DB_9, DB_0
#define ___DVORAK_FR_L1___ DB_QUOT, DB_COMM, DB_DOT, BP_P, BP_Y
#define ___DVORAK_FR_L2___ BP_A, BP_O, BP_E, BP_SFT_T_U, BP_LT_SYMB_I
#define ___DVORAK_FR_L3___ DB_SCOLON, BP_Q, BP_J, BP_K, BP_X
#define ___DVORAK_FR_R1___ BP_F, BP_G, BP_C, BP_R, BP_L
#define ___DVORAK_FR_R2___ BP_LT_SYMB_D, BP_SFT_T_H, BP_T, BP_N, BP_S
#define ___DVORAK_FR_R3___ BP_B, BP_M, BP_W, BP_V, BP_Z
// Bepo on fr-bepo software layer
// for bepo on bepo
#define ___SYMBOL_BEPO_L___ /* BP_DLR */ BP_DQOT, BP_LGIL, BP_RGIL, BP_LPRN, BP_RPRN
#define ___SYMBOL_BEPO_R___ BP_AT, BP_PLUS, BP_MINS, BP_SLASH, BP_ASTR /* BP_EQL, BP_PERC */
#define ___BEPO_FR_L1___ BP_B, BP_ECUT, BP_P, BP_O, BP_EGRV
#define ___BEPO_FR_L2___ BP_A, BP_U, BP_I, BP_SFT_T_E, BP_LT_SYMB_COMM
#define ___BEPO_FR_L3___ /*BP_ECRC*/ BP_AGRV, BP_Y, BP_X, BP_DOT, BP_K
#define ___BEPO_FR_R1___ /* BP_DCRC*/ BP_V, BP_D, BP_L, BP_J, BP_Z //, BP_W
#define ___BEPO_FR_R2___ /* BP_C */ BP_SFT_T_T, BP_S, BP_R, BP_N, BP_M //BP_CCED
#define ___BEPO_FR_R3___ BP_APOS, BP_Q, BP_G, BP_H, BP_F
// the bottom rows for keyboards on bepo.
#define ___ERGODOX_BOTTOM_RIGHT_FR___ KC_UP, KC_DOWN, DB_BACKSLASH, LCTL(BP_V), LCTL(BP_C)
#define ___ERGODOX_BOTTOM_LEFT_FR___ LCTL(BP_C), LCTL(BP_V), KC_INS, KC_LEFT, KC_RIGHT
// Since we have 7 default layouts (QWERTY, DVORAK, COLEMAK and WORKMAN, NORMAN,
// 2 of them based on a Bepo software keyboard, --- DVORAK_ON_BEPO and BEPO),
// this allows us to quickly modify the bottom row for all of the layouts
// so we don't have to alter it 4 times and hope that we haven't missed
// anything
#define ___ERGODOX_BOTTOM_LEFT___ LCTL(KC_C), LCTL(KC_V), KC_INS, KC_LEFT, KC_RIGHT
#define ___ERGODOX_BOTTOM_RIGHT___ KC_UP, KC_DOWN, KC_BSLASH, LCTL(KC_V), LCTL(KC_C)
#define ___ERGODOX_THUMB_LEFT___ \
KC_RALT, ALGR_SYMB, \
HOME_END, \
CTL_BSPC, ALT_DEL, XMONAD_ESC
#define ___ERGODOX_THUMB_RIGHT___ \
ALGR_SYMB, TD_MOUSE_BTNS, \
KC_PGUP, \
KC_PGDN, ALT_ENT, CTL_SPC
#define ___ERGODOX_TRANS_THUMBS___ \
___, ___, \
___, \
___, ___, ___ \
#define ___ERGODOX_TRANS_BOTTOM___ \
___,___,___,___,___
#define ___ERGODOX_TRANS_6_ROW___ \
___,___,___,___,___,___
// Qwerty based layers that I don't really use.
#define ___QWERTY_L1___ KC_Q, KC_W, KC_E, KC_R, KC_T
#define ___QWERTY_L2___ KC_A, KC_S, KC_D, KC_F, KC_G
#define ___QWERTY_L3___ KC_Z, KC_X, KC_C, KC_V, KC_B
#define ___QWERTY_R1___ KC_Y, KC_U, KC_I, KC_O, KC_P
#define ___QWERTY_R2___ KC_H, KC_J, KC_K, KC_L, KC_SCLN
#define ___QWERTY_R3___ KC_N, KC_M, KC_COMM, KC_DOT, KC_SLASH
#define ___COLEMAK_L1___ KC_Q, KC_W, KC_F, KC_P, KC_G
#define ___COLEMAK_L2___ KC_A, KC_R, KC_S, KC_T, KC_D
#define ___COLEMAK_L3___ KC_Z, KC_X, KC_C, KC_V, KC_B
#define ___COLEMAK_R1___ KC_J, KC_L, KC_U, KC_Y, KC_SCLN
#define ___COLEMAK_R2___ KC_H, KC_N, KC_E, KC_I, KC_O
#define ___COLEMAK_R3___ KC_K, KC_M, KC_COMM, KC_DOT, KC_SLASH
#define ___COLEMAK_MOD_DH_L1___ KC_Q, KC_W, KC_F, KC_P, KC_B
#define ___COLEMAK_MOD_DH_L2___ KC_A, KC_R, KC_S, KC_T, KC_G
#define ___COLEMAK_MOD_DH_L3___ CTL_T(KC_Z), KC_X, KC_C, KC_D, KC_V
#define ___COLEMAK_MOD_DH_R1___ KC_J, KC_L, KC_U, KC_Y, KC_SCLN
#define ___COLEMAK_MOD_DH_R2___ KC_M, KC_N, KC_E, KC_I, KC_O
#define ___COLEMAK_MOD_DH_R3___ KC_K, KC_H, KC_COMM, KC_DOT, KC_SLASH
#define ___WORKMAN_L1___ KC_Q, KC_D, KC_R, KC_W, KC_B
#define ___WORKMAN_L2___ KC_A, KC_S, KC_H, KC_T, KC_G
#define ___WORKMAN_L3___ KC_Z, KC_X, KC_M, KC_C, KC_V
#define ___WORKMAN_R1___ KC_J, KC_F, KC_U, KC_P, KC_SCLN
#define ___WORKMAN_R2___ KC_Y, KC_N, KC_E, KC_O, KC_I
#define ___WORKMAN_R3___ KC_K, KC_L, KC_COMM, KC_DOT, KC_SLASH
#define ___NORMAN_L1___ KC_Q, KC_W, KC_D, KC_F, KC_K
#define ___NORMAN_L2___ KC_A, KC_S, KC_E, KC_T, KC_G
#define ___NORMAN_L3___ KC_Z, KC_X, KC_C, KC_V, KC_B
#define ___NORMAN_R1___ KC_J, KC_U, KC_R, KC_L, KC_SCLN
#define ___NORMAN_R2___ KC_Y, KC_N, KC_I, KC_O, KC_U
#define ___NORMAN_R3___ KC_P, KC_M, KC_COMM, KC_DOT, KC_SLASH
// For the top rows. Numbers for most things, symbols for Bepo.
// for everything on qwerty.
#define ___NUMBER_L___ KC_1, KC_2, KC_3, KC_4, KC_5
#define ___NUMBER_R___ KC_6, KC_7, KC_8, KC_9, KC_0
// function key rows, works for everyone.
#define ___FUNC_L___ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5
#define ___FUNC_R___ KC_F6, KC_F7, KC_F8, KC_F9, KC_F10
// Rows for the auxillary layers.
// The symbol layer is for qwerty. I need another one for Bepo...
// the KC_P? codes don't work for me. I don't use those shifted values anyway.
#define ___KEYPAD_1___ KC_7, KC_8, KC_9, KC_PSLS
#define ___KEYPAD_2___ KC_4, KC_5, KC_6, KC_PAST
#define ___KEYPAD_3___ KC_1, KC_2, KC_3, KC_PMNS
#define ___KEYPAD_4___ KC_0, KC_DOT, KC_PEQL, KC_PPLS
#define ___KEYPAD_1_BP___ DB_7, DB_8, DB_9, BP_SLASH
#define ___KEYPAD_2_BP___ DB_4, DB_5, DB_6, BP_ASTR
#define ___KEYPAD_3_BP___ DB_1, DB_2, DB_3, DB_MINUS
#define ___KEYPAD_4_BP___ DB_0, DB_DOT, DB_EQL, BP_PLUS
#define ___SYMBOLS_1___ KC_EXLM, KC_AT, KC_LCBR, KC_RCBR, KC_PIPE
#define ___SYMBOLS_2___ KC_HASH, KC_DLR, KC_LPRN, KC_RPRN, KC_GRV
#define ___SYMBOLS_3___ KC_PERC, KC_CIRC, KC_LBRC, KC_RBRC, KC_TILD
#define ___SYMBOLS_1_BP___ KC_EXLM, BP_AT, DB_LCBR, DB_RCBR, DB_PIPE
#define ___SYMBOLS_2_BP___ DB_HASH, BP_DLR, DB_LPRN, DB_RPRN, DB_GRV
#define ___SYMBOLS_3_BP___ BP_PERC, DB_CIRC, DB_LBRC, DB_RBRC, DB_TILD
#define ___MOUSE_LDUR___ KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R
#define ___MWHEEL_LDUR___ KC_WH_L, KC_WH_D, KC_WH_U, KC_WH_R
#define ___MOUSE_BTNS_R___ KC_BTN1, KC_BTN2, KC_BTN3, KC_BTN4, KC_BTN5
#define ___MOUSE_BTNS_L___ KC_BTN5, KC_BTN4, KC_BTN3, KC_BTN2, KC_BTN1
#define ___MOUSE_ACCL_012___ KC_ACL0, KC_ACL1, KC_ACL2
#define ___MUTE_PLAY_STOP___ KC_MUTE, KC_MPLY, KC_MSTP
#define ___VI_ARROWS___ KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT
#define ___LAYERS_L1___ DF(BEPO), DF(DVORAK_ON_BEPO)
#define ___LAYERS_L2___ DF(COLEMAK), DF(DVORAK)
#define ___LAYERS_L3___ DF(QWERTY), DF(NORMAN), DF(WORKMAN)
#define ___LAYERS_L4___ TO(MDIA), TO(SYMB_ON_BEPO), TO(SYMB)
#endif

@ -1 +0,0 @@
teensy-loader-cli -mmcu=atmega32u4 -w $1

@ -1,124 +0,0 @@
Overview
========
This is my personal userspace. Most of my code exists here. I only have one keymap, and that
is for an ergodox_ez. There are a lot of layers, 7 of them are default layers. I primarily use
dvorak and Bepo. I've been using emacs in vi mode for over 23 years. I also us Xmonad as my
window manager, additionally I've been using a Kinesis advantage keyboard in dvorak for over 20
years. All of those things tend to color the layouts I have.
The Bepo layer needs some love. It is true to the layout at Bepo.fr, but I find it a little
cumbersome, and I miss some of my favorite keys.
There are 2 dvorak layers, one for a qwerty OS keyboard, and one for a Bepo OS keyboard.
There is a symbol/keypad layer for bepo and qwerty. And of course there is a mouse/media layer.
There are 2 Xmonad layers one for qwerty and one for Bepo. Layer selection happens automatically
based on your current default layer. I use 2 tap dance keys for layer selection.
There are also Qwerty, Colemak, Workman and Norman layers for qwerty.
Keyboard Layout Templates
-------------------------
I borrowed the idea for the keyboard defines and some of the definitions from @drashna.
I think it is an awesome idea, It makes consistency between layout definitions so much easier.
@drashna had this to say about it.
This borrows from @jola5's "Not quite neo" code. This allows me to maintain blocks of keymaps in the userspace, so that I can modify the userspace, and this is reflected in all of the keyboards that use it, at once.
This makes adding tap/hold mods, or other special keycodes or functions to all keyboards super easy, as it's done to all of them at once.
The caveat here is that the keymap needs a processor/wrapper, as it doesn't like the substitutions. However, this is as simple as just pushing it through a define. For instance:
`#define LAYOUT_ergodox_wrapper(...) LAYOUT_ergodox(__VA_ARGS__)`
Once that's been done and you've switched the keymaps to use the "wrapper", it will read the substitution blocks just fine.
Credit goes to @jola5 for first implementing this awesome idea.
Custom Keycodes
---------------
Keycodes are defined in the ericgebhart.h file and need to be included in the keymap.c files, so that they can be used there. The keymap.c file has very little in it, the most important thing to see there are the keys that are at the ends of each row, ie. the 1st and last key on each row is defined there.
Everything else is in ericgebhart.h.
Layer Indication
----------------
The ergodox_ez only has 3 leds, layer indication is pretty lame.
Currently the first led lights up if the default layer is not qwerty. The symbol and media layers get
the other 2 leds, and all the leds light up if you are on the "layers" layer.
I hope I can figure out how to make it better, but I just don't see a way with 3 leds and 11 layers.
BEPO vs Qwerty Layers
---------------------
There are 7 base layers. Dvorak, qwerty, Colemak, Workman, and Norman work on a Qwerty software layer on the OS. Dvorak_on_bepo and Bepo both work on a Bepo software layer on the os.
Dvorak on qwerty is the default. There is a function in ericgebhart.c which will allow the keyboard
to persist it's default layer through power down. It is currently commented out.
I don't actually use Qwerty, but it seemed like I should have it,
@drashna had it along with Colemak, Workman and Norman so I added them
to my existing dvorak and bepo definitions.
There are two tap dance functions that allow switching the default layers
and the overlay layers.
The default layers switch according to the current OS keyboard of the current Default layer.
Shifting the key, causes the selection to use the other OS keyboard selections. ie,
if you are on qwerty, you get dvorak, qwerty, colemak, workman and norman. If you shift it you get
dvorak on bepo and bepo. If you are not on qwerty the unshifted taps get dvorak and bepo on bepo.
The other tap dance for layers is for the symbol, mouse and layers layers. The layers layer is just a
safety layer, knowing I can get to if I screw something up...
XMonad
---------------------
Additionally there is an advanced tap dance called XMONAD_ESC. One tap is Escape, tap and hold is
LGUI with the proper XMONAD layer, it is essentially dvorak, for the
given OS layer. 2 taps is Shift lgui with xmonad, and 2 taps and hold
is Control LGUI with Xmonad. This allows for the finger patterns for
Xmonad to remain the same regarless of the keyboard in use. The hold
versions allow for secondary menu selection in Xmonad, the 2 tap function
must be for a key that is in the top level keymap of Xmonad. This is how
many people use xmonad so it's not a real problem. There are plenty of
keys combinations to choose from with these choices. The function can
be expanded to 3 taps and 3 tap and hold, and on and on....
I have a few other special keys, for momentary symbols or shift on the home row of each hand.
Also, after using a kinesis for many years I'm very accustomed to the
space, enter, backspace and delete keys on the thumbs. I've added control
and alt as a secondary function. These are also the Control and Alt keys
if held down.
Tap Dance
--------------------
Additionally there are other tap dance functions, tab-backtab, home-end as well as I few I'm not actually using.
Building and flashing
-----------------------
```make ergodox_z:ericgebhart``` will compile the code.
I use the teensy-loader cli so that's all I know. There is a script here called flash_ergodox
Use it like this,
```flash-ergodox <path to your hex file>```
then use a paperclip to push the reset button on your keyboard.
Switching the OS keyboard
-------------------------
This varies from system to system. I use Arch Linux, so I use ```setxkbmap```.
I've included a helper script which makes it easy to switch between EN and FR Bepo,
called switch-kbd.

@ -1,18 +0,0 @@
USER_NAME := ericgebhart
SRC += ericgebhart.c
MOUSEKEY_ENABLE = yes # Mouse keys
EXTRAKEY_ENABLE = yes # Audio control and System control
COMMAND_ENABLE = yes # Commands for debug and configuration
NKRO_ENABLE = yes # USB Nkey Rollover - for issues, see github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
SWAP_HANDS_ENABLE= yes # Allow swapping hands of keyboard
KEY_LOCK_ENABLE = yes # Enable the KC_LOCK key
TAP_DANCE_ENABLE = yes # Enable the tap dance feature.
CONSOLE_ENABLE = yes # Console for debug
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration
UNICODE_ENABLE = no
SLEEP_LED_ENABLE = no
API_SYSEX_ENABLE = no
RGBLIGHT_ENABLE = no
RGBLIGHT_ANIMATION = no

@ -1,74 +0,0 @@
#!/usr/bin/env zsh
# Switch the keyboard to en-us by default, bepo, or en-dvorak.
help(){
print 'switch-kbd - helper for setxkbmap'
print ' '
print 'Change the keyboard to en-us, fr-bepo, or en-dvorak.'
print 'Uses setxkbmap, so the change only affects the current'
print 'session. This mainly to avoid using a toggle key.'
print ' '
print ' -b Bepo'
print ' -d Dvorak'
print ' -n do not execute'
print ' -h help text.'
print ' '
print ' The default is to set the keyboard to en-us.'
exit
}
layout="-layout us"
variant=""
let "execute = 1"
let "verose = 0"
# $opt will hold the current option
local opt
while getopts bdnvh opt; do
# loop continues till options finished
# see which pattern $opt matches...
case $opt in
(b)
layout="-layout fr"
variant="-variant bepo"
;;
(d)
layout="-layout en"
variant="-variant dvorak"
;;
(n)
let "execute = 0"
;;
(v)
let "verbose = 1"
;;
(h)
help
;;
# matches a question mark
# (and nothing else, see text)
(\?)
print "Bad option:" $*
print " "
help
return 1
;;
esac
done
(( OPTIND > 1 )) && shift $(( OPTIND - 1 ))
##print Remaining arguments are: $*
mycommand='setxkbmap '${layout}' '${variant}
if [[ ( $verbose -ne 0 ) ]]; then;
print "setxkbmap Command:" $mycommand
fi
if [[ ( $execute -ne 0 ) ]]
then;
eval $mycommand
else;
print "did not execute"
fi

@ -1,410 +0,0 @@
#include "gordon.h"
#include "quantum.h"
#include "action.h"
#include "process_keycode/process_tap_dance.h"
#if (__has_include("secret.h"))
#include "secret.h"
#else
const char secret[][64] = {
"test1",
"test2",
"test3",
"test4",
"test5"
};
#endif
void register_hyper (void) { //Helper function to invoke Hyper
register_code (KC_LSFT);
register_code (KC_LCTL);
register_code (KC_LALT);
register_code (KC_LGUI);
}
void unregister_hyper (void) { //Helper function to invoke Hyper
unregister_code (KC_LSFT);
unregister_code (KC_LCTL);
unregister_code (KC_LALT);
unregister_code (KC_LGUI);
}
void register_ctrl_a (void) {
register_code(KC_LCTL);
register_code(KC_A);
}
void unregister_ctrl_a (void) {
unregister_code(KC_LCTL);
unregister_code(KC_A);
}
void register_alt_f7 (void) {
register_code (KC_LALT);
register_code (KC_F7);
}
void unregister_alt_f7 (void) {
unregister_code (KC_LALT);
unregister_code (KC_F7);
}
void register_shift_f6 (void) {
register_code (KC_LSFT);
register_code (KC_F6);
}
void unregister_shift_f6 (void) {
unregister_code (KC_LSFT);
unregister_code (KC_F6);
}
void register_ctrl_shift (void) {
register_code (KC_LSFT);
register_code (KC_LCTRL);
}
void unregister_ctrl_shift (void) {
unregister_code (KC_LSFT);
unregister_code (KC_LCTRL);
}
void register_alt_shift (void) {
register_code (KC_LSFT);
register_code (KC_LALT);
}
void unregister_alt_shift (void) {
unregister_code (KC_LSFT);
unregister_code (KC_LALT);
}
// To activate SINGLE_HOLD, you will need to hold for 200ms first.
// This tap dance favors keys that are used frequently in typing like 'f'
int cur_dance (qk_tap_dance_state_t *state) {
if (state->count == 1) {
//If count = 1, and it has been interrupted - it doesn't matter if it is pressed or not: Send SINGLE_TAP
if (state->interrupted) {
// if (!state->pressed) return SINGLE_TAP;
//need "permissive hold" here.
// else return SINsGLE_HOLD;
//If the interrupting key is released before the tap-dance key, then it is a single HOLD
//However, if the tap-dance key is released first, then it is a single TAP
//But how to get access to the state of the interrupting key????
return SINGLE_TAP;
}
else {
if (!state->pressed) return SINGLE_TAP;
else return SINGLE_HOLD;
}
}
//If count = 2, and it has been interrupted - assume that user is trying to type the letter associated
//with single tap.
else if (state->count == 2) {
if (state->interrupted) return DOUBLE_SINGLE_TAP;
else if (state->pressed) return DOUBLE_HOLD;
else return DOUBLE_TAP;
}
else if ((state->count == 3) && ((state->interrupted) || (!state->pressed))) return TRIPLE_TAP;
else if (state->count == 3) return TRIPLE_HOLD;
else return 8; //magic number. At some point this method will expand to work for more presses
}
//This works well if you want this key to work as a "fast modifier". It favors being held over being tapped.
int hold_cur_dance (qk_tap_dance_state_t *state) {
if (state->count == 1) {
if (state->interrupted) {
if (!state->pressed) return SINGLE_TAP;
else return SINGLE_HOLD;
}
else {
if (!state->pressed) return SINGLE_TAP;
else return SINGLE_HOLD;
}
}
//If count = 2, and it has been interrupted - assume that user is trying to type the letter associated
//with single tap.
else if (state->count == 2) {
if (state->pressed) return DOUBLE_HOLD;
else return DOUBLE_TAP;
}
else if (state->count == 3) {
if (!state->pressed) return TRIPLE_TAP;
else return TRIPLE_HOLD;
}
else return 8; //magic number. At some point this method will expand to work for more presses
}
static xtap htap_state = {
.is_press_action = true,
.state = 0
};
void h_finished (qk_tap_dance_state_t *state, void *user_data) {
htap_state.state = cur_dance(state);
switch (htap_state.state) {
case SINGLE_TAP: register_code(KC_H); break;
case SINGLE_HOLD: layer_on(8); register_code(KC_LALT); break;
case DOUBLE_TAP: layer_invert(8); register_code(KC_LALT); break;
// case DOUBLE_HOLD: register_code(KC_LALT);
case DOUBLE_SINGLE_TAP: register_code(KC_H);unregister_code(KC_H);register_code(KC_H);
}
}
void h_reset (qk_tap_dance_state_t *state, void *user_data) {
switch (htap_state.state) {
case SINGLE_TAP: unregister_code(KC_H); break;
case SINGLE_HOLD: layer_off(8); unregister_code(KC_LALT); break;
case DOUBLE_TAP: unregister_code(KC_LALT);break;
// case DOUBLE_HOLD: unregister_code(KC_LALT);
case DOUBLE_SINGLE_TAP: unregister_code(KC_H);
}
htap_state.state = 0;
}
/**************** QUAD FUNCTION FOR TAB ****************/
// TAB, ALT + SHIFT, TAB TAB, CTRL + SHIFT
static xtap tab_state = {
.is_press_action = true,
.state = 0
};
void tab_finished (qk_tap_dance_state_t *state, void *user_data) {
tab_state.state = cur_dance(state);
switch (tab_state.state) {
case SINGLE_TAP: register_code(KC_TAB); break; //send tab on single press
case SINGLE_HOLD: register_ctrl_shift(); break;
case DOUBLE_HOLD: register_alt_shift(); break; //alt shift on single hold
case DOUBLE_TAP: register_code(KC_TAB); unregister_code(KC_TAB); register_code(KC_TAB); break; //tab tab
case TRIPLE_TAP: register_code(KC_LSHIFT) ;register_code(KC_ESC); break;
case TRIPLE_HOLD: register_code(KC_LSHIFT); register_code(KC_LGUI); break;
}
}
void tab_reset (qk_tap_dance_state_t *state, void *user_data) {
switch (tab_state.state) {
case SINGLE_TAP: unregister_code(KC_TAB); break; //unregister tab
case DOUBLE_HOLD: unregister_alt_shift(); break; //let go of alt shift
case DOUBLE_TAP: unregister_code(KC_TAB); break;
case SINGLE_HOLD: unregister_ctrl_shift(); break;
case TRIPLE_TAP: unregister_code(KC_LSHIFT); unregister_code(KC_ESC); break;
case TRIPLE_HOLD: unregister_code(KC_LSHIFT); unregister_code(KC_LGUI); break;
}
tab_state.state = 0;
}
/**************** QUAD FUNCTION FOR TAB ****************/
//*************** SUPER COMMA *******************//
// Assumption: we don't care about trying to hit ,, quickly
//*************** SUPER COMMA *******************//
static xtap comma_state = {
.is_press_action = true,
.state = 0
};
void comma_finished (qk_tap_dance_state_t *state, void *user_data) {
comma_state.state = hold_cur_dance(state); //Use the dance that favors being held
switch (comma_state.state) {
case SINGLE_TAP: register_code(KC_COMMA); break;
case SINGLE_HOLD: layer_on(1); break; //turn on symbols layer
case DOUBLE_TAP: layer_invert(4); break; //toggle numbers layer
case DOUBLE_HOLD: layer_on(2); break;
case TRIPLE_TAP: register_code(KC_CALCULATOR); break;
case TRIPLE_HOLD: layer_on(3);
}
}
void comma_reset (qk_tap_dance_state_t *state, void *user_data) {
switch (comma_state.state) {
case SINGLE_TAP: unregister_code(KC_COMMA); break; //unregister comma
case SINGLE_HOLD: layer_off(1); break;
case DOUBLE_TAP: ;break;
case DOUBLE_HOLD: layer_off(2); break;
case TRIPLE_TAP: unregister_code(KC_CALCULATOR); break;
case TRIPLE_HOLD: layer_off(3);
}
comma_state.state = 0;
}
//*************** SUPER COMMA *******************//
//*************** SUPER COMMA *******************//
//*************** F3 TAP DANCE *******************//
//Good example for accessing multiple layers from the same key.
static xtap S1_state = {
.is_press_action = true,
.state = 0
};
void bt_finished (qk_tap_dance_state_t *state, void *user_data) {
S1_state.state = cur_dance(state);
switch (S1_state.state) {
case SINGLE_TAP: register_code(KC_F3); break;
case SINGLE_HOLD: layer_on(_MACROS); break;
case DOUBLE_TAP: layer_invert(_MACROS); break;
case DOUBLE_HOLD: layer_on(5); break;
case DOUBLE_SINGLE_TAP: layer_invert(_MACROS); break;
}
}
void bt_reset (qk_tap_dance_state_t *state, void *user_data) {
switch (S1_state.state) {
case SINGLE_TAP: unregister_code(KC_F3); break;
case SINGLE_HOLD: layer_off(_MACROS); break;
case DOUBLE_TAP: break; //already inverted. Don't do anything.
case DOUBLE_HOLD: layer_off(5); break;
case DOUBLE_SINGLE_TAP: break;
}
S1_state.state = 0;
}
// Tap Dance Definitions
qk_tap_dance_action_t tap_dance_actions[] = {
// simple tap dance
[F12ETAPS] = ACTION_TAP_DANCE_DOUBLE(KC_F12,LSFT(LCTL(KC_F10))),
[REFRESH] = ACTION_TAP_DANCE_DOUBLE(KC_R,LCTL(KC_R)),
[ENDESC] = ACTION_TAP_DANCE_DOUBLE(KC_END, KC_ESC),
[Q_ESCAPE] = ACTION_TAP_DANCE_DOUBLE(KC_Q, KC_ESC),
[ENDHOME] = ACTION_TAP_DANCE_DOUBLE(KC_END, KC_HOME),
[CALCCOMP] = ACTION_TAP_DANCE_DOUBLE(KC_CALCULATOR, KC_MY_COMPUTER),
[ALTF4] = ACTION_TAP_DANCE_DOUBLE(KC_F4,LALT(KC_F4)),
[F6F7] = ACTION_TAP_DANCE_DOUBLE(LSFT(KC_F6), LALT(KC_F7)),
[F1F13] = ACTION_TAP_DANCE_DOUBLE(KC_F1, KC_F13),
[F2F14] = ACTION_TAP_DANCE_DOUBLE(KC_F2, KC_F14),
[F5F15] = ACTION_TAP_DANCE_DOUBLE(KC_F5, KC_F15),
[TABCOMBO] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, tab_finished, tab_reset),
[F3D] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, bt_finished, bt_reset),
[COMMA] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, comma_finished, comma_reset),
[HTAB] = ACTION_TAP_DANCE_FN_ADVANCED(NULL,h_finished, h_reset)
};
// bool process_record_user(uint16_t keycode, keyrecord_t *record) {
// if (!record->event.pressed) {
// switch (keycode) {
// case KC_SECRET_1 ... KC_SECRET_5:
// send_string(secret[keycode - KC_SECRET_1]);
// // clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
// return true; break;
// case UP_ENTER_RESET:
// register_code(KC_UP);
// unregister_code(KC_UP);
// register_code(KC_ENTER);
// unregister_code(KC_ENTER);
// reset_keyboard();
// return false; break;
// case TIL_SLASH:
// SEND_STRING ("~/.");
// return false; break;
// case DBMS_OUT:
// SEND_STRING ("dbms_output.put_line('');");
// SEND_STRING (SS_TAP(X_LEFT) SS_TAP(X_LEFT) SS_TAP(X_LEFT));
// return false; break;
// case ID_MAN_IP:
// SEND_STRING ("http://dev-1967110238.us-east-1.elb.amazonaws.com");
// return false; break;
// case MODRESET:
// clear_mods();
// return false; break;
// case DEREF:
// SEND_STRING ("->");
// return false; break;
// case EQRIGHT:
// SEND_STRING ("=>");
// return false; break;
// case TICK3:
// SEND_STRING ("```");
// return false; break;
// case TILD3:
// SEND_STRING ("~~~");
// return false; break;
// }
// }
// return true;
// };
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
if (!record->event.pressed) {
switch (keycode) {
case KC_SECRET_1 ... KC_SECRET_5:
send_string(secret[keycode - KC_SECRET_1]);
// clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
return true; break;
case UP_ENTER_RESET:
SEND_STRING("make ergodox_infinity:gordon:dfu-util");
register_code(KC_ENTER);
unregister_code(KC_ENTER);
reset_keyboard();
return false; break;
case TIL_SLASH:
SEND_STRING ("~/.");
return false; break;
case DBMS_OUT:
SEND_STRING ("dbms_output.put_line('');");
SEND_STRING (SS_TAP(X_LEFT) SS_TAP(X_LEFT) SS_TAP(X_LEFT));
return false; break;
case DIE_1000X_RIGHT:
SEND_STRING (SS_TAP(X_G) SS_TAP(X_G) SS_TAP(X_RIGHT) SS_TAP(X_B) SS_TAP(X_J));
return false; break;
case DIE_1000X_LEFT:
SEND_STRING (SS_TAP(X_GRAVE) SS_TAP(X_G) SS_TAP(X_LEFT) SS_TAP(X_B) SS_TAP(X_J));
return false; break;
case ID_MAN_IP:
SEND_STRING ("http://dev-1967110238.us-east-1.elb.amazonaws.com");
return false; break;
case MODRESET:
clear_mods();
return false; break;
case DEREF:
SEND_STRING ("->");
return false; break;
case EQRIGHT:
SEND_STRING ("=>");
return false; break;
case TICK3:
SEND_STRING ("```");
return false; break;
case SPRK_TCK:
SEND_STRING ("```");
SEND_STRING (SS_DOWN(X_LSHIFT) SS_TAP(X_ENTER) SS_UP(X_LSHIFT));
SEND_STRING (SS_DOWN(X_LSHIFT) SS_TAP(X_ENTER) SS_UP(X_LSHIFT));
SEND_STRING ("```");
SEND_STRING (SS_TAP(X_UP));
return false; break;
case TILD3:
SEND_STRING ("~~~");
return false; break;
}
}
else { //On key being pressed
switch (keycode) {
case KC_SECRET_1 ... KC_SECRET_5:
clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
return false; break;
}
}
return true;
};

@ -1,247 +0,0 @@
#ifndef GORDON
#define GORDON
#include "quantum.h"
#include "process_keycode/process_tap_dance.h"
// Fillers to make layering more clear
#define ________ KC_TRNS
#define _________ KC_TRNS
#define _XXXXXX_ KC_TRNS
// KC codes that are too long
#define DOLLAR KC_DOLLAR
#define LSQUIGLY KC_LBRACKET
#define RSQUIGLY KC_RBRACKET
#define NUMLOCK KC_NUMLOCK
#define CAPLOCK KC_CAPSLOCK
#define BK_SLASH KC_BSLASH
#define ASTERSK KC_KP_ASTERISK
// Navigation
#define SNAPLEFT LGUI(KC_LEFT)
#define SNAPRGHT LGUI(KC_RIGHT)
#define SNAPUP LGUI(KC_UP)
#define SNAPDOWN LGUI(KC_DOWN)
#define PREVTAB LCTL(LSFT(KC_TAB))
#define NEXTTAB LCTL(KC_TAB)
#define WORKRIGHT LCTL(LGUI(KC_RIGHT))
#define WORKLEFT LCTL(LGUI(KC_LEFT))
#define APP_1 LCTL(LGUI(KC_1))
#define APP_2 LCTL(LGUI(KC_2))
#define APP_3 LCTL(LGUI(KC_3))
#define APP_4 LCTL(LGUI(KC_4))
#define APP_5 LCTL(LGUI(KC_5))
#define APP_6 LCTL(LGUI(KC_6))
#define APP_7 LCTL(LGUI(KC_7))
#define APP_8 LCTL(LGUI(KC_8))
// KC/modifier hold
#define CTRL_F CTL_T(KC_F)
#define CTRL_J CTL_T(KC_J)
#define CTRL_Z CTL_T(KC_Z)
#define ALT_V ALT_T(KC_V)
#define ALT_M ALT_T(KC_M)
#define WIN_G GUI_T(KC_G)
#define WIN_H GUI_T(KC_H)
#define HYPER_X ALL_T(KC_X)
#define HYPE_DOT ALL_T(KC_DOT)
#define MEH_S MEH_T(KC_S)
#define MEH_L MEH_T(KC_L)
#define ALT_HOME ALT_T(KC_HOME)
// KC/Layer Hold
#define NAV_E LT(_NAV,KC_E)
#define NUMPAD_D LT(_NUMPAD,KC_D)
#define MOUSE_C LT(_MOUSE,KC_C)
#define SYMB_BSP LT(_SYMBOLS,KC_BSPACE)
#define COL_MOUS LT(_MOUSE,KC_SCOLON)
#define SPAC_SYM LT(_SYMBOLS,KC_SPACE)
#define SPAC_TXT LT(_TEXTNAV,KC_SPACE)
#define APP_SW_I LT(_APPSWITCH,KC_I)
#define APP_SW_K LT(_APPSWITCH,KC_K)
// #define TLSLSH TIL_SLASH
// #define TILDA_3x TILD3
// #define _RESET_ UP_ENTER_RESET
// Double Modifier ONLY hold
#define ALT_SHFT LSFT(KC_LALT)
#define CTR_SHFT LSFT(KC_LCTL)
// KC/Double modifier Hold
#define CTR_SH_W MT(MOD_LCTL|MOD_LSFT,KC_W)
#define CTR_AL_R MT(MOD_LCTL|MOD_LALT,KC_R)
#define ALT_SH_R MT(MOD_LSFT|MOD_LALT,KC_R)
//MISC
#define PRINTSCR KC_PSCREEN
#define CALTDEL LCTL(LALT(KC_DEL))
#define TSKMGR LCTL(LSFT(KC_ESC))
typedef struct {
bool is_press_action;
int state;
} xtap;
enum {
SINGLE_TAP = 1,
SINGLE_HOLD = 2,
DOUBLE_TAP = 3,
DOUBLE_HOLD = 4,
DOUBLE_SINGLE_TAP = 5, //send two single taps
TRIPLE_TAP = 6,
TRIPLE_HOLD = 7
};
//Tap dance enums
enum
{
F12TAP = 0,
F12ETAPS,
CALCCOMP,
REFRESH, //send R, or Control+R if double tapped.
ENDESC,
XESC, //'quad function'. x, control, escape, alt
ALY2, //'quad function': a, Hyper, ctrl+a, layer 2
PRLOCK,
F6F7, // Shift F6 or Alt F7
TABCOMBO,
FCTRL,
F3D,
ALTF4,
COMMA,
AT,
HTAB,
F1F13,
F2F14,
F5F15,
ENDHOME,
Q_ESCAPE
};
#ifdef TAP_DANCE_ENABLE
#define F1_F13 TD(F1F13)
#define F2_F14 TD(F2F14)
#define F5_F15 TD(F5F15)
#define F4_ALTF4 TD(ALTF4)
#define END_ESC TD(ENDESC)
#define Q_ESC TD(Q_ESCAPE)
#define END_HOME TD(ENDHOME)
#define SHF6_AF7 TD(F6F7)
#define F12_RUN TD(F12ETAPS)
#define COMMA_TD TD(COMMA)
#define CALC_COM TD(CALCCOMP)
#else //just to make things compile
#define F1_F13 KC_1
#define F2_F14 KC_1
#define F5_F15 KC_1
#define F4_ALTF4 KC_1
#define END_ESC KC_1
#define END_HOME KC_1
#define SHF6_AF7 KC_1
#define F12_RUN KC_1
#define COMMA_TD KC_1
#define CALC_COM KC_1
#endif
enum gordon_layers
{
_QWERTY = 0,
_SYMBOLS, // Programming and all other commonlye used symbols
_MOUSE, // Mouse movement and also a few macros
_NUMPAD, // For getting a numpad under the right hand, and a few helpful things under the left
_NAV, // Windows navigation. Windows snapping, changing workspaces, and ARROWS
_MACROS, // Non-text related Macros.
_FUNCTION, // Not sure what I had in mind for this one
_APPSWITCH, // For switching between apps using the `ctrl + Win + [num]` shortcut.
// This allows for toggling windows of the same app with one button.
// Example: Press and hold `I`, then tap `j` multiple times to cycle through all
// Intellij windows (and only Intellij). This requires the app to be pinned to the Windows bar
_ONESHOT, // A layer I use for shortcuts that require multiple modifiers and a button not on my home layer
// Example: If I need to hit `alt + shift + 5`
_TEXTNAV, // Navigate through text
_QWERTY_KIDS, // So my kids can do nothing but type. Could also be a `speed typing` layer with no LT or MTs
_STREET_FIGHTER, // For Street Fighter 5. Die 1000x Deaths!!!!
_DIRNAV, // For navigating to different directories.
_TEXT_MACROS // For text-manipulation macros. Passwords, saved strings, pre-formatting
};
void register_hyper (void);
void unregister_hyper (void);
void register_ctrl_a (void);
void unregister_ctrl_a (void);
void register_alt_f7 (void);
void unregister_alt_f7 (void);
void register_shift_f6 (void);
void unregister_shift_f6 (void);
void register_ctrl_shift (void);
void unregister_ctrl_shift (void);
void register_alt_shift (void);
void unregister_alt_shift (void);
int cur_dance (qk_tap_dance_state_t *state);
int hold_cur_dance (qk_tap_dance_state_t *state);
void x_finished (qk_tap_dance_state_t *state, void *user_data);
void x_reset (qk_tap_dance_state_t *state, void *user_data);
void h_finished (qk_tap_dance_state_t *state, void *user_data);
void h_reset (qk_tap_dance_state_t *state, void *user_data);
void tab_finished (qk_tap_dance_state_t *state, void *user_data);
void tab_reset (qk_tap_dance_state_t *state, void *user_data);
void comma_finished (qk_tap_dance_state_t *state, void *user_data);
void comma_reset (qk_tap_dance_state_t *state, void *user_data);
void bt_finished (qk_tap_dance_state_t *state, void *user_data);
void bt_reset (qk_tap_dance_state_t *state, void *user_data);
enum secret_strings {
KC_SECRET_1 = SAFE_RANGE,
KC_SECRET_2,
KC_SECRET_3,
KC_SECRET_4,
KC_SECRET_5,
END_SECRET_SAFE_RANGE
};
// Macro Declarations
enum {
INFOQM = END_SECRET_SAFE_RANGE,
MODRESET,
TIL_SLASH,
DEREF,
EQRIGHT,
TILD3,
TICK3,
SPRK_TCK,
ALTTAB_START,
ALTTAB_END,
UP_ENTER_RESET,
DBMS_OUT,
DIE_1000X_RIGHT,
DIE_1000X_LEFT,
ID_MAN_IP
};
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt);
#endif

@ -1,14 +0,0 @@
Copyright <year> <name> <email> @<github_username>
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/>.

@ -1,4 +0,0 @@
TAP_DANCE_ENABLE = yes
SRC += gordon.c
# BOOTMAGIC_ENABLE = yes

@ -1,75 +0,0 @@
#ifndef CONFIG_USER_H
#define CONFIG_USER_H
#include "config_common.h"
#ifdef AUDIO_ENABLE
#define STARTUP_SONG SONG(PLANCK_SOUND)
// #define STARTUP_SONG SONG(NO_SOUND)
#define DEFAULT_LAYER_SONGS { SONG(QWERTY_SOUND), \
SONG(COLEMAK_SOUND), \
SONG(DVORAK_SOUND) \
}
#endif
//#define LEADER_TIMEOUT 300
//#define BACKLIGHT_BREATHING
//#define PERMISSIVE_HOLD
// #define QMK_KEYS_PER_SCAN 4
//audio clicky
//#define AUDIO_CLICKY
// to enable clicky on startup
//#define AUDIO_CLICKY_ON
//#define AUDIO_CLICKY_FREQ_RANDOMNESS 1.0f
/* ws2812 RGB LED
#define RGB_DI_PIN B5
#define RGBLIGHT_ANIMATIONS
#define RGBLED_NUM 8 // Number of LEDs
#define RGBLIGHT_HUE_STEP 10
#define RGBLIGHT_SAT_STEP 17
*/
#undef PLANCK_MIT_LAYOUT
//#define MUON_LEFT
#undef DEBOUNCE
#define DEBOUNCE 0
//rgb-reactive
//#define RGB_MATRIX_KEYPRESSES
//#define EECONFIG_RGB_MATRIX (uint32_t *)16
//skip usb startup check
//#define NO_USB_STARTUP_CHECK
/*
* MIDI options
*/
/* Prevent use of disabled MIDI features in the keymap */
//#define MIDI_ENABLE_STRICT 1
/* enable basic MIDI features:
- MIDI notes can be sent when in Music mode is on
*/
#define MIDI_BASIC
/* enable advanced MIDI features:
- MIDI notes can be added to the keymap
- Octave shift and transpose
- Virtual sustain, portamento, and modulation wheel
- etc.
*/
//#define MIDI_ADVANCED
/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
//#define MIDI_TONE_KEYCODE_OCTAVES 2
// Most tactile encoders have detents every 4 stages
#define ENCODER_RESOLUTION 4
#endif

@ -1,69 +0,0 @@
/*
Based on userspace written by @drashna 2017
Copyright 2018 Hsian Chang <ishtob@gmail.com> @ishtob
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 "ishtob.h"
#include "action.h"
#include "action_layer.h"
// #include "dynamic_macro.h"
#ifdef AUDIO_ENABLE
#include "audio.h"
#endif
// Add reconfigurable functions here, for keymap customization
// This allows for a global, userspace functions, and continued
// customization of the keymap. Use _keymap instead of _user
// functions in the keymaps
__attribute__ ((weak))
void matrix_init_keymap(void) {}
__attribute__ ((weak))
void matrix_scan_keymap(void) {}
__attribute__ ((weak))
bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
return true;
}
__attribute__ ((weak))
bool process_record_secrets(uint16_t keycode, keyrecord_t *record) {
return true;
}
// Call user matrix init, then call the keymap's init function
void matrix_init_user(void) {
matrix_init_keymap();
}
// No global matrix scan code, so just run keymap's matix
// scan function
void matrix_scan_user(void) {
matrix_scan_keymap();
}
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case DFU:
if (record->event.pressed) {
clear_keyboard();
reset_keyboard();
}
return false;
break;
}
return process_record_keymap(keycode, record) && process_record_secrets(keycode, record);
}

@ -1,237 +0,0 @@
#ifndef USERSPACE
#define USERSPACE
#include "quantum.h"
enum userspace_keycodes {
QWERTY = SAFE_RANGE,
COLEMAK,
DVORAK,
PLOVER,
LOWER,
RAISE,
BACKLIT,
EXT_PLV,
DFU,
P_CITRIX, //these macro exsists in macros_private.c, which is excluded from git
P_MPASS,
P_META,
O_DAYRN,
O_RTQ6H,
O_3DRN,
O_AUTODC,
M_EMAIL,
M_EMAIL2
};
// 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.
// Layer names don't all need to be of the same length, obviously, and you can also skip them
// entirely and just use numbers.
#define _QWERTY 0
#define _COLEMAK 1
#define _DVORAK 2
#define _LOWER 3
#define _RAISE 4
#define _PLOVER 5
#define _FNLAYER 6
#define _NUMLAY 7
#define _MOUSECURSOR 8
#define _ADJUST 16
#define LOWER MO(_LOWER)
#define RAISE MO(_RAISE)
// Custom macros
#define CTL_ESC CTL_T(KC_ESC) // Tap for Esc, hold for Ctrl
#define CTL_TTAB CTL_T(KC_TAB) // Tap for Esc, hold for Ctrl
#define CTL_ENT CTL_T(KC_ENT) // Tap for Enter, hold for Ctrl
#define SFT_ENT SFT_T(KC_ENT) // Tap for Enter, hold for Shift
// Requires KC_TRNS/_______ for the trigger key in the destination layer
#define LT_FN(kc) LT(_FNLAYER, kc) // L-ayer T-ap Function Layer
#define LT_MC(kc) LT(_MOUSECURSOR, kc) // L-ayer T-ap M-ouse C-ursor
#define LT_RAI(kc) LT(_RAISE, kc) // L-ayer T-ap to Raise
#define TG_NUMLAY TG(_NUMLAY) //Toggle for layer _NUMLAY
/*
enum userspace_layers {
_QWERTY = 0,
_COLEMAK,
_DVORAK,
_LOWER,
_RAISE,
_PLOVER,
_FNLAYER,
_NUMLAY,
_MOUSECURSOR,
_ADJUST
};
*/
/*
Since our quirky block definitions are basically a list of comma separated
arguments, we need a wrapper in order for these definitions to be
expanded before being used as arguments to the LAYOUT_xxx macro.
*/
#if (!defined(LAYOUT) && defined(KEYMAP))
#define LAYOUT KEYMAP
#endif
#define LAYOUT_ergodox_wrapper(...) LAYOUT_ergodox(__VA_ARGS__)
#define LAYOUT_ergodox_pretty_wrapper(...) LAYOUT_ergodox_pretty(__VA_ARGS__)
#define KEYMAP_wrapper(...) LAYOUT(__VA_ARGS__)
#define LAYOUT_wrapper(...) LAYOUT(__VA_ARGS__)
#define LAYOUT_ortho_4x12_wrapper(...) LAYOUT_ortho_4x12(__VA_ARGS__)
/*
Blocks for each of the four major keyboard layouts
Organized so we can quickly adapt and modify all of them
at once, rather than for each keyboard, one at a time.
And this allows for much cleaner blocks in the keymaps.
For instance Tap/Hold for Control on all of the layouts
NOTE: These are all the same length. If you do a search/replace
then you need to add/remove underscores to keep the
lengths consistent.
*/
#define _________________QWERTY_L1_________________ KC_Q, KC_W, KC_E, KC_R, KC_T
#define _________________QWERTY_L2_________________ KC_A, KC_S, KC_D, KC_F, KC_G
#define _________________QWERTY_L3_________________ KC_Z, KC_X, KC_C, KC_V, KC_B
#define _________________QWERTY_R1_________________ KC_Y, KC_U, KC_I, KC_O, KC_P
#define _________________QWERTY_R2_________________ KC_H, KC_J, KC_K, KC_L, LT_MC(KC_SCLN)
#define _________________QWERTY_R3_________________ KC_N, KC_M, KC_COMM, KC_DOT, KC_SLASH
#define _________________COLEMAK_L1________________ KC_Q, KC_W, KC_F, KC_P, KC_G
#define _________________COLEMAK_L2________________ KC_A, KC_R, KC_S, KC_T, KC_D
#define _________________COLEMAK_L3________________ KC_Z, KC_X, KC_C, KC_V, KC_B
#define _________________COLEMAK_R1________________ KC_J, KC_L, KC_U, KC_Y, KC_SCLN
#define _________________COLEMAK_R2________________ KC_H, KC_N, KC_E, KC_I, LT_MC(KC_O)
#define _________________COLEMAK_R3________________ KC_K, KC_M, KC_COMM, KC_DOT, KC_SLASH
#define ______________COLEMAK_MOD_DH_L1____________ KC_Q, KC_W, KC_F, KC_P, KC_B
#define ______________COLEMAK_MOD_DH_L2____________ KC_A, KC_R, KC_S, KC_T, KC_G
#define ______________COLEMAK_MOD_DH_L3____________ KC_Z, KC_X, KC_C, KC_D, KC_V
#define ______________COLEMAK_MOD_DH_R1____________ KC_J, KC_L, KC_U, KC_Y, KC_SCLN
#define ______________COLEMAK_MOD_DH_R2____________ KC_M, KC_N, KC_E, KC_I, LT_MC(KC_O)
#define ______________COLEMAK_MOD_DH_R3____________ KC_K, KC_H, KC_COMM, KC_DOT, KC_SLASH
#define _________________DVORAK_L1_________________ KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y
#define _________________DVORAK_L2_________________ KC_A, KC_O, KC_E, KC_U, KC_I
#define _________________DVORAK_L3_________________ KC_SCLN, KC_Q, KC_J, KC_K, KC_X
#define _________________DVORAK_R1_________________ KC_F, KC_G, KC_C, KC_R, KC_L
#define _________________DVORAK_R2_________________ KC_D, KC_H, KC_T, KC_N, LT_MC(KC_S)
#define _________________DVORAK_R3_________________ KC_B, KC_M, KC_W, KC_V, KC_Z
#define _________________WORKMAN_L1________________ KC_Q, KC_D, KC_R, KC_W, KC_B
#define _________________WORKMAN_L2________________ KC_A, KC_S, KC_H, KC_T, KC_G
#define _________________WORKMAN_L3________________ KC_Z, KC_X, KC_M, KC_C, KC_V
#define _________________WORKMAN_R1________________ KC_J, KC_F, KC_U, KC_P, KC_SCLN
#define _________________WORKMAN_R2________________ KC_Y, KC_N, KC_E, KC_O, LT_MC(KC_I)
#define _________________WORKMAN_R3________________ KC_K, KC_L, KC_COMM, KC_DOT, KC_SLASH
#define _________________NORMAN_L1_________________ KC_Q, KC_W, KC_D, KC_F, KC_K
#define _________________NORMAN_L2_________________ KC_A, KC_S, KC_E, KC_T, KC_G
#define _________________NORMAN_L3_________________ KC_Z, KC_X, KC_C, KC_V, KC_B
#define _________________NORMAN_R1_________________ KC_J, KC_U, KC_R, KC_L, KC_SCLN
#define _________________NORMAN_R2_________________ KC_Y, KC_N, KC_I, KC_O, LT_MC(KC_U)
#define _________________NORMAN_R3_________________ KC_P, KC_M, KC_COMM, KC_DOT, KC_SLASH
#define _________________MALTRON_L1________________ KC_Q, KC_P, KC_Y, KC_C, KC_B
#define _________________MALTRON_L2________________ KC_A, KC_N, KC_I, KC_S, KC_F
#define _________________MALTRON_L3________________ KC_SCLN, KC_SLSH, KC_J KC_G, KC_COMM
#define _________________MALTRON_R1________________ KC_V, KC_M, KC_U, KC_Z, KC_L
#define _________________MALTRON_R2________________ KC_D, KC_T, KC_D, KC_O, LT_MC(KC_R)
#define _________________MALTRON_R3________________ KC_DOT, KC_W, KC_K, KC_MINS, KC_X
#define _________________EUCALYN_L1________________ KC_SLSH, KC_COMM, KC_DOT, KC_F, KC_Q
#define _________________EUCALYN_L2________________ KC_A, KC_O, KC_E, KC_I, KC_U
#define _________________EUCALYN_L3________________ KC_Z, KC_X, KC_C, KC_V, KC_W
#define _________________EUCALYN_R1________________ KC_M, KC_R, KC_D, KC_Y, KC_P
#define _________________EUCALYN_R2________________ KC_G, KC_T, KC_K, KC_S, LT_MC(KC_N)
#define _________________EUCALYN_R3________________ KC_B, KC_H, KC_J, KC_L, KC_SCLN
#define _____________CARPLAX_QFMLWY_L1_____________ KC_Q, KC_F, KC_M, KC_L, KC_W
#define _____________CARPLAX_QFMLWY_L2_____________ KC_D, KC_S, KC_T, KC_N, KC_R
#define _____________CARPLAX_QFMLWY_L3_____________ KC_Z, KC_V, KC_G, KC_C, KC_X
#define _____________CARPLAX_QFMLWY_R1_____________ KC_Y, KC_U, KC_O, KC_B, KC_J
#define _____________CARPLAX_QFMLWY_R2_____________ KC_I, KC_A, KC_E, KC_H, LT_MC(KC_SCLN)
#define _____________CARPLAX_QFMLWY_R3_____________ KC_P, KC_K, KC_COMM, KC_DOT, KC_SLSH
#define _____________CARPLAX_QGMLWB_L1_____________ KC_Q, KC_G, KC_M, KC_L, KC_W
#define _____________CARPLAX_QGMLWB_L2_____________ KC_D, KC_S, KC_T, KC_N, KC_R
#define _____________CARPLAX_QGMLWB_L3_____________ KC_Z, KC_X, KC_C, KC_F, KC_J
#define _____________CARPLAX_QGMLWB_R1_____________ KC_B, KC_Y, KC_U, KC_V, KC_SCLN
#define _____________CARPLAX_QGMLWB_R2_____________ KC_I, KC_A, KC_E, KC_O, LT_MC(KC_H)
#define _____________CARPLAX_QGMLWB_R3_____________ KC_K, KC_P, KC_COMM, KC_DOT, KC_SLSH
#define _____________CARPLAX_QGMLWY_L1_____________ KC_Q, KC_G, KC_M, KC_L, KC_W
#define _____________CARPLAX_QGMLWY_L2_____________ KC_D, KC_S, KC_T, KC_N, KC_R
#define _____________CARPLAX_QGMLWY_L3_____________ KC_Z, KC_X, KC_C, KC_V, KC_J
#define _____________CARPLAX_QGMLWY_R1_____________ KC_Y, KC_F, KC_U, KC_B, KC_SCLN
#define _____________CARPLAX_QGMLWY_R2_____________ KC_I, KC_A, KC_E, KC_O, LT_MC(KC_H)
#define _____________CARPLAX_QGMLWY_R3_____________ KC_K, KC_P, KC_COMM, KC_DOT, KC_SLSH
#define ________________NUMBER_LEFT________________ KC_1, KC_2, KC_3, KC_4, KC_5
#define ________________NUMBER_RIGHT_______________ KC_6, KC_7, KC_8, KC_9, KC_0
#define _________________FUNC_LEFT_________________ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5
#define _________________FUNC_RIGHT________________ KC_F6, KC_F7, KC_F8, KC_F9, KC_F10
#define __________________LONG_FUNC_LEFT___________________ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6
#define __________________LONG_FUNC_RIGHT__________________ KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12
#define ___________________BLANK___________________ _______, _______, _______, _______, _______
#define _________________LOWER_L1__________________ KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC
#define _________________LOWER_L2__________________ _________________FUNC_LEFT_________________
#define _________________LOWER_L3__________________ _________________FUNC_RIGHT________________
#define _________________LOWER_R1__________________ KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN
#define _________________LOWER_R2__________________ _______, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR
#define _________________LOWER_R3__________________ _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
#define _________________RAISE_L1__________________ ________________NUMBER_LEFT________________
#define _________________RAISE_L2__________________ ___________________BLANK___________________
#define _________________RAISE_L3__________________ ___________________BLANK___________________
#define _________________RAISE_R1__________________ ________________NUMBER_RIGHT_______________
#define _________________RAISE_R2__________________ _______, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC
#define _________________RAISE_R3__________________ _______, KC_HOME, KC_PGDN, KC_PGUP, KC_END
#define _________________ADJUST_L1_________________ RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, RGB_TOG
#define _________________ADJUST_L2_________________ MU_TOG , CK_TOGG, AU_ON, AU_OFF, AG_NORM
#define _________________ADJUST_L3_________________ RGB_RMOD,RGB_HUD,RGB_SAD, RGB_VAD, KC_RGB_T
#define _________________ADJUST_R1_________________ KC_SEC1, KC_SEC2, KC_SEC3, KC_SEC4, KC_SEC5
#define _________________ADJUST_R2_________________ AG_SWAP, QWERTY, COLEMAK, DVORAK, WORKMAN
#define _________________ADJUST_R3_________________ MG_NKRO, KC_MUTE, KC_VOLD, KC_VOLU, KC_MNXT
#endif // !USERSPACE

@ -1,87 +0,0 @@
# Ishtob's userspace
under developement
# Secret Macros
This section is a modified version of what @drashna did in his userspace: https://github.com/qmk/qmk_firmware/tree/master/users/drashna#secret-macros
`macros_private.c` will be used if it exsists in the userspace folder during compiling.
To get started, put the following in rules.mk. this will have the compiler include the macros_private.c file if it exsists.
```
SRC += ishtob.c
ifneq ($(wildcard $(USER_PATH)/macros_private.c),"")
SRC += macros_private.c
endif
ifeq ($(strip $(NO_SECRETS)), yes)
OPT_DEFS += -DNO_SECRETS
endif
```
Remember that all macro keycode has to be present in the header file (ishtob.h) to prevent error during compile.
Next, you setup macros_private.c, ensure the keycodes are defined in ishtob.h (or your keymap.h).
Here is an example of my macros with the sensitive login information removed:
```
#include "ishtob.h" //replace this with your userspace or keymap
#include "quantum.h"
#pragma message "secret macros included" //debug line to let me know this file is included in the compile
//this str is for the monthly password rotation per my workplace's security policy
char my_str[5] = "stuff";
bool process_record_secrets(uint16_t keycode, keyrecord_t *record) {
if (record->event.pressed) {
switch(keycode) {
//my login macros
case P_CITRIX:
SEND_STRING("username"SS_TAP(X_TAB)"something");
send_string(my_str);
return false;
case P_MPASS:
SEND_STRING("something");
send_string(my_str);
return false;
case P_META:
SEND_STRING("metausername");
return false;
//my work macros for the meta application
case O_RTQ6H:
SEND_STRING(SS_TAP(X_TAB)"0300"SS_TAP(X_TAB)SS_TAP(X_DOWN)SS_TAP(X_TAB)"0900"SS_TAP(X_TAB)SS_TAP(X_DOWN)SS_TAP(X_TAB)"1500"SS_TAP(X_TAB)SS_TAP(X_DOWN)SS_TAP(X_TAB)"2100"SS_TAP(X_TAB)SS_LALT("o"));
return false;
case O_AUTODC:
SEND_STRING(SS_LALT("v")SS_TAP(X_TAB)SS_TAP(X_TAB)SS_TAP(X_TAB)SS_TAP(X_TAB)SS_TAP(X_TAB)SS_TAP(X_TAB)SS_TAP(X_TAB)SS_TAP(X_TAB)SS_TAP(X_TAB)"T"SS_TAP(X_TAB)"N"SS_LALT("s"));
return false;
case O_DAYRN:
SEND_STRING(SS_TAP(X_TAB)SS_TAP(X_TAB)SS_TAP(X_TAB)SS_TAP(X_TAB)SS_TAP(X_TAB)"1"SS_LALT("s"));
return false;
//Ops macros
case M_EMAIL:
SEND_STRING("privatemail@email.com");
return false;
case M_EMAIL2:
SEND_STRING("workemail@work.com");
return false;
}
}
return true;
}
```
Finally, add the following to .git/info/exclude to prevent private macros from being committed to git.
```
# git ls-files --others --exclude-from=.git/info/exclude
# Lines that start with '#' are comments.
# For a project mostly in C, the following would be a good set of
# exclude patterns (uncomment them if you want to use them):
# *.[oa]
# *~
/users/ishtob/macros_private.c
```
# Special mentions
special thanks to @drashna for helping me through quite a bit of these codes.

@ -1,7 +0,0 @@
SRC += ishtob.c
ifneq ("$(wildcard $(USER_PATH)/macros_private.c)","")
SRC += macros_private.c
endif
ifeq ($(strip $(NO_SECRETS)), yes)
OPT_DEFS += -DNO_SECRETS
endif

@ -1 +0,0 @@
#include "jackhumbert.h"

@ -1,6 +0,0 @@
#ifndef USERSPACE
#define USERSPACE
#include "quantum.h"
#endif

@ -1,14 +0,0 @@
Copyright 2017 Jack Humbert <jack.humb@gmail.com> @jackhumbert
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/>.

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

@ -1,51 +0,0 @@
/* Copyright 2018 Jarred Steenvoorden
*
* 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
// Sets good default for the speed of the mouse.
#undef MOUSEKEY_INTERVAL
#undef MOUSEKEY_DELAY
#undef MOUSEKEY_TIME_TO_MAX
#undef MOUSEKEY_MAX_SPEED
#define MOUSEKEY_INTERVAL 16
#define MOUSEKEY_DELAY 0
#define MOUSEKEY_TIME_TO_MAX 40
#define MOUSEKEY_MAX_SPEED 5
#undef MOUSEKEY_WHEEL_MAX_SPEED
#undef MOUSEKEY_WHEEL_TIME_TO_MAX
#undef MOUSEKEY_WHEEL_DELAY
#define MOUSEKEY_WHEEL_MAX_SPEED 4
#define MOUSEKEY_WHEEL_TIME_TO_MAX 255
#define MOUSEKEY_WHEEL_DELAY 0
#undef TAPPING_TOGGLE
#undef TAPPING_TERM
#undef IGNORE_MOD_TAP_INTERRUPT
#define PERMISSIVE_HOLD
#define TAPPING_TOGGLE 1
#define TAPPING_TERM 200
#define IGNORE_MOD_TAP_INTERRUPT
#ifdef AUDIO_ENABLE
#define STARTUP_SONG SONG(PLANCK_SOUND)
#endif
#define MACRO_TIMER 5

@ -1,97 +0,0 @@
/* Copyright 2018 Jarred Steenvoorden
*
* 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 "jarred.h"
#include "version.h"
__attribute__ ((weak))
bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
return true;
}
bool lowerPressed, raisePressed;
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case LOWER:
case RAISE:
// Both lower and raise activate the same layer
if (record->event.pressed) {
layer_on(_LW);
} else {
layer_off(_LW);
}
// But keep track of each to active adjust layer
if (keycode == LOWER) {
lowerPressed = record->event.pressed;
} else {
raisePressed = record->event.pressed;
}
// When both are pressed, activate adjust
if (lowerPressed && raisePressed) {
layer_on(_NP);
} else {
layer_off(_NP);
}
break;
case NUMPAD:
if (record->event.pressed) {
layer_on(_NP);
} else {
layer_off(_NP);
}
break;
case NAVI:
if (record->event.pressed) {
layer_on(_NV);
} else {
layer_off(_NV);
// Release mods set by ALT_TAB and CTL_TAB
unregister_code(KC_LALT);
unregister_code(KC_LCTL);
}
break;
case VRSN: // Prints firmware version
if (record->event.pressed) {
send_string_with_delay_P(PSTR(QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION ", Built on: " QMK_BUILDDATE), MACRO_TIMER);
}
break;
case ALT_TAB:
if (record->event.pressed) {
register_code(KC_LALT);
tap_code(KC_TAB);
}
break;
case CTL_TAB:
if (record->event.pressed) {
register_code(KC_LCTL);
tap_code(KC_TAB);
}
break;
}
return process_record_keymap(keycode, record);
}

@ -1,171 +0,0 @@
/* Copyright 2018 Jarred Steenvoorden
*
* 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/>.
*/
// TODO: Add Alt-Tab to nav + W layer
#ifndef USERSPACE
#define USERSPACE
#include "quantum.h"
enum userspace_custom_keycodes {
VRSN = SAFE_RANGE, // Prints QMK Firmware and board info
ALT_TAB,
CTL_TAB,
// Layer keys
NAVI,
LOWER,
RAISE,
NUMPAD
};
// Layers
enum {
_QW = 0,
_GAME,
_LW,
_NV,
_NP,
_MS,
};
#define MS_A LT(_MS,KC_A)
#define WIN_Z LGUI_T(KC_Z)
#define CTL_SLH RCTL_T(KC_SLSH)
// Wrappers
#define LAYOUT_planck_grid_wrapper(...) LAYOUT_planck_grid(__VA_ARGS__)
#define LAYOUT_atreus62_grid_wrapper(...) LAYOUT(__VA_ARGS__)
#define LAYOUT_ergotravel_grid_wrapper(...) LAYOUT(__VA_ARGS__)
/* Qwerty Layer */
#define QWERTY_L1 KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T
#define QWERTY_L2 NAVI, KC_A, KC_S, KC_D, KC_F, KC_G
#define QWERTY_L3 KC_LSFT, WIN_Z, KC_X, KC_C, KC_V, KC_B
#define QWERTY_L4 KC_LCTL, KC_LGUI, NUMPAD, KC_LALT, LOWER, KC_SPC
#define QWERTY_R1 KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC
#define QWERTY_R2 KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT
#define QWERTY_R3 KC_N, KC_M, KC_COMM, KC_DOT, CTL_SLH, KC_RSFT
#define QWERTY_R4 KC_ENT, RAISE, KC_RALT, MO(_MS), KC_APP, KC_RCTL
#define QWERTY_4_DOX KC_LCTL, LOWER, KC_SPC, KC_ENT, RAISE, KC_RALT
/* Game Layer */
#define GAME_L1 _______, _______, _______, _______, _______, _______
#define GAME_L2 _______, _______, _______, _______, _______, _______
#define GAME_L3 _______, _______, _______, _______, _______, _______
#define GAME_L4 _______, _______, KC_LALT, LOWER, KC_SPC, KC_SPC
#define GAME_R1 _______, _______, _______, _______, _______, _______
#define GAME_R2 _______, _______, _______, _______, _______, _______
#define GAME_R3 _______, _______, _______, _______, _______, _______
#define GAME_R4 _______, _______, _______, _______, _______, _______
/* Lower / Upper Layer */
#define LOWER_L1 KC_ESC , KC_1, KC_2, KC_3, KC_4, KC_5
#define LOWER_L2 _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5
#define LOWER_L3 _______, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10
#define LOWER_L4 _______, _______, _______, _______, _______, _______
#define LOWER_R1 KC_6, KC_7, KC_8, KC_9, KC_0, _______
#define LOWER_R2 KC_F11, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS
#define LOWER_R3 KC_F12, KC_GRV, _______, _______, _______, _______
#define LOWER_R4 _______, _______, _______, _______, _______, _______
#define LOWER_4_DOX _______, _______, _______, _______, _______, _______
/* Navigation Layer */
#define NAV_L1 _______, _______, _______, KC_LGUI, KC_DEL, KC_BSPC
#define NAV_L2 _______, _______, _______, KC_LSFT, KC_LCTL, KC_ENT
#define NAV_L3 _______, _______, _______, _______, _______, _______
#define NAV_L4 _______, _______, _______, CTL_TAB, ALT_TAB, _______
#define NAV_R1 _______, KC_HOME, KC_UP , KC_END , KC_INS, _______
#define NAV_R2 _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_DEL, _______
#define NAV_R3 _______, KC_PGUP, KC_PGDN, _______, _______, _______
#define NAV_R4 _______, KC_APP, _______, _______, _______, _______
#define NAV_4_DOX CTL_TAB, ALT_TAB, _______, _______, KC_APP, _______
/* Numpad Layer */
#define NUMPAD_L1 RGB_TOG, RGB_MOD,RGB_RMOD, _______, RGB_HUD, RGB_HUI
#define NUMPAD_L2 BL_TOGG, BL_STEP, BL_BRTG, _______, RGB_SAD, RGB_SAI
#define NUMPAD_L3 _______, _______, _______, _______, RGB_VAD, RGB_VAI
#define NUMPAD_L4 _______, _______, _______, _______, RGB_SPD, RGB_SPI
#define NUMPAD_R1 DF(_QW),DF(_GAME), _______, _______, _______, RESET
#define NUMPAD_R2 _______, _______, _______, _______, _______, _______
#define NUMPAD_R3 VRSN, _______, _______, _______, _______, _______
#define NUMPAD_R4 _______, _______, _______, _______, _______, _______
#define NUMPAD_4_DOX _______, _______, _______, _______, _______, _______
/* Mouse Layer */
#define MOUSE_L1 _______, _______, _______, _______, _______, _______
#define MOUSE_L2 _______, _______, KC_ACL1, KC_ACL0, KC_BTN1, KC_BTN2
#define MOUSE_L3 _______, _______, _______, _______, _______, _______
#define MOUSE_L4 _______, _______, _______, _______, _______, KC_BTN1
#define MOUSE_R1 _______, KC_WH_U, KC_MS_U, KC_WH_D, _______, _______
#define MOUSE_R2 _______, KC_MS_L, KC_MS_D, KC_MS_R, _______, _______
#define MOUSE_R3 _______, _______, _______, _______, _______, _______
#define MOUSE_R4 KC_BTN2, _______, _______, _______, _______, _______
#define MOUSE_4_DOX _______, _______, _______, _______, _______, _______
#define BLANK_12 KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO
#define QWERTY_1_12 QWERTY_L1, QWERTY_R1
#define QWERTY_2_12 QWERTY_L2, QWERTY_R2
#define QWERTY_3_12 QWERTY_L3, QWERTY_R3
#define QWERTY_4_12 QWERTY_L4, QWERTY_R4
#define GAME_1_12 GAME_L1, GAME_R1
#define GAME_2_12 GAME_L2, GAME_R2
#define GAME_3_12 GAME_L3, GAME_R3
#define GAME_4_12 GAME_L4, GAME_R4
#define LOWER_1_12 LOWER_L1, LOWER_R1
#define LOWER_2_12 LOWER_L2, LOWER_R2
#define LOWER_3_12 LOWER_L3, LOWER_R3
#define LOWER_4_12 LOWER_L4, LOWER_R4
#define NAV_1_12 NAV_L1, NAV_R1
#define NAV_2_12 NAV_L2, NAV_R2
#define NAV_3_12 NAV_L3, NAV_R3
#define NAV_4_12 NAV_L4, NAV_R4
#define NUMPAD_1_12 NUMPAD_L1, NUMPAD_R1
#define NUMPAD_2_12 NUMPAD_L2, NUMPAD_R2
#define NUMPAD_3_12 NUMPAD_L3, NUMPAD_R3
#define NUMPAD_4_12 NUMPAD_L4, NUMPAD_R4
#define MOUSE_1_12 MOUSE_L1, MOUSE_R1
#define MOUSE_2_12 MOUSE_L2, MOUSE_R2
#define MOUSE_3_12 MOUSE_L3, MOUSE_R3
#define MOUSE_4_12 MOUSE_L4, MOUSE_R4
#define QWERTY_4x12 QWERTY_1_12, QWERTY_2_12, QWERTY_3_12, QWERTY_4_12
#define GAME_4x12 GAME_1_12, GAME_2_12, GAME_3_12, GAME_4_12
#define LOWER_4x12 LOWER_1_12, LOWER_2_12, LOWER_3_12, LOWER_4_12
#define NAV_4x12 NAV_1_12, NAV_2_12, NAV_3_12, NAV_4_12
#define NUMPAD_4x12 NUMPAD_1_12, NUMPAD_2_12, NUMPAD_3_12, NUMPAD_4_12
#define MOUSE_4x12 MOUSE_1_12, MOUSE_2_12, MOUSE_3_12, MOUSE_4_12
#endif

@ -1,5 +0,0 @@
# Jarred's user space
Keymaps:
- [Planck](../../keyboards/planck/keymaps/jarred/readme.md)

@ -1,16 +0,0 @@
SRC += jarred.c
ifneq (,$(findstring planck,$(KEYBOARD)))
# Enable backlight for rev4 planck only
ifneq (,$(findstring rev4,$(KEYBOARD)))
BACKLIGHT_ENABLE = yes
BACKLIGHT_BREATHING = yes
else
BACKLIGHT_ENABLE = no
BACKLIGHT_BREATHING = no
endif
AUDIO_ENABLE = yes
endif
MOUSEKEY_ENABLE = no

@ -1,4 +0,0 @@
#pragma once
#define NO_ACTION_MACRO
#define NO_ACTION_FUNCTION

@ -1,18 +0,0 @@
#include "custom_rgb.h"
#if defined(RGBLIGHT_ENABLE)
extern rgblight_config_t rgblight_config;
rgblight_config_t _pushed_rgblight_config;
#define push_rgb_config() { if (_pushed_rgblight_config.raw == 0) { _pushed_rgblight_config.raw = rgblight_config.raw; } }
#define pop_rgb_config() { if (_pushed_rgblight_config.raw == 0) { rgblight_config.raw = _pushed_rgblight_config.raw; _pushed_rgblight_config.raw = 0; } }
#elif defined(RGB_MATRIX_ENABLE)
extern rgb_config_t rgb_matrix_config;
rgb_config_t _pushed_rgb_matrix_config;
#define push_rgb_config() _pushed_rgb_matrix_config.raw = rgb_matrix_config.raw
#define pop_rgb_config() rgb_matrix_config.raw = _pushed_rgb_matrix_config.raw
#endif
bool process_record_rgb(uint16_t keycode, keyrecord_t *record) {
return true;
}

@ -1,3 +0,0 @@
#pragma once
#include "kageurufu.h"

@ -1,12 +0,0 @@
#include "kageurufu.h"
#include "quantum.h"
#include "process_records.h"
#ifdef RGBLIGHT_ENABLE
//Following line allows macro to read current RGB settings
extern rgblight_config_t rgblight_config;
rgblight_config_t backup_rgblight_config;
__attribute__((weak))
uint8_t RGBLIGHT_MODS[] = {0};
#endif

@ -1,5 +0,0 @@
#pragma once
#include "quantum.h"
#include "process_records.h"
#include "layouts.h"

@ -1,58 +0,0 @@
#pragma once
#define _________________NUMROW_L1_________________ KC_1, KC_2, KC_3, KC_4, KC_5
#define _________________NUMROW_R1_________________ KC_6, KC_7, KC_8, KC_9, KC_0
#define _________________QWERTY_L1_________________ KC_Q, KC_W, KC_E, KC_R, KC_T
#define _________________QWERTY_L2_________________ KC_A, KC_S, KC_D, KC_F, KC_G
#define _________________QWERTY_L3_________________ KC_Z, KC_X, KC_C, KC_V, KC_B
#define _________________QWERTY_R1_________________ KC_Y, KC_U, KC_I, KC_O, KC_P
#define _________________QWERTY_R2_________________ KC_H, KC_J, KC_K, KC_L, KC_SCLN
#define _________________QWERTY_R3_________________ KC_N, KC_M, KC_COMM, KC_DOT, KC_SLASH
#define _________________COLEMAK_L1________________ KC_Q, KC_W, KC_F, KC_P, KC_G
#define _________________COLEMAK_L2________________ KC_A, KC_R, KC_S, KC_T, KC_D
#define _________________COLEMAK_L3________________ KC_Z, KC_X, KC_C, KC_V, KC_B
#define _________________COLEMAK_R1________________ KC_J, KC_L, KC_U, KC_Y, KC_SCLN
#define _________________COLEMAK_R2________________ KC_H, KC_N, KC_E, KC_I, KC_O
#define _________________COLEMAK_R3________________ KC_K, KC_M, KC_COMM, KC_DOT, KC_SLASH
#define ______________COLEMAK_MOD_DH_L1____________ KC_Q, KC_W, KC_F, KC_P, KC_B
#define ______________COLEMAK_MOD_DH_L2____________ KC_A, KC_R, KC_S, KC_T, KC_G
#define ______________COLEMAK_MOD_DH_L3____________ KC_Z, KC_X, KC_C, KC_D, KC_V
#define ______________COLEMAK_MOD_DH_R1____________ KC_J, KC_L, KC_U, KC_Y, KC_SCLN
#define ______________COLEMAK_MOD_DH_R2____________ KC_M, KC_N, KC_E, KC_I, KC_O
#define ______________COLEMAK_MOD_DH_R3____________ KC_K, KC_H, KC_COMM, KC_DOT, KC_SLASH
#define ________________FUNCTION_L1________________ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6
#define ________________FUNCTION_L2________________ _______, KC_PGDN, KC_UP, KC_PGUP, _______, KC_LBRC
#define ________________FUNCTION_L3________________ ADJ, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______
#define ________________FUNCTION_L4________________ _______, _______, _______, _______, _______, _______
#define ________________FUNCTION_L5________________ _______, _______, _______, _______, ADJ, _______
#define ________________FUNCTION_R1________________ KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12
#define ________________FUNCTION_R2________________ KC_RBRC, KC_7, KC_UP, KC_9, KC_0, KC_HOME
#define ________________FUNCTION_R3________________ _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_RBRC, KC_END
#define ________________FUNCTION_R4________________ _______, _______, _______, KC_PGDN, KC_PGUP, _______
#define ________________FUNCTION_R5________________ ADJ, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU
#define _________________ADJUST_L1_________________ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6
#define _________________ADJUST_L2_________________ _______, RGB_SAD, RGB_VAI, RGB_SAI, RESET, _______
#define _________________ADJUST_L3_________________ _______, RGB_HUD, RGB_VAD, RGB_HUI, RGBRST, _______
#define _________________ADJUST_L4_________________ _______, _______, _______, _______, _______, _______
#define _________________ADJUST_L5_________________ _______, _______, _______, _______, _______, _______
#define _________________ADJUST_R1_________________ KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12
#define _________________ADJUST_R2_________________ _______, _______, _______, _______, _______, KC_DEL
#define _________________ADJUST_R3_________________ _______, QWERTY, COLEMAK, CMAK_DH, _______, _______
#define _________________ADJUST_R4_________________ _______, _______, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI
#define _________________ADJUST_R5_________________ _______, _______, RGB_RMOD,RGB_HUD, RGB_SAD, RGB_VAD

@ -1,44 +0,0 @@
#include "kageurufu.h"
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case QWERTY:
if (record->event.pressed) {
set_single_persistent_default_layer(_QWERTY);
}
return false;
break;
case COLEMAK:
if(record->event.pressed) {
set_single_persistent_default_layer(_COLEMAK);
}
return false;
break;
case RGBRST:
#ifdef RGBLIGHT_ENABLE
if (record->event.pressed) {
eeconfig_update_rgblight_default();
rgblight_enable();
}
#endif
break;
}
return process_record_keymap(keycode, record) &&
#if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE)
process_record_rgb(keycode, record) &&
#endif // RGBLIGHT_ENABLE;
true;
}
__attribute__ ((weak))
bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
return true;
}
__attribute__ ((weak))
bool process_record_rgb(uint16_t keycode, keyrecord_t *record) {
return true;
}

@ -1,27 +0,0 @@
#pragma once
#include "kageurufu.h"
#define FN_ESC LT(_FN, KC_ESC)
#define FN MO(_FN)
#define ADJ MO(_ADJ)
enum layer_number {
_QWERTY = 0,
_COLEMAK,
_COLEMAK_DH,
_FN,
_ADJ,
ADDITIONAL_LAYER
};
enum custom_keycodes {
QWERTY = SAFE_RANGE,
COLEMAK,
CMAK_DH,
RGBRST,
KAGEURUFU_SAFE_RANGE
};
bool process_record_keymap(uint16_t keycode, keyrecord_t *record);
bool process_record_rgb(uint16_t keycode, keyrecord_t *record);

@ -1,14 +0,0 @@
Copyright 2018- Franklyn Tackitt franklyn@tackitt.net @kageurufu
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/>.

@ -1,15 +0,0 @@
SRC += kageurufu.c \
process_records.c \
custom_rgb.c
# Link time optimization, should save on firmware size
EXTRAFLAGS += -flto
# Some usual defaults
MOUSEKEY_ENABLE = no
EXTRAKEY_ENABLE = yes
COMMAND_ENABLE = yes
CONSOLE_ENABLE = yes
RGBLIGHT_ENABLE = yes
RGBLIGHT_ANIMATIONS = yes

@ -1,22 +0,0 @@
#pragma once
#define FORCE_NKRO
#define MOUSEKEY_DELAY 50
#define MOUSEKEY_INTERVAL 15
#define MOUSEKEY_MAX_SPEED 4
#define MOUSEKEY_TIME_TO_MAX 50
#define MOUSEKEY_WHEEL_MAX_SPEED 1
#define MOUSEKEY_WHEEL_TIME_TO_MAX 50
#define NO_ACTION_FUNCTION
#define NO_ACTION_MACRO
#define NO_ACTION_ONESHOT
#define PERMISSIVE_HOLD
#define TAPPING_TERM 200
#define TAPPING_TOGGLE 2
#define UNICODE_CYCLE_PERSIST false
#define UNICODE_SELECTED_MODES UC_WINC, UC_WIN, UC_LNX
#define UNICODE_WINC_KEY KC_RGUI

@ -1,110 +0,0 @@
#include "konstantin.h"
__attribute__((weak))
void keyboard_pre_init_keymap(void) {}
void keyboard_pre_init_user(void) {
keyboard_pre_init_keymap();
}
__attribute__((weak))
void eeconfig_init_keymap(void) {}
void eeconfig_init_user(void) {
eeconfig_init_keymap();
}
__attribute__((weak))
void keyboard_post_init_keymap(void) {}
void keyboard_post_init_user(void) {
keyboard_post_init_keymap();
}
__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;
}
#ifdef LAYER_NUMPAD
void toggle_numpad(void) {
layer_invert(L_NUMPAD);
bool numpad = IS_LAYER_ON(L_NUMPAD), num_lock = IS_HOST_LED_ON(USB_LED_NUM_LOCK);
if (num_lock != numpad) {
tap_code(KC_NLCK); // Toggle Num Lock to match layer state
}
}
#endif
switch (keycode) {
case CLEAR:
if (record->event.pressed) {
SEND_STRING(SS_LCTRL("a") SS_TAP(X_DELETE));
}
return false;
case DST_P_R:
(record->event.pressed ? register_code16 : unregister_code16)(
(get_mods() & DST_MOD_MASK) ? DST_REM : DST_PRV
);
return false;
case DST_N_A:
(record->event.pressed ? register_code16 : unregister_code16)(
(get_mods() & DST_MOD_MASK) ? DST_ADD : DST_NXT
);
return false;
#ifdef LAYER_FN
static bool fn_lock;
case FN_FNLK:
if (record->event.pressed && record->tap.count == TAPPING_TOGGLE) {
fn_lock = !IS_LAYER_ON(L_FN); // Fn layer will be toggled after this
}
return true;
#endif
#ifdef LAYER_NUMPAD
case NUMPAD:
if (record->event.pressed) {
toggle_numpad();
}
return false;
#endif
case KC_ESC:
if (record->event.pressed) {
#ifdef LAYER_NUMPAD
if (IS_LAYER_ON(L_NUMPAD)) {
toggle_numpad();
return false;
}
#endif
#ifdef LAYER_FN
if (IS_LAYER_ON(L_FN) && fn_lock) {
layer_off(L_FN);
return fn_lock = false;
}
#endif
}
return true;
default:
return true;
}
}
__attribute__((weak))
uint32_t layer_state_set_keymap(uint32_t state) {
return state;
}
uint32_t layer_state_set_user(uint32_t state) {
return layer_state_set_keymap(state);
}

@ -1,81 +0,0 @@
#pragma once
#include "quantum.h"
#if defined(RGBLIGHT_ENABLE) || defined(RGBMATRIX_ENABLE)
#include "rgb.h"
#endif
#ifdef TAP_DANCE_ENABLE
#include "tap_dance.h"
#endif
#if defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE)
#include "unicode.h"
#endif
#ifdef LAYER_FN
#define FN MO(L_FN)
#define FN_CAPS LT(L_FN, KC_CAPS)
#define FN_FNLK TT(L_FN)
#endif
#define KC_SYSR LALT(KC_PSCR)
#undef KC_BRK
#define KC_BRK LCTL(KC_PAUS)
#define MV_UP LCTL(KC_UP)
#define MV_DOWN LCTL(KC_DOWN)
#define MV_LEFT LCTL(KC_LEFT)
#define MV_RGHT LCTL(KC_RGHT)
#define TOP LCTL(KC_HOME)
#define BOTTOM LCTL(KC_END)
#define PRV_TAB LCTL(KC_PGUP)
#define NXT_TAB LCTL(KC_PGDN)
#define DST_ADD LCTL(LGUI(KC_D))
#define DST_REM LCTL(LGUI(KC_F4))
#define DST_PRV LCTL(LGUI(KC_LEFT))
#define DST_NXT LCTL(LGUI(KC_RGHT))
#ifndef DST_MOD_MASK
#define DST_MOD_MASK MOD_MASK_CTRL
#endif
#define LCT_CPS LCTL_T(KC_CAPS)
#ifdef SEND_STRING_CLEAN
#undef SEND_STRING
#define SEND_STRING(string) { \
uint8_t ss_mods = get_mods(); \
clear_mods(); \
send_string_P(PSTR(string)); \
set_mods(ss_mods); \
}
#endif
enum keycodes_user {
CLEAR = SAFE_RANGE,
DST_P_R,
DST_N_A,
#ifdef LAYER_NUMPAD
NUMPAD,
#endif
RANGE_KEYMAP,
};
enum layers_user {
L_BASE,
#ifdef LAYER_FN
L_FN,
#endif
#ifdef LAYER_NUMPAD
L_NUMPAD,
#endif
L_RANGE_KEYMAP,
};
void keyboard_pre_init_keymap(void);
void eeconfig_init_keymap(void);
void keyboard_post_init_keymap(void);
bool process_record_keymap(uint16_t keycode, keyrecord_t *record);
uint32_t layer_state_set_keymap(uint32_t state);

@ -1,24 +0,0 @@
#include "rgb.h"
#ifdef RGBLIGHT_EFFECT_BREATHING
const uint8_t RGBLED_BREATHING_INTERVALS[] PROGMEM = {20, 30, 5, 10};
#endif
#ifdef RGBLIGHT_EFFECT_RAINBOW_MOOD
const uint8_t RGBLED_RAINBOW_MOOD_INTERVALS[] PROGMEM = {20, 50, 100};
#endif
#ifdef RGBLIGHT_EFFECT_RAINBOW_SWIRL
const uint8_t RGBLED_RAINBOW_SWIRL_INTERVALS[] PROGMEM = {20, 50, 100};
#endif
#ifdef RGBLIGHT_EFFECT_SNAKE
const uint8_t RGBLED_SNAKE_INTERVALS[] PROGMEM = {20, 50, 100};
#endif
#ifdef RGBLIGHT_EFFECT_KNIGHT
const uint8_t RGBLED_KNIGHT_INTERVALS[] PROGMEM = {20, 50, 100};
#endif
const hsv_t GODSPEED_BLUE = { .h = 280, .s = 68, .v = RGBLIGHT_LIMIT_VAL };
const hsv_t GODSPEED_YELLOW = { .h = 38, .s = 153, .v = RGBLIGHT_LIMIT_VAL };

@ -1,18 +0,0 @@
#pragma once
#include "quantum.h"
typedef struct {
uint16_t h; // 0360
uint8_t s; // 0255
uint8_t v; // 0255
} hsv_t;
typedef struct {
uint8_t r; // 0255
uint8_t g; // 0255
uint8_t b; // 0255
} rgb_t;
extern const hsv_t GODSPEED_BLUE;
extern const hsv_t GODSPEED_YELLOW;

@ -1,12 +0,0 @@
SRC += konstantin.c
ifneq (,$(filter yes,$(RGBLIGHT_ENABLE) $(RGB_MATRIX_ENABLE))) # if either is yes
SRC += rgb.c
endif
ifeq ($(strip $(TAP_DANCE_ENABLE)), yes)
SRC += tap_dance.c
endif
ifneq (,$(filter yes,$(UNICODE_ENABLE) $(UNICODEMAP_ENABLE))) # if either is yes
SRC += unicode.c
endif
EXTRAFLAGS += -flto

@ -1,117 +0,0 @@
#include "tap_dance.h"
#include "konstantin.h"
#define ACTION_TAP_DANCE_DOUBLE_MOD(mod1, mod2) { \
.fn = { td_double_mod_each, NULL, td_double_mod_reset }, \
.user_data = &(qk_tap_dance_pair_t){ mod1, mod2 }, \
}
void td_double_mod_each(qk_tap_dance_state_t *state, void *user_data) {
qk_tap_dance_pair_t *data = (qk_tap_dance_pair_t *)user_data;
// Single tap → mod1, double tap → mod2, triple tap etc. → mod1+mod2
if (state->count == 1 || state->count == 3) {
register_code(data->kc1);
} else if (state->count == 2) {
unregister_code(data->kc1);
register_code(data->kc2);
}
// Prevent tap dance from sending the mods as weak mods
state->weak_mods &= ~(MOD_BIT(data->kc1) | MOD_BIT(data->kc2));
}
void td_double_mod_reset(qk_tap_dance_state_t *state, void *user_data) {
qk_tap_dance_pair_t *data = (qk_tap_dance_pair_t *)user_data;
if (state->count == 1 || state->count >= 3) {
unregister_code(data->kc1);
}
if (state->count >= 2) {
unregister_code(data->kc2);
}
}
#define ACTION_TAP_DANCE_MOD_LAYER(mod, layer) { \
.fn = { td_mod_layer_each, NULL, td_mod_layer_reset }, \
.user_data = &(qk_tap_dance_dual_role_t){ mod, layer }, \
}
void td_mod_layer_each(qk_tap_dance_state_t *state, void *user_data) {
qk_tap_dance_dual_role_t *data = (qk_tap_dance_dual_role_t *)user_data;
// Single tap → mod, double tap → layer, triple tap etc. → mod+layer
if (state->count == 1 || state->count == 3) {
register_code(data->kc);
} else if (state->count == 2) {
unregister_code(data->kc);
// Prevent tap dance from sending the mod as a weak mod
state->weak_mods &= ~MOD_BIT(data->kc);
layer_on(data->layer);
}
}
void td_mod_layer_reset(qk_tap_dance_state_t *state, void *user_data) {
qk_tap_dance_dual_role_t *data = (qk_tap_dance_dual_role_t *)user_data;
if (state->count == 1 || state->count >= 3) {
unregister_code(data->kc);
}
if (state->count >= 2) {
layer_off(data->layer);
}
}
#define ACTION_TAP_DANCE_LAYER_MOD(layer, mod) { \
.fn = { td_layer_mod_each, NULL, td_layer_mod_reset }, \
.user_data = &(qk_tap_dance_layer_mod_t){ layer, mod, 0, 0 }, \
}
typedef struct {
uint8_t layer;
uint16_t kc;
bool layer_on; // Layer state when tap dance started
bool started;
} qk_tap_dance_layer_mod_t;
void td_layer_mod_each(qk_tap_dance_state_t *state, void *user_data) {
qk_tap_dance_layer_mod_t *data = (qk_tap_dance_layer_mod_t *)user_data;
if (!data->started) {
data->layer_on = IS_LAYER_ON(data->layer);
data->started = true;
}
// Single tap → layer, double tap → mod, triple tap etc. → layer+mod
if (state->count == 1 || state->count == 3) {
layer_on(data->layer);
} else if (state->count == 2) {
if (!data->layer_on) {
layer_off(data->layer);
}
register_code(data->kc);
}
}
void td_layer_mod_reset(qk_tap_dance_state_t *state, void *user_data) {
qk_tap_dance_layer_mod_t *data = (qk_tap_dance_layer_mod_t *)user_data;
if ((state->count == 1 || state->count >= 3) && !data->layer_on) {
layer_off(data->layer);
}
if (state->count >= 2) {
unregister_code(data->kc);
}
data->started = false;
}
qk_tap_dance_action_t tap_dance_actions[] = {
[TD_DST_A_R] = ACTION_TAP_DANCE_DOUBLE(DST_ADD, DST_REM),
[TD_RAL_LAL] = ACTION_TAP_DANCE_DOUBLE_MOD(KC_RALT, KC_LALT),
[TD_RAL_RGU] = ACTION_TAP_DANCE_DOUBLE_MOD(KC_RALT, KC_RGUI),
[TD_RCT_RSF] = ACTION_TAP_DANCE_DOUBLE_MOD(KC_RCTL, KC_RSFT),
[TD_LSFT_FN] = ACTION_TAP_DANCE_MOD_LAYER(KC_LSFT, L_FN),
[TD_RCTL_FN] = ACTION_TAP_DANCE_MOD_LAYER(KC_RCTL, L_FN),
[TD_FN_RCTL] = ACTION_TAP_DANCE_LAYER_MOD(L_FN, KC_RCTL),
};

@ -1,25 +0,0 @@
#pragma once
#include "quantum.h"
#define DST_A_R TD(TD_DST_A_R)
#define RAL_LAL TD(TD_RAL_LAL)
#define RAL_RGU TD(TD_RAL_RGU)
#define RCT_RSF TD(TD_RCT_RSF)
#define LSFT_FN TD(TD_LSFT_FN)
#define RCTL_FN TD(TD_RCTL_FN)
#define FN_RCTL TD(TD_FN_RCTL)
enum tap_dance {
TD_DST_A_R,
TD_RAL_LAL,
TD_RAL_RGU,
TD_RCT_RSF,
TD_LSFT_FN,
TD_RCTL_FN,
TD_FN_RCTL,
};

@ -1,7 +0,0 @@
#include "unicode.h"
#ifdef UNICODEMAP_ENABLE
const uint32_t PROGMEM unicode_map[] = {
FOREACH_UNICODE(UCM_ENTRY)
};
#endif

@ -1,34 +0,0 @@
#pragma once
#include "quantum.h"
#define FOREACH_UNICODE(M) \
M(COMMA, 0x002C) \
M(L_PAREN, 0x0028) \
M(R_PAREN, 0x0029) \
M(EQUALS, 0x003D) \
M(TIMES, 0x00D7) \
M(DIVIDE, 0x00F7) \
M(MINUS, 0x2212)
#define UC_KEYCODE(name, code) name = UC(code),
#define UCM_NAME(name, code) UCM_ ## name,
#define UCM_ENTRY(name, code) [UCM_ ## name] = code,
#define UCM_KEYCODE(name, code) name = X(UCM_ ## name),
#if defined(UNICODE_ENABLE)
enum unicode_keycodes {
FOREACH_UNICODE(UC_KEYCODE)
};
#elif defined(UNICODEMAP_ENABLE)
enum unicode_names {
FOREACH_UNICODE(UCM_NAME)
};
extern const uint32_t PROGMEM unicode_map[];
enum unicode_keycodes {
FOREACH_UNICODE(UCM_KEYCODE)
};
#endif

@ -1,111 +0,0 @@
#include "kuatsure.h"
void tmux_prefix(void) {
register_code(KC_LCTL);
register_code(KC_SPC);
unregister_code(KC_LCTL);
unregister_code(KC_SPC);
}
void tmux_pane_zoom(void) {
tmux_prefix();
register_code(KC_Z);
unregister_code(KC_Z);
}
void tmux_pane_switch(uint16_t keycode) {
tmux_prefix();
register_code(KC_Q);
unregister_code(KC_Q);
register_code(keycode);
unregister_code(keycode);
}
void tmux_window_switch(uint16_t keycode) {
tmux_prefix();
register_code(keycode);
unregister_code(keycode);
}
LEADER_EXTERNS();
void matrix_scan_user(void) {
LEADER_DICTIONARY() {
leading = false;
leader_end();
// Available seqs
// SEQ_ONE_KEY, SEQ_TWO_KEYS, SEQ_THREE_KEYS
// anything you can do in a macro https://docs.qmk.fm/macros.html
// https://docs.qmk.fm/feature_leader_key.html
// Whole Screen Shot
SEQ_ONE_KEY(KC_A) {
register_code(KC_LGUI);
register_code(KC_LSFT);
register_code(KC_3);
unregister_code(KC_3);
unregister_code(KC_LSFT);
unregister_code(KC_LGUI);
}
// Selective Screen Shot
SEQ_ONE_KEY(KC_S) {
register_code(KC_LGUI);
register_code(KC_LSFT);
register_code(KC_4);
unregister_code(KC_4);
unregister_code(KC_LSFT);
unregister_code(KC_LGUI);
}
// TMUX - shift to pane 1 and zoom
SEQ_ONE_KEY(KC_J) {
tmux_pane_switch(KC_1);
tmux_pane_zoom();
}
// TMUX - shift to pane 2 and zoom
SEQ_ONE_KEY(KC_K) {
tmux_pane_switch(KC_2);
tmux_pane_zoom();
}
// TMUX - shift to pane 3 and zoom
SEQ_ONE_KEY(KC_L) {
tmux_pane_switch(KC_3);
tmux_pane_zoom();
}
// TMUX - shift to last pane and zoom
SEQ_ONE_KEY(KC_SCOLON) {
tmux_prefix();
register_code(KC_SCOLON);
unregister_code(KC_SCOLON);
tmux_pane_zoom();
}
// TMUX - shift to first window
SEQ_ONE_KEY(KC_U) {
tmux_window_switch(KC_1);
}
// TMUX - shift to second window
SEQ_ONE_KEY(KC_I) {
tmux_window_switch(KC_2);
}
// TMUX - shift to third window
SEQ_ONE_KEY(KC_O) {
tmux_window_switch(KC_3);
}
}
}

@ -1,33 +0,0 @@
#ifndef KUATSURE
#define KUATSURE
#include "quantum.h"
void tmux_prefix(void);
void tmux_pane_zoom(void);
void tmux_pane_switch(uint16_t keycode);
void tmux_window_switch(uint16_t keycode);
#define KT_CESC CTL_T(KC_ESC)
#undef LEADER_TIMEOUT
#define LEADER_TIMEOUT 300
#define LAYOUT_preonic_grid_wrapper(...) LAYOUT_preonic_grid(__VA_ARGS__)
#define _________________NUMBER_L1_________________ KC_1, KC_2, KC_3, KC_4, KC_5
#define _________________NUMBER_R1_________________ KC_6, KC_7, KC_8, KC_9, KC_0
#define _________________QWERTY_L1_________________ KC_Q, KC_W, KC_E, KC_R, KC_T
#define _________________QWERTY_L2_________________ KC_A, KC_S, KC_D, KC_F, KC_G
#define _________________QWERTY_L3_________________ KC_Z, KC_X, KC_C, KC_V, KC_B
#define _________________QWERTY_R1_________________ KC_Y, KC_U, KC_I, KC_O, KC_P
#define _________________QWERTY_R2_________________ KC_H, KC_J, KC_K, KC_L, KC_SCLN
#define _________________QWERTY_R3_________________ KC_N, KC_M, KC_COMM, KC_DOT, KC_SLASH
#define ____________FUNCTION_1____________ KC_F1, KC_F2, KC_F3, KC_F4
#define ____________FUNCTION_2____________ KC_F5, KC_F6, KC_F7, KC_F8
#define ____________FUNCTION_3____________ KC_F9, KC_F10, KC_F11, KC_F12
#endif

@ -1,14 +0,0 @@
Copyright 2018 Jarrett Drouillard jarrett@thestyl.us @kuatsure
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/>.

@ -1,3 +0,0 @@
CONSOLE_ENABLE = no
SRC += kuatsure.c

@ -1,185 +0,0 @@
losinggeneration's ortholinear layout
============================
### Features
- Main layer(s)
- The left space bar key has been changed to delete to have backspace
& delete on the same main layer.
- Adujst is a tap dance with one tap goes to the Adjust layer, second tap
goes to the Numpad layer, a third tap goes to the Mouse layer. More taps
are an error and disables tapping until you stop and try again.
- Ctrl when tapped once & Ctrl+Alt when tapped twice
- Left Alt when tapped once & Right Alt when tapped twice.
- Left GUI when tapped once & right GUI when tapped twice. This is
because I have a compose key on the right GUI key.
- Left shift is a one shot modifier.
- Enter when tapped Shift when held.
- Esc when tapped Ctrl when held.
- Lower & Raise
- Removed ISO ~, ISO |, ISO #, ISO /, Media Next, & Media Play
- Added PgUp, PgDn, Home, & End under the home row
- Added Mute next to Vol-
- New layers: Workman, Game, Numpad, & Mouse
## Layouts
These include the 5x12 layout since it's nearly identical to the 4x12 layout.
The only difference is the top row is removed for the 4x12 layout.
The Adjust layer keyboard specific, so it's described with the specific
keyboard.
### Qwerty
```
,-----------------------------------------..-----------------------------------------.
| ` | 1 | 2 | 3 | 4 | 5 || 6 | 7 | 8 | 9 | 0 | Del |
|------+------+------+------+------+------||------+------+------+------+------+------|
| Tab | Q | W | E | R | T || Y | U | I | O | P | Bksp |
|------+------+------+------+------+------||------+------+------+------+------+------|
| Esc | A | S | D | F | G || H | J | K | L | ; | " |
|------+------+------+------+------+------||------+------+------+------+------+------|
| Shift| Z | X | C | V | B || N | M | , | . | / |Enter |
|------+------+------+------+------+------||------+------+------+------+------+------|
|Adjust| Ctrl | Alt | GUI |Lower | Bksp ||Space |Raise | Left | Down | Up |Right |
`-----------------------------------------'`-----------------------------------------'
```
### Colemak
```
,-----------------------------------------.,-----------------------------------------.
| ` | 1 | 2 | 3 | 4 | 5 || 6 | 7 | 8 | 9 | 0 | Del |
|------+------+------+------+------+------||------+------+------+------+------+------|
| Tab | Q | W | F | P | G || J | L | U | Y | ; | Bksp |
|------+------+------+------+------+------||------+------+------+------+------+------|
| Esc | A | R | S | T | D || H | N | E | I | O | " |
|------+------+------+------+------+------||------+------+------+------+------+------|
| Shift| Z | X | C | V | B || K | M | , | . | / |Enter |
|------+------+------+------+------+------||------+------+------+------+------+------|
|Adjust| Ctrl | Alt | GUI |Lower | Bksp ||Space |Raise | Left | Down | Up |Right |
`-----------------------------------------'`-----------------------------------------'
```
### Workman
```
,-----------------------------------------..-----------------------------------------.
| ` | 1 | 2 | 3 | 4 | 5 || 6 | 7 | 8 | 9 | 0 | Del |
|------+------+------+------+------+------||------+------+------+------+------+------|
| Tab | Q | D | R | W | B || J | F | U | P | ; | Bksp |
|------+------+------+------+------+------||------+------+------+------+------+------|
| Esc | A | S | H | T | G || Y | N | E | O | I | " |
|------+------+------+------+------+------||------+------+------+------+------+------|
| Shift| Z | X | M | C | V || K | L | , | . | / |Enter |
|------+------+------+------+------+------||------+------+------+------+------+------|
|Adjust| Ctrl | Alt | GUI |Lower | Bksp ||Space |Raise | Left | Down | Up |Right |
`-----------------------------------------'`-----------------------------------------'
```
### Dvorak
```
,-----------------------------------------..-----------------------------------------.
| ` | 1 | 2 | 3 | 4 | 5 || 6 | 7 | 8 | 9 | 0 | Del |
|------+------+------+------+------+------||------+------+------+------+------+------|
| Tab | " | , | . | P | Y || F | G | C | R | L | Bksp |
|------+------+------+------+------+------||------+------+------+------+------+------|
| Esc | A | O | E | U | I || D | H | T | N | S | / |
|------+------+------+------+------+------||------+------+------+------+------+------|
| Shift| ; | Q | J | K | X || B | M | W | V | Z |Enter |
|------+------+------+------+------+------||------+------+------+------+------+------|
|Adjust| Ctrl | Alt | GUI |Lower | Bksp ||Space |Raise | Left | Down | Up |Right |
`-----------------------------------------'`-----------------------------------------'
```
### Game (Qwerty without one shot modifiers & tap dancing)
```
,-----------------------------------------..-----------------------------------------.
| ` | 1 | 2 | 3 | 4 | 5 || 6 | 7 | 8 | 9 | 0 | Del |
|------+------+------+------+------+------||------+------+------+------+------+------|
| Tab | Q | W | E | R | T || Y | U | I | O | P | Bksp |
|------+------+------+------+------+------||------+------+------+------+------+------|
| Esc | A | S | D | F | G || H | J | K | L | ; | " |
|------+------+------+------+------+------||------+------+------+------+------+------|
| Shift| Z | X | C | V | B || N | M | , | . | / |Enter |
|------+------+------+------+------+------||------+------+------+------+------+------|
|Adjust| Ctrl | Alt | GUI |Lower |Space ||Space |Raise | Left | Down | Up |Right |
`-----------------------------------------'`-----------------------------------------'
```
### Number pad
```
,-----------------------------------------..-----------------------------------------.
| XXX | XXX | XXX | XXX | XXX | XXX || XXX | NLCK | * | / | BKSP | BKSP |
|------+------+------+------+------+------||------+------+------+------+------+------|
| Tab | XXX | XXX | XXX | XXX | XXX || NLCK | 7 | 8 | 9 | - | BKSP |
|------+------+------+------+------+------||------+------+------+------+------+------|
| Esc | XXX | XXX | XXX | XXX | XXX || * | 4 | 5 | 6 | + | BKSP |
|------+------+------+------+------+------||------+------+------+------+------+------|
|Shift | XXX | XXX | XXX | XXX | XXX || / | 1 | 2 | 3 | ENT | XXX |
|------+------+------+------+------+------||------+------+------+------+------+------|
|Adjust| Ctrl | Alt | GUI | XXX |Space ||Space | 0 | 0 | . | ENT | XXX |
`-----------------------------------------''-----------------------------------------'
```
### Mouse movement
* M is short for Mouse
* MW is short for Mouse Wheel
* MB is short for Mouse Button
* MA is short for Mouse Acceleration
&nbsp;
* MB\_1 is the left click
* MB\_2 is the right click
* MB\_3 is the middle click
```
,-----------------------------------------..-----------------------------------------.
| XXX | XXX | XXX | XXX | XXX | XXX || XXX | XXX | XXX | XXX | XXX | XXX |
|------+------+------+------+------+------||------+------+------+------+------+------|
| Tab | MB_1 | MB_3 | MB_2 | MB_4 | MB_5 || MA_0 | MB_1 | MB_3 | MB_2 | MB_4 | MB_5 |
|------+------+------+------+------+------||------+------+------+------+------+------|
| Esc | MW_L | MW_U | MW_D | MW_R | XXX || MA_1 | M_LT | M_UP | M_DN | M_RT | XXX |
|------+------+------+------+------+------||------+------+------+------+------+------|
|Shift | MA_0 | MA_1 | MA_2 | XXX | XXX || MA_2 | MW_L | MW_U | MW_D | MW_R | XXX |
|------+------+------+------+------+------||------+------+------+------+------+------|
|Adjust| Ctrl | Alt | GUI | XXX |Space || XXX | XXX | XXX | XXX | XXX | XXX |
`-----------------------------------------''-----------------------------------------'
```
### Lower
```
,-----------------------------------------..-----------------------------------------.
| ~ | ! | @ | # | $ | % || ^ | & | * | ( | ) | Del |
|------+------+------+------+------+------||------+------+------+------+------+------|
| ~ | ! | @ | # | $ | % || ^ | & | * | ( | ) | Bksp |
|------+------+------+------+------+------||------+------+------+------+------+------|
| Del | F1 | F2 | F3 | F4 | F5 || F6 | _ | + | | \ | | |
|------+------+------+------+------+------||------+------+------+------+------+------|
| | F7 | F8 | F9 | F10 | F11 || F12 | PgUp | PgDn | Home | End | ⏹ |
|------+------+------+------+------+------||------+------+------+------+------+------|
| | | | | | || | | Mute | Vol- | Vol+ | ⏯ |
`-----------------------------------------'`-----------------------------------------'
```
### Raise
```
,-----------------------------------------..-----------------------------------------.
| ` | 1 | 2 | 3 | 4 | 5 || 6 | 7 | 8 | 9 | 0 | Del |
|------+------+------+------+------+------||------+------+------+------+------+------|
| ` | 1 | 2 | 3 | 4 | 5 || 6 | 7 | 8 | 9 | 0 | Bksp |
|------+------+------+------+------+------||------+------+------+------+------+------|
| Del | F1 | F2 | F3 | F4 | F5 || F6 | - | = | [ | ] | \ |
|------+------+------+------+------+------||------+------+------+------+------+------|
| | F7 | F8 | F9 | F10 | F11 || F12 | PgUp | PgDn | Home | End | ⏹ |
|------+------+------+------+------+------||------+------+------+------+------+------|
| | | | | | || | | Mute | Vol- | Vol+ | ⏯ |
`-----------------------------------------''-----------------------------------------'
```

@ -1,71 +0,0 @@
#ifndef LOSINGGENERATION_COMMON_H
#define LOSINGGENERATION_COMMON_H
/* Custom keys & combinations to be shorter for keymaps */
#define KC_LCA LCA(KC_NO)
#define OSM_LSFT OSM(MOD_LSFT)
#define TD_CTL TD(TD_CTL_CTLALT)
#define TD_GUI TD(TD_LGUI_RGUI)
#define TD_ALT TD(TD_LALT_RALT)
#define MT_ENT SFT_T(KC_ENT)
#define MT_ESC CTL_T(KC_ESC)
/* Custom layer movements for keymaps */
#define TD_ADJ TD(TD_ADJUST)
#define TO_GAME TO(_GAME)
#define TO_MS TO(_MOUSE)
#define TO_NUM TO(_NUMPAD)
#define MO_ADJ MO(_ADJUST)
/* Mouse keys */
#define MS_BTN1 KC_MS_BTN1
#define MS_BTN2 KC_MS_BTN2
#define MS_BTN3 KC_MS_BTN3
#define MS_BTN4 KC_MS_BTN4
#define MS_BTN5 KC_MS_BTN5
#define MS_LEFT KC_MS_LEFT
#define MS_DOWN KC_MS_DOWN
#define MS_UP KC_MS_UP
#define MS_RGHT KC_MS_RIGHT
#define MW_LEFT KC_MS_WH_LEFT
#define MW_DOWN KC_MS_WH_DOWN
#define MW_UP KC_MS_WH_UP
#define MW_RGHT KC_MS_WH_RIGHT
#define MS_ACL0 KC_MS_ACCEL0
#define MS_ACL1 KC_MS_ACCEL1
#define MS_ACL2 KC_MS_ACCEL2
/*
* This will expand values sent to it to send to the KEYMAP macro so defines
* can be used by KEYMAP
*/
#define CATMAP(...) LAYOUT(__VA_ARGS__)
/*
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.
Layer names don't all need to be of the same length, obviously, and you can also skip them
entirely and just use numbers.
*/
#define _QWERTY 0
#define _COLEMAK 1
#define _WORKMAN 2
#define _DVORAK 3
#define _GAME 4
#define _NUMPAD 5
#define _MOUSE 6
#define _LOWER 14
#define _RAISE 15
#define _ADJUST 16
enum custom_keycodes {
QWERTY = SAFE_RANGE,
COLEMAK,
WORKMAN,
DVORAK,
LOWER,
RAISE,
};
#endif

@ -1,29 +0,0 @@
/*
Copyright 2017 Danny Nguyen <danny@hexwire.com>
Copyright 2018 Harley Laue <losinggeneration@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
long with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef LOSINGGENERATION_CONFIG_H
#define LOSINGGENERATION_CONFIG_H
#define MOUSEKEY_DELAY 100
#define MOUSEKEY_INTERVAL 20
#define MOUSEKEY_MAX_SPEED 10
#define MOUSEKEY_TIME_TO_MAX 20
#define MOUSEKEY_WHEEL_MAX_SPEED 8
#define MOUSEKEY_WHEEL_TIME_TO_MAX 20
#endif

@ -1,379 +0,0 @@
#ifndef LOSINGGENERATION_KEYMAP_H
#define LOSINGGENERATION_KEYMAP_H
#include "action_layer.h"
#include "eeconfig.h"
#include "losinggeneration-common.h"
/* Tap dance keycodes */
enum tap_dance_keycodes {
TD_CTL_CTLALT = 0,
TD_LGUI_RGUI,
TD_LALT_RALT,
TD_ADJUST,
};
/*
Used to indicate a CTRL should be pressed on one press, or CTRL+ALT on
a double tap
*/
void dance_ctl_ctlalt_each(qk_tap_dance_state_t *state, void *user_data) {
register_code(KC_LCTL);
if(state->count > 1) {
register_code(KC_LALT);
}
}
/* Used to release CTRL or the double tapped variant CTRL+ALT */
void dance_ctl_ctlalt_reset(qk_tap_dance_state_t *state, void *user_data) {
unregister_code(KC_LCTL);
if(state->count > 1) {
unregister_code(KC_LALT);
}
}
/*
Set ADJUST layer on the first press and off after that.
Each is used to make sure ADJUST activates as soon as it's pressed the first
time.
*/
void dance_adj_each(qk_tap_dance_state_t *state, void *user_data) {
if(state->count == 1) {
layer_on(_ADJUST);
} else {
layer_off(_ADJUST);
}
}
/* Set NUMPAD layer on second tap and MOUSE layer on 3rd */
void dance_adj_finish(qk_tap_dance_state_t *state, void *user_data) {
switch(state->count) {
case 1: break;
case 2:
layer_on(_NUMPAD);
break;
case 3:
layer_on(_MOUSE);
break;
default:
reset_tap_dance(state);
break;
}
}
/* Turn off any layer that may have been tapped on */
void dance_adj_reset(qk_tap_dance_state_t *state, void *user_data) {
switch(state->count) {
case 1:
layer_off(_ADJUST);
break;
case 2:
layer_off(_NUMPAD);
break;
case 3:
layer_off(_MOUSE);
break;
}
}
qk_tap_dance_action_t tap_dance_actions[] = {
[TD_CTL_CTLALT] = ACTION_TAP_DANCE_FN_ADVANCED(dance_ctl_ctlalt_each, NULL, dance_ctl_ctlalt_reset),
[TD_LGUI_RGUI] = ACTION_TAP_DANCE_DOUBLE(KC_LGUI, KC_RGUI),
[TD_LALT_RALT] = ACTION_TAP_DANCE_DOUBLE(KC_LALT, KC_RALT),
[TD_ADJUST] = ACTION_TAP_DANCE_FN_ADVANCED(dance_adj_each, dance_adj_finish, dance_adj_reset),
};
/*
* ,-----------------------------------------..-----------------------------------------.
* |Adjust| Ctrl | Alt | GUI |Lower | Del ||Space |Raise | Left | Down | Up |Right |
* `-----------------------------------------'`-----------------------------------------'
*/
#define BOTTOM_GRID_ROW \
TD_ADJ ,TD_CTL , TD_ALT , TD_GUI , LOWER , KC_DEL , KC_SPC , RAISE , KC_LEFT, KC_DOWN, KC_UP , KC_RGHT
/*
* ,-----------------------------------------..-----------------------------------------.
* |Adjust| Ctrl | Alt | GUI |Lower |Space ||Space |Raise | Left | Down | Up |Right |
* `-----------------------------------------'`-----------------------------------------'
*/
#define BOTTOM_MIT_ROW \
TD_ADJ ,TD_CTL , TD_ALT , TD_GUI , LOWER , KC_SPC , KC_SPC , RAISE , KC_LEFT, KC_DOWN, KC_UP , KC_RGHT
#ifdef USE_MIT_LAYOUT
#define BOTTOM_ROW BOTTOM_MIT_ROW
/*
* ,-----------------------------------------..-----------------------------------------.
* | | F7 | F8 | F9 | F10 | F11 || F12 | PgUp | PgDn | Home | End | |
* |------+------+------+------+------+------||------+------+------+------+------+------|
* | | | | | | || | | Mute | Vol- | Vol+ | |
* `-----------------------------------------'`-----------------------------------------'
*/
#define BOTTOM_RAISE_LOWER_ROWS \
_______, KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11 , KC_F12 , KC_PGUP, KC_PGDN, KC_HOME, KC_END , KC_MSTP, \
_______, _______, _______, _______, _______, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, KC_MPLY
#else
#define BOTTOM_ROW BOTTOM_GRID_ROW
/*
* ,-----------------------------------------..-----------------------------------------.
* | | F7 | F8 | F9 | F10 | F11 || F12 | PgUp | PgDn | Home | End | |
* |------+------+------+------+------+------||------+------+------+------+------+------|
* | | | | | | || Bksp | | Mute | Vol- | Vol+ | |
* `-----------------------------------------'`-----------------------------------------'
*/
#define BOTTOM_RAISE_LOWER_ROWS \
_______, KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11 , KC_F12 , KC_PGUP, KC_PGDN, KC_HOME, KC_END , KC_MSTP, \
_______, _______, _______, _______, _______, KC_BSPC, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, KC_MPLY
#endif
/*
* ,-----------------------------------------..-----------------------------------------.
* | Tab | || | Bksp |
* `-----------------------------------------'`-----------------------------------------'
*/
#define STD_TAB_ROW(...) KC_TAB, __VA_ARGS__, KC_BSPC
/*
* ,-----------------------------------------..-----------------------------------------.
* | Esc | || |
* `-----------------------------------------'`-----------------------------------------'
*/
#define STD_ESC_ROW(...) MT_ESC, __VA_ARGS__
/*
* ,-----------------------------------------..-----------------------------------------.
* | Shift| || |Enter |
* `-----------------------------------------'`-----------------------------------------'
*/
#define STD_LSFT_ROW(...) OSM_LSFT, __VA_ARGS__, MT_ENT
/* Qwerty
* ,-----------------------------------------..-----------------------------------------.
* | Tab | Q | W | E | R | T || Y | U | I | O | P | Bksp |
* |------+------+------+------+------+------||------+------+------+------+------+------|
* | Esc | A | S | D | F | G || H | J | K | L | ; | " |
* |------+------+------+------+------+------||------+------+------+------+------+------|
* | Shift| Z | X | C | V | B || N | M | , | . | / |Enter |
* |------+------+------+------+------+------||------+------+------+------+------+------|
* |Adjust| Ctrl | Alt | GUI |Lower | Del ||Space |Raise | Left | Down | Up |Right |
* `-----------------------------------------'`-----------------------------------------'
*/
#define QWERTY_LAYER \
STD_TAB_ROW( KC_Q , KC_W , KC_E , KC_R , KC_T , KC_Y , KC_U , KC_I , KC_O , KC_P ), \
STD_ESC_ROW( KC_A , KC_S , KC_D , KC_F , KC_G , KC_H , KC_J , KC_K , KC_L , KC_SCLN , KC_QUOT), \
STD_LSFT_ROW(KC_Z , KC_X , KC_C , KC_V , KC_B , KC_N , KC_M , KC_COMM, KC_DOT , KC_SLSH), \
BOTTOM_ROW
/* Colemak
* ,-----------------------------------------.,-----------------------------------------.
* | Tab | Q | W | F | P | G || J | L | U | Y | ; | Bksp |
* |------+------+------+------+------+------||------+------+------+------+------+------|
* | Esc | A | R | S | T | D || H | N | E | I | O | " |
* |------+------+------+------+------+------||------+------+------+------+------+------|
* | Shift| Z | X | C | V | B || K | M | , | . | / |Enter |
* |------+------+------+------+------+------||------+------+------+------+------+------|
* |Adjust| Ctrl | Alt | GUI |Lower | Del ||Space |Raise | Left | Down | Up |Right |
* `-----------------------------------------'`-----------------------------------------'
*/
#define COLEMAK_LAYER \
STD_TAB_ROW( KC_Q , KC_W , KC_F , KC_P , KC_G , KC_J , KC_L , KC_U , KC_Y , KC_SCLN), \
STD_ESC_ROW( KC_A , KC_R , KC_S , KC_T , KC_D , KC_H , KC_N , KC_E , KC_I , KC_O , KC_QUOT), \
STD_LSFT_ROW(KC_Z , KC_X , KC_C , KC_V , KC_B , KC_K , KC_M , KC_COMM, KC_DOT , KC_SLSH), \
BOTTOM_ROW
/* Workman
* ,-----------------------------------------..-----------------------------------------.
* | Tab | Q | D | R | W | B || J | F | U | P | ; | Bksp |
* |------+------+------+------+------+------||------+------+------+------+------+------|
* | Esc | A | S | H | T | G || Y | N | E | O | I | " |
* |------+------+------+------+------+------||------+------+------+------+------+------|
* | Shift| Z | X | M | C | V || K | L | , | . | / |Enter |
* |------+------+------+------+------+------||------+------+------+------+------+------|
* |Adjust| Ctrl | Alt | GUI |Lower | Del ||Space |Raise | Left | Down | Up |Right |
* `-----------------------------------------'`-----------------------------------------'
*/
#define WORKMAN_LAYER \
STD_TAB_ROW( KC_Q , KC_D , KC_R , KC_W , KC_B , KC_J , KC_F , KC_U , KC_P , KC_SCLN), \
STD_ESC_ROW( KC_A , KC_S , KC_H , KC_T , KC_G , KC_Y , KC_N , KC_E , KC_O , KC_I , KC_QUOT), \
STD_LSFT_ROW(KC_Z , KC_X , KC_M , KC_C , KC_V , KC_K , KC_L , KC_COMM, KC_DOT , KC_SLSH), \
BOTTOM_ROW
/* Dvorak
* ,-----------------------------------------..-----------------------------------------.
* | Tab | " | , | . | P | Y || F | G | C | R | L | Bksp |
* |------+------+------+------+------+------||------+------+------+------+------+------|
* | Esc | A | O | E | U | I || D | H | T | N | S | / |
* |------+------+------+------+------+------||------+------+------+------+------+------|
* | Shift| ; | Q | J | K | X || B | M | W | V | Z |Enter |
* |------+------+------+------+------+------||------+------+------+------+------+------|
* |Adjust| Ctrl | Alt | GUI |Lower | Del ||Space |Raise | Left | Down | Up |Right |
* `-----------------------------------------'`-----------------------------------------'
*/
#define DVORAK_LAYER \
STD_TAB_ROW( KC_QUOT, KC_COMM, KC_DOT , KC_P , KC_Y , KC_F , KC_G , KC_C , KC_R , KC_L), \
STD_ESC_ROW( KC_A , KC_O , KC_E , KC_U , KC_I , KC_D , KC_H , KC_T , KC_N , KC_S , KC_SLSH), \
STD_LSFT_ROW(KC_SCLN, KC_Q , KC_J , KC_K , KC_X , KC_B , KC_M , KC_W , KC_V , KC_Z), \
BOTTOM_ROW
/* Game (Qwerty without one shot modifiers & tap dancing)
* ,-----------------------------------------..-----------------------------------------.
* | Tab | Q | W | E | R | T || Y | U | I | O | P | Bksp |
* |------+------+------+------+------+------||------+------+------+------+------+------|
* | Esc | A | S | D | F | G || H | J | K | L | ; | " |
* |------+------+------+------+------+------||------+------+------+------+------+------|
* | Shift| Z | X | C | V | B || N | M | , | . | / |Enter |
* |------+------+------+------+------+------||------+------+------+------+------+------|
* |Adjust| Ctrl | Alt | GUI |Lower |Space ||Space |Raise | Left | Down | Up |Right |
* `-----------------------------------------'`-----------------------------------------'
*/
#define GAME_LAYER \
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_ESC , 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 , \
MO_ADJ , KC_LCTL, KC_LALT, KC_LGUI, LOWER , KC_SPC , KC_SPC , RAISE , KC_LEFT, KC_DOWN, KC_UP , KC_RGHT
/* Number pad
* ,-----------------------------------------..-----------------------------------------.
* | Tab | XXX | XXX | XXX | XXX | XXX || NLCK | 7 | 8 | 9 | - | BKSP |
* |------+------+------+------+------+------||------+------+------+------+------+------|
* | Esc | XXX | XXX | XXX | XXX | XXX || * | 4 | 5 | 6 | + | BKSP |
* |------+------+------+------+------+------||------+------+------+------+------+------|
* |Shift | XXX | XXX | XXX | XXX | XXX || / | 1 | 2 | 3 | ENT | XXX |
* |------+------+------+------+------+------||------+------+------+------+------+------|
* |Adjust| Ctrl | Alt | GUI | XXX |Space ||Space | 0 | 0 | . | ENT | XXX |
* `-----------------------------------------''-----------------------------------------'
*/
#define NUMPAD_LAYER \
KC_TAB , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_NLCK, KC_P7 , KC_P8 , KC_P9 , KC_PMNS, KC_BSPC, \
KC_ESC , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_PAST, KC_P4 , KC_P5 , KC_P6 , KC_PPLS, KC_BSPC, \
KC_LSFT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_PSLS, KC_P1 , KC_P2 , KC_P3 , KC_PENT, XXXXXXX, \
TD_ADJ , TD_CTL , TD_ALT , TD_GUI , XXXXXXX, KC_SPC , KC_SPC , KC_P0 , KC_P0 , KC_PDOT, KC_PENT, XXXXXXX
/* Mouse movement
* ,-----------------------------------------..-----------------------------------------.
* | Tab | MB_1 | MB_3 | MB_2 | MB_4 | MB_5 || MA_0 | MB_1 | MB_3 | MB_2 | MB_4 | MB_5 |
* |------+------+------+------+------+------||------+------+------+------+------+------|
* | Esc | MW_L | MW_U | MW_D | MW_R | XXX || MA_1 | M_LT | M_UP | M_DN | M_RT | XXX |
* |------+------+------+------+------+------||------+------+------+------+------+------|
* |Shift | MA_0 | MA_1 | MA_2 | XXX | XXX || MA_2 | MW_L | MW_U | MW_D | MW_R | XXX |
* |------+------+------+------+------+------||------+------+------+------+------+------|
* |Adjust| Ctrl | Alt | GUI | XXX |Space || XXX | XXX | XXX | XXX | XXX | XXX |
* `-----------------------------------------''-----------------------------------------'
*/
#define MOUSE_LAYER \
KC_TAB , MS_BTN1, MS_BTN3, MS_BTN2, MS_BTN4, MS_BTN5, MS_ACL0, MS_BTN1, MS_BTN3, MS_BTN2, MS_BTN4, MS_BTN5, \
KC_ESC , MW_LEFT, MW_DOWN, MW_UP , MW_RGHT, XXXXXXX, MS_ACL1, MS_LEFT, MS_DOWN, MS_UP , MS_RGHT, XXXXXXX, \
KC_LSFT, MS_ACL0, MS_ACL1, MS_ACL2, XXXXXXX, XXXXXXX, MS_ACL2, MW_LEFT, MW_DOWN, MW_UP , MW_RGHT, XXXXXXX, \
TD_ADJ , TD_CTL , TD_ALT , TD_GUI , XXXXXXX, KC_SPC , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
/* Lower
* ,-----------------------------------------..-----------------------------------------.
* | ~ | ! | @ | # | $ | % || ^ | & | * | ( | ) | Bksp |
* |------+------+------+------+------+------||------+------+------+------+------+------|
* | Del | F1 | F2 | F3 | F4 | F5 || F6 | _ | + | | \ | | |
* |------+------+------+------+------+------||------+------+------+------+------+------|
* | | F7 | F8 | F9 | F10 | F11 || F12 | PgUp | PgDn | Home | End | |
* |------+------+------+------+------+------||------+------+------+------+------+------|
* | | | | | | || | | Mute | Vol- | Vol+ | |
* `-----------------------------------------'`-----------------------------------------'
*/
#define LOWER_LAYER \
KC_TILD, KC_EXLM, KC_AT , KC_HASH, KC_DLR , KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, \
KC_DEL , KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \
BOTTOM_RAISE_LOWER_ROWS
/* Raise
* ,-----------------------------------------..-----------------------------------------.
* | ` | 1 | 2 | 3 | 4 | 5 || 6 | 7 | 8 | 9 | 0 | Bksp |
* |------+------+------+------+------+------||------+------+------+------+------+------|
* | Del | F1 | F2 | F3 | F4 | F5 || F6 | - | = | [ | ] | \ |
* |------+------+------+------+------+------||------+------+------+------+------+------|
* | | F7 | F8 | F9 | F10 | F11 || F12 | PgUp | PgDn | Home | End | |
* |------+------+------+------+------+------||------+------+------+------+------+------|
* | | | | | | || | | Mute | Vol- | Vol+ | |
* `-----------------------------------------''-----------------------------------------'
*/
#define RAISE_LAYER \
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_DEL , KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , KC_MINS, KC_EQL , KC_LBRC, KC_RBRC, KC_BSLS, \
BOTTOM_RAISE_LOWER_ROWS
#ifdef AUDIO_ENABLE
float tone_qwerty[][2] = SONG(QWERTY_SOUND);
float tone_dvorak[][2] = SONG(DVORAK_SOUND);
float tone_colemak[][2] = SONG(COLEMAK_SOUND);
float tone_workman[][2] = SONG(PLOVER_SOUND);
#else
float tone_qwerty;
float tone_dvorak;
float tone_colemak;
float tone_workman;
#define PLAY_SONG(tone)
#endif
void persistent_default_layer_set(uint16_t default_layer) {
layer_state_set(default_layer);
eeconfig_update_default_layer(default_layer);
default_layer_set(default_layer);
}
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case QWERTY:
if (record->event.pressed) {
PLAY_SONG(tone_qwerty);
persistent_default_layer_set(1UL<<_QWERTY);
}
return false;
break;
case COLEMAK:
if (record->event.pressed) {
PLAY_SONG(tone_colemak);
persistent_default_layer_set(1UL<<_COLEMAK);
}
return false;
break;
case WORKMAN:
if (record->event.pressed) {
PLAY_SONG(tone_workman);
persistent_default_layer_set(1UL<<_WORKMAN);
}
return false;
break;
case DVORAK:
if (record->event.pressed) {
PLAY_SONG(tone_dvorak);
persistent_default_layer_set(1UL<<_DVORAK);
}
return false;
break;
case LOWER:
if (record->event.pressed) {
layer_on(_LOWER);
update_tri_layer(_LOWER, _RAISE, _ADJUST);
} else {
layer_off(_LOWER);
update_tri_layer(_LOWER, _RAISE, _ADJUST);
}
return false;
break;
case RAISE:
if (record->event.pressed) {
layer_on(_RAISE);
update_tri_layer(_LOWER, _RAISE, _ADJUST);
} else {
layer_off(_RAISE);
update_tri_layer(_LOWER, _RAISE, _ADJUST);
}
return false;
break;
}
return true;
}
#endif

@ -1,13 +0,0 @@
# Build Options
# Only enable things here that are generic to all keyboards. A yes or no here
# will override keyboard/keymap specific values
#
#BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
#COMMAND_ENABLE = no # Commands for debug and configuration
#CONSOLE_ENABLE = no # Console for debug(+400)
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
#NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
TAP_DANCE_ENABLE = yes # Enable tap dancing
#UNICODE_ENABLE = no # Unicode

@ -1,22 +0,0 @@
# Changelog
All notable changes to my userspace will be documented in this file.
## [0.2.1] - 2019-03-01
### Fixed
- `config.h` usage of `#ifdef RGBLIGHT_ENABLE` caused problems for other of my boards that had `RGBLIGHT_ENABLE`.
## [0.2.0] - 2019-02-27
### Changed
- Moved `AUDIO_CLICKY` from community layout `66_ansi` into user space.
## [0.1.1] - 2018-10-26
### Added
- Added a changelog, aka THIS VERY FILE!
- Added `config.h` to userspace for `RGBLIGHT_SLEEP` feature.
### Changed
- Spruced up the readme file to better explain the things I use in my keymap for would be keymap snoopers. Also useful as an example when people ask.
- Use `CTL_T` instead of `MT` for my custom `KC_CTCP` keycode as it was causing issues on some boards.
## [0.1.0] - 2018-08-31
Initial usage of userspaces!

@ -1,37 +0,0 @@
#pragma once
#ifdef RGBLIGHT_ENABLE
#define RGBLIGHT_SLEEP
#define RGBLIGHT_ANIMATIONS
#endif // RGBLIGHT_ENABLE
#ifdef AUDIO_CLICKY
#define AUDIO_CLICKY_ON
#define AUDIO_CLICKY_FREQ_DEFAULT 261.63f
#define AUDIO_CLICKY_FREQ_MIN 65.41f
#define AUDIO_CLICKY_FREQ_MAX 1046.5f
//#define AUDIO_CLICKY_FREQ_FACTOR 1.18921f
//#define AUDIO_CLICKY_FREQ_FACTOR 2.71828f // e
#define AUDIO_CLICKY_FREQ_FACTOR 1.61803f // golden ratio
#define AUDIO_CLICKY_FREQ_RANDOMNESS 17.0f
#endif
// Enable features depending on keyboard
#if defined(KEYBOARD_clueboard_66_hotswap_prototype)
#ifndef RGBLIGHT_ENABLE
#define RGBLIGHT_ENABLE
#endif
#ifndef AUDIO_CLICKY
#define AUDIO_CLICKY
#endif
#elif defined(KEYBOARD_clueboard_66_hotswap_gen1)
#ifndef AUDIO_CLICKY
#define AUDIO_CLICKY
#endif
#else
#ifndef RGBLIGHT_ENABLE
#define RGBLIGHT_ENABLE
#endif
#endif

@ -1,20 +0,0 @@
#include "mechmerlin.h"
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
static uint16_t fnx_layer_timer;
switch (keycode){
case KC_FNX:
if(record->event.pressed){
fnx_layer_timer = timer_read();
layer_on(_FL);
} else {
layer_off(_FL);
if (timer_elapsed(fnx_layer_timer) < 150) {
layer_invert(_AL);
}
}
return false;
}
return true;
}

@ -1,17 +0,0 @@
#pragma once
#include "quantum.h"
enum userspace_layers {
_BL = 0, // Base Layer
_FL, // Function Layer
_AL // Arrow Layer
};
// Enum of custom keycodes defined in process_record_user
enum keycodes {
KC_FNX, // Hold for FN layer, tap to toggle ARROWS layer.
};
// Custom #defined keycodes
#define KC_CTCP CTL_T(KC_CAPS)

@ -1,48 +0,0 @@
# MechMerlin's Userspace v0.2.0
This is a collection of my most commonly used QMK features.
A majority of my keyboards are smaller than 75%, ANSI, and staggered.
## Layers
----
### _BL (Base Layer)
Typical standard QWERTY keymap.
### _FL (Function Layer)
This layer is commonly accessed via `MO(_FL)` on the base layer. It consists of your typical function key F1 through F12 and some RGB and Backlight controls.
### _AL (Arrow Layer)
This layer is only present on my 60% boards. I habitually use the bottom right modifiers as arrows.
### _CL (Control Layer)
This is not defined in here as it's present only on `LAYOUT_66` boards, or to be specific, my clueboard. It currently uses the default clueboard controls.
## Custom Keycodes
----
### KC_FNX (Fn Extended)
`KC_FNX` functions as a hold for `MO(X)` and tap for `TG(Y)`. Layer X and Y are different layers.
It is used primarily on my `LAYOUT_60_ansi` boards as my regular toggle (the 1u key to the right of right shift), is not present there.
### KC_CTCP (Control Caps)
This is just a wrapper for `CTL_T(KC_CAPS)`. This is a hold for control and tap for caps lock.
## QMK Features
----
### RGBLIGHT_SLEEP
Ensures that when my computer is in sleep mode, the keyboard underglow lights will also be off.
### Audio Clicky
If a board has a speaker, enable beeps and boops per switch actuation. This is currently only available on prototype/gen1 clueboard 66_hotswaps.
### Velocikey
[Velocikey](https://github.com/qmk/qmk_firmware/blob/master/docs/feature_velocikey.md) is an RGBLIGHT feature in which the faster you type, the faster the ARE GEE BEES.

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

@ -1,7 +0,0 @@
#ifndef USERSPACE_CONFIG_H
#define USERSPACE_CONFIG_H
// Put normal config.h settings here:
#define TAPPING_TERM 250
#endif // !USERSPACE_CONFIG_H

@ -1,163 +0,0 @@
#include "mtdjr.h"
#ifdef SOLENOID_ENABLE
#include "solenoid.h"
#endif
#ifndef RGB_MODE
#define RGB_MODE 2
#endif
#ifndef RGB_HUE
#define RGB_HUE 285
#endif
// Tap Dance Definitions
qk_tap_dance_action_t tap_dance_actions[] = {
[TD_ESC] = ACTION_TAP_DANCE_DOUBLE(KC_GRV, KC_ESC),
[TD_ALTLOCK] = ACTION_TAP_DANCE_DOUBLE(KC_RALT, LGUI(KC_L)),
[TD_ENDLOCK] = ACTION_TAP_DANCE_DOUBLE(KC_END, LGUI(KC_L)),
[TD_PRINT] = ACTION_TAP_DANCE_DOUBLE(LGUI(LSFT(KC_3)), LGUI(LSFT(KC_4))),
};
// Macros
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
if (record->event.pressed) {
switch(id) {
case ROOT:
SEND_STRING("sudo su -\n");
return false; break;
case PPLY:
SEND_STRING("puppet apply /etc/puppetlabs/code/environments/production/manifests/site.pp\n");
return false; break;
case PSEF:
SEND_STRING("ps -ef | grep ");
return false; break;
}
}
return MACRO_NONE;
};
void matrix_init_user(void) {
#ifdef RGBLIGHT_ENABLE
rgblight_enable_noeeprom();
rgblight_mode_noeeprom(RGB_MODE);
rgblight_sethsv (RGB_HUE, 255, 255);
#endif
#ifdef SOLENOID_ENABLE
solenoid_setup();
#endif
}
void matrix_scan_user(void) {
#ifdef SOLENOID_ENABLE
solenoid_check();
#endif
}
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
#ifdef SOLENOID_ENABLE
if (record->event.pressed) {
solenoid_fire();
}
#endif
switch (keycode) {
case QWERTY:
if (record->event.pressed) {
set_single_persistent_default_layer(_QWERTY);
}
return false;
break;
case LOWER:
if (record->event.pressed) {
layer_on(_LOWER);
update_tri_layer(_LOWER, _RAISE, _ADJUST);
} else {
layer_off(_LOWER);
update_tri_layer(_LOWER, _RAISE, _ADJUST);
}
return false;
break;
case RAISE:
if (record->event.pressed) {
layer_on(_RAISE);
update_tri_layer(_LOWER, _RAISE, _ADJUST);
} else {
layer_off(_RAISE);
update_tri_layer(_LOWER, _RAISE, _ADJUST);
}
return false;
break;
case ADJUST:
if (record->event.pressed) {
layer_on(_ADJUST);
update_tri_layer(_LOWER, _RAISE, _ADJUST);
} else {
layer_off(_ADJUST);
update_tri_layer(_LOWER, _RAISE, _ADJUST);
}
return false;
break;
case SOLENOID_TOG:
#ifdef SOLENOID_ENABLE
if (record->event.pressed) {
solenoid_toggle();
}
#endif
break;
case SOLENOID_DWELL_MINUS:
#ifdef SOLENOID_ENABLE
if (record->event.pressed) {
solenoid_dwell_minus();
}
#endif
break;
case SOLENOID_DWELL_PLUS:
#ifdef SOLENOID_ENABLE
if (record->event.pressed) {
solenoid_dwell_plus();
}
#endif
break;
case SOLENOID_BUZZ_ON:
#ifdef SOLENOID_ENABLE
if (record->event.pressed) {
solenoid_buzz_on();
}
#endif
break;
case SOLENOID_BUZZ_OFF:
#ifdef SOLENOID_ENABLE
if (record->event.pressed) {
solenoid_buzz_off();
}
#endif
break;
}
return true;
};
uint32_t layer_state_set_user(uint32_t state) {
switch (biton32(state)) {
case _RAISE:
#ifdef RGBLIGHT_ENABLE
rgblight_sethsv_noeeprom (240, 255, 255);
#endif
break;
case _LOWER:
#ifdef RGBLIGHT_ENABLE
rgblight_sethsv_noeeprom (0, 255, 255);
#endif
break;
case _ADJUST:
#ifdef RGBLIGHT_ENABLE
rgblight_sethsv_noeeprom (0, 0, 255);
#endif
break;
default:
#ifdef RGBLIGHT_ENABLE
rgblight_sethsv_noeeprom (RGB_HUE, 255, 255);
#endif
break;
}
return state;
}

@ -1,99 +0,0 @@
#ifndef USERSPACE
#define USERSPACE
#include "quantum.h"
// Layers
enum user_enum {
// Layers
QWERTY = SAFE_RANGE,
LOWER,
RAISE,
SUPER,
ADJUST,
// Solenoid
SOLENOID_TOG,
SOLENOID_DWELL_MINUS,
SOLENOID_DWELL_PLUS,
SOLENOID_BUZZ_ON,
SOLENOID_BUZZ_OFF,
};
// Macro / Send String
enum user_macros {
ROOT,
PPLY,
PSEF,
};
// TapDance
enum user_tapdance {
TD_ENDLOCK,
TD_ALTLOCK,
TD_PRINT,
TD_ESC,
};
// Layers
#define _QWERTY 0
#define _LOWER 1
#define _RAISE 2
#define _SUPER 3
#define _ADJUST 16
// Macros
#define KC_ROOT M(ROOT)
#define KC_PPLY M(PPLY)
#define KC_PSEF M(PSEF)
// Tapdance
#define KC_EXC TD(TD_ESC)
#define KC_ELCK TD(TD_ENDLOCK)
#define KC_ALCK TD(TD_ALTLOCK)
#define KC_MPNT TD(TD_PRINT)
// Custom Keycodes
#define KC_ KC_TRNS
#define KC_xxxx KC_NO
#define KC_LOWR LOWER
#define KC_RASE RAISE
#define KC_SUPR SUPER
#define KC_RST RESET
// Key Combos
#define KC_XCPY LCTL(KC_INS)
#define KC_XINS LSFT(KC_INS)
#define KC_CAD LCTL(LALT(KC_DEL))
#define KC_XCAD LCTL(LALT(KC_DEL))
#define KC_XLCK LGUI(KC_L)
// Solenoid
#define KC_STOG SOLENOID_TOG
#define KC_SDM SOLENOID_DWELL_MINUS
#define KC_SDP SOLENOID_DWELL_PLUS
#define KC_SBON SOLENOID_BUZZ_ON
#define KC_SBOF SOLENOID_BUZZ_OFF
// RGB and Backlighting
#define KC_RGB RGB_TOG
#define KC_RHUI RGB_HUI
#define KC_RHUD RGB_HUD
#define KC_RSAI RGB_SAI
#define KC_RSAD RGB_SAD
#define KC_RVAI RGB_VAI
#define KC_RVAD RGB_VAD
#define KC_MOD RGB_MOD
#define KC_RMOD RGB_RMOD
#define KC_RPLN RGB_M_P
#define KC_RBTH RGB_M_B
#define KC_BLT BL_TOGG
#define KC_BLS BL_STEP
#define KC_BLI BL_INC
#define KC_BLD BL_DEC
#define KC_BLB BL_BRTG
#define KC_BLON BL_ON
#define KC_BLOF BL_OFF
#endif

@ -1,14 +0,0 @@
Copyright 2018 @mtdjr
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/>.

@ -1,2 +0,0 @@
SRC += mtdjr.c
TAP_DANCE_ENABLE = yes

@ -1,99 +0,0 @@
#ifndef SOLENOID_H
#define SOLENOID_H
#include <timer.h>
#include "pincontrol.h"
#define SOLENOID_DEFAULT_DWELL 12
#define SOLENOID_MAX_DWELL 100
#define SOLENOID_MIN_DWELL 4
#ifndef SOLENOID_ACTIVE
#define SOLENOID_ACTIVE false
#endif
#ifndef SOLENOID_PIN
#define SOLENOID_PIN F6
#endif
bool solenoid_enabled = SOLENOID_ACTIVE;
bool solenoid_on = false;
bool solenoid_buzz = false;
bool solenoid_buzzing = false;
uint16_t solenoid_start = 0;
uint8_t solenoid_dwell = SOLENOID_DEFAULT_DWELL;
void solenoid_buzz_on(void) {
solenoid_buzz = true;
}
void solenoid_buzz_off(void) {
solenoid_buzz = false;
}
void solenoid_dwell_minus(void) {
if (solenoid_dwell > 0) solenoid_dwell--;
}
void solenoid_dwell_plus(void) {
if (solenoid_dwell < SOLENOID_MAX_DWELL) solenoid_dwell++;
}
void solenoid_toggle(void) {
solenoid_enabled = !solenoid_enabled;
}
void solenoid_stop(void) {
digitalWrite(SOLENOID_PIN, PinLevelLow);
solenoid_on = false;
solenoid_buzzing = false;
}
void solenoid_fire(void) {
if (!solenoid_enabled) return;
if (!solenoid_buzz && solenoid_on) return;
if (solenoid_buzz && solenoid_buzzing) return;
solenoid_on = true;
solenoid_buzzing = true;
solenoid_start = timer_read();
digitalWrite(SOLENOID_PIN, PinLevelHigh);
}
void solenoid_check(void) {
uint16_t elapsed = 0;
if (!solenoid_on) return;
elapsed = timer_elapsed(solenoid_start);
//Check if it's time to finish this solenoid click cycle
if (elapsed > solenoid_dwell) {
solenoid_stop();
return;
}
//Check whether to buzz the solenoid on and off
if (solenoid_buzz) {
if (elapsed / SOLENOID_MIN_DWELL % 2 == 0){
if (!solenoid_buzzing) {
solenoid_buzzing = true;
digitalWrite(SOLENOID_PIN, PinLevelHigh);
}
}
else {
if (solenoid_buzzing) {
solenoid_buzzing = false;
digitalWrite(SOLENOID_PIN, PinLevelLow);
}
}
}
}
void solenoid_setup(void) {
pinMode(SOLENOID_PIN, PinDirectionOutput);
}
#endif

@ -1,124 +0,0 @@
#ifndef NQN_BASIC_LAYOUT_H
#define NQN_BASIC_LAYOUT_H
/*
This is the basic NQN layout
It consists of a block of 5x3, 5x4, 6x3, or 6x4 for each hand. This allows us
to use these blocks for a variety of keyboards like the planck, preonic and
even splits like the ergodox.
You can see that we use some quirky preprocessor defines to achive what we
desire. In the future I would like to see qmk taking a more generic approach
like the KLL.
The naming convention for these blocks is
L<LAYER>_<SIDE>_<ROW>
The LAYER is a number following the neo2 manner starting at 1 for the base
layer, 2 is shift, 3 is for special chars etc.
SIDE is, well either the left or right side/half of a keyboard.
The ROW is starting from the top, numbering beginning at 1.
*/
#include "nqn-common.h"
/*
*
* LEFT RIGHT
* ,----------------------------------. ,----------------------------------.
* 01 | x | v | l | c | w | | k | h | g | f | q |
* |------+------+------+------+------| |------+------+------+------+------|
* 02 | u | i | a | e | o | | s | n | r | t | d |
* |------+------+------+------+------| |------+------+------+------+------|
* 03 | y | < | # | p | z | | b | m | , | . | j |
* `----------------------------------' `----------------------------------'
*/
#define L01_LEFT_01 KC_X, KC_V, KC_L, KC_C, KC_W
#define L01_LEFT_02 KC_U, KC_I, KC_A, KC_E, KC_O
#define L01_LEFT_03 N_Y, N_LT, N_HS, KC_P, N_Z
#define L01_RIGHT_02 KC_S, KC_N, KC_R, KC_T, KC_D
#define L01_RIGHT_01 KC_K, KC_H, KC_G, KC_F, KC_Q
#define L01_RIGHT_03 KC_B, KC_M, KC_COMM, KC_DOT, KC_J
/*
*
* LEFT RIGHT
* ,----------------------------------. ,----------------------------------.
* 01 | | _ | [ | ] | ^ | | ! | < | > | = | & |
* |------+------+------+------+------| |------+------+------+------+------|
* 02 | \ | / | { | } | * | | ? | ( | ) | - | @ |
* |------+------+------+------+------| |------+------+------+------+------|
* 03 | # | $ | | | ~ | ` | | + | % | " | ' | ° |
* `----------------------------------' `----------------------------------'
*/
#define L03_LEFT_01 N_DOTS, N_USC, N_LSQBR, N_RSQBR, N_CIRC
#define L03_LEFT_02 N_BSLS, N_SLSH, N_LCUBR, N_RCUBR, N_ASTR
#define L03_LEFT_03 N_HASH, N_DLR, N_PIPE, N_TILD, N_GRAVE
#define L03_RIGHT_01 N_EXKL, N_LT, N_GT, N_EQ, N_AMP
#define L03_RIGHT_02 N_QUES, N_LPARN, N_RPARN, N_MINS, N_AT
#define L03_RIGHT_03 N_PLUS, N_PERC, N_QUOT, N_SING, N_DEGRE
/*
*
* LEFT RIGHT
* ,----------------------------------. ,----------------------------------.
* 01 | PAGEU| BACKS| UP | DELET| PAGED| | / | 7 | 8 | 9 | - |
* |------+------+------+------+------| |------+------+------+------+------|
* 02 | HOME | LEFT | DOWN | RIGHT| END | | * | 4 | 5 | 6 | + |
* |------+------+------+------+------| |------+------+------+------+------|
* 03 | ESC | TAB | INSRT| ENTER| UNDO | | ENTER| 1 | 2 | 3 | , |
* `----------------------------------' `----------------------------------'
*/
#define L04_LEFT_01 KC_PGUP, KC_BSPC, KC_UP, KC_DEL, KC_PGDN
#define L04_LEFT_02 KC_HOME, KC_LEFT, KC_DOWN, KC_RIGHT, KC_END
#define L04_LEFT_03 KC_ESC, KC_TAB, KC_INS, KC_ENTER, N_UNDO
#define L04_RIGHT_01 KC_KP_SLASH, KC_KP_7, KC_KP_8, KC_KP_9, KC_KP_MINUS
#define L04_RIGHT_02 KC_KP_ASTERISK, KC_KP_4, KC_KP_5, KC_KP_6, KC_KP_PLUS
#define L04_RIGHT_03 KC_KP_ENTER, KC_KP_1, KC_KP_2, KC_KP_3, KC_KP_DOT
/*
* LEFT RIGHT
* ,----------------------------------. ,----------------------------------.
* 01 | | | | | | | | | | | |
* |------+------+------+------+------| |------+------+------+------+------|
* 02 | ü | | ä | | ö | | ß | | | | |
* |------+------+------+------+------| |------+------+------+------+------|
* 03 | | | | | | | | µ | | | |
* `----------------------------------' `----------------------------------'
*/
#define L05_LEFT_01 _______, _______, _______, _______, _______
#define L05_LEFT_02 N_UE, _______, N_AE, N_EURO, N_OE
#define L05_LEFT_03 _______, _______, _______, _______, _______
#define L05_RIGHT_01 _______, _______, _______, _______, _______
#define L05_RIGHT_02 N_SS, _______, _______, _______, _______
#define L05_RIGHT_03 _______, N_MU, _______, _______, _______
/*
*
* LEFT RIGHT
* ,----------------------------------. ,----------------------------------.
* 01 | F1 | F2 | F3 | F4 | | | MAIL | MUSIC| FILES| CALC | PASTE|
* |------+------+------+------+------| |------+------+------+------+------|
* 02 | F5 | F6 | F7 | F8 | | | PREV |PLAY/P| NEXT | STOP | COPY |
* |------+------+------+------+------| |------+------+------+------+------|
* 03 | F9 | F10 | F11 | F12 | | | PRINT| SCROL| PAUSE| NUMLK| CUT |
* `----------------------------------' `----------------------------------'
*/
#define L06_LEFT_01 KC_F1, KC_F2, KC_F3, KC_F4, _______
#define L06_LEFT_02 KC_F5, KC_F6, KC_F7, KC_F8, _______
#define L06_LEFT_03 KC_F9, KC_F10, KC_F11, KC_F12, _______
#define L06_RIGHT_01 KC_MAIL, KC_MSEL, KC_MY_COMPUTER, KC_CALCULATOR, N_PASTE
#define L06_RIGHT_02 KC_MPRV, KC_MPLY, KC_MNXT, KC_MSTP, N_COPY
#define L06_RIGHT_03 KC_PSCR, KC_SLCK, KC_PAUS, KC_NLCK, N_CUT
#endif

@ -1,9 +0,0 @@
#ifndef NQN_COMMON_H
#define NQN_COMMON_H
/*
This file holds some commen NQN definitions
*/
#endif

@ -1,73 +0,0 @@
#ifndef NQN_KEYS_ON_QUERTZ_DE_LATIN1_H
#define NQN_KEYS_ON_QUERTZ_DE_LATIN1_H
/*
This file defines the desierd NQN keys if you use a software (operating sysetm)
configured for a QUERTZ layout (de-latin1).
These chars can be created by using ALTGR on linux and a few of them on windows
with a German de-latin1 layout (depending on desktop environment and/or
application).
¹²³¼½¬{[]}\¸
@łŧøþ¨~
æſðđŋħ̣ĸł˝^
|»«¢µ·
Additionally, there are some common chars that we dit not yet define:
§
*/
#include "nqn-common.h"
// NQN key definitions in no particular order
#define N_LT KC_NONUS_BSLASH
#define N_HS KC_NONUS_HASH
#define N_DOTS RALT(KC_DOT) // …
#define N_USC LSFT(KC_SLASH) // _
#define N_LSQBR RALT(KC_8) // [
#define N_RSQBR RALT(KC_9) // ]
#define N_CIRC KC_GRAVE // ^
#define N_EXKL LSFT(KC_1) // !
#define N_GT LSFT(KC_NONUS_BSLASH) // >
#define N_EQ LSFT(KC_0) // =
#define N_AMP LSFT(KC_6) // &
#define N_BSLS RALT(KC_MINS) // \ backslash
#define N_SLSH LSFT(KC_7) // /
#define N_LCUBR RALT(KC_7) // {
#define N_RCUBR RALT(KC_0) // }
#define N_ASTR LSFT(KC_RBRC) // *
#define N_QUES LSFT(KC_MINS) // ?
#define N_LPARN LSFT(KC_8) // (
#define N_RPARN LSFT(KC_9) // )
#define N_MINS KC_SLASH // -
#define N_COLN LSFT(KC_DOT) // :
#define N_HASH KC_BSLASH // #
#define N_DLR LSFT(KC_4) // $
#define N_PIPE RALT(KC_NONUS_BSLASH) // |
#define N_TILD RALT(KC_RBRC) // ~
#define N_GRAVE LSFT(KC_EQUAL) // `
#define N_PLUS KC_RBRC // +
#define N_PERC LSFT(KC_5) // %
#define N_QUOT LSFT(KC_2) // "
#define N_SING LSFT(KC_BSLASH) // '
#define N_SEMI LSFT(KC_COMM) // ;
#define N_EURO RALT(KC_E) // €
#define N_AT RALT(KC_Q) // @
#define N_Z KC_Y
#define N_Y KC_Z
#define N_AE KC_QUOTE // ä
#define N_OE KC_SCOLON // ö
#define N_UE KC_LBRACKET // ü
#define N_MU RALT(KC_M) // µ
#define N_SS KC_MINS // ß
#define N_DEGRE LSFT(KC_GRAVE) // °
#define N_PASTE LCTL(KC_V) // CTRL+V
#define N_COPY LCTL(KC_C) // CTRL+C
#define N_CUT LCTL(KC_X) // CTRL+X
#define N_UNDO LCTL(N_Z) // CTRL+Z
#endif

@ -1,24 +0,0 @@
# not-quite-neo
This is my personal take on porting the [neo2 layout](https://www.neo-layout.org/) to support both a ergodox (infinity) and a planck keyboard. Some sacrifices needed to be made, hence this layout is not-quite-neo.
## Use case
My use case is simple:
* I want to use neo2 (or a keymap as close as possible) on any computer I can plug my keyboards in. Because installing the neo2 SW driver is often not a acceptable solution.
* Since most computers I work on (colleagues, family, etc.) use a de-DE keymap, I can not use the official neo2 implementation, because it relies on a us layout and I often times do not even posses the administration rights to change that.
* neo2 makes use of most of the keys of a standard 104 key keyboard, especially for supporting the planck I needed to deviate from the original neo2 layout in order to fit everything I wanted.
Therefore, I put all reusable code in the users/not-quite-neo directory and created a custom not-quite-neo keymap for the planck and the ergodox infinity keyboard respectively.
## Pitfalls
Mind, since neo2 is a SW driver supported layout it offers a lot of features that are hard to support in hardware (especially the fancy utf stuff with math symbols and greek letters etc.).
Right now this implementation only incompletely supports neo2 layers 1 to 4.
The biggest difference is probably the support for the German Umlauts ä, ö, ü and the ß. Since we rely on a smaller number of keys some glyphs needed to be created otherwise. See the implementation in [nqn-basic-layout.h](nqn-basic-layout.h) for details.
## Keyboards and keymaps
You can find the *not-quite-neo* keymap for the ergodox infinity under [qmk_firmware/keyboards/ergodox_infinity/keymaps/not-quite-neo/](../../keyboards/ergodox_infinity/keymaps/not-quite-neo/readme.md). Respectively the keymap for the planck resides in [qmk_firmware/keyboards/planck/keymaps/not-quite-neo/](../../keyboards/planck/keymaps/not-quite-neo/readme.md)
.

@ -1,3 +0,0 @@
# User space
This is a place for users to put code that they might use between keyboards. If you build the keymap `mine`, `/users/mine/rules.mk` will be included in your build, and `/users/mine/` will be in your path - keep these things in mind when naming your files and referencing them from other places.

@ -1,66 +0,0 @@
#pragma once
////////////////////////////////////////////////////////////////////////////////
// Features That Can Be Enabled
// https://docs.qmk.fm/reference/config-options#features-that-can-be-enabled
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
// Behaviors That Can Be Configured
// https://docs.qmk.fm/reference/config-options#behaviors-that-can-be-configured
////////////////////////////////////////////////////////////////////////////////
// MS the button needs to be held before a tap becomes a hold (default: 200)
#undef TAPPING_TERM
#define TAPPING_TERM 250
// Makes it easier for fast typists to use dual-role keys. See additional details here:
// https://docs.qmk.fm/features/advanced-keycodes#permissive-hold
#define PERMISSIVE_HOLD
// MS after tapping the Leader key to listen for a sequence (default: 300)
#undef LEADER_TIMEOUT
#define LEADER_TIMEOUT 750
// This makes it possible to do rolling combos (zx) with keys that convert to other keys on hold
// (for example, if z becomes ctrl when you hold it, when this option isn't enabled, z rapidly
// followed by x actually sends Ctrl-x. That's bad.)
#define IGNORE_MOD_TAP_INTERRUPT
////////////////////////////////////////////////////////////////////////////////
// Mouse Key Options
// https://docs.qmk.fm/reference/config-options#mouse-key-options
////////////////////////////////////////////////////////////////////////////////
#ifdef MOUSEKEY_ENABLE
// Mouse key config
// Frequency with which cursor movements are sent. Lower means more resolution / DPI.
// Default: 20
// #undef MOUSEKEY_INTERVAL
// #define MOUSEKEY_INTERVAL 20
// MS after pressing the key before initial movement begins. Lower means quicker response.
// Default: 0
// #undef MOUSEKEY_DELAY
// #define MOUSEKEY_DELAY 0
// MS it takes the cursor to accelerate to max speed
// Default: 60
// #undef MOUSEKEY_TIME_TO_MAX
// #define MOUSEKEY_TIME_TO_MAX 60
// Maximum speed for the mouse keys
// Default: 7
// #undef MOUSEKEY_MAX_SPEED
// #define MOUSEKEY_MAX_SPEED 7
// Delay before the mouse wheel
// Default: 0
// #undef MOUSEKEY_WHEEL_DELAY
// #define MOUSEKEY_WHEEL_DELAY 0
#endif // MOUSEKEY_ENABLE

@ -1,14 +0,0 @@
Copyright 2018 @<replicaJunction>
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/>.

@ -1,149 +0,0 @@
#include "replicaJunction.h"
#include "version.h"
#ifdef TAP_DANCE_ENABLE
void dance_layer(qk_tap_dance_state_t *state, void *user_data)
{
uint8_t layer = biton32(layer_state);
if (state->count >= 5)
{
// 5 or more taps resets the keyboard
reset_keyboard();
}
#ifdef L_QWERTY
else if (state->count == 3)
{
// Triple tap changes to QWERTY layer
if (layer == L_QWERTY)
{
layer_off(L_QWERTY);
}
else
{
layer_on(L_QWERTY);
}
}
#endif
#ifdef L_NUM
else if (state->count == 2)
{
// Double tap toggles Number layer
if (layer == L_NUM)
{
layer_off(L_NUM);
}
else
{
layer_on(L_NUM);
}
}
#endif
else
{
// Single tap sends Escape, and also turns off layers
// That's mostly in case I get stuck and forget where I am
#ifdef L_NUM
layer_off(L_NUM);
#endif
#ifdef L_EXTEND
layer_off(L_EXTEND);
#endif
#ifdef L_SYMBOL
layer_off(L_SYMBOL);
#endif
#ifdef L_QWERTY
layer_off(L_QWERTY);
#endif
register_code(KC_ESC);
unregister_code(KC_ESC);
}
};
// Tap Dance Definitions
// Note - this needs to come AFTER the function is declared
qk_tap_dance_action_t tap_dance_actions[] = {
[TD_LAYER_TOGGLE] = ACTION_TAP_DANCE_FN(dance_layer)
};
#endif // TAP_DANCE_ENABLE
// These functions can be overridden in individual keymap files.
// This allows a user function to be shared for all my keyboards, while each
// keyboard can also have a keyboard-specific section.
// Note that keymaps don't need to override these if there's nothing to
// override them with.
__attribute__ ((weak))
void matrix_init_keymap(void) {}
__attribute__ ((weak))
void matrix_scan_keymap(void) {}
__attribute__ ((weak))
bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
return true;
};
// Runs just one time when the keyboard initializes.
void matrix_init_user(void) {
#ifdef UNICODEMAP_ENABLE
// Set Unicode input to use WinCompose
// https://github.com/samhocevar/wincompose
set_unicode_input_mode(UC_WINC);
#endif // UNICODEMAP_ENABLE
matrix_init_keymap();
};
// Runs constantly in the background, in a loop.
void matrix_scan_user(void) {
matrix_scan_keymap();
}
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
if (record->event.pressed)
return true;
switch(keycode)
{
case RJ_MAKE: // Compiles the firmware, and adds the flash command based on keyboard bootloader
SEND_STRING("make " QMK_KEYBOARD ":" QMK_KEYMAP
#if (defined(BOOTLOADER_DFU) || defined(BOOTLOADER_LUFA_DFU) || defined(BOOTLOADER_QMK_DFU))
":dfu"
#elif defined(BOOTLOADER_HALFKAY)
":teensy"
#elif defined(BOOTLOADER_CATERINA)
":avrdude"
#endif // bootloader options
//SS_TAP(X_ENTER)
);
return false;
case RJ_QMKV:
SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
return false;
case RJ_EQ:
SEND_STRING("==");
return false;
case RJ_NEQ:
SEND_STRING("!=");
return false;
case RJ_GEQ:
SEND_STRING(">=");
return false;
case RJ_LEQ:
SEND_STRING("<=");
return false;
case RJ_GEQR:
SEND_STRING("=>");
return false;
case RJ_DUND:
SEND_STRING("$_");
return false;
case RJ_SELS:
SEND_STRING("select *");
return false;
}
return process_record_keymap(keycode, record);
};

@ -1,114 +0,0 @@
#pragma once
#include "quantum.h"
///////////////////////////////////////////////////////////////////////////////
// Keymap definitions
///////////////////////////////////////////////////////////////////////////////
// Layer definitions
// #define L_COLEMAK 0
// #define L_QWERTY 1
// #define L_NUM 2
// #define L_EXTEND 3
// #define L_FUNC 4
// #define L_GAMING 5
// #define L_SYMBOL 6
// #define L_LL_R 7
// #define L_LL_S 8
// #define L_LL_E 9
// #define L_LL_I 10
// Keyboard aliases
#define ooooooo KC_TRNS
#define MO_FUNC MO(L_FUNC)
#define TT_NUM TT(L_NUM)
#define TG_GAME TG(L_GAMING)
#define OSL_SYM OSL(L_SYMBOL)
#define OSM_LSF OSM(MOD_LSFT)
#define OSM_RSF OSM(MOD_RSFT)
#define KX_CTSF LCTL(KC_LSFT)
#define KX_STAB LSFT(KC_TAB)
#define KX_CGR LCTL(KC_GRV)
#define KX_PAST LCTL(LGUI(LALT(KC_V)))
#define KX_SRCH LCTL(LGUI(LALT(KC_S)))
#define KX_BKNM LT(L_NUM, KC_BSPC)
#define KX_DCTL CTL_T(KC_DEL)
#define KX_NALT ALT_T(KC_ENT)
#define KX_ECTL CTL_T(KC_ESC)
#define KX_SPAC LT(L_EXTEND, KC_SPC)
#define KX_Z_MT CTL_T(KC_Z)
#define KX_X_MT GUI_T(KC_X)
#define KX_C_MT MT(MOD_LCTL | MOD_LALT, KC_C)
#define KX_D_MT ALT_T(KC_D)
#define KX_SLMT CTL_T(KC_SLSH)
#define KX_DOMT GUI_T(KC_DOT)
#define KX_COMT MT(MOD_LCTL | MOD_LALT, KC_COMM)
#define KX_H_MT ALT_T(KC_H)
#ifdef L_LL_R
#define KC_R_LT LT(L_LL_R, KC_R)
#else
#define KC_R_LT KC_R
#endif
#ifdef L_LL_S
#define KC_S_LT LT(L_LL_S, KC_S)
#else
#define KC_S_LT KC_S
#endif
#ifdef L_LL_E
#define KC_E_LT LT(L_LL_E, KC_E)
#else
#define KC_E_LT KC_E
#endif
#ifdef L_LL_I
#define KC_I_LT LT(L_LL_I, KC_I)
#else
#define KC_I_LT KC_I
#endif
// "Macro" functions
enum userspace_custom_keycodes {
RJ_MAKE = SAFE_RANGE, // QMK make command
RJ_QMKV, // QMK version
RJ_EQ, // ==
RJ_NEQ, // !=
RJ_GEQ, // >=
RJ_LEQ, // <=
RJ_GEQR, // => ("greater than or equal - right")
RJ_DUND, // $_
RJ_SELS, // select * (used for PowerShell)
RJ_MUTE, // Discord mute (GUI+Shift+M)
RJ_DEAF, // Discord deafen (GUI+Shift+D)
RJ_DOVR // Toggle Discord overlay (GUI+Shift+O)
};
// Mouse keys
#define M_UP KC_MS_UP
#define M_DOWN KC_MS_DOWN
#define M_LEFT KC_MS_LEFT
#define M_RIGHT KC_MS_RIGHT
#define M_LCLIK KC_MS_BTN1
#define M_RCLIK KC_MS_BTN2
#define M_MCLIK KC_MS_BTN3
#define M_WHLUP KC_WH_U
#define M_WHLDN KC_WH_D
// Used in macro definitions
#define TAP(code) register_code (code); unregister_code (code);
// Tap Dance
#ifdef TAP_DANCE_ENABLE
#define TD_LAYER_TOGGLE 0
extern void dance_layer(qk_tap_dance_state_t *state, void *user_data);
#define TD_LAYR TD(TD_LAYER_TOGGLE)
#endif // TAP_DANCE_ENABLE

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

@ -1,45 +0,0 @@
# overview
this is a modified version of let's split keyboard from bbaserdem. i don't like standard dvorak overuses right pinky
so i shifted the columns out. i'm not sure if this is any good, time will tell.
i have ortholinear let's split eh, which share a lot of functions with other ortholinear keyboards.
# layout
i use dvorak with an unorthodox off layout.
if you wanna grab my code, and you used a layout with a persistent base
layer change, change it to layer 0 before proceeding.
# layers
* **dvorak**: base layer,with dvorak layout.
* **alternative**: has alternate characters.
* **game**: toggled from *function*, comfortable for gaming use.
* **numeric**: has numericals and symbols. can be locked.
* **function**: layer has media and function keys.
* **mouse**: manipulates mouse. can be locked.
* **music** allows playing sounds.
# functionality
* **rgb backlight**: with layer indication, and ability to change base layer lighting mode.
* **secrets**: by placing a secrets.h, and not tracking it, passwords can be stored.
* **mouse**: mouse emulation, complete with diagonal keys.
* **turkish**: an altgr-like overlay that allows some non-common letters, in unicode.
i suggest checking out how i enabled turkish keys,
how i planned out rgb lighting,
and my mouse implementation;
they might offer some insight into fringe user cases.
# issues
all features are too big for the 32kb bootloader.
offenders are audio and rgb lights; it comes down to one or the other.
~the proton board, and rev 6 might fix that.~
# credits
this is a modified version of let's split keyboard from bbaserdem who has previously written his keymap by himself before, but rewrote it here.

@ -1,8 +0,0 @@
#pragma once
#ifdef TAP_DANCE_ENABLE
#define TAPPING_TERM 300
#define TAPPING_TOGGLE 1
#endif
// !USERSPACE_CONFIG_H

@ -1,557 +0,0 @@
#include "romus.h"
/*---------------*\
|*-----MOUSE-----*|
\*---------------*/
#ifdef MOUSEKEY_ENABLE
#include "mousekey.h"
#endif
/*-------------*\
|*-----RGB-----*|
\*-------------*/
#ifdef RGBLIGHT_ENABLE
#include "rgblight.h"
#endif
/*-------------*\
|*---UNICODE---*|
\*-------------*/
#ifdef UNICODE_ENABLE
#endif
/*-----------------*\
|*-----SECRETS-----*|
\*-----------------*/
// Enabled by adding a non-tracked secrets.h to this dir.
#if (__has_include("secrets.h"))
#include "secrets.h"
#endif
/*---------------*\
|*-----MUSIC-----*|
\*---------------*/
#ifdef AUDIO_ENABLE
float tone_game[][2] = SONG(ZELDA_PUZZLE);
float tone_return[][2] = SONG(ZELDA_TREASURE);
float tone_linux[][2] = SONG(UNICODE_LINUX);
float tone_windows[][2] = SONG(UNICODE_WINDOWS);
#endif
/*-------------------*\
|*-----TAP-DANCE-----*|
\*-------------------*/
#ifdef TAP_DANCE_ENABLE
qk_tap_dance_action_t tap_dance_actions[] = {
// Shift on double tap of semicolon
[SCL] = ACTION_TAP_DANCE_DOUBLE( KC_SCLN, KC_COLN )
};
#endif
/* In keymaps, instead of writing _user functions, write _keymap functions
* The __attribute__((weak)) allows for empty definitions here, and during
* compilation, if these functions are defined elsewhere, they are written
* over. This allows to include custom code from keymaps in the generic code
* in this file.
*/
__attribute__ ((weak)) void matrix_init_keymap(void) { }
__attribute__ ((weak)) void matrix_scan_keymap(void) { }
__attribute__ ((weak)) bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
return true;
}
__attribute__ ((weak)) uint32_t layer_state_set_keymap (uint32_t state) {
return state;
}
__attribute__ ((weak)) void led_set_keymap(uint8_t usb_led) { }
/* ----------------------- *\
* -----RGB Functions----- *
\* ----------------------- */
#ifdef RGBLIGHT_ENABLE
// Set RGBLIGHT state depending on layer
void rgblight_change( uint8_t this_layer ) {
// Enable RGB light; will not work without this
//rgblight_enable_noeeprom();
// Change RGB light
switch ( this_layer ) {
case _DV:
// Load base layer
rgblight_disable_noeeprom();
break;
case _AL:
// Do yellow for alternate
rgblight_enable_noeeprom();
rgblight_sethsv_noeeprom( 60,255,255);
break;
case _GA:
// Do purple for game
rgblight_enable_noeeprom();
rgblight_sethsv_noeeprom(285,255,255);
break;
case _NU:
// Do azure for number
rgblight_enable_noeeprom();
rgblight_sethsv_noeeprom(186,200,255);
break;
case _SE:
// Do red for settings
rgblight_enable_noeeprom();
rgblight_sethsv_noeeprom( 16,255,255);
break;
case _MO:
// Do green for mouse
rgblight_enable_noeeprom();
rgblight_sethsv_noeeprom(120,255,255);
break;
case _MU:
// Do orange for music
rgblight_enable_noeeprom();
rgblight_sethsv_noeeprom( 39,255,255);
break;
default:
// Something went wrong
rgblight_enable_noeeprom();
rgblight_sethsv_noeeprom( 0,255,255);
break;
}
}
#endif
/*---------------------*\
|*-----MATRIX INIT-----*|
\*---------------------*/
void matrix_init_user (void) {
// Keymap specific things, do it first thing to allow for delays etc
matrix_init_keymap();
// Correct unicode
#ifdef UNICODE_ENABLE
set_unicode_input_mode(UC_LNX);
#endif
// Make beginning layer DVORAK
set_single_persistent_default_layer(_DV);
}
/*---------------------*\
|*-----MATRIX SCAN-----*|
\*---------------------*/
void matrix_scan_user (void) {
// Keymap specific, do it first
matrix_scan_keymap();
}
/*------------------*\
|*-----KEYCODES-----*|
\*------------------*/
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
// Shift check
bool is_capital = ( keyboard_report->mods & (MOD_BIT(KC_LSFT)|MOD_BIT(KC_RSFT)) );
static bool lock_flag = false;
uint8_t layer = biton32 (layer_state);
switch (keycode) {
// Secrets implementation
#if (__has_include("secrets.h"))
case SECRET1:
if( !record->event.pressed ) {
send_string_P( secret[ keycode - SECRET1 ] );
}
return false;
break;
case SECRET2:
if( !record->event.pressed ) {
send_string_P( secret[ keycode - SECRET2 ] );
}
return false;
break;
case SECRET3:
if( !record->event.pressed ) {
send_string_P( secret[ keycode - SECRET3 ] );
}
return false;
break;
#endif
// Lock functionality: These layers are locked if the LOCKED buttons are
// pressed. Otherwise, they are momentary toggles
case K_LOCK:
if (record->event.pressed) {
lock_flag = !lock_flag;
}
return false;
break;
case K_MOUSE:
if (record->event.pressed) {
layer_on(_MO);
lock_flag = false;
} else {
if ( lock_flag ) {
lock_flag = false;
} else {
layer_off(_MO);
}
}
return false;
break;
case K_NUMBR:
if (record->event.pressed) {
layer_on(_NU);
lock_flag = false;
} else {
if ( lock_flag ) {
lock_flag = false;
} else {
layer_off(_NU);
}
}
return false;
break;
// Layer switches with sound
case K_GAMES:
if (record->event.pressed) {
// On press, turn off layer if active
if ( layer == _GA ) {
#ifdef AUDIO_ENABLE
stop_all_notes();
PLAY_SONG(tone_return);
#endif
layer_off(_GA);
}
} else {
// After click, turn on layer if accessed from setting
if ( layer == _SE ) {
#ifdef AUDIO_ENABLE
stop_all_notes();
PLAY_SONG(tone_game);
#endif
layer_on(_GA);
layer_off(_SE);
}
}
return false;
break;
case MU_TOG:
if (record->event.pressed) {
// On press, turn off layer if active
if ( layer == _SE ) {
layer_off(_SE);
layer_on(_MU);
} else {
layer_off(_MU);
}
}
return true;
break;
//------UNICODE
// Unicode switches with sound
#ifdef UNICODE_ENABLE
case UNI_LI:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
stop_all_notes();
PLAY_SONG(tone_linux);
#endif
set_unicode_input_mode(UC_LNX);
}
return false;
break;
case UNI_WN:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
stop_all_notes();
PLAY_SONG(tone_windows);
#endif
set_unicode_input_mode(UC_WIN);
}
return false;
break;
// Turkish letters, with capital functionality
case TUR_A:
if (record->event.pressed) {
if ( is_capital ) {
unicode_input_start();
register_hex(0x00c2);
unicode_input_finish();
} else {
unicode_input_start();
register_hex(0x00e2);
unicode_input_finish();
}
}
return false;
break;
case TUR_O:
if (record->event.pressed) {
if ( is_capital ) {
unicode_input_start();
register_hex(0x00d6);
unicode_input_finish();
} else {
unicode_input_start();
register_hex(0x00f6);
unicode_input_finish();
}
}
return false;
break;
case TUR_U:
if (record->event.pressed) {
if ( is_capital ) {
unicode_input_start();
register_hex(0x00dc);
unicode_input_finish();
} else {
unicode_input_start();
register_hex(0x00fc);
unicode_input_finish();
}
}
return false;
break;
case TUR_I:
if (record->event.pressed) {
if ( is_capital ) {
unicode_input_start();
register_hex(0x0130);
unicode_input_finish();
} else {
unicode_input_start();
register_hex(0x0131);
unicode_input_finish();
}
}
return false;
break;
case TUR_G:
if (record->event.pressed) {
if ( is_capital ) {
unicode_input_start();
register_hex(0x011e);
unicode_input_finish();
} else {
unicode_input_start();
register_hex(0x011f);
unicode_input_finish();
}
}
return false;
break;
case TUR_C:
if (record->event.pressed) {
if ( is_capital ) {
unicode_input_start();
register_hex(0x00c7);
unicode_input_finish();
} else {
unicode_input_start();
register_hex(0x00e7);
unicode_input_finish();
}
}
return false;
break;
case TUR_S:
if (record->event.pressed) {
if ( is_capital ) {
unicode_input_start();
register_hex(0x015e);
unicode_input_finish();
} else {
unicode_input_start();
register_hex(0x015f);
unicode_input_finish();
}
}
return false;
break;
#endif
//-------Diagonal mouse movements
#ifdef MOUSEKEY_ENABLE
case MO_NE:
if( record->event.pressed ) {
mousekey_on(MO_N);
mousekey_on(MO_E);
mousekey_send();
} else {
mousekey_off(MO_N);
mousekey_off(MO_E);
mousekey_send();
}
return false;
break;
case MO_NW:
if( record->event.pressed ) {
mousekey_on(MO_N);
mousekey_on(MO_W);
mousekey_send();
} else {
mousekey_off(MO_N);
mousekey_off(MO_W);
mousekey_send();
}
return false;
break;
case MO_SE:
if( record->event.pressed ) {
mousekey_on(MO_S);
mousekey_on(MO_E);
mousekey_send();
} else {
mousekey_off(MO_S);
mousekey_off(MO_E);
mousekey_send();
}
return false;
break;
case MO_SW:
if( record->event.pressed ) {
mousekey_on(MO_S);
mousekey_on(MO_W);
mousekey_send();
} else {
mousekey_off(MO_S);
mousekey_off(MO_W);
mousekey_send();
}
return false;
break;
case MO_S_NE:
if( record->event.pressed ) {
mousekey_on(MO_S_N);
mousekey_on(MO_S_E);
mousekey_send();
} else {
mousekey_off(MO_S_N);
mousekey_off(MO_S_E);
mousekey_send();
}
return false;
break;
case MO_S_NW:
if( record->event.pressed ) {
mousekey_on(MO_S_N);
mousekey_on(MO_S_W);
mousekey_send();
} else {
mousekey_off(MO_S_N);
mousekey_off(MO_S_W);
mousekey_send();
}
return false;
break;
case MO_S_SE:
if( record->event.pressed ) {
mousekey_on(MO_S_S);
mousekey_on(MO_S_E);
mousekey_send();
} else {
mousekey_off(MO_S_S);
mousekey_off(MO_S_E);
mousekey_send();
}
return false;
break;
case MO_S_SW:
if( record->event.pressed ) {
mousekey_on(MO_S_S);
mousekey_on(MO_S_W);
mousekey_send();
} else {
mousekey_off(MO_S_S);
mousekey_off(MO_S_W);
mousekey_send();
}
return false;
break;
#endif
//------DOUBLE PRESS, with added left navigation
case DBL_SPC:
if( record->event.pressed ) {
SEND_STRING(" "SS_TAP(X_LEFT));
}
return false;
break;
case DBL_ANG:
if( record->event.pressed ) {
SEND_STRING("<>"SS_TAP(X_LEFT));
}
return false;
break;
case DBL_PAR:
if( record->event.pressed ) {
SEND_STRING("()"SS_TAP(X_LEFT));
}
return false;
break;
case DBL_SQR:
if( record->event.pressed ) {
SEND_STRING("[]"SS_TAP(X_LEFT));
}
return false;
break;
case DBL_BRC:
if( record->event.pressed ) {
SEND_STRING("{}"SS_TAP(X_LEFT));
}
return false;
break;
case DBL_QUO:
if( record->event.pressed ) {
SEND_STRING("\'\'"SS_TAP(X_LEFT));
}
return false;
break;
case DBL_DQT:
if( record->event.pressed ) {
SEND_STRING("\"\""SS_TAP(X_LEFT));
}
return false;
break;
case DBL_GRV:
if( record->event.pressed ) {
SEND_STRING("``"SS_TAP(X_LEFT));
}
return false;
break;
// END OF KEYCODES
}
return process_record_keymap(keycode, record);
}
/*----------------------*\
|*-----LAYER CHANGE-----*|
\*----------------------*/
uint32_t layer_state_set_user(uint32_t state) {
state = layer_state_set_keymap (state);
#ifdef RGBLIGHT_ENABLE
// Change RGB lighting depending on the last layer activated
rgblight_change( biton32(state) );
#endif
return state;
}

@ -1,270 +0,0 @@
// This is a modified version of Let's Split keyboard from bbaserdem
#pragma once
#include "quantum.h"
#define XXX KC_NO
// Layers
#define _DV 0 // Base layer
#define _AL 1 // Alt char overlay
#define _GA 2 // Game layer
#define _NU 3 // Numbers layer
#define _SE 4 // Settings layer
#define _MO 5 // Mouse emulation
#define _MU 6 // Music mode
// Define short macros
#define UNDO LCTL(KC_Z)
#define REDO LCTL(KC_Y)
#define COPY LCTL(KC_C)
#define CUT LCTL(KC_X)
#define PASTE LCTL(KC_V)
#define EXIT LALT(KC_F4)
#define CAPS SFT_T(KC_CAPS)
// Rename mouse keys with 7 letters
#ifdef MOUSEKEY_ENABLE
#define MO_S_N KC_MS_WH_UP
#define MO_S_S KC_MS_WH_DOWN
#define MO_S_E KC_MS_WH_RIGHT
#define MO_S_W KC_MS_WH_LEFT
#define MO_N KC_MS_UP
#define MO_S KC_MS_DOWN
#define MO_E KC_MS_RIGHT
#define MO_W KC_MS_LEFT
#define MO_CL_L KC_MS_BTN1
#define MO_CL_R KC_MS_BTN2
#define MO_CL_M KC_MS_BTN3
#define MO_CL_4 KC_MS_BTN4
#define MO_CL_5 KC_MS_BTN5
#define MO_AC_0 KC_MS_ACCEL0
#define MO_AC_1 KC_MS_ACCEL1
#define MO_AC_2 KC_MS_ACCEL2
#else
#define MO_S_N KC_NO
#define MO_S_S KC_NO
#define MO_S_E KC_NO
#define MO_S_W KC_NO
#define MO_N KC_NO
#define MO_S KC_NO
#define MO_E KC_NO
#define MO_W KC_NO
#define MO_CL_L KC_NO
#define MO_CL_R KC_NO
#define MO_CL_M KC_NO
#define MO_CL_1 KC_NO
#define MO_CL_2 KC_NO
#define MO_AC_0 KC_NO
#define MO_AC_1 KC_NO
#define MO_AC_2 KC_NO
#endif
// Rename music keys with <8 letters
#ifdef AUDIO_ENABLE
#define MU_REC KC_LCTL
#define MU_STOP KC_LALT
#define MU_PLAY KC_LGUI
#define MU_PLAY KC_LGUI
#define MU_FAST KC_UP
#define MU_SLOW KC_DOWN
#define MU_MASK KC_A
#else
#define MU_REC KC_NO
#define MU_STOP KC_NO
#define MU_PLAY KC_NO
#define MU_PLAY KC_NO
#define MU_FAST KC_NO
#define MU_SLOW KC_NO
#define MU_MASK KC_NO
#endif
// Define non-capitalized UTF shortcuts here
#ifdef UNICODE_ENABLE
#define PHY_HBR UC(0x0127)
#define PHY_DEG UC(0x00b0)
#define CUR_LIR UC(0x20ba)
#define CUR_BIT UC(0x20bf)
#define CUR_EUR UC(0x20ac)
#define CUR_BPN UC(0x00a3)
#define CUR_YEN UC(0x00a5)
#else
#define PHY_HBR KC_NO
#define PHY_DEG KC_NO
#define CUR_LIR KC_NO
#define CUR_BIT KC_NO
#define CUR_EUR KC_NO
#define CUR_BPN KC_NO
#define CUR_YEN KC_NO
#endif
// Custom keycodes
enum userspace_custom_keycodes {
// Turkish letters, with shifting
TUR_A = SAFE_RANGE,
TUR_C,
TUR_G,
TUR_I,
TUR_O,
TUR_S,
TUR_U,
// Unicode mode switch
UNI_LI,
UNI_WN,
// Double keys
DBL_SPC,
DBL_ANG,
DBL_PAR,
DBL_SQR,
DBL_BRC,
DBL_QUO,
DBL_DQT,
DBL_GRV,
// Diagonal mouse movements
MO_NE,
MO_NW,
MO_SE,
MO_SW,
MO_S_NE,
MO_S_NW,
MO_S_SE,
MO_S_SW,
// Layer switches and lock functionality
K_MOUSE,
K_NUMBR,
K_LOCK,
K_GAMES,
// Secret macros
SECRET1,
SECRET2,
SECRET3
};
// Do tap dancable semicolon key if available
#ifdef TAP_DANCE_ENABLE
enum {
SCL = 0
};
#define MY_SCL TD(SCL)
#else
#define MY_SCL KC_SCLN
#endif
// Shared keymaps
#define LAYOUT_planck_wrapper(...) LAYOUT_planck_grid(__VA_ARGS__)
#define LAYOUT_letssplit_wrapper(...) LAYOUT_ortho_4x12(__VA_ARGS__)
/* Dvorak
* ,------------------------------------------------------------------------.
* | ' " | , | . | P | Y | Esc || Del | F | G | C | R | L |
* |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----|
* | A | O | E | U | I | Bkp || Ent | D | H | T | N | S |
* |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----|
* | ; : | Q | J | K | X | Spc || SET | B | M | W | V | Z |
* |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----|
* | Ctrl| OS | Alt | Tab | Cps | ACH || SYM | Spc | Lft | Up | Dwn | Rght|
* `------------------------------------------------------------------------' */
#define DVORAK \
KC_QUOT,KC_COMM,KC_DOT, KC_P, KC_Y, KC_ESC, KC_DEL, KC_F, KC_G, KC_C, KC_R, KC_L, \
KC_A, KC_O, KC_E, KC_U, KC_I, KC_BSPC,KC_ENT, KC_D, KC_H, KC_T, KC_N, KC_S, \
MY_SCL, KC_Q, KC_J, KC_K, KC_X, KC_SPC, MO(_SE),KC_B, KC_M, KC_W, KC_V, KC_Z, \
KC_LCTL,KC_LGUI,KC_LALT,KC_TAB, CAPS, MO(_AL),K_NUMBR,KC_SPC, KC_LEFT,KC_UP, KC_DOWN,KC_RGHT
/* Alternative character overlay
* ,------------------------------------------------------------------------.
* | ` ~ | ' ' | " " | Euro|Pound| || Del | Home| PgUp| Prn | \ | | / ? |
* |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----|
* | Redo| < > | ( ) | [ ] | { } | Alt || Ins | End |PgDwn| Scl | BTC | - _ |
* |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----|
* | Undo| Cut | Copy|Paste| EXIT| Shf || | | | | Yen | = + |
* |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----|
* | | | | | | || | | | | | |
* `------------------------------------------------------------------------' */
#define ALTCHAR \
KC_GRV, DBL_QUO,DBL_DQT,CUR_EUR,CUR_BPN,_______,_______,KC_HOME,KC_PGUP,KC_PSCREEN, KC_BSLASH, KC_SLSH, \
REDO, DBL_ANG,DBL_PAR,DBL_SQR,DBL_BRC,KC_LALT,KC_INS, KC_END, KC_PGDN,KC_SCROLLLOCK, CUR_BIT, KC_MINUS, \
UNDO, CUT, COPY, PASTE, EXIT, KC_LSFT,_______,_______,_______,_______, CUR_YEN, KC_EQUAL, \
_______,_______,_______,_______,_______,_______,_______,DBL_SPC,_______,_______, _______, _______
/* Game layer
* ,------------------------------------------------------------------------.
* | OFF | Q | W | E | R | T || Esc | 7 | 8 | 9 |NumLk|Bkspc|
* |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----|
* | Tab | A | S | D | F | G || F1 | 4 | 5 | 6 | \ | Ent |
* |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----|
* | Shf | Z | X | C | V | B || F2 | 1 | 2 | 3 | ^ | MSE |
* |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----|
* | Ctrl| Alt | / | ` | SYM | Spc || F5 | Ent | 0 | < | v | > |
* `------------------------------------------------------------------------' */
#define GAME \
K_GAMES,KC_Q, KC_W, KC_E, KC_R, KC_T, KC_ESC, KC_P7, KC_P8, KC_P9, KC_NLCK,KC_BSPC, \
KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_F1, KC_P4, KC_P5, KC_P6, KC_BSLS,KC_ENT , \
KC_LSFT,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_F2, KC_P1, KC_P2, KC_P3, KC_UP,K_MOUSE, \
KC_LCTL,KC_LALT,KC_SLSH,KC_GRV, K_NUMBR,KC_SPC, KC_F5, KC_ENT, KC_P0, KC_LEFT,KC_DOWN,KC_RGHT
/* Symbols layer
* ,------------------------------------------------------------------------.
* | OFF | ` | ~ | \ | [ | { || } | ] | - | _ | = | + |
* |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----|
* | 1 | 2 | 3 | 4 | 5 | || LCK | 6 | 7 | 8 | 9 | 0 |
* |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----|
* | ! | @ | # | $ | % | ||Vol +| ^ | & | * | ( | ) |
* |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----|
* | | | | | | | || | | | | | |
* `------------------------------------------------------------------------' */
#define NUMBERS \
K_NUMBR,KC_GRV, KC_TILD,KC_BSLS,KC_LBRC,KC_LCBR,KC_RCBR,KC_RBRC,KC_MINS,KC_UNDS,KC_EQL, KC_PLUS, \
KC_1, KC_2, KC_3, KC_4, KC_5, _______,K_LOCK, KC_6, KC_7, KC_8, KC_9, KC_0, \
KC_EXLM,KC_AT, KC_HASH,KC_DLR, KC_PERC,_______,KC_VOLU,KC_CIRC,KC_AMPR,KC_ASTR,KC_LPRN,KC_RPRN, \
KC_PIPE,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______
/* Settings layer
* ,------------------------------------------------------------------------.
* |BLLed| F1 | F2 | F3 | F4 | Lin || Win | Wake| |Hue -|Hue +|Reset|
* |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----|
* | | F5 | F6 | F7 | F8 | ||Vol 0| |RGBto|Sat -|Sat +| |
* |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----|
* | Game| F9 | F10 | F11 | F12 |Vol 0|| |PrtSc|RGBan|Bri -|Bri +| |
* |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----|
* |Musir| | | | |Vol +||Vol -| Prev| Stop|TogMu| Next| |
* `------------------------------------------------------------------------' */
#define SETTINGS \
BL_STEP,KC_F1, KC_F2, KC_F3, KC_F4, UNI_LI, UNI_WN, KC_WAKE,_______,RGB_HUD,RGB_HUI,RESET , \
_______,KC_F5, KC_F6, KC_F7, KC_F8, _______,KC_MUTE,_______,RGB_TOG,RGB_SAD,RGB_SAI,_______, \
K_GAMES,KC_F9, KC_F10, KC_F11, KC_F12, KC_MUTE,_______,KC_PSCR,RGB_MOD,RGB_VAD,RGB_VAI,_______, \
MU_TOG, _______,_______,_______,_______,KC_VOLU,KC_VOLD,KC_MPRV,KC_MSTP,KC_MPLY,KC_MNXT,_______
/* Mouse layer
* ,------------------------------------------------------------------------.
* |Ulock| \ | ^ | / |.....|.....||.....|.....| |\|.| |^| | |/|.| |
* |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----|
* | | < | Mid | > |Btn 4|.....||.....|Btn 5| <-- | Mid | --> | |
* |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----|
* | | / | v | \ |.....|.....||.....|.....| |/| | |v| | |\| | LCK |
* |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----|
* | | | | | | Left||Right| | |Accl0|Accl1|Accl2|
* `------------------------------------------------------------------------' */
#define MOUSE \
K_MOUSE,MO_NW, MO_N, MO_NE, XXX, XXX ,XXX, XXX, MO_S_NW,MO_S_N, MO_S_NE,_______, \
_______,MO_W, MO_CL_M,MO_E, MO_CL_4,XXX ,XXX, MO_CL_5,MO_S_W, MO_CL_M,MO_S_E, _______, \
_______,MO_SW, MO_S, MO_SE, XXX, XXX ,XXX, XXX, MO_S_SW,MO_S_S, MO_S_SE,K_LOCK , \
_______,_______,_______,_______,_______,MO_CL_L,MO_CL_R,_______,MO_AC_0,MO_AC_1,MO_AC_2,_______
/* Music layer
* ,------------------------------------------------------------------------.
* |.....|.....|.....|.....|.....|.....||.....|.....|.....|.....|.....|.....|
* |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----|
* |.....|.....|.....|.....|.....|.....||.....|.....|.....|.....|.....|.....|
* |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----|
* |.....|.....|.....|.....|.....|.....||.....|.....|.....|.....|.....|.....|
* |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----|
* | togg| rec | stop| play| slow| fast||modes|.....|.....|.....|.....|.....|
* `------------------------------------------------------------------------'
*/
#define MUSIC \
MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK, \
MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK, \
MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK, \
MU_TOG, MU_REC, MU_STOP,MU_PLAY,MU_SLOW,MU_FAST,MU_MOD, MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK

@ -1,24 +0,0 @@
SRC += romus.c
EXTRAFLAGS += -flto # Used to make code smaller
# ENABLE
UNICODE_ENABLE = yes # Used for unicode character emulation
EXTRAKEY_ENABLE = yes # OS signals like volume control
# DISABLE
ifndef BLUETOOTH_ENABLE
BLUETOOTH_ENABLE = no # No bluetooth
endif
COMMAND_ENABLE = no # Some bootmagic thing i dont use
BOOTMAGIC_ENABLE = no # Access to EEPROM settings, not needed
CONSOLE_ENABLE = no # Allows console output with a command
SLEEP_LED_ENABLE = no # Breathes LED's when computer is asleep. Untested.
NKRO_ENABLE = no # Default is 6KRO which is plenty
MIDI_ENABLE = no # Untested feature
FAUXCLICKY_ENABLE = no # Emulates clicks using speaker
KEY_LOCK_ENABLE = no # Allows locking any key. Not used
API_SYSEX_ENABLE = no # Allows OS to send signals.
# Disabling this makes it compile, i dont know why
# VARIABLE_TRACE = no # Allows debugging variables

@ -1,21 +0,0 @@
/*
Copyright 2018 Yann Hodique <yann.hodique@gmail.com> @sigma
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 LEADER_TIMEOUT 1000
#define MACRO_TIMER 5

@ -1,3 +0,0 @@
LEADER_ENABLE = yes
SRC += sigma.c

@ -1,276 +0,0 @@
/*
Copyright 2018 Yann Hodique <yann.hodique@gmail.com> @sigma
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 "sigma.h"
userspace_config_t runtime_userspace_config;
userspace_config_t stored_userspace_config;
__attribute__ ((weak))
void matrix_init_keymap(void) {}
__attribute__ ((weak))
void startup_keymap(void) {}
__attribute__ ((weak))
void shutdown_keymap(void) {}
__attribute__ ((weak))
void suspend_power_down_keymap(void) {}
__attribute__ ((weak))
void suspend_wakeup_init_keymap(void) {}
__attribute__ ((weak))
void matrix_scan_keymap(void) {}
__attribute__ ((weak))
bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
return true;
}
__attribute__ ((weak))
bool process_record_secrets(uint16_t keycode, keyrecord_t *record) {
return true;
}
__attribute__ ((weak))
uint32_t layer_state_set_keymap (uint32_t state) {
return state;
}
__attribute__ ((weak))
uint32_t default_layer_state_set_keymap (uint32_t state) {
return state;
}
__attribute__ ((weak))
void led_set_keymap(uint8_t usb_led) {}
void set_os(uint8_t os) {
runtime_userspace_config.os_target = os;
switch (os) {
case _OS_MACOS:
set_unicode_input_mode(UC_OSX);
break;
case _OS_LINUX:
set_unicode_input_mode(UC_LNX);
break;
case _OS_WINDOWS:
set_unicode_input_mode(UC_WIN);
break;
}
}
void matrix_init_user(void) {
stored_userspace_config.raw = eeconfig_read_user();
runtime_userspace_config.raw = stored_userspace_config.raw;
set_os(runtime_userspace_config.os_target);
}
void store_userspace_config(void) {
eeconfig_update_user(stored_userspace_config.raw);
}
LEADER_EXTERNS();
void matrix_scan_user(void) {
LEADER_DICTIONARY() {
leading = false;
leader_end();
SEQ_TWO_KEYS(KC_F1, KC_L) {
set_os(_OS_LINUX);
}
SEQ_TWO_KEYS(KC_F1, KC_M) {
set_os(_OS_MACOS);
}
SEQ_TWO_KEYS(KC_F1, KC_W) {
set_os(_OS_WINDOWS);
}
SEQ_TWO_KEYS(KC_F1, KC_S) {
stored_userspace_config.raw = runtime_userspace_config.raw;
store_userspace_config();
}
}
}
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
uint8_t os_target = runtime_userspace_config.os_target;
bool pressed = record->event.pressed;
switch (keycode) {
case KC_QWERTY:
if (pressed) {
set_single_persistent_default_layer(_QWERTY);
}
return false;
break;
case KC_MAKE: // Compiles the firmware, and adds the flash command based on keyboard bootloader
if (!pressed) {
send_string_with_delay_P(PSTR("make " QMK_KEYBOARD ":" QMK_KEYMAP
#if defined(__ARM__)
":dfu-util"
#elif defined(BOOTLOADER_DFU)
":dfu"
#elif defined(BOOTLOADER_HALFKAY)
":teensy"
#elif defined(BOOTLOADER_CATERINA)
":avrdude"
#endif // bootloader options
SS_TAP(X_ENTER)), 10);
}
return false;
break;
case EPRM: // Resets EEPROM
if (pressed) {
eeconfig_init();
default_layer_set(1UL<<eeconfig_read_default_layer());
layer_state_set(layer_state);
set_os(_OS_MACOS);
store_userspace_config();
}
return false;
break;
case VRSN: // Prints firmware version
if (pressed) {
send_string_with_delay_P(PSTR(QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION ", Built on: " QMK_BUILDDATE), MACRO_TIMER);
}
return false;
break;
case KC_OS_CUT:
switch (os_target) {
case _OS_MACOS:
if (pressed)
SEND_STRING(SS_LGUI("x"));
break;
case _OS_LINUX:
pressed ?
register_code(KC_CUT)
: unregister_code(KC_CUT);
break;
default:
if (pressed)
SEND_STRING(SS_LCTRL("x"));
break;
}
break;
case KC_OS_COPY:
switch (os_target) {
case _OS_MACOS:
if (pressed)
SEND_STRING(SS_LGUI("c"));
break;
case _OS_LINUX:
pressed ?
register_code(KC_COPY)
: unregister_code(KC_COPY);
break;
default:
if (pressed)
SEND_STRING(SS_LCTRL("c"));
break;
}
break;
case KC_OS_PASTE:
switch (os_target) {
case _OS_MACOS:
if (pressed)
SEND_STRING(SS_LGUI("v"));
break;
case _OS_LINUX:
pressed ?
register_code(KC_PASTE)
: unregister_code(KC_PASTE);
break;
default:
if (pressed)
SEND_STRING(SS_LCTRL("v"));
break;
}
break;
case KC_OS_UNDO:
switch (os_target) {
case _OS_MACOS:
if (pressed)
SEND_STRING(SS_LGUI("z"));
break;
case _OS_LINUX:
pressed ?
register_code(KC_UNDO)
: unregister_code(KC_UNDO);
break;
default:
if (pressed)
SEND_STRING(SS_LCTRL("z"));
break;
}
break;
case KC_OS_REDO:
switch (os_target) {
case _OS_MACOS:
if (pressed)
SEND_STRING(SS_LGUI(SS_LSFT("z")));
break;
case _OS_LINUX:
pressed ?
register_code(KC_AGAIN)
: unregister_code(KC_AGAIN);
break;
default:
if (pressed)
SEND_STRING(SS_LCTRL(SS_LSFT("z")));
break;
}
break;
case KC_OS_LOCK:
switch (os_target) {
case _OS_MACOS:
if (pressed)
SEND_STRING(SS_LGUI(SS_LCTRL("q")));
break;
case _OS_LINUX:
pressed ?
register_code(KC_PWR)
: unregister_code(KC_PWR);
break;
default:
if (pressed)
SEND_STRING(SS_LGUI("l"));
break;
}
break;
case KC_SCRT:
if (pressed) {
SEND_STRING(SS_LGUI("`"));
}
break;
}
return process_record_keymap(keycode, record);
}

@ -1,58 +0,0 @@
/*
Copyright 2018 Yann Hodique <yann.hodique@gmail.com> @sigma
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"
#include "version.h"
#include "eeprom.h"
// Define os types
enum os_types
{
_OS_MACOS = 0,
_OS_LINUX,
_OS_WINDOWS,
};
// Define layer names
enum userspace_layers
{
_QWERTY = 0,
};
typedef union {
uint32_t raw;
struct {
uint8_t os_target :2;
};
} userspace_config_t;
enum userspace_custom_keycodes
{
EPRM = SAFE_RANGE, // Resets EEPROM
VRSN, // Prints QMK Firmware and board info
KC_QWERTY, // Sets default layer to QWERTY
KC_MAKE, // Rebuild the current firmware
KC_OS_CUT,
KC_OS_COPY,
KC_OS_PASTE,
KC_OS_UNDO,
KC_OS_REDO,
KC_OS_LOCK,
KC_SCRT,
NEW_SAFE_RANGE //use NEW_SAFE_RANGE for keymap specific codes
};

@ -1,2 +0,0 @@
#pragma once
#define TAPPING_TERM 200

@ -1,111 +0,0 @@
# SpacebarRacecar Userspace
The main purpose of this userspace is to keep my personal keymaps clean by moving shared code in here and also allowing me to easily change all my keymaps at once. However it also contains code that might be interesting to QMK Users living in Germany. Most of this code will be explained here.
## US Layout Keys for German PCs
I'm using the US Ansi layout however I'm living in Germany which means that every PC here has its input language set to German. My goal was to create custom keycodes that emulate the US Keys so that I can plug my keyboards into any German PC and have them working without changing any settings.
### How to use
- To activate the custom keycodes set GERMAN_ENABLE = yes in the keyboards rules.mk file.
- The keycodes are listed and explained in [spacebarracecar.h](spacebarracecar.h) under `enum userspace_custom_keycodes`.
- The keycodes are handled by the `process_record_user` function which is now located in [spacebarracecar.c](spacebarracecar.c). To change keyboard specific configuration `process_record_keymap` is used (see [drashna userspace readme](../drashna/readme.md) for better explanation).
- There is a predefined `_DEADKEY` layer in [spacebarracecar.h](spacebarracecar.h) under `enum userspace_layers`. Shifted CU_QUOT enables the dead key layer, just like KC_QUOT would when using the US International layout. (See `enum userspace_custom_keycodes` for more explanation).
- On Windows grave and circonflexe are defined as dead keys when using the standard german layout. Those are automatically escaped when using the custom keycodes. `CU_ESCT` can be used to enable/disable this behavior.
- For a complete example see my [fc660c](../../keyboards/fc660c/keymaps/spacebarracecar/keymap.c) or [planck](../../keyboards/planck/keymaps/spacebarracecar/keymap.c) keymaps.
### How it works
Creating the custom keycodes was not a trivial task because it is necessary that they are able to send different keycodes depending on the physical shift state. Also the shift state of the actual send keycodes has to be completely independent of the physical shift state. At the same time it has to be ensured that shift never gets stuck or disabled accidentaly.
(Shift state: If shift keycode is registered; Physical shift state: If shift key is actually pressed)
Here is an example for a custom *US Equal* keycode that illustrates the problem:
| Physical Shift State | Custom keycode | Actual send keycodes |
|----------------------|----------------|----------------------|
| Unshifted | = | Shifted DE_0 |
| Shifted | + | Unshifted DE_PLUS |
#### Tracking the physical shift state
To track the physical shift state there are two custom left and right shift keycodes `CU_LSFT` and `CU_RSFT`. These track the current physical shift state using two booleans `lshift` and `rshift`. To make things easier both custom shifts use KC_LSFT. A space cadet shift functionality is also included. The preexisting space cadet shift implementation could not be used because it doesn't reset when custom keycodes are pressed and therefore produces unwated parenthesis.
#### Custom keycode templates
To ease the creation of custom keycodes there are a few templates defined in [spacebarracecar.h](spacebarracecar.h).
- `SHIFT_NORM(kc1, kc2)` Sends independent keycodes kc1 and kc2 depending on physical shift state without changing shift state.
- `SHIFT_SWITCH(kc1, kc2)` Sends independent keycodes kc1 and kc2 depending on physical shift state while flipping shift state.
- `SHIFT_ALL(kc1, kc2)` Sends independent keycodes kc1 and kc2 depending on physical shift state while always sending shift.
- `SHIFT_NO(kc1, kc2)` Sends independent keycodes kc1 and kc2 depending on physical shift state while never sending shift.
- `SHIFT_ALGR(kc1, kc2)` Sends independent keycodes kc1 and kc2 depending on physical shift state while never sending shift and always sending ralt.
- `UML(kc)` Sends keycode kc without changing shift state and then escapes the `_DEADKEY` layer.
Here is `SHIFT_NORM` as an example:
```c
#define SHIFT_NORM(kc1, kc2) \
if (record->event.pressed) { \
timer_timeout(); \
if (lshift || rshift) { \
register_code(KC_LSFT); \
unregister_code(kc2); \
register_code(kc2); \
add_to_prev(kc2); \
} else { \
unregister_code(KC_LSFT); \
unregister_code(kc1); \
register_code(kc1); \
} \
} else { \
unregister_code(kc1); \
unregister_code(kc2); \
} \
return false;
```
It is noticeable that before registering a keycode the same keycode gets unregistered first. The reason for this is that there can now be two physical keys that use the same keycode only with different shift states. When rolling those two keys the keycode has to be unregistered first, otherwise the second key doesn't register. Also noticable is that sometimes the `add_to_prev` function is called. This will be explained later. The `timer_timeout` function is necessary to reset the timers of the custom space cadet shift functionality.
It's worth mentioning that `SHIFT_ALGR` unlike the other templates doesn't allow repetition of characters when held. This is because it would otherwise require extensive checking of physical ralt status similar to shift to prevent ralt from getting stuck.
#### Ensuring that shift state is always correct when pressing normal keycodes
To ensure that non custom keycodes always get send with the correct shift state the default case in `process_record_user` includes a physical shift check that sets shift accordingly before registering the keycode. Also `timer_timeout` is always called to reset the space cadet shift timers to prevent unwanted parenthesis.
```c
default:
if(record->event.pressed) {
timer_timeout();
#ifdef GERMAN_ENABLE
if (lshift || rshift)
register_code(KC_LSFT);
else
unregister_code(KC_LSFT);
#endif
}
return process_record_keymap(keycode, record);
```
#### Ensuring that custom keycodes always produce the correct character
When very specific key combinations that include custom keycodes and/or shift are pressed it can happen that wrong characters are produced due to changing shift states. The previously mentioned `add_to_prev` function is there to prevent that. It can be used to add a keycode to the `prev_kcs` array that can hold up to 6 keycodes. On various occasions, but mainly when shift is released `unreg_prev` is called, which then unregisters all saved keycodes.
For real use this is probably not needed, but it doesn't hurt either.
#### Adapting the templates for other languages
In theory the templates can be used to create custom keycodes that map any layout to any other layout.
## Other stuff
### Custom Nav/Esc Key
Since I'm always using a navigation layer with all my keyboards there is a `_NAV` layer predefined in [spacebarracecar.h](spacebarracecar.h) under `enum userspace_layers`. In addition to that I wanted to have a keycode that activates the navigation layer when held, but acts as Escape when pressed. In QMK there already exists `LT(layer, kc)`, however I found that there is some amount of lag before the layer is actived. Therefore I created a custom keycode CU_NAV that does the same without lag using a custom timer. Since I already need timers for the custom space cadet shift implementing this was very easy by adding the timer to the `timer_timeout` function.
### Gamemode
The userspace includes the custom keycode `CU_GAME` that is used to flip a boolean variable called `game`. That variable is used to enable/disable windows keys and space cadet shift. In my [planck keymap](../../keyboards/planck/keymaps/spacebarracecar/keymap.c) it also makes Lower act like Space which is more comfortable when resting on wasd and it could also be used to change various other things when gaming.

@ -1,5 +0,0 @@
SRC += spacebarracecar.c
ifeq ($(strip $(GERMAN_ENABLE)), yes)
OPT_DEFS += -DGERMAN_ENABLE
endif

@ -1,342 +0,0 @@
#include "spacebarracecar.h"
#ifdef GERMAN_ENABLE
// These indicate if left and right shift are physically pressed
bool lshift = false;
bool rshift = false;
// Interrupt and times for space cadet shift
bool lshiftp = false;
bool rshiftp = false;
uint16_t lshift_timer = 0;
uint16_t rshift_timer = 0;
// Number of items that are saved in prev_kcs
uint8_t prev_indx = 0;
// Used to save the last 6 actual keycodes activated by frankenkeycodes
uint16_t prev_kcs[6] = {0, 0, 0, 0, 0, 0};
// If true the deadkey characters grave and circonflexe are not automatically escaped
bool esct = false;
/*
Used to add a keycode to a prev_kcs to remember it.
When full the last code gets discarded and replaced by
the new one.
*/
void add_to_prev(uint16_t kc){
for (int i=0; i<prev_indx; i++){
if (kc == prev_kcs[i])
return;
}
if (prev_indx == 6){
for (int i=5; i>0; i--){
prev_kcs[i] = prev_kcs[i-1];
}
prev_kcs[0] = kc;
} else {
prev_kcs[prev_indx] = kc;
prev_indx++;
}
}
/*
Unregisters all codes saved in prev_kcs and resets prev_indx.
gets called on multiple occasions mainly when shift is released
and when frankenkeycodes are pressed. Prevents output of
wrong characters when really specific key combinations
that would never occur during normal usage are pressed.
*/
void unreg_prev(void){
if (prev_indx == 0)
return;
for (int i=0; i<prev_indx; i++){
unregister_code(prev_kcs[i]);
}
prev_indx = 0;
}
#endif
// Interrupt and times for Nav/Esc
bool navesc = false;
uint16_t navesc_timer = 0;
// If true Gui keys and Space Cadet Shift get disabled
bool game = false;
// Interrupts all timers
void timer_timeout(void){
#ifdef GERMAN_ENABLE
lshiftp = false;
rshiftp = false;
#endif
navesc = false;
}
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case CU_GAME:
if(record->event.pressed) {
timer_timeout();
game = !game;
}
// allows keymap to execute further commands when CU_GAME is pressed, for example enabling a macro layer
return process_record_keymap(keycode, record) && false;
case KC_LGUI:
case KC_RGUI:
if (record->event.pressed)
timer_timeout();
if (game)
return false;
else
return true;
case CU_NAV:
if(record->event.pressed) {
navesc = true;
navesc_timer = timer_read();
layer_on(_NAV);
} else {
if (timer_elapsed(navesc_timer) < TAPPING_TERM && navesc) {
register_code(KC_ESC);
unregister_code(KC_ESC);
}
layer_off(_NAV);
}
return false;
case KC_P00:
if(record->event.pressed) {
timer_timeout();
register_code(KC_P0);
unregister_code(KC_P0);
register_code(KC_P0);
unregister_code(KC_P0);
}
return false;
#ifdef RGBLIGHT_ENABLE
case CU_RGBV:
if(record->event.pressed) {
timer_timeout();
if (rgblight_get_val()+32>255)
rgblight_sethsv(rgblight_get_hue(), rgblight_get_sat(), 31);
else
rgblight_sethsv(rgblight_get_hue(), rgblight_get_sat(), rgblight_get_val()+32);
}
return false;
#endif
#ifdef GERMAN_ENABLE
case CU_LSFT:
if(record->event.pressed) {
lshiftp = true;
lshift_timer = timer_read();
unregister_code(KC_LSFT);
register_code(KC_LSFT);
lshift = true;
} else {
if (timer_elapsed(lshift_timer) < TAPPING_TERM && lshiftp && !game) {
register_code(KC_LSFT);
register_code(KC_8);
unregister_code(KC_8);
unregister_code(KC_LSFT);
}
unreg_prev();
if (!rshift)
unregister_code(KC_LSFT);
lshift = false;
}
return false;
case CU_RSFT:
if(record->event.pressed) {
rshiftp = true;
rshift_timer = timer_read();
unregister_code(KC_LSFT);
register_code(KC_LSFT);
rshift = true;
} else {
if (timer_elapsed(rshift_timer) < TAPPING_TERM && rshiftp && !game) {
register_code(KC_LSFT);
register_code(KC_9);
unregister_code(KC_9);
unregister_code(KC_LSFT);
}
unreg_prev();
if (!lshift)
unregister_code(KC_LSFT);
rshift = false;
}
return false;
case CU_ESCT:
if(record->event.pressed) {
timer_timeout();
esct = !esct;
}
return false;
case CU_AE:
UML(DE_AE)
case CU_OE:
UML(DE_OE)
case CU_UE:
UML(DE_UE)
case CU_SS:
if(record->event.pressed) {
timer_timeout();
unregister_code(KC_LSFT);
register_code(DE_SS);
unregister_code(DE_SS);
if (lshift || rshift)
register_code(KC_LSFT);
layer_off(_DEADKEY);
}
return false;
case CU_DDQ:
if(record->event.pressed) {
timer_timeout();
register_code(KC_LSFT);
register_code(KC_2);
unregister_code(KC_2);
if (!lshift && !rshift)
unregister_code(KC_LSFT);
layer_off(_DEADKEY);
}
return false;
case CU_ED:
if(record->event.pressed) {
timer_timeout();
layer_off(_DEADKEY);
}
return false;
case CU_GRV:
if(record->event.pressed) {
timer_timeout();
if (lshift || rshift){
unregister_code(KC_LSFT);
register_code(KC_ALGR);
unregister_code(DE_PLUS);
register_code(DE_PLUS);
unregister_code(DE_PLUS);
unregister_code(KC_ALGR);
register_code(KC_LSFT);
} else {
register_code(KC_LSFT);
unregister_code(DE_ACUT);
register_code(DE_ACUT);
unregister_code(DE_ACUT);
unregister_code(KC_LSFT);
if (!esct) {
register_code(KC_SPC);
unregister_code(KC_SPC);
}
}
}
return false;
case CU_CIRC:
if(record->event.pressed) {
timer_timeout();
unregister_code(KC_LSFT);
unregister_code(DE_CIRC);
register_code(DE_CIRC);
unregister_code(DE_CIRC);
if (!esct) {
register_code(KC_SPC);
unregister_code(KC_SPC);
}
if (lshift || rshift)
register_code(KC_LSFT);
}
return false;
case CU_QUOT:
if(record->event.pressed){
timer_timeout();
register_code(KC_LSFT);
if (lshift || rshift){
layer_on(_DEADKEY);
} else {
unregister_code(DE_HASH);
register_code(DE_HASH);
add_to_prev(DE_HASH);
}
} else {
unregister_code(DE_HASH);
unreg_prev();
if (lshift || rshift)
register_code(KC_LSFT);
else
unregister_code(KC_LSFT);
}
return false;
case CU_6:
if(record->event.pressed){
timer_timeout();
unregister_code(KC_LSFT);
if (lshift || rshift){
unregister_code(DE_CIRC);
register_code(DE_CIRC);
unregister_code(DE_CIRC);
if (!esct) {
register_code(KC_SPC);
unregister_code(KC_SPC);
}
register_code(KC_LSFT);
} else {
register_code(DE_6);
}
} else {
unregister_code(DE_6);
}
return false;
case CU_COMM:
SHIFT_NO(DE_COMM, DE_LESS)
case CU_DOT:
SHIFT_NORM(DE_DOT, DE_LESS)
case CU_SLSH:
SHIFT_ALL(DE_7, DE_SS)
case CU_SCLN:
SHIFT_ALL(DE_COMM, DE_DOT)
case CU_3:
SHIFT_NO(DE_3, DE_HASH)
case CU_7:
SHIFT_NORM(DE_7, DE_6)
case CU_8:
SHIFT_NORM(DE_8, DE_PLUS)
case CU_9:
SHIFT_NORM(DE_9, DE_8)
case CU_0:
SHIFT_NORM(DE_0, DE_9)
case CU_EQL:
SHIFT_SWITCH(DE_0, DE_PLUS)
case CU_LBRC:
SHIFT_ALGR(DE_8, DE_7)
case CU_RBRC:
SHIFT_ALGR(DE_9, DE_0)
case CU_BSLS:
SHIFT_ALGR(DE_SS, DE_LESS)
case CU_Z:
CTRL(DE_Z, KC_Z)
case CU_Y:
CTRL(DE_Y, KC_Y)
case KC_LCTL:
case KC_RCTL:
if(!record->event.pressed) {
timer_timeout();
unregister_code(KC_Z);
unregister_code(KC_Y);
}
return true;
#endif
default:
if(record->event.pressed) {
timer_timeout();
#ifdef GERMAN_ENABLE
if (lshift || rshift)
register_code(KC_LSFT);
else
unregister_code(KC_LSFT);
#endif
}
return process_record_keymap(keycode, record);
}
}

@ -1,245 +0,0 @@
#pragma once
#include "quantum.h"
#include "keymap_german.h"
enum userspace_layers {
_DEADKEY = 14, // Change if more than 16 layers are required
_NAV
};
enum userspace_custom_keycodes {
CU_GAME = SAFE_RANGE, // Toggle game mode on/off
CU_NAV, // NAV | ESC
KC_P00, // Numpad double zero
#ifdef GERMAN_ENABLE
CU_LSFT, // LSFT | (
CU_RSFT, // LSFT | )
CU_COMM, // , | <
CU_DOT, // . | >
CU_SLSH, // / | ?
CU_SCLN, // ; | :
CU_QUOT, // ' | Enable deadkey layer
CU_GRV, // ` | ~
CU_CIRC, // ^
CU_3, // 3 | #
CU_6, // 6 | ^
CU_7, // 7 | &
CU_8, // 8 | *
CU_9, // 9 | (
CU_0, // 0 | )
CU_EQL, // = | +
CU_LBRC, // [ | {
CU_RBRC, // ] | }
CU_BSLS, // \ | |
CU_Z, // Z | Y in conjunction with ctrl
CU_Y, // Y | Z in conjunction wiht ctrl
CU_ESCT, // Toggle escape of grv and circ on/off
// Deadkey Layer
CU_AE, // Ä
CU_OE, // Ö
CU_UE, // Ü
CU_SS, // ß
CU_DDQ, // "
CU_ED, // Escape deadkey layer
#endif
#ifdef RGBLIGHT_ENABLE
CU_RGBV, // Cycle through RGB brightness
#endif
NEW_SAFE_RANGE // Use for keymap specific keycodes
};
#ifdef GERMAN_ENABLE
extern bool lshift;
extern bool rshift;
extern bool lshiftp;
extern bool rshiftp;
extern uint16_t lshift_timer;
extern uint16_t rshift_timer;
extern uint8_t prev_indx;
extern uint16_t prev_kcs[6];
void add_to_prev(uint16_t kc);
void unreg_prev(void);
extern bool esct;
#endif
extern bool navesc;
extern uint16_t navesc_timer;
extern bool game;
void timer_timeout(void);
bool process_record_keymap(uint16_t keycode, keyrecord_t *record);
#define CTRLX LCTL(KC_X)
#define CTRLC LCTL(KC_C)
#define CTRLV LCTL(KC_V)
#define ALTF4 LALT(KC_F4)
#define GUIU LGUI(KC_UP)
#define GUID LGUI(KC_DOWN)
#define GUIL LGUI(KC_LEFT)
#define GUIR RGUI(KC_RIGHT)
#define CTLENT CTL_T(KC_ENT)
#define EMOJI LWIN(KC_DOT)
/*
Templates for Keys, with custom shifted and non shifted Characters
*/
// Normal shift status
#define SHIFT_NORM(kc1, kc2) \
if (record->event.pressed) { \
timer_timeout(); \
if (lshift || rshift) { \
register_code(KC_LSFT); \
unregister_code(kc2); \
register_code(kc2); \
add_to_prev(kc2); \
} else { \
unregister_code(KC_LSFT); \
unregister_code(kc1); \
register_code(kc1); \
} \
} else { \
unregister_code(kc1); \
unregister_code(kc2); \
} \
return false;
// Inverted shift status
#define SHIFT_SWITCH(kc1, kc2) \
if (record->event.pressed) { \
timer_timeout(); \
if (lshift || rshift) { \
unregister_code(KC_LSFT); \
unregister_code(kc2); \
register_code(kc2); \
add_to_prev(kc2); \
} else { \
register_code(KC_LSFT); \
unregister_code(kc1); \
register_code(kc1); \
add_to_prev(kc1); \
} \
} else { \
unregister_code(kc1); \
unregister_code(kc2); \
unreg_prev(); \
if (lshift || rshift) \
register_code(KC_LSFT); \
else \
unregister_code(KC_LSFT); \
} \
return false;
// Always shifted
#define SHIFT_ALL(kc1, kc2) \
if (record->event.pressed) { \
timer_timeout(); \
register_code(KC_LSFT); \
if (lshift || rshift) { \
unregister_code(kc2); \
register_code(kc2); \
add_to_prev(kc2); \
} else { \
unregister_code(kc1); \
register_code(kc1); \
add_to_prev(kc1); \
} \
} else { \
unregister_code(kc1); \
unregister_code(kc2); \
unreg_prev(); \
if (lshift || rshift) \
register_code(KC_LSFT); \
else \
unregister_code(KC_LSFT); \
} \
return false;
// Never shifted
#define SHIFT_NO(kc1, kc2) \
if (record->event.pressed) { \
timer_timeout(); \
unregister_code(KC_LSFT); \
if (lshift || rshift) { \
unregister_code(kc2); \
register_code(kc2); \
add_to_prev(kc2); \
} else { \
unregister_code(kc1); \
register_code(kc1); \
} \
} else { \
unregister_code(kc1); \
unregister_code(kc2); \
unreg_prev(); \
if (lshift || rshift) \
register_code(KC_LSFT); \
else \
unregister_code(KC_LSFT); \
} \
return false;
// Always AltGr
#define SHIFT_ALGR(kc1, kc2) \
if (record->event.pressed) { \
timer_timeout(); \
unregister_code(KC_LSFT); \
register_code(KC_ALGR); \
if (lshift || rshift) { \
unregister_code(kc2); \
register_code(kc2); \
unregister_code(kc2); \
register_code(KC_LSFT); \
} else { \
unregister_code(kc1); \
register_code(kc1); \
unregister_code(kc1); \
} \
unregister_code(KC_ALGR); \
} \
return false;
// Different keycode when Ctrl is pressed
#define CTRL(kc1, kc2) \
if(record->event.pressed) { \
timer_timeout(); \
if (lshift || rshift) \
register_code(KC_LSFT); \
else \
unregister_code(KC_LSFT); \
if (keyboard_report->mods & (MOD_BIT(KC_LCTL) | MOD_BIT(KC_RCTL))){ \
register_code(kc2); \
} else { \
register_code(kc1); \
} \
} else { \
unregister_code(kc1); \
unregister_code(kc2); \
} \
return false;
// Template for keys on deadkey layer (mostly Umlaute)
#define UML(kc) \
if(record->event.pressed) { \
timer_timeout(); \
if (lshift || rshift) \
register_code(KC_LSFT); \
else \
unregister_code(KC_LSFT); \
register_code(kc); \
unregister_code(kc); \
layer_off(_DEADKEY); \
} \
return false;

@ -1,9 +0,0 @@
#pragma once
#define TAPPING_TERM 200
#define RETRO_TAPPING
#ifdef RGBLIGHT_ENABLE
#define RGBLIGHT_LIMIT_VAL 175
#define RGBLIGHT_SLEEP
#endif

@ -1,26 +0,0 @@
#include "stanrc85.h"
void matrix_init_user(void) {
rgblight_setrgb(0xFF, 0x00, 0x00);
};
uint32_t layer_state_set_user(uint32_t state) {
switch (biton32(state)) {
case 0:
rgblight_setrgb (0xFF, 0x00, 0x00);
break;
case 1:
rgblight_setrgb (0x00, 0xFF, 0x00);
break;
case 2:
rgblight_setrgb (0x00, 0x00, 0xFF);
break;
case 3:
rgblight_setrgb (0xFF, 0xFF, 0xFF);
break;
default: // for any other layers, or the default layer
rgblight_setrgb (0xFF, 0x00, 0x00);
break;
}
return state;
}

@ -1,52 +0,0 @@
<!-- Copyright 2019 Stanrc85
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/>.-->
# Stanrc85's Standard ANSI 60% Layout
Shared keymap between two 60% PCB:
- 1upkeyboards60HSE
- DZ60 (hotswap)
## Keymap Notes
- Layer 0 is default QWERTY layout with additional custom features:
- SpaceFN to function layer 2 on `Space`
- `CTRL` when held and `ESC` when tapped on `CAPS LOCK`
- Tap Dance on `Fn1` for `CTRL+ALT+DEL` and `WIN+L`
- Tap Dance on `ESC` for `ESC` and ` ` `
![Base QWERTY Layer](https://imgur.com/lGcyLJx.png)
- Layer 1 is default QWERTY with no custom features used mostly for gaming
- Enabled by `Fn2+CAPS` from base layer
![Default ANSI Layer](https://imgur.com/M7T9PNT.png)
- Layer 2 is Function layer:
- F keys
- Arrows
- Volume and Media controls
- AutoHotkey shortcuts based on [Speaker Control](https://github.com/stanrc85/Speaker-Control) script
- AHK Mic is used to mute/unmute microphone
- AHK Speaker switches audio output between headphones and speakers
![Function Layer](https://imgur.com/YPl0JrU.png)
- Layer 3 is RGB Underglow control and RESET
- `Fn2+CAPS` used to toggle Default QWERTY layer on and off
![RGB and RESET Layer](https://imgur.com/PyB8z7k.png)
### Build
To build the firmware file associated with this keymap, simply run `make your_keyboard:stanrc85-ansi`.

@ -1,16 +0,0 @@
TAP_DANCE_ENABLE = yes
EXTRAKEY_ENABLE = yes
BACKLIGHT_ENABLE = no
COMMAND_ENABLE = no
BOOTMAGIC_ENABLE = no
MOUSEKEY_ENABLE = no
AUDIO_ENABLE = no
CONSOLE_ENABLE = no
NKRO_ENABLE = no
SRC += stanrc85.c
ifeq ($(strip $(RGBLIGHT_ENABLE)), yes)
# Include my fancy rgb functions source here
SRC += layer_rgb.c
endif

@ -1,95 +0,0 @@
#include "stanrc85.h"
static td_state_t td_state;
__attribute__ ((weak))
bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
return true;
}
// determine the tapdance state to return
int cur_dance (qk_tap_dance_state_t *state) {
if (state->count == 1) {
if (state->interrupted || !state->pressed) { return SINGLE_TAP; }
else { return SINGLE_HOLD; }
}
if (state->count == 2) { return DOUBLE_TAP; }
else { return 3; } // any number higher than the maximum state value you return above
}
// handle the possible states for each tapdance keycode you define:
void ctl_copy_finished (qk_tap_dance_state_t *state, void *user_data) {
td_state = cur_dance(state);
switch (td_state) {
case SINGLE_TAP:
SEND_STRING(SS_LCTRL("c"));
break;
case SINGLE_HOLD:
register_mods(MOD_BIT(KC_RCTL));
break;
case DOUBLE_TAP:
SEND_STRING(SS_LCTRL("v"));
}
}
void ctl_copy_reset (qk_tap_dance_state_t *state, void *user_data) {
switch (td_state) {
case SINGLE_TAP:
break;
case SINGLE_HOLD:
unregister_mods(MOD_BIT(KC_RCTL));
break;
case DOUBLE_TAP:
break;
}
}
qk_tap_dance_action_t tap_dance_actions[] = {
[TD_WIN] = ACTION_TAP_DANCE_DOUBLE(KC_CAD, KC_LOCK),
[TD_ESC] = ACTION_TAP_DANCE_DOUBLE(KC_ESC, KC_GRV),
[TD_RCTL] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, ctl_copy_finished, ctl_copy_reset)
};
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case KC_MAKE:
if (!record->event.pressed) {
uint8_t mods = get_mods();
clear_mods();
send_string_with_delay_P(PSTR("make " QMK_KEYBOARD ":" QMK_KEYMAP), 10);
if (mods & MOD_MASK_SHIFT) {
//RESET board for flashing if SHIFT held or tapped with KC_MAKE
#if defined(__arm__)
send_string_with_delay_P(PSTR(":dfu-util"), 10);
#elif defined(BOOTLOADER_DFU)
send_string_with_delay_P(PSTR(":dfu"), 10);
#elif defined(BOOTLOADER_HALFKAY)
send_string_with_delay_P(PSTR(":teensy"), 10);
#elif defined(BOOTLOADER_CATERINA)
send_string_with_delay_P(PSTR(":avrdude"), 10);
#endif // bootloader options
send_string_with_delay_P(PSTR(SS_TAP(X_ENTER)), 10);
reset_keyboard();
}
if (mods & MOD_MASK_CTRL) {
send_string_with_delay_P(PSTR(" -j8 --output-sync"), 10);
}
send_string_with_delay_P(PSTR(SS_TAP(X_ENTER)), 10);
set_mods(mods);
}
return false;
break;
case KC_RDP: //Opens Windows RDP
if (!record->event.pressed) {
register_code(KC_LGUI);
tap_code(KC_R);
unregister_code(KC_LGUI);
wait_ms(200);
send_string_with_delay_P(PSTR("mstsc"), 10);
send_string_with_delay_P(PSTR(SS_TAP(X_ENTER)), 10);
}
return false;
break;
}
return process_record_keymap(keycode, record);
}

@ -1,45 +0,0 @@
#pragma once
#include "quantum.h"
#include "version.h"
#define DEFAULT 0 //Custom ANSI
#define LAYER1 1 //Default ANSI (enable with Fn2+CAPS)
#define LAYER2 2 //Function keys, arrows, custom shortcuts, volume control
#define LAYER3 3 //RGB Underglow controls and RESET
//Aliases for longer keycodes
#define KC_CAD LALT(LCTL(KC_DEL))
#define KC_LOCK LGUI(KC_L)
#define CA_QUOT LCA(KC_QUOT)
#define CA_SCLN LCA(KC_SCLN)
#define KC_CTLE LCTL_T(KC_ESC)
#define LT_SPCF LT(2, KC_SPC)
#define TD_TESC TD(TD_ESC)
#define TD_TWIN TD(TD_WIN)
#define TD_TCTL TD(TD_RCTL)
enum cust_keys {
KC_MAKE = SAFE_RANGE,
KC_RDP
};
enum tap_dance {
TD_WIN,
TD_ESC,
TD_RCTL
};
// define a type containing as many tapdance states as you need
typedef enum {
SINGLE_TAP,
SINGLE_HOLD,
DOUBLE_TAP
} td_state_t;
// function to determine the current tapdance state
int cur_dance (qk_tap_dance_state_t *state);
// `finished` and `reset` functions for each tapdance keycode
void ctl_copy_finished (qk_tap_dance_state_t *state, void *user_data);
void ctl_copy_reset (qk_tap_dance_state_t *state, void *user_data);

@ -1,12 +0,0 @@
#ifndef USERSPACE_CONFIG_H
#define USERSPACE_CONFIG_H
#define PERMISSIVE_HOLD
#define RESET_LAYER 15
#define BOOTMAGIC_KEY_SALT KC_ESC
#define BOOTMAGIC_KEY_SKIP KC_I
#define BOOTMAGIC_KEY_EEPROM_CLEAR KC_E
#endif // !USERSPACE_CONFIG_H

@ -1,7 +0,0 @@
Copyright 2018 Joe Wasson <info@talljoe.com> @talljoe
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

@ -1,9 +0,0 @@
SRC += talljoe.c tapdance.c
EXTRAFLAGS+=-flto
TAP_DANCE_ENABLE=yes
CONSOLE_ENABLE=no
COMMAND_ENABLE=no
DYNAMIC_KEYMAP_ENABLE=no
BOOTMAGIC_ENABLE=full

@ -1,179 +0,0 @@
#include QMK_KEYBOARD_H
#include "talljoe.h"
#ifdef ZEAL_RGB
#include "../../../keyboards/zeal60/rgb_backlight.h"
#endif
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_BASE] = TEMPLATE_TKL(
KC_ESC, KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11 , KC_F12 , KC_PSCR, KC_SLCK, MO_ADJ ,
US_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 , US_BSLS, KC_INS , KC_HOME, KC_PGUP,
US_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_DEL , KC_END , KC_PGDN,
CTL_ESC, KC_A, KC_S, KC_D, KC_F, KC_G , KC_H, KC_J, KC_K, KC_L, US_SCLN, KC_QUOT, US_ENT ,
SH_LBRC, KC_Z, KC_X, KC_C, KC_V, KC_B , KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SH_RBRC, KC_UP ,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC2, KC_SPC1, KC_SPC3, KC_RALT, KC_RGUI, KC_RCTL, KC_PTT , KC_LEFT, KC_DOWN, KC_RGHT),
[_WORKMAN] = TEMPLATE(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, KC_Q , KC_D , KC_R , KC_W , KC_B , KC_J , KC_F , KC_U , KC_P , US_SCLN, _______, _______, _______,
_______, KC_A , KC_S , KC_H , KC_T , KC_G , KC_Y , KC_N , KC_E , KC_O , KC_I , _______, _______,
_______, KC_Z , KC_X , KC_M , KC_C , KC_V , KC_K , KC_L , KC_COMM, KC_DOT , KC_SLSH, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______),
[_NORMAN] = TEMPLATE(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, KC_Q , KC_W , KC_D , KC_F , KC_K , KC_J , KC_U , KC_R , KC_L , US_SCLN, _______, _______, _______,
_______, KC_A , KC_S , KC_E , KC_T , KC_G , KC_Y , KC_N , KC_I , KC_O , KC_H , _______, _______,
_______, KC_Z , KC_X , KC_C , KC_V , KC_B , KC_P , KC_M , KC_COMM, KC_DOT , KC_SLSH, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______),
[_DVORAK] = TEMPLATE(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_LBRC, KC_RBRC, _______, _______,
_______, 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_A, KC_O, KC_E, KC_U, KC_I , KC_D, KC_H, KC_T, KC_N, KC_S, US_MINS, _______,
_______, US_SCLN, KC_Q, KC_J, KC_K, KC_X , KC_B, KC_M, KC_W, KC_V, KC_Z, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______),
[_COLMAK] = TEMPLATE(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, KC_Q, KC_W, KC_F, KC_P, KC_G , KC_J, KC_L, KC_U, KC_Y, US_SCLN, _______, _______, _______,
_______, KC_A, KC_R, KC_S, KC_T, KC_D , KC_H, KC_N, KC_E, KC_I, KC_O , _______, _______,
_______, KC_Z, KC_X, KC_C, KC_V, KC_B , KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______),
#if (SPACE_COUNT > 1)
// A tweaked version of the Maltron layout
[_MALTROFF] = TEMPLATE(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, KC_Q, KC_P, KC_Y, KC_G, KC_B , KC_J, KC_M, KC_U, KC_K, KC_L, _______, _______, _______,
_______, KC_A, KC_N, KC_I, KC_S, KC_F , KC_D, KC_T, KC_H, KC_O, KC_R , US_ENT , KC_BSPC,
_______, KC_Z, KC_X, KC_C, KC_V, US_QUOT, KC_SCLN, KC_W, KC_COMM, KC_DOT, KC_SLSH, _______, _______,
_______, _______, _______, MLT_E , _______, _______, _______, _______, _______, _______),
#endif
#ifdef ENABLE_GAME_LAYER
[_GAME] = TEMPLATE(
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_BSLS, KC_GRV,
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,
MO_NAV , 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_ADJ ,
KC_LCTL, KC_PTT , KC_PGDN, KC_SPC , KC_SPC , KC_SPC , KC_RALT, KC_APP , KC_RCTL, KC_PTT ),
#endif
[_NAV] = TEMPLATE_NAV(
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 , XXXXXXX, XXXXXXX,
US_TAB , KC_EXLM, KC_AT , KC_HASH, KC_DLR , KC_PERC, KC_INS , KC_PGUP, KC_UP , KC_PGDN, KC_BTN1, KC_BTN3, KC_BTN2, KC_DEL ,
CTL_ESC, KC_LCBR, KC_RCBR, KC_LPRN, KC_RPRN, KC_AMPR, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, KC_END , US_QUOT, TG_ADJ ,
KC_LSFT, KC_EQL, KC_PLUS, KC_MINS, KC_UNDS, KC_ASTR, KC_CALC, US_GRV , KC_WBAK, KC_WFWD, KC_WREF, KC_RSFT, KC_APP ,
KC_LCTL, KC_LGUI, KC_LALT, NV_SPC2, NV_SPC1, NV_SPC3, KC_RALT, KC_RGUI, KC_RCTL, KC_PTT ),
[_NUM] = TEMPLATE_NUM(
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
KC_GRV , KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_VOLU, KC_CIRC, KC_7, KC_8, KC_9, KC_PMNS, XXXXXXX, XXXXXXX, KC_DEL ,
CTL_ESC, KC_F5 , KC_F6 , KC_F7 , KC_F8 , KC_MUTE, KC_PENT, KC_4, KC_5, KC_6, KC_PPLS, XXXXXXX, KC_ENT ,
KC_LSFT, KC_F9 , KC_F10 , KC_F11 , KC_F12 , KC_VOLD, KC_PIPE, KC_1, KC_2, KC_3, KC_PAST, KC_PSLS, TG_NUM ,
KC_LCTL, KC_LGUI, KC_LALT, NM_SPC2, NM_SPC1, NM_SPC3, KC_PDOT, KC_PCMM, KC_RCTL, KC_PTT ),
// Adjust layer is on the split-shift key; or NAV+Enter (for non-split keyboards)
[_ADJUST] = TEMPLATE_ADJUST(
MO_RST , FX(1) , FX(2) , FX(3) , FX(4) , FX(5) , FX(6) , FX(7) , FX(8) , FX(9) , FX(10) , BR_DEC , BR_INC , XXXXXXX, MO_RST ,
MO_RST , H1_INC , S1_INC , H2_INC , S2_INC , EF_INC , RGB_HUI, RGB_SAI, RGB_MOD, RGB_M_P, DFAULTS, RGB_VAD, RGB_VAI, MO_RST ,
XXXXXXX, H1_DEC , S1_DEC , H2_DEC , S2_DEC , EF_DEC , RGB_HUD, RGB_SAD, RGB_RMOD,RGB_M_K, RGB_M_B, RGB_M_G, TG_ADJ ,
TG_NKRO, LY_QWER, LY_WORK, LY_NRMN, LY_DVRK, LY_CLMK, XXXXXXX, LY_MALT, XXXXXXX, XXXXXXX, KC_MAKE, KC_CAPS, XXXXXXX,
MO_RST , AG_SWAP, AG_NORM, XXXXXXX, BL_TOGG, XXXXXXX, RGB_TOG, XXXXXXX, XXXXXXX, TG_GAME),
// To Reset hit FN + ` + Esc
[_RESET] = TEMPLATE_RESET,
};
void matrix_scan_user(void) {
#ifdef KEYBOARD_gh60
if (IS_LAYER_ON(_GAME)) {
gh60_wasd_leds_on();
} else {
gh60_wasd_leds_off();
}
#endif
}
void matrix_init_user(void) {
if (!eeconfig_is_enabled()) {
eeconfig_init();
}
}
uint32_t default_layer_state_set_kb(uint32_t state) {
// persist changes to default layers
eeconfig_update_default_layer(state);
return state;
}
__attribute__ ((weak))
bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
return true;
}
#ifdef ZEAL_RGB
extern backlight_config g_config;
#endif
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
#ifdef ZEAL_RGB
static uint8_t last_effect;
#endif
#ifdef RGBLIGHT_ENABLE
static uint32_t savedRgbMode;
static uint16_t savedHue;
static uint8_t savedSat;
static uint8_t savedVal;
if (keycode == KC_ESC) {
if (record->event.pressed) {
savedRgbMode = rgblight_get_mode();
savedHue = rgblight_get_hue();
savedSat = rgblight_get_sat();
savedVal = rgblight_get_val();
rgblight_mode(1);
rgblight_setrgb(255, 0, 0);
} else {
rgblight_mode(savedRgbMode);
rgblight_sethsv(savedHue, savedSat, savedVal);
}
}
#endif
// If console is enabled, it will print the matrix position and status of each key pressed
#ifdef CONSOLE_ENABLE
xprintf("KL: row: %u, column: %u, pressed: %u\n", record->event.key.row, record->event.key.col, record->event.pressed);
#endif //CONSOLE_ENABLE
switch (keycode) {
case KC_MAKE: // Compiles the firmware, and adds the flash command based on keyboard bootloader
if (!record->event.pressed) {
SEND_STRING("make " QMK_KEYBOARD ":" QMK_KEYMAP
#if defined(BOOTLOADER_HALFKAY)
":teensy"
#elif defined(BOOTLOADER_CATERINA)
":avrdude"
#else
":dfu"
#endif
SS_TAP(X_ENTER));
}
return false;
break;
#ifdef ZEAL_RGB
case BL_TOGG:
if (IS_PRESSED(record->event)) {
if (g_config.effect) {
last_effect = g_config.effect;
g_config.effect = 0;
} else {
g_config.effect = last_effect;
}
}
return false;
case EFFECT...EFFECT_END:
if (IS_PRESSED(record->event)) {
uint8_t effect = keycode - EFFECT;
if(effect == g_config.effect)
effect = 0; // Toggle effect on second press
g_config.effect = effect;
backlight_config_save();
}
return false;
#endif
}
return process_record_keymap(keycode, record);
}

@ -1,199 +0,0 @@
#ifndef USERSPACE
#define USERSPACE
#include "quantum.h"
enum userspace_custom_keycodes {
KC_MAKE = SAFE_RANGE, // can always be here
DFAULTS,
TOGGLE_BACKLIGHT,
EFFECT,
EFFECT_END = EFFECT + 20
};
#ifndef RESET_LAYER
#define RESET_LAYER 15
#endif
enum layers {
_BASE = 0,
_WORKMAN,
_NORMAN,
_DVORAK,
_COLMAK,
_MALTROFF,
_GAME,
_NAV,
_NUM,
_ADJUST,
_RESET = RESET_LAYER,
};
enum tap_dancers {
TD_SEMICOLON,
TD_GRAVE,
TD_QUOTE,
};
#define MO_NAV MO(_NAV)
#define MO_ADJ MO(_ADJUST)
#define MO_RST MO(_RESET)
#define TG_ADJ TG(_ADJUST)
#define TG_NUM TG(_NUM)
#ifdef ENABLE_GAME_LAYER
#define TG_GAME TG(_GAME)
#else
#define TG_GAME KC_NO
#endif
#define LY_QWER DF(_BASE)
#define LY_WORK DF(_WORKMAN)
#define LY_NRMN DF(_NORMAN)
#define LY_DVRK DF(_DVORAK)
#define LY_CLMK DF(_COLMAK)
#if SPACE_COUNT >= 2
#define LY_MALT DF(_MALTROFF)
#else
#define LY_MALT KC_NO
#endif
#define TG_NKRO MAGIC_TOGGLE_NKRO
#define KC_PTT KC_F24
#define MS_MID KC_MS_BTN3
#define FX(x) (EFFECT + x)
#define CTL_ESC CTL_T(KC_ESC)
#define US_ENT RCTL_T(KC_ENT)
#define US_MINS RCTL_T(KC_QUOT)
#define US_BSLS LCA_T(KC_BSLS)
#define US_SCLN TD(TD_SEMICOLON)
#define US_GRV TD(TD_GRAVE)
#define US_QUOT TD(TD_QUOTE)
#define US_TAB C_S_T(KC_TAB)
#define SH_LBRC LSFT_T(KC_LBRC)
#define SH_RBRC RSFT_T(KC_RBRC)
#define MLT_E LT(_NUM, KC_E)
#ifndef SPACE_COUNT
#define SPACE_COUNT 1
#endif
#if (SPACE_COUNT == 1)
#define KC_SPC1 LT(_NAV, KC_SPC)
#define KC_SPC2 XXXXXXX
#define KC_SPC3 XXXXXXX
#define NV_SPC1 _______
#define NV_SPC2 _______
#define NV_SPC3 _______
#define NM_SPC1 _______
#define NM_SPC2 _______
#define NM_SPC3 _______
#elif (SPACE_COUNT == 2)
#define KC_SPC1 LT(_NAV,KC_SPC)
#define KC_SPC2 LT(_NUM,KC_ENT)
#define NV_SPC1 KC_SPC
#define NV_SPC2 KC_ENT
#define NM_SPC1 KC_0
#define NM_SPC2 KC_SPC
#define KC_SPC3 XXXXXXX
#define NV_SPC3 XXXXXXX
#define NM_SPC3 XXXXXXX
#elif (SPACE_COUNT == 3)
#ifdef SWAP_HANDS_ENABLE
#define KC_SPC1 SH_T(KC_BSPC)
#else
#define KC_SPC1 KC_BSPC
#endif
#define KC_SPC2 LT(_NUM,KC_ENT)
#define KC_SPC3 LT(_NAV,KC_SPC)
#define NV_SPC1 KC_SPC
#define NV_SPC2 KC_ENT
#define NV_SPC3 KC_SPC
#define NM_SPC1 KC_SPC
#define NM_SPC2 XXXXXXX
#define NM_SPC3 KC_0
#else
#error "Unsupported space count:" SPACE_COUNT
#endif
#ifndef ZEAL_RGB
#define BR_INC KC_NO
#define BR_DEC KC_NO
#define EF_INC KC_NO
#define EF_DEC KC_NO
#define ES_INC KC_NO
#define ES_DEC KC_NO
#define H1_INC KC_NO
#define H1_DEC KC_NO
#define S1_INC KC_NO
#define S1_DEC KC_NO
#define H2_INC KC_NO
#define H2_DEC KC_NO
#define S2_INC KC_NO
#define S2_DEC KC_NO
#define FN_MO13 KC_NO
#define FN_MO2 KC_NO
#endif
#ifndef TEMPLATE
#define _X_ KC_NO
#define TEMPLATE( \
KJ4, KJ7, KI7, KH7, KG7, KG4, KF4, KF7, KE7, KD7, KR7, KR4, KE4, KB2, KJ6, \
KJ2, KJ5, KI5, KH5, KG5, KG2, KF2, KF5, KE5, KD5, KR5, KR2, KE2, KB3, \
KI2, KJ3, KI3, KH3, KG3, KG6, KF6, KF3, KE3, KD3, KR3, KR6, KB1, \
KN2, KJ1, KI1, KH1, KG1, KG0, KF0, KF1, KE1, KD1, KR0, KN3, KA5, \
KA4, KP2, KC6, KX1, KK6, KX2, KC0, KM3, KD0, KA1 \
) TEMPLATE_TKL ( \
KJ6, _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_, KA5, \
KJ4, KJ7, KI7, KH7, KG7, KG4, KF4, KF7, KE7, KD7, KR7, KR4, KE4, KB2, _X_, _X_, _X_, \
KJ2, KJ5, KI5, KH5, KG5, KG2, KF2, KF5, KE5, KD5, KR5, KR2, KE2, KB3, _X_, _X_, _X_, \
KI2, KJ3, KI3, KH3, KG3, KG6, KF6, KF3, KE3, KD3, KR3, KR6, KB1, \
KN2, KJ1, KI1, KH1, KG1, KG0, KF0, KF1, KE1, KD1, KR0, KN3, _X_, \
KA4, KP2, KC6, KX1, KK6, KX2, KC0, KM3, KD0, KA1, _X_, _X_, _X_ \
)
#endif
#ifndef TEMPLATE_TKL
#define TEMPLATE_TKL( \
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, \
KJ2, KJ5, KI5, KH5, KG5, KG2, KF2, KF5, KE5, KD5, KR5, KR2, KE2, KB3, KK4, KO7, KQ7, \
KI2, KJ3, KI3, KH3, KG3, KG6, KF6, KF3, KE3, KD3, KR3, KR6, KB1, \
KN2, KJ1, KI1, KH1, KG1, KG0, KF0, KF1, KE1, KD1, KR0, KN3, KO6, \
KA4, KP2, KC6, KX1, KK6, KX2, KC0, KM3, KD0, KA1, KO0, KK0, KL0 \
) TEMPLATE( \
KJ4, KJ7, KI7, KH7, KG7, KG4, KF4, KF7, KE7, KD7, KR7, KR4, KE4, KB2, KJ6, \
KJ2, KJ5, KI5, KH5, KG5, KG2, KF2, KF5, KE5, KD5, KR5, KR2, KE2, KB3, \
KI2, KJ3, KI3, KH3, KG3, KG6, KF6, KF3, KE3, KD3, KR3, KR6, KB1, \
KN2, KJ1, KI1, KH1, KG1, KG0, KF0, KF1, KE1, KD1, KR0, KN3, KA5, \
KA4, KP2, KC6, KX1, KK6, KX2, KC0, KM3, KD0, KA1 \
)
#endif
#ifndef TEMPLATE_ALT
#define TEMPLATE_ALT TEMPLATE
#endif
#ifndef TEMPLATE_NUM
#define TEMPLATE_NUM TEMPLATE_ALT
#endif
#ifndef TEMPLATE_NAV
#define TEMPLATE_NAV TEMPLATE_ALT
#endif
#ifndef TEMPLATE_ADJUST
#define TEMPLATE_ADJUST TEMPLATE_ALT
#endif
#ifndef TEMPLATE_RESET
#define TEMPLATE_RESET TEMPLATE_ALT( \
RESET , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RESET , \
RESET , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RESET , \
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, \
RESET , XXXXXXX, XXXXXXX, XXXXXXX, RESET , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX)
#endif
#endif

@ -1,146 +0,0 @@
//Tap Dance
#include "talljoe.h"
enum {
SINGLE_TAP = 1,
SINGLE_HOLD = 2,
DOUBLE_TAP = 3,
DOUBLE_HOLD = 4,
DOUBLE_SINGLE_TAP = 5, //send two single taps
TRIPLE_TAP = 6,
TRIPLE_HOLD = 7,
SPECIAL = 8
};
static struct {
int quote;
int semicolon;
} tap_state = {0};
int cur_dance (qk_tap_dance_state_t *state) {
if (state->count == 1) {
//If count = 1, and it has been interrupted - it doesn't matter if it is pressed or not: Send SINGLE_TAP
if (state->interrupted) {
// if (!state->pressed) return SINGLE_TAP;
//need "permissive hold" here.
// else return SINGLE_HOLD;
//If the interrupting key is released before the tap-dance key, then it is a single HOLD
//However, if the tap-dance key is released first, then it is a single TAP
//But how to get access to the state of the interrupting key????
return SINGLE_TAP;
}
else {
if (!state->pressed) return SINGLE_TAP;
else return SINGLE_HOLD;
}
}
//If count = 2, and it has been interrupted - assume that user is trying to type the letter associated
//with single tap.
else if (state->count == 2) {
if (state->interrupted) return DOUBLE_SINGLE_TAP;
else if (state->pressed) return DOUBLE_HOLD;
else return DOUBLE_TAP;
}
else if ((state->count == 3) && ((state->interrupted) || (!state->pressed))) return TRIPLE_TAP;
else if (state->count == 3) return TRIPLE_HOLD;
else return SPECIAL;
}
int hold_cur_dance (qk_tap_dance_state_t *state) {
if (state->count == 1) {
if (state->interrupted) {
if (!state->pressed) return SINGLE_TAP;
else return SINGLE_HOLD;
}
else {
if (!state->pressed) return SINGLE_TAP;
else return SINGLE_HOLD;
}
}
//If count = 2, and it has been interrupted - assume that user is trying to type the letter associated
//with single tap.
else if (state->count == 2) {
if (state->pressed) return DOUBLE_HOLD;
else return DOUBLE_TAP;
}
else if (state->count == 3) {
if (!state->pressed) return TRIPLE_TAP;
else return TRIPLE_HOLD;
}
else return SPECIAL;
}
// Send semi-colon + enter on two taps
void tap_dance_semicolon_finished(qk_tap_dance_state_t *state, void *user_data) {
tap_state.semicolon = hold_cur_dance(state);
switch (tap_state.semicolon) {
case SINGLE_TAP: case DOUBLE_HOLD: register_code(KC_SCLN); break;
case SINGLE_HOLD: layer_on(_NUM); break;
}
}
void tap_dance_semicolon_reset(qk_tap_dance_state_t *state, void *user_data) {
switch (tap_state.semicolon) {
case SINGLE_TAP: case DOUBLE_HOLD: unregister_code(KC_SCLN); break;
case DOUBLE_TAP: {
if (get_mods()) {
SEND_STRING(";;"); // send normal when mods are pressed
}
else {
SEND_STRING(";\n");
}
break;
}
case TRIPLE_TAP: {
SEND_STRING(";\n\n");
}
case SPECIAL: layer_invert(_NUM); break;
case SINGLE_HOLD: layer_off(_NUM); break;
}
tap_state.semicolon = 0;
}
// Send `. ~. ```
void tap_dance_grave_finished(qk_tap_dance_state_t *state, void *user_data) {
switch(state->count) {
case 1:
SEND_STRING("`");
break;
case 2:
SEND_STRING("~");
break;
}
}
void tap_dance_grave_each(qk_tap_dance_state_t *state, void *user_data) {
if(state->count == 3) {
SEND_STRING("```");
} else if (state->count > 3) {
SEND_STRING("`");
}
}
void tap_dance_quote_finished(qk_tap_dance_state_t *state, void *user_data) {
tap_state.quote = hold_cur_dance(state);
switch (tap_state.quote) {
case SINGLE_TAP: case DOUBLE_HOLD: register_code(KC_QUOT); break;
case SINGLE_HOLD: layer_on(_NAV); break;
}
}
void tap_dance_quote_reset(qk_tap_dance_state_t *state, void *user_data) {
switch (tap_state.quote) {
case SINGLE_TAP: case DOUBLE_HOLD: unregister_code(KC_QUOTE); break;
case DOUBLE_TAP: SEND_STRING("\""); break;
case TRIPLE_TAP: layer_invert(_NAV); break;
case SINGLE_HOLD: layer_off(_NAV); break;
}
tap_state.quote = 0;
}
qk_tap_dance_action_t tap_dance_actions[] = {
[TD_SEMICOLON] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, tap_dance_semicolon_finished, tap_dance_semicolon_reset),
[TD_GRAVE] = ACTION_TAP_DANCE_FN_ADVANCED(tap_dance_grave_each, tap_dance_grave_finished, NULL),
[TD_QUOTE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, tap_dance_quote_finished, tap_dance_quote_reset),
};

@ -1,389 +0,0 @@
/* Copyright 2017 @TurboMech /u/TurboMech <discord> @A9entOran9e#6134
*
* 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 "turbomech.h"
#include "quantum.h"
//#include "action_layer.h"
#include "action.h"
//#include "rgblight.h"
__attribute__ ((weak))
void matrix_init_keymap(void) {}
__attribute__ ((weak))
void matrix_scan_keymap(void) {}
__attribute__ ((weak))
bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
return true;
}
__attribute__ ((weak))
uint32_t layer_state_set_keymap (uint32_t state) {
return state;
}
__attribute__ ((weak))
void led_set_keymap(uint8_t usb_led) {}
//#define default_layer _QWERTY (0)
//extern keymap_config_t keymap_config;
extern rgblight_config_t rgblight_config;
//#ifdef RGBLIGHT_ENABLE
/*change the rgblight_setrgb(#, #, #) to what you want CAPS lock - currenlty red*/
//#define rgblight_set_caps rgblight_setrgb(255, 0, 0)
//#define rgblight_base rgblight_mode(RGB_current_mode)
//#endif
//
//bool rgb_layer_change = true;
//bool RGB_INIT = false;
//bool TOG_STATUS = false;
#ifdef RGBLIGHT_ENABLE
bool rgb_layer_change = true;
#endif
int RGB_current_mode;
/*void matrix_init_user(void) {
#ifdef RGBLIGHT_ENABLE
rgblight_enable();
if (true) {
eeconfig_read_rgblight();
rgblight_get_mode();
eeconfig_update_rgblight_default();
// eeconfig_debug_rgblight();
//rgblight_init();
}
#endif
}
*/
/*void matrix_init_user(void) {
#ifdef RGBLIGHT_ENABLE
eeconfig_read_rgblight();
eeconfig_update_rgblight_default();
//rgblight_init();
//rgblight_mode(RGB_current_mode);
//rgblight_mode(RGB_current_mode);
//RGB_current_mode = rgblight_config.mode;
#endif
}*/
void persistent_default_layer_set(uint16_t default_layer) {
eeconfig_update_default_layer(default_layer);
default_layer_set(default_layer);
default_layer = _QWERTY;
// eeconfig_update_rgblight(rgblight_config.raw);
}
//Setting ADJUST layer RGB back to default
/*void update_tri_layer_RGB(uint8_t layer1, uint8_t layer2, uint8_t layer3) {
if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) {
rgblight_mode(RGB_current_mode);
layer_on(layer1);
} else {
layer_off(layer2);
}
}*/
void matrix_init_user(void) {
uint8_t default_layer = eeconfig_read_default_layer();
rgblight_enable();
if(true) {
if (default_layer & (1UL << _QWERTY)) {
//RGB_current_mode = rgblight_config.mode;
rgblight_mode(11);
}
else {
rgblight_mode (12);
}
/*else if (default_layer & (1UL << _DVORAK)) {
rgblight_set_green;
}
//else if (default_layer & (1UL << _WORKMAN)) {
rgblight_set_purple;
}
else {
rgblight_set_teal;*/
}
}
static bool is_capslocked = false;
void led_set_user(uint8_t usb_led) {
if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
is_capslocked = true;
// DDRB |= (1 << 2); PORTB &= ~(1 << 2);
} else {
is_capslocked = false;
// DDRB &= ~(1 << 2); PORTB &= ~(1 << 2);
}
}
//rgblight_set();
//static uint8_t is_capslocked = false;
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case _QWERTY:
persistent_default_layer_set(1UL << _QWERTY);
return false;
break;
case KC_MAKE_ALU84:
if (!record->event.pressed) {
SEND_STRING("make alu84:TurboMech:dfu");
SEND_STRING(SS_TAP(X_ENTER));
}
return false;
break;
case KC_QMK:
if (!record->event.pressed) {
SEND_STRING("cd QMK/qmk_firmware");
SEND_STRING(SS_TAP(X_ENTER));
}
return false;
break;
case KC_RESET:
if (!record->event.pressed) {
#ifdef RGBLIGHT_ENABLE
rgblight_enable();
rgblight_mode(1);
rgblight_setrgb(255, 255, 255);
#endif
//_delay_ms(2000);
reset_keyboard();
}
return false;
break;
/*case RGB_MOD:
//led operations - RGB mode change now updates the RGB_current_mode to allow the right RGB mode to be set after reactive keys are released
if (record->event.pressed) {
rgblight_mode(RGB_current_mode);
RGB_current_mode = rgblight_config.mode;
rgblight_step();
// rgblight_mode(RGB_current_mode);
//RGB_current_mode = rgblight_config.mode;
// _delay_ms(50);
// rgblight_set();
RGB_current_mode = rgblight_config.mode;
}
else //if (rgblight_config.enable)
{
_delay_ms(50);
rgblight_set();
//rgblight_mode(rgblight_config.mode);
// eeconfig_update_rgblight(rgblight_config.raw);
}
return true;
break;*/
/*case MO(1):
if (record->event.realeased) {
rgblight_mode(1);
rgblight_set_red;
}
return true;
break;*/
/*case KC_CAPS:
if (record->event.pressed) {
rgblight_mode(RGB_current_mode);
register_code(KC_CAPS);
rgblight_mode(1);
rgblight_set_red;
}
else {
unregister_code(KC_CAPS);
rgblight_mode(RGB_current_mode);
}
return false;
break;*/
/* rgblight_mode(RGB_current_mode);
register_code(KC_CAPS);
rgblight_mode(1);
rgblight_set_red;
}
else {
unregister_code(KC_CAPS);
rgblight_mode(RGB_current_mode);*/
// }
// return true;
// break;
/*case KC_RESET:
if (record->event.pressed) {
layer_off(_FUNCTION);
rgblight_mode(RGB_current_mode);
RGB_current_mode = rgblight_config.mode;
layer_clear();
_delay_ms(1000);
reset_keyboard();
}
else{
//layer_off(_FUNCTION);
_delay_ms(1000);
rgblight_mode(RGB_current_mode);
RGB_current_mode = rgblight_config.mode;
//eeconfig_update_rgblight_default();
}
return false;
break;
}*/
return true;
break;
/*case RGB_MOD:
case RGB_HUI:
case RGB_HUD:
case RGB_SAI:
case RGB_SAD:
case RGB_VAI:
case RGB_VAD:
case RGB_MODE_PLAIN:
case RGB_MODE_BREATHE:
case RGB_MODE_RAINBOW:
case RGB_MODE_SWIRL:
case RGB_MODE_SNAKE:
case RGB_MODE_KNIGHT:
case RGB_MODE_XMAS:
case RGB_MODE_GRADIENT:
if (record->event.pressed) {
rgb_layer_change = false;
}
break;
}
return true;*/
}
return process_record_keymap(keycode, record);
}
uint32_t layer_state_set_user(uint32_t state) {
#ifdef RGBLIGHT_ENABLE
uint8_t default_layer = eeconfig_read_default_layer();
if (rgb_layer_change) {
switch (biton32(state)) {
case _FUNCTION:
rgblight_set_blue;
rgblight_mode(1);
break;
case _QWERTY:
rgblight_mode(11);
break;
// case _MOUS:
// rgblight_set_yellow;
// rgblight_mode(1);
// break;
//case _MACROS:
//rgblight_set_orange;
//is_overwatch ? rgblight_mode(17) : rgblight_mode(18);
//break;
//case _MEDIA:
//rgblight_set_green;
//rgblight_mode(22);
//break;
default:
if (is_capslocked) {
rgblight_mode(1);
rgblight_set_red;
}
else { if (default_layer & (1UL << _QWERTY)) {
rgblight_mode(11);
}
else if (default_layer & (1UL << _FUNCTION)) {
rgblight_set_cyan;
}
//else if (default_layer & (1UL << _WORKMAN)) {
// rgblight_set_purple;
// }
else {
rgblight_set_orange;
}
}
rgblight_mode(1);
break;
}
}
#endif
return state;
}
!!** possible for later
void set_single_persistent_default_layer(uint8_t default_layer);
void set_single_persistent_default_layer(uint8_t default_layer) {
#if defined(AUDIO_ENABLE) && defined(DEFAULT_LAYER_SONGS)
PLAY_SONG(default_layer_songs[default_layer]);
#endif
eeconfig_update_default_layer(1U<<default_layer);
default_layer_set(1U<<default_layer);
void matrix_init_kb(void);
void matrix_init_user(void);
!!** line 31
__attribute__ ((weak))
void matrix_init_keymap(void) {}
__attribute__ ((weak))
void matrix_scan_keymap(void) {}
__attribute__ ((weak))
bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
return true;
}
__attribute__ ((weak))
uint32_t layer_state_set_keymap (uint32_t state) {
return state;
}
__attribute__ ((weak))
void led_set_keymap(uint8_t usb_led) {}
Alt +30C4
¯\_()_/¯
Alt +00AF

@ -1,125 +0,0 @@
/* Copyright 2017 @TurboMech /u/TurboMech <discord> @A9entOran9e#6134
*
* 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/>.
*/
//**!! Currently after reboot the set rgb mode does not persist after reboot. Need to find a way to "save" the rgb mode. Color remains after reboot though.
#include "turbomech.h"
#include "quantum.h"
#include "action_layer.h"
#include "action.h"
#include "rgblight.h"
//#include "process_unicode.h"
extern keymap_config_t keymap_config;
extern rgblight_config_t rgblight_config;
bool RGB_INIT = false;
bool TOG_STATUS = false;
bool caps_is_active = false;
int RGB_current_mode;
void matirx_scan_kb (void) {
if (RGB_INIT) {}
else {
RGB_current_mode = rgblight_config.mode;
RGB_INIT = true;
}
rgblight_mode(RGB_current_mode); // revert RGB to initial mode prior to RGB mode change
TOG_STATUS = false;
}
void persistent_default_layer_set(uint16_t default_layer) {
eeconfig_update_default_layer(default_layer);
default_layer_set(default_layer);
}
/*void update_tri_layer_RGB(uint8_t layer1, uint8_t layer2, uint8_t layer3) {
if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) {
rgblight_mode(RGB_current_mode);
layer_on(layer3);
} else {
layer_off(layer3);
}
}*/
__attribute__ ((weak))
bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
return true;
}
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case KC_CAPS:
if (record->event.pressed) {
register_code(KC_CAPS);
caps_is_active = !caps_is_active;
if (caps_is_active) {
rgblight_mode(14);
}
else if (!caps_is_active) {
unregister_code(KC_CAPS);
rgblight_mode(RGB_current_mode);
}
}
return false;
break;
case RGB_MOD:
//led operations - RGB mode change now updates the RGB_current_mode to allow the right RGB mode to be set after reactive keys are released
if (record->event.pressed) {
rgblight_mode(RGB_current_mode);
rgblight_step();
RGB_current_mode = rgblight_config.mode;
// rgblight_set();
}
return false;
break;
case KC_RESET:
if (record->event.pressed) {
rgblight_enable();
rgblight_mode(1);
rgblight_setrgb(255, 255, 255);
//_delay_ms(2000);
reset_keyboard();
}
return false;
break;
/*case _FLIP: //(╯°□°)╯︵ ┻━┻
if (record->event.pressed) {
register_code(KC_LPRN);
unregister_code(KC_LPRN);
register_code(X(0x00B0));
unregister_code(X(0x00B0));
UC(0x256F);
PROCESS_UNICODE(UC(0x00B0));
SEND_TAP(UC(0x25A1));
SEND_TAP(UC(0x00B0));
SEND_STRING(")");
SEND_TAP(UC(0x256F));
SEND_TAP(UC(0xFE35));
SEND_TAP(UC(0x253B));
SEND_TAP(UC(0x2501));
SEND_TAP(UC(0x253B));
}
return false;
break;*/
return true;
break;
}
return process_record_keymap(keycode, record);
}

@ -1,50 +0,0 @@
/* Copyright 2017 @TurboMech /u/TurboMech <discord> @A9entOran9e#6134
*
* 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/>.
*/
#ifndef USERSPACE
#define USERSPACE
#include "quantum.h"
// Definine layer names
#define _QWERTY 0
#define _FUNCTION 1
#ifdef RGBLIGHT_ENABLE
//values are HSV (Hue, Sat, Val) - except Sat and Val equal 255 for 100%.
#define rgblight_set_blue rgblight_sethsv (240, 255, 255);
#define rgblight_set_red rgblight_sethsv (0, 255, 255);
#define rgblight_set_green rgblight_sethsv (120, 255, 255);
#define rgblight_set_orange rgblight_sethsv (30, 255, 255);
#define rgblight_set_teal rgblight_sethsv (195, 255, 255);
#define rgblight_set_magenta rgblight_sethsv (300, 255, 255);
#define rgblight_set_yellow rgblight_sethsv (60, 255, 255);
#define rgblight_set_purple rgblight_sethsv (270, 255, 255);
#define rgblight_set_cyan rgblight_sethsv (180, 255, 255);
#define rgblight_set_white rgblight_sethsv (0, 0, 255)
#endif
//must use KC_RESET in order to have RESET indicate a color/mode
enum userspace_custom_keycodes {
EPRM = SAFE_RANGE, //should always be here
KC_RESET,
KC_MAKE_ALU84,
KC_QMK,
_FLIP,
NEW_SAFE_RANGE
};
#endif

@ -1,24 +0,0 @@
#pragma once
// this makes it possible to do rolling combos (zx) with keys that
// convert to other keys on hold (z becomes ctrl when you hold it,
// and when this option isn't enabled, z rapidly followed by x
// actually sends Ctrl-x. That's bad.)
#define IGNORE_MOD_TAP_INTERRUPT
#undef PERMISSIVE_HOLD
//#define TAPPING_FORCE_HOLD
//#define RETRO_TAPPING
#ifndef TAPPING_TOGGLE
#define TAPPING_TOGGLE 2
#endif
#ifdef TAPPING_TERM
#undef TAPPING_TERM
#endif
#define TAPPING_TERM 150
// Disable action_get_macro and fn_actions, since we don't use these
// and it saves on space in the firmware.
#define NO_ACTION_MACRO
#define NO_ACTION_FUNCTION

@ -1,14 +0,0 @@
Copyright 2018 Chuck Lauer Vose vosechu@gmail.com @vosechu
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/>.

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

@ -1,25 +0,0 @@
#include "vosechu.h"
// void my_custom_function(void) {
// }
// [DV] = { /* ================================================== DVORAK ============================================================ */
// { KC_1, KC_A, KC_B, KC_C, KC_D, KC_E, _______ , KC_G, KC_H, KC_J, KC_K, KC_L, KC_M },
// { KC_2, KC_A, KC_B, KC_C, KC_D, KC_E, _______ , KC_G, KC_H, KC_J, KC_K, KC_L, KC_M },
// { KC_3, KC_A, KC_B, KC_C, KC_D, KC_E, _______ , KC_G, KC_H, KC_J, KC_K, KC_L, KC_M },
// { KC_4, KC_A, KC_B, KC_C, KC_D, KC_E, KC_F , KC_G, KC_H, KC_J, KC_K, KC_L, KC_M },
// { KC_5, KC_A, KC_B, KC_C, KC_D, KC_E, KC_F , KC_G, KC_H, KC_J, KC_K, KC_L, KC_M }
// },
// bool process_record_user(uint16_t keycode, keyrecord_t *record) {
// if (record->event.pressed) {
// // These also need to be defined in the header file
// switch(keycode) {
// case PAWFIVE:
// SEND_STRING(":pawfive:");
// return false;
// }
// }
// return true;
// };

@ -1,71 +0,0 @@
#pragma once
#include "quantum.h"
// Each layer gets a name for readability, which is then used in the keymap matrix below.
enum userspace_custom_layers {
DV = 0,
QW,
GAM1,
RSE,
LWR,
LFT,
MOUSE
};
enum userspace_custom_keycodes {
PAWFIVE = SAFE_RANGE,
MOUKEY,
MS_BTN1,
MS_BTN2,
MS_BTN3
};
// Transparent macro to indicate that this spot is already being pressed
// to activate this layer
#define _LAYER_ KC_TRNS
// == Dual-action keys on most of the modifiers
#define CTL_ESC CTL_T(KC_ESC)
#define CTL_GRV CTL_T(KC_GRV)
#define ALT_TAB ALT_T(KC_TAB)
#define SFT_SPC SFT_T(KC_SPC)
// == Macro keys for commonly used apps
// -- Slack
// Move one conversation up/down
#define SLACKUP LALT(LSFT(KC_UP))
#define SLACKDN LALT(LSFT(KC_DOWN))
// -- Browser and OS X
// Activate one tab left/right
#define TAB_LFT LGUI(LSFT(KC_LBRC))
#define TAB_RGT LGUI(LSFT(KC_RBRC))
// Go back/forward in history
#define BWSR_BK LGUI(KC_LBRC)
#define BWSR_FW LGUI(KC_RBRC)
// -- Screen management
// Make window fill the left/right side
#define SCR_LFT HYPR(KC_LEFT)
#define SCR_RGT HYPR(KC_RGHT)
// Make window fill the whole monitor
#define SCR_FUL HYPR(KC_F)
// == Extended alpha layer toggles
// -- Dvorak
// Pressing U opens up the LWR layer (numpad)
#define LWR_U LT(LWR, KC_U)
// Pressing H opens up the RSE layer (brackets/parens)
#define RSE_H LT(RSE, KC_H)
// -- Qwerty
// Pressing F opens up the LWR layer (numpad)
#define LWR_F LT(LWR, KC_F)
// Pressing J opens up the RSE layer (brackets/parens)
#define RSE_J LT(RSE, KC_J)
// -- LFT layer (Works on both Qwerty and Dvorak)
// Pressing Back space or Enter opens up the LFT layer (media/navigation)
#define LFT_BK LT(LFT, KC_BSPC)
#define LFT_ENT LT(LFT, KC_ENT)

@ -1,44 +0,0 @@
#pragma once
//TAPPING_TERM
//tapping term short (<100): on multi-purpose keys, slow taps may not register, but "holds" register easier. multi-tap keys may be difficult to activate.
//tapping term long (>200): holds don't register as easily - noticeable when typing quickly (e.g. shift doesn't want to engage.)
//MIGHT HAVE TO SPLIT THIS INTO TWO CONDITIONS
#if defined(TAP_DANCE_ENABLE) && defined(KEYBOARD_lets_split_rev2) || defined(KEYBOARD_iris_rev2)
//Kailh Coppers activate quickly and don't need a long tapping term
#define TAPPING_TERM 100
#elif defined(TAP_DANCE_ENABLE) && defined(KEYBOARD_bigswitch)
#define TAPPING_TERM 700
#else
#define TAPPING_TERM 145
#endif
//Mousekey Settings
#ifdef MOUSEKEY_ENABLE
#define MOUSEKEY_INTERVAL 16
#define MOUSEKEY_DELAY 0
#define MOUSEKEY_TIME_TO_MAX 60
#define MOUSEKEY_MAX_SPEED 7
#define MOUSEKEY_WHEEL_DELAY 0
#endif
// Disable action_get_macro and fn_actions, since we don't use these
// and it saves on space in the firmware.
#ifndef NO_DEBUG
#define NO_DEBUG
#endif // !NO_DEBUG
#if !defined(NO_PRINT) && !defined(CONSOLE_ENABLE)
#define NO_PRINT
#endif // !NO_PRINT
#define NO_ACTION_MACRO
#define NO_ACTION_FUNCTION
#define NO_ACTION_ONESHOT
// Disable mod tap interrrupt
#ifndef IGNORE_MOD_TAP_INTERRUPT
#define IGNORE_MOD_TAP_INTERRUPT
#endif // !mod tap interrrupt

@ -1,14 +0,0 @@
Copyright 2018 Brian Fong @wanleg
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/>.

@ -1,39 +0,0 @@
SRC += wanleg.c tapdances.c
TAP_DANCE_ENABLE = yes
MOUSEKEY_ENABLE = yes
#If using a ProMicro and it has the QMK DFU bootloader instead of Caterina,
#run "make <keyboard>:<keymap> dfu=qmk" when compiling to ensure it is flagged properly after being flashed
ifeq ($(strip $(dfu)), qmk)
BOOTLOADER = qmk-dfu
endif
#use alternate settings for boards using ProMicro instead of Micro
#example usage: make 4x4:wanleg PM=yes
ifeq ($(strip $(PM)), yes)
OPT_DEFS += -DPRO_MICRO
endif
#use alternate settings for boards using "Adafruit Feather 32u4 Bluefruit LE" instead of Micro
#example usage: make 5x5:wanleg BT=yes
ifeq ($(strip $(BT)), yes)
#opt_defs for alternate pin usage
OPT_DEFS += -DBLUEFRUIT
#Adafruit Bluefruit controller settings
BLUETOOTH = AdafruitBLE
BLUETOOTH_ENABLE = yes
F_CPU = 8000000
CONSOLE_ENABLE = no # Console for debug(+400)
COMMAND_ENABLE = no # Commands for debug and configuration
RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
endif
#move numpad to Left/Centre/Right(default) on 5x15 boards
#example usage: make 4x4:wanleg padc=yes
ifeq ($(strip $(padc)), yes)
OPT_DEFS += -DPADC
endif
ifeq ($(strip $(padl)), yes)
OPT_DEFS += -DPADL
endif

@ -1,264 +0,0 @@
//Tap Dance Settings
#include "wanleg.h"
//audio settings for one of the tap dances below
#ifdef AUDIO_ENABLE
float lyrup_song[][2] = SONG(MUSIC_ON_SOUND);
float lyrdown_song[][2] = SONG(MUSIC_OFF_SOUND);
#endif
///// QUAD FUNCTION TAP DANCE GENERAL SETUP SECTION START /////
///// (no need to edit this section) /////
//Enums used to clearly convey the state of the tap dance
enum {
SINGLE_TAP = 1,
SINGLE_HOLD = 2,
DOUBLE_TAP = 3,
DOUBLE_HOLD = 4,
DOUBLE_SINGLE_TAP = 5, //send SINGLE_TAP twice - NOT DOUBLE_TAP
TRIPLE_TAP = 6,
TRIPLE_HOLD = 7,
TRIPLE_SINGLE_TAP = 8
// Add more enums here if you want for triple, quadruple, etc.
};
typedef struct {
bool is_press_action;
int state;
} tap;
int cur_dance (qk_tap_dance_state_t *state) {
if (state->count == 1) {
//If count = 1, and it has been interrupted - it doesn't matter if it is pressed or not: Send SINGLE_TAP
if (state->interrupted || !state->pressed) return SINGLE_TAP;
if (state->interrupted) return SINGLE_TAP;
else return SINGLE_HOLD;
}
//If count = 2, and it has been interrupted - assume that user is trying to type the letter associated
//with single tap.
else if (state->count == 2) {
if (state->interrupted) return DOUBLE_SINGLE_TAP;
else if (state->pressed) return DOUBLE_HOLD;
else return DOUBLE_TAP;
}
//If count = 3, and it has been interrupted - assume that user is trying to type the letter associated
//with double tap.
else if (state->count == 3) {
if (state->interrupted) return TRIPLE_SINGLE_TAP;
else if (state->pressed) return TRIPLE_HOLD;
else return TRIPLE_TAP;
}
else return 9; //magic number. At some point this method will expand to work for more presses
}
///// QUAD FUNCTION TAP DANCE GENERAL SETUP SECTION END /////
///// QUAD FUNCTION TAP DANCE PERSONALIZATION SECTION START /////
//instantiate 'tap' for the 'CAD' tap dance.
static tap CADtap_state = {
.is_press_action = true,
.state = 0
};
void CAD_finished (qk_tap_dance_state_t *state, void *user_data) {
CADtap_state.state = cur_dance(state);
switch (CADtap_state.state) {
case SINGLE_TAP:
//register_code(KC_SPC);
SEND_STRING(SS_LGUI("l"));
#ifdef BACKLIGHT_ENABLE
backlight_level(3);
#endif
break;
case SINGLE_HOLD:
//register_code(KC_NO);
//take a screenshot of a single window, open Paint and paste
SEND_STRING(SS_LALT(SS_TAP(X_PSCREEN)) SS_LGUI("r"));
wait_ms(500);
SEND_STRING("mspaint" SS_TAP(X_ENTER));
wait_ms(700);
SEND_STRING(SS_LCTRL("v"));
break; //register this keycode when button is held
case DOUBLE_TAP:
//register_code(KC_ENT);
SEND_STRING(SS_LCTRL(SS_LALT(SS_TAP(X_DELETE))));
#ifdef BACKLIGHT_ENABLE
backlight_level(0);
#endif
break;
//case DOUBLE_HOLD: register_code(KC_NO); break; //register this keycode when button is tapped and then held
case DOUBLE_HOLD:
reset_keyboard();
break; //register this keycode when button is tapped and then held
case TRIPLE_TAP:
SEND_STRING("wanleg@github.com");
break;
case TRIPLE_HOLD:
set_single_persistent_default_layer(1);
#ifdef AUDIO_ENABLE
stop_all_notes();
PLAY_SONG(lyrup_song);
#endif
break;
}
}
void CAD_reset (qk_tap_dance_state_t *state, void *user_data) {
switch (CADtap_state.state) {
//nothing to do
}
CADtap_state.state = 0;
}
//instantiate 'tap' for the 'RST' tap dance.
static tap RSTtap_state = {
.is_press_action = true,
.state = 0
};
void RST_finished (qk_tap_dance_state_t *state, void *user_data) {
RSTtap_state.state = cur_dance(state);
switch (RSTtap_state.state) {
case SINGLE_TAP: register_code(KC_LCTL); break;
case SINGLE_HOLD: register_code(KC_LCTL); break;
case DOUBLE_TAP: reset_keyboard(); break;
case DOUBLE_SINGLE_TAP: register_code(KC_LCTL); unregister_code(KC_LCTL); register_code(KC_LCTL); break;
}
}
void RST_reset (qk_tap_dance_state_t *state, void *user_data) {
switch (RSTtap_state.state) {
case SINGLE_TAP: unregister_code(KC_LCTL); break;
case SINGLE_HOLD: unregister_code(KC_LCTL); break;
case DOUBLE_SINGLE_TAP: unregister_code(KC_LCTL); break;
}
RSTtap_state.state = 0;
}
//instantiate 'tap' for the 'LYR' tap dance.
static tap LYRtap_state = {
.is_press_action = true,
.state = 0
};
void LYR_finished (qk_tap_dance_state_t *state, void *user_data) {
LYRtap_state.state = cur_dance(state);
switch (LYRtap_state.state) {
case SINGLE_TAP: register_code(KC_PSLS); break;
case DOUBLE_TAP: set_single_persistent_default_layer(_GK); break;
case DOUBLE_SINGLE_TAP: register_code(KC_PSLS); unregister_code(KC_PSLS); register_code(KC_PSLS);
}
}
void LYR_reset (qk_tap_dance_state_t *state, void *user_data) {
switch (LYRtap_state.state) {
case SINGLE_TAP: unregister_code(KC_PSLS); break;
case DOUBLE_TAP: set_single_persistent_default_layer(_GK); break;
case DOUBLE_SINGLE_TAP: unregister_code(KC_PSLS);
}
LYRtap_state.state = 0;
}
//instantiate 'tap' for the 'LYR75' tap dance.
static tap LYR75tap_state = {
.is_press_action = true,
.state = 0
};
void LYR75_finished (qk_tap_dance_state_t *state, void *user_data) {
LYR75tap_state.state = cur_dance(state);
switch (LYR75tap_state.state) {
case SINGLE_TAP: register_code(KC_PSLS); break;
case DOUBLE_TAP: set_single_persistent_default_layer(_GK); break;
case DOUBLE_SINGLE_TAP: register_code(KC_PSLS); unregister_code(KC_PSLS); register_code(KC_PSLS);
}
}
void LYR75_reset (qk_tap_dance_state_t *state, void *user_data) {
switch (LYR75tap_state.state) {
case SINGLE_TAP: unregister_code(KC_PSLS); break;
case DOUBLE_TAP: set_single_persistent_default_layer(_GK); break;
case DOUBLE_SINGLE_TAP: unregister_code(KC_PSLS);
}
LYR75tap_state.state = 0;
}
//instantiate 'tap' for the 'LYR50' tap dance.
static tap LYR50tap_state = {
.is_press_action = true,
.state = 0
};
void LYR50_finished (qk_tap_dance_state_t *state, void *user_data) {
LYR50tap_state.state = cur_dance(state);
switch (LYR75tap_state.state) {
case SINGLE_TAP: register_code(KC_PSLS); break;
case DOUBLE_TAP: set_single_persistent_default_layer(GK50); break;
case DOUBLE_SINGLE_TAP: register_code(KC_PSLS); unregister_code(KC_PSLS); register_code(KC_PSLS);
}
}
void LYR50_reset (qk_tap_dance_state_t *state, void *user_data) {
switch (LYR50tap_state.state) {
case SINGLE_TAP: unregister_code(KC_PSLS); break;
case DOUBLE_TAP: set_single_persistent_default_layer(GK50); break;
case DOUBLE_SINGLE_TAP: unregister_code(KC_PSLS);
}
LYR50tap_state.state = 0;
}
//instantiate 'tap' for the 'BSW' tap dance.
static tap BSWtap_state = {
.is_press_action = true,
.state = 0
};
void BSW_finished (qk_tap_dance_state_t *state, void *user_data) {
BSWtap_state.state = cur_dance(state);
switch (BSWtap_state.state) {
case SINGLE_TAP: register_code(KC_ENTER); break;
case SINGLE_HOLD:
set_single_persistent_default_layer(0);
#ifdef AUDIO_ENABLE
stop_all_notes();
PLAY_SONG(lyrdown_song);
#endif
break;
case DOUBLE_TAP:
register_code(KC_LCTRL);
register_code(KC_C);
break;
case DOUBLE_HOLD:
reset_keyboard();
break; //register this keycode when button is tapped and then held
}
}
void BSW_reset (qk_tap_dance_state_t *state, void *user_data) {
switch (BSWtap_state.state) {
case SINGLE_TAP: unregister_code(KC_ENTER); break;
case DOUBLE_TAP:
unregister_code(KC_LCTRL);
unregister_code(KC_C);
break;
}
BSWtap_state.state = 0;
}
///// QUAD FUNCTION TAP DANCE PERSONALIZATION SECTION END /////
//Tap Dance Definitions
//THIS SECTION HAS TO BE AT THE END OF THE TAP DANCE SECTION
qk_tap_dance_action_t tap_dance_actions[] = {
[TD_SFT_CAPS] = ACTION_TAP_DANCE_DOUBLE(KC_LSFT, KC_CAPS)
// Other declarations would go here, separated by commas, if you have them
,[TD_Q_ESC] = ACTION_TAP_DANCE_DOUBLE(KC_Q, KC_ESC)
,[RST_TAP_DANCE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, RST_finished, RST_reset)
,[CAD_TD] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, CAD_finished, CAD_reset)
,[LYR_TAP_DANCE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, LYR_finished, LYR_reset)
,[LYR75_TAP_DANCE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, LYR75_finished, LYR75_reset)
,[LYR50_TAP_DANCE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, LYR50_finished, LYR50_reset)
,[BSW_TAP_DANCE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, BSW_finished, BSW_reset)
};
//In Layer declaration, add tap dance item in place of a key code
//TD(TD_SFT_CAPS)

@ -1,139 +0,0 @@
#include "wanleg.h"
// Defines actions for my global custom keycodes. Defined in wanleg.h file
// Then runs the _keymap's record handier if not processed here
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case QWERTY:
if (record->event.pressed) {
print("mode just switched to qwerty and this is a huge string\n");
set_single_persistent_default_layer(_QW);
}
return false;
break;
case GHERKIN:
if (record->event.pressed) {
set_single_persistent_default_layer(_GK);
}
return false;
break;
case gGHERKIN:
if (record->event.pressed) {
set_single_persistent_default_layer(gGK);
}
return false;
break;
case ONEHAND:
if (record->event.pressed) {
set_single_persistent_default_layer(ONE);
}
return false;
break;
case NUMPAD:
if (record->event.pressed) {
set_single_persistent_default_layer(PAD);
}
return false;
break;
case GHERKIN50:
if (record->event.pressed) {
set_single_persistent_default_layer(GK50);
}
return false;
break;
case SUBTER:
if (record->event.pressed) {
layer_on(SUB);
} else {
layer_off(SUB);
}
return false;
break;
case SUPRA:
if (record->event.pressed) {
layer_on(SUP);
} else {
layer_off(SUP);
}
return false;
break;
case NUMBER:
if (record->event.pressed) {
layer_on(NUM);
} else {
layer_off(NUM);
}
return false;
break;
case DIRECTION:
if (record->event.pressed) {
layer_on(DIR);
} else {
layer_off(DIR);
}
return false;
break;
case ETCETERA:
if (record->event.pressed) {
layer_on(ETC);
} else {
layer_off(ETC);
}
return false;
break;
case gNUMBER:
if (record->event.pressed) {
layer_on(gNUM);
} else {
layer_off(gNUM);
}
return false;
break;
case gDIRECTION:
if (record->event.pressed) {
layer_on(gDIR);
} else {
layer_off(gDIR);
}
return false;
break;
case gETCETERA:
if (record->event.pressed) {
layer_on(gETC);
} else {
layer_off(gETC);
}
return false;
break;
case FUNCTION:
if (record->event.pressed) {
layer_on(_FN);
} else {
layer_off(_FN);
}
return false;
break;
}
return true;
}
/// Turn off LEDs on ProMicros of Let's Split ///
// LEDs only on by default on Let's Split
// Add reconfigurable functions here, for keymap customization
// This allows for a global, userspace functions, and continued
// customization of the keymap. Use _keymap instead of _user
// functions in the keymaps
__attribute__ ((weak))
void matrix_init_keymap(void) {}
// Call user matrix init, then call the keymap's init function
void matrix_init_user(void) {
#if defined(KEYBOARD_lets_split_rev2)
DDRD &= ~(1<<5);
PORTD &= ~(1<<5);
DDRB &= ~(1<<0);
PORTB &= ~(1<<0);
#endif
matrix_init_keymap();
}

@ -1,309 +0,0 @@
#pragma once
#include "quantum.h"
// Define layer names and order
#ifdef KEYBOARD_gherkin
enum userspace_layers {
gGK = 0,
gNUM,
gDIR,
gETC,
_GK,
_QW,
ONE,
SUB,
SUP,
NUM,
DIR,
ETC,
_FN,
PAD,
GK50,
};
#elif KEYBOARD_40percentclub_5x5
enum userspace_layers {
GK50 = 0,
_GK,
_QW,
PAD,
gNUM,
gDIR,
gETC,
gGK,
ONE,
SUB,
SUP,
NUM,
DIR,
ETC,
_FN,
};
#else
enum userspace_layers {
_GK = 0,
_QW,
PAD,
ONE,
SUB,
SUP,
NUM,
DIR,
ETC,
gGK,
gNUM,
gDIR,
gETC,
_FN,
GK50,
};
#endif
enum userspace_custom_keycodes {
gGHERKIN = SAFE_RANGE,
GHERKIN,
QWERTY,
ONEHAND,
SUBTER,
SUPRA,
NUMBER,
DIRECTION,
ETCETERA,
gNUMBER,
gDIRECTION,
gETCETERA,
FUNCTION,
NUMPAD,
GHERKIN50,
};
//Tap Dance Declarations (list of my tap dance configurations)
#ifdef TAP_DANCE_ENABLE
enum {
TD_SFT_CAPS = 0
,TD_Q_ESC
,CAD_TD
,RST_TAP_DANCE
,LYR_TAP_DANCE
,LYR50_TAP_DANCE
,LYR75_TAP_DANCE
,BSW_TAP_DANCE
};
#endif
// Since our quirky block definitions are basically a list of comma separated
// arguments, we need a wrapper in order for these definitions to be
// expanded before being used as arguments to the LAYOUT_xxx macro.
#if (!defined(LAYOUT) && defined(KEYMAP))
#define LAYOUT KEYMAP
#endif
#define KEYMAP_wrapper(...) LAYOUT(__VA_ARGS__)
#define LAYOUT_wrapper(...) LAYOUT(__VA_ARGS__)
#define LAYOUT_ortho_3x10_wrapper(...) LAYOUT_ortho_3x10(__VA_ARGS__)
#define LAYOUT_ortho_4x4_wrapper(...) LAYOUT_ortho_4x4(__VA_ARGS__)
#define LAYOUT_ortho_4x12_wrapper(...) LAYOUT_ortho_4x12(__VA_ARGS__)
#define LAYOUT_ortho_5x5_wrapper(...) LAYOUT_ortho_5x5(__VA_ARGS__)
#define LAYOUT_ortho_5x10_wrapper(...) LAYOUT_ortho_5x10(__VA_ARGS__)
#define LAYOUT_ortho_5x15_wrapper(...) LAYOUT_ortho_5x15(__VA_ARGS__)
// Blocks for each of the major keyboard layouts
// Organized so we can quickly adapt and modify all of them
// at once, rather than for each keyboard, one at a time.
// And this allows for much cleaner blocks in the keymaps.
// NOTE: These are all the same length. If you do a search/replace
// then you need to add/remove underscores to keep the
// lengths consistent.
/* Pure Gherkin
* .-----------------------------------------------------------------------------------------.
* | Q//ESC | W | E | R | T | Y | U | I | O | P |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | A | S | D | F | G | H | J | K | L | SPACE |
* | | | | | | | | | |SFThold |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | Z | X | C | V/gNUM | B/gETC | N | M/gDIR | ,/GUI | ./ALT | BSPC |
* | SFThold| | | | | | | | |CTRLhold|
* '-----------------------------------------------------------------------------------------'
*/
#define _______________Gherkin_Row_0_______________ TD(TD_Q_ESC), KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P
#define _______________Gherkin_Row_1_______________ KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, SFT_T(KC_SPC)
#define _______________Gherkin_Row_2_______________ SFT_T(KC_Z), KC_X, KC_C, LT(gNUM,KC_V), LT(gETC,KC_B), KC_N, LT(gDIR,KC_M), GUI_T(KC_COMM), ALT_T(KC_DOT), CTL_T(KC_BSPC)
/* Directional Keys
* .-----------------------------------------------------------------------------------------.
* | TAB | up | | INS | CTRL | SHIFT | PgUp | HOME | - | = |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | left | down | right | PrScr | SHIFT | CTRL | PgDn | END | [ | ] |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | P-Brk | | | | | | | RGUI | ALT | / |
* '-----------------------------------------------------------------------------------------'
*/
#define _______________Gherkin_DIR_0_______________ KC_TAB, KC_UP, _______, KC_INS, KC_LCTL, KC_RSFT, KC_PGUP, KC_HOME, KC_MINS, KC_EQL
#define _______________Gherkin_DIR_1_______________ KC_LEFT, KC_DOWN, KC_RGHT, KC_PSCR, KC_LSFT, KC_RCTL, KC_PGDN, KC_END, KC_LBRC, KC_RBRC
#define _______________Gherkin_DIR_2_______________ KC_PAUS, _______, _______, _______, _______, _______, _______, KC_RGUI, KC_LALT, KC_SLSH
/* Numbers
* .-----------------------------------------------------------------------------------------.
* | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | F11 | F12 | | | | ENTER | SHIFT | GUI | ./ALT | BSPC |
* | | | | | | | | | |CTRLhold|
* '-----------------------------------------------------------------------------------------'
*/
#define _______________Gherkin_NUM_0_______________ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10
#define _______________Gherkin_NUM_1_______________ KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0
#define _______________Gherkin_NUM_2_______________ KC_F11, KC_F12, _______,_______, _______, KC_ENT, KC_RSFT, KC_RGUI, ALT_T(KC_DOT), CTL_T(KC_BSPC)
/* Et Cetera
* .-----------------------------------------------------------------------------------------.
* | ` | mUP | | | RESET | SHIFT | mScrDn | mScrUp | | \ |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | mLeft | mDown | mRight | | SHIFT | mBtn3 | mBtn1 | mBtn2 | ; | ' |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | Sft//Cp| CAPS | | | | C-A-D | mScrL | mScrR | ALT | DEL |
* '-----------------------------------------------------------------------------------------'
*/
#define _______________Gherkin_ETC_0_______________ KC_GRV, KC_MS_U, _______,_______, RESET, KC_RSFT, KC_WH_D, KC_WH_U, _______, KC_BSLS
#define _______________Gherkin_ETC_1_______________ KC_MS_L, KC_MS_D, KC_MS_R,_______, KC_LSFT, KC_BTN3, KC_BTN1, KC_BTN2, KC_SCLN, KC_QUOT
#define _______________Gherkin_ETC_2_______________ TD(TD_SFT_CAPS),KC_CAPS, _______,_______, _______, LALT(LCTL(KC_DEL)), KC_WH_L, KC_WH_R, KC_LALT, KC_DEL
/* Gherkin-Like
* .-----------------------------------------------------------------------------------------------------------.
* | ESC | Q//ESC | W | E | R | T | Y | U | I | O | P | BSPC |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | TAB | A | S | D | F | G | H | J | K | L | SPACE | ' |
* | | | | | | | | | | |SFThold | |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* |SFT/CAPS| Z | X | C | V/NUM | B/ETC | N | M/DIR | ,/GUI | ./ALT | BSPC | ENT/SFT|
* | |SFThold | | | | | | | | |CTRLhold| |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | LCTRL | LGUI | ALT | ONEHAND| NUM | ETC | SPACE | DIR | RGUI | ALT | DEL | CTRL |
* '-----------------------------------------------------------------------------------------------------------'
*/
#define _______________GherkinLike_0_______________ KC_ESC, _______________Gherkin_Row_0_______________, KC_BSPC
#define _______________GherkinLike_1_______________ KC_TAB, _______________Gherkin_Row_1_______________, KC_QUOT
#define _______________GherkinLike_2_______________ TD(TD_SFT_CAPS), SFT_T(KC_Z), KC_X, KC_C, LT(NUM, KC_V),LT(ETC, KC_B),KC_N, LT(DIR, KC_M), GUI_T(KC_COMM), ALT_T(KC_DOT), CTL_T(KC_BSPC), SFT_T(KC_ENT)
#define _______________GherkinLike_3_______________ KC_LCTL, KC_LGUI, KC_LALT, KC_LALT, NUMBER, ETCETERA, KC_SPC,DIRECTION, KC_RGUI, KC_RALT, KC_DEL, KC_RCTL
#define _______________GherkinLike_3_OneHand_______ KC_LCTL, KC_LGUI, KC_LALT, ONEHAND, NUMBER, ETCETERA, KC_SPC,DIRECTION, KC_RGUI, KC_RALT, ONEHAND, KC_RCTL
/* Qwerty
* .-------------------------------------------------------------------------------------.
* | Esc | Q | W | E | R | T | Y | U | I | O | P | BSPC |
* |-------+------+------+------+------+-------------+------+------+------+------+-------|
* | Tab | A | S | D | F | G | H | J | K | L | ; | ' |
* |-------+------+------+------+------+------|------+------+------+------+------+-------|
* |Sft/Cps| Z | X | C | V | B | N | M | , | . | / |ENT/SFT|
* |-------+------+------+------+------+------+------+------+------+------+------+-------|
* | LCTRL | LGUI | ALT | ALT | SUB | SHIFT| SPACE| SUP | RGUI | RALT | DEL | CTRL |
* '-------------------------------------------------------------------------------------'
*/
#define _______________Qwerty_Row__0_______________ KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC
#define _______________Qwerty_Row__1_______________ KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT
#define _______________Qwerty_Row__2_______________ TD(TD_SFT_CAPS), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_T(KC_ENT)
#define _______________Qwerty_Row__3_______________ KC_LCTL, KC_LGUI, KC_LALT, KC_LALT, SUBTER, KC_LSFT, KC_SPC, SUPRA, KC_RGUI, KC_RALT, KC_DEL, KC_RCTL
/* SUPRA
* .-----------------------------------------------------------------------------------------------------------.
* | RESET | TAB | up | | INS | CTRL | SHIFT | PgUp | Home | - | = | DEL |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | | left | down | right | PrScr | SHIFT | CTRL | PgDn | End | [ | ] | \ |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | | P-Brk | | | | | | | RGUI | ALT | | |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | | | | | | | | | | | | |
* '-----------------------------------------------------------------------------------------------------------'
*/
#define ________________SUPRA_Row_0________________ RESET, KC_TAB, KC_UP, _______, KC_INS, KC_LCTL, KC_RSFT, KC_PGUP, KC_HOME, KC_MINS, KC_EQL, KC_DEL
#define ________________SUPRA_Row_1________________ _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_PSCR, KC_LSFT, KC_RCTL, KC_PGDN, KC_END, KC_LBRC, KC_RBRC, KC_BSLS
#define ________________SUPRA_Row_2________________ _______, KC_PAUS, _______, _______, _______, _______, _______, _______, KC_RGUI, KC_RALT, _______, _______
#define ________________SUPRA_Row_3________________ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
/* SUBTER
* .-----------------------------------------------------------------------------------------------------------.
* | | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | DEL |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | | F11 | F12 | | | | | | RGUI | ./ALT | BSPC | |
* | | | | | | | | | | |CTRLhold| |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | | | gherkin| | | | ENTER | SHIFT | | | | |
* '-----------------------------------------------------------------------------------------------------------'
*/
#define _______________SUBTER_Row__0_______________ _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_DEL
#define _______________SUBTER_Row__1_______________ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______
#define _______________SUBTER_Row__2_______________ _______, KC_F11, KC_F12, _______, _______, _______, _______, _______, KC_RGUI,ALT_T(KC_DOT), CTL_T(KC_BSPC), _______
#define _______________SUBTER_Row__3_______________ _______, _______, GHERKIN, _______, _______, _______, KC_ENT, KC_LSFT, _______,_______, _______, _______
/* Gherkin Numbers
* .-----------------------------------------------------------------------------------------------------------.
* | | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | BSPC |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | | F11 | F12 | | | | ENTER | SHIFT | RGUI | ./ALT | BSPC | |
* | | | | | | | | | | |CTRLhold| |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | | | | | | | ENTER | SHIFT | RGUI | | | |
* '-----------------------------------------------------------------------------------------------------------'
*/
#define _______________NUMBERS_Row_0_______________ _______, _______________Gherkin_NUM_0_______________, KC_BSPC
#define _______________NUMBERS_Row_1_______________ _______, _______________Gherkin_NUM_1_______________, _______
#define _______________NUMBERS_Row_2_______________ _______, _______________Gherkin_NUM_2_______________, _______
#define _______________NUMBERS_Row_3_______________ _______, _______, _______, _______, _______, _______, KC_ENT, KC_RSFT, KC_RGUI, _______, _______, _______
/* Gherkin Directional Keys
* .-----------------------------------------------------------------------------------------------------------.
* | | TAB | up | | INS | CTRL | SHIFT | PgUp | HOME | - | = | DEL |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | | left | down | right | PrScr | SHIFT | CTRL | PgDn | END | [ | ] | |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | | P-Brk | | | | | | | RGUI | ALT | / | |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | | | qwerty | | | | | | | | | |
* '-----------------------------------------------------------------------------------------------------------'
*/
#define _____________DIRECTIONS_Row__0_____________ _______, _______________Gherkin_DIR_0_______________, KC_DEL
#define _____________DIRECTIONS_Row__1_____________ _______, _______________Gherkin_DIR_1_______________, _______
#define _____________DIRECTIONS_Row__2_____________ _______, _______________Gherkin_DIR_2_______________, _______
#define _____________DIRECTIONS_Row__3_____________ _______, _______, QWERTY, _______, _______, _______, _______, _______, _______, _______, _______, _______
/* Gherkin Et Cetera
* .-----------------------------------------------------------------------------------------------------------.
* | | ` | mUP | | | RESET | SHIFT | mScrUp |mScrDown| | \ | DEL |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | | mLeft | mDown | mRight | | SHIFT | mBtn3 | mBtn1 | mBtn2 | ; | ' | |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | | Sft//Cp| | | | | C-A-D |mScrLeft| mScrRt | ALT | DEL | |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
* | | | | | | | C-A-D | | | | | |
* '-----------------------------------------------------------------------------------------------------------'
*/
#define ______________ETCETERA_Row__0______________ _______, _______________Gherkin_ETC_0_______________, KC_DEL
#define ______________ETCETERA_Row__1______________ _______, _______________Gherkin_ETC_1_______________, _______
#define ______________ETCETERA_Row__2______________ _______, _______________Gherkin_ETC_2_______________, _______
#define ______________ETCETERA_Row__3______________ _______, _______, _______, _______, _______, _______, LALT(LCTL(KC_DEL)), _______, _______, _______, _______, _______
/* Single 4x4 board only
* .-----------------------------------.
* | 7 | 8 | 9 | BSPC |
* |--------+--------+--------+--------|
* | 4 | 5 | 6 | SPACE |
* |--------+--------+--------+--------|
* | 1 | 2 | 3 | ENTER |
* |--------+--------+--------+--------|
* | 0 |/ //_GK | . | - |
* '-----------------------------------'
*/
#define _______________NUMPAD_Row__0_______________ KC_KP_7, KC_KP_8, KC_KP_9, KC_BSPC
#define _______________NUMPAD_Row__1_______________ KC_KP_4, KC_KP_5, KC_KP_6, KC_SPC
#define _______________NUMPAD_Row__2_______________ KC_KP_1, KC_KP_2, KC_KP_3, KC_PENT
#define _______________NUMPAD_Row__3_______________ KC_KP_0, TD(LYR_TAP_DANCE), KC_KP_DOT, KC_PMNS

@ -1,172 +0,0 @@
/* Copyright 2015-2017 Christon DeWan
*
* 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/>.
*/
#ifdef RGBLIGHT_ENABLE
#include <math.h>
#include "rgblight.h"
#include "color.h"
#include "fancylighting.h"
__attribute__ ((weak))
void matrix_scan_keymap(void) {
// override me, if you want.
return;
}
#define ABSDIFF(a,b) ((a)>(b)?(a)-(b):(b)-(a))
#define FADE_BACK_TIME 500
#define BREATH_FIRE_TIME 1000
#define ANIMATION_STEP_INTERVAL 20
#if RGBLED_NUM >= 2
#define POWER_KEY_OFFSET (RGBLED_NUM / 2)
#define SPACE_OFFSET_MAX (RGBLED_NUM / 2)
#else
#define POWER_KEY_OFFSET 1
#define SPACE_OFFSET_MAX 1
#endif
uint16_t effect_start_timer = 0;
uint8_t user_rgb_mode = 0;
LED_TYPE shadowed_led[RGBLED_NUM] = {{0}};
void start_firey_return(void) {
user_rgb_mode = BREATH_FIRE;
effect_start_timer = timer_read();
for(uint8_t i = 0; i < RGBLED_NUM; i++) {
shadowed_led[i] = led[i];
}
}
/** 0---max
* [___]
* [__/]
* [_/\]
* [/\_]
* [\__]
* [___]
**/
void set_color_for_offsets(uint16_t time_offset, uint16_t space_offset, uint8_t idx) {
float time_progress = (float)time_offset / BREATH_FIRE_TIME;
float space_progress = (float)space_offset / SPACE_OFFSET_MAX;
float progress = time_progress * 5.0 - space_progress;
if(progress > 1.0) {
progress -= 1.0;
progress /= 4.0;
progress = 1.0 - progress;
}
progress = fmax(0.0,progress);
progress *= progress; // squared!
float alpha = (time_progress + 0.1) * 7.0 - space_progress;
alpha = fmin(1.0, alpha*alpha);
LED_TYPE px[1] = {{0}};
sethsv((uint16_t)(fmod(time_progress * 1.5 + space_progress,1.0)*360), 255, (uint8_t)(progress*255),&px[0]);
led[idx].r = alpha * px[0].r + ( 1.0 - alpha) * shadowed_led[idx].r;
led[idx].g = alpha * px[0].g + ( 1.0 - alpha) * shadowed_led[idx].g;
led[idx].b = alpha * px[0].b + ( 1.0 - alpha) * shadowed_led[idx].b;
}
/**
* It's actually a rainbow: a fire curve didn't really look right.
* it's still cool, though!
*/
void rgb_mode_breath_fire(void) {
static uint16_t last_timer = 0;
if(!last_timer) last_timer = timer_read();
uint16_t this_timer = timer_read();
// too soon. don't spam updates
if(this_timer - last_timer < ANIMATION_STEP_INTERVAL) return;
uint16_t elapsed = this_timer - effect_start_timer;
last_timer = this_timer;
if(elapsed >= BREATH_FIRE_TIME) {
// complete
user_rgb_mode = FADE_BACK;
effect_start_timer = this_timer;
} else {
// linear fade
for(uint16_t i = 0; i < RGBLED_NUM; i++) {
uint16_t space_offset = ABSDIFF(i,POWER_KEY_OFFSET);
if(space_offset > SPACE_OFFSET_MAX) space_offset = RGBLED_NUM - space_offset;
set_color_for_offsets(elapsed, space_offset, i);
}
rgblight_set();
}
}
void rgb_mode_fade_back(void) {
static uint16_t last_timer = 0;
if(!last_timer) last_timer = timer_read();
uint16_t this_timer = timer_read();
// too soon. don't spam updates
if(this_timer - last_timer < ANIMATION_STEP_INTERVAL) return;
uint16_t elapsed = this_timer - effect_start_timer;
last_timer = this_timer;
float progress = (float)elapsed / FADE_BACK_TIME;
progress = fmin(1.0,progress);
for(uint8_t i = 0; i < RGBLED_NUM; i++) {
led[i].r = shadowed_led[i].r * progress;
led[i].g = shadowed_led[i].g * progress;
led[i].b = shadowed_led[i].b * progress;
}
rgblight_set();
if(elapsed >= FADE_BACK_TIME) user_rgb_mode = 0;
}
/** called when layer state or vstate has changed */
__attribute__ ((weak))
void set_state_leds(void) {
return;
}
void matrix_scan_user(void) {
static uint32_t last_layer = 0;
static uint32_t last_vstate = 0;
if(last_layer != layer_state || last_vstate != vstate) set_state_leds();
last_layer = layer_state;
last_vstate = vstate;
switch (user_rgb_mode) {
case BREATH_FIRE:
rgb_mode_breath_fire();
break;
case FADE_BACK:
rgb_mode_fade_back();
break;
}
matrix_scan_keymap();
}
#else
void start_firey_return(void) {}
#endif

@ -1,36 +0,0 @@
/* Copyright 2015-2017 Christon DeWan
*
* 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/>.
*/
#ifndef _fancy_lighting_h
#define _fancy_lighting_h
#ifdef RGBLIGHT_ENABLE
#include "xtonhasvim.h"
extern uint8_t user_rgb_mode;
extern LED_TYPE shadowed_led[];
#endif //RGBLIGHT_ENABLE
void start_firey_return(void);
enum xtonhasvim_rgbmodes {
BREATH_FIRE = 1,
FADE_BACK
};
#endif //_fancy_lighting_h

@ -1,10 +0,0 @@
# Xton has Vim!
Contains common code for Xton's vim emulation (vimulation?) layer.
Inspired/stolen from the `ergodox_ez/vim` keymap. Rewritten to be a more straightforward state machine and support more macros. Vim layers `_CMD` and `_EDIT` are designed to lay on top of an otherwise fully-functional layout. `_CMD` runs the entire vim state machine while `_EDIT` should lay across your base layer and mask off just the escape key.
Works via OSX text editing shortcuts, mainly MOD+arrow combinations. This has some limitations and only works on OSX.
The `_CMD` layer will temporarily disable itself while *CMD* or *ALT* are held down so that typical OSX shortcuts can be used without switching out of vim mode.

@ -1,2 +0,0 @@
SRC += xtonhasvim.c
SRC += fancylighting.c

@ -1,643 +0,0 @@
/* Copyright 2015-2017 Christon DeWan
*
* 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 "xtonhasvim.h"
#include "fancylighting.h"
/************************************
* helper foo
************************************/
#define PRESS(kc) register_code(kc)
#define RELEASE(kc) unregister_code(kc)
static void TAP(uint16_t keycode) {
PRESS(keycode);
RELEASE(keycode);
}
static void CMD(uint16_t keycode) {
PRESS(KC_LGUI);
TAP(keycode);
RELEASE(KC_LGUI);
}
static void CTRL(uint16_t keycode) {
PRESS(KC_LCTRL);
TAP(keycode);
RELEASE(KC_LCTRL);
}
static void SHIFT(uint16_t keycode) {
PRESS(KC_LSHIFT);
TAP(keycode);
RELEASE(KC_LSHIFT);
}
static void ALT(uint16_t keycode) {
PRESS(KC_LALT);
TAP(keycode);
RELEASE(KC_LALT);
}
uint16_t vstate = VIM_START;
static bool yank_was_lines = false;
static bool SHIFTED = false;
static uint32_t mod_override_layer_state = 0;
static uint16_t mod_override_triggering_key = 0;
static void edit(void) { vstate = VIM_START; layer_clear(); }
#define EDIT edit()
static void simple_movement(uint16_t keycode) {
switch(keycode) {
case VIM_B:
PRESS(KC_LALT);
SHIFT(KC_LEFT); // select to start of this word
RELEASE(KC_LALT);
break;
case VIM_E:
PRESS(KC_LALT);
SHIFT(KC_RIGHT); // select to end of this word
RELEASE(KC_LALT);
break;
case VIM_H:
SHIFT(KC_LEFT);
break;
case VIM_J:
CMD(KC_LEFT);
SHIFT(KC_DOWN);
SHIFT(KC_DOWN);
break;
case VIM_K:
CMD(KC_LEFT);
TAP(KC_DOWN);
SHIFT(KC_UP);
SHIFT(KC_UP);
break;
case VIM_L:
SHIFT(KC_RIGHT);
break;
case VIM_W:
PRESS(KC_LALT);
SHIFT(KC_RIGHT); // select to end of this word
SHIFT(KC_RIGHT); // select to end of next word
SHIFT(KC_LEFT); // select to start of next word
RELEASE(KC_LALT);
break;
}
}
static void comma_period(uint16_t keycode) {
switch (keycode) {
case VIM_COMMA:
if (SHIFTED) {
// indent
CMD(KC_LBRACKET);
} else {
// toggle comment
CMD(KC_SLASH);
}
break;
case VIM_PERIOD:
if (SHIFTED) {
// outdent
CMD(KC_RBRACKET);
}
break;
}
}
__attribute__ ((weak))
bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
return true;
}
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
/* keymap gets first whack */
if(!process_record_keymap(keycode, record)) return false;
/****** FIREY_RETURN *****/
if(record->event.pressed && keycode == FIREY_RETURN) {
start_firey_return();
TAP(KC_ENT);
}
/****** mod passthru *****/
if(record->event.pressed && layer_state_is(vim_cmd_layer()) && (IS_MOD(keycode) || keycode == LSFT(KC_LALT))) {
mod_override_layer_state = layer_state;
mod_override_triggering_key = keycode;
// TODO: change this to track key location instead
layer_clear();
return true; // let the event fall through...
}
if(mod_override_layer_state && !record->event.pressed && keycode == mod_override_triggering_key) {
layer_state_set(mod_override_layer_state);
mod_override_layer_state = 0;
mod_override_triggering_key = 0;
return true;
}
if (VIM_START <= keycode && keycode <= VIM_ESC) {
if(keycode == VIM_SHIFT) {
SHIFTED = record->event.pressed;
return false;
}
if (record->event.pressed) {
if(keycode == VIM_START) {
// entry from anywhere
layer_on(vim_cmd_layer());
vstate = VIM_START;
// reset state
yank_was_lines = false;
SHIFTED = false;
mod_override_layer_state = 0;
mod_override_triggering_key = 0;
return false;
}
switch(vstate) {
case VIM_START:
switch(keycode){
/*****************************
* ground state
*****************************/
case VIM_A:
if(SHIFTED) {
// CMD(KC_RIGHT);
CTRL(KC_E);
} else {
TAP(KC_RIGHT);
}
EDIT;
break;
case VIM_B:
PRESS(KC_LALT);
PRESS(KC_LEFT);
break;
case VIM_C:
if(SHIFTED) {
PRESS(KC_LSHIFT);
CMD(KC_RIGHT);
RELEASE(KC_LSHIFT);
CMD(KC_X);
yank_was_lines = false;
EDIT;
} else {
vstate = VIM_C;
}
break;
case VIM_D:
if(SHIFTED) {
CTRL(KC_K);
} else {
vstate = VIM_D;
}
break;
case VIM_E:
PRESS(KC_LALT);
PRESS(KC_RIGHT);
break;
case VIM_G:
if(SHIFTED) {
TAP(KC_END);
} else {
vstate = VIM_G;
}
break;
case VIM_H:
PRESS(KC_LEFT);
break;
case VIM_I:
if(SHIFTED){
CTRL(KC_A);
}
EDIT;
break;
case VIM_J:
if(SHIFTED) {
CMD(KC_RIGHT);
TAP(KC_DEL);
} else {
PRESS(KC_DOWN);
}
break;
case VIM_K:
PRESS(KC_UP);
break;
case VIM_L:
PRESS(KC_RIGHT);
break;
case VIM_O:
if(SHIFTED) {
CMD(KC_LEFT);
TAP(KC_ENTER);
TAP(KC_UP);
EDIT;
} else {
CMD(KC_RIGHT);
TAP(KC_ENTER);
EDIT;
}
break;
case VIM_P:
if(SHIFTED) {
CMD(KC_LEFT);
CMD(KC_V);
} else {
if(yank_was_lines) {
CMD(KC_RIGHT);
TAP(KC_RIGHT);
CMD(KC_V);
} else {
CMD(KC_V);
}
}
break;
case VIM_S:
// s for substitute?
if(SHIFTED) {
CMD(KC_LEFT);
PRESS(KC_LSHIFT);
CMD(KC_RIGHT);
RELEASE(KC_LSHIFT);
CMD(KC_X);
yank_was_lines = false;
EDIT;
} else {
SHIFT(KC_RIGHT);
CMD(KC_X);
yank_was_lines = false;
EDIT;
}
break;
case VIM_U:
if(SHIFTED) {
PRESS(KC_LSFT);
CMD(KC_Z);
RELEASE(KC_LSHIFT);
} else {
CMD(KC_Z);
}
break;
case VIM_V:
if(SHIFTED) {
CMD(KC_LEFT);
SHIFT(KC_DOWN);
vstate = VIM_VS;
} else {
vstate = VIM_V;
}
break;
case VIM_W:
PRESS(KC_LALT);
TAP(KC_RIGHT);
TAP(KC_RIGHT);
TAP(KC_LEFT);
RELEASE(KC_LALT);
break;
case VIM_X:
// SHIFT(KC_RIGHT);
// CMD(KC_X);
PRESS(KC_DEL);
break;
case VIM_Y:
if(SHIFTED) {
CMD(KC_LEFT);
SHIFT(KC_DOWN);
CMD(KC_C);
TAP(KC_RIGHT);
yank_was_lines = true;
} else {
vstate = VIM_Y;
}
break;
case VIM_COMMA:
case VIM_PERIOD:
comma_period(keycode);
break;
}
break;
case VIM_C:
/*****************************
* c- ...for change. I never use this...
*****************************/
switch(keycode) {
case VIM_B:
case VIM_E:
case VIM_H:
case VIM_J:
case VIM_K:
case VIM_L:
case VIM_W:
simple_movement(keycode);
CMD(KC_X);
yank_was_lines = false;
EDIT;
break;
case VIM_C:
CMD(KC_LEFT);
PRESS(KC_LSHIFT);
CMD(KC_RIGHT);
RELEASE(KC_LSHIFT);
CMD(KC_X);
yank_was_lines = false;
EDIT;
break;
case VIM_I:
vstate = VIM_CI;
break;
default:
vstate = VIM_START;
break;
}
break;
case VIM_CI:
/*****************************
* ci- ...change inner word
*****************************/
switch(keycode) {
case VIM_W:
ALT(KC_LEFT);
PRESS(KC_LSHIFT);
ALT(KC_RIGHT);
RELEASE(KC_LSHIFT);
CMD(KC_X);
yank_was_lines = false;
EDIT;
default:
vstate = VIM_START;
break;
}
break;
case VIM_D:
/*****************************
* d- ...delete stuff
*****************************/
switch(keycode) {
case VIM_B:
case VIM_E:
case VIM_H:
case VIM_J:
case VIM_K:
case VIM_L:
case VIM_W:
simple_movement(keycode);
CMD(KC_X);
yank_was_lines = false;
vstate = VIM_START;
break;
case VIM_D:
CMD(KC_LEFT);
SHIFT(KC_DOWN);
CMD(KC_X);
yank_was_lines = true;
vstate = VIM_START;
break;
case VIM_I:
vstate = VIM_DI;
break;
default:
vstate = VIM_START;
break;
}
break;
case VIM_DI:
/*****************************
* ci- ...delete a word... FROM THE INSIDE!
*****************************/
switch(keycode) {
case VIM_W:
ALT(KC_LEFT);
PRESS(KC_LSHIFT);
ALT(KC_RIGHT);
RELEASE(KC_LSHIFT);
CMD(KC_X);
yank_was_lines = false;
vstate = VIM_START;
default:
vstate = VIM_START;
break;
}
break;
case VIM_V:
/*****************************
* visual!
*****************************/
switch(keycode) {
case VIM_D:
case VIM_X:
CMD(KC_X);
yank_was_lines = false;
vstate = VIM_START;
break;
case VIM_B:
PRESS(KC_LALT);
PRESS(KC_LSHIFT);
PRESS(KC_LEFT);
// leave open for key repeat
break;
case VIM_E:
PRESS(KC_LALT);
PRESS(KC_LSHIFT);
PRESS(KC_RIGHT);
// leave open for key repeat
break;
case VIM_H:
PRESS(KC_LSHIFT);
PRESS(KC_LEFT);
break;
case VIM_I:
vstate = VIM_VI;
break;
case VIM_J:
PRESS(KC_LSHIFT);
PRESS(KC_DOWN);
break;
case VIM_K:
PRESS(KC_LSHIFT);
PRESS(KC_UP);
break;
case VIM_L:
PRESS(KC_LSHIFT);
PRESS(KC_RIGHT);
break;
case VIM_W:
PRESS(KC_LALT);
SHIFT(KC_RIGHT); // select to end of this word
SHIFT(KC_RIGHT); // select to end of next word
SHIFT(KC_LEFT); // select to start of next word
RELEASE(KC_LALT);
break;
case VIM_P:
CMD(KC_V);
vstate = VIM_START;
break;
case VIM_Y:
CMD(KC_C);
TAP(KC_RIGHT);
yank_was_lines = false;
vstate = VIM_START;
break;
case VIM_V:
case VIM_ESC:
TAP(KC_RIGHT);
vstate = VIM_START;
break;
case VIM_COMMA:
case VIM_PERIOD:
comma_period(keycode);
break;
default:
// do nothing
break;
}
break;
case VIM_VI:
/*****************************
* vi- ...select a word... FROM THE INSIDE!
*****************************/
switch(keycode) {
case VIM_W:
ALT(KC_LEFT);
PRESS(KC_LSHIFT);
ALT(KC_RIGHT);
RELEASE(KC_LSHIFT);
vstate = VIM_V;
default:
// ignore
vstate = VIM_V;
break;
}
break;
case VIM_VS:
/*****************************
* visual line
*****************************/
switch(keycode) {
case VIM_D:
case VIM_X:
CMD(KC_X);
yank_was_lines = true;
vstate = VIM_START;
break;
case VIM_J:
PRESS(KC_LSHIFT);
PRESS(KC_DOWN);
break;
case VIM_K:
PRESS(KC_LSHIFT);
PRESS(KC_UP);
break;
case VIM_Y:
CMD(KC_C);
yank_was_lines = true;
TAP(KC_RIGHT);
vstate = VIM_START;
break;
case VIM_P:
CMD(KC_V);
vstate = VIM_START;
break;
case VIM_V:
case VIM_ESC:
TAP(KC_RIGHT);
vstate = VIM_START;
break;
case VIM_COMMA:
case VIM_PERIOD:
comma_period(keycode);
break;
default:
// do nothing
break;
}
break;
case VIM_G:
/*****************************
* gg, and a grab-bag of other macros i find useful
*****************************/
switch(keycode) {
case VIM_G:
TAP(KC_HOME);
break;
// codes b
case VIM_H:
CTRL(KC_A);
break;
case VIM_J:
PRESS(KC_PGDN);
break;
case VIM_K:
PRESS(KC_PGUP);
break;
case VIM_L:
CTRL(KC_E);
break;
default:
// do nothing
break;
}
vstate = VIM_START;
break;
case VIM_Y:
/*****************************
* yoink!
*****************************/
switch(keycode) {
case VIM_B:
case VIM_E:
case VIM_H:
case VIM_J:
case VIM_K:
case VIM_L:
case VIM_W:
simple_movement(keycode);
CMD(KC_C);
TAP(KC_RIGHT);
yank_was_lines = false;
break;
case VIM_Y:
CMD(KC_LEFT);
SHIFT(KC_DOWN);
CMD(KC_C);
TAP(KC_RIGHT);
yank_was_lines = true;
break;
default:
// NOTHING
break;
}
vstate = VIM_START;
break;
}
} else {
/************************
* key release events
************************/
clear_keyboard();
}
return false;
} else {
return true;
}
}

@ -1,65 +0,0 @@
/* Copyright 2015-2017 Christon DeWan
*
* 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/>.
*/
#ifndef USERSPACE
#define USERSPACE
#include QMK_KEYBOARD_H
#include "action_layer.h"
#define X_____X KC_NO
enum xtonhasvim_keycodes {
// 20: give keyboard-specific codes some room
FIREY_RETURN = SAFE_RANGE + 20, // kick off special effects
VIM_START, // bookend for vim states
VIM_A,
VIM_B,
VIM_C,
VIM_CI,
VIM_D,
VIM_DI,
VIM_E,
VIM_H,
VIM_G,
VIM_I,
VIM_J,
VIM_K,
VIM_L,
VIM_O,
VIM_P,
VIM_S,
VIM_U,
VIM_V,
VIM_VS, // visual-line
VIM_VI,
VIM_W,
VIM_X,
VIM_Y,
VIM_PERIOD, // to support indent/outdent
VIM_COMMA, // and toggle comments
VIM_SHIFT, // avoid side-effect of supporting real shift.
VIM_ESC, // bookend
VIM_SAFE_RANGE // start other keycodes here.
};
// NOTE: YOU MUST DEFINE THIS
extern uint8_t vim_cmd_layer(void);
extern uint16_t vstate;
#endif

@ -1,32 +0,0 @@
#ifndef USERSPACE_CONFIG_H
#define USERSPACE_CONFIG_H
#ifndef QMK_KEYS_PER_SCAN
#define QMK_KEYS_PER_SCAN 4
#endif // !QMK_KEYS_PER_SCAN
// this makes it possible to do rolling combos (zx) with keys that
// convert to other keys on hold (z becomes ctrl when you hold it,
// and when this option isn't enabled, z rapidly followed by x
// actually sends Ctrl-x. That's bad.)
#define IGNORE_MOD_TAP_INTERRUPT
#undef PERMISSIVE_HOLD
#define STRICT_LAYER_RELEASE
#define FORCE_NKRO
#ifndef TAPPING_TOGGLE
#define TAPPING_TOGGLE 1
#endif
#ifdef TAPPING_TERM
#undef TAPPING_TERM
#endif
#define TAPPING_TERM 95
// Disable action_get_macro and fn_actions, since we don't use these
// and it saves on space in the firmware.
#define NO_ACTION_MACRO
#define NO_ACTION_FUNCTION
#endif

@ -1,189 +0,0 @@
#include "lights.h"
static bool active_key_pos[50] = {};
static uint8_t led_dim = 0;
volatile led_key rbw_led_keys[RBW] = {
[RBW_LCTL] = {DEFAULT, 21, true}, [RBW_LCAP] = {DEFAULT, 24, false},
[RBW_LSPR] = {DEFAULT, 23, true}, [RBW_RCTL] = {DEFAULT, 48, true},
[RBW_RCAP] = {DEFAULT, 45, false}, [RBW_RALT] = {DEFAULT, 46, true},
[RBW_SCRL] = {DEFAULT, 42, true}};
/* Pressed led color. */
const uint32_t _PC[3] = {0xFF, 0x00, 0x00};
/* Layer color. */
const uint8_t _LC[5][3] = {[_BL] = {0x00, 0x00, 0x00},
[_UL] = {0x00, 0x00, 0xFF},
[_VL] = {0xFF, 0xFF, 0x00},
[_DL] = {0x00, 0xFF, 0x00},
[_AL] = {0xFF, 0x00, 0x00}};
/* Color table by sine wave */
const uint8_t _LIGHTS[360] = {
0, 0, 0, 0, 0, 1, 1, 2, 2, 3, 4, 5, 6, 7, 8,
11, 12, 9, 13, 15, 17, 18, 20, 22, 24, 26, 28, 30, 32, 35,
37, 39, 42, 44, 47, 49, 52, 55, 58, 60, 63, 66, 69, 72, 75,
78, 81, 85, 88, 91, 94, 97, 101, 104, 107, 111, 114, 117, 121, 124,
127, 131, 134, 137, 141, 144, 147, 150, 154, 157, 160, 163, 167, 170, 173,
176, 179, 182, 185, 188, 191, 194, 197, 200, 202, 205, 208, 210, 213, 215,
217, 220, 222, 224, 226, 229, 231, 232, 234, 236, 238, 239, 241, 242, 244,
245, 246, 248, 249, 250, 251, 251, 252, 253, 253, 254, 254, 255, 255, 255,
255, 255, 255, 255, 254, 254, 253, 253, 252, 251, 251, 250, 249, 248, 246,
245, 244, 242, 241, 239, 238, 236, 234, 232, 231, 229, 226, 224, 222, 220,
217, 215, 213, 210, 208, 205, 202, 200, 197, 194, 191, 188, 185, 182, 179,
176, 173, 170, 167, 163, 160, 157, 154, 150, 147, 144, 141, 137, 134, 131,
127, 124, 121, 117, 114, 111, 107, 104, 101, 97, 94, 91, 88, 85, 81,
78, 75, 72, 69, 66, 63, 60, 58, 55, 52, 49, 47, 44, 42, 39,
37, 35, 32, 30, 28, 26, 24, 22, 20, 18, 17, 15, 13, 12, 11,
9, 8, 7, 6, 5, 4, 3, 2, 2, 1, 1, 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, 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, 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};
void set_key_led(keyrecord_t *record, uint8_t lyr) {
static uint8_t base = 5;
uint8_t r = record->event.key.row;
uint8_t c = record->event.key.col;
uint8_t pos;
// This was the result of my soldering.
// Lesson of the day: always check.
if (r < 5) {
pos = r % 2 == 0 ? r * base + c : r * base + (base - (c + 1));
} else {
pos = r % 2 == 0 ? r * base + (base - (c + 1)) : r * base + c;
}
if (record->event.pressed) {
active_key_pos[pos] = true;
SET_LED_RGB(_PC[0], _PC[1], _PC[2], led_dim, pos);
} else {
active_key_pos[pos] = false;
SET_LED_RGB(_LC[lyr][0], _LC[lyr][1], _LC[lyr][2], led_dim, pos);
}
}
/* Fix for unknown reason after testin flash the eeprom handedness,
the leds will ligth up after boot.
This should be call in the set layer led.*/
bool is_first_run(void) {
static uint8_t run = 0;
if (run == 0) {
run++;
return true;
} else {
return false;
}
}
bool set_layer_led(uint8_t lyr) {
static uint8_t p_lyr = 0; // Previous layer.
static uint8_t p_dim = 0; // Previous dim.
if (p_lyr == lyr && p_dim == led_dim && !is_first_run()) {
return false;
}
p_lyr = lyr;
p_dim = led_dim;
const uint8_t r = _LC[lyr][0];
const uint8_t g = _LC[lyr][1];
const uint8_t b = _LC[lyr][2];
const uint8_t d = (p_lyr == _VL && p_dim < 1) ? 1 : p_dim;
for (uint8_t i = 0; i < RGBLED_NUM; i++) {
SET_LED_RGB(r, g, b, d, i);
}
return true;
}
bool rainbow_loop(uint8_t lyr) {
static uint16_t last_timer = 0;
static uint16_t i = 0;
static uint8_t r, g, b, pos;
if (timer_elapsed(last_timer) < 8) {
return false;
}
if (i >= 360) {
i = 0;
}
last_timer = timer_read();
r = _LIGHTS[(i + 120) % 360];
g = _LIGHTS[i];
b = _LIGHTS[(i + 240) % 360];
i++;
bool set_rbw = false;
for (uint8_t j = 0; j < RBW; j++) {
pos = rbw_led_keys[j].pos;
switch (rbw_led_keys[j].status) {
case ENABLED:
if (!active_key_pos[pos] || rbw_led_keys[j].forced) {
SET_LED_RGB(r, g, b, led_dim, pos);
set_rbw = true;
}
break;
case DISABLED:
if (!active_key_pos[pos] || rbw_led_keys[j].forced) {
SET_LED_RGB(_LC[lyr][0], _LC[lyr][1], _LC[lyr][2], led_dim, pos);
set_rbw = true;
}
rbw_led_keys[j].status = DEFAULT;
break;
default:
break;
}
}
return set_rbw;
}
bool led_brightness(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case RGUP:
if (record->event.pressed && led_dim > 0) {
led_dim--;
eeprom_write_byte(EECONFIG_LED_DIM_LVL, led_dim);
}
return true;
break;
case RGDWN:
if (record->event.pressed && led_dim < 8) {
led_dim++;
eeprom_write_byte(EECONFIG_LED_DIM_LVL, led_dim);
}
return true;
break;
default:
return false;
break;
}
}
void eeprom_read_led_dim_lvl(void) {
led_dim = eeprom_read_byte(EECONFIG_LED_DIM_LVL);
if (led_dim > 8 || led_dim < 0) {
led_dim = 0;
eeprom_write_byte(EECONFIG_LED_DIM_LVL, led_dim);
}
}

@ -1,45 +0,0 @@
#ifndef LIGHTS_H
#define LIGHTS_H
#include "eeprom.h"
#include "tap_dance.h"
#include "zer09.h"
/* Will hold the RGB brightness level */
#define EECONFIG_LED_DIM_LVL (uint8_t *)15
#define SET_LED_RGB(r, g, b, led_dim, pos) \
setrgb(r >> led_dim, g >> led_dim, b >> led_dim, (LED_TYPE *)&led[pos])
typedef enum {
DEFAULT,
ENABLED,
DISABLED,
} led_status;
typedef struct {
led_status status;
uint8_t pos;
bool forced;
} led_key;
enum rbw_keys {
RBW_LCTL,
RBW_LCAP,
RBW_LSPR,
RBW_RCTL,
RBW_RCAP,
RBW_RALT,
RBW_SCRL,
RBW
};
extern volatile led_key rbw_led_keys[RBW];
void set_key_led(keyrecord_t *record, uint8_t lyr);
bool set_layer_led(uint8_t lyr);
bool rainbow_loop(uint8_t lyr);
bool led_brightness(uint16_t keycode, keyrecord_t *record);
void eeprom_read_led_dim_lvl(void);
#endif

@ -1,2 +0,0 @@
SRC += zer09.c tap_dance.c lights.c
EXTRAFLAGS += -flto

@ -1,203 +0,0 @@
#include "tap_dance.h"
#include "lights.h"
qk_tap_dance_action_t tap_dance_actions[] = {
[DA_LCTL] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_lctl_finished,
dance_lctl_reset),
[DA_LSPR] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_lspr_finished,
dance_lspr_reset),
[DA_RCTL] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_rctl_finished,
dance_rctl_reset),
[DA_RALT] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_ralt_finished,
dance_ralt_reset),
[DA_UPLY] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_uply_finished,
dance_uply_reset),
[DA_DWLY] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_dwly_finished,
dance_dwly_reset),
};
volatile uint8_t active_layer = _BL;
volatile uint8_t gm_layer_act = false;
static tap upltap_state = {.state = 0};
static tap dwltap_state = {.state = 0};
static tap lsprtap_state = {.state = 0};
static tap ralttap_state = {.state = 0};
void layer_switcher_tap(uint8_t new_layer) {
if (gm_layer_act == true) {
layer_off(active_layer);
if (new_layer == _BL) {
layer_on(_GM);
active_layer = _GM;
} else {
layer_on(new_layer);
active_layer = new_layer;
}
} else {
layer_off(active_layer);
layer_on(new_layer);
active_layer = new_layer;
}
}
int cur_dance(qk_tap_dance_state_t *state) {
switch (state->count) {
case 1:
return state->pressed == 0 ? SINGLE_TAP : SINGLE_HOLD;
case 2:
return state->pressed == 0 ? DOUBLE_TAP : DOUBLE_HOLD;
case 3:
return state->pressed == 0 ? TRIPLE_TAP : TRIPLE_HOLD;
default:
return state->pressed == 0 ? DEFAULT_TAP : DEFAULT_HOLD;
}
}
void dance_lctl_finished(qk_tap_dance_state_t *state, void *user_data) {
rbw_led_keys[RBW_LCTL].status = ENABLED;
register_code(KC_LCTRL);
};
void dance_lctl_reset(qk_tap_dance_state_t *state, void *user_data) {
unregister_code(KC_LCTRL);
rbw_led_keys[RBW_LCTL].status = DISABLED;
};
void dance_lspr_finished(qk_tap_dance_state_t *state, void *user_data) {
lsprtap_state.state = cur_dance(state);
switch (lsprtap_state.state) {
case DOUBLE_HOLD:
rbw_led_keys[RBW_LSPR].status = ENABLED;
register_code(KC_LALT);
break;
default:
register_code(KC_LGUI);
break;
}
};
void dance_lspr_reset(qk_tap_dance_state_t *state, void *user_data) {
switch (lsprtap_state.state) {
case DOUBLE_HOLD:
unregister_code(KC_LALT);
rbw_led_keys[RBW_LSPR].status = DISABLED;
break;
default:
unregister_code(KC_LGUI);
break;
}
};
void dance_rctl_finished(qk_tap_dance_state_t *state, void *user_data) {
rbw_led_keys[RBW_RCTL].status = ENABLED;
register_code(KC_RCTRL);
};
void dance_rctl_reset(qk_tap_dance_state_t *state, void *user_data) {
unregister_code(KC_RCTRL);
rbw_led_keys[RBW_RCTL].status = DISABLED;
};
void dance_ralt_finished(qk_tap_dance_state_t *state, void *user_data) {
ralttap_state.state = cur_dance(state);
switch (ralttap_state.state) {
case DOUBLE_HOLD:
rbw_led_keys[RBW_RALT].status = ENABLED;
unregister_code(KC_LGUI);
break;
default:
register_code(KC_RALT);
break;
}
};
void dance_ralt_reset(qk_tap_dance_state_t *state, void *user_data) {
switch (ralttap_state.state) {
case DOUBLE_HOLD:
unregister_code(KC_RGUI);
rbw_led_keys[RBW_RALT].status = DISABLED;
break;
default:
unregister_code(KC_RALT);
break;
}
};
void dance_uply_finished(qk_tap_dance_state_t *state, void *user_data) {
upltap_state.state = cur_dance(state);
switch (upltap_state.state) {
case SINGLE_TAP:
if (active_layer == _UL) {
layer_switcher_tap(_BL);
} else {
layer_switcher_tap(_UL);
}
break;
case SINGLE_HOLD:
layer_switcher_tap(_UL);
break;
default:
layer_switcher_tap(_BL);
break;
}
}
void dance_uply_reset(qk_tap_dance_state_t *state, void *user_data) {
switch (upltap_state.state) {
case SINGLE_TAP:
break;
case SINGLE_HOLD:
default:
layer_switcher_tap(_BL);
break;
}
upltap_state.state = 0;
}
void dance_dwly_finished(qk_tap_dance_state_t *state, void *user_data) {
dwltap_state.state = cur_dance(state);
switch (dwltap_state.state) {
case SINGLE_TAP:
if (active_layer == _DL) {
layer_switcher_tap(_BL);
} else {
layer_switcher_tap(_DL);
}
break;
case SINGLE_HOLD:
layer_switcher_tap(_DL);
break;
case DOUBLE_HOLD:
layer_switcher_tap(_AL);
break;
case TRIPLE_TAP:
if (gm_layer_act == true) {
gm_layer_act = false;
layer_switcher_tap(_BL);
} else {
gm_layer_act = true;
layer_switcher_tap(_GM);
}
default:
layer_switcher_tap(_BL);
break;
}
}
void dance_dwly_reset(qk_tap_dance_state_t *state, void *user_data) {
switch (dwltap_state.state) {
case SINGLE_TAP:
break;
case SINGLE_HOLD:
case DOUBLE_HOLD:
case TRIPLE_TAP:
default:
layer_switcher_tap(_BL);
break;
}
dwltap_state.state = 0;
}

@ -1,55 +0,0 @@
#ifndef TAP_DANCE_H
#define TAP_DANCE_H
#include "zer09.h"
typedef struct {
int state;
} tap;
enum {
DEFAULT_TAP,
DEFAULT_HOLD,
SINGLE_TAP,
SINGLE_HOLD,
DOUBLE_TAP,
DOUBLE_HOLD,
TRIPLE_TAP,
TRIPLE_HOLD
};
enum {
DA_SAFE_START,
DA_LCTL,
DA_LSPR,
DA_RCTL,
DA_RALT,
DA_UPLY,
DA_DWLY,
DA_SAFE_END
};
extern volatile uint8_t active_layer;
void layer_switcher_tap(uint8_t);
int cur_dance(qk_tap_dance_state_t *);
void dance_lctl_finished(qk_tap_dance_state_t *, void *);
void dance_lctl_reset(qk_tap_dance_state_t *, void *);
void dance_lspr_finished(qk_tap_dance_state_t *, void *);
void dance_lspr_reset(qk_tap_dance_state_t *, void *);
void dance_rctl_finished(qk_tap_dance_state_t *, void *);
void dance_rctl_reset(qk_tap_dance_state_t *, void *);
void dance_ralt_finished(qk_tap_dance_state_t *, void *);
void dance_ralt_reset(qk_tap_dance_state_t *, void *);
void dance_uply_finished(qk_tap_dance_state_t *, void *);
void dance_uply_reset(qk_tap_dance_state_t *, void *);
void dance_dwly_finished(qk_tap_dance_state_t *, void *);
void dance_dwly_reset(qk_tap_dance_state_t *, void *);
#endif

@ -1,88 +0,0 @@
#include "zer09.h"
#include "lights.h"
#include "tap_dance.h"
__attribute__((weak)) void matrix_init_keymap(void) {}
__attribute__((weak)) void matrix_scan_keymap(void) {}
__attribute__((weak)) bool process_record_keymap(uint16_t keycode,
keyrecord_t *record) {
return true;
}
__attribute__((weak)) void led_set_keymap(uint8_t usb_led) {}
static uint8_t c_lyr = 0; // current layer.
bool shifted_layer(void) {
static bool is_shifted = false;
if (c_lyr == _VL) {
if (!is_shifted) {
register_code(KC_LSFT);
is_shifted = true;
return true;
}
} else {
if (is_shifted) {
unregister_code(KC_LSFT);
is_shifted = false;
return true;
}
}
return false;
}
void matrix_init_user(void) {
eeprom_read_led_dim_lvl();
matrix_init_keymap();
}
void matrix_scan_user(void) {
static uint8_t is_leds_changes = 1;
c_lyr = biton32(layer_state);
is_leds_changes = is_leds_changes << set_layer_led(c_lyr);
is_leds_changes = is_leds_changes << shifted_layer();
is_leds_changes = is_leds_changes << rainbow_loop(c_lyr);
if (is_leds_changes > 1) {
rgblight_set();
is_leds_changes = 1;
}
matrix_scan_keymap();
}
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
set_key_led(record, c_lyr);
if (led_brightness(keycode, record)) {
rgblight_set();
return false;
}
rgblight_set();
return process_record_keymap(keycode, record);
}
void led_set_user(uint8_t usb_led) {
if (usb_led & (1 << USB_LED_CAPS_LOCK)) {
rbw_led_keys[RBW_LCAP].status = ENABLED;
rbw_led_keys[RBW_RCAP].status = ENABLED;
} else {
rbw_led_keys[RBW_LCAP].status = DISABLED;
rbw_led_keys[RBW_RCAP].status = DISABLED;
}
if (usb_led & (1 << USB_LED_SCROLL_LOCK)) {
rbw_led_keys[RBW_SCRL].status = ENABLED;
} else {
rbw_led_keys[RBW_SCRL].status = DISABLED;
}
led_set_keymap(usb_led);
}

@ -1,25 +0,0 @@
#ifndef USERSPACE
#define USERSPACE
#include "quantum.h"
enum custom_keycodes {
CK_SAFE = SAFE_RANGE,
RGUP,
RGDWN,
YREG,
NEW_SAFE_RANGE
};
#define KC_RGUP RGUP
#define KC_RGDWN RGDWN
#define KC_YREG YREG
#define _BL 0 // The base layer
#define _UL 1 // The up layer
#define _DL 2 // The down layer
#define _VL 3 // The shifted up layer
#define _AL 4 // The assorted layer
#define _GM 5
#endif
Loading…
Cancel
Save