aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--keyboards/ergodox_ez/keymaps/bocaj/config.h21
-rw-r--r--keyboards/ergodox_ez/keymaps/bocaj/keymap.c340
-rw-r--r--keyboards/ergodox_ez/keymaps/bocaj/readme.md48
-rw-r--r--layouts/community/ergodox/bocaj/config.h6
-rw-r--r--layouts/community/ergodox/bocaj/keymap.c246
-rw-r--r--layouts/community/ergodox/bocaj/rules.mk (renamed from keyboards/ergodox_ez/keymaps/bocaj/rules.mk)1
-rw-r--r--users/bocaj/bocaj.c177
-rw-r--r--users/bocaj/bocaj.h (renamed from keyboards/ergodox_ez/keymaps/bocaj/bocaj.h)119
-rw-r--r--users/bocaj/config.h33
-rw-r--r--users/bocaj/readme.md14
-rw-r--r--users/bocaj/rules.mk5
-rw-r--r--users/bocaj/tap_dances.c65
-rw-r--r--users/bocaj/tap_dances.h7
13 files changed, 611 insertions, 471 deletions
diff --git a/keyboards/ergodox_ez/keymaps/bocaj/config.h b/keyboards/ergodox_ez/keymaps/bocaj/config.h
deleted file mode 100644
index 59605bc25..000000000
--- a/keyboards/ergodox_ez/keymaps/bocaj/config.h
+++ /dev/null
@@ -1,21 +0,0 @@
1#ifndef USERSPACE_CONFIG_H
2 #define USERSPACE_CONFIG_H
3
4 #ifndef QMK_KEYS_PER_SCAN
5 #define QMK_KEYS_PER_SCAN 4
6 #endif // QMK KEYS PER SCAN
7
8 // this makes it possible to do rolling combos (zx) with keys that
9 // convert to other keys on hold (z becomes ctrl when you hold it,
10 // and when this option isn't enabled, z rapidly followed by x
11 // actually sends Ctrl-x. That's bad.)
12 #define IGNORE_MOD_TAP_INTERRUPT
13 #define PERMISSIVE_HOLD
14 #undef PREVENT_STUCK_MODIFIERS
15
16 // Disable action_get_macro and fn_actions, since we don't use these
17 // and it saves on space in the firmware.
18 #define NO_ACTION_MACRO
19 #define NO_ACTION_FUNCTION
20
21#endif // !USERSPACE_CONFIG_H
diff --git a/keyboards/ergodox_ez/keymaps/bocaj/keymap.c b/keyboards/ergodox_ez/keymaps/bocaj/keymap.c
deleted file mode 100644
index 07117f116..000000000
--- a/keyboards/ergodox_ez/keymaps/bocaj/keymap.c
+++ /dev/null
@@ -1,340 +0,0 @@
1/*
2Copyright 2018 Jacob Jerrell <jacob.jerrell@gmail.com>
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.
7This program is distributed in the hope that it will be useful,
8but WITHOUT ANY WARRANTY; without even the implied warranty of
9MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10GNU General Public License for more details.
11You should have received a copy of the GNU General Public License
12along with this program. If not, see <http://www.gnu.org/licenses/>.
13*/
14#include QMK_KEYBOARD_H
15#include "bocaj.h"
16
17#ifdef UNICODEMAP_ENABLE
18#include "bocaj_unicode.h"
19#endif // UNICODEMAP_ENABLE
20
21const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
22/* Software Workman / QWERTY - http://www.keyboard-layout-editor.com/#/gists/b6c016a22a9d31381a276a603a42fe5f
23 .---------------------------------------------. .---------------------------------------------.
24 | ESC | 1 | 2 | 3 | 4 | 5 | -> | ! - | 6 | 7 | 8 | 9 | 0 | = |
25 !-------+-----+-----+-----+-----+-------------! !-------+-----+-----+-----+-----+-----+-------!
26 | DEL | Q | W | E | R | T | ( | ! ) | Y | U | I | O | P | \ |
27 !-------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+-------!
28 | ADJST | A | S | D | F | G |-------! !-------! H | J | K | L | ; | ' |
29 !-------+-----+-----+-----x-----x-----! HYP ! ! MEH !-----x-----x-----+-----+-----+-------!
30 | SHIFT | Z | X | C | V | B | { | ! } | N | M | , | . | / | SHIFT |
31 '-------+-----+-----+-----+-----+-------------' '-------------+-----+-----+-----+-----+-------'
32 | GAME | NUM | VRS | UP | LFT | .---------------. .---------------. ! RGT | DWN | RSE | LWR | ADJ |
33 '------------------------------' | APP | HOME | ! PGUP | ESC | '------------------------------'
34 .-------+-------+-------! !-------+-------+-------.
35 ! SPACE ! | END | ! PGDN | ! ENTER !
36 ! / ! BSPCE !-------! !-------! TAB ! / !
37 | LOWER | | COPY | ! PASTE | | RAISE |
38 '-----------------------' '-----------------------'
39*/
40 [_SWRKMN] = LAYOUT_ergodox_pretty_wrapper(
41 KC_ESC, ______________________NUMBER_LEFT________________________, JJ_ARRW, KC_MINUS, ______________________NUMBER_RIGHT_______________________, KC_EQUAL,
42 KC_DEL, _______________________SWORKMAN_L1_______________________, KC_LPRN, KC_RPRN, _______________________SWORKMAN_R1_______________________, KC_BSLS,
43 KC_ADJS,_______________________SWORKMAN_L2_______________________, _______________________SWORKMAN_R2_______________________, KC_QUOTE,
44 KC_LSFT,_______________________SWORKMAN_L3_______________________, HYP_LBK, MEH_RBK, _______________________SWORKMAN_R3_______________________, KC_RSFT,
45 ___________________ERGODOX_BOTTOM_LEFT___________________, ___________________ERGODOX_BOTTOM_RIGHT__________________,
46 ______________________ERGODOX_THUMBS_____________________
47 ),
48/* Hardware Workman - http://www.keyboard-layout-editor.com/#/gists/7a07cb982ec3597ba3e3d947554225f1
49 .---------------------------------------------. .---------------------------------------------.
50 | ESC | 1 | 2 | 3 | 4 | 5 | -> | ! - | 6 | 7 | 8 | 9 | 0 | = |
51 !-------+-----+-----+-----+-----+-------------! !-------+-----+-----+-----+-----+-----+-------!
52 | DEL | Q | D | R | W | B | ( | ! ) | J | F | U | P | ; | \ |
53 !-------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+-------!
54 | ADJST | A | S | H | T | G |-------! !-------! Y | N | E | O | I | ' |
55 !-------+-----+-----+-----x-----x-----! HYP ! ! MEH !-----x-----x-----+-----+-----+-------!
56 | SHIFT | Z | X | M | C | V | { | ! } | K | L | , | . | / | SHIFT |
57 '-------+-----+-----+-----+-----+-------------' '-------------+-----+-----+-----+-----+-------'
58 | GAME | NUM | VRS | UP | LFT | .---------------. .---------------. ! RGT | DWN | RSE | LWR | ADJ |
59 '------------------------------' | APP | HOME | ! PGUP | ESC | '------------------------------'
60 .-------+-------+-------! !-------+-------+-------.
61 ! SPACE ! | END | ! PGDN | ! ENTER !
62 ! / ! BSPCE !-------! !-------! TAB ! / !
63 | LOWER | | COPY | ! PASTE | | RAISE |
64 '-----------------------' '-----------------------'
65*/
66 [_HWRKMN] = LAYOUT_ergodox_pretty_wrapper(
67 KC_ESC, ______________________NUMBER_LEFT________________________, JJ_ARRW, KC_MINUS, ______________________NUMBER_RIGHT_______________________, KC_EQUAL,
68 KC_DEL, _______________________HWORKMAN_L1_______________________, KC_LPRN, KC_RPRN, _______________________HWORKMAN_R1_______________________, KC_BSLS,
69 KC_ADJS,_______________________HWORKMAN_L2_______________________, _______________________HWORKMAN_R2_______________________, KC_QUOTE,
70 KC_LSFT,_______________________HWORKMAN_L3_______________________, HYP_LBK, MEH_RBK, _______________________HWORKMAN_R3_______________________, KC_RSFT,
71 ___________________ERGODOX_BOTTOM_LEFT___________________, ___________________ERGODOX_BOTTOM_RIGHT__________________,
72 ______________________ERGODOX_THUMBS_____________________
73 ),
74/* Lower - http://www.keyboard-layout-editor.com/#/gists/f1d745a88d1c48ab55e095efd9e7a43a
75 .---------------------------------------------. .---------------------------------------------.
76 | | F1 | F2 | F3 | F4 | F5 | | ! | F6 | F7 | F8 | F9 | F10 | |
77 !-------+-----+-----+-----+-----+-------------! !-------+-----+-----+-----+-----+-----+-------!
78 | ` | 1 | 2 | 3 | 4 | 5 | | ! | 6 | 7 | 8 | 9 | 0 | |
79 !-------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+-------!
80 | | | | | | |-------! !-------! | | | | | |
81 !-------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+-------!
82 | | | | | | | | ! | | | | | | |
83 '-------+-----+-----+-----+-----+-------------' '-------------+-----+-----+-----+-----+-------'
84 | | | | | | .---------------. .---------------. ! | | | | |
85 '------------------------------' | | | ! | | '------------------------------'
86 .-------+-------+-------! !-------+-------+-------.
87 ! ! | | ! | ! !
88 ! ! !-------! !-------! ! !
89 | | | | ! | | |
90 '-----------------------' '-----------------------'
91*/
92 [_LOWER] = LAYOUT_ergodox_pretty_wrapper(
93 _______,_______________________FUNC_LEFT_________________________, _______, _______, _______________________FUNC_RIGHT________________________, _______,
94 KC_GRV ,______________________NUMBER_LEFT________________________, _______, _______, ______________________NUMBER_RIGHT_______________________, _______,
95 _______,_________________________________________________________, _________________________________________________________, _______,
96 _______,_________________________________________________________, _______, _______, _________________________________________________________, _______,
97 _________________________________________________________, _________________________________________________________,
98 ______________________ERGODOX_THUMBS_____________________
99 ),
100/* Raise - http://www.keyboard-layout-editor.com/#/gists/e0f591ec2ce9f24675a02d15c7048b25
101 .---------------------------------------------. .---------------------------------------------.
102 | | F1 | F2 | F3 | F4 | F5 | | ! _ | F6 | F7 | F8 | F9 | F10 | |
103 !-------+-----+-----+-----+-----+-------------! !-------+-----+-----+-----+-----+-----+-------!
104 | ~ | ! | @ | # | $ | % | | ! | ^ | & | * | ( | ) | |
105 !-------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+-------!
106 | | | | | | |-------! !-------! | | | | | |
107 !-------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+-------!
108 | | | | | | | | ! | | | | | | |
109 '-------+-----+-----+-----+-----+-------------' '-------------+-----+-----+-----+-----+-------'
110 | | | | | | .---------------. .---------------. ! | | | | |
111 '------------------------------' | | | ! | | '------------------------------'
112 .-------+-------+-------! !-------+-------+-------.
113 ! ! | | ! | ! !
114 ! ! !-------! !-------! ! !
115 | | | | ! | | |
116 '-----------------------' '-----------------------'
117*/
118 [_RAISE] = LAYOUT_ergodox_pretty_wrapper(
119 _______,_______________________FUNC_LEFT_________________________, _______, KC_UNDS, _______________________FUNC_RIGHT________________________, _______,
120 KC_TILD,______________________SPECIAL_LEFT_______________________, _______, _______, ______________________SPECIAL_RIGHT______________________, _______,
121 _______,_________________________________________________________, _________________________________________________________, _______,
122 _______,_________________________________________________________, _______, _______, _________________________________________________________, _______,
123 _________________________________________________________, _________________________________________________________,
124 ______________________ERGODOX_THUMBS_____________________
125 ),
126 /* Adjust - http://www.keyboard-layout-editor.com/#/gists/dedeae17b35a5d5f745a42aaea78f007
127 .---------------------------------------------. .---------------------------------------------.
128 | | | | | | | EPRM | ! EPRM | | | | | | |
129 !-------+-----+-----+-----+-----+-------------! !-------+-----+-----+-----+-----+-----+-------!
130 | | | | | | | | ! | | 7 | 8 | 9 | * | |
131 !-------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+-------!
132 | | 🔇 | 🔉 | 🔊 | LCK | |-------! !-------! | 4 | 5 | 6 | + | SWRKM |
133 !-------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+-------!
134 | | | | | | | | ! | | 1 | 2 | 3 | - | HWRKM |
135 '-------+-----+-----+-----+-----+-------------' '-------------+-----+-----+-----+-----+-------'
136 | | | | | | .---------------. .---------------. ! 0 | . | , | = | |
137 '------------------------------' | | | ! | | '------------------------------'
138 .-------+-------+-------! !-------+-------+-------.
139 ! ! | | ! | ! !
140 ! ! !-------! !-------! ! !
141 | | | | ! | | |
142 '-----------------------' '-----------------------'
143*/
144 [_ADJUST] = LAYOUT_ergodox_pretty_wrapper(
145 XXXXXXX,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, KC_EPRM, KC_EPRM, XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, XXXXXXX,
146 XXXXXXX,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_KP_7, KC_KP_8, KC_KP_9, KC_PAST, XXXXXXX,
147 _______,KC__MUTE, KC__VOLDOWN, KC__VOLUP, MC_LOCK, XXXXXXX, XXXXXXX, KC_KP_4, KC_KP_5, KC_KP_6, KC_PPLS, KC_SWRK,
148 XXXXXXX,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_KP_1, KC_KP_2, KC_KP_3, KC_PMNS, KC_HWRK,
149 XXXXXXX,_______,XXXXXXX,XXXXXXX,XXXXXXX, KC_KP_0, KC_PDOT, KC_COMM, KC_PEQL, _______,
150 ______________________ERGODOX_THUMBS_____________________
151 ),
152// Diablo - http://www.keyboard-layout-editor.com/#/gists/28476e4237e77d4835ac8a9d7e5f9b2c
153 [_DIABLO] = LAYOUT_ergodox_pretty_wrapper(
154 KC_ESC , KC_V , KC_D ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
155 KC_TAB , KC_S , KC_I , KC_F , KC_T , KC_J ,XXXXXXX, XXXXXXX, XXXXXXX, KC_KP_7, KC_KP_8, KC_KP_9, XXXXXXX, XXXXXXX,
156 KC_Q , KC_1 , KC_2 , KC_3 , KC_4 , KC_M , XXXXXXX, KC_KP_4, KC_KP_5, KC_KP_6, XXXXXXX, XXXXXXX,
157 KC_LSFT,KC_D3_1 ,KC_D3_2 ,KC_D3_3 ,KC_D3_4 ,XXXXXXX ,XXXXXXX, XXXXXXX, XXXXXXX, KC_KP_1, KC_KP_2, KC_KP_3, XXXXXXX, XXXXXXX,
158 _______,ALT_T(KC_Z) ,KC_G ,KC_Y ,XXXXXXX , KC_KP_0, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
159 XXXXXXX, XXXXXXX, XXXXXXX,XXXXXXX,
160 XXXXXXX, XXXXXXX,
161 KC_BTN1,KC_BTN2,KC_DIABLO_CLEAR, XXXXXXX,XXXXXXX,XXXXXXX
162 )
163};
164
165// Defines actions for my custom keycodes
166bool process_record_user(uint16_t keycode, keyrecord_t *record) {
167 switch (keycode) {
168 // KC_COPY and KC_PASTE have problems with different hardware/software mappings
169 // e.g. If the mappings conflict, KC_COPY will send Cmd+M which minimizes the
170 // window and is very annoying. JJ_COPY and JJ_PASTE fix this by sending the
171 // raw character rather than the KC_* code
172 case JJ_COPY:
173 if (!record->event.pressed) {
174 SEND_STRING(SS_LGUI("c"));
175 }
176 return false;
177 break;
178 case JJ_PASTE:
179 if (!record->event.pressed) {
180 SEND_STRING(SS_LGUI("v"));
181 }
182 return false;
183 break;
184 case JJ_ARRW:
185 if (!record->event.pressed) {
186 SEND_STRING("->");
187 }
188 return false;
189 break;
190 case KC_SWRK:
191 if (!record->event.pressed) {
192 set_single_persistent_default_layer(_SWRKMN);
193 layer_move(_SWRKMN);
194 ergodox_blink_all_leds();
195 ergodox_blink_all_leds();
196 }
197 return false;
198 break;
199 case KC_HWRK:
200 if (!record->event.pressed) {
201 set_single_persistent_default_layer(_HWRKMN);
202 layer_move(_HWRKMN);
203 ergodox_blink_all_leds();
204 ergodox_blink_all_leds();
205 }
206 return false;
207 break;
208 case KC_EPRM:
209 if (!record->event.pressed) {
210 ergodox_blink_all_leds();
211 eeconfig_init();
212 }
213 return false;
214 break;
215 case MC_LOCK:
216 if (!record->event.pressed) {
217 layer_move(_HWRKMN);
218 SEND_STRING(SS_LCTRL(SS_LGUI("q")));
219 }
220 return false;
221 break;
222 case KC_DIABLO_CLEAR:
223#ifdef TAP_DANCE_ENABLE
224 if (record->event.pressed) {
225 uint8_t dtime;
226 for (dtime = 0; dtime < 4; dtime++) {
227 diablo_key_time[dtime] = diablo_times[0];
228 }
229 }
230#endif // TAP_DANCE_ENABLE
231 return false;
232 break;
233 }
234 return true;
235}
236
237void tap(uint16_t keycode){ register_code(keycode); unregister_code(keycode); };
238
239// Diablo III Fun stuff
240//define diablo macro timer variables
241uint16_t diablo_timer[4];
242uint8_t diablo_times[] = { 0, 1, 3, 5, 10, 30 };
243uint8_t diablo_key_time[4];
244
245// has the correct number of seconds elapsed (as defined by diablo_times)
246bool check_dtimer(uint8_t dtimer) { return (timer_elapsed(diablo_timer[dtimer]) < (diablo_key_time[dtimer] * 1000)) ? false : true; };
247
248// Cycle through the times for the macro, starting at 0, for disabled.
249// Max of six values, so don't exceed
250void diablo_tapdance_master(qk_tap_dance_state_t *state, void *user_data, uint8_t diablo_key) {
251 if (state->count >= 7) {
252 diablo_key_time[diablo_key] = diablo_times[0];
253 reset_tap_dance(state);
254 } else {
255 diablo_key_time[diablo_key] = diablo_times[state->count - 1];
256 }
257}
258
259// Would rather have one function for all of this, but no idea how to do that...
260void diablo_tapdance1(qk_tap_dance_state_t *state, void *user_data) { diablo_tapdance_master(state, user_data, 0); }
261void diablo_tapdance2(qk_tap_dance_state_t *state, void *user_data) { diablo_tapdance_master(state, user_data, 1); }
262void diablo_tapdance3(qk_tap_dance_state_t *state, void *user_data) { diablo_tapdance_master(state, user_data, 2); }
263void diablo_tapdance4(qk_tap_dance_state_t *state, void *user_data) { diablo_tapdance_master(state, user_data, 3); }
264
265//Tap Dance Definitions
266qk_tap_dance_action_t tap_dance_actions[] = {
267 // tap once to disable, and more to enable timed micros
268 [TD_D3_1] = ACTION_TAP_DANCE_FN(diablo_tapdance1),
269 [TD_D3_2] = ACTION_TAP_DANCE_FN(diablo_tapdance2),
270 [TD_D3_3] = ACTION_TAP_DANCE_FN(diablo_tapdance3),
271 [TD_D3_4] = ACTION_TAP_DANCE_FN(diablo_tapdance4),
272};
273
274// Sends the key press to system, but only if on the Diablo layer
275void send_diablo_keystroke(uint8_t diablo_key) {
276 if (biton32(layer_state) == _DIABLO) {
277 switch (diablo_key) {
278 case 0:
279 tap(KC_1); break;
280 case 1:
281 tap(KC_2); break;
282 case 2:
283 tap(KC_3); break;
284 case 3:
285 tap(KC_4); break;
286 }
287 }
288}
289
290// Checks each of the 4 timers/keys to see if enough time has elapsed
291// Runs the "send string" command if enough time has passed, and resets the timer.
292void run_diablo_macro_check(void) {
293 uint8_t dtime;
294 for (dtime = 0; dtime < 4; dtime++) {
295 if (check_dtimer(dtime) && diablo_key_time[dtime]) {
296 diablo_timer[dtime] = timer_read();
297 send_diablo_keystroke(dtime);
298 }
299 }
300}
301
302void matrix_scan_user(void) {
303 uint8_t layer = biton32(layer_state);
304 ergodox_board_led_off();
305 ergodox_right_led_1_off();
306 ergodox_right_led_2_off();
307 ergodox_right_led_3_off();
308 switch (layer) {
309 /*
310 Lights are treated as binary here for easy identification.
311 LED1 = 4; LED2 = 2; LED1 = 1
312 This allows for up to 8 identified layers (default layers being no lights on)
313 Which is way more than I should ever need
314 */
315 case _LOWER:
316 ergodox_right_led_3_on();
317 ergodox_right_led_3_set(10); // Default brightness is deadly in a dark room
318 break;
319 case _RAISE:
320 ergodox_right_led_2_on();
321 ergodox_right_led_2_set(10);
322 break;
323 case _ADJUST:
324 ergodox_right_led_2_on();
325 ergodox_right_led_2_set(10);
326 ergodox_right_led_3_on();
327 ergodox_right_led_3_set(10);
328 break;
329 case _DIABLO:
330 ergodox_right_led_1_on();
331 ergodox_right_led_1_set(10);
332 break;
333 default:
334 // none
335 break;
336 }
337 #ifdef TAP_DANCE_ENABLE
338 run_diablo_macro_check();
339 #endif
340};
diff --git a/keyboards/ergodox_ez/keymaps/bocaj/readme.md b/keyboards/ergodox_ez/keymaps/bocaj/readme.md
deleted file mode 100644
index 9d5aa6050..000000000
--- a/keyboards/ergodox_ez/keymaps/bocaj/readme.md
+++ /dev/null
@@ -1,48 +0,0 @@
1# Ergodox EZ Layout by JacobJerrell
2
3My personal Ergodox EZ layout.
4
5## Summary
6
7Contains two base layers because I carry my keyboard between different machines and occassionally use the machines without this keyboard. A side-effect to using it in this manner (with a non-QWERTY layout) is that software/hardware mappings conflict so this allows a quick (2-buttons) to get the keyboard to a compatible layer
8
9## Layers
10
11| Layer | Purpose |
12| ----- | ------- |
13| 0 | [Hardware Workman](#hardware-workman) - For OS mapped to QWERTY |
14| 1 | [Software Workman](#software-workman) - For OS mapped to Workman |
15| 2 | [Lower](#lower) |
16| 3 | [Raise](#raise) |
17| 4 | [Adjust](#adjust) |
18| 5 | [Diablo III](#diablo-iii) |
19
20### Hardware Workman
21
22For easy plug and play into QWERTY machines
23![Hardware Workman](https://imgur.com/HHMIOEf.png)
24
25### Software Workman
26
27To switch to when I was previously using the laptop keyboard with software mapped to Workman. Or so other people can take the Ergodox for a spin.
28![Software Workman](https://imgur.com/WnSci7o.png)
29
30### Lower
31
32Reveals F1-12 keys and brings numkeys down.
33![Lowered](https://imgur.com/mGfjwcn.png)
34
35### Raise
36
37Reveals F1-F12 keys and gives shifted numkeys.
38![Raised](https://imgur.com/NC96Jus.png)
39
40### Adjust
41
42Numpad, Wipe EEPROM, OSX Volume Control, OSX Lockscreen, and Default Layer Switching.
43![Adjusted](https://imgur.com/aQtOxZU.png)
44
45### Diablo III
46
47Arranged to make playing on a laptop much more enjoyable. Credit for the D1-4 macros (as well as much of the ideas in this layout goes to Drashna)
48![Diablo III](https://imgur.com/5eQcDOQ.png)
diff --git a/layouts/community/ergodox/bocaj/config.h b/layouts/community/ergodox/bocaj/config.h
new file mode 100644
index 000000000..78350f603
--- /dev/null
+++ b/layouts/community/ergodox/bocaj/config.h
@@ -0,0 +1,6 @@
1#pragma once
2
3#include QMK_KEYBOARD_CONFIG_H
4
5#undef PRODUCT
6#define PRODUCT BocajEZ - Frankensteined ErgoDox EZ
diff --git a/layouts/community/ergodox/bocaj/keymap.c b/layouts/community/ergodox/bocaj/keymap.c
new file mode 100644
index 000000000..fbe0fca65
--- /dev/null
+++ b/layouts/community/ergodox/bocaj/keymap.c
@@ -0,0 +1,246 @@
1/*
2Copyright 2018 Jacob Jerrell jacob.jerrell@gmail.com @JacobJerrell
3
4This program is free software: you can redistribute it and/or modify
5it under the terms of the GNU General Public License as published by
6the Free Software Foundation, either version 2 of the License, or
7(at your option) any later version.
8
9This program is distributed in the hope that it will be useful,
10but WITHOUT ANY WARRANTY; without even the implied warranty of
11MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12GNU General Public License for more details.
13
14You should have received a copy of the GNU General Public License
15along with this program. If not, see <http://www.gnu.org/licenses/>.
16*/
17#include QMK_KEYBOARD_H
18#include "bocaj.h"
19
20const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
21 /* Hardware Workman - http://www.keyboard-layout-editor.com/#/gists/7a07cb982ec3597ba3e3d947554225f1
22 .---------------------------------------------. .---------------------------------------------.
23 | ESC | 1 | 2 | 3 | 4 | 5 | -> | ! - | 6 | 7 | 8 | 9 | 0 | = |
24 !-------+-----+-----+-----+-----+-------------! !-------+-----+-----+-----+-----+-----+-------!
25 | DEL | Q | D | R | W | B | ( | ! ) | J | F | U | P | ; | \ |
26 !-------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+-------!
27 | NUMS | A | S | H | T | G |-------! !-------! Y | N | E | O | I | ' |
28 !-------+-----+-----+-----x-----x-----! HYP ! ! MEH !-----x-----x-----+-----+-----+-------!
29 | SHIFT | Z | X | M | C | V | [ | ! ] | K | L | , | . | / | SHIFT |
30 '-------+-----+-----+-----+-----+-------------' '-------------+-----+-----+-----+-----+-------'
31 | GAME | NUM | LWR | UP | LFT | .---------------. .---------------. ! RGT | DWN | | | ADJ |
32 '------------------------------' | APP | HOME | ! PGUP | ESC | '------------------------------'
33 .-------+-------+-------! !-------+-------+-------.
34 ! ! | END | ! PGDN | ! ENTER !
35 ! SPACE ! BSPCE !-------! !-------! TAB ! / !
36 | | | COPY | ! PASTE | | LOWER |
37 '-----------------------' '-----------------------'
38*/
39 [_HWRKMN] = LAYOUT_ergodox_pretty_wrapper(
40 KC_ESC, _______________________NUMBER_LEFT_______________________, JJ_ARRW, KC_MINUS,_______________________NUMBER_RIGHT______________________, KC_EQUAL,
41 KC_DEL, _______________________HWORKMAN_L1_______________________, KC_LPRN, KC_RPRN, _______________________HWORKMAN_R1_______________________, KC_BSLS,
42 KC_NUMS,_______________________HWORKMAN_L2_______________________, _______________________HWORKMAN_R2_______________________, KC_QUOTE,
43 KC_LSFT,_______________________HWORKMAN_L3_______________________, HYP_LBK, MEH_RBK, _______________________HWORKMAN_R3_______________________, KC_RSFT,
44 ___________________ERGODOX_BOTTOM_LEFT___________________, ___________________ERGODOX_BOTTOM_RIGHT__________________,
45 ______________________ERGODOX_THUMBS_____________________
46 ),
47/* Software Workman / QWERTY - http://www.keyboard-layout-editor.com/#/gists/b6c016a22a9d31381a276a603a42fe5f
48 .---------------------------------------------. .---------------------------------------------.
49 | ESC | 1 | 2 | 3 | 4 | 5 | -> | ! - | 6 | 7 | 8 | 9 | 0 | = |
50 !-------+-----+-----+-----+-----+-------------! !-------+-----+-----+-----+-----+-----+-------!
51 | DEL | Q | W | E | R | T | ( | ! ) | Y | U | I | O | P | \ |
52 !-------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+-------!
53 | NUMS | A | S | D | F | G |-------! !-------! H | J | K | L | ; | ' |
54 !-------+-----+-----+-----x-----x-----! HYP ! ! MEH !-----x-----x-----+-----+-----+-------!
55 | SHIFT | Z | X | C | V | B | [ | ! ] | N | M | , | . | / | SHIFT |
56 '-------+-----+-----+-----+-----+-------------' '-------------+-----+-----+-----+-----+-------'
57 | GAME | NUM | LWR | UP | LFT | .---------------. .---------------. ! RGT | DWN | | | ADJ |
58 '------------------------------' | APP | HOME | ! PGUP | ESC | '------------------------------'
59 .-------+-------+-------! !-------+-------+-------.
60 ! ! | END | ! PGDN | ! ENTER !
61 ! SPACE ! BSPCE !-------! !-------! TAB ! / !
62 | | | COPY | ! PASTE | | LOWER |
63 '-----------------------' '-----------------------'
64*/
65 [_SWRKMN] = LAYOUT_ergodox_pretty_wrapper(
66 KC_ESC, _______________________NUMBER_LEFT_______________________, JJ_ARRW, KC_MINUS,_______________________NUMBER_RIGHT______________________, KC_EQUAL,
67 KC_DEL, _______________________SWORKMAN_L1_______________________, KC_LPRN, KC_RPRN, _______________________SWORKMAN_R1_______________________, KC_BSLS,
68 KC_NUMS,_______________________SWORKMAN_L2_______________________, _______________________SWORKMAN_R2_______________________, KC_QUOTE,
69 KC_LSFT,_______________________SWORKMAN_L3_______________________, HYP_LBK, MEH_RBK, _______________________SWORKMAN_R3_______________________, KC_RSFT,
70 ___________________ERGODOX_BOTTOM_LEFT___________________, ___________________ERGODOX_BOTTOM_RIGHT__________________,
71 ______________________ERGODOX_THUMBS_____________________
72 ),
73/* Lower - http://www.keyboard-layout-editor.com/#/gists/f1d745a88d1c48ab55e095efd9e7a43a
74 .---------------------------------------------. .---------------------------------------------.
75 | ESC | | | | | | -> | ! - | | | | | | = |
76 !-------+-----+-----+-----+-----+-------------! !-------+-----+-----+-----+-----+-----+-------!
77 | DEL | ! | @ | # | $ | % | ( | ! ) | ^ | & | * | ( | ) | \ |
78 !-------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+-------!
79 | ` | 1 | 2 | 3 | 4 | 5 |-------! !-------! 6 | 7 | 8 | 9 | 0 | ' |
80 !-------+-----+-----+-----x-----x-----! HYP ! ! MEH !-----x-----x-----+-----+-----+-------!
81 | SHIFT | | | | | | [ | ! ] | | | | | | SHIFT |
82 '-------+-----+-----+-----+-----+-------------' '-------------+-----+-----+-----+-----+-------'
83 | GAME | NUM | LWR | UP | LFT | .---------------. .---------------. ! RGT | DWN | | | ADJ |
84 '------------------------------' | APP | HOME | ! PGUP | ESC | '------------------------------'
85 .-------+-------+-------! !-------+-------+-------.
86 ! ! | END | ! PGDN | ! ENTER !
87 ! SPACE ! BSPCE !-------! !-------! TAB ! / !
88 | | | COPY | ! PASTE | | LOWER |
89 '-----------------------' '-----------------------'
90*/
91 [_LOWER] = LAYOUT_ergodox_pretty_wrapper(
92 _______,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, _______, _______, XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, _______,
93 _______,_______________________SPECIAL_LEFT______________________, _______, _______, _______________________SPECIAL_RIGHT_____________________, _______,
94 KC_GRV ,_______________________NUMBER_LEFT_______________________, _______________________NUMBER_RIGHT______________________, _______,
95 _______,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, _______, _______, XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, _______,
96 _________________________________________________________, _________________________________________________________,
97 ______________________ERGODOX_THUMBS_____________________
98 ),
99 /* Adjust - http://www.keyboard-layout-editor.com/#/gists/dedeae17b35a5d5f745a42aaea78f007
100 .---------------------------------------------. .---------------------------------------------.
101 | | | | | | | EPRM | ! EPRM | | | | | | |
102 !-------+-----+-----+-----+-----+-------------! !-------+-----+-----+-----+-----+-----+-------!
103 | | | | | | | | ! | | | | | | |
104 !-------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+-------!
105 | | 🔇 | 🔉 | 🔊 | LCK | |-------! !-------! | | | | | SWRKM |
106 !-------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+-------!
107 | | | | | | | | ! | | | | | | HWRKM |
108 '-------+-----+-----+-----+-----+-------------' '-------------+-----+-----+-----+-----+-------'
109 | | | | | | .---------------. .---------------. ! | | | | |
110 '------------------------------' | | | ! | | '------------------------------'
111 .-------+-------+-------! !-------+-------+-------.
112 ! ! | | ! | ! !
113 ! ! !-------! !-------! ! !
114 | | | | ! | | |
115 '-----------------------' '-----------------------'
116*/
117 [_ADJUST] = LAYOUT_ergodox_pretty_wrapper(
118 XXXXXXX,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, KC_EPRM, KC_EPRM, XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, XXXXXXX,
119 XXXXXXX,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
120 XXXXXXX,KC__MUTE, KC__VOLDOWN, KC__VOLUP, MC_LOCK, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_SWRK,
121 XXXXXXX,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_HWRK,
122 XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______,
123 ______________________ERGODOX_THUMBS_____________________
124 ),
125 [_NUMS] = LAYOUT_ergodox_pretty_wrapper(
126 XXXXXXX,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, XXXXXXX, XXXXXXX, XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, XXXXXXX,
127 XXXXXXX,XXXXXXX, XXXXXXX, KC_UP, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_KP_7, KC_KP_8, KC_KP_9, KC_PAST, XXXXXXX,
128 _______,XXXXXXX, KC_LEFT, KC_DOWN, KC_RIGHT, XXXXXXX, XXXXXXX, KC_KP_4, KC_KP_5, KC_KP_6, KC_PPLS, XXXXXXX,
129 LM_SHFT,XXXXXXX, XXXXXXX, XXXXXXX, JJ_COPY, JJ_PSTE, XXXXXXX, XXXXXXX, XXXXXXX, KC_KP_1, KC_KP_2, KC_KP_3, KC_PMNS, XXXXXXX,
130 XXXXXXX,_______,XXXXXXX,XXXXXXX,XXXXXXX, KC_KP_0, KC_PDOT, KC_COMM, KC_PEQL, XXXXXXX,
131 _______, _______, _______,_______,
132 _______, _______,
133 KC_LALT,KC_LGUI,_______, _______,_______,_______
134 ),
135 [_NMOD] = LAYOUT_ergodox_pretty_wrapper(
136 XXXXXXX,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, XXXXXXX, XXXXXXX, XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, XXXXXXX,
137 XXXXXXX,XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, _______, XXXXXXX,
138 XXXXXXX,XXXXXXX, _______, _______, _______, XXXXXXX, XXXXXXX, _______, _______, _______, _______, XXXXXXX,
139 LM_SHFT,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, _______, XXXXXXX,
140 XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, _______, _______, _______, _______, XXXXXXX,
141 XXXXXXX, XXXXXXX, XXXXXXX,XXXXXXX,
142 XXXXXXX, XXXXXXX,
143 KC_LALT,KC_LGUI,XXXXXXX, XXXXXXX,XXXXXXX,XXXXXXX
144 ),
145// Diablo - http://www.keyboard-layout-editor.com/#/gists/28476e4237e77d4835ac8a9d7e5f9b2c
146 [_DIABLO] = LAYOUT_ergodox_pretty_wrapper(
147 KC_ESC , XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
148 KC_TAB , KC_Q ,ALT_T(KC_S), KC_I , KC_F , KC_J ,KC_MINS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
149 KC_LOCK, KC_1 , KC_2 , KC_3 , KC_4 ,KC_DCLR , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
150 KC_LSFT, KC_D3_1 , KC_D3_2 , KC_D3_3 , KC_D3_4 , KC_T ,KC_MINS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
151 _______, XXXXXXX , XXXXXXX , XXXXXXX , KC_M , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
152 XXXXXXX, XXXXXXX, XXXXXXX,XXXXXXX,
153 XXXXXXX, XXXXXXX,
154 KC_BTN1,KC_BTN2,KC_ENTER, XXXXXXX,XXXXXXX,XXXXXXX
155 )
156};
157
158bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
159 uint8_t default_layer = 0;
160 default_layer = eeconfig_read_default_layer();
161 switch (keycode) {
162 case KC_SWRK:
163 if (!record->event.pressed) {
164 set_single_persistent_default_layer(_SWRKMN);
165 layer_move(default_layer);
166 ergodox_blink_all_leds();
167 ergodox_blink_all_leds();
168 }
169 return false;
170 break;
171 case KC_HWRK:
172 if (!record->event.pressed) {
173 set_single_persistent_default_layer(_HWRKMN);
174 layer_move(default_layer);
175 ergodox_blink_all_leds();
176 ergodox_blink_all_leds();
177 }
178 return false;
179 break;
180 case KC_EPRM:
181 if (!record->event.pressed) {
182 ergodox_blink_all_leds();
183 eeconfig_init();
184 }
185 return false;
186 break;
187 case MC_LOCK:
188 if (!record->event.pressed) {
189 layer_move(default_layer);
190 SEND_STRING(SS_LCTRL(SS_LGUI("q")));
191 }
192 return false;
193 break;
194 }
195 return true;
196}
197
198void matrix_init_keymap(void) {};
199
200void matrix_scan_keymap(void) {
201 uint8_t layer = biton32(layer_state);
202 ergodox_board_led_off();
203 ergodox_right_led_1_off();
204 ergodox_right_led_2_off();
205 ergodox_right_led_3_off();
206 switch (layer) {
207 /*
208 Lights are treated as binary here for easy identification.
209 LED1 = 4; LED2 = 2; LED1 = 1
210 This allows for up to 8 identified layers (default layers being no lights on)
211 Which is way more than I should ever need
212 */
213 case _LOWER:
214 ergodox_right_led_3_on();
215 ergodox_right_led_3_set(10); // Default brightness is deadly in a dark room
216 break;
217 case _ADJUST:
218 ergodox_right_led_2_on();
219 ergodox_right_led_2_set(10);
220 break;
221 case _NUMS:
222 ergodox_right_led_2_on();
223 ergodox_right_led_2_set(10);
224 ergodox_right_led_3_on();
225 ergodox_right_led_3_set(10);
226 break;
227 case _NMOD:
228 ergodox_right_led_1_on();
229 ergodox_right_led_1_set(10);
230 ergodox_right_led_2_on();
231 ergodox_right_led_2_set(10);
232 ergodox_right_led_3_on();
233 ergodox_right_led_3_set(10);
234 break;
235 case _DIABLO:
236 ergodox_right_led_1_on();
237 ergodox_right_led_1_set(10);
238 break;
239 default:
240 // none
241 break;
242 }
243 /* #ifdef TAP_DANCE_ENABLE
244 run_diablo_macro_check();
245 #endif */
246};
diff --git a/keyboards/ergodox_ez/keymaps/bocaj/rules.mk b/layouts/community/ergodox/bocaj/rules.mk
index b667841a1..037bca2b6 100644
--- a/keyboards/ergodox_ez/keymaps/bocaj/rules.mk
+++ b/layouts/community/ergodox/bocaj/rules.mk
@@ -3,3 +3,4 @@ COMMAND_ENABLE = no
3SWAP_HANDS_ENABLE = no 3SWAP_HANDS_ENABLE = no
4TAP_DANCE_ENABLE = yes 4TAP_DANCE_ENABLE = yes
5EXTRAKEY_ENABLE = no 5EXTRAKEY_ENABLE = no
6KEY_LOCK_ENABLE = yes
diff --git a/users/bocaj/bocaj.c b/users/bocaj/bocaj.c
new file mode 100644
index 000000000..6df6e3bbf
--- /dev/null
+++ b/users/bocaj/bocaj.c
@@ -0,0 +1,177 @@
1#include "bocaj.h"
2#include "eeprom.h"
3#include "version.h"
4#include "tap_dances.h"
5
6static uint16_t copy_paste_timer;
7userspace_config_t userspace_config;
8
9/* *** *** *** *** *
10 * Helper Functions *
11 * *** *** *** *** */
12void tap(uint16_t keycode){ register_code(keycode); unregister_code(keycode); };
13
14// Add reconfigurable functions here, for keymap customization
15// This allows for a global, userspace functions, and continued
16// customization of the keymap. Use _keymap instead of _user
17// functions in the keymaps
18__attribute__ ((weak))
19void matrix_init_keymap(void) {}
20
21__attribute__ ((weak))
22void startup_keymap(void) {}
23
24__attribute__ ((weak))
25void suspend_power_down_keymap(void) {}
26
27__attribute__ ((weak))
28void suspend_wakeup_init_keymap(void) {}
29
30__attribute__ ((weak))
31void matrix_scan_keymap(void) {}
32
33__attribute__ ((weak))
34bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
35 return true;
36}
37
38__attribute__ ((weak))
39bool process_record_secrets(uint16_t keycode, keyrecord_t *record) {
40 return true;
41}
42
43
44__attribute__ ((weak))
45uint32_t layer_state_set_keymap (uint32_t state) {
46 return state;
47}
48
49__attribute__ ((weak))
50uint32_t default_layer_state_set_keymap (uint32_t state) {
51 return state;
52}
53
54__attribute__ ((weak))
55void led_set_keymap(uint8_t usb_led) {}
56
57// Call user matrix init, set default RGB colors and then
58// call the keymap's init function
59void matrix_init_user(void) {
60 userspace_config.raw = eeprom_read_byte(EECONFIG_USERSPACE);
61 matrix_init_keymap();
62}
63
64void startup_user (void) {
65 startup_keymap();
66}
67
68void suspend_power_down_user(void)
69{
70 suspend_power_down_keymap();
71}
72
73void suspend_wakeup_init_user(void)
74{
75 suspend_wakeup_init_keymap();
76 #ifdef KEYBOARD_ergodox_ez
77 wait_ms(10);
78 #endif
79}
80
81// No global matrix scan code, so just run keymap's matrix
82// scan function
83void matrix_scan_user(void) {
84 static bool has_ran_yet;
85 if (!has_ran_yet) {
86 has_ran_yet = true;
87 startup_user();
88 }
89
90#ifdef TAP_DANCE_ENABLE // Run Diablo 3 macro checking code.
91 run_diablo_macro_check();
92#endif // TAP_DANCE_ENABLE
93
94 matrix_scan_keymap();
95}
96
97bool process_record_user(uint16_t keycode, keyrecord_t *record) {
98 /* uint8_t default_layer = 0;
99 default_layer = eeconfig_read_default_layer(); */
100 switch (keycode) {
101 case JJ_COPY:
102 if (!record->event.pressed) {
103 SEND_STRING(SS_LGUI("c"));
104 }
105 return false;
106 break;
107 case JJ_PSTE:
108 if (!record->event.pressed) {
109 SEND_STRING(SS_LGUI("v"));
110 }
111 return false;
112 break;
113 case JJ_ARRW:
114 if (!record->event.pressed) {
115 SEND_STRING("->");
116 }
117 return false;
118 break; /*
119 case KC_SWRK:
120 if (!record->event.pressed) {
121 set_single_persistent_default_layer(_SWRKMN);
122 layer_move(default_layer);
123 //ergodox_blink_all_leds();
124 //ergodox_blink_all_leds();
125 }
126 return false;
127 break;
128 case KC_HWRK:
129 if (!record->event.pressed) {
130 set_single_persistent_default_layer(_HWRKMN);
131 layer_move(default_layer);
132 //ergodox_blink_all_leds();
133 //ergodox_blink_all_leds();
134 }
135 return false;
136 break;
137 case KC_EPRM:
138 if (!record->event.pressed) {
139 //ergodox_blink_all_leds();
140 eeconfig_init();
141 }
142 return false;
143 break;
144 case MC_LOCK:
145 if (!record->event.pressed) {
146 layer_move(default_layer);
147 SEND_STRING(SS_LCTRL(SS_LGUI("q")));
148 }
149 return false;
150 break; */
151 case KC_DCLR:
152#ifdef TAP_DANCE_ENABLE
153 if (record->event.pressed) {
154 uint8_t dtime;
155 for (dtime = 0; dtime < 4; dtime++) {
156 diablo_key_time[dtime] = diablo_times[0];
157 }
158 }
159#endif // !TAP_DANCE_ENABLE
160 return false;
161 break;
162 case KC_CCCV:
163 if (record->event.pressed) {
164 copy_paste_timer = timer_read();
165 } else {
166 if (timer_elapsed(copy_paste_timer) > TAPPING_TERM) { // Hold, copy
167 SEND_STRING(SS_LGUI("c"));
168 } else {
169 SEND_STRING(SS_LGUI("v"));
170 }
171 }
172 return false;
173 break;
174 }
175 return process_record_keymap(keycode, record);
176}
177
diff --git a/keyboards/ergodox_ez/keymaps/bocaj/bocaj.h b/users/bocaj/bocaj.h
index 2c41c01aa..7b537397f 100644
--- a/keyboards/ergodox_ez/keymaps/bocaj/bocaj.h
+++ b/users/bocaj/bocaj.h
@@ -1,94 +1,89 @@
1/* 1#ifndef USERSPACE
2Copyright 2018 Jacob Jerrell <jacob.jerrell@gmail.com> 2#define USERSPACE
3
4This program is free software: you can redistribute it and/or modify
5it under the terms of the GNU General Public License as published by
6the Free Software Foundation, either version 2 of the License, or
7(at your option) any later version.
8
9This program is distributed in the hope that it will be useful,
10but WITHOUT ANY WARRANTY; without even the implied warranty of
11MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12GNU General Public License for more details.
13
14You should have received a copy of the GNU General Public License
15along with this program. If not, see <http://www.gnu.org/licenses/>.
16*/
17 3
18#include "quantum.h" 4#include "quantum.h"
19 5
20// Layers 6/* *** *** *** *** *** *
21enum layers { 7 * Define layer names *
22 _SWRKMN = 0, 8 * *** *** *** *** *** */
23 _HWRKMN, 9enum userspace_layers {
10 _HWRKMN = 0,
11 _SWRKMN,
24 _LOWER, 12 _LOWER,
25 _RAISE,
26 _ADJUST, 13 _ADJUST,
14 _NUMS,
15 _NMOD,
27 _DIABLO 16 _DIABLO
28}; 17};
29 18
19#define EECONFIG_USERSPACE (uint8_t *)19
20typedef union {
21 uint8_t raw;
22} userspace_config_t;
30 23
31 24/* *** *** *** *** *** *** *
32enum custom_keycodes { 25 * Define Custom Keycodes *
33 KC_EPRM = SAFE_RANGE, 26 * *** *** *** *** *** *** */
27enum userspace_custom_keycodes {
28 KC_EPRM = SAFE_RANGE, // can always be here
34 KC_SWRK, 29 KC_SWRK,
35 KC_HWRK, 30 KC_HWRK,
36 KC_VRSN, 31 KC_VRSN,
37 JJ_COPY, 32 JJ_COPY,
38 JJ_PASTE, 33 JJ_PSTE,
39 JJ_ARRW, 34 JJ_ARRW,
35 KC_CCCV,
40 MC_LOCK, 36 MC_LOCK,
41 KC_DIABLO_CLEAR, 37 KC_DCLR,
42 KC_NMPD 38 NEW_SAFE_RANGE //use "NEWPLACEHOLDER for keymap specific codes
43// UC_FLIP
44}; 39};
45 40
46// Space Cadet Hyper/Meh and [/] 41// Space Cadet Hyper/Meh and [/]
47#define HYP_LBK ALL_T(KC_LBRACKET) 42#define HYP_LBK ALL_T(KC_LBRACKET)
48#define MEH_RBK MEH_T(KC_RBRACKET) 43#define MEH_RBK MEH_T(KC_RBRACKET)
49 44
50#define KC_LWSP LT(_LOWER, KC_SPACE) 45// Layout beauti-/simpli-fication
51#define KC_RSEN LT(_RAISE, KC_ENTER) 46#define KC_LWEN LT(_LOWER, KC_ENTER)
52#define KC_ADJS TT(_ADJUST) 47#define KC_ADJS TT(_ADJUST)
53 48#define KC_NUMS TT(_NUMS)
49#define LM_SHFT LM(_NMOD, MOD_LSFT)
54#define XXXXXXX KC_NO 50#define XXXXXXX KC_NO
55#define _______ KC_TRNS 51#define _______ KC_TRNS
56 52
53void tap(uint16_t keycode);
54
55/* *** *** *** *** *** *** *
56 * Diablo 3 Macro Handling *
57 * *** *** *** *** *** *** */
58
59// If Tap Dancing is enabled, we manage that here.
60// If it is not, then we define the KC_D3_# codes gracefully
57#ifdef TAP_DANCE_ENABLE 61#ifdef TAP_DANCE_ENABLE
58enum { 62enum {
59 TD_D3_1 = 0, 63 TD_D3_1 = 0,
60 TD_D3_2, 64 TD_D3_2,
61 TD_D3_3, 65 TD_D3_3,
62 TD_D3_4 66 TD_D3_4,
63}; 67};
64#endif // TAP_DANCE_ENABLE
65 68
66// Custom Keycodes for Diablo 3 layer
67// But since TD() doesn't work when tap dance is disabled
68// We use custom codes here, so we can substitute the right stuff
69#ifdef TAP_DANCE_ENABLE
70#define KC_D3_1 TD(TD_D3_1) 69#define KC_D3_1 TD(TD_D3_1)
71#define KC_D3_2 TD(TD_D3_2) 70#define KC_D3_2 TD(TD_D3_2)
72#define KC_D3_3 TD(TD_D3_3) 71#define KC_D3_3 TD(TD_D3_3)
73#define KC_D3_4 TD(TD_D3_4) 72#define KC_D3_4 TD(TD_D3_4)
74#else // TAP_DANCE_ENABLE 73#else // !TAP_DANCE_ENABLE
75#define KC_D3_1 KC_1 74#define KC_D3_1 KC_1
76#define KC_D3_2 KC_2 75#define KC_D3_2 KC_2
77#define KC_D3_3 KC_3 76#define KC_D3_3 KC_3
78#define KC_D3_4 KC_4 77#define KC_D3_4 KC_4
79#endif // TAP_DANCE_ENABLE 78#endif // TAP_DANCE_ENABLE
80 79
81//define diablo macro timer variables 80// Wrapper for handling of keymap 'blocks'
82extern uint16_t diablo_timer[4]; 81// not 100% sure what this first part does. Credit to Drashna
83extern uint8_t diablo_times[]; 82#if (!defined(LAYOUT) && defined(KEYMAP))
84extern uint8_t diablo_key_time[4]; 83#define LAYOUT KEYMAP
85 84#endif
86
87void run_diablo_macro_check(void);
88
89 85
90#define LAYOUT_ergodox_pretty_wrapper(...) LAYOUT_ergodox_pretty(__VA_ARGS__) 86#define LAYOUT_ergodox_pretty_wrapper(...) LAYOUT_ergodox_pretty(__VA_ARGS__)
91
92/* Pretty Layout 87/* Pretty Layout
93.---------------------------------------------. .---------------------------------------------. 88.---------------------------------------------. .---------------------------------------------.
94| 1 | 2 | 3 | 4 | 5 | 6 | 7 | ! 8 | 9 | 10 | 11 | 12 | 13 | 14 | 89| 1 | 2 | 3 | 4 | 5 | 6 | 7 | ! 8 | 9 | 10 | 11 | 12 | 13 | 14 |
@@ -108,18 +103,6 @@ void run_diablo_macro_check(void);
108 '-----------------------' '-----------------------' 103 '-----------------------' '-----------------------'
109*/ 104*/
110 105
111#define ______________________NUMBER_LEFT________________________ KC_1, KC_2, KC_3, KC_4, KC_5
112#define ______________________NUMBER_RIGHT_______________________ KC_6, KC_7, KC_8, KC_9, KC_0
113
114#define ______________________SPECIAL_LEFT_______________________ KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC
115#define ______________________SPECIAL_RIGHT______________________ KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN
116
117#define _______________________FUNC_LEFT_________________________ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5
118#define _______________________FUNC_RIGHT________________________ KC_F6, KC_F7, KC_F8, KC_F9, KC_F10
119
120#define _________________________________________________________ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
121#define XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX KC_NO, KC_NO, KC_NO, KC_NO, KC_NO
122
123#define _______________________SWORKMAN_L1_______________________ KC_Q, KC_W, KC_E, KC_R, KC_T 106#define _______________________SWORKMAN_L1_______________________ KC_Q, KC_W, KC_E, KC_R, KC_T
124#define _______________________SWORKMAN_L2_______________________ KC_A, SFT_T(KC_S), GUI_T(KC_D), ALT_T(KC_F), KC_G 107#define _______________________SWORKMAN_L2_______________________ KC_A, SFT_T(KC_S), GUI_T(KC_D), ALT_T(KC_F), KC_G
125#define _______________________SWORKMAN_L3_______________________ CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B 108#define _______________________SWORKMAN_L3_______________________ CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B
@@ -137,10 +120,22 @@ void run_diablo_macro_check(void);
137#define _______________________HWORKMAN_R2_______________________ KC_Y, ALT_T(KC_N), GUI_T(KC_E), SFT_T(KC_O), KC_I 120#define _______________________HWORKMAN_R2_______________________ KC_Y, ALT_T(KC_N), GUI_T(KC_E), SFT_T(KC_O), KC_I
138#define _______________________HWORKMAN_R3_______________________ KC_K, KC_L, KC_COMM, KC_DOT, CTL_T(KC_SLASH) 121#define _______________________HWORKMAN_R3_______________________ KC_K, KC_L, KC_COMM, KC_DOT, CTL_T(KC_SLASH)
139 122
140#define ___________________ERGODOX_BOTTOM_LEFT___________________ TT(_DIABLO), TT(_ADJUST), XXXXXXX, KC_UP, KC_LEFT 123#define ___________________ERGODOX_BOTTOM_LEFT___________________ TT(_DIABLO), KC_NUMS, TT(_LOWER), KC_UP, KC_LEFT
141#define ___________________ERGODOX_BOTTOM_RIGHT__________________ KC_RIGHT, KC_DOWN, TT(_RAISE), TT(_LOWER), TT(_ADJUST) 124#define ___________________ERGODOX_BOTTOM_RIGHT__________________ KC_RIGHT, KC_DOWN, XXXXXXX, XXXXXXX, TT(_ADJUST)
125
126#define _______________________NUMBER_LEFT_______________________ KC_1, KC_2, KC_3, KC_4, KC_5
127#define _______________________NUMBER_RIGHT______________________ KC_6, KC_7, KC_8, KC_9, KC_0
128
129#define _______________________SPECIAL_LEFT______________________ KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC
130#define _______________________SPECIAL_RIGHT_____________________ KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN
131
132#define _________________________________________________________ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
133#define XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX KC_NO, KC_NO, KC_NO, KC_NO, KC_NO
142 134
143// LEFT | RIGHT 135// LEFT | RIGHT
144#define ______________________ERGODOX_THUMBS_____________________ KC_APP,KC_HOME, KC_PGUP,KC_ESC, \ 136#define ______________________ERGODOX_THUMBS_____________________ KC_APP,KC_HOME, KC_PGUP,KC_ESC, \
145 KC_END, KC_PGDOWN, \ 137 KC_END, KC_PGDOWN, \
146 KC_LWSP,KC_BSPACE,JJ_COPY, JJ_PASTE,KC_TAB,KC_RSEN 138 KC_SPACE,KC_BSPACE,JJ_COPY, JJ_PSTE,KC_TAB,KC_LWEN
139
140
141#endif // !USERSPACE
diff --git a/users/bocaj/config.h b/users/bocaj/config.h
new file mode 100644
index 000000000..ce5ec65d6
--- /dev/null
+++ b/users/bocaj/config.h
@@ -0,0 +1,33 @@
1#pragma once
2
3#ifndef QMK_KEYS_PER_SCAN
4 #define QMK_KEYS_PER_SCAN 4
5#endif // QMK KEYS PER SCAN
6
7// this makes it possible to do rolling combos (zx) with keys that
8// convert to other keys on hold (z becomes ctrl when you hold it,
9// and when this option isn't enabled, z rapidly followed by x
10// actually sends Ctrl-x. That's bad.)
11#define IGNORE_MOD_TAP_INTERRUPT
12#undef PERMISSIVE_HOLD
13#define PREVENT_STUCK_MODIFIERS
14
15#ifdef TAPPING_TERM
16#undef TAPPING_TERM
17#endif // TAPPING_TERM
18#define TAPPING_TERM 175
19
20// Disable action_get_macro and fn_actions, since we don't use these
21// and it saves on space in the firmware.
22#ifndef NO_DEBUG
23#define NO_DEBUG
24#endif // !NO_DEBUG
25#if !defined(NO_PRINT) && !defined(CONSOLE_ENABLE)
26#define NO_PRINT
27#endif // !NO_PRINT
28#define NO_ACTION_MACRO
29#define NO_ACTION_FUNCTION
30
31#define DISABLE_LEADER
32
33#define MACRO_TIMER 5
diff --git a/users/bocaj/readme.md b/users/bocaj/readme.md
new file mode 100644
index 000000000..bab6d7337
--- /dev/null
+++ b/users/bocaj/readme.md
@@ -0,0 +1,14 @@
1Copyright 2018 Jacob Jerrell jacob.jerrell@gmail.com @JacobJerrell
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/>.
diff --git a/users/bocaj/rules.mk b/users/bocaj/rules.mk
new file mode 100644
index 000000000..17d2772a7
--- /dev/null
+++ b/users/bocaj/rules.mk
@@ -0,0 +1,5 @@
1SRC += bocaj.c
2
3ifeq ($(strip $(TAP_DANCE_ENABLE)), yes)
4 SRC += tap_dances.c
5endif
diff --git a/users/bocaj/tap_dances.c b/users/bocaj/tap_dances.c
new file mode 100644
index 000000000..10767db45
--- /dev/null
+++ b/users/bocaj/tap_dances.c
@@ -0,0 +1,65 @@
1#include "bocaj.h"
2#include "tap_dances.h"
3
4
5//define diablo macro timer variables
6uint16_t diablo_timer[4];
7uint8_t diablo_times[] = { 0, 1, 3, 5, 10, 30 };
8uint8_t diablo_key_time[4];
9
10// has the correct number of seconds elapsed (as defined by diablo_times)
11bool check_dtimer(uint8_t dtimer) { return (timer_elapsed(diablo_timer[dtimer]) < (diablo_key_time[dtimer] * 1000)) ? false : true; };
12
13// Cycle through the times for the macro, starting at 0, for disabled.
14// Max of six values, so don't exceed
15void diablo_tapdance_master(qk_tap_dance_state_t *state, void *user_data, uint8_t diablo_key) {
16 if (state->count >= 7) {
17 diablo_key_time[diablo_key] = diablo_times[0];
18 reset_tap_dance(state);
19 } else {
20 diablo_key_time[diablo_key] = diablo_times[state->count - 1];
21 }
22}
23
24// Would rather have one function for all of this, but no idea how to do that...
25void diablo_tapdance1(qk_tap_dance_state_t *state, void *user_data) { diablo_tapdance_master(state, user_data, 0); }
26void diablo_tapdance2(qk_tap_dance_state_t *state, void *user_data) { diablo_tapdance_master(state, user_data, 1); }
27void diablo_tapdance3(qk_tap_dance_state_t *state, void *user_data) { diablo_tapdance_master(state, user_data, 2); }
28void diablo_tapdance4(qk_tap_dance_state_t *state, void *user_data) { diablo_tapdance_master(state, user_data, 3); }
29
30//Tap Dance Definitions
31qk_tap_dance_action_t tap_dance_actions[] = {
32 // tap once to disable, and more to enable timed micros
33 [TD_D3_1] = ACTION_TAP_DANCE_FN(diablo_tapdance1),
34 [TD_D3_2] = ACTION_TAP_DANCE_FN(diablo_tapdance2),
35 [TD_D3_3] = ACTION_TAP_DANCE_FN(diablo_tapdance3),
36 [TD_D3_4] = ACTION_TAP_DANCE_FN(diablo_tapdance4),
37};
38
39// Sends the key press to system, but only if on the Diablo layer
40void send_diablo_keystroke(uint8_t diablo_key) {
41 if (biton32(layer_state) == _DIABLO) {
42 switch (diablo_key) {
43 case 0:
44 tap(KC_1); break;
45 case 1:
46 tap(KC_2); break;
47 case 2:
48 tap(KC_3); break;
49 case 3:
50 tap(KC_4); break;
51 }
52 }
53}
54
55// Checks each of the 4 timers/keys to see if enough time has elapsed
56// Runs the "send string" command if enough time has passed, and resets the timer.
57void run_diablo_macro_check(void) {
58 uint8_t dtime;
59 for (dtime = 0; dtime < 4; dtime++) {
60 if (check_dtimer(dtime) && diablo_key_time[dtime]) {
61 diablo_timer[dtime] = timer_read();
62 send_diablo_keystroke(dtime);
63 }
64 }
65}
diff --git a/users/bocaj/tap_dances.h b/users/bocaj/tap_dances.h
new file mode 100644
index 000000000..8935753f6
--- /dev/null
+++ b/users/bocaj/tap_dances.h
@@ -0,0 +1,7 @@
1//define diablo macro timer variables
2extern uint16_t diablo_timer[4];
3extern uint8_t diablo_times[];
4extern uint8_t diablo_key_time[4];
5
6
7void run_diablo_macro_check(void);