Keymap: adding my personal userspace to QMK master (#3605)

* Adding my personal planck keymap

* Adding readme.md to my keymap

* Create my userspace

add users/ishtob/

* Moved macros off keymap

macros now exsists in my userspace, moved them off keyboard specific keymaps

* Create my userspace

add users/ishtob/

* rebase from main QMK repo
This commit is contained in:
ishtob 2018-08-10 11:30:21 -04:00 committed by Drashna Jaelre
parent feb5e4aaeb
commit fd0bd29a0a
10 changed files with 349 additions and 206 deletions

View file

@ -1,60 +1,36 @@
#ifndef CONFIG_USER_H
#define CONFIG_USER_H
#include "../../config.h" #ifndef USERSPACE_CONFIG_H
#define USERSPACE_CONFIG_H
#define LEADER_TIMEOUT 300
//#define BACKLIGHT_BREATHING
#define PREVENT_STUCK_MODIFIERS
#ifdef AUDIO_ENABLE
// #define STARTUP_SONG SONG(E1M1_DOOM)
// #define GOODBYE_SONG SONG(SONIC_RING)
/* #define DEFAULT_LAYER_SONGS { SONG(QWERTY_SOUND), \
SONG(COLEMAK_SOUND), \
SONG(DVORAK_SOUND), \
}
*/
//audio clicky //audio clicky
#define AUDIO_CLICKY #define AUDIO_CLICKY
// to enable clicky on startup // to enable clicky on startup
//#define AUDIO_CLICKY_ON //#define AUDIO_CLICKY_ON
#define AUDIO_CLICKY_FREQ_RANDOMNESS 1.0f #define AUDIO_CLICKY_FREQ_RANDOMNESS 1.0f
/* ws2812 RGB LED
#define RGB_DI_PIN B5 #endif
#define RGBLIGHT_ANIMATIONS
#define RGBLED_NUM 8 // Number of LEDs #define FORCE_NKRO
#define RGBLIGHT_HUE_STEP 10
#define RGBLIGHT_SAT_STEP 17 #define LEADER_TIMEOUT 300
*/ #define PREVENT_STUCK_MODIFIERS
#undef PLANCK_MIT_LAYOUT
#undef DEBOUNCE #undef DEBOUNCE
#define DEBOUNCE 0 #define DEBOUNCE 0
//rgb-reactive
#define RGB_MATRIX_KEYPRESSES
#define EECONFIG_RGB_MATRIX (uint32_t *)16
//skip usb startup check //skip usb startup check
//#define NO_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
#endif #endif

View file

@ -1,7 +1,6 @@
// This is the canonical layout file for the Quantum project. If you want to add another keyboard, // This is the canonical layout file for the Quantum project. If you want to add another keyboard,
// this is the style you want to emulate. // this is the style you want to emulate.
#pragma message "You may need to add LAYOUT_planck_grid to your keymap layers - see default for an example"
#include "planck.h" #include "planck.h"
#include "action_layer.h" #include "action_layer.h"
// #include "dynamic_macro.h" // #include "dynamic_macro.h"
@ -9,65 +8,10 @@
#include "audio.h" #include "audio.h"
#endif #endif
#include "eeconfig.h" #include "eeconfig.h"
#include "ishtob.h"
//Macro definition
#if (__has_include("macros_private.h") && !defined(SECRETS))
#include "macros_private.h"
#else
#include "macros_public.h"
#endif
extern keymap_config_t keymap_config; extern keymap_config_t keymap_config;
// 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
enum planck_keycodes {
QWERTY = SAFE_RANGE,
COLEMAK,
DVORAK,
PLOVER,
LOWER,
RAISE,
BACKLIT,
EXT_PLV,
DFU,
};
// Fillers to make layering more clear
#define _______ KC_TRNS
#define XXXXXXX KC_NO
// 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
#define P_CITRIX M(KC_CITRIX) // My login macros
#define P_MPASS M(KC_MPASS)
#define P_META M(KC_META)
#define O_DAYRN M(KC_DAYRN) // My work macros
#define O_AUTODC M(KC_AUTODC)
#define O_RTQ6H M(KC_RTQ6H)
#define M_EMAIL M(KC_EMAIL) // My personal email
#define M_EMAIL2 M(KC_EMAIL2) // My work email
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Qwerty /* Qwerty
,-----------------------------------------------------------------------------------. ,-----------------------------------------------------------------------------------.
@ -281,7 +225,7 @@ void persistant_default_layer_set(uint16_t default_layer) {
void tap(uint16_t keycode){ register_code(keycode); unregister_code(keycode); }; void tap(uint16_t keycode){ register_code(keycode); unregister_code(keycode); };
bool process_record_user(uint16_t keycode, keyrecord_t *record) { bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
switch (keycode) { switch (keycode) {
case QWERTY: case QWERTY:
if (record->event.pressed) { if (record->event.pressed) {
@ -369,36 +313,11 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
} }
return false; return false;
break; break;
case DFU:
if (record->event.pressed) {
clear_keyboard();
#if defined(MIDI_ENABLE) && defined(MIDI_BASIC)
process_midi_all_notes_off();
#endif
#if defined(AUDIO_ENABLE) && !defined(NO_MUSIC_MODE)
music_all_notes_off();
uint16_t timer_start = timer_read();
PLAY_NOTE_ARRAY(tone_goodbye, false, 0);
shutdown_user();
while(timer_elapsed(timer_start) < 250)
wait_ms(1);
stop_all_notes();
#else
wait_ms(250);
#endif
// this is also done later in bootloader.c - not sure if it's neccesary here
#ifdef BOOTLOADER_CATERINA
*(uint16_t *)0x0800 = 0x7777; // these two are a-star-specific
#endif
bootloader_jump();
}
return false;
break;
} }
return true; return true;
} }
void matrix_init_user(void) { void matrix_init_keymap(void) {
#ifdef AUDIO_ENABLE #ifdef AUDIO_ENABLE
startup_user(); startup_user();
#endif #endif
@ -432,4 +351,3 @@ void music_scale_user(void)
#endif #endif

View file

@ -1,57 +0,0 @@
enum macro_keycodes {
KC_CITRIX,
KC_MPASS,
KC_META,
KC_RTQ6H,
KC_DAYRN,
KC_3DRN,
KC_AUTODC,
KC_EMAIL,
KC_EMAIL2
};
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
if (!eeconfig_is_enabled()) {
eeconfig_init();
}
switch (id) {
//my login macros
case KC_CITRIX:
if (record->event.pressed){
return MACRO (I(1), T(1), END);
}
case KC_MPASS:
if (record->event.pressed){
return MACRO (I(1), T(1), END);
}
case KC_META:
if (record->event.pressed){
return MACRO (I(1), T(1), END);
}
//my work macros
case KC_RTQ6H:
if (record->event.pressed){
return MACRO (I(1), T(TAB), T(0), T (3), T(0), T(0), T(TAB), T(DOWN), T(TAB), T(0), T (9), T(0), T(0), T(TAB), T(DOWN), T(TAB), T(1), T (5), T(0), T(0), T(TAB), T(DOWN), T(TAB), T(2), T (1), T(0), T(0), T(TAB), D(LALT), T(O), U(LALT), END);
}
case KC_AUTODC:
if (record->event.pressed){
return MACRO (I(1), D(LALT), T(V), U(LALT), T(TAB), T(TAB), T(TAB), T(TAB), T(TAB), T(TAB), T(TAB), T(TAB), T(TAB), T(T), T(TAB),T(N), D(LALT), T(S), U(LALT), END);
}
case KC_DAYRN:
if (record->event.pressed){
return MACRO (I(1), T(TAB), T(TAB), T(TAB), T(TAB), T(TAB), T(1), D(LALT), T(S), U(LALT), END);
}
//Ops macros
case KC_EMAIL:
if (record->event.pressed){
return MACRO (I(1), T(1), END); }
case KC_EMAIL2:
if (record->event.pressed){
return MACRO (I(1), T(1), END);
}
}
return MACRO_NONE;
}

View file

@ -2,7 +2,7 @@
#Ishtob's personal planck layout #Ishtob's personal planck layout
THis is the default layout used with my planck light, though the rest of the keymap could also be used for the full sized planck or let's split. This is the default layout used with my planck light, though the rest of the keymap could also be used for the full sized planck or let's split.
Main difference with the default layout: Main difference with the default layout:
@ -14,8 +14,3 @@ Main difference with the default layout:
* Capslock is on the base layer as it is used quite often with my work's software * Capslock is on the base layer as it is used quite often with my work's software
* Numbers layer on lower is positioned to resemble a numpad with 5 taking the location of J for the homing bump and easier entry * Numbers layer on lower is positioned to resemble a numpad with 5 taking the location of J for the homing bump and easier entry
# Secret Macros
`macros_public.h` contains a list of macros that can be replaced with passwords or other sensative private macros. `macros_private.h` will be used if it exsists in the folder during compiling and will ignore `macros_public.h` The private macros can be excluded from git commits by adding it to the exclusion list.

View file

@ -1,7 +1,3 @@
ifeq ($(strip $(SECRETS)),yes)
OPT_DEF += -DSECRETS
endif
# Build Options # Build Options
# comment out to disable the options. # comment out to disable the options.
# #

76
users/ishtob/config.h Executable file
View file

@ -0,0 +1,76 @@
#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 PREVENT_STUCK_MODIFIERS
//#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

69
users/ishtob/ishtob.c Normal file
View file

@ -0,0 +1,69 @@
/*
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);
}

76
users/ishtob/ishtob.h Normal file
View file

@ -0,0 +1,76 @@
#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)
// Fillers to make layering more clear
#define _______ KC_TRNS
#define XXXXXXX KC_NO
// 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
};
*/
#endif // !USERSPACE

87
users/ishtob/readme.md Normal file
View file

@ -0,0 +1,87 @@
# 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.

7
users/ishtob/rules.mk Executable file
View file

@ -0,0 +1,7 @@
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