aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--keyboards/chimera_ortho/keymaps/gordon/keymap.c389
-rw-r--r--keyboards/ergodox_infinity/keymaps/gordon/keymap.c315
-rw-r--r--users/gordon/gordon.c275
-rw-r--r--users/gordon/gordon.h157
-rw-r--r--users/gordon/readme.md14
-rw-r--r--users/gordon/rules.mk1
6 files changed, 1151 insertions, 0 deletions
diff --git a/keyboards/chimera_ortho/keymaps/gordon/keymap.c b/keyboards/chimera_ortho/keymaps/gordon/keymap.c
new file mode 100644
index 000000000..721f8207a
--- /dev/null
+++ b/keyboards/chimera_ortho/keymaps/gordon/keymap.c
@@ -0,0 +1,389 @@
1// this is the style you want to emulate.
2// This is the canonical layout file for the Quantum project. If you want to add another keyboard,
3
4#include "chimera_ortho.h"
5#include "action_layer.h"
6#include "version.h"
7#include "process_keycode/process_tap_dance.h"
8#include "gordon.h"
9
10// Each layer gets a name for readability, which is then used in the keymap matrix below.
11// The underscores don't mean anything - you can have a layer called STUFF or any other name.
12// Layer names don't all need to be of the same length, obviously, and you can also skip them
13// entirely and just use numbers.
14
15#define CALTDEL LCTL(LALT(KC_DEL))
16#define TSKMGR LCTL(LSFT(KC_ESC))
17
18#define KC_SNAPLEFT LGUI(KC_LEFT)
19#define KC_SNAPRIGHT LGUI(KC_RIGHT)
20#define KC_SNAPUP LGUI(KC_UP)
21#define KC_SNAPDOWN LGUI(KC_DOWN)
22#define KC_PREVTAB LCTL(LSFT(KC_TAB))
23#define KC_NEXTTAB LCTL(KC_TAB)
24#define KC_WORKRIGHT LCTL(LGUI(KC_RIGHT))
25#define KC_WORKLEFT LCTL(LGUI(KC_LEFT))
26
27#define KC_NMPD TG(_NUMPAD)
28#define KC_SYMB TG(_SYMBOLS)
29
30#define KC_SCTL MT(MOD_LCTL, KC_LBRC)
31#define KC_SCTR MT(MOD_LCTL, KC_RBRC)
32#define KC_SPLT MT(MOD_LALT, KC_MINS)
33#define KC_SPRT MT(MOD_LALT, KC_1)
34#define KC_GBRC MT(MOD_RGUI, KC_8)
35#define KC_GQOT MT(MOD_LGUI, KC_QUOT)
36#define KC_CSHW MT(MOD_LCTL|MOD_LSFT,KC_W)
37
38#define KC_CDEL LCTL(KC_DEL)
39#define KC_AUDUP KC_AUDIO_VOL_UP
40#define KC_AUDOWN KC_AUDIO_VOL_DOWN
41
42
43#define KC_MEHS MEH_T(KC_S)
44#define KC_MEHL MEH_T(KC_L)
45#define KC_GWIN GUI_T(KC_G)
46#define KC_FCTL CTL_T(KC_F)
47#define KC_JCTL CTL_T(KC_J)
48#define KC_ZCTL CTL_T(KC_Z)
49#define KC_ALTV ALT_T(KC_V)
50#define KC_ALTN ALT_T(KC_N)
51#define KC_MEHX ALL_T(KC_X)
52#define KC_RESET RESET
53
54//LTs
55#define KC_MESC LT(_MACROS, KC_ESC)
56#define KC_DNUM LT(_NUMPAD, KC_D)
57#define KC_SPFN LT(_NAV,KC_EQL)
58#define KC_EMAUS LT(_MOUSE,KC_E)
59#define KC_ENAV LT(_NAV,KC_E)
60#define KC_INAV LT(_TEXTNAV,KC_I)
61#define KC_BSPSYM LT(_SYMBOLS,KC_BSPACE)
62#define KC_ENTSYM LT(_SYMBOLS,KC_ENTER)
63#define KC_CLNMAUS LT(_MOUSE,KC_SCOLON)
64
65#define KC_FUNC TT(_FUNCTION)
66
67//TAP DANCE
68#define KC_F6F7 TD(F6F7)
69#define KC_ALF4 TD(ALTF4)
70#define KC_TTT TD(TTT)
71#define KC_ENHM TD(HOME_END)
72#define KC_CLPS TD(CALC_PRINTSCREEN)
73
74
75#define KC_INCL M(0)
76#define KC_PULL M(1)
77#define KC_PUSH M(2)
78#define KC_SCAP M(3)
79#define KC_SCOF M(4)
80#define KC_CAD LALT(LCTL(KC_DEL))
81
82#define LONGPRESS_DELAY 150
83//#define LAYER_TOGGLE_DELAY 300
84
85// Fillers to make layering more clear
86#define _______ KC_TRNS
87#define XXXXXXX KC_NO
88#define KC_ KC_TRNS
89
90/* TODO:
91 *
92 * DONE: RESET and CAD into macro layer.
93 * DONE: WINUP AND WINDOWN in NAV layer
94 * DONE: Get rid of caps layer. not sure what it is even for.
95 * DONE: LMEH
96 * DONE: plus, divide, multiply on left hand for num layer
97 * DONE: F1 - F12 on a layer toggle (not a temp toggle but a one shot or something)
98 * DONE: Volume, page up and down for mouse layer.
99 * DONE: Add full user files - without using anything.
100 * DONE: Insert, ctrl delete
101 * DONE: Home and End
102 * DONE: Printscreen
103
104 * Easier way to open new terminal (instead of alt + F2)
105 * Intellij/text navigation layer (ctrl delete could be here).
106 * Macro for "System.exit(0)" probably macro layer and "c"
107 * Some sort of tap dance for comma, H, right pinky, and possibly other corners.
108 * Something more with the right hand. not sure what.
109 * Mouse: Left scroll, right scroll
110 * Passwords and any other macros.
111 * LED for control
112 * All modifiers reset
113 * Russain layer
114 * Hebrew layer
115 * Get rid of stupid git pull and push macros.
116 *
117*/
118
119//Tap dance enums
120enum {
121 F12ETAPS = 0,
122 CALCCOMP,
123 ALTF4,
124 F6F7,
125 TTT,
126 HOME_END,
127 CALC_PRINTSCREEN
128};
129
130static xtap ttt_state = {
131 .is_press_action = true,
132 .state = 0
133};
134
135
136//Already exists in gordon.c, shouldn't need this anymore
137/*// To activate SINGLE_HOLD, you will need to hold for 200ms first.
138// This tap dance favors keys that are used frequently in typing like 'f'
139int cur_dance (qk_tap_dance_state_t *state) {
140 if (state->count == 1) {
141 if (state->interrupted) {
142 return SINGLE_TAP;
143 }
144 else {
145 if (!state->pressed) return SINGLE_TAP;
146 else return SINGLE_HOLD;
147 }
148 }
149 //If count = 2, and it has been interrupted - assume that user is trying to type the letter associated
150 //with single tap.
151 else if (state->count == 2) {
152 if (state->interrupted) return DOUBLE_SINGLE_TAP;
153 else if (state->pressed) return DOUBLE_HOLD;
154 else return DOUBLE_TAP;
155 }
156 else if ((state->count == 3) && ((state->interrupted) || (!state->pressed))) return TRIPLE_TAP;
157 else if (state->count == 3) return TRIPLE_HOLD;
158 else return 8; //magic number. At some point this method will expand to work for more presses
159}*/
160
161/* "Super tap toggle"
162 * Basically, TT but for two or more layers for a single key.
163 * This particular dance:
164 * Single tap/hold - TT for Function layer
165 * Double tap/hold - TT for Numpad layer
166 * Triple tap/hold - TT for Mouse layer
167 *
168*/
169void TTT_finished (qk_tap_dance_state_t *state, void *user_data) {
170 ttt_state.state = cur_dance(state);
171 switch (ttt_state.state) {
172 case SINGLE_TAP: layer_invert(_FUNCTION); break;
173 case SINGLE_HOLD: layer_on(_FUNCTION); break;
174 case DOUBLE_TAP: layer_invert(_NUMPAD); break;
175 case DOUBLE_HOLD: layer_on(_NUMPAD); break;
176 case DOUBLE_SINGLE_TAP: layer_invert(_NUMPAD); break;
177 case TRIPLE_TAP: layer_invert(_MOUSE); break;
178 case TRIPLE_HOLD: layer_on(_MOUSE); break;
179 }
180}
181
182void TTT_reset (qk_tap_dance_state_t *state, void *user_data) {
183 switch (ttt_state.state) {
184 case SINGLE_TAP: break;
185 case SINGLE_HOLD: layer_off(_FUNCTION); break;
186 case DOUBLE_TAP: break;
187 case DOUBLE_HOLD: layer_off(_NUMPAD); break;
188 case DOUBLE_SINGLE_TAP: break;
189 case TRIPLE_TAP: break;
190 case TRIPLE_HOLD: layer_off(_MOUSE); break;
191 }
192 ttt_state.state = 0;
193}
194
195qk_tap_dance_action_t tap_dance_actions[] = {
196 // simple tap dance
197 [F12ETAPS] = ACTION_TAP_DANCE_DOUBLE(KC_F12,LSFT(LCTL(KC_F10))),
198 [CALCCOMP] = ACTION_TAP_DANCE_DOUBLE(KC_CALCULATOR, KC_MY_COMPUTER),
199 [CALC_PRINTSCREEN] = ACTION_TAP_DANCE_DOUBLE(KC_CALCULATOR, KC_PSCR),
200 [ALTF4] = ACTION_TAP_DANCE_DOUBLE(KC_F4,LALT(KC_F4)),
201 [F6F7] = ACTION_TAP_DANCE_DOUBLE(LSFT(KC_F6), LALT(KC_F7)),
202 [HOME_END] = ACTION_TAP_DANCE_DOUBLE(KC_END, KC_HOME),
203 [TTT] = ACTION_TAP_DANCE_FN_ADVANCED(NULL,TTT_finished, TTT_reset),
204};
205
206
207const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
208
209 [_QWERTY] = KEYMAP(
210 //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----.
211 MESC, Q ,CSHW,ENAV, R , T ,SPC , CLPS, Y , U ,INAV, O , P ,TTT,
212 //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
213 TAB , A , MEHS,DNUM,FCTL,GWIN,GRAVE, TILD, H ,JCTL, K ,MEHL,CLNMAUS,ENHM,
214 //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
215 MINUS,ZCTL,MEHX, C ,ALTV, B ,DELETE, INS ,ALTN, M ,COMM,DOT ,SLSH,UNDS,
216 //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
217 LSHIFT,BSPSYM, SPC ,ENTSYM
218 // \------------------+----+----+---/ \---+----+----+-------------------/
219 ),
220
221 [_NUMPAD] = KEYMAP(
222 //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----.
223 , , , ,ASTR, , , , , 7 , 8 , 9 ,ASTR,/**/,
224 //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
225 ,MINS,PLUS,/**/,EQUAL, , , , , 4 , 5 , 6 ,PLUS, ,
226 //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
227 , , , ,SLSH, , , , , 1 , 2 , 3 ,SLSH, ,
228 //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
229 , , , 0
230 // \------------------+----+----+---/ \---+----+----+-------------------/
231 ),
232
233 [_SYMBOLS] = KEYMAP(
234 //,----+----+-----+----+----+----+----. ,----+----+----+----+----+----+----.
235 ,EXLM, AT ,LCBR,RCBR,HASH, , ,CIRC,AMPR,ASTR,LPRN,RPRN,/**/,
236 //|----+----+-----+----+----+----+----| |----+----+----+----+----+----+----|
237 ,EXLM,EXLM,LPRN,RPRN , , , , ,DQUO,EQUAL,QUOTE,RCBR, ,
238 //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
239 ,DOLLAR, PERC,LBRACKET,RBRACKET, , , ,PIPE,BSLASH,PLUS, , , ,
240 //|----+----+-----+----+----+----+----| |----+----+----+----+----+----+----|
241 UNDS,/**/, ,/**/
242 // \-------------------+----+----+---/ \---+----+----+-------------------/
243 ),
244
245 [_FUNCTION] = KEYMAP(
246 //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----.
247 F6F7 ,F1 ,F2 ,F3 ,ALF4,F5 ,F6 , F7 ,F8 ,F9 ,F10 ,F11 ,F12 ,/**/,
248 //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
249 , , , , , , , , , , , , , ,
250 //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
251 , , , , , , , , , , , , , ,
252 //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
253 , , ,
254 // \------------------+----+----+---/ \---+----+----+-------------------/
255 ),
256
257 [_NAV] = KEYMAP(
258 //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----.
259 , ,SNAPLEFT,/**/,SNAPRIGHT,, , , , , UP , , , ,
260 //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
261 ,SNAPUP,PREVTAB, ,NEXTTAB,SNAPDOWN,, , ,LEFT,DOWN,RGHT, , ,
262 //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
263 , ,WORKLEFT, ,WORKRIGHT,, , , ,PGUP,PGDN, , , ,
264 //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
265 CDEL ,DEL, ,
266 // \------------------+----+----+---/ \---+----+----+-------------------/
267 ),
268
269 [_TEXTNAV] = KEYMAP(
270 //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----.
271 , , , , , , , , , ,/**/, , , ,
272 //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
273 , , , , , , , , , , , , , ,
274 //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
275 , , , , , , , , , , , , , ,
276 //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
277 , , ,
278 // \------------------+----+----+---/ \---+----+----+-------------------/
279 ),
280
281 [_MOUSE] = KEYMAP(
282 //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----.
283 , , ,MS_UP, , , , , , , UP , , , ,/**/
284 //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
285 , ,MS_LEFT,MS_DOWN,MS_RIGHT, , , , ,LEFT,DOWN,RGHT,/**/, ,
286 //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
287 , , , , , , , , , , , , , ,
288 //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
289 ,MS_BTN1 ,MS_BTN2 ,
290 // \------------------+----+----+---/ \---+----+----+-------------------/
291 ),
292
293
294 [_MACROS] = KEYMAP(
295 //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----.
296 /**/,RESET,SECRET_2,SECRET_3, , , ,SYSTEM_SLEEP, , ,INCL, , , ,
297 //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
298 CAD ,SECRET_1, , , , , , , , , , , , ,
299 //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
300 SCAP, , , , , , , , , , , , ,SCAP,
301 //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
302 , , ,
303 // \------------------+----+----+---/ \---+----+----+-------------------/
304 )
305
306};
307
308
309const uint16_t PROGMEM fn_actions[] = {
310
311};
312
313const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
314{
315 switch(id) {
316 /* include some kind of library or header */
317 case 0:
318 if (record->event.pressed) {
319 SEND_STRING("#include <>");
320 return MACRO( T(LEFT), END);
321 }
322 break;
323 case 1:
324 if (record->event.pressed) {
325 SEND_STRING("git pull");
326 return MACRO( T(ENT), END );
327 }
328 break;
329 case 2:
330 if (record->event.pressed){
331 SEND_STRING("git push");
332 return MACRO( T(ENT), END );
333 }
334 break;
335 case 3:
336 if (record->event.pressed){
337 // layer_on(_CAPS);
338 // register_code(KC_CAPSLOCK);
339 // unregister_code(KC_CAPSLOCK);
340 }
341 break;
342 case 4:
343 if (record->event.pressed){
344 // layer_off(_CAPS);
345 // register_code(KC_CAPSLOCK);
346 // unregister_code(KC_CAPSLOCK);
347 }
348 break;
349 }
350 return MACRO_NONE;
351};
352
353
354void matrix_scan_user(void) {
355 uint8_t layer = biton32(layer_state);
356
357 switch (layer) {
358 case _QWERTY:
359 set_led_green;
360 break;
361 case _MOUSE:
362 set_led_yellow;
363 break;
364 case _NUMPAD:
365 set_led_blue;
366 break;
367 case _SYMBOLS:
368 set_led_red;
369 break;
370 case _NAV:
371 set_led_magenta;
372 break;
373 case _MACROS:
374 set_led_green;
375 _delay_ms(45);
376 set_led_red;
377 _delay_ms(45);
378 break;
379 case _FUNCTION:
380 set_led_green;
381 _delay_ms(45);
382 set_led_blue;
383 _delay_ms(45);
384 break;
385 default:
386 set_led_green;
387 break;
388 }
389};
diff --git a/keyboards/ergodox_infinity/keymaps/gordon/keymap.c b/keyboards/ergodox_infinity/keymaps/gordon/keymap.c
new file mode 100644
index 000000000..7e3e51cdd
--- /dev/null
+++ b/keyboards/ergodox_infinity/keymaps/gordon/keymap.c
@@ -0,0 +1,315 @@
1#include QMK_KEYBOARD_H
2#include "debug.h"
3#include "action_layer.h"
4#include "version.h"
5#include "process_keycode/process_tap_dance.h"
6#include "gordon.h"
7
8#include "keymap_german.h"
9
10#include "keymap_nordic.h"
11
12
13#define TLSLSH M(TIL_SLASH)
14#define F1_F13 TD(F1F13)
15#define F2_F14 TD(F2F14)
16#define F5_F15 TD(F5F15)
17#define F4_ALTF4 TD(ALTF4)
18#define END_ESC TD(ENDESC)
19#define SHF6_AF7 TD(F6F7)
20#define F12_RUN TD(F12ETAPS)
21#define COMMA_TD TD(COMMA)
22
23enum custom_keycodes {
24 PLACEHOLDER = SAFE_RANGE, // can always be here
25 EPRM,
26 VRSN,
27 RGB_SLD,
28};
29
30//Tap dance enums
31enum {
32 F12TAP = 0,
33 F12ETAPS,
34 CALCCOMP,
35 REFRESH, //send R, or Control+R if double tapped.
36 ENDESC,
37 XESC, //'quad function'. x, control, escape, alt
38 ALY2, //'quad function': a, Hyper, ctrl+a, layer 2
39 PRLOCK,
40 F6F7, // Shift F6 or Alt F7
41 TABCOMBO,
42 FCTRL,
43 F3D,
44 ALTF4,
45 COMMA,
46 AT,
47 HTAB,
48 F1F13,
49 F2F14,
50 F5F15
51};
52
53
54
55// Custom tapping terms for each key.
56// Requires changes to action_taping.c
57/* uint16_t get_tapping_term(keyevent_t* event) {
58 uint16_t keycode = keymap_key_to_keycode(layer_switch_get_layer(event->key), event->key);
59 if (keycode == LT(3,KC_E) ) {
60 return TAPPING_TERM + 50;
61 }
62 return TAPPING_TERM;
63} */
64
65
66// Tap Dance Definitions
67qk_tap_dance_action_t tap_dance_actions[] = {
68 // simple tap dance
69 [F12ETAPS] = ACTION_TAP_DANCE_DOUBLE(KC_F12,LSFT(LCTL(KC_F10))),
70 [REFRESH] = ACTION_TAP_DANCE_DOUBLE(KC_R,LCTL(KC_R)),
71 [ENDESC] = ACTION_TAP_DANCE_DOUBLE(KC_END, KC_ESC),
72 [CALCCOMP] = ACTION_TAP_DANCE_DOUBLE(KC_CALCULATOR, KC_MY_COMPUTER),
73 [ALTF4] = ACTION_TAP_DANCE_DOUBLE(KC_F4,LALT(KC_F4)),
74 [F6F7] = ACTION_TAP_DANCE_DOUBLE(LSFT(KC_F6), LALT(KC_F7)),
75 [F1F13] = ACTION_TAP_DANCE_DOUBLE(KC_F1, KC_F13),
76 [F2F14] = ACTION_TAP_DANCE_DOUBLE(KC_F2, KC_F14),
77 [F5F15] = ACTION_TAP_DANCE_DOUBLE(KC_F5, KC_F15),
78 [TABCOMBO] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, tab_finished, tab_reset),
79 [F3D] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, bt_finished, bt_reset),
80 [COMMA] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, comma_finished, comma_reset),
81 [HTAB] = ACTION_TAP_DANCE_FN_ADVANCED(NULL,h_finished, h_reset)
82};
83
84const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
85
86
87//**************************FIRST LAYER - LAYER ZERO **************************************
88 [_QWERTY] = KEYMAP(
89
90 SHF6_AF7, F1_F13, F2_F14, TD(F3D), F4_ALTF4, F5_F15, KC_F11,
91 ________, KC_Q, CTR_SH_W, NAV_E, CTR_AL_R, KC_T, PRINTSCR,
92 KC_TAB, KC_A, MEH_S, NUMPAD_D, CTRL_F, WIN_G,
93 ALT_SHFT, CTRL_Z, HYPER_X, MOUSE_C, ALT_V, KC_B, TT(_MOUSE),
94 KC_MINUS, KC_GRAVE, KC_DELETE, KC_LEFT, KC_RIGHT,
95
96 KC_INSERT, KC_DELETE,
97 ALT_HOME,
98 KC_LSHIFT, SYMB_BSP, END_ESC,
99
100 F12_RUN, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, TD(CALCCOMP),
101 ________, KC_Y, KC_U, KC_I, KC_O, KC_P, ________,
102 WIN_H, CTRL_J, KC_K, MEH_L, COL_MOUS, ________,
103 KC_LEAD, KC_N, ALT_M, COMMA_TD, HYPE_DOT, KC_SLASH, TD(TABCOMBO),
104 KC_UP, KC_DOWN, KC_ESC, KC_TILD, KC_UNDS,
105
106 KC_ESCAPE, KC_DELETE,
107 ALT_T(KC_PGUP),
108 RCTL_T(KC_PGDOWN), LT(_NAV,KC_ENTER), SPAC_SYM),
109
110
111 //**************************SYMBOLS LAYER**************************
112 [_SYMBOLS] = KEYMAP(
113 ________, ________, ________, ________, ________, ________, ________,
114 ________, TLSLSH, KC_AT, KC_LCBR, KC_RCBR, KC_CIRC, ________,
115 ________, KC_EXLM, KC_PIPE, KC_LPRN, KC_RPRN, M(DEREF),
116 ________,KC_DOLLAR, KC_PERC, LSQUIGLY, RSQUIGLY, ________, ________,
117 ________, M(TICK3), ________, ________, ________,
118
119 ________,________,
120 ________,
121 ________,________,________,
122
123
124 ________, ________, ________, ________, ________, ________, NUMLOCK,
125 ________, TLSLSH, KC_PIPE, KC_PLUS, KC_AMPR, ________, CAPLOCK,
126 M(EQRIGHT), KC_DQUO, KC_EQUAL, KC_QUOTE,KC_SCOLON, ________,
127 ________, KC_PIPE, BK_SLASH, ASTERSK, KC_DOT, KC_SLASH, ________,
128 ________,________,________,M(TILD3),________,
129 ________,________,
130 ________,
131 ________,________,________),
132
133 //**************************MOUSE MOVEMENT LAYER**************************
134 [_MOUSE] = KEYMAP(RESET,________,________,________,________,________,________,
135 RESET,________,________,KC_MS_UP,________,KC_MS_WH_UP,CALTDEL,
136 ________,________,KC_MS_LEFT,KC_MS_DOWN,KC_MS_RIGHT,KC_MS_WH_DOWN,
137 KC_SECRET_1,________,HYPR(KC_F13),________,HYPR(KC_F14),KC_SECRET_2,________,
138 ________,________,HYPR(KC_F15),KC_MS_WH_LEFT,KC_MS_WH_RIGHT,
139
140 ________,________,
141 ________,
142 KC_MS_BTN1,KC_MS_BTN2,________,
143
144
145 ________,________,________,________,________,________,________,
146 KC_MS_WH_UP,________,________,KC_UP,________,________,________,
147 ________,KC_LEFT,KC_DOWN,KC_RIGHT,________,________,
148 KC_MS_WH_DOWN,________,KC_PGUP,KC_PGDOWN,KC_MEDIA_NEXT_TRACK,________,________,
149 KC_AUDIO_VOL_UP,KC_AUDIO_VOL_DOWN,KC_AUDIO_MUTE,KC_MEDIA_PLAY_PAUSE,________,
150 ________,________,
151 ________,
152 ________,________,KC_WWW_BACK),
153
154
155
156
157 //**************************WINDOWS NAVIGATION LAYER**************************
158
159 [_NAV] = KEYMAP(________,________,________,________,________,________,________,
160 ________,________,SNAPLEFT,________,SNAPRGHT,LALT(KC_LEFT),________,
161 ________,LCTL(KC_W),PREVTAB,LGUI(KC_D),NEXTTAB,________,
162 ________,________,WORKLEFT,________,WORKRIGHT,________,________,
163 ________,________,________,________,________,
164
165 ________,________,
166 ________,
167 ________,________,________,
168
169
170 ________,________,________,________,________,________,________,
171 ________,________,SNAPUP ,KC_UP ,SNAPDOWN,________,________,
172 ________,KC_LEFT ,KC_DOWN ,KC_RIGHT,________,________,
173 ________,________,________,________,________,________,________,
174 ________,________,________,________,________,
175
176
177 ________,________,
178 ________,
179 ________,________,________),
180
181 //****************************NUMPAD LAYER****************************
182 [_NUMPAD] = KEYMAP(________,________,________,________,________,________,________,
183 ________,________,________,________,________,________,________,
184 ________,________,________,________,________,________,
185 ________,________,________,________,________,________,________,
186 ________,________,________,________,________,
187
188 ________,________,
189 ________,
190 ________,________,________,
191
192 BL_TOGG ,BL_STEP ,________,________,________,________,________,
193 ________,________,KC_7 ,KC_8 ,KC_9 ,________,________,
194 ________,KC_4 ,KC_5 ,KC_6 ,________,________,
195 ________,________,KC_1 ,KC_2 ,KC_3 ,________,________,
196 KC_0 ,KC_0 , KC_DOT ,________,________,
197
198 ________,________,
199 ________,
200 ________,________,KC_0),
201 //****************************TEXT/INTELLIJ NAVIGATION LAYER****************************
202 [_TEXTNAV] = KEYMAP(________,________,________,________,________,________,________,
203 ________,MEH(KC_Q),LSFT(KC_ESCAPE),MEH(KC_D),MEH(KC_2),LALT(LSFT(KC_UP)),________,
204 ________,LALT(KC_F7),LCTL(KC_LEFT),LCTL(KC_B),LCTL(KC_RIGHT),LALT(LSFT(KC_DOWN)),
205 ________,________,________,LCTL(LSFT(KC_COMMA)),MEH(KC_DOT),LALT(KC_MS_WH_UP),________,________,________,________,________,________,________,________,________,________,LCTL(KC_DELETE),________,LALT(LSFT(KC_F9)),________,________,________,________,________,________,________,MEH(KC_5),LALT(LSFT(KC_Z)),________,LALT(KC_Z),________,________,________,LCTL(LSFT(KC_LEFT)),LALT(LCTL(KC_S)),LCTL(LSFT(KC_RIGHT)),LCTL(LSFT(KC_COMMA)),________,________,________,________,________,________,________,________,________,________,________,________,________,________,________,________,________,________,________)
206};
207
208const uint16_t PROGMEM fn_actions[] = {
209 [1] = ACTION_LAYER_TAP_TOGGLE(1)
210};
211
212const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
213{
214 switch(id) {
215 case INFOQM: {
216 if (record->event.pressed) {
217 SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
218 }
219 break;
220 }
221
222 case TIL_SLASH: {
223 if (record->event.pressed) {
224 SEND_STRING ("~/.");
225 }
226 break;
227 }
228
229 case DEREF: {
230 if (record->event.pressed) {
231 SEND_STRING ("->");
232 }
233 break;
234 }
235
236 case EQRIGHT: {
237 if (record->event.pressed) {
238 SEND_STRING ("=>");
239 }
240 break;
241 }
242
243 case TICK3: {
244 if (record->event.pressed) {
245 SEND_STRING ("```");
246 }
247 break;
248 }
249
250 case TILD3: {
251 if (record->event.pressed) {
252 SEND_STRING ("~~~");
253 }
254 break;
255 }
256
257 case ALTTAB_START: {
258 register_code(KC_LALT);
259 layer_on(8);
260 }
261
262 case ALTTAB_END: {
263 unregister_code(KC_LALT);
264 layer_off(8);
265 }
266
267
268
269 }
270 return MACRO_NONE;
271};
272
273void matrix_scan_user(void) {
274
275 uint8_t layer = biton32(layer_state);
276
277 ergodox_board_led_on();
278 ergodox_led_all_on();
279
280 ergodox_board_led_off();
281 ergodox_right_led_1_off();
282 ergodox_right_led_2_off();
283 ergodox_right_led_3_off();
284 switch (layer) {
285 case _SYMBOLS:
286 ergodox_right_led_1_on();
287 break;
288 case _MOUSE:
289 ergodox_right_led_2_on();
290 break;
291 case _NUMPAD:
292 ergodox_right_led_3_on();
293 break;
294 case _NAV:
295 ergodox_right_led_1_on();
296 ergodox_right_led_2_on();
297 break;
298 case 5:
299 ergodox_right_led_1_on();
300 ergodox_right_led_3_on();
301 break;
302 case 6:
303 ergodox_right_led_2_on();
304 ergodox_right_led_3_on();
305 break;
306 case 7:
307 ergodox_right_led_1_on();
308 ergodox_right_led_2_on();
309 ergodox_right_led_3_on();
310 break;
311 default:
312 break;
313 }
314
315};
diff --git a/users/gordon/gordon.c b/users/gordon/gordon.c
new file mode 100644
index 000000000..056012a21
--- /dev/null
+++ b/users/gordon/gordon.c
@@ -0,0 +1,275 @@
1#include "gordon.h"
2#include "quantum.h"
3#include "action.h"
4#include "process_keycode/process_tap_dance.h"
5
6#if (__has_include("secret.h"))
7#include "secret.h"
8#else
9const char secret[][64] = {
10 "test1",
11 "test2",
12 "test3",
13 "test4",
14 "test5"
15};
16#endif
17
18
19
20
21void register_hyper (void) { //Helper function to invoke Hyper
22 register_code (KC_LSFT);
23 register_code (KC_LCTL);
24 register_code (KC_LALT);
25 register_code (KC_LGUI);
26}
27void unregister_hyper (void) { //Helper function to invoke Hyper
28 unregister_code (KC_LSFT);
29 unregister_code (KC_LCTL);
30 unregister_code (KC_LALT);
31 unregister_code (KC_LGUI);
32}
33
34void register_ctrl_a (void) {
35 register_code(KC_LCTL);
36 register_code(KC_A);
37}
38
39void unregister_ctrl_a (void) {
40 unregister_code(KC_LCTL);
41 unregister_code(KC_A);
42}
43
44void register_alt_f7 (void) {
45 register_code (KC_LALT);
46 register_code (KC_F7);
47}
48
49void unregister_alt_f7 (void) {
50 unregister_code (KC_LALT);
51 unregister_code (KC_F7);
52}
53
54void register_shift_f6 (void) {
55 register_code (KC_LSFT);
56 register_code (KC_F6);
57}
58
59void unregister_shift_f6 (void) {
60 unregister_code (KC_LSFT);
61 unregister_code (KC_F6);
62}
63
64void register_ctrl_shift (void) {
65 register_code (KC_LSFT);
66 register_code (KC_LCTRL);
67}
68
69void unregister_ctrl_shift (void) {
70 unregister_code (KC_LSFT);
71 unregister_code (KC_LCTRL);
72}
73
74void register_alt_shift (void) {
75 register_code (KC_LSFT);
76 register_code (KC_LALT);
77}
78
79void unregister_alt_shift (void) {
80 unregister_code (KC_LSFT);
81 unregister_code (KC_LALT);
82}
83
84// To activate SINGLE_HOLD, you will need to hold for 200ms first.
85// This tap dance favors keys that are used frequently in typing like 'f'
86int cur_dance (qk_tap_dance_state_t *state) {
87 if (state->count == 1) {
88 //If count = 1, and it has been interrupted - it doesn't matter if it is pressed or not: Send SINGLE_TAP
89 if (state->interrupted) {
90 // if (!state->pressed) return SINGLE_TAP;
91 //need "permissive hold" here.
92 // else return SINsGLE_HOLD;
93 //If the interrupting key is released before the tap-dance key, then it is a single HOLD
94 //However, if the tap-dance key is released first, then it is a single TAP
95 //But how to get access to the state of the interrupting key????
96 return SINGLE_TAP;
97 }
98 else {
99 if (!state->pressed) return SINGLE_TAP;
100 else return SINGLE_HOLD;
101 }
102 }
103 //If count = 2, and it has been interrupted - assume that user is trying to type the letter associated
104 //with single tap.
105 else if (state->count == 2) {
106 if (state->interrupted) return DOUBLE_SINGLE_TAP;
107 else if (state->pressed) return DOUBLE_HOLD;
108 else return DOUBLE_TAP;
109 }
110 else if ((state->count == 3) && ((state->interrupted) || (!state->pressed))) return TRIPLE_TAP;
111 else if (state->count == 3) return TRIPLE_HOLD;
112 else return 8; //magic number. At some point this method will expand to work for more presses
113}
114
115//This works well if you want this key to work as a "fast modifier". It favors being held over being tapped.
116int hold_cur_dance (qk_tap_dance_state_t *state) {
117 if (state->count == 1) {
118 if (state->interrupted) {
119 if (!state->pressed) return SINGLE_TAP;
120 else return SINGLE_HOLD;
121 }
122 else {
123 if (!state->pressed) return SINGLE_TAP;
124 else return SINGLE_HOLD;
125 }
126 }
127 //If count = 2, and it has been interrupted - assume that user is trying to type the letter associated
128 //with single tap.
129 else if (state->count == 2) {
130 if (state->pressed) return DOUBLE_HOLD;
131 else return DOUBLE_TAP;
132 }
133 else if (state->count == 3) {
134 if (!state->pressed) return TRIPLE_TAP;
135 else return TRIPLE_HOLD;
136 }
137 else return 8; //magic number. At some point this method will expand to work for more presses
138}
139
140
141static xtap htap_state = {
142 .is_press_action = true,
143 .state = 0
144};
145
146void h_finished (qk_tap_dance_state_t *state, void *user_data) {
147 htap_state.state = cur_dance(state);
148 switch (htap_state.state) {
149 case SINGLE_TAP: register_code(KC_H); break;
150 case SINGLE_HOLD: layer_on(8); register_code(KC_LALT); break;
151 case DOUBLE_TAP: layer_invert(8); register_code(KC_LALT); break;
152 // case DOUBLE_HOLD: register_code(KC_LALT);
153 case DOUBLE_SINGLE_TAP: register_code(KC_H);unregister_code(KC_H);register_code(KC_H);
154 }
155}
156
157void h_reset (qk_tap_dance_state_t *state, void *user_data) {
158 switch (htap_state.state) {
159 case SINGLE_TAP: unregister_code(KC_H); break;
160 case SINGLE_HOLD: layer_off(8); unregister_code(KC_LALT); break;
161 case DOUBLE_TAP: unregister_code(KC_LALT);break;
162 // case DOUBLE_HOLD: unregister_code(KC_LALT);
163 case DOUBLE_SINGLE_TAP: unregister_code(KC_H);
164 }
165 htap_state.state = 0;
166}
167
168
169/**************** QUAD FUNCTION FOR TAB ****************/
170// TAB, ALT + SHIFT, TAB TAB, CTRL + SHIFT
171static xtap tab_state = {
172 .is_press_action = true,
173 .state = 0
174};
175
176void tab_finished (qk_tap_dance_state_t *state, void *user_data) {
177 tab_state.state = cur_dance(state);
178 switch (tab_state.state) {
179 case SINGLE_TAP: register_code(KC_TAB); break; //send tab on single press
180 case SINGLE_HOLD: register_ctrl_shift(); break;
181 case DOUBLE_HOLD: register_alt_shift(); break; //alt shift on single hold
182 case DOUBLE_TAP: register_code(KC_TAB); unregister_code(KC_TAB); register_code(KC_TAB); break; //tab tab
183 case TRIPLE_TAP: register_code(KC_LSHIFT) ;register_code(KC_ESC); break;
184 case TRIPLE_HOLD: register_code(KC_LSHIFT); register_code(KC_LGUI); break;
185 }
186}
187
188void tab_reset (qk_tap_dance_state_t *state, void *user_data) {
189 switch (tab_state.state) {
190 case SINGLE_TAP: unregister_code(KC_TAB); break; //unregister tab
191 case DOUBLE_HOLD: unregister_alt_shift(); break; //let go of alt shift
192 case DOUBLE_TAP: unregister_code(KC_TAB); break;
193 case SINGLE_HOLD: unregister_ctrl_shift(); break;
194 case TRIPLE_TAP: unregister_code(KC_LSHIFT); unregister_code(KC_ESC); break;
195 case TRIPLE_HOLD: unregister_code(KC_LSHIFT); unregister_code(KC_LGUI); break;
196 }
197 tab_state.state = 0;
198}
199/**************** QUAD FUNCTION FOR TAB ****************/
200
201//*************** SUPER COMMA *******************//
202// Assumption: we don't care about trying to hit ,, quickly
203//*************** SUPER COMMA *******************//
204static xtap comma_state = {
205 .is_press_action = true,
206 .state = 0
207};
208
209void comma_finished (qk_tap_dance_state_t *state, void *user_data) {
210 comma_state.state = hold_cur_dance(state); //Use the dance that favors being held
211 switch (comma_state.state) {
212 case SINGLE_TAP: register_code(KC_COMMA); break;
213 case SINGLE_HOLD: layer_on(1); break; //turn on symbols layer
214 case DOUBLE_TAP: layer_invert(4); break; //toggle numbers layer
215 case DOUBLE_HOLD: layer_on(2); break;
216 case TRIPLE_TAP: register_code(KC_CALCULATOR); break;
217 case TRIPLE_HOLD: layer_on(3);
218 }
219}
220
221void comma_reset (qk_tap_dance_state_t *state, void *user_data) {
222 switch (comma_state.state) {
223 case SINGLE_TAP: unregister_code(KC_COMMA); break; //unregister comma
224 case SINGLE_HOLD: layer_off(1); break;
225 case DOUBLE_TAP: ;break;
226 case DOUBLE_HOLD: layer_off(2); break;
227 case TRIPLE_TAP: unregister_code(KC_CALCULATOR); break;
228 case TRIPLE_HOLD: layer_off(3);
229 }
230 comma_state.state = 0;
231}
232//*************** SUPER COMMA *******************//
233//*************** SUPER COMMA *******************//
234
235
236//*************** F3 TAP DANCE *******************//
237//Good example for accessing multiple layers from the same key.
238static xtap S1_state = {
239 .is_press_action = true,
240 .state = 0
241};
242
243void bt_finished (qk_tap_dance_state_t *state, void *user_data) {
244 S1_state.state = cur_dance(state);
245 switch (S1_state.state) {
246 case SINGLE_TAP: register_code(KC_F3); break;
247 case SINGLE_HOLD: layer_on(4); break;
248 case DOUBLE_TAP: layer_invert(4); break;
249 case DOUBLE_HOLD: layer_on(5); break;
250 case DOUBLE_SINGLE_TAP: layer_invert(4); break;
251 }
252}
253
254void bt_reset (qk_tap_dance_state_t *state, void *user_data) {
255 switch (S1_state.state) {
256 case SINGLE_TAP: unregister_code(KC_F3); break;
257 case SINGLE_HOLD: layer_off(4); break;
258 case DOUBLE_TAP: break; //already inverted. Don't do anything.
259 case DOUBLE_HOLD: layer_off(5); break;
260 case DOUBLE_SINGLE_TAP: break;
261 }
262 S1_state.state = 0;
263}
264
265bool process_record_user(uint16_t keycode, keyrecord_t *record) {
266 switch (keycode) {
267 case KC_SECRET_1 ... KC_SECRET_5:
268 if (!record->event.pressed) {
269 send_string(secret[keycode - KC_SECRET_1]);
270 }
271 return false;
272 break;
273 }
274 return true;
275} \ No newline at end of file
diff --git a/users/gordon/gordon.h b/users/gordon/gordon.h
new file mode 100644
index 000000000..548c63049
--- /dev/null
+++ b/users/gordon/gordon.h
@@ -0,0 +1,157 @@
1#ifndef GORDON
2#define GORDON
3
4#include "quantum.h"
5#include "process_keycode/process_tap_dance.h"
6
7
8// Fillers to make layering more clear
9#define _______ KC_TRNS
10#define ________ KC_TRNS
11#define _________ KC_TRNS
12#define XXXXXXX KC_NO
13
14// KC codes that are too long
15#define DOLLAR KC_DOLLAR
16#define LSQUIGLY KC_LBRACKET
17#define RSQUIGLY KC_RBRACKET
18#define NUMLOCK KC_NUMLOCK
19#define CAPLOCK KC_CAPSLOCK
20#define BK_SLASH KC_BSLASH
21#define ASTERSK KC_KP_ASTERISK
22
23// Navigation
24#define SNAPLEFT LGUI(KC_LEFT)
25#define SNAPRGHT LGUI(KC_RIGHT)
26#define SNAPUP LGUI(KC_UP)
27#define SNAPDOWN LGUI(KC_DOWN)
28#define PREVTAB LCTL(LSFT(KC_TAB))
29#define NEXTTAB LCTL(KC_TAB)
30#define WORKRIGHT LCTL(LGUI(KC_RIGHT))
31#define WORKLEFT LCTL(LGUI(KC_LEFT))
32
33// KC/modifier hold
34#define CTRL_F CTL_T(KC_F)
35#define CTRL_J CTL_T(KC_J)
36#define CTRL_Z CTL_T(KC_Z)
37#define ALT_V ALT_T(KC_V)
38#define ALT_M ALT_T(KC_M)
39#define WIN_G GUI_T(KC_G)
40#define WIN_H GUI_T(KC_H)
41#define HYPER_X ALL_T(KC_X)
42#define HYPE_DOT ALL_T(KC_DOT)
43#define MEH_S MEH_T(KC_S)
44#define MEH_L MEH_T(KC_L)
45#define ALT_HOME ALT_T(KC_HOME)
46
47
48// KC/Layer Hold
49#define NAV_E LT(_NAV,KC_E)
50#define NUMPAD_D LT(_NUMPAD,KC_D)
51#define MOUSE_C LT(_MOUSE,KC_C)
52#define SYMB_BSP LT(_SYMBOLS,KC_BSPACE)
53#define COL_MOUS LT(_MOUSE,KC_SCOLON)
54#define SPAC_SYM LT(_SYMBOLS,KC_SPACE)
55
56// Double Modifier ONLY hold
57#define ALT_SHFT LSFT(KC_LALT)
58#define CTR_SHFT LSFT(KC_LCTL)
59
60// KC/Double modifier Hold
61#define CTR_SH_W MT(MOD_LCTL|MOD_LSFT,KC_W)
62#define CTR_AL_R MT(MOD_LCTL|MOD_LALT,KC_R)
63
64//MISC
65#define PRINTSCR KC_PSCREEN
66#define CALTDEL LCTL(LALT(KC_DEL))
67#define TSKMGR LCTL(LSFT(KC_ESC))
68
69
70typedef struct {
71 bool is_press_action;
72 int state;
73} xtap;
74
75enum {
76 SINGLE_TAP = 1,
77 SINGLE_HOLD = 2,
78 DOUBLE_TAP = 3,
79 DOUBLE_HOLD = 4,
80 DOUBLE_SINGLE_TAP = 5, //send two single taps
81 TRIPLE_TAP = 6,
82 TRIPLE_HOLD = 7
83};
84
85enum gordon_layers
86{
87 _QWERTY = 0,
88 _SYMBOLS,
89 _MOUSE,
90 _NUMPAD,
91 _NAV,
92 _MACROS,
93 _FUNCTION,
94 _TEXTNAV
95};
96
97
98
99void register_hyper (void);
100void unregister_hyper (void);
101
102void register_ctrl_a (void);
103void unregister_ctrl_a (void);
104
105void register_alt_f7 (void);
106void unregister_alt_f7 (void);
107
108void register_shift_f6 (void);
109void unregister_shift_f6 (void);
110
111void register_ctrl_shift (void);
112void unregister_ctrl_shift (void);
113
114void register_alt_shift (void);
115void unregister_alt_shift (void);
116
117int cur_dance (qk_tap_dance_state_t *state);
118int hold_cur_dance (qk_tap_dance_state_t *state);
119
120void x_finished (qk_tap_dance_state_t *state, void *user_data);
121void x_reset (qk_tap_dance_state_t *state, void *user_data);
122
123void h_finished (qk_tap_dance_state_t *state, void *user_data);
124void h_reset (qk_tap_dance_state_t *state, void *user_data);
125
126void tab_finished (qk_tap_dance_state_t *state, void *user_data);
127void tab_reset (qk_tap_dance_state_t *state, void *user_data);
128
129void comma_finished (qk_tap_dance_state_t *state, void *user_data);
130void comma_reset (qk_tap_dance_state_t *state, void *user_data);
131
132void bt_finished (qk_tap_dance_state_t *state, void *user_data);
133void bt_reset (qk_tap_dance_state_t *state, void *user_data);
134
135// Macro Declarations
136enum {
137 INFOQM,
138 TIL_SLASH,
139 DEREF,
140 EQRIGHT,
141 TILD3,
142 TICK3,
143 ALTTAB_START,
144 ALTTAB_END
145};
146
147enum secret_strings {
148 KC_SECRET_1 = SAFE_RANGE,
149 KC_SECRET_2,
150 KC_SECRET_3,
151 KC_SECRET_4,
152 KC_SECRET_5,
153};
154
155const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt);
156
157#endif \ No newline at end of file
diff --git a/users/gordon/readme.md b/users/gordon/readme.md
new file mode 100644
index 000000000..fdea33b67
--- /dev/null
+++ b/users/gordon/readme.md
@@ -0,0 +1,14 @@
1Copyright <year> <name> <email> @<github_username>
2
3This program is free software: you can redistribute it and/or modify
4it under the terms of the GNU General Public License as published by
5the Free Software Foundation, either version 2 of the License, or
6(at your option) any later version.
7
8This program is distributed in the hope that it will be useful,
9but WITHOUT ANY WARRANTY; without even the implied warranty of
10MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11GNU General Public License for more details.
12
13You should have received a copy of the GNU General Public License
14along with this program. If not, see <http://www.gnu.org/licenses/>. \ No newline at end of file
diff --git a/users/gordon/rules.mk b/users/gordon/rules.mk
new file mode 100644
index 000000000..5dd62c200
--- /dev/null
+++ b/users/gordon/rules.mk
@@ -0,0 +1 @@
SRC += gordon.c \ No newline at end of file