aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--keyboards/ergodox_ez/keymaps/algernon/Makefile3
-rw-r--r--keyboards/ergodox_ez/keymaps/algernon/images/adore-layer.pngbin0 -> 95615 bytes
-rw-r--r--keyboards/ergodox_ez/keymaps/algernon/images/base-layer.pngbin105162 -> 95654 bytes
-rw-r--r--keyboards/ergodox_ez/keymaps/algernon/images/experimental-layer.pngbin105172 -> 0 bytes
-rw-r--r--keyboards/ergodox_ez/keymaps/algernon/images/heatmap.pngbin0 -> 137912 bytes
-rw-r--r--keyboards/ergodox_ez/keymaps/algernon/keymap.c181
-rw-r--r--keyboards/ergodox_ez/keymaps/algernon/readme.md207
-rw-r--r--keyboards/ergodox_ez/keymaps/algernon/tools/heatmap-base-layout.json533
-rwxr-xr-xkeyboards/ergodox_ez/keymaps/algernon/tools/log-to-heatmap.py145
-rw-r--r--keyboards/ergodox_ez/keymaps/teckinesis/keymap.c455
-rw-r--r--keyboards/ergodox_ez/keymaps/teckinesis/ordinary-special.pngbin0 -> 63065 bytes
-rw-r--r--keyboards/ergodox_ez/keymaps/teckinesis/ordinary-special.txt27
-rw-r--r--keyboards/ergodox_ez/keymaps/teckinesis/readme.md45
-rw-r--r--keyboards/ergodox_ez/keymaps/teckinesis/teckinesis-base.json434
-rw-r--r--keyboards/ergodox_ez/keymaps/teckinesis/teckinesis-base.pngbin0 -> 93743 bytes
-rw-r--r--keyboards/ergodox_ez/keymaps/teckinesis/teckinesis-media.json436
-rw-r--r--keyboards/ergodox_ez/keymaps/teckinesis/teckinesis-media.pngbin0 -> 112216 bytes
-rw-r--r--keyboards/ergodox_ez/keymaps/teckinesis/teckinesis-symbol.json422
-rw-r--r--keyboards/ergodox_ez/keymaps/teckinesis/teckinesis-symbol.pngbin0 -> 97350 bytes
-rw-r--r--keyboards/preonic/keymaps/CMD-Preonic/README.md77
-rw-r--r--keyboards/preonic/keymaps/CMD-Preonic/keymap.c332
-rw-r--r--keyboards/preonic/keymaps/CMD-Preonic/makefile23
-rw-r--r--keyboards/satan/keymaps/default/Makefile21
-rw-r--r--keyboards/satan/keymaps/default/keymap.c32
-rw-r--r--keyboards/satan/keymaps/default/readme.md1
-rw-r--r--keyboards/satan/keymaps/sethbc/keymap.c23
-rw-r--r--keyboards/satan/keymaps/sethbc/readme.md3
-rw-r--r--keyboards/satan/readme.md2
-rw-r--r--keyboards/satan/satan.h2
-rw-r--r--quantum/keymap_extras/keymap_bepo.h4
-rw-r--r--quantum/process_keycode/process_music.c7
-rw-r--r--quantum/process_keycode/process_tap_dance.c111
-rw-r--r--quantum/process_keycode/process_tap_dance.h43
-rw-r--r--readme.md31
35 files changed, 3261 insertions, 340 deletions
diff --git a/.gitignore b/.gitignore
index 7c1e434e3..849143352 100644
--- a/.gitignore
+++ b/.gitignore
@@ -26,3 +26,4 @@ CMakeLists.txt
26.project 26.project
27.settings/ 27.settings/
28.idea 28.idea
29.browse.VC.db* \ No newline at end of file
diff --git a/keyboards/ergodox_ez/keymaps/algernon/Makefile b/keyboards/ergodox_ez/keymaps/algernon/Makefile
index cd7e9e9d2..005f9750c 100644
--- a/keyboards/ergodox_ez/keymaps/algernon/Makefile
+++ b/keyboards/ergodox_ez/keymaps/algernon/Makefile
@@ -3,6 +3,9 @@ COMMAND_ENABLE=no
3SLEEP_LED_ENABLE=no 3SLEEP_LED_ENABLE=no
4UNICODE_ENABLE=no 4UNICODE_ENABLE=no
5FORCE_NKRO ?= yes 5FORCE_NKRO ?= yes
6DEBUG_ENABLE = no
7CONSOLE_ENABLE = yes
8TAP_DANCE_ENABLE = yes
6 9
7ifeq (${FORCE_NKRO},yes) 10ifeq (${FORCE_NKRO},yes)
8OPT_DEFS += -DFORCE_NKRO 11OPT_DEFS += -DFORCE_NKRO
diff --git a/keyboards/ergodox_ez/keymaps/algernon/images/adore-layer.png b/keyboards/ergodox_ez/keymaps/algernon/images/adore-layer.png
new file mode 100644
index 000000000..3df68ea53
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/algernon/images/adore-layer.png
Binary files differ
diff --git a/keyboards/ergodox_ez/keymaps/algernon/images/base-layer.png b/keyboards/ergodox_ez/keymaps/algernon/images/base-layer.png
index c4e298b6b..7b25a05b3 100644
--- a/keyboards/ergodox_ez/keymaps/algernon/images/base-layer.png
+++ b/keyboards/ergodox_ez/keymaps/algernon/images/base-layer.png
Binary files differ
diff --git a/keyboards/ergodox_ez/keymaps/algernon/images/experimental-layer.png b/keyboards/ergodox_ez/keymaps/algernon/images/experimental-layer.png
deleted file mode 100644
index 81155851b..000000000
--- a/keyboards/ergodox_ez/keymaps/algernon/images/experimental-layer.png
+++ /dev/null
Binary files differ
diff --git a/keyboards/ergodox_ez/keymaps/algernon/images/heatmap.png b/keyboards/ergodox_ez/keymaps/algernon/images/heatmap.png
new file mode 100644
index 000000000..356035e0a
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/algernon/images/heatmap.png
Binary files differ
diff --git a/keyboards/ergodox_ez/keymaps/algernon/keymap.c b/keyboards/ergodox_ez/keymaps/algernon/keymap.c
index 2af3d5f8c..09d8dffd5 100644
--- a/keyboards/ergodox_ez/keymaps/algernon/keymap.c
+++ b/keyboards/ergodox_ez/keymaps/algernon/keymap.c
@@ -10,12 +10,13 @@
10#include "mousekey.h" 10#include "mousekey.h"
11#include "timer.h" 11#include "timer.h"
12#include "keymap_plover.h" 12#include "keymap_plover.h"
13#include "eeconfig.h"
13 14
14/* Layers */ 15/* Layers */
15 16
16enum { 17enum {
17 BASE = 0, 18 BASE = 0,
18 EXPRM, 19 ADORE,
19 ARRW, 20 ARRW,
20 APPSEL, 21 APPSEL,
21 HUN, 22 HUN,
@@ -94,7 +95,7 @@ enum {
94/* Custom keycodes */ 95/* Custom keycodes */
95 96
96enum { 97enum {
97 CT_CLN = 0x7101 98 CT_CLN = 0
98}; 99};
99 100
100/* States & timers */ 101/* States & timers */
@@ -114,8 +115,7 @@ uint16_t oh_left_blink_timer = 0;
114uint8_t oh_right_blink = 0; 115uint8_t oh_right_blink = 0;
115uint16_t oh_right_blink_timer = 0; 116uint16_t oh_right_blink_timer = 0;
116 117
117uint8_t ct_cln_count = 0; 118bool log_enable = false;
118uint16_t ct_cln_timer = 0;
119 119
120/* The Keymap */ 120/* The Keymap */
121 121
@@ -124,18 +124,18 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
124/* Keymap 0: Base Layer 124/* Keymap 0: Base Layer
125 * 125 *
126 * ,-----------------------------------------------------. ,-----------------------------------------------------. 126 * ,-----------------------------------------------------. ,-----------------------------------------------------.
127 * | `~ | 1 F1 | 2 F2 | 3 F3 | 4 F4 | 5 F5 | Plvr | | 1HND | 6 F6 | 7 F7 | 8 F8 | 9 F9 | 0 F10| F11 | 127 * | `~ | 1 F1 | 2 F2 | 3 F3 | 4 F4 | 5 F5 | Plvr | | Apps | 6 F6 | 7 F7 | 8 F8 | 9 F9 | 0 F10| F11 |
128 * |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------| 128 * |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------|
129 * | Next/Prev | ' | , | . | P | Y | [ | | ] | F | G | C | R | L | \ | 129 * | Next/Prev | ' | , | . | P | Y | [ | | ] | F | G | C | R | L | \ |
130 * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------| 130 * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
131 * | Tab | A | O | E | U | I |------| |------| D | H | T | N | S | = | 131 * | Tab/ARROW | A | O | E | U | I |------| |------| D | H | T | N | S | = / Arrow |
132 * |-----------+------+------+------+------+------| ( | | ) |------+------+------+------+------+-----------| 132 * |-----------+------+------+------+------+------| ( | | ) |------+------+------+------+------+-----------|
133 * | Play/Pause| / | Q | J | K | X | | | | B | M | W | V | Z | Stop | 133 * | Play/Pause| / | Q | J | K | X | | | | B | M | W | V | Z | Stop |
134 * `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------' 134 * `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------'
135 * | | | Left | Up | : | | - | Down | Rght | | | 135 * | | | | | : | | - | | | | |
136 * `-----------------------------------' `-----------------------------------' 136 * `-----------------------------------' `-----------------------------------'
137 * ,-------------. ,-------------. 137 * ,-------------. ,-------------.
138 * | LAlt | GUI | | MDIA | ARRW | 138 * | LAlt | GUI | | MDIA | 1HND |
139 * ,------|------|------| |------+------+------. 139 * ,------|------|------| |------+------+------.
140 * | | | Ctrl | | LEAD | | | 140 * | | | Ctrl | | LEAD | | |
141 * |Backsp|LShift|------| |------| Enter| Space| 141 * |Backsp|LShift|------| |------| Enter| Space|
@@ -146,67 +146,67 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
146// left hand 146// left hand
147 KC_GRV ,M(KF_1) ,M(KF_2) ,M(KF_3),M(KF_4),M(KF_5),M(A_PLVR) 147 KC_GRV ,M(KF_1) ,M(KF_2) ,M(KF_3),M(KF_4),M(KF_5),M(A_PLVR)
148,M(A_MPN) ,KC_QUOT ,KC_COMM ,KC_DOT ,KC_P ,KC_Y ,KC_LBRC 148,M(A_MPN) ,KC_QUOT ,KC_COMM ,KC_DOT ,KC_P ,KC_Y ,KC_LBRC
149,KC_TAB ,KC_A ,KC_O ,KC_E ,KC_U ,KC_I 149,LT(ARRW,KC_TAB) ,KC_A ,KC_O ,KC_E ,KC_U ,KC_I
150,KC_MPLY ,KC_SLSH ,KC_Q ,KC_J ,KC_K ,KC_X ,KC_LPRN 150,KC_MPLY ,KC_SLSH ,KC_Q ,KC_J ,KC_K ,KC_X ,KC_LPRN
151,KC_NO ,KC_NO ,KC_LEFT ,KC_UP ,CT_CLN 151,KC_NO ,KC_NO ,KC_NO ,KC_NO ,TD(CT_CLN)
152 152
153 ,F(F_ALT),F(F_GUI) 153 ,F(F_ALT),F(F_GUI)
154 ,F(F_CTRL) 154 ,F(F_CTRL)
155 ,KC_BSPC,F(F_SFT),M(A_ESC) 155 ,KC_BSPC,F(F_SFT),M(A_ESC)
156 156
157 // right hand 157 // right hand
158 ,M(OH_LEFT),M(KF_6),M(KF_7),M(KF_8),M(KF_9) ,M(KF_10) ,KC_F11 158 ,KC_APP ,M(KF_6),M(KF_7),M(KF_8),M(KF_9) ,M(KF_10) ,KC_F11
159 ,KC_RBRC ,KC_F ,KC_G ,KC_C ,KC_R ,KC_L ,KC_BSLS 159 ,KC_RBRC ,KC_F ,KC_G ,KC_C ,KC_R ,KC_L ,KC_BSLS
160 ,KC_D ,KC_H ,KC_T ,KC_N ,KC_S ,KC_EQL 160 ,KC_D ,KC_H ,KC_T ,KC_N ,KC_S ,LT(ARRW, KC_EQL)
161 ,KC_RPRN ,KC_B ,KC_M ,KC_W ,KC_V ,KC_Z ,KC_MSTP 161 ,KC_RPRN ,KC_B ,KC_M ,KC_W ,KC_V ,KC_Z ,KC_MSTP
162 ,KC_MINS,KC_DOWN,KC_RGHT ,KC_NO ,KC_NO 162 ,KC_MINS,KC_NO ,KC_NO ,KC_NO ,KC_NO
163 163
164 ,OSL(NMDIA),OSL(ARRW) 164 ,OSL(NMDIA),M(OH_LEFT)
165 ,KC_LEAD 165 ,KC_LEAD
166 ,F(F_HUN) ,KC_ENT ,KC_SPC 166 ,F(F_HUN) ,KC_ENT ,KC_SPC
167 ), 167 ),
168 168
169/* Keymap 1: Experimental layer 169/* Keymap 1: Adore layer
170 * 170 *
171 * ,-----------------------------------------------------. ,-----------------------------------------------------. 171 * ,-----------------------------------------------------. ,-----------------------------------------------------.
172 * | `~ | 1 F1 | 2 F2 | 3 F3 | 4 F4 | 5 F5 | Plvr | | 1HND | 6 F6 | 7 F7 | 8 F8 | 9 F9 | 0 F10| F11 | 172 * | `~ | 1 F1 | 2 F2 | 3 F3 | 4 F4 | 5 F5 | Plvr | | Apps | 6 F6 | 7 F7 | 8 F8 | 9 F9 | 0 F10| F11 |
173 * |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------| 173 * |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------|
174 * | Next/Prev | ' | , | . | P | Y | [ | | ] | L | F | C | R | J | = | 174 * | Next/Prev | , | . | L | W | M | [ | | ] | F | H | C | P | Y | \ |
175 * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------| 175 * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
176 * | Tab | A | O | E | U | I |------| |------| D | H | T | N | S | \ | 176 * | Tab/Arrow | A | O | E | I | U |------| |------| D | R | T | N | S | = / Arrow |
177 * |-----------+------+------+------+------+------| ( | | ) |------+------+------+------+------+-----------| 177 * |-----------+------+------+------+------+------| ( | | ) |------+------+------+------+------+-----------|
178 * | Play/Pause| Z | G | V | K | X | | | | Q | M | W | B | / | Stop | 178 * | Play/Pause| / | Z | ' | K | X | | | | B | G | V | J | Q | Stop |
179 * `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------' 179 * `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------'
180 * | | | Left | Up | : | | - | Down | Rght | | | 180 * | | | | | : | | - | | | | |
181 * `-----------------------------------' `-----------------------------------' 181 * `-----------------------------------' `-----------------------------------'
182 * ,-------------. ,-------------. 182 * ,-------------. ,-------------.
183 * | LAlt | GUI | | MDIA | ARRW | 183 * | LAlt | GUI | | MDIA | 1HND |
184 * ,------|------|------| |------+------+------. 184 * ,------|------|------| |------+------+------.
185 * | | | Ctrl | | LEAD | | | 185 * | | | Ctrl | | LEAD | | |
186 * |Backsp|LShift|------| |------| Enter| Space| 186 * |Backsp|LShift|------| |------| Enter| Space|
187 * | | | ESC | | HUN | | | 187 * | | | ESC | | HUN | | |
188 * `--------------------' `--------------------' 188 * `--------------------' `--------------------'
189 */ 189 */
190[EXPRM] = KEYMAP( 190[ADORE] = KEYMAP(
191// left hand 191// left hand
192 KC_GRV ,M(KF_1) ,M(KF_2) ,M(KF_3),M(KF_4),M(KF_5),M(A_PLVR) 192 KC_GRV ,M(KF_1) ,M(KF_2) ,M(KF_3),M(KF_4),M(KF_5),M(A_PLVR)
193,M(A_MPN) ,KC_QUOT ,KC_COMM ,KC_DOT ,KC_P ,KC_Y ,KC_LBRC 193,M(A_MPN) ,KC_COMM ,KC_DOT ,KC_L ,KC_W ,KC_M ,KC_LBRC
194,KC_TAB ,KC_A ,KC_O ,KC_E ,KC_U ,KC_I 194,LT(ARRW, KC_TAB) ,KC_A ,KC_O ,KC_E ,KC_I ,KC_U
195,KC_MPLY ,KC_Z ,KC_G ,KC_V ,KC_K ,KC_X ,KC_LPRN 195,KC_MPLY ,KC_SLSH ,KC_Z ,KC_QUOT,KC_K ,KC_X ,KC_LPRN
196,KC_NO ,KC_NO ,KC_LEFT ,KC_UP ,CT_CLN 196,KC_NO ,KC_NO ,KC_NO ,KC_NO ,TD(CT_CLN)
197 197
198 ,F(F_ALT),F(F_GUI) 198 ,F(F_ALT),F(F_GUI)
199 ,F(F_CTRL) 199 ,F(F_CTRL)
200 ,KC_BSPC,F(F_SFT),M(A_ESC) 200 ,KC_BSPC,F(F_SFT),M(A_ESC)
201 201
202 // right hand 202 // right hand
203 ,M(OH_LEFT),M(KF_6),M(KF_7),M(KF_8),M(KF_9) ,M(KF_10) ,KC_F11 203 ,KC_APP ,M(KF_6),M(KF_7),M(KF_8),M(KF_9) ,M(KF_10) ,KC_F11
204 ,KC_RBRC ,KC_L ,KC_F ,KC_C ,KC_R ,KC_J ,KC_BSLS 204 ,KC_RBRC ,KC_F ,KC_H ,KC_C ,KC_P ,KC_Y ,KC_BSLS
205 ,KC_D ,KC_H ,KC_T ,KC_N ,KC_S ,KC_EQL 205 ,KC_D ,KC_R ,KC_T ,KC_N ,KC_S ,LT(ARRW, KC_EQL)
206 ,KC_RPRN ,KC_Q ,KC_M ,KC_W ,KC_B ,KC_SLSH ,KC_MSTP 206 ,KC_RPRN ,KC_B ,KC_G ,KC_V ,KC_J ,KC_Q ,KC_MSTP
207 ,KC_MINS,KC_DOWN,KC_RGHT ,KC_NO ,KC_NO 207 ,KC_MINS,KC_NO ,KC_NO ,KC_NO ,KC_NO
208 208
209 ,OSL(NMDIA),OSL(ARRW) 209 ,OSL(NMDIA),M(OH_LEFT)
210 ,KC_LEAD 210 ,KC_LEAD
211 ,F(F_HUN) ,KC_ENT ,KC_SPC 211 ,F(F_HUN) ,KC_ENT ,KC_SPC
212 ), 212 ),
@@ -216,19 +216,19 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
216 * ,-----------------------------------------------------. ,-----------------------------------------------------. 216 * ,-----------------------------------------------------. ,-----------------------------------------------------.
217 * | | | | | | | | | | | | | | | | 217 * | | | | | | | | | | | | | | | |
218 * |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------| 218 * |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------|
219 * | | | | | | | | | | | | | | | | 219 * | | | | | | | | | | | Home | Up | End | | |
220 * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------| 220 * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
221 * | | | | | | |------| |------| | | | | | | 221 * | | | | | | |------| |------| | Left | Down | Rght | | |
222 * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------| 222 * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
223 * | | | | | | | | | | | | | | | | 223 * | | | | | | | | | | | | | | | |
224 * `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------' 224 * `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------'
225 * | | | Home | PgUp | | | | PgDn | End | | | 225 * | | | | | | | | | | | |
226 * `----------------------------------' `----------------------------------' 226 * `----------------------------------' `----------------------------------'
227 * ,-------------. ,-------------. 227 * ,-------------. ,-------------.
228 * | | | | | | 228 * | | | | | |
229 * ,------|------|------| |------+------+------. 229 * ,------|------|------| |------+------+------.
230 * | | | | | | | | 230 * | | | | | | | |
231 * | | |------| |------| | | 231 * | | |------| |------| PgUp | PgDn |
232 * | | | | | | | | 232 * | | | | | | | |
233 * `--------------------' `--------------------' 233 * `--------------------' `--------------------'
234 */ 234 */
@@ -239,7 +239,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
239,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS 239,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
240,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS 240,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
241,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS 241,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
242,KC_TRNS ,KC_TRNS ,KC_HOME ,KC_PGUP ,KC_TRNS 242,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
243 243
244 ,KC_TRNS ,KC_TRNS 244 ,KC_TRNS ,KC_TRNS
245 ,KC_TRNS 245 ,KC_TRNS
@@ -247,14 +247,14 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
247 247
248 // right hand 248 // right hand
249 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS 249 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
250 ,KC_TRNS ,KC_TRNS ,KC_HOME ,KC_UP ,KC_END ,KC_TRNS ,KC_TRNS
251 ,KC_TRNS ,KC_LEFT ,KC_DOWN ,KC_RGHT ,KC_TRNS ,KC_TRNS
250 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS 252 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
251 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS 253 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
252 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
253 ,KC_TRNS ,KC_PGDN ,KC_END ,KC_TRNS ,KC_TRNS
254 254
255 ,KC_TRNS ,KC_TRNS 255 ,KC_TRNS ,KC_TRNS
256 ,KC_TRNS 256 ,KC_TRNS
257 ,KC_TRNS ,KC_TRNS ,KC_TRNS 257 ,KC_TRNS ,KC_PGUP ,KC_PGDN
258 ), 258 ),
259 259
260/* Keymap 3: Application select layer 260/* Keymap 3: Application select layer
@@ -843,8 +843,12 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
843 return MACRO_NONE; 843 return MACRO_NONE;
844}; 844};
845 845
846uint8_t is_adore = 0;
847
846// Runs just one time when the keyboard initializes. 848// Runs just one time when the keyboard initializes.
847void matrix_init_user(void) { 849void matrix_init_user(void) {
850 uint8_t dl;
851
848 ergodox_led_all_on(); 852 ergodox_led_all_on();
849 for (int i = LED_BRIGHTNESS_HI; i > LED_BRIGHTNESS_LO; i--) { 853 for (int i = LED_BRIGHTNESS_HI; i > LED_BRIGHTNESS_LO; i--) {
850 ergodox_led_all_set (i); 854 ergodox_led_all_set (i);
@@ -856,6 +860,12 @@ void matrix_init_user(void) {
856 _delay_ms (10); 860 _delay_ms (10);
857 } 861 }
858 ergodox_led_all_off(); 862 ergodox_led_all_off();
863
864 if (!eeconfig_is_enabled())
865 eeconfig_init();
866 dl = eeconfig_read_default_layer ();
867 if (dl == (1UL << ADORE))
868 is_adore = 1;
859}; 869};
860 870
861LEADER_EXTERNS(); 871LEADER_EXTERNS();
@@ -882,29 +892,32 @@ void ang_tap (uint16_t codes[]) {
882 register_code (code); \ 892 register_code (code); \
883 unregister_code (code) 893 unregister_code (code)
884 894
885uint8_t is_exp = 0; 895void ang_tap_dance (qk_tap_dance_state_t *state) {
886 896 switch (state->keycode) {
887// Runs constantly in the background, in a loop. 897 case TD(CT_CLN):
888void matrix_scan_user(void) { 898 if (state->count == 1) {
889 uint8_t layer = biton32(layer_state);
890
891 if (gui_timer && timer_elapsed (gui_timer) > TAPPING_TERM)
892 unregister_code (KC_LGUI);
893
894 if (ct_cln_timer && timer_elapsed (ct_cln_timer) > TAPPING_TERM) {
895 if (ct_cln_count == 1) {
896 register_code (KC_RSFT); 899 register_code (KC_RSFT);
897 register_code (KC_SCLN); 900 register_code (KC_SCLN);
898 unregister_code (KC_SCLN); 901 unregister_code (KC_SCLN);
899 unregister_code (KC_RSFT); 902 unregister_code (KC_RSFT);
900 } else if (ct_cln_count == 2) { 903 } else if (state->count == 2) {
901 register_code (KC_SCLN); 904 register_code (KC_SCLN);
902 unregister_code (KC_SCLN); 905 unregister_code (KC_SCLN);
906 reset_tap_dance (state);
903 } 907 }
904
905 ct_cln_count = 0;
906 ct_cln_timer = 0;
907 } 908 }
909}
910
911const qk_tap_dance_action_t tap_dance_actions[] = {
912 [CT_CLN] = ACTION_TAP_DANCE_FN (ang_tap_dance)
913};
914
915// Runs constantly in the background, in a loop.
916void matrix_scan_user(void) {
917 uint8_t layer = biton32(layer_state);
918
919 if (gui_timer && timer_elapsed (gui_timer) > TAPPING_TERM)
920 unregister_code (KC_LGUI);
908 921
909 if (layer != OHLFT) 922 if (layer != OHLFT)
910 oh_left_blink = 0; 923 oh_left_blink = 0;
@@ -921,7 +934,7 @@ void matrix_scan_user(void) {
921 ergodox_right_led_1_on (); 934 ergodox_right_led_1_on ();
922 ergodox_right_led_2_on (); 935 ergodox_right_led_2_on ();
923 ergodox_right_led_3_on (); 936 ergodox_right_led_3_on ();
924 } else if (layer == EXPRM) { 937 } else if (layer == ADORE) {
925 ergodox_right_led_1_on (); 938 ergodox_right_led_1_on ();
926 ergodox_right_led_2_on (); 939 ergodox_right_led_2_on ();
927 ergodox_right_led_3_on (); 940 ergodox_right_led_3_on ();
@@ -961,7 +974,7 @@ void matrix_scan_user(void) {
961 ergodox_right_led_1_on (); 974 ergodox_right_led_1_on ();
962 } else { 975 } else {
963 ergodox_right_led_1_set (LED_BRIGHTNESS_LO); 976 ergodox_right_led_1_set (LED_BRIGHTNESS_LO);
964 if (layer != OHLFT && layer != NMDIA && layer != PLVR && layer != EXPRM) 977 if (layer != OHLFT && layer != NMDIA && layer != PLVR && layer != ADORE)
965 ergodox_right_led_1_off (); 978 ergodox_right_led_1_off ();
966 } 979 }
967 980
@@ -971,7 +984,7 @@ void matrix_scan_user(void) {
971 ergodox_right_led_2_on (); 984 ergodox_right_led_2_on ();
972 } else { 985 } else {
973 ergodox_right_led_2_set (LED_BRIGHTNESS_LO); 986 ergodox_right_led_2_set (LED_BRIGHTNESS_LO);
974 if (layer != OHRGT && layer != HUN && layer != OHLFT && layer != NMDIA && layer != PLVR && layer != EXPRM) 987 if (layer != OHRGT && layer != HUN && layer != OHLFT && layer != NMDIA && layer != PLVR && layer != ADORE)
975 ergodox_right_led_2_off (); 988 ergodox_right_led_2_off ();
976 } 989 }
977 990
@@ -981,7 +994,7 @@ void matrix_scan_user(void) {
981 ergodox_right_led_3_on (); 994 ergodox_right_led_3_on ();
982 } else { 995 } else {
983 ergodox_right_led_3_set (LED_BRIGHTNESS_LO); 996 ergodox_right_led_3_set (LED_BRIGHTNESS_LO);
984 if (layer != OHRGT && layer != HUN && layer != PLVR && layer != EXPRM) 997 if (layer != OHRGT && layer != HUN && layer != PLVR && layer != ADORE)
985 ergodox_right_led_3_off (); 998 ergodox_right_led_3_off ();
986 } 999 }
987 1000
@@ -989,6 +1002,10 @@ void matrix_scan_user(void) {
989 leading = false; 1002 leading = false;
990 leader_end (); 1003 leader_end ();
991 1004
1005 SEQ_ONE_KEY (KC_D) {
1006 log_enable = !log_enable;
1007 }
1008
992 SEQ_ONE_KEY (KC_U) { 1009 SEQ_ONE_KEY (KC_U) {
993 ang_do_unicode (); 1010 ang_do_unicode ();
994 } 1011 }
@@ -1036,11 +1053,12 @@ void matrix_scan_user(void) {
1036 unregister_code (KC_LGUI); 1053 unregister_code (KC_LGUI);
1037 } 1054 }
1038 1055
1039 SEQ_ONE_KEY (KC_E) { 1056 SEQ_ONE_KEY (KC_A) {
1040 if (is_exp == 0) { 1057 if (is_adore == 0) {
1041 default_layer_and (0); 1058 default_layer_and (0);
1042 default_layer_or ((1 << EXPRM)); 1059 default_layer_or ((1UL << ADORE));
1043 is_exp = 1; 1060 eeconfig_update_default_layer ((1UL << ADORE));
1061 is_adore = 1;
1044 1062
1045 ergodox_led_all_off (); 1063 ergodox_led_all_off ();
1046 ergodox_right_led_3_on (); 1064 ergodox_right_led_3_on ();
@@ -1054,9 +1072,10 @@ void matrix_scan_user(void) {
1054 _delay_ms (100); 1072 _delay_ms (100);
1055 ergodox_right_led_1_off (); 1073 ergodox_right_led_1_off ();
1056 } else { 1074 } else {
1057 is_exp = 0; 1075 is_adore = 0;
1058 default_layer_and (0); 1076 default_layer_and (0);
1059 default_layer_or (1 << BASE); 1077 default_layer_or (1UL << BASE);
1078 eeconfig_update_default_layer ((1UL << BASE));
1060 1079
1061 ergodox_led_all_off (); 1080 ergodox_led_all_off ();
1062 ergodox_right_led_1_on (); 1081 ergodox_right_led_1_on ();
@@ -1075,29 +1094,11 @@ void matrix_scan_user(void) {
1075} 1094}
1076 1095
1077bool process_record_user (uint16_t keycode, keyrecord_t *record) { 1096bool process_record_user (uint16_t keycode, keyrecord_t *record) {
1078 switch(keycode) { 1097 uint8_t layer = biton32(layer_state);
1079 case CT_CLN:
1080 if (record->event.pressed) {
1081 ct_cln_count++;
1082 ct_cln_timer = timer_read ();
1083 } else {
1084 }
1085 return false;
1086 break;
1087 1098
1088 default: 1099 if (log_enable && layer == BASE) {
1089 if (ct_cln_count == 1) { 1100 xprintf ("KL: col=%d, row=%d\n", record->event.key.col,
1090 register_code (KC_RSFT); 1101 record->event.key.row);
1091 register_code (KC_SCLN);
1092 unregister_code (KC_SCLN);
1093 unregister_code (KC_RSFT);
1094 } else if (ct_cln_count == 2) {
1095 register_code (KC_SCLN);
1096 unregister_code (KC_SCLN);
1097 }
1098 ct_cln_count = 0;
1099 ct_cln_timer = 0;
1100 break;
1101 } 1102 }
1102 1103
1103 return true; 1104 return true;
diff --git a/keyboards/ergodox_ez/keymaps/algernon/readme.md b/keyboards/ergodox_ez/keymaps/algernon/readme.md
index 6b7e8fa2e..2312dc59e 100644
--- a/keyboards/ergodox_ez/keymaps/algernon/readme.md
+++ b/keyboards/ergodox_ez/keymaps/algernon/readme.md
@@ -1,27 +1,28 @@
1<!-- -*- mode: markdown; fill-column: 8192 -*- -->
2
1algernon's layout 3algernon's layout
2======================= 4=======================
3 5
4This is an unconventional layout for the ErgoDox EZ. For more details about the 6This is an unconventional layout for the ErgoDox EZ. For more details about the history of the layout, see my [blog posts about my ErgoDox journey][blog-ergodox].
5history of the layout, see my
6[blog posts about my ErgoDox journey][blog-ergodox].
7 7
8 [blog-ergodox]: https://asylum.madhouse-project.org/blog/tags/ergodox/ 8 [blog-ergodox]: https://asylum.madhouse-project.org/blog/tags/ergodox/
9 9
10Some of the things in the layout only work when one uses Spacemacs and GNOME 10Some of the things in the layout only work when one uses Spacemacs and GNOME under Linux. Your mileage may vary.
11under Linux. Your mileage may vary.
12 11
13## Table of Contents 12## Table of Contents
14 13
15* [Layouts](#layouts) 14* [Layouts](#layouts)
16 - [Base layer](#base-layer) 15 - [Base layer](#base-layer)
17 - [Experimental layer](#experimental-layer) 16 - [ADORE layer](#adore-layer)
18 - [Hungarian layer](#hungarian-layer) 17 - [Hungarian layer](#hungarian-layer)
19 - [Navigation and media layer](#navigation-and-media-layer) 18 - [Navigation and media layer](#navigation-and-media-layer)
20 - [One-handed layer](#one-handed-layer) 19 - [One-handed layer](#one-handed-layer)
21 - [Steno layer](#steno-layer) 20 - [Steno layer](#steno-layer)
22 - [LED states](#led-states) 21 - [LED states](#led-states)
22* [Tools](#tools)
23 - [Heatmap](#heatmap)
23* [Building](#building) 24* [Building](#building)
24 - [Using on Windows](#using-on-windows) 25 - [Using on Windows](#using-on-windows)
25* [Changelog](#changelog) 26* [Changelog](#changelog)
26* [License](#license) 27* [License](#license)
27 28
@@ -31,133 +32,98 @@ under Linux. Your mileage may vary.
31 32
32[![Base layer](images/base-layer.png)](http://www.keyboard-layout-editor.com/#/gists/28f7eb305fdbff943613e1dc7aa9e82b) 33[![Base layer](images/base-layer.png)](http://www.keyboard-layout-editor.com/#/gists/28f7eb305fdbff943613e1dc7aa9e82b)
33 34
34At its core, this is a Dvorak layout, with some minor changes. The more 35At its core, this is a Dvorak layout, with some minor changes. The more interesting parts are how certain keys behave:
35interesting parts are how certain keys behave: 36
36 37* The keys on the number row double as function keys, when held for a bit longer than an usual tap. This allows me to use the function keys without having to switch layers.
37* The keys on the number row double as function keys, when held for a bit longer 38* The `Shift`, `Alt`, and `Control` modifiers are one-shot. When tapped, they are considered active for the next key press only. When double tapped, they toggle on, until a third, single tap sometime later. When held, they act as expected. My usual pattern is that I use these for the next keypress only, so this behaviour is perfect. If I need them held, I'll just double-tap.
38 than an usual tap. This allows me to use the function keys without having to 39* The `GUI` key is special, because when I double-tap it, it sends `GUI + w`, which pops up an application selector. It also switches to a one-shot layer, where the number row on the left half turns into app selector macros, for the most common things I usually want to switch to. Otherwise it behaves as on a normal layout.
39 switch layers. 40* The `ESC` key also doubles as a one-shot cancel key: if tapped while any of the one-shot modifiers are in-flight (as in, single-tapped, and not expired yet), it cancels all one-shot modifiers. It also cancels the **Hun** layer, if active. Otherwise it sends the usual keycode.
40* The `Shift`, `Alt`, and `Control` modifiers are one-shot. When tapped, they 41* The **Media** and **Hun** layer keys are one-shot, the **1Hand** and **STENO** keys are toggles.
41 are considered active for the next key press only. When double tapped, they 42* When holding any of the **Arrow** layer keys, the arrow layer activates while the layer key is held. Tapping the key produces the normal key.
42 toggle on, until a third, single tap sometime later. When held, they act as
43 expected. My usual pattern is that I use these for the next keypress only, so
44 this behaviour is perfect. If I need them held, I'll just double-tap.
45* The `GUI` key is special, because when I double-tap it, it sends `GUI + w`,
46 which pops up an application selector. It also switches to a one-shot layer,
47 where the number row on the left half turns into app selector macros, for the
48 most common things I usually want to switch to. Otherwise it behaves as on a
49 normal layout.
50* The `ESC` key also doubles as a one-shot cancel key: if tapped while any of
51 the one-shot modifiers are in-flight (as in, single-tapped, and not expired
52 yet), it cancels all one-shot modifiers. It also cancels the **Hun** layer, if
53 active. Otherwise it sends the usual keycode.
54* The **Media**, **Arrow**, and **Hun** layer keys are one-shot, the **1Hand**
55 and **STENO** keys are toggles.
56* Toggling the **Arrow** layer toggles between the cursor arrows and the paging
57 keys on the bottom row.
58* Tapping the `:` key once yields `:`, tapping it twice yields `;`. 43* Tapping the `:` key once yields `:`, tapping it twice yields `;`.
59* The **Lead** key allows me to type in a sequence of keys, and trigger some 44* The **Lead** key allows me to type in a sequence of keys, and trigger some actions:
60 actions: 45 - `LEAD u` enters unicode input mode, by sending the GTK+ key sequence that does this.
61 - `LEAD u` enters unicode input mode, by sending the GTK+ key sequence that
62 does this.
63 - `LEAD l` uses the unicode input method to enter a `λ`. 46 - `LEAD l` uses the unicode input method to enter a `λ`.
64 - `LEAD s` does a lot of magic to type in a shruggie: `¯\_(ツ)_/¯` 47 - `LEAD s` does a lot of magic to type in a shruggie: `¯\_(ツ)_/¯`
65 - `LEAD y` types `\o/`. 48 - `LEAD y` types `\o/`.
66 - `LEAD w m` maximises the currently focused window. 49 - `LEAD w m` maximises the currently focused window.
67 - `LEAD e` makes the [experimental layer](#experimental-layer) the default. 50 - `LEAD a` makes the [ADORE layer](#adore-layer) the default.
68 - `LEAD v` prints the firmware version, the keyboard and the keymap. 51 - `LEAD v` prints the firmware version, the keyboard and the keymap.
52 - `LEAD d` toggles logging keypress positions to the HID console.
69 53
70## Experimental layer 54## ADORE layer
71 55
72[![Experimental layer](images/experimental-layer.png)](http://www.keyboard-layout-editor.com/#/gists/6ff50bf71248e05aab5b3fec4fae3d08) 56[![ADORE layer](images/adore-layer.png)](http://www.keyboard-layout-editor.com/#/gists/45681a17453d235925b6028dd83bf12a)
73 57
74While using the standard Dvorak layout, I encountered a number of 58While using the standard Dvorak layout, I encountered a number of inconveniences, and on this layer, I am playing with ideas to make the layout feel better. Initially, it was based on [Capewell-Dvorak][cpd], but that too, had shortcomings I was not happy with. So now this is something inbetween, with own observations thrown in. How it works out in the long run remains to be seen.
75inconveniences, and on this layer, I am playing with ideas to make the layout
76feel better. Initially, it was based on [Capewell-Dvorak][cpd], but that too,
77had shortcomings I was not happy with. So now this is something inbetween, with
78own observations thrown in. How it works out in the long run remains to be seen.
79 59
80 [cpd]: http://www.michaelcapewell.com/projects/keyboard/layout_capewell-dvorak.htm 60 [cpd]: http://www.michaelcapewell.com/projects/keyboard/layout_capewell-dvorak.htm
61
62Based on a week and a half of typing, the keys were rearranged, and the home row neatly spelled out **ADORE**, that gave the layout its name.
81 63
82## Hungarian layer 64## Hungarian layer
83 65
84[![Hungarian layer](images/hun-layer.png)](http://www.keyboard-layout-editor.com/#/gists/b160f6ec90d58c127c114c89f66e9dc9) 66[![Hungarian layer](images/hun-layer.png)](http://www.keyboard-layout-editor.com/#/gists/b160f6ec90d58c127c114c89f66e9dc9)
85 67
86On this layer, the accented characters are at the same position as their base 68On this layer, the accented characters are at the same position as their base variant. For some, which can have other diatribes, the long one is on top, short's on bottom. Tapping any of the accented characters takes us back to the base layer.
87variant. For some, which can have other diatribes, the long one is on top,
88short's on bottom. Tapping any of the accented characters takes us back to the
89base layer.
90 69
91## Navigation and media layer 70## Navigation and media layer
92 71
93[![Navigation and media layer](images/nav-n-media-layer.png)](http://www.keyboard-layout-editor.com/#/gists/c59c453f9fe1a3238ba1494e7e5c6892) 72[![Navigation and media layer](images/nav-n-media-layer.png)](http://www.keyboard-layout-editor.com/#/gists/c59c453f9fe1a3238ba1494e7e5c6892)
94 73
95This layer is primarily for navigating with the cursor or the mouse, and some 74This layer is primarily for navigating with the cursor or the mouse, and some media things.
96media things.
97 75
98## One-handed layer 76## One-handed layer
99 77
100[![One-handed layer](images/one-handed-layer.png)](http://www.keyboard-layout-editor.com/#/gists/edff2495135955b8963198dace7f7ece) 78[![One-handed layer](images/one-handed-layer.png)](http://www.keyboard-layout-editor.com/#/gists/edff2495135955b8963198dace7f7ece)
101 79
102The one-handed layer is used in situations where the right hand is occupied, by 80The one-handed layer is used in situations where the right hand is occupied, by mousing around, for example. Tapping the `OTHER` key switches which side is active. For the most part, keys remain in their usual position. When the right half is active, keys are mirrored to the left half.
103mousing around, for example. Tapping the `OTHER` key switches which side is
104active. For the most part, keys remain in their usual position. When the right
105half is active, keys are mirrored to the left half.
106 81
107The differences are as follows: 82The differences are as follows:
108 83
109* The `ESC` key has been moved to the bottom row, so the `OTHER` key is easier 84* The `ESC` key has been moved to the bottom row, so the `OTHER` key is easier to tap.
110 to tap. 85* Most keys on the thumb cluster now have dual uses, and these do not change when switching sides:
111* Most keys on the thumb cluster now have dual uses, and these do not change 86 - The `Space`/`Backspace` key sends `Space` on tap, `Backspace` when held for longer than a normal tap.
112 when switching sides:
113 - The `Space`/`Backspace` key sends `Space` on tap, `Backspace` when held
114 for longer than a normal tap.
115 - The `Enter`/`Shift` key sends `Enter` on short-tap, `Shift` on long-tap. 87 - The `Enter`/`Shift` key sends `Enter` on short-tap, `Shift` on long-tap.
116* The `Apps`/`BASE` key can be used to go back to the base layer, by 88* The `Apps`/`BASE` key can be used to go back to the base layer, by long-tapping it. A short-tap will send the `App` key, as usual.
117 long-tapping it. A short-tap will send the `App` key, as usual.
118 89
119## Steno layer 90## Steno layer
120 91
121[![Steno layer for Plover](images/steno-layer.png)](http://www.keyboard-layout-editor.com/#/gists/401ef9a84369e47c57f9aedcf0a0d667) 92[![Steno layer for Plover](images/steno-layer.png)](http://www.keyboard-layout-editor.com/#/gists/401ef9a84369e47c57f9aedcf0a0d667)
122 93
123This is to be used with [Plover](http://www.openstenoproject.org/plover/), 94This is to be used with [Plover](http://www.openstenoproject.org/plover/), nothing really fancy here. The **STENO** key toggles the layer on and off, and sends the toggle command to Plover too.
124nothing really fancy here. The **STENO** key toggles the layer on and off, and
125sends the toggle command to Plover too.
126 95
127## LED states 96## LED states
128 97
129The primary purpose of the LEDs is to show the modifier status, a secondary, to 98The primary purpose of the LEDs is to show the modifier status, a secondary, to show which layer is active. Each modifier, `Shift`, `Alt` and `Control` each have their designated LEDs: the *red*, *green* and *blue*, respectively. When a modifier is in a one-shot state, the respective LED will turn on with a dimmer light. If the modifier is toggled on, the brightness of the LED turns full.
130show which layer is active. Each modifier, `Shift`, `Alt` and `Control` each
131have their designated LEDs: the *red*, *green* and *blue*, respectively. When a
132modifier is in a one-shot state, the respective LED will turn on with a dimmer
133light. If the modifier is toggled on, the brightness of the LED turns full.
134 99
135For the layers, the following rules apply: 100For the layers, the following rules apply:
136 101
137* When the [Experimental layer](#experimental-layer) is toggled on, LEDs will 102* When the [ADORE layer](#adore-layer) is toggled on, LEDs will light up from left to right in a sequence, then turn off. When the layer is toggled off, the LEDs light up and turn off in the other direction. No LEDs are on while the layer is active.
138 light up from left to right in a sequence, then turn off. When the layer is 103* When the [Hungarian layer](#hungarian-layer) is active, the *green* and *blue* LEDs are on.
139 toggled off, the LEDs light up and turn off in the other direction. No LEDs 104* When the [Navigation and media layer](#navigation-and-media-layer) is active, the *red* and *green* ones are on.
140 are on while the layer is active. 105* When the [One-handed layer](#one-handed-layer) is active, the *green* LED is on and bright, and either the *red* or the *blue* one is going to slowly blink, depending on the currently active side.
141* When the [Hungarian layer](#hungarian-layer) is active, the *green* and *blue*
142 LEDs are on.
143* When the [Navigation and media layer](#navigation-and-media-layer) is active,
144 the *red* and *green* ones are on.
145* When the [One-handed layer](#one-handed-layer) is active, the *green* LED is
146 on and bright, and either the *red* or the *blue* one is going to slowly
147 blink, depending on the currently active side.
148* For the [Steno layer](#steno-layer), all LEDs will be turned on. 106* For the [Steno layer](#steno-layer), all LEDs will be turned on.
149 107
150Unless noted otherwise, the layers use a dim light for the LEDs, while modifiers 108Unless noted otherwise, the layers use a dim light for the LEDs, while modifiers use a stronger one, and modifiers override any layer preferences. For example, when on the one-handed layer, with the left side active (*red* light blinking), if `Shift` is on, the *red* light will be constantly on.
151use a stronger one, and modifiers override any layer preferences. For example, 109
152when on the one-handed layer, with the left side active (*red* light blinking), 110# Tools
153if `Shift` is on, the *red* light will be constantly on. 111
112## Heatmap
113
114When the keypress logging functionality is enabled (by `LEAD d`), the keyboard will output a line every time a key is pressed, containing the position of the key in the matrix. This allows one to collect this information, and build analytics over it, such as a heat map, including dead keys too.
115
116Included with the firmware is a small tool that can parse these logs, and create a heatmap that one can import into [KLE][kle]. To use it, simply point `tools/log-to-heatmap.py` to a base layout file (one is included in the `tools/` directory), and the key position log. The latter one can create by running `hid-listen`, and redirecting its output to a file.
117
118 [kle]: http://www.keyboard-layout-editor.com/
119
120The generated heatmap looks somewhat like this:
121
122 ![Heatmap](images/heatmap.png)
154 123
155# Building 124# Building
156 125
157To make my workflow easier, this layout is maintained in 126To make my workflow easier, this layout is maintained in [its own repository][algernon:ez-layout]. To build it, you will need the [QMK][qmk] firmware checked out, and this repo either checked out to something like `keyboards/ergodox_ez/algernon-master`. One way to achieve that is this:
158[its own repository][algernon:ez-layout]. To build it, you will need the
159[QMK][qmk] firmware checked out, and this repo either checked out to something
160like `keyboards/ergodox_ez/algernon-master`. One way to achieve that is this:
161 127
162 [algernon:ez-layout]: https://github.com/algernon/ergodox-layout 128 [algernon:ez-layout]: https://github.com/algernon/ergodox-layout
163 [qmk]: https://github.com/jackhumbert/qmk_firmware 129 [qmk]: https://github.com/jackhumbert/qmk_firmware
@@ -170,9 +136,7 @@ $ git clone https://github.com/algernon/ergodox-layout.git \
170$ make KEYBOARD=ergodox_ez KEYMAP=algernon-master 136$ make KEYBOARD=ergodox_ez KEYMAP=algernon-master
171``` 137```
172 138
173From time to time, updates may be submitted back to the QMK repository. If you 139From time to time, updates may be submitted back to the QMK repository. If you are reading it there, you can build the firmware like any other firmware included with it (assuming you are in the root directory of the firmware):
174are reading it there, you can build the firmware like any other firmware
175included with it (assuming you are in the root directory of the firmware):
176 140
177``` 141```
178$ make KEYBOARD=ergodox_ez KEYMAP=algernon 142$ make KEYBOARD=ergodox_ez KEYMAP=algernon
@@ -180,43 +144,40 @@ $ make KEYBOARD=ergodox_ez KEYMAP=algernon
180 144
181## Using on Windows 145## Using on Windows
182 146
183The keymap default to forcing NKRO, which seems to upset Windows, and except the 147The keymap default to forcing NKRO, which seems to upset Windows, and except the modifiers, none of them work. If you experience this problem, recompile the firmware with `FORCE_NKRO=no` added to the `make` command line.
184modifiers, none of them work. If you experience this problem, recompile the
185firmware with `FORCE_NKRO=no` added to the `make` command line.
186 148
187# Changelog 149# Changelog
188 150
151## v1.3 - 2016-07-06
152
153* Added support for logging keys, by pressing `LEAD d`. Also included is a tool to generate a [heatmap](#heatmap) out of the logs.
154* The arrow and navigation keys were rearranged again, and now require an additional key being held to activate. See the [base layer](#base-layer) for an image that shows where arrows are.
155* The **experimental** layer has been redone, and is now called [ADORE](#adore-layer), and as such, can be enabled by `LEAD a` now.
156* Switching between Dvorak and ADORE is now persisted into EEPROM, and survives a reboot.
157
189## v1.2 - 2016-06-22 158## v1.2 - 2016-06-22
190 159
191* The forced NKRO mode can be easily toggled off at compile-time, to make the 160* The forced NKRO mode can be easily toggled off at compile-time, to make the firmware compatible with [certain operating systems](#using-on-windows).
192 firmware compatible with [certain operating systems](#using-on-windows). 161* The `:;` key has changed behaviour: to access the `;` symbol, the key needs to be double-tapped, instead of shifted.
193* The `:;` key has changed behaviour: to access the `;` symbol, the key needs to 162* The `=` and `\` keys were swapped, `=` moved to the home row, on both the [base](#base-layer) and the **experimental** layers.
194 be double-tapped, instead of shifted. 163* The arrow and navigation keys were redone, they are now more accessible, but the navigation keys require an extra tap to access.
195* The `=` and `\` keys were swapped, `=` moved to the home row, on both the 164* The **Emacs** layer is gone, replaced by a simplified [navigation and media](#navigation-and-media-layer) layer.
196 [base](#base-layer) and the [experimental](#experimental-layer) layers.
197* The arrow and navigation keys were redone, they are now more accessible, but
198 the navigation keys require an extra tap to access.
199* The **Emacs** layer is gone, replaced by a simplified
200 [navigation and media](#navigation-and-media-layer) layer.
201* `LEAD v` types the firmware version, and the keymap version. 165* `LEAD v` types the firmware version, and the keymap version.
202* On the [experimental](#experimental-layer) layer, the `L` and `Q`, and the `K` 166* On the **experimental** layer, the `L` and `Q`, and the `K` and `G` keys were swapped.
203 and `G` keys were swapped. 167* The [Steno](#steno-layer) layer gained a few more `#` and `*` keys, to make it easier on my fingers.
204* The [Steno](#steno-layer) layer gained a few more `#` and `*` keys, to make it
205 easier on my fingers.
206 168
207## v1.1 - 2016-06-14 169## v1.1 - 2016-06-14
208 170
209* The keyboard starts in NKRO mode, bootmagic and other things are disabled. 171* The keyboard starts in NKRO mode, bootmagic and other things are disabled.
210* A [Steno](#steno-layer) layer was added, to be used with Plover. 172* A [Steno](#steno-layer) layer was added, to be used with Plover.
211* An [experimental](#experimental-layer) layer was added, something halfway 173* An **experimental** layer was added, something halfway between Dvorak and Capewell-Dvorak. A work in progress.
212 between Dvorak and Capewell-Dvorak. A work in progress.
213* `LEAD y` types `\o/`. 174* `LEAD y` types `\o/`.
214* Some keys on the [Base](#base-layer) layer have been moved around: 175* Some keys on the [Base](#base-layer) layer have been moved around:
215 - `?` moved to the left pinky, left of `Q`. 176 - `?` moved to the left pinky, left of `Q`.
216 - `=` shifted one row down, but `F11` stayed where it was. 177 - `=` shifted one row down, but `F11` stayed where it was.
217 - `-` on the left half was replaced by `Tab`. 178 - `-` on the left half was replaced by `Tab`.
218 - `Tab`'s original position is taken by a `Media Next`/`Media Prev` key. 179 - `Tab`'s original position is taken by a `Media Next`/`Media Prev` key.
219 - `:` now inputs `;` when shifted. 180 - `:` now inputs `;` when shifted.
220* `ESC` cancels the [Hungarian](#hungarian-layer) layer too, not just modifiers. 181* `ESC` cancels the [Hungarian](#hungarian-layer) layer too, not just modifiers.
221 182
222## v1.0 - 2016-05-26 183## v1.0 - 2016-05-26
@@ -225,6 +186,4 @@ Initial version.
225 186
226# License 187# License
227 188
228The layout, being a derivative of the original TMK firmware which is under the 189The layout, being a derivative of the original TMK firmware which is under the GPL-2+, this layout is under the GPL as well, but GPL-3+, rather than the older version.
229GPL-2+, this layout is under the GPL as well, but GPL-3+, rather than the older
230version.
diff --git a/keyboards/ergodox_ez/keymaps/algernon/tools/heatmap-base-layout.json b/keyboards/ergodox_ez/keymaps/algernon/tools/heatmap-base-layout.json
new file mode 100644
index 000000000..148bb1f23
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/algernon/tools/heatmap-base-layout.json
@@ -0,0 +1,533 @@
1[
2 {
3 "backcolor": "#ffffff",
4 "name": "ErgoDox - algernon's layout: Heatmap",
5 "author": "Gergely Nagy <kbd@gergo.csillger.hu>",
6 "notes": "See [here](https://github.com/algernon/ergodox-layout#readme) for the QMK keymap source.",
7 "switchMount": "cherry",
8 "switchBrand": "gateron",
9 "switchType": "KS-3-Tea",
10 "pcb": true,
11 "css": ".keyborder { -webkit-filter: blur(5px); filter: blur(5px); } .keytop { -webkit-filter: blur(10px); } .keylabels { border: 1px solid black; }"
12 },
13 [
14 {
15 "x": 3.5,
16 "c": "#a7d0db",
17 "fa": [
18 0,
19 0,
20 2
21 ]
22 },
23 "#\n3\nF3",
24 {
25 "x": 10.5,
26 "c": "#a7d0db",
27 "t": "#000000",
28 "a": 4,
29 "fa": [
30 0,
31 0,
32 2
33 ]
34 },
35 "*\n8\nF8"
36 ],
37 [
38 {
39 "y": -0.875,
40 "x": 2.5,
41 "c": "#bfbad1",
42 "t": "#0d0d0b"
43 },
44 "@\n2\nF2",
45 {
46 "x": 1,
47 "c": "#7adabd",
48 "t": "#000000"
49 },
50 "$\n4\nF4",
51 {
52 "x": 8.5
53 },
54 "&\n7\nF7",
55 {
56 "x": 1,
57 "c": "#bfbad1",
58 "t": "#0d0d0b"
59 },
60 "(\n9\nF9"
61 ],
62 [
63 {
64 "y": -0.875,
65 "x": 5.5,
66 "c": "#7adabd",
67 "t": "#000000"
68 },
69 "%\n5\nF5",
70 {
71 "c": "#f9cd31",
72 "a": 7,
73 "f": 2
74 },
75 "STENO",
76 {
77 "x": 4.5,
78 "f": 6
79 },
80 "<i class='mss mss-Unicode-Option-3'></i>",
81 {
82 "c": "#7adabd",
83 "a": 4,
84 "f": 3,
85 "fa": [
86 0,
87 0,
88 2
89 ]
90 },
91 "^\n6\nF6"
92 ],
93 [
94 {
95 "y": -0.875,
96 "c": "#ffb2d2",
97 "f": 3,
98 "w": 1.5
99 },
100 "\n\n~\n`",
101 {
102 "t": "#0d0d0b"
103 },
104 "!\n1\nF1",
105 {
106 "x": 14.5
107 },
108 ")\n0\nF10",
109 {
110 "a": 7,
111 "w": 1.5
112 },
113 "F11"
114 ],
115 [
116 {
117 "y": -0.375,
118 "x": 3.5,
119 "c": "#a7d0db",
120 "t": "#000000",
121 "a": 4
122 },
123 ">\n.",
124 {
125 "x": 10.5,
126 "a": 6
127 },
128 "C"
129 ],
130 [
131 {
132 "y": -0.875,
133 "x": 2.5,
134 "c": "#bfbad1",
135 "t": "#0d0d0b",
136 "a": 4
137 },
138 "<\n,",
139 {
140 "x": 1,
141 "c": "#7adabd",
142 "t": "#000000",
143 "a": 6
144 },
145 "P",
146 {
147 "x": 8.5
148 },
149 "G",
150 {
151 "x": 1,
152 "c": "#bfbad1",
153 "t": "#0d0d0b"
154 },
155 "R"
156 ],
157 [
158 {
159 "y": -0.875,
160 "x": 5.5,
161 "c": "#7adabd",
162 "t": "#000000"
163 },
164 "Y",
165 {
166 "c": "#93c9b7",
167 "a": 4,
168 "h": 1.5
169 },
170 "{\n[",
171 {
172 "x": 4.5,
173 "h": 1.5
174 },
175 "}\n]",
176 {
177 "c": "#7adabd",
178 "a": 6
179 },
180 "F"
181 ],
182 [
183 {
184 "y": -0.875,
185 "c": "#ffb07b",
186 "t": "#0d0d0b",
187 "f": 6,
188 "w": 1.5
189 },
190 "<i class='fa fa-fast-backward'></i>\n\n<i class='fa fa-fast-forward'></i>",
191 {
192 "c": "#ffb2d2",
193 "a": 4,
194 "f": 3
195 },
196 "\"\n'",
197 {
198 "x": 14.5,
199 "a": 6
200 },
201 "L",
202 {
203 "a": 4,
204 "w": 1.5
205 },
206 "|\n\\"
207 ],
208 [
209 {
210 "y": -0.375,
211 "x": 3.5,
212 "c": "#a7d0db",
213 "t": "#000000",
214 "a": 6
215 },
216 "E",
217 {
218 "x": 10.5
219 },
220 "T"
221 ],
222 [
223 {
224 "y": -0.875,
225 "x": 2.5,
226 "c": "#bfbad1",
227 "t": "#0d0d0b"
228 },
229 "O",
230 {
231 "x": 1,
232 "c": "#7adabd",
233 "t": "#000000",
234 "n": true
235 },
236 "U",
237 {
238 "x": 8.5,
239 "n": true
240 },
241 "H",
242 {
243 "x": 1,
244 "c": "#bfbad1",
245 "t": "#0d0d0b"
246 },
247 "N"
248 ],
249 [
250 {
251 "y": -0.875,
252 "x": 5.5,
253 "c": "#7adabd",
254 "t": "#000000"
255 },
256 "I",
257 {
258 "x": 6.5
259 },
260 "D"
261 ],
262 [
263 {
264 "y": -0.875,
265 "c": "#ffb2d2",
266 "t": "#0d0d0b",
267 "fa": [
268 6
269 ],
270 "w": 1.5
271 },
272 "<i class='fa fa-arrows'></i>\n\nTab",
273 {
274 "f": 3
275 },
276 "A",
277 {
278 "x": 14.5,
279 "f": 3
280 },
281 "S",
282 {
283 "a": 4,
284 "fa": [
285 0,
286 0,
287 0,
288 0,
289 0,
290 0,
291 0,
292 6
293 ],
294 "w": 1.5
295 },
296 "+\n="
297 ],
298 [
299 {
300 "y": -0.625,
301 "x": 6.5,
302 "c": "#93c9b7",
303 "t": "#000000",
304 "a": 7,
305 "h": 1.5
306 },
307 "(",
308 {
309 "x": 4.5,
310 "h": 1.5
311 },
312 ")"
313 ],
314 [
315 {
316 "y": -0.75,
317 "x": 3.5,
318 "c": "#a7d0db",
319 "a": 6
320 },
321 "J",
322 {
323 "x": 10.5
324 },
325 "W"
326 ],
327 [
328 {
329 "y": -0.875,
330 "x": 2.5,
331 "c": "#bfbad1",
332 "t": "#0d0d0b"
333 },
334 "Q",
335 {
336 "x": 1,
337 "c": "#7adabd",
338 "t": "#000000"
339 },
340 "K",
341 {
342 "x": 8.5
343 },
344 "M",
345 {
346 "x": 1,
347 "c": "#bfbad1",
348 "t": "#0d0d0b"
349 },
350 "V"
351 ],
352 [
353 {
354 "y": -0.875,
355 "x": 5.5,
356 "c": "#7adabd",
357 "t": "#000000"
358 },
359 "X",
360 {
361 "x": 6.5
362 },
363 "B"
364 ],
365 [
366 {
367 "y": -0.875,
368 "c": "#ffb07b",
369 "f": 9,
370 "w": 1.5
371 },
372 "\n\n<i class='kb kb-Multimedia-Play-Pause'></i>",
373 {
374 "c": "#ffb2d2",
375 "t": "#0d0d0b",
376 "a": 4,
377 "f": 3
378 },
379 "?\n/",
380 {
381 "x": 14.5,
382 "a": 6
383 },
384 "Z",
385 {
386 "c": "#ffb07b",
387 "t": "#000000",
388 "f": 9,
389 "w": 1.5
390 },
391 "<i class='kb kb-Multimedia-Stop'></i>"
392 ],
393 [
394 {
395 "y": -0.375,
396 "x": 3.5,
397 "c": "#d9dae0",
398 "g": true,
399 "a": 7,
400 "f": 3
401 },
402 "",
403 {
404 "x": 10.5
405 },
406 ""
407 ],
408 [
409 {
410 "y": -0.875,
411 "x": 2.5
412 },
413 "",
414 {
415 "x": 1,
416 "c": "#d4872a",
417 "g": false,
418 "a": 5
419 },
420 ";\n:",
421 {
422 "x": 8.5
423 },
424 "_\n-",
425 {
426 "x": 1,
427 "c": "#d9dae0",
428 "g": true,
429 "a": 7
430 },
431 ""
432 ],
433 [
434 {
435 "y": -0.75,
436 "x": 0.5
437 },
438 "",
439 {},
440 "",
441 {
442 "x": 14.5
443 },
444 "",
445 {},
446 ""
447 ],
448 [
449 {
450 "r": 30,
451 "rx": 6.5,
452 "ry": 4.25,
453 "y": -1,
454 "x": 1,
455 "c": "#f9cd31",
456 "g": false
457 },
458 "Alt",
459 {
460 "a": 4,
461 "fa": [
462 0,
463 0,
464 0,
465 9
466 ]
467 },
468 "\n\n\n<i class='kb kb-logo-linux-debian fa-large'></i>"
469 ],
470 [
471 {
472 "c": "#d4872a",
473 "a": 7,
474 "f": 9,
475 "h": 2
476 },
477 "<i class='kb kb-Unicode-BackSpace-DeleteLeft-Big'></i>",
478 {
479 "h": 2
480 },
481 "<i class='fa fa-angle-double-up'></i>",
482 {
483 "c": "#f9cd31",
484 "f": 3
485 },
486 "Ctrl"
487 ],
488 [
489 {
490 "x": 2,
491 "c": "#e26757"
492 },
493 "ESC"
494 ],
495 [
496 {
497 "r": -30,
498 "rx": 13,
499 "y": -1,
500 "x": -3,
501 "c": "#f9cd31",
502 "f": 2
503 },
504 "MEDIA",
505 {},
506 "1HAND"
507 ],
508 [
509 {
510 "x": -3
511 },
512 "LEAD",
513 {
514 "c": "#d4872a",
515 "f": 9,
516 "h": 2
517 },
518 "<i class='kb kb-Return-2'></i>",
519 {
520 "f": 3,
521 "h": 2
522 },
523 "SPC"
524 ],
525 [
526 {
527 "x": -3,
528 "c": "#f9cd31",
529 "f": 2
530 },
531 "HUN"
532 ]
533]
diff --git a/keyboards/ergodox_ez/keymaps/algernon/tools/log-to-heatmap.py b/keyboards/ergodox_ez/keymaps/algernon/tools/log-to-heatmap.py
new file mode 100755
index 000000000..a13d12e81
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/algernon/tools/log-to-heatmap.py
@@ -0,0 +1,145 @@
1#! /usr/bin/env python
2import json
3import os
4import sys
5import re
6
7from math import floor
8
9cr_coord_map = [
10 [
11 # Row 0
12 [ 4, 0], [ 4, 2], [ 2, 0], [ 1, 0], [ 2, 2], [ 3, 0], [ 3, 2],
13 [ 3, 4], [ 3, 6], [ 2, 4], [ 1, 2], [ 2, 6], [ 4, 4], [ 4, 6],
14 ],
15 [
16 # Row 1
17 [ 8, 0], [ 8, 2], [ 6, 0], [ 5, 0], [ 6, 2], [ 7, 0], [ 7, 2],
18 [ 7, 4], [ 7, 6], [ 6, 4], [ 5, 2], [ 6, 6], [ 8, 4], [ 8, 6],
19 ],
20 [
21 # Row 2
22 [12, 0], [12, 2], [10, 0], [ 9, 0], [10, 2], [11, 0], [ ],
23 [ ], [11, 2], [10, 4], [ 9, 2], [10, 6], [12, 4], [12, 6],
24 ],
25 [
26 # Row 3
27 [17, 0], [17, 2], [15, 0], [14, 0], [15, 2], [16, 0], [13, 0],
28 [13, 2], [16, 2], [15, 4], [14, 2], [15, 6], [17, 4], [17, 6],
29 ],
30 [
31 # Row 4
32 [20, 0], [20, 2], [19, 0], [18, 0], [19, 2], [], [], [], [],
33 [19, 4], [18, 2], [19, 6], [20, 4], [20, 6],
34 ],
35 [
36 # Row 5
37 [ ], [23, 0], [22, 2], [22, 0], [22, 4], [21, 0], [21, 2],
38 [24, 0], [24, 2], [25, 0], [25, 4], [25, 2], [26, 0], [ ],
39 ],
40]
41
42def set_attr_at(j, b, n, attr, fn, val):
43 blk = j[b][n]
44 if attr in blk:
45 blk[attr] = fn(blk[attr], val)
46 else:
47 blk[attr] = fn(None, val)
48
49def coord(col, row):
50 return cr_coord_map[row][col]
51
52def set_attr(orig, new):
53 return new
54
55def set_bg(j, (b, n), color):
56 set_attr_at(j, b, n, "c", set_attr, color)
57 #set_attr_at(j, b, n, "g", set_attr, False)
58
59def _set_tap_info(o, count, cap):
60 ns = 4 - o.count ("\n")
61 return o + "\n" * ns + "%.02f%%" % (float(count) / float(cap) * 100)
62
63def set_tap_info(j, (b, n), count, cap):
64 j[b][n + 1] = _set_tap_info (j[b][n + 1], count, cap)
65
66def heatmap_color (v):
67 colors = [ [0.3, 0.3, 1], [0.3, 1, 0.3], [1, 1, 0.3], [1, 0.3, 0.3]]
68 fb = 0
69 if v <= 0:
70 idx1, idx2 = 0, 0
71 elif v >= 1:
72 idx1, idx2 = len(colors) - 1, len(colors) - 1
73 else:
74 val = v * (len(colors) - 1)
75 idx1 = int(floor(val))
76 idx2 = idx1 + 1
77 fb = val - float(idx1)
78
79 r = (colors[idx2][0] - colors[idx1][0]) * fb + colors[idx1][0]
80 g = (colors[idx2][1] - colors[idx1][1]) * fb + colors[idx1][1]
81 b = (colors[idx2][2] - colors[idx1][2]) * fb + colors[idx1][2]
82
83 r, g, b = [x * 255 for x in r, g, b]
84 return "#%02x%02x%02x" % (r, g, b)
85
86# Load the keylog
87def load_keylog(fname, restrict_row):
88 keylog = {}
89 total = 0
90 with open(fname, "r") as f:
91 lines = f.readlines()
92 for line in lines:
93 m = re.search ('KL: col=(\d+), row=(\d+)', line)
94 if not m:
95 continue
96 (c, r) = (int(m.group (2)), int(m.group (1)))
97 if restrict_row != None and r != int(restrict_row):
98 continue
99 if (c, r) in keylog:
100 keylog[(c, r)] = keylog[(c, r)] + 1
101 else:
102 keylog[(c, r)] = 1
103 total = total + 1
104 return total / 2, keylog
105
106def l_flat(s):
107 f = s.split("\n")
108 return ", ".join (f)
109
110def main(base_fn, log_fn, restrict_row = None):
111
112 with open(base_fn, "r") as f:
113 layout = json.load (f)
114
115 ## Reset colors
116 for row in cr_coord_map:
117 for col in row:
118 if col != []:
119 set_bg (layout, col, "#d9dae0")
120 #set_attr_at (layout, col[0], col[1], "g", set_attr, True)
121
122 total, log = load_keylog (log_fn, restrict_row)
123 max_cnt = 0
124 for (c, r) in log:
125 max_cnt = max(max_cnt, log[(c, r)])
126
127 # Create the heatmap
128 for (c, r) in log:
129 coords = coord(c, r)
130 b, n = coords
131 cap = max_cnt
132 v = float(log[(c, r)]) / cap
133 print >> sys.stderr, "%s => %d/%d => %f = %s" % (l_flat(layout[b][n+1]), log[(c,r)], cap, v, heatmap_color(v))
134 set_bg (layout, coord(c, r), heatmap_color (v))
135 set_tap_info (layout, coord (c, r), log[(c, r)], total)
136
137 print json.dumps(layout)
138
139if __name__ == "__main__":
140 if len(sys.argv) < 3:
141 print """Log to Heatmap -- creates a heatmap out of keyboard logs
142
143Usage: log-to-heatmap.py base-layout.json logfile [row] >layout.json"""
144 sys.exit (1)
145 main(*sys.argv[1:])
diff --git a/keyboards/ergodox_ez/keymaps/teckinesis/keymap.c b/keyboards/ergodox_ez/keymaps/teckinesis/keymap.c
new file mode 100644
index 000000000..ec6ceb96b
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/teckinesis/keymap.c
@@ -0,0 +1,455 @@
1#include "ergodox_ez.h"
2#include "led.h"
3#include "debug.h"
4#include "action_layer.h"
5#include "action_util.h"
6#include "mousekey.h"
7
8#define BASE 0 // default layer
9#define SYMB 1 // symbols layer
10#define MDIA 2 // media layer
11#define SPEC 3 // special layer
12
13#define LCaps 10 // left caps-shift key
14#define LSymb 11 // left symbol-shift key
15#define LMdia 12 // left media-shift key
16#define LSpec 13 // left special-shift key
17#define RCaps 14 // right caps-shift key
18#define RSymb 15 // right symbol-shift key
19#define RMdia 16 // right media-shift key
20#define RSpec 17 // right special-shift key
21
22#define MUL 20 // mouse up left
23#define MUR 21 // mouse up right
24#define MDL 22 // mouse down left
25#define MDR 23 // mouse down right
26
27/*
28 * teckinesis layout for ErgoDox (EZ)
29 *
30 * Modifications from The Ordinary Layout v4 by Will Wolff-Myren willwm@gmail.com
31 * Modifications from default by Nicholas Keene ergodoxez@nicholaskeene.com
32 *
33 * No rights reserved. This software is in the public domain.
34 * Credit me if you are friendly but if you're a jerk don't bother.
35 *
36 * Details: readme.md
37 * https://github.com/willwm/qmk_firmware/tree/master/keyboard/ergodox_ez/keymaps/teckinesis
38 */
39
40const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
41
42/******* Base Layer ********************************************************************************************************
43 *
44 * ,------------------------------------------------------. ,------------------------------------------------------.
45 * | Special =+ | 1 | 2 | 3 | 4 | 5 | ESC | | ` | 6 | 7 | 8 | 9 | 0 | -_ Special |
46 * |------------+------+------+------+------+-------------| |------+------+------+------+------+------+------------|
47 * | Media Tab | Q | W | E | R | T | [ | | ] | Y | U | I | O | P | \| Media |
48 * |------------+------+------+------+------+------| | | |------+------+------+------+------+------------|
49 * | Symbol | A | S | D | F | G |------| |------| H | J | K | L | ; | '" Symbol |
50 * |------------+------+------+------+------+------|Shift | | Tab |------+------+------+------+------+------------|
51 * | Capitals | Z | X | C | V | B | -Tab | | | N | M | , | . | / | Capitals |
52 * `------------+------+------+------+------+-------------' `-------------+------+------+------+------+------------'
53 * | LCtrl |Meh/\ |Hypr//| LAlt | LGui | | RGui | RAlt |Hypr/[|Meh/] | RCtrl |
54 * `-----------------------------------' `-----------------------------------'
55 * ,-------------. ,-------------.
56 * | Home | End | | Left | Right|
57 * ,------|------|------| |------+------+------.
58 * | | | PgUp | | Up | | |
59 * |Backsp| Del |------| |------| Enter| Space|
60 * | | | PgDn | | Down | | |
61 * `--------------------' `--------------------'
62 */
63[BASE] = KEYMAP(
64// left hand
65 F(LSpec),KC_1,KC_2,KC_3 ,KC_4 ,KC_5 ,KC_ESC
66,F(LMdia) ,KC_Q ,KC_W ,KC_E ,KC_R ,KC_T ,KC_LBRC
67,M(LSymb) ,KC_A ,KC_S ,KC_D ,KC_F ,KC_G
68,M(LCaps) ,KC_Z ,KC_X ,KC_C ,KC_V ,KC_B ,LSFT(KC_TAB)
69,KC_LCTL,MEH_T(KC_BSLS),ALL_T(KC_SLSH),KC_LALT,KC_LGUI
70 ,KC_HOME,KC_END
71 ,KC_PGUP
72 ,KC_BSPC,KC_DEL ,KC_PGDN
73 // right hand
74 ,KC_GRV ,KC_6 ,KC_7 ,KC_8 ,KC_9 ,KC_0 ,F(RSpec)
75 ,KC_RBRC ,KC_Y ,KC_U ,KC_I ,KC_O ,KC_P ,F(RMdia)
76 ,KC_H ,KC_J ,KC_K ,KC_L ,KC_SCLN ,F(RSymb)
77 ,KC_TAB ,KC_N ,KC_M ,KC_COMM,KC_DOT ,KC_SLSH ,M(RCaps)
78 ,KC_RGUI,KC_RALT,ALL_T(KC_LBRC),MEH_T(KC_RBRC),KC_RCTL
79 ,KC_LEFT ,KC_RGHT
80 ,KC_UP
81 ,KC_DOWN ,KC_ENT ,KC_SPC
82 ),
83
84/******* Symbols Layer *****************************************************************************************************
85 *
86 * ,-----------------------------------------------------. ,-----------------------------------------------------.
87 * | | F1 | F2 | F3 | F4 | F5 | Esc | | - | F6 | F7 | F8 | F9 | F10 | |
88 * |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------|
89 * | | ! | @ | { | } | & | < | | > | | | 7 | 8 | 9 | / | |
90 * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
91 * | | # | $ | ( | ) | ` |------| |------| / | 4 | 5 | 6 | * | |
92 * |-----------+------+------+------+------+------| Tab | | Shift|------+------+------+------+------+-----------|
93 * | | % | ^ | [ | ] | ~ | | | -Tab| \ | 1 | 2 | 3 | - | |
94 * `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------'
95 * | LCtrl | Meh |Hyper | LAlt | LGui | |RGui/0|RAlt/.|Hypr/=|Meh/+ |RCtrl/Ent|
96 * `-----------------------------------' `-------------------------------------'
97 * ,-------------. ,-------------.
98 * | Left | Right| | Home | End |
99 * ,------|------|------| |------+------+------.
100 * | | | Up | | PgUp | | |
101 * |Space |Enter |------| |------|BackSp| Del |
102 * | | | Down | | PgDn | | |
103 * `--------------------' `--------------------'
104 */
105[SYMB] = KEYMAP(
106// left hand
107 KC_TRNS ,KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 ,KC_ESC
108,KC_TRNS ,KC_EXLM ,KC_AT ,KC_LCBR ,KC_RCBR ,KC_AMPR ,LSFT(KC_COMM)
109,KC_TRNS ,KC_HASH ,KC_DLR ,KC_LPRN ,KC_RPRN ,KC_GRV
110,KC_TRNS ,KC_PERC ,KC_CIRC ,KC_LBRC ,KC_RBRC ,KC_TILD ,KC_TAB
111,KC_LCTL ,KC_MEH ,KC_HYPR ,KC_LALT ,KC_LGUI
112 ,KC_LEFT ,KC_RGHT
113 ,KC_UP
114 ,KC_SPC ,KC_ENT ,KC_DOWN
115 // right hand
116 ,KC_MINS ,KC_F6 ,KC_F7 ,KC_F8 ,KC_F9 ,KC_F10 ,KC_TRNS
117 ,LSFT(KC_DOT),KC_PIPE ,KC_7 ,KC_8 ,KC_9 ,KC_SLSH ,KC_TRNS
118 ,KC_SLSH ,KC_4 ,KC_5 ,KC_6 ,KC_ASTR ,KC_TRNS
119 ,LSFT(KC_TAB),KC_BSLS ,KC_1 ,KC_2 ,KC_3 ,KC_MINS ,KC_TRNS
120 ,GUI_T(KC_0),ALT_T(KC_DOT),ALL_T(KC_EQL),MEH_T(KC_PLUS),CTL_T(KC_ENT)
121 ,KC_HOME ,KC_END
122 ,KC_PGUP
123 ,KC_PGDN ,KC_BSPC ,KC_DEL
124),
125
126/******* Media Layer *******************************************************************************************************
127 *
128 * ,---------------------------------------------------------------. ,---------------------------------------------------------------.
129 * | | F11 | F12 | F13 | F14 | F15 | Esc | | | F16 | F17 | F18 | F19 | F20 | |
130 * |------+---------+---------+---------+---------+----------------| |------+---------+---------+---------+---------+---------+------|
131 * | | |MouseUpLf|Mouse Up |MouseUpRg|Volume Up|Scroll| |Scroll|PrintScrn| Home | Up | PgUp | | |
132 * |------+---------+---------+---------+---------+---------| Up | | Up |---------+---------+---------+---------+---------+------|
133 * | | |MouseLeft|MouseDown|MouseRght|Volume Dn|------| |------| Num Lock| Left | Down | Right | | |
134 * |------+---------+---------+---------+---------+---------|Scroll| |Scroll|---------+---------+---------+---------+---------+------|
135 * | | |MouseDnLf|MouseDown|MouseDnRg| Mute | Down | | Down | | End | Down | PgDn | | |
136 * `------+---------+---------+---------+---------+----------------' `----------------+---------+---------+---------+---------+------'
137 * |LCtrl| Meh | MClick | LClick | R Click| |Cmd/Insrt|Optn/Del | Hyper | Meh |RCtrl|
138 * `---------------------------------------------' `---------------------------------------------'
139 * ,-------------. ,-------------.
140 * | Stop |Refrsh| | Prev | Next |
141 * ,------|------|------| |------+------+------.
142 * |Brwser|Brwser|Search| |VolUp | | |
143 * |Back | Fwd |------| |------| Stop | Play-|
144 * | | | Home | |VolDn | | Pause|
145 * `--------------------' `--------------------'
146 */
147[MDIA] = KEYMAP(
148// left hand
149 KC_TRNS ,KC_F11 ,KC_F12 ,KC_F13 ,KC_F14 ,KC_F15 ,KC_ESC
150,KC_TRNS ,KC_NO ,M(MUL) ,KC_MS_U ,M(MUR) ,KC_VOLU ,KC_WH_U
151,KC_TRNS ,KC_NO ,KC_MS_L ,KC_MS_D ,KC_MS_R ,KC_VOLD
152,KC_TRNS ,KC_NO ,M(MDL) ,KC_MS_D ,M(MDR) ,KC_MUTE ,KC_WH_D
153,KC_LCTL ,KC_MEH ,KC_BTN3 ,KC_BTN1 ,KC_BTN2
154 ,KC_WSTP ,KC_WREF
155 ,KC_WSCH
156 ,KC_WBAK ,KC_NO ,KC_WHOM
157 // right hand
158 ,KC_NO ,KC_F16 ,KC_F17 ,KC_F18 ,KC_F19 ,KC_F20 ,KC_TRNS
159 ,KC_WH_U ,KC_PSCR ,KC_HOME ,KC_UP ,KC_PGUP ,KC_NO ,KC_TRNS
160 ,KC_NLCK ,KC_LEFT ,KC_DOWN ,KC_RIGHT,KC_NO ,KC_TRNS
161 ,KC_WH_D ,KC_NO ,KC_END ,KC_DOWN ,KC_PGDN ,KC_NO ,KC_TRNS
162 ,GUI_T(KC_INS),ALT_T(KC_DEL),KC_HYPR ,KC_MEH ,KC_RCTL
163 ,KC_MPRV ,KC_MNXT
164 ,KC_VOLU
165 ,KC_VOLD ,KC_MSTP ,KC_MPLY
166),
167
168/******* Special Layer *****************************************************************************************************
169 *
170 * ,-----------------------------------------------------. ,-----------------------------------------------------.
171 * | | Esc | | | | | | | | | | | | Bspc | |
172 * |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------|
173 * | | | | | | | | | | | | | | | |
174 * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
175 * | | | | | | |------| |------| | | | | | |
176 * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
177 * | | | | | | | | | | | | | | | RShift |
178 * `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------'
179 * | | | | | | | | | | | |
180 * `----------------------------------' `----------------------------------'
181 * ,-------------. ,-------------.
182 * | | | | | |
183 * ,------|------|------| |------+------+------.
184 * | | | | | | | |
185 * | | |------| |------| | |
186 * | | | | | | | |
187 * `--------------------' `--------------------'
188 */
189[SPEC] = KEYMAP(
190// left hand
191 KC_TRNS ,KC_ESC ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
192,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
193,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
194,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
195,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
196
197 ,KC_TRNS ,KC_TRNS
198 ,KC_TRNS
199 ,KC_TRNS,KC_TRNS ,KC_TRNS
200 // right hand
201 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_BSPC ,KC_TRNS
202 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
203 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
204 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_RSFT
205 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
206
207 ,KC_TRNS ,KC_TRNS
208 ,KC_TRNS
209 ,KC_TRNS ,KC_TRNS ,KC_TRNS
210 )
211};
212
213const uint16_t PROGMEM fn_actions[] = {
214 // the faux shift keys are implemented as macro taps
215 [LCaps] = ACTION_MACRO_TAP(LCaps)
216 ,[LSymb] = ACTION_MACRO_TAP(LSymb)
217 ,[LMdia] = ACTION_MACRO_TAP(LMdia)
218 ,[LSpec] = ACTION_MACRO_TAP(LSpec)
219 ,[RCaps] = ACTION_MACRO_TAP(RCaps)
220 ,[RSymb] = ACTION_MACRO_TAP(RSymb)
221 ,[RMdia] = ACTION_MACRO_TAP(RMdia)
222 ,[RSpec] = ACTION_MACRO_TAP(RSpec)
223};
224
225uint16_t caps_shift = 0;
226uint16_t symb_shift = 0;
227uint16_t mdia_shift = 0;
228
229bool symb_lock = false;
230bool mdia_lock = false;
231
232const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
233{
234 switch(id) {
235 // There are two shift keys for each layer so we increment a layer_shift var when one
236 // is pressed and decrement when one is released. If both are pressed at the same time
237 // then the layer is locked (or unlocked). The shift counts are bound between 0 and 2
238 // only because sometimes rapid pressing led to irregular events; this way the states
239 // are self healing during use.
240
241 case LCaps: // both caps-shift keys trigger Left Shift
242 case RCaps: // so they don't interfere with the magic combo
243 if (record->event.pressed && !record->tap.count) {
244 if(++caps_shift > 2) caps_shift = 2;
245 if(caps_shift == 2) {
246 register_code(KC_CAPS);
247 unregister_code(KC_CAPS);
248 } else if(caps_shift == 1) {
249 register_code(KC_LSFT);
250 }
251 } else {
252 if(--caps_shift < 0) caps_shift = 0;
253 if(caps_shift == 0) unregister_code(KC_LSFT);
254 }
255 break;
256
257 case LSymb:
258 if (record->event.pressed) {
259 if(++symb_shift > 2) symb_shift = 2;
260 if(symb_shift == 2) {
261 symb_lock = !symb_lock;
262 } else if(symb_shift == 1) {
263 layer_on(SYMB);
264 }
265 } else {
266 if(--symb_shift < 0) symb_shift = 0;
267 if((symb_shift == 0) && (!symb_lock)) layer_off(SYMB);
268 }
269 break;
270
271 case LMdia:
272 if (record->event.pressed) {
273 if (record->tap.count && (!mdia_shift) && (!mdia_lock)) {
274 register_code(KC_TAB);
275 } else {
276 if(++mdia_shift > 2) mdia_shift = 2;
277 if(mdia_shift == 2) {
278 mdia_lock = !mdia_lock;
279 } else if(mdia_shift == 1) {
280 layer_on(MDIA);
281 }
282 }
283 } else {
284 if(record->tap.count && (!mdia_shift) && (!mdia_lock)) {
285 unregister_code(KC_TAB);
286 } else {
287 if(--mdia_shift < 0) mdia_shift = 0;
288 if((!mdia_shift) && (!mdia_lock)) layer_off(MDIA);
289 }
290 }
291 break;
292
293 case LSpec:
294 if (record->event.pressed) {
295 if (record->tap.count && !record->tap.interrupted) {
296 register_code(KC_EQL);
297 } else {
298 layer_on(SPEC);
299 }
300 } else {
301 if(record->tap.count && !record->tap.interrupted) {
302 unregister_code(KC_EQL);
303 } else {
304 layer_off(SPEC);
305 }
306 }
307 break;
308
309 case RSymb:
310 if (record->event.pressed) {
311 if (record->tap.count && (!symb_shift) && (!symb_lock)) {
312 register_code(KC_QUOT);
313 } else {
314 if(++symb_shift > 2) symb_shift = 2;
315 if(symb_shift == 2) {
316 symb_lock = !symb_lock;
317 } else if(symb_shift == 1) {
318 layer_on(SYMB);
319 }
320 }
321 } else {
322 if(record->tap.count && symb_shift == 0) {
323 unregister_code(KC_QUOT);
324 } else {
325 if(--symb_shift < 0) symb_shift = 0;
326 if((!symb_shift) && (!symb_lock)) layer_off(SYMB);
327 }
328 }
329 break;
330
331 case RMdia:
332 if (record->event.pressed) {
333 if (record->tap.count && (!mdia_shift) && (!mdia_lock)) {
334 register_code(KC_BSLS);
335 } else {
336 if(++mdia_shift > 2) mdia_shift = 2;
337 if(mdia_shift == 2) {
338 mdia_lock = !mdia_lock;
339 } else if(mdia_shift == 1) {
340 layer_on(MDIA);
341 }
342 }
343 } else {
344 if(record->tap.count && (!mdia_shift) && (!mdia_lock)) {
345 unregister_code(KC_BSLS);
346 } else {
347 if(--mdia_shift < 0) mdia_shift = 0;
348 if((!mdia_shift) && (!mdia_lock)) layer_off(MDIA);
349 }
350 }
351 break;
352
353 case RSpec:
354 if (record->event.pressed) {
355 if (record->tap.count && !record->tap.interrupted) {
356 register_code(KC_MINS);
357 } else {
358 layer_on(SPEC);
359 }
360 } else {
361 if(record->tap.count && !record->tap.interrupted) {
362 unregister_code(KC_MINS);
363 } else {
364 layer_off(SPEC);
365 }
366 }
367 break;
368
369 // mouse diagonals
370
371 case MUL: // mouse up left
372 if (record->event.pressed) {
373 mousekey_on(KC_MS_UP);
374 mousekey_on(KC_MS_LEFT);
375 mousekey_send();
376 } else {
377 mousekey_off(KC_MS_UP);
378 mousekey_off(KC_MS_LEFT);
379 mousekey_send();
380 }
381 break;
382
383 case MUR: // mouse up right
384 if (record->event.pressed) {
385 mousekey_on(KC_MS_UP);
386 mousekey_on(KC_MS_RIGHT);
387 mousekey_send();
388 } else {
389 mousekey_off(KC_MS_UP);
390 mousekey_off(KC_MS_RIGHT);
391 mousekey_send();
392 }
393 break;
394
395 case MDL: // mouse down left
396 if (record->event.pressed) {
397 mousekey_on(KC_MS_DOWN);
398 mousekey_on(KC_MS_LEFT);
399 mousekey_send();
400 } else {
401 mousekey_off(KC_MS_DOWN);
402 mousekey_off(KC_MS_LEFT);
403 mousekey_send();
404 }
405 break;
406
407 case MDR: // mouse down right
408 if (record->event.pressed) {
409 mousekey_on(KC_MS_DOWN);
410 mousekey_on(KC_MS_RIGHT);
411 mousekey_send();
412 } else {
413 mousekey_off(KC_MS_DOWN);
414 mousekey_off(KC_MS_RIGHT);
415 mousekey_send();
416 }
417 break;
418
419 default:
420 // none
421 break;
422 }
423
424 return MACRO_NONE;
425};
426
427// Runs just one time when the keyboard initializes.
428void matrix_init_user(void) {
429
430};
431
432// Runs constantly in the background, in a loop.
433void matrix_scan_user(void) {
434 // shift or caps lock turns on red light
435 if(caps_shift || (keyboard_report->mods & MOD_BIT(KC_RSFT)) || (host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK))) {
436 ergodox_right_led_1_on();
437 } else {
438 ergodox_right_led_1_off();
439 }
440
441 // Symbol layer turns on green light
442 if(layer_state & (1UL<<SYMB)) {
443 ergodox_right_led_2_on();
444 } else {
445 ergodox_right_led_2_off();
446 }
447
448 // Media layer turns on blue light
449 if(layer_state & (1UL<<MDIA)) {
450 ergodox_right_led_3_on();
451 } else {
452 ergodox_right_led_3_off();
453 }
454};
455
diff --git a/keyboards/ergodox_ez/keymaps/teckinesis/ordinary-special.png b/keyboards/ergodox_ez/keymaps/teckinesis/ordinary-special.png
new file mode 100644
index 000000000..6eecf447e
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/teckinesis/ordinary-special.png
Binary files differ
diff --git a/keyboards/ergodox_ez/keymaps/teckinesis/ordinary-special.txt b/keyboards/ergodox_ez/keymaps/teckinesis/ordinary-special.txt
new file mode 100644
index 000000000..a08827c6d
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/teckinesis/ordinary-special.txt
@@ -0,0 +1,27 @@
1[{x:3.5,a:7},"",{x:10.5},""],
2[{y:-0.875,x:2.5},"",{x:1},"",{x:8.5},"",{x:1},""],
3[{y:-0.875,x:5.5},"",{c:"#ff4444",a:4},"Esc",{x:4.5,c:"#cccccc",a:7},"",""],
4[{y:-0.875,c:"#000000",t:"#ff0000",a:4,w:1.5},"Special\n\n\n\n\n\nShift",{c:"#ff4444",t:"#000000"},"Esc",{x:14.5,c:"#54d6de"},"Back\n\n\n\n\n\nspace",{c:"#000000",t:"#ff0000",w:1.5},"\n\nSpecial\n\n\n\n\nShift"],
5[{y:-0.375,x:3.5,c:"#cccccc",t:"#000000",a:7},"",{x:10.5},""],
6[{y:-0.875,x:2.5},"",{x:1},"",{x:8.5},"",{x:1},""],
7[{y:-0.875,x:5.5},"",{h:1.5},"",{x:4.5,h:1.5},"",""],
8[{y:-0.875,w:1.5},"","",{x:14.5},"",{w:1.5},""],
9[{y:-0.375,x:3.5},"",{x:10.5},""],
10[{y:-0.875,x:2.5},"",{x:1},"",{x:8.5},"",{x:1},""],
11[{y:-0.875,x:5.5},"",{x:6.5},""],
12[{y:-0.875,w:1.5},"","",{x:14.5},"",{w:1.5},""],
13[{y:-0.625,x:6.5,h:1.5},"",{x:4.5,h:1.5},""],
14[{y:-0.75,x:3.5},"",{x:10.5},""],
15[{y:-0.875,x:2.5},"",{x:1},"",{x:8.5},"",{x:1},""],
16[{y:-0.875,x:5.5},"",{x:6.5},""],
17[{y:-0.875,w:1.5},"","",{x:14.5},"",{c:"#2277ff",w:1.5},"RShift"],
18[{y:-0.375,x:3.5,c:"#cccccc"},"",{x:10.5},""],
19[{y:-0.875,x:2.5},"",{x:1},"",{x:8.5},"",{x:1},""],
20[{y:-0.75,x:0.5},"","",{x:14.5},"",""],
21[{r:30,rx:6.5,ry:4.25,y:-1,x:1},"",""],
22[{h:2},"",{h:2},"",""],
23[{x:2},""],
24[{r:-30,rx:13,y:-1,x:-3},"",""],
25[{x:-3},"",{h:2},"",{h:2},""],
26[{x:-3},""]
27
diff --git a/keyboards/ergodox_ez/keymaps/teckinesis/readme.md b/keyboards/ergodox_ez/keymaps/teckinesis/readme.md
new file mode 100644
index 000000000..9494a4d4c
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/teckinesis/readme.md
@@ -0,0 +1,45 @@
1# teckinesis Layout
2
3*A blend of TECK and Kinesis layouts, based on ["The Ordinary Layout" by Nicholas Keene](http://qmk.fm/keyboards/ergodox_ez/keymaps/ordinary/#the-ordinary-layout-a-familiar-and-powerful-layout)*
4
5I love "The Ordinary Layout", but I still use a [TECK](https://www.trulyergonomic.com/store/index.php)
6at the office, and I found the transition back and forth to be a bit more difficult than I expected.
7
8This layout consists of only slight changes to "The Ordinary Layout" based on the layouts of the
9[(original) TECK Model 209](https://www.trulyergonomic.com/store/layout-designer--configurator--reprogrammable--truly-ergonomic-mechanical-keyboard/#KTo7PD0+P0BBQkNERUw5394rNR4fICEi4yMkJSYnLS4xOBQaCBUXTBwYDBITLzDhBBYHCQorCw0ODzPl4B0bBhkFKhEQNjc05OPiSktOTSwoLFBSUU/mZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAX2BhAFZXAAAAAAAAAAAAXF1eVAAAAAAAAAAAAABZWltVAAAAAAAAAAAAYgBjAAAAAAAAAAAAWFcAAAAAAACTAQAMAiMBAAwBigEADAIhAQAMAZQBAAwBkgEADAGDAQAMALYBAAwAzQEADAC1AQAMAOIBAAwA6gEADADpAQAMALhJAEYAAAAAAEitR64AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACk6Ozw9Pj9AQUJDREVMOd/eKzUeHyAhIuMjJCUmJy0uMTgUGggVF0wcGAwSEy8w4QQWBwkKKwsNDg8z5eMdGwYZBSoREDY3NOfg4kpLTk0sKCxQUlFP5uQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF9gYQBWVwAAAAAAAAAAAFxdXlQAAAAAAAAAAAAAWVpbVQAAAAAAAAAAAGIAYwAAAAAAAAAAAFhXAAAAAAAAkwEADAIjAQAMAYoBAAwCIQEADAGUAQAMAZIBAAwBgwEADAC2AQAMAM0BAAwAtQEADADiAQAMAOoBAAwA6QEADAC4SQBGAAAAAABIrUeuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=) and
10the [Kinesis Advantage](http://www.kinesis-ergo.com/wp-content/uploads/2013/06/advantage_layout_win.pdf)
11
12## The Base Layout ##
13
14[teckinesis (Base Layer)](http://www.keyboard-layout-editor.com/#/gists/befd4c5800d92114aa9e50d4f7c0dfb0)
15![teckinesis base layout](teckinesis-base.png)
16
17### Changes from The Ordinary Layout ###
18
19* Moved KC_MINS from the key left of the 6 to the RSpec key.
20* Moved KC_EQL from RSpec to LSpec.
21* Moved KC_GRV from LSpec to the key left of the 6.
22* Mdded KC_BSLS to the left Meh key.
23* Added KC_SLSH to the left Hyper key.
24* Added KC_LBRC to the right Hyper key.
25* Added KC_RBRC to the right Meh key.
26
27## The Symbols Layer ##
28
29[teckinesis (Symbols Layer)](http://www.keyboard-layout-editor.com/#/gists/e6ddc4e9e0d194b3e52ac0616238ab61)
30![teckinesis symbols layout](teckinesis-symbol.png)
31
32### Changes from The Ordinary Layout ###
33
34* None.
35
36## The Media Layer ##
37
38[teckinesis (Media Layer)](http://www.keyboard-layout-editor.com/#/gists/41ff65e6a7c490211fd6702fb34d9908)
39![teckinesis media layout](teckinesis-media.png)
40
41### Changes from The Ordinary Layout ###
42
43* Removed Power, Sleep, Mail, My Computer keys.
44(I kept hitting these while using the mouse/cursor. =P)
45
diff --git a/keyboards/ergodox_ez/keymaps/teckinesis/teckinesis-base.json b/keyboards/ergodox_ez/keymaps/teckinesis/teckinesis-base.json
new file mode 100644
index 000000000..69fe28cf7
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/teckinesis/teckinesis-base.json
@@ -0,0 +1,434 @@
1[
2 {
3 "name": "teckinesis (Base Layer)",
4 "author": "Will Wolff-Myren",
5 "notes": "# teckinesis Layout # \r\n\r\n*A blend of TECK and Kinesis layouts, based on [\"The Ordinary Layout\" by Nicholas Keene](http://qmk.fm/keyboards/ergodox_ez/keymaps/ordinary/#the-ordinary-layout-a-familiar-and-powerful-layout)*\r\n\r\n## The Base Layout ##\r\n\r\n![teckinesis base layout](teckinesis-base.png)\r\n\r\n## The Symbols Layer ##\r\n\r\n![teckinesis symbols layout](teckinesis-symbol.png)\r\n\r\n## The Media Layer ##\r\n\r\n(placeholder)\r\n",
6 "switchMount": "cherry",
7 "switchBrand": "gateron",
8 "switchType": "KS-3-Tea"
9 },
10 [
11 {
12 "x": 3.5
13 },
14 "#\n3",
15 {
16 "x": 10.5
17 },
18 "*\n8"
19 ],
20 [
21 {
22 "y": -0.875,
23 "x": 2.5
24 },
25 "@\n2",
26 {
27 "x": 1
28 },
29 "$\n4",
30 {
31 "x": 8.5
32 },
33 "&\n7",
34 {
35 "x": 1
36 },
37 "(\n9"
38 ],
39 [
40 {
41 "y": -0.875,
42 "x": 5.5
43 },
44 "%\n5",
45 {
46 "c": "#ff4444"
47 },
48 "Esc",
49 {
50 "x": 4.5,
51 "c": "#cccccc"
52 },
53 "~\n`",
54 "^\n6"
55 ],
56 [
57 {
58 "y": -0.875,
59 "c": "#2277ff",
60 "w": 1.5
61 },
62 "Special\n\n+\n\n\n\nShift\n=",
63 {
64 "c": "#cccccc"
65 },
66 "!\n1",
67 {
68 "x": 14.5
69 },
70 ")\n0",
71 {
72 "c": "#2277ff",
73 "w": 1.5
74 },
75 "_\n\nSpecial\n\n\n\n-\nShift"
76 ],
77 [
78 {
79 "y": -0.375,
80 "x": 3.5,
81 "c": "#cccccc"
82 },
83 "E",
84 {
85 "x": 10.5
86 },
87 "I"
88 ],
89 [
90 {
91 "y": -0.875,
92 "x": 2.5
93 },
94 "W",
95 {
96 "x": 1
97 },
98 "R",
99 {
100 "x": 8.5
101 },
102 "U",
103 {
104 "x": 1
105 },
106 "O"
107 ],
108 [
109 {
110 "y": -0.875,
111 "x": 5.5
112 },
113 "T",
114 {
115 "h": 1.5
116 },
117 "{\n\n\n\n\n\n[",
118 {
119 "x": 4.5,
120 "h": 1.5
121 },
122 "}\n\n\n\n\n\n]",
123 "Y"
124 ],
125 [
126 {
127 "y": -0.875,
128 "c": "#2277ff",
129 "fa": [
130 0,
131 0,
132 4
133 ],
134 "w": 1.5
135 },
136 "Media\n\n<i class='kb kb-Line-Start-End'></i>\n\n\n\nShift",
137 {
138 "c": "#cccccc"
139 },
140 "Q",
141 {
142 "x": 14.5
143 },
144 "P",
145 {
146 "c": "#2277ff",
147 "f": 3,
148 "w": 1.5
149 },
150 "|\n\\\nMedia\n\n\n\n\nShift"
151 ],
152 [
153 {
154 "y": -0.375,
155 "x": 3.5,
156 "c": "#cccccc"
157 },
158 "D",
159 {
160 "x": 10.5
161 },
162 "K"
163 ],
164 [
165 {
166 "y": -0.875,
167 "x": 2.5
168 },
169 "S",
170 {
171 "x": 1
172 },
173 "F",
174 {
175 "x": 8.5
176 },
177 "J",
178 {
179 "x": 1
180 },
181 "L"
182 ],
183 [
184 {
185 "y": -0.875,
186 "x": 5.5
187 },
188 "G",
189 {
190 "x": 6.5
191 },
192 "H"
193 ],
194 [
195 {
196 "y": -0.875,
197 "c": "#2277ff",
198 "w": 1.5
199 },
200 "Symbols\n\n\n\n\n\nShift",
201 {
202 "c": "#cccccc"
203 },
204 "A",
205 {
206 "x": 14.5
207 },
208 ":\n;",
209 {
210 "c": "#2277ff",
211 "f": 3,
212 "w": 1.5
213 },
214 "\"\n'\nSymbols\n\n\n\n\nShift"
215 ],
216 [
217 {
218 "y": -0.625,
219 "x": 6.5,
220 "c": "#54d6de",
221 "fa": [
222 0,
223 0,
224 4,
225 1
226 ],
227 "h": 1.5
228 },
229 "< Tab\n\n\nShift Tab",
230 {
231 "x": 4.5,
232 "h": 1.5
233 },
234 "Tab >\n\n\nTab"
235 ],
236 [
237 {
238 "y": -0.75,
239 "x": 3.5,
240 "c": "#cccccc"
241 },
242 "C",
243 {
244 "x": 10.5
245 },
246 "<\n,"
247 ],
248 [
249 {
250 "y": -0.875,
251 "x": 2.5
252 },
253 "X",
254 {
255 "x": 1
256 },
257 "V",
258 {
259 "x": 8.5
260 },
261 "M",
262 {
263 "x": 1
264 },
265 ">\n."
266 ],
267 [
268 {
269 "y": -0.875,
270 "x": 5.5
271 },
272 "B",
273 {
274 "x": 6.5
275 },
276 "N"
277 ],
278 [
279 {
280 "y": -0.875,
281 "c": "#2277ff",
282 "w": 1.5
283 },
284 "Capitals\n\n\n\n\n\nShift",
285 {
286 "c": "#cccccc"
287 },
288 "Z",
289 {
290 "x": 14.5
291 },
292 "?\n/",
293 {
294 "c": "#2277ff",
295 "f": 3,
296 "w": 1.5
297 },
298 "\n\nCapitals\n\n\n\n\nShift"
299 ],
300 [
301 {
302 "y": -0.375,
303 "x": 3.5,
304 "c": "#77aaff",
305 "fa": [
306 5,
307 0,
308 4,
309 1
310 ]
311 },
312 "<i class='mss mss-Unicode-Option-3'></i>\n\n\nLAlt",
313 {
314 "x": 10.5
315 },
316 "<i class='mss mss-Unicode-Option-3'></i>\n\n\nRAlt"
317 ],
318 [
319 {
320 "y": -0.875,
321 "x": 2.5,
322 "fa": [
323 5,
324 1
325 ]
326 },
327 "\nHyper\n?\n/",
328 {
329 "x": 1,
330 "fa": [
331 5,
332 1,
333 0,
334 1
335 ]
336 },
337 "<i class='mss mss-Unicode-Command-3'></i>\n\n\nSuper",
338 {
339 "x": 8.5
340 },
341 "<i class='mss mss-Unicode-Command-3'></i>\n\n\nSuper",
342 {
343 "x": 1,
344 "fa": [
345 0,
346 0,
347 0,
348 1
349 ]
350 },
351 "{\n[\n\nHyper"
352 ],
353 [
354 {
355 "y": -0.75,
356 "x": 0.5
357 },
358 "Ctrl\n\n\nLCtrl",
359 {
360 "f2": 1
361 },
362 "\nMeh\n|\n\\",
363 {
364 "x": 14.5,
365 "fa": [
366 0,
367 0,
368 1,
369 1
370 ]
371 },
372 "}\n]\n\nMeh",
373 "Ctrl\n\n\nRCtrl"
374 ],
375 [
376 {
377 "r": 30,
378 "rx": 6.5,
379 "ry": 4.25,
380 "y": -1,
381 "x": 1,
382 "c": "#54d6de"
383 },
384 "Home",
385 "End"
386 ],
387 [
388 {
389 "h": 2
390 },
391 "< Del\n\n\nBackspace",
392 {
393 "h": 2
394 },
395 "Del >\n\n\nDelete",
396 "Page\n\n\n\n\n\nUp"
397 ],
398 [
399 {
400 "x": 2
401 },
402 "Page\n\n\n\n\n\nDown"
403 ],
404 [
405 {
406 "r": -30,
407 "rx": 13,
408 "y": -1,
409 "x": -3
410 },
411 "Left",
412 "Right"
413 ],
414 [
415 {
416 "x": -3
417 },
418 "Up",
419 {
420 "h": 2
421 },
422 "Enter",
423 {
424 "h": 2
425 },
426 "Space"
427 ],
428 [
429 {
430 "x": -3
431 },
432 "Down"
433 ]
434] \ No newline at end of file
diff --git a/keyboards/ergodox_ez/keymaps/teckinesis/teckinesis-base.png b/keyboards/ergodox_ez/keymaps/teckinesis/teckinesis-base.png
new file mode 100644
index 000000000..7c4584e9f
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/teckinesis/teckinesis-base.png
Binary files differ
diff --git a/keyboards/ergodox_ez/keymaps/teckinesis/teckinesis-media.json b/keyboards/ergodox_ez/keymaps/teckinesis/teckinesis-media.json
new file mode 100644
index 000000000..65fe394e8
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/teckinesis/teckinesis-media.json
@@ -0,0 +1,436 @@
1[
2 {
3 "name": "teckinesis (MediaLayer)",
4 "author": "Will Wolff-Myren",
5 "switchMount": "cherry",
6 "switchBrand": "gateron",
7 "switchType": "KS-3-Tea"
8 },
9 [
10 {
11 "x": 3.5,
12 "c": "#99de2a"
13 },
14 "F13",
15 {
16 "x": 10.5
17 },
18 "F18"
19 ],
20 [
21 {
22 "y": -0.875,
23 "x": 2.5
24 },
25 "F12",
26 {
27 "x": 1
28 },
29 "F14",
30 {
31 "x": 8.5
32 },
33 "F17",
34 {
35 "x": 1
36 },
37 "F19"
38 ],
39 [
40 {
41 "y": -0.875,
42 "x": 5.5
43 },
44 "F15",
45 {
46 "c": "#ff4444"
47 },
48 "Esc",
49 {
50 "x": 4.5
51 },
52 "Esc",
53 {
54 "c": "#99de2a"
55 },
56 "F16"
57 ],
58 [
59 {
60 "y": -0.875,
61 "x": 1.5
62 },
63 "F11",
64 {
65 "x": 14.5
66 },
67 "F20"
68 ],
69 [
70 {
71 "y": -0.995,
72 "c": "#000000",
73 "t": "#ff0000",
74 "w": 1.5
75 },
76 "Media\n\n\n\n\n\nShift",
77 {
78 "x": 16.5,
79 "w": 1.5
80 },
81 "\n\nMedia\n\n\n\n\nShift"
82 ],
83 [
84 {
85 "y": -0.3799999999999999,
86 "x": 3.5,
87 "c": "#ff8500",
88 "t": "#000000"
89 },
90 "Mouse\n\n\n\n\n\nUp",
91 {
92 "x": 10.5
93 },
94 "Cursor\n\n\n\n\n\nUp"
95 ],
96 [
97 {
98 "y": -0.875,
99 "x": 2.5
100 },
101 "Mouse\n\n\n\n\n\nUpLeft",
102 {
103 "x": 1
104 },
105 "Mouse\n\n\n\n\n\nUpRgt",
106 {
107 "x": 8.5,
108 "c": "#ffb063"
109 },
110 "Home",
111 {
112 "x": 1
113 },
114 "Page\n\n\n\n\n\nUp"
115 ],
116 [
117 {
118 "y": -0.875,
119 "x": 5.5,
120 "c": "#e6e067"
121 },
122 "Vol\n\n\n\n\n\nUp",
123 {
124 "c": "#ffb063",
125 "h": 1.5
126 },
127 "Scroll\n\n\n\n\n\nUp",
128 {
129 "x": 4.5,
130 "h": 1.5
131 },
132 "Scroll\n\n\n\n\n\nUp",
133 {
134 "c": "#e6e067"
135 },
136 "Print\n\n\n\n\n\nScreen"
137 ],
138 [
139 {
140 "y": -0.875,
141 "x": 1.5,
142 "c": "#737373",
143 "a": 7
144 },
145 "",
146 {
147 "x": 14.5
148 },
149 ""
150 ],
151 [
152 {
153 "y": -0.9950000000000001,
154 "c": "#2277ff",
155 "a": 4,
156 "w": 1.5
157 },
158 "Symbols\n\n\n\n\n\nShift",
159 {
160 "x": 16.5,
161 "w": 1.5
162 },
163 "\n\nSymbols\n\n\n\n\nShift"
164 ],
165 [
166 {
167 "y": -0.3799999999999999,
168 "x": 3.5,
169 "c": "#ff8500"
170 },
171 "Mouse\n\n\n\n\n\nDown",
172 {
173 "x": 10.5
174 },
175 "Cursor\n\n\n\n\n\nDown"
176 ],
177 [
178 {
179 "y": -0.875,
180 "x": 2.5
181 },
182 "Mouse\n\n\n\n\n\nLeft",
183 {
184 "x": 1
185 },
186 "Mouse\n\n\n\n\n\nRight",
187 {
188 "x": 8.5
189 },
190 "Cursor\n\n\n\n\n\nLeft",
191 {
192 "x": 1
193 },
194 "Cursor\n\n\n\n\n\nRight"
195 ],
196 [
197 {
198 "y": -0.875,
199 "x": 5.5,
200 "c": "#e6e067"
201 },
202 "Vol\n\n\n\n\n\nDown",
203 {
204 "x": 6.5
205 },
206 "Num\n\n\n\n\n\nLock"
207 ],
208 [
209 {
210 "y": -0.875,
211 "x": 1.5,
212 "c": "#737373",
213 "a": 7
214 },
215 "",
216 {
217 "x": 14.5
218 },
219 ""
220 ],
221 [
222 {
223 "y": -0.9950000000000001,
224 "c": "#2277ff",
225 "a": 4,
226 "w": 1.5
227 },
228 "Capitals\n\n\n\n\n\nShift",
229 {
230 "x": 16.5,
231 "w": 1.5
232 },
233 "\n\nCapitals\n\n\n\n\nShift"
234 ],
235 [
236 {
237 "y": -0.6299999999999999,
238 "x": 6.5,
239 "c": "#ffb063",
240 "h": 1.5
241 },
242 "Scroll\n\n\n\n\n\nDown",
243 {
244 "x": 4.5,
245 "h": 1.5
246 },
247 "Scroll\n\n\n\n\n\nDown"
248 ],
249 [
250 {
251 "y": -0.75,
252 "x": 3.5,
253 "c": "#ff8500"
254 },
255 "Mouse\n\n\n\n\n\nDown",
256 {
257 "x": 10.5
258 },
259 "Cursor\n\n\n\n\n\nDown"
260 ],
261 [
262 {
263 "y": -0.875,
264 "x": 2.5
265 },
266 "Mouse\n\n\n\n\n\nDnLeft",
267 {
268 "x": 1
269 },
270 "Mouse\n\n\n\n\n\nDnRgt",
271 {
272 "x": 8.5,
273 "c": "#ffb063"
274 },
275 "End",
276 {
277 "x": 1
278 },
279 "Page\n\n\n\n\n\nDown"
280 ],
281 [
282 {
283 "y": -0.875,
284 "x": 5.5,
285 "c": "#e6e067"
286 },
287 "Mute",
288 {
289 "x": 6.5,
290 "c": "#737373",
291 "a": 7
292 },
293 ""
294 ],
295 [
296 {
297 "y": -0.875,
298 "x": 1.5
299 },
300 "",
301 {
302 "x": 14.5
303 },
304 ""
305 ],
306 [
307 {
308 "y": -0.9950000000000001,
309 "c": "#2277ff",
310 "a": 4,
311 "w": 1.5
312 },
313 "Ctrl",
314 {
315 "x": 16.5,
316 "w": 1.5
317 },
318 "Ctrl"
319 ],
320 [
321 {
322 "y": -0.3799999999999999,
323 "x": 3.5,
324 "c": "#ff8500"
325 },
326 "Middle\n\n\n\n\n\nClick",
327 {
328 "x": 10.5,
329 "c": "#ffb063",
330 "fa": [
331 0,
332 0,
333 0,
334 1
335 ]
336 },
337 "Delete\n\n\nOption"
338 ],
339 [
340 {
341 "y": -0.875,
342 "x": 2.5,
343 "c": "#ff8500"
344 },
345 "Left\n\n\n\n\n\nClick",
346 {
347 "x": 1
348 },
349 "Right\n\n\n\n\n\nClick",
350 {
351 "x": 8.5,
352 "c": "#ffb063"
353 },
354 "Insert\n\n\nCmd",
355 {
356 "x": 1,
357 "c": "#77aaff"
358 },
359 "Hyper"
360 ],
361 [
362 {
363 "y": -0.75,
364 "x": 0.5
365 },
366 "Alt\n\n\nLAlt",
367 "Meh",
368 {
369 "x": 14.5
370 },
371 "Meh",
372 "Alt\n\n\nRAlt"
373 ],
374 [
375 {
376 "r": 30,
377 "rx": 6.5,
378 "ry": 4.25,
379 "y": -1,
380 "x": 1,
381 "c": "#ccbb00"
382 },
383 "Stop\n\n\nBrowser",
384 "Reload\n\n\nBrowser"
385 ],
386 [
387 {
388 "h": 2
389 },
390 "< Web\n\n\nBrowser",
391 {
392 "h": 2
393 },
394 "Web >\n\n\nBrowser",
395 "Search\n\n\nBrowser"
396 ],
397 [
398 {
399 "x": 2
400 },
401 "Home\n\n\nBrowser"
402 ],
403 [
404 {
405 "r": -30,
406 "rx": 13,
407 "y": -1,
408 "x": -3
409 },
410 "Prev\n\n\nAudio\n\n\nTrack",
411 "Next\n\n\nAudio\n\n\nTrack"
412 ],
413 [
414 {
415 "x": -3,
416 "c": "#e6e067"
417 },
418 "Vol\n\n\n\n\n\nUp",
419 {
420 "c": "#ccbb00",
421 "h": 2
422 },
423 "Stop\n\n\nAudio",
424 {
425 "h": 2
426 },
427 "Play\n\n\nAudio\n\n\nPause"
428 ],
429 [
430 {
431 "x": -3,
432 "c": "#e6e067"
433 },
434 "Vol\n\n\n\n\n\nDown"
435 ]
436] \ No newline at end of file
diff --git a/keyboards/ergodox_ez/keymaps/teckinesis/teckinesis-media.png b/keyboards/ergodox_ez/keymaps/teckinesis/teckinesis-media.png
new file mode 100644
index 000000000..cc51605f9
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/teckinesis/teckinesis-media.png
Binary files differ
diff --git a/keyboards/ergodox_ez/keymaps/teckinesis/teckinesis-symbol.json b/keyboards/ergodox_ez/keymaps/teckinesis/teckinesis-symbol.json
new file mode 100644
index 000000000..439d0128e
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/teckinesis/teckinesis-symbol.json
@@ -0,0 +1,422 @@
1[
2 {
3 "name": "teckinesis (Symbol Layer)",
4 "author": "Will Wolff-Myren",
5 "switchMount": "cherry",
6 "switchBrand": "gateron",
7 "switchType": "KS-3-Tea"
8 },
9 [
10 {
11 "x": 3.5,
12 "c": "#99de2a"
13 },
14 "F3",
15 {
16 "x": 10.5
17 },
18 "F8"
19 ],
20 [
21 {
22 "y": -0.875,
23 "x": 2.5
24 },
25 "F2",
26 {
27 "x": 1
28 },
29 "F4",
30 {
31 "x": 8.5
32 },
33 "F7",
34 {
35 "x": 1
36 },
37 "F9"
38 ],
39 [
40 {
41 "y": -0.875,
42 "x": 5.5
43 },
44 "F5",
45 {
46 "c": "#ff4444"
47 },
48 "Esc",
49 {
50 "x": 4.5,
51 "c": "#bbddbb"
52 },
53 "_\n\n\n\n\n\n-",
54 {
55 "c": "#99de2a"
56 },
57 "F6"
58 ],
59 [
60 {
61 "y": -0.875,
62 "c": "#2277ff",
63 "w": 1.5
64 },
65 "Special\n\n\n\n\n\nShift",
66 {
67 "c": "#99de2a"
68 },
69 "F1",
70 {
71 "x": 14.5
72 },
73 "F10",
74 {
75 "c": "#2277ff",
76 "w": 1.5
77 },
78 "\n\nSpecial\n\n\n\n\nShift"
79 ],
80 [
81 {
82 "y": -0.375,
83 "x": 3.5,
84 "c": "#bbddbb"
85 },
86 "{",
87 {
88 "x": 10.5,
89 "c": "#89b087"
90 },
91 "8"
92 ],
93 [
94 {
95 "y": -0.875,
96 "x": 2.5,
97 "c": "#bbddbb"
98 },
99 "@",
100 {
101 "x": 1
102 },
103 "}",
104 {
105 "x": 8.5,
106 "c": "#89b087"
107 },
108 "7",
109 {
110 "x": 1
111 },
112 "9"
113 ],
114 [
115 {
116 "y": -0.875,
117 "x": 5.5,
118 "c": "#bbddbb"
119 },
120 "&",
121 {
122 "h": 1.5
123 },
124 "<",
125 {
126 "x": 4.5,
127 "h": 1.5
128 },
129 ">",
130 "|"
131 ],
132 [
133 {
134 "y": -0.875,
135 "c": "#2277ff",
136 "w": 1.5
137 },
138 "Media\n\n\n\n\n\nShift",
139 {
140 "c": "#bbddbb"
141 },
142 "!",
143 {
144 "x": 14.5,
145 "c": "#89b087"
146 },
147 "/",
148 {
149 "c": "#2277ff",
150 "w": 1.5
151 },
152 "\n\nMedia\n\n\n\n\nShift"
153 ],
154 [
155 {
156 "y": -0.375,
157 "x": 3.5,
158 "c": "#bbddbb"
159 },
160 "(",
161 {
162 "x": 10.5,
163 "c": "#89b087"
164 },
165 "5"
166 ],
167 [
168 {
169 "y": -0.875,
170 "x": 2.5,
171 "c": "#bbddbb"
172 },
173 "$",
174 {
175 "x": 1
176 },
177 ")",
178 {
179 "x": 8.5,
180 "c": "#89b087"
181 },
182 "4",
183 {
184 "x": 1
185 },
186 "6"
187 ],
188 [
189 {
190 "y": -0.875,
191 "x": 5.5,
192 "c": "#bbddbb"
193 },
194 "`",
195 {
196 "x": 6.5
197 },
198 "/"
199 ],
200 [
201 {
202 "y": -0.875,
203 "c": "#000000",
204 "t": "#ff0000",
205 "w": 1.5
206 },
207 "Symbols\n\n\n\n\n\nShift",
208 {
209 "c": "#bbddbb",
210 "t": "#000000"
211 },
212 "#",
213 {
214 "x": 14.5,
215 "c": "#89b087"
216 },
217 "*",
218 {
219 "c": "#000000",
220 "t": "#ff0000",
221 "w": 1.5
222 },
223 "\n\nSymbols\n\n\n\n\nShift"
224 ],
225 [
226 {
227 "y": -0.625,
228 "x": 6.5,
229 "c": "#54d6de",
230 "t": "#000000",
231 "fa": [
232 0,
233 0,
234 0,
235 1
236 ],
237 "h": 1.5
238 },
239 "Tab >\n\n\nTab",
240 {
241 "x": 4.5,
242 "h": 1.5
243 },
244 "< Tab\n\n\nShift Tab"
245 ],
246 [
247 {
248 "y": -0.75,
249 "x": 3.5,
250 "c": "#bbddbb"
251 },
252 "[",
253 {
254 "x": 10.5,
255 "c": "#89b087"
256 },
257 "2"
258 ],
259 [
260 {
261 "y": -0.875,
262 "x": 2.5,
263 "c": "#bbddbb"
264 },
265 "^",
266 {
267 "x": 1
268 },
269 "]",
270 {
271 "x": 8.5,
272 "c": "#89b087"
273 },
274 "1",
275 {
276 "x": 1
277 },
278 "3"
279 ],
280 [
281 {
282 "y": -0.875,
283 "x": 5.5,
284 "c": "#bbddbb"
285 },
286 "~",
287 {
288 "x": 6.5
289 },
290 "\\"
291 ],
292 [
293 {
294 "y": -0.875,
295 "c": "#2277ff",
296 "w": 1.5
297 },
298 "Capitals\n\n\n\n\n\nShift",
299 {
300 "c": "#bbddbb"
301 },
302 "%",
303 {
304 "x": 14.5,
305 "c": "#89b087"
306 },
307 "-",
308 {
309 "c": "#2277ff",
310 "w": 1.5
311 },
312 "\n\nCapitals\n\n\n\n\nShift"
313 ],
314 [
315 {
316 "y": -0.375,
317 "x": 3.5,
318 "c": "#77aaff"
319 },
320 "<i class='mss mss-Unicode-Option-3'></i>\n\n\nLAlt",
321 {
322 "x": 10.5,
323 "c": "#89b087"
324 },
325 ".\n\n\nOption"
326 ],
327 [
328 {
329 "y": -0.875,
330 "x": 2.5,
331 "c": "#77aaff"
332 },
333 "Hyper",
334 {
335 "x": 1
336 },
337 "<i class='mss mss-Unicode-Command-3'></i>\n\n\nSuper",
338 {
339 "x": 8.5,
340 "c": "#89b087"
341 },
342 "0\n\n\nCmd",
343 {
344 "x": 1
345 },
346 "=\n\n\nHyper"
347 ],
348 [
349 {
350 "y": -0.75,
351 "x": 0.5,
352 "c": "#77aaff"
353 },
354 "Ctrl\n\n\nLCtrl",
355 "Meh",
356 {
357 "x": 14.5,
358 "c": "#89b087"
359 },
360 "+\n\n\nMeh",
361 "Enter\n\n\nCtrl"
362 ],
363 [
364 {
365 "r": 30,
366 "rx": 6.5,
367 "ry": 4.25,
368 "y": -1,
369 "x": 1,
370 "c": "#54d6de"
371 },
372 "Left",
373 "Right"
374 ],
375 [
376 {
377 "h": 2
378 },
379 "Space",
380 {
381 "h": 2
382 },
383 "Enter",
384 "Up"
385 ],
386 [
387 {
388 "x": 2
389 },
390 "Down"
391 ],
392 [
393 {
394 "r": -30,
395 "rx": 13,
396 "y": -1,
397 "x": -3
398 },
399 "Home",
400 "End"
401 ],
402 [
403 {
404 "x": -3
405 },
406 "Page\n\n\n\n\n\nUp",
407 {
408 "h": 2
409 },
410 "< Del\n\n\nBackspace",
411 {
412 "h": 2
413 },
414 "Del >\n\n\nDelete"
415 ],
416 [
417 {
418 "x": -3
419 },
420 "Page\n\n\n\n\n\nDown"
421 ]
422] \ No newline at end of file
diff --git a/keyboards/ergodox_ez/keymaps/teckinesis/teckinesis-symbol.png b/keyboards/ergodox_ez/keymaps/teckinesis/teckinesis-symbol.png
new file mode 100644
index 000000000..7ca86cf47
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/teckinesis/teckinesis-symbol.png
Binary files differ
diff --git a/keyboards/preonic/keymaps/CMD-Preonic/README.md b/keyboards/preonic/keymaps/CMD-Preonic/README.md
new file mode 100644
index 000000000..2b80c2b3a
--- /dev/null
+++ b/keyboards/preonic/keymaps/CMD-Preonic/README.md
@@ -0,0 +1,77 @@
1CMD-Preonic
2===================
3The CMD project seeks to improve productivity by optimizing usage of the left hand via clever use of the function layers.
4
5>Note: This project is currently optimized for grid layout, and has not been confirmed to work 100% on MIT layout, although it is expected to work correctly.
6
7----------
8
9Modes
10-------------
11
12#### QWERTY
13
14>CMD-Qwerty is very similar to the default Preonic with a few key differences:
15
16 - Dual-role Raise/Enter Key at Caps Lock position. -Don't need to take your hand off the mouse to submit URLs
17 - Space_Function under left space (Grid layout) -Don't need to take your thumb off of the spacebar to use lower.
18 - Dedicated arrow keys replaced with ( - , = , [ , and ] ) - big improvement for programmers who are used to fn layer.
19
20----------
21
22#### Game
23
24> Disables extra features to facilitate easier usage of the Preonic while gaming. this mode is toggled in the adjust layer.
25
26 - Dual Role Function key becomes Caps Lock.
27 - Space_Function disabled and replaced with normal spacebar.
28 - Windows Key disabled.
29
30----------
31
32#### Numpad
33
34> Enables left-hand numpad
35
36 - Left-side numpad
37 - Can be toggled on in Adjust layer (under . key)
38
39----------
40
41#### Arrow - (Lower)
42
43> Makes arrow keys easily accessible to Left Hand, and much more.
44
45 - Arrow keys at WASD, Backspace at Q, Delete at E.
46 - Media Keys near arrow cluster, mute at A.
47 - Web Nav keys.
48 - Mouse cluster at YGHJ.
49 - Numpad in right side of board.
50 - Can be toggled on in Adjust layer (Under , key)
51
52----------
53
54#### Function- (Raise)
55
56> Basic Functions. Open Keys for customization.
57
58 - Turns WASD into Navigation cluster (Home, End, Page up and Page Down)
59 - Pok3r style right hand arrow cluster for accessibility (familiar for many users.)
60 - Doubles as shift key for top row numbers.
61 - Print Screen, Insert, etc.
62
63----------
64
65#### Adjust- (Raise + Lower)
66
67> Switch Modes
68
69 - Default modes moved to the left and new layer toggle modes located to the right.
70 - Sleep and Wake keys added.
71 - Reset button moved under Spacebar(s).
72
73Notes:
74-------------
75
76Please feel free to reach out to Commandlinedesign@gmail.com with suggestions.
77Special Thanks to Jack for QMK firmware and the Preonic!
diff --git a/keyboards/preonic/keymaps/CMD-Preonic/keymap.c b/keyboards/preonic/keymaps/CMD-Preonic/keymap.c
new file mode 100644
index 000000000..5d217e261
--- /dev/null
+++ b/keyboards/preonic/keymaps/CMD-Preonic/keymap.c
@@ -0,0 +1,332 @@
1#include "preonic.h"
2#include "action_layer.h"
3#include "eeconfig.h"
4#ifdef AUDIO_ENABLE
5 #include "audio.h"
6#endif
7
8// Each layer gets a name for readability, which is then used in the keymap matrix below.
9// The underscores don't mean anything - you can have a layer called STUFF or any other name.
10// Layer names don't all need to be of the same length, obviously, and you can also skip them
11// entirely and just use numbers.
12#define _QWERTY 0
13#define _COLEMAK 1
14#define _DVORAK 2
15#define _GAME 3
16#define _ARROW 12
17#define _NUMPAD 13
18#define _LOWER 14
19#define _RAISE 15
20#define _ADJUST 16
21
22// Macro name shortcuts
23#define QWERTY M(_QWERTY)
24#define COLEMAK M(_COLEMAK)
25#define DVORAK M(_DVORAK)
26#define GAME M(_GAME)
27#define ARROW M(_ARROW)
28#define NUMPAD M(_NUMPAD)
29#define LOWER M(_LOWER)
30#define RAISE M(_RAISE)
31#define M_BL 5
32
33// Fillers to make layering more clear
34#define _______ KC_TRNS
35#define XXXXXXX KC_NO
36
37const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
38
39/* Qwerty
40 * ,-----------------------------------------------------------------------------------.
41 * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
42 * |------+------+------+------+------+------+------+------+------+------+------+------|
43 * | Tab | Q | W | E | R | T | Y | U | I | O | P | \ |
44 * |------+------+------+------+------+------+------+------+------+------+------+------|
45 * | Esc | A | S | D | F | G | H | J | K | L | ; | " |
46 * |------+------+------+------+------+------+------+------+------+------+------+------|
47 * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter |
48 * |------+------+------+------+------+------+------+------+------+------+------+------|
49 * | Brite| Ctrl | Alt | GUI |Lower | Space | Raise| - | = | [ | ] |
50 * `-----------------------------------------------------------------------------------'
51 */
52[_QWERTY] = {
53 {KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
54 {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLASH},
55 {LT(_RAISE, KC_ENT), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT},
56 {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
57 {M(M_BL), KC_LCTL, KC_LALT, KC_LGUI, LOWER, LT(_LOWER, KC_SPC), KC_SPC, RAISE, KC_MINUS, KC_EQUAL, KC_LBRC, KC_RBRC}
58},
59
60/* Colemak
61 * ,-----------------------------------------------------------------------------------.
62 * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
63 * |------+------+------+------+------+------+------+------+------+------+------+------|
64 * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Del |
65 * |------+------+------+------+------+-------------+------+------+------+------+------|
66 * | Esc | A | R | S | T | D | H | N | E | I | O | " |
67 * |------+------+------+------+------+------+------+------+------+------+------+------|
68 * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter |
69 * |------+------+------+------+------+------+------+------+------+------+------+------|
70 * | Brite| Ctrl | Alt | GUI |Lower | Space | Raise| - | = | [ | ] |
71 * `-----------------------------------------------------------------------------------'
72 */
73[_COLEMAK] = {
74 {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______},
75 {_______, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, _______},
76 {_______, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT},
77 {_______, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, _______},
78 {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}
79},
80
81/* Dvorak
82 * ,-----------------------------------------------------------------------------------.
83 * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
84 * |------+------+------+------+------+------+------+------+------+------+------+------|
85 * | Tab | " | , | . | P | Y | F | G | C | R | L | Del |
86 * |------+------+------+------+------+-------------+------+------+------+------+------|
87 * | Esc | A | O | E | U | I | D | H | T | N | S | / |
88 * |------+------+------+------+------+------|------+------+------+------+------+------|
89 * | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter |
90 * |------+------+------+------+------+------+------+------+------+------+------+------|
91 * | Brite| Ctrl | Alt | GUI |Lower | Space | Raise| - | = | [ | ] |
92 * `-----------------------------------------------------------------------------------'
93 */
94[_DVORAK] = {
95 {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______},
96 {_______, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, _______},
97 {_______, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, _______},
98 {_______, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, _______},
99 {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}
100},
101
102/* GAME
103 * ,-----------------------------------------------------------------------------------.
104 * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
105 * |------+------+------+------+------+------+------+------+------+------+------+------|
106 * | Tab | Q | W | E | R | T | Y | U | I | O | P | \ |
107 * |------+------+------+------+------+------+------+------+------+------+------+------|
108 * | CAPS | A | S | D | F | G | H | J | K | L | ; | " |
109 * |------+------+------+------+------+------+------+------+------+------+------+------|
110 * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter |
111 * |------+------+------+------+------+------+------+------+------+------+------+------|
112 * | Brite| Ctrl | Alt | XXX | Lower | Space | Raise| - | = | [ | ] |
113 * `-----------------------------------------------------------------------------------'
114 */
115[_GAME] = {
116 {KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
117 {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLASH},
118 {KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT},
119 {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
120 {_______, _______, _______, XXXXXXX, _______, _______, _______, _______, _______, _______, _______, _______}
121},
122
123/* NUMPAD
124 * ,-----------------------------------------------------------------------------------.
125 * | Esc | / | * | - | 4 | 5 | 6 | 7 | 8 | 9 | | |
126 * |------+------+------+------+------+------+------+------+------+------+------+------|
127 * | 7 | 8 | 9 | + | R | T | Y | U | I | O | P | \ |
128 * |------+------+------+------+------+------+------+------+------+------+------+------|
129 * | 4 | 5 | 6 | + | F | G | H | J | K | L | ; | " |
130 * |------+------+------+------+------+------+------+------+------+------+------+------|
131 * | 1 | 2 | 3 | Enter| V | B | N | M | , | . | / |Enter |
132 * |------+------+------+------+------+------+------+------+------+------+------+------|
133 * | 0 | 0 | . | Enter| Lower| Space | Raise| - | = | [ | ] |
134 * `-----------------------------------------------------------------------------------'
135 */
136[_NUMPAD] = {
137 {KC_ESC, KC_PSLS, KC_PAST, KC_PMNS, _______, _______, _______, _______, _______, _______, _______, _______},
138 {KC_P7, KC_P8, KC_P9, KC_PPLS, _______, _______, _______, _______, _______, _______, _______, _______},
139 {KC_P4, KC_P5, KC_P6, KC_PPLS, _______, _______, _______, _______, _______, _______, _______, _______},
140 {KC_P1, KC_P2, KC_P3, KC_PENT, _______, _______, _______, _______, _______, _______, _______, _______},
141 {KC_P0, KC_P0, KC_PDOT, KC_PENT, _______, _______, _______, _______, _______, _______, _______, _______},
142},
143/* Lower
144 * ,-----------------------------------------------------------------------------------.
145 * | ` | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | Del |
146 * |------+------+------+------+------+------+------+------+------+------+------+------|
147 * | Mute | BkSpc| Up | Del | Forwd| MBtn1| MUp| MBtn2| / | 7 | 8 | 9 |
148 * |------+------+------+------+------+------+------+------+------+------+------+------|
149 * | | Left | Down | Right| Refr MLeft| MDn |MRight| * | 4 | 5 | 6 |
150 * |------+------+------+------+------+------+------+------+------+------+------+------|
151 * | Vol+| Prev | Play | Next | Back | MWDn| MBtn3| MWUp | - | 1 | 2 | 3 |
152 * |------+------+------+------+------+------+------+------+------+------+------+------|
153 * | Vol- | | | | | | | + | Enter| 0 | . |
154 * `-----------------------------------------------------------------------------------'
155 */
156[_LOWER] = {
157 {KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_DEL},
158 {KC_MUTE, KC_BSPC, KC_UP, KC_DEL, KC_WWW_FORWARD, KC_BTN1, KC_MS_U, KC_BTN2, KC_PSLS, KC_P7, KC_P8, KC_P9},
159 {_______, KC_LEFT, KC_DOWN, KC_RIGHT, KC_WWW_REFRESH, KC_MS_L, KC_MS_D, KC_MS_R, KC_PAST, KC_P4, KC_P5, KC_P6},
160 {KC_VOLU, KC_MPRV, KC_MPLY, KC_MNXT, KC_WWW_BACK, KC_WH_D, KC_BTN3, KC_WH_U, KC_PMNS, KC_P1, KC_P2, KC_P3},
161 {KC_VOLD, _______, _______, _______, _______, _______, _______, _______, KC_PPLS, KC_PENT, KC_P0, KC_PDOT}
162},
163
164/* Raise
165 * ,-----------------------------------------------------------------------------------.
166 * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | |
167 * |------+------+------+------+------+------+------+------+------+------+------+------|
168 * | | Bksp | PgUp | Del | | | | PgUp | Up | PgDn | | |
169 * |------+------+------+------+------+------+------+------+------+------+------+------|
170 * | | Home | PgDn | End | | | Home | Left | Down | Right| ] | \ |
171 * |------+------+------+------+------+------+------+------+------+------+------+------|
172 * | | Pause| Ins | | | Print|Screen| End | | | |Enter |
173 * |------+------+------+------+------+------+------+------+------+------+------+------|
174 * | | | | | | | | | | | |
175 * `-----------------------------------------------------------------------------------'
176 */
177[_RAISE] = {
178 {KC_GRV, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC},
179 {_______, KC_BSPC, KC_PGUP, KC_DEL, _______, _______, _______, KC_PGUP, KC_UP, _______, _______, _______},
180 {_______, KC_HOME, KC_PGDN, KC_END, _______, _______, KC_HOME, KC_LEFT, KC_DOWN, KC_RIGHT, _______, _______},
181 {_______, KC_PAUSE, KC_INS, _______, KC_PSCR, KC_PSCR, _______, KC_END, _______, _______, _______, _______},
182 {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}
183},
184
185/* Adjust (Lower + Raise)
186 * ,-----------------------------------------------------------------------------------.
187 * | | |qwerty|ColMak|Dvorak| | | | | | | |
188 * |------+------+------+------+------+------+------+------+------+------+------+------|
189 * | | | |AGNorm|AGSwap| | | | | | | |
190 * |------+------+------+------+------+------+------+------+------+------+------+------|
191 * | | | |Aud On|AudOff|MidiOn|MdiOff| | | | | |
192 * |------+------+------+------+------+------+------+------+------+------+------+------|
193 * | |Voice-|Voice+|Mus On|MusOff| Sleep| Wake | Arrow| Game |NUMPAD| | |
194 * |------+------+------+------+------+------+------+------+------+------+------+------|
195 * | | | | | | Reset | | | | | |
196 * `-----------------------------------------------------------------------------------'
197 */
198[_ADJUST] = {
199 {_______, _______, QWERTY, COLEMAK, DVORAK, _______, _______, _______, _______, _______, _______, _______},
200 {_______, RESET, _______, AG_NORM, AG_SWAP, _______, _______, _______, _______, _______, _______, KC_DEL},
201 {_______, _______, _______, AU_ON, AU_OFF, MI_ON, MI_OFF, QWERTY, COLEMAK, DVORAK, _______, _______},
202 {_______, MUV_DE, MUV_IN, MU_ON, MU_OFF, KC_SYSTEM_SLEEP, KC_SYSTEM_WAKE, ARROW, GAME, NUMPAD, _______, _______},
203 {_______, _______, _______, _______, _______, RESET, RESET, _______, _______, _______, _______, _______}
204}
205
206
207};
208
209const uint16_t PROGMEM fn_actions[] = {
210
211};
212
213#ifdef AUDIO_ENABLE
214float start_up[][2] = {
215 {440.0*pow(2.0,(14)/12.0), 20},
216 {440.0*pow(2.0,(26)/12.0), 8},
217 {440.0*pow(2.0,(18)/12.0), 20},
218 {440.0*pow(2.0,(26)/12.0), 8}
219};
220
221float tone_qwerty[][2] = SONG(QWERTY_SOUND);
222float tone_dvorak[][2] = SONG(DVORAK_SOUND);
223float tone_colemak[][2] = SONG(COLEMAK_SOUND);
224
225float goodbye[][2] = SONG(GOODBYE_SOUND);
226#endif
227
228void persistant_default_layer_set(uint16_t default_layer) {
229 eeconfig_update_default_layer(default_layer);
230 default_layer_set(default_layer);
231}
232
233const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
234{
235 switch(id) {
236 case _QWERTY:
237 if (record->event.pressed) {
238 #ifdef AUDIO_ENABLE
239 PLAY_NOTE_ARRAY(tone_qwerty, false, 0);
240 #endif
241 persistant_default_layer_set(1UL<<_QWERTY);
242 }
243 break;
244 case _COLEMAK:
245 if (record->event.pressed) {
246 #ifdef AUDIO_ENABLE
247 PLAY_NOTE_ARRAY(tone_colemak, false, 0);
248 #endif
249 persistant_default_layer_set(1UL<<_COLEMAK);
250 }
251 break;
252 case _DVORAK:
253 if (record->event.pressed) {
254 #ifdef AUDIO_ENABLE
255 PLAY_NOTE_ARRAY(tone_dvorak, false, 0);
256 #endif
257 persistant_default_layer_set(1UL<<_DVORAK);
258 }
259 break;
260 case _GAME:
261 if (record->event.pressed) {
262 #ifdef AUDIO_ENABLE
263 PLAY_NOTE_ARRAY(tone_colemak, false, 0);
264 #endif
265 persistant_default_layer_set(1UL<<_GAME);
266 }
267 break;
268 case _NUMPAD:
269 if (record->event.pressed) {
270 #ifdef AUDIO_ENABLE
271 PLAY_NOTE_ARRAY(tone_dvorak, false, 0);
272 #endif
273 persistant_default_layer_set(1UL<<_NUMPAD);
274 }
275 break;
276 case _ARROW:
277 if (record->event.pressed) {
278 #ifdef AUDIO_ENABLE
279 PLAY_NOTE_ARRAY(tone_colemak, false, 0);
280 #endif
281 persistant_default_layer_set(1UL<<_LOWER);
282 }
283 break;
284 case _LOWER:
285 if (record->event.pressed) {
286 layer_on(_LOWER);
287 update_tri_layer(_LOWER, _RAISE, _ADJUST);
288 } else {
289 layer_off(_LOWER);
290 update_tri_layer(_LOWER, _RAISE, _ADJUST);
291 }
292 break;
293 case _RAISE:
294 if (record->event.pressed) {
295 layer_on(_RAISE);
296 update_tri_layer(_LOWER, _RAISE, _ADJUST);
297 } else {
298 layer_off(_RAISE);
299 update_tri_layer(_LOWER, _RAISE, _ADJUST);
300 }
301 break;
302 case M_BL:
303 if (record->event.pressed) {
304 register_code(KC_RSFT);
305 #ifdef BACKLIGHT_ENABLE
306 backlight_step();
307 #endif
308 } else {
309 unregister_code(KC_RSFT);
310 }
311 break;
312 }
313 return MACRO_NONE;
314};
315
316
317void matrix_init_user(void) {
318 #ifdef AUDIO_ENABLE
319 _delay_ms(20); // gets rid of tick
320 PLAY_NOTE_ARRAY(start_up, false, 0);
321 #endif
322}
323
324#ifdef AUDIO_ENABLE
325
326void play_goodbye_tone()
327{
328 PLAY_NOTE_ARRAY(goodbye, false, 0);
329 _delay_ms(150);
330}
331
332#endif
diff --git a/keyboards/preonic/keymaps/CMD-Preonic/makefile b/keyboards/preonic/keymaps/CMD-Preonic/makefile
new file mode 100644
index 000000000..2f7787e86
--- /dev/null
+++ b/keyboards/preonic/keymaps/CMD-Preonic/makefile
@@ -0,0 +1,23 @@
1# Build Options
2# change to "no" to disable the options, or define them in the Makefile in
3# the appropriate keymap folder that will get included automatically
4#
5BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
6MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
7EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
8CONSOLE_ENABLE = no # Console for debug(+400)
9COMMAND_ENABLE = no # Commands for debug and configuration
10NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
11BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
12MIDI_ENABLE = no # MIDI controls
13AUDIO_ENABLE = yes # Audio output on port C6
14UNICODE_ENABLE = no # Unicode
15BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
16RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time.
17
18# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
19SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
20
21ifndef QUANTUM_DIR
22 include ../../../../Makefile
23endif
diff --git a/keyboards/satan/keymaps/default/Makefile b/keyboards/satan/keymaps/default/Makefile
new file mode 100644
index 000000000..2a7ff2779
--- /dev/null
+++ b/keyboards/satan/keymaps/default/Makefile
@@ -0,0 +1,21 @@
1# Build Options
2# change to "no" to disable the options, or define them in the Makefile in
3# the appropriate keymap folder that will get included automatically
4#
5BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
6MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
7EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
8CONSOLE_ENABLE = no # Console for debug(+400)
9COMMAND_ENABLE = yes # Commands for debug and configuration
10NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
11BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
12MIDI_ENABLE = no # MIDI controls
13AUDIO_ENABLE = no # Audio output on port C6
14UNICODE_ENABLE = no # Unicode
15BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
16RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time.
17SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
18
19ifndef QUANTUM_DIR
20 include ../../../../Makefile
21endif
diff --git a/keyboards/satan/keymaps/default/keymap.c b/keyboards/satan/keymaps/default/keymap.c
index 35dbbb77b..3806137e7 100644
--- a/keyboards/satan/keymaps/default/keymap.c
+++ b/keyboards/satan/keymaps/default/keymap.c
@@ -11,6 +11,8 @@
11#define _BL 0 11#define _BL 0
12#define _FL 1 12#define _FL 1
13 13
14#define _______ KC_TRNS
15
14const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 16const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
15 /* Keymap _BL: (Base Layer) Default Layer 17 /* Keymap _BL: (Base Layer) Default Layer
16 * ,-----------------------------------------------------------. 18 * ,-----------------------------------------------------------.
@@ -26,11 +28,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
26 * `-----------------------------------------------------------' 28 * `-----------------------------------------------------------'
27 */ 29 */
28[_BL] = KEYMAP( 30[_BL] = KEYMAP(
29 F(0), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \ 31 F(0), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \
30 KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, \ 32 KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC,KC_BSLS, \
31 KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT, KC_ENT, \ 33 KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT, KC_ENT, \
32 KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSFT, \ 34 KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSFT, \
33 KC_LCTL, KC_LGUI,KC_LALT, KC_SPC, KC_RALT, KC_RGUI, MO(_FL), KC_RCTL), 35 KC_LCTL, KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI, MO(_FL),KC_RCTL),
34 36
35 /* Keymap _FL: Function Layer 37 /* Keymap _FL: Function Layer
36 * ,-----------------------------------------------------------. 38 * ,-----------------------------------------------------------.
@@ -47,17 +49,17 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
47 */ 49 */
48[_FL] = KEYMAP( 50[_FL] = KEYMAP(
49 #ifdef RGBLIGHT_ENABLE 51 #ifdef RGBLIGHT_ENABLE
50 KC_GRV, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET, \ 52 KC_GRV, _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,RESET, \
51 KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, BL_DEC, BL_INC, BL_TOGG, \ 53 _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, BL_DEC,BL_INC, BL_TOGG, \
52 KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ 54 _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______, \
53 KC_TRNS,RGB_TOG,RGB_MOD,RGB_HUI,RGB_HUD,RGB_SAI,RGB_SAD,RGB_VAI,RGB_VAD, KC_TRNS, KC_TRNS, KC_TRNS, \ 55 _______,RGB_TOG,RGB_MOD,RGB_HUI,RGB_HUD,RGB_SAI,RGB_SAD,RGB_VAI,RGB_VAD,_______,_______,_______, \
54 KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), 56 _______,_______,_______, _______, _______,_______,_______, _______),
55 #else 57 #else
56 KC_GRV, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET, \ 58 KC_GRV, _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,RESET, \
57 KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, BL_DEC, BL_INC, BL_TOGG, \ 59 _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, BL_DEC, BL_INC,BL_TOGG, \
58 KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ 60 _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, \
59 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ 61 _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, \
60 KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), 62 _______,_______,_______, _______, _______,_______,_______,_______),
61 #endif 63 #endif
62}; 64};
63 65
diff --git a/keyboards/satan/keymaps/default/readme.md b/keyboards/satan/keymaps/default/readme.md
new file mode 100644
index 000000000..c366147df
--- /dev/null
+++ b/keyboards/satan/keymaps/default/readme.md
@@ -0,0 +1 @@
# default Satan GH60 layout
diff --git a/keyboards/satan/keymaps/sethbc/keymap.c b/keyboards/satan/keymaps/sethbc/keymap.c
index f8991f9fd..82c779081 100644
--- a/keyboards/satan/keymaps/sethbc/keymap.c
+++ b/keyboards/satan/keymaps/sethbc/keymap.c
@@ -10,6 +10,9 @@
10#define _BL 0 10#define _BL 0
11#define _FL 1 11#define _FL 1
12 12
13// Fillers to make layering more clear
14#define _______ KC_TRNS
15
13const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 16const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
14 /* Keymap _BL: (Base Layer) Default Layer 17 /* Keymap _BL: (Base Layer) Default Layer
15 * ,-----------------------------------------------------------. 18 * ,-----------------------------------------------------------.
@@ -33,17 +36,17 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
33 36
34[_FL] = KEYMAP_HHKB( 37[_FL] = KEYMAP_HHKB(
35 #ifdef RGBLIGHT_ENABLE 38 #ifdef RGBLIGHT_ENABLE
36 KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, RESET, \ 39 KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, RESET, \
37 KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, KC_TRNS, KC_BSPC, \ 40 KC_CAPS, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, _______, KC_DEL, \
38 KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_TRNS, KC_TRNS, KC_PAST, KC_PSLS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, KC_PENT, \ 41 _______, KC_VOLD, KC_VOLU, KC_MUTE, _______, _______, KC_PAST, KC_PSLS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, KC_PENT, \
39 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PPLS, KC_PMNS, KC_END, KC_PGDN, KC_DOWN, KC_TRNS, KC_TRNS, \ 42 _______, _______, _______, _______, _______, _______, KC_PPLS, KC_PMNS, KC_END, KC_PGDN, KC_DOWN, _______, _______, \
40 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), 43 _______, _______, _______, _______, _______, _______, _______, _______),
41 #else 44 #else
42 KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, RESET, \ 45 KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, RESET, \
43 KC_CAPS, KC_TRNS, RGB_TOG,RGB_MOD,RGB_HUI, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, KC_TRNS, KC_BSPC, \ 46 KC_CAPS, _______, RGB_TOG,RGB_MOD,RGB_HUI, _______, _______, _______, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, _______, KC_DEL, \
44 KC_TRNS, KC_VOLD, RGB_HUD,RGB_SAI,RGB_SAD, KC_TRNS, KC_PAST, KC_PSLS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, KC_PENT, \ 47 _______, KC_VOLD, RGB_HUD,RGB_SAI,RGB_SAD, _______, KC_PAST, KC_PSLS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, KC_PENT, \
45 KC_TRNS, RGB_VAI,RGB_VAD,KC_TRNS, KC_TRNS, KC_TRNS, KC_PPLS, KC_PMNS, KC_END, KC_PGDN, KC_DOWN, KC_TRNS, KC_TRNS, \ 48 _______, RGB_VAI,RGB_VAD,_______, _______, _______, KC_PPLS, KC_PMNS, KC_END, KC_PGDN, KC_DOWN, _______, _______, \
46 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), 49 _______, _______, _______, _______, _______, _______, _______, _______),
47 #endif 50 #endif
48}; 51};
49 52
diff --git a/keyboards/satan/keymaps/sethbc/readme.md b/keyboards/satan/keymaps/sethbc/readme.md
new file mode 100644
index 000000000..ed0eb8701
--- /dev/null
+++ b/keyboards/satan/keymaps/sethbc/readme.md
@@ -0,0 +1,3 @@
1# sethbc's Satan GH60 layout
2
3HHKB style split right shift and split backspace. Largely based on the HHKB layout.
diff --git a/keyboards/satan/readme.md b/keyboards/satan/readme.md
index aa301f020..aaf189746 100644
--- a/keyboards/satan/readme.md
+++ b/keyboards/satan/readme.md
@@ -1,4 +1,4 @@
1Clueboard keyboard firmware 1Satan GH60 keyboard firmware
2====================== 2======================
3 3
4TODO: to be updated. 4TODO: to be updated.
diff --git a/keyboards/satan/satan.h b/keyboards/satan/satan.h
index fa1711915..513446bf3 100644
--- a/keyboards/satan/satan.h
+++ b/keyboards/satan/satan.h
@@ -3,7 +3,7 @@
3 3
4#include "quantum.h" 4#include "quantum.h"
5 5
6/* Clueboard matrix layout 6/* Satan GH60 matrix layout
7 * ,-----------------------------------------------------------. 7 * ,-----------------------------------------------------------.
8 * | 00 |01| 02| 03| 04| 05| 06| 07| 08| 09| 0a| 0b| 0c| 0d | 8 * | 00 |01| 02| 03| 04| 05| 06| 07| 08| 09| 0a| 0b| 0c| 0d |
9 * |-----------------------------------------------------------| 9 * |-----------------------------------------------------------|
diff --git a/quantum/keymap_extras/keymap_bepo.h b/quantum/keymap_extras/keymap_bepo.h
index 4c3096054..e5ef39552 100644
--- a/quantum/keymap_extras/keymap_bepo.h
+++ b/quantum/keymap_extras/keymap_bepo.h
@@ -118,7 +118,7 @@
118// Fourth row 118// Fourth row
119#define BP_COLON LSFT(BP_DOT) // : 119#define BP_COLON LSFT(BP_DOT) // :
120#define BP_COLN BP_COLON 120#define BP_COLN BP_COLON
121#define BP_QUESTION LSFT(BP_QUOTE) // ? 121#define BP_QUESTION LSFT(BP_APOS) // ?
122#define BP_QEST BP_QUESTION 122#define BP_QEST BP_QUESTION
123 123
124// Space bar 124// Space bar
@@ -183,7 +183,7 @@
183// Third row 183// Third row
184#define BP_AE_LIGATURE ALTGR(BP_A) // æ 184#define BP_AE_LIGATURE ALTGR(BP_A) // æ
185#define BP_AE BP_AE_LIGATURE 185#define BP_AE BP_AE_LIGATURE
186#define BP_U_GRAVE AGR(BP_U) // ù 186#define BP_U_GRAVE ALTGR(BP_U) // ù
187#define BP_UGRV BP_U_GRAVE 187#define BP_UGRV BP_U_GRAVE
188#define BP_DEAD_TREMA ALTGR(BP_I) // dead ¨ (trema/umlaut/diaresis) 188#define BP_DEAD_TREMA ALTGR(BP_I) // dead ¨ (trema/umlaut/diaresis)
189#define BP_DTRM BP_DEAD_TREMA 189#define BP_DTRM BP_DEAD_TREMA
diff --git a/quantum/process_keycode/process_music.c b/quantum/process_keycode/process_music.c
index c8f3ddb90..2d52e47a7 100644
--- a/quantum/process_keycode/process_music.c
+++ b/quantum/process_keycode/process_music.c
@@ -6,6 +6,7 @@ int offset = 7;
6 6
7// music sequencer 7// music sequencer
8static bool music_sequence_recording = false; 8static bool music_sequence_recording = false;
9static bool music_sequence_recorded = false;
9static bool music_sequence_playing = false; 10static bool music_sequence_playing = false;
10static float music_sequence[16] = {0}; 11static float music_sequence[16] = {0};
11static uint8_t music_sequence_count = 0; 12static uint8_t music_sequence_count = 0;
@@ -77,6 +78,7 @@ bool process_music(uint16_t keycode, keyrecord_t *record) {
77 if (keycode == KC_LCTL && record->event.pressed) { // Start recording 78 if (keycode == KC_LCTL && record->event.pressed) { // Start recording
78 stop_all_notes(); 79 stop_all_notes();
79 music_sequence_recording = true; 80 music_sequence_recording = true;
81 music_sequence_recorded = false;
80 music_sequence_playing = false; 82 music_sequence_playing = false;
81 music_sequence_count = 0; 83 music_sequence_count = 0;
82 return false; 84 return false;
@@ -84,12 +86,15 @@ bool process_music(uint16_t keycode, keyrecord_t *record) {
84 86
85 if (keycode == KC_LALT && record->event.pressed) { // Stop recording/playing 87 if (keycode == KC_LALT && record->event.pressed) { // Stop recording/playing
86 stop_all_notes(); 88 stop_all_notes();
89 if (music_sequence_recording) { // was recording
90 music_sequence_recorded = true;
91 }
87 music_sequence_recording = false; 92 music_sequence_recording = false;
88 music_sequence_playing = false; 93 music_sequence_playing = false;
89 return false; 94 return false;
90 } 95 }
91 96
92 if (keycode == KC_LGUI && record->event.pressed) { // Start playing 97 if (keycode == KC_LGUI && record->event.pressed && music_sequence_recorded) { // Start playing
93 stop_all_notes(); 98 stop_all_notes();
94 music_sequence_recording = false; 99 music_sequence_recording = false;
95 music_sequence_playing = true; 100 music_sequence_playing = true;
diff --git a/quantum/process_keycode/process_tap_dance.c b/quantum/process_keycode/process_tap_dance.c
index b9b836df2..d240dc2e6 100644
--- a/quantum/process_keycode/process_tap_dance.c
+++ b/quantum/process_keycode/process_tap_dance.c
@@ -2,81 +2,70 @@
2 2
3static qk_tap_dance_state_t qk_tap_dance_state; 3static qk_tap_dance_state_t qk_tap_dance_state;
4 4
5static void _process_tap_dance_action_pair (qk_tap_dance_state_t *state, 5void qk_tap_dance_pair_finished (qk_tap_dance_state_t *state, void *user_data) {
6 uint16_t kc1, uint16_t kc2) { 6 qk_tap_dance_pair_t *pair = (qk_tap_dance_pair_t *)user_data;
7 uint16_t kc;
8 7
9 if (state->count == 0) 8 if (state->count == 1) {
10 return; 9 register_code (pair->kc1);
11 10 } else if (state->count == 2) {
12 kc = (state->count == 1) ? kc1 : kc2; 11 register_code (pair->kc2);
12 }
13}
13 14
14 register_code (kc); 15void qk_tap_dance_pair_reset (qk_tap_dance_state_t *state, void *user_data) {
15 unregister_code (kc); 16 qk_tap_dance_pair_t *pair = (qk_tap_dance_pair_t *)user_data;
16 17
17 if (state->count >= 2) { 18 if (state->count == 1) {
18 reset_tap_dance (state); 19 unregister_code (pair->kc1);
20 } else if (state->count == 2) {
21 unregister_code (pair->kc2);
19 } 22 }
20} 23}
21 24
22static void _process_tap_dance_action_fn (qk_tap_dance_state_t *state, 25static inline void _process_tap_dance_action_fn (qk_tap_dance_state_t *state,
26 void *user_data,
23 qk_tap_dance_user_fn_t fn) 27 qk_tap_dance_user_fn_t fn)
24{ 28{
25 if (fn) { 29 if (fn) {
26 fn(state); 30 fn(state, user_data);
27 } 31 }
28} 32}
29 33
30void process_tap_dance_action_on_each_tap (uint16_t keycode) 34static inline void process_tap_dance_action_on_each_tap (qk_tap_dance_action_t action)
31{ 35{
32 uint16_t idx = keycode - QK_TAP_DANCE; 36 _process_tap_dance_action_fn (&qk_tap_dance_state, action.user_data, action.fn.on_each_tap);
33 qk_tap_dance_action_t action;
34
35 action = tap_dance_actions[idx];
36
37 switch (action.type) {
38 case QK_TAP_DANCE_TYPE_FN:
39 _process_tap_dance_action_fn (&qk_tap_dance_state, action.fn.on_each_tap);
40 break;
41
42 default:
43 break;
44 }
45} 37}
46 38
47void process_tap_dance_action_on_dance_finished (uint16_t keycode) 39static inline void process_tap_dance_action_on_dance_finished (qk_tap_dance_action_t action)
48{ 40{
49 uint16_t idx = keycode - QK_TAP_DANCE; 41 _process_tap_dance_action_fn (&qk_tap_dance_state, action.user_data, action.fn.on_dance_finished);
50 qk_tap_dance_action_t action; 42}
51
52 action = tap_dance_actions[idx];
53
54 switch (action.type) {
55 case QK_TAP_DANCE_TYPE_PAIR:
56 _process_tap_dance_action_pair (&qk_tap_dance_state,
57 action.pair.kc1, action.pair.kc2);
58 break;
59 case QK_TAP_DANCE_TYPE_FN:
60 _process_tap_dance_action_fn (&qk_tap_dance_state, action.fn.on_dance_finished);
61 break;
62 43
63 default: 44static inline void process_tap_dance_action_on_reset (qk_tap_dance_action_t action)
64 break; 45{
65 } 46 _process_tap_dance_action_fn (&qk_tap_dance_state, action.user_data, action.fn.on_reset);
66} 47}
67 48
68bool process_tap_dance(uint16_t keycode, keyrecord_t *record) { 49bool process_tap_dance(uint16_t keycode, keyrecord_t *record) {
69 bool r = true; 50 bool r = true;
51 uint16_t idx = keycode - QK_TAP_DANCE;
52 qk_tap_dance_action_t action;
70 53
71 switch(keycode) { 54 switch(keycode) {
72 case QK_TAP_DANCE ... QK_TAP_DANCE_MAX: 55 case QK_TAP_DANCE ... QK_TAP_DANCE_MAX:
73 process_tap_dance_action_on_each_tap (qk_tap_dance_state.keycode); 56 action = tap_dance_actions[idx];
57
58 process_tap_dance_action_on_each_tap (action);
74 if (qk_tap_dance_state.keycode && qk_tap_dance_state.keycode != keycode) { 59 if (qk_tap_dance_state.keycode && qk_tap_dance_state.keycode != keycode) {
75 process_tap_dance_action_on_dance_finished (qk_tap_dance_state.keycode); 60 process_tap_dance_action_on_dance_finished (action);
61 } else if (qk_tap_dance_state.active && qk_tap_dance_state.pressed) {
62 reset_tap_dance (&qk_tap_dance_state);
76 } else { 63 } else {
77 r = false; 64 r = false;
78 } 65 }
79 66
67 qk_tap_dance_state.active = true;
68 qk_tap_dance_state.pressed = record->event.pressed;
80 if (record->event.pressed) { 69 if (record->event.pressed) {
81 qk_tap_dance_state.keycode = keycode; 70 qk_tap_dance_state.keycode = keycode;
82 qk_tap_dance_state.timer = timer_read (); 71 qk_tap_dance_state.timer = timer_read ();
@@ -87,9 +76,13 @@ bool process_tap_dance(uint16_t keycode, keyrecord_t *record) {
87 default: 76 default:
88 if (qk_tap_dance_state.keycode) { 77 if (qk_tap_dance_state.keycode) {
89 // if we are here, the tap dance was interrupted by a different key 78 // if we are here, the tap dance was interrupted by a different key
90 process_tap_dance_action_on_each_tap (qk_tap_dance_state.keycode); 79 idx = qk_tap_dance_state.keycode - QK_TAP_DANCE;
91 process_tap_dance_action_on_dance_finished (qk_tap_dance_state.keycode); 80 action = tap_dance_actions[idx];
81
82 process_tap_dance_action_on_each_tap (action);
83 process_tap_dance_action_on_dance_finished (action);
92 reset_tap_dance (&qk_tap_dance_state); 84 reset_tap_dance (&qk_tap_dance_state);
85 qk_tap_dance_state.active = false;
93 } 86 }
94 break; 87 break;
95 } 88 }
@@ -98,9 +91,12 @@ bool process_tap_dance(uint16_t keycode, keyrecord_t *record) {
98} 91}
99 92
100void matrix_scan_tap_dance () { 93void matrix_scan_tap_dance () {
101 if (qk_tap_dance_state.keycode && timer_elapsed (qk_tap_dance_state.timer) > TAPPING_TERM) { 94 if (qk_tap_dance_state.active && timer_elapsed (qk_tap_dance_state.timer) > TAPPING_TERM) {
102 // if we are here, the tap dance was timed out 95 // if we are here, the tap dance was timed out
103 process_tap_dance_action_on_dance_finished (qk_tap_dance_state.keycode); 96 uint16_t idx = qk_tap_dance_state.keycode - QK_TAP_DANCE;
97 qk_tap_dance_action_t action = tap_dance_actions[idx];
98
99 process_tap_dance_action_on_dance_finished (action);
104 reset_tap_dance (&qk_tap_dance_state); 100 reset_tap_dance (&qk_tap_dance_state);
105 } 101 }
106} 102}
@@ -109,18 +105,13 @@ void reset_tap_dance (qk_tap_dance_state_t *state) {
109 uint16_t idx = state->keycode - QK_TAP_DANCE; 105 uint16_t idx = state->keycode - QK_TAP_DANCE;
110 qk_tap_dance_action_t action; 106 qk_tap_dance_action_t action;
111 107
112 action = tap_dance_actions[idx]; 108 if (state->pressed)
113 switch (action.type) { 109 return;
114 case QK_TAP_DANCE_TYPE_FN:
115 if (action.fn.on_reset) {
116 action.fn.on_reset(state);
117 }
118 break;
119 110
120 default: 111 action = tap_dance_actions[idx];
121 break; 112 process_tap_dance_action_on_reset (action);
122 }
123 113
124 state->keycode = 0; 114 state->keycode = 0;
125 state->count = 0; 115 state->count = 0;
116 state->active = false;
126} 117}
diff --git a/quantum/process_keycode/process_tap_dance.h b/quantum/process_keycode/process_tap_dance.h
index 7b820584a..e2c74efe9 100644
--- a/quantum/process_keycode/process_tap_dance.h
+++ b/quantum/process_keycode/process_tap_dance.h
@@ -11,46 +11,40 @@ typedef struct
11 uint8_t count; 11 uint8_t count;
12 uint16_t keycode; 12 uint16_t keycode;
13 uint16_t timer; 13 uint16_t timer;
14 bool active:1;
15 bool pressed:1;
14} qk_tap_dance_state_t; 16} qk_tap_dance_state_t;
15 17
16#define TD(n) (QK_TAP_DANCE + n) 18#define TD(n) (QK_TAP_DANCE + n)
17 19
18typedef enum 20typedef void (*qk_tap_dance_user_fn_t) (qk_tap_dance_state_t *state, void *user_data);
19{
20 QK_TAP_DANCE_TYPE_PAIR,
21 QK_TAP_DANCE_TYPE_FN,
22} qk_tap_dance_type_t;
23
24typedef void (*qk_tap_dance_user_fn_t) (qk_tap_dance_state_t *state);
25 21
26typedef struct 22typedef struct
27{ 23{
28 qk_tap_dance_type_t type; 24 struct {
29 union { 25 qk_tap_dance_user_fn_t on_each_tap;
30 struct { 26 qk_tap_dance_user_fn_t on_dance_finished;
31 uint16_t kc1; 27 qk_tap_dance_user_fn_t on_reset;
32 uint16_t kc2; 28 } fn;
33 } pair; 29 void *user_data;
34 struct {
35 qk_tap_dance_user_fn_t on_each_tap;
36 qk_tap_dance_user_fn_t on_dance_finished;
37 qk_tap_dance_user_fn_t on_reset;
38 } fn;
39 };
40} qk_tap_dance_action_t; 30} qk_tap_dance_action_t;
41 31
32typedef struct
33{
34 uint16_t kc1;
35 uint16_t kc2;
36} qk_tap_dance_pair_t;
37
42#define ACTION_TAP_DANCE_DOUBLE(kc1, kc2) { \ 38#define ACTION_TAP_DANCE_DOUBLE(kc1, kc2) { \
43 .type = QK_TAP_DANCE_TYPE_PAIR, \ 39 .fn = { NULL, qk_tap_dance_pair_finished, qk_tap_dance_pair_reset }, \
44 .pair = { kc1, kc2 } \ 40 .user_data = (void *)&((qk_tap_dance_pair_t) { kc1, kc2 }) \
45 } 41 }
46 42
47#define ACTION_TAP_DANCE_FN(user_fn) { \ 43#define ACTION_TAP_DANCE_FN(user_fn) { \
48 .type = QK_TAP_DANCE_TYPE_FN, \
49 .fn = { NULL, user_fn, NULL } \ 44 .fn = { NULL, user_fn, NULL } \
50 } 45 }
51 46
52#define ACTION_TAP_DANCE_FN_ADVANCED(user_fn_on_each_tap, user_fn_on_dance_finished, user_fn_on_reset) { \ 47#define ACTION_TAP_DANCE_FN_ADVANCED(user_fn_on_each_tap, user_fn_on_dance_finished, user_fn_on_reset) { \
53 .type = QK_TAP_DANCE_TYPE_FN, \
54 .fn = { user_fn_on_each_tap, user_fn_on_dance_finished, user_fn_on_reset } \ 48 .fn = { user_fn_on_each_tap, user_fn_on_dance_finished, user_fn_on_reset } \
55 } 49 }
56 50
@@ -62,6 +56,9 @@ bool process_tap_dance(uint16_t keycode, keyrecord_t *record);
62void matrix_scan_tap_dance (void); 56void matrix_scan_tap_dance (void);
63void reset_tap_dance (qk_tap_dance_state_t *state); 57void reset_tap_dance (qk_tap_dance_state_t *state);
64 58
59void qk_tap_dance_pair_finished (qk_tap_dance_state_t *state, void *user_data);
60void qk_tap_dance_pair_reset (qk_tap_dance_state_t *state, void *user_data);
61
65#else 62#else
66 63
67#define TD(n) KC_NO 64#define TD(n) KC_NO
diff --git a/readme.md b/readme.md
index 9a4c314dc..affee1b62 100644
--- a/readme.md
+++ b/readme.md
@@ -346,6 +346,8 @@ That's what `KC_LEAD` does. Here's an example:
3463. Within your `matrix_scan_user` function, do something like this: 3463. Within your `matrix_scan_user` function, do something like this:
347 347
348``` 348```
349LEADER_EXTERNS();
350
349void matrix_scan_user(void) { 351void matrix_scan_user(void) {
350 LEADER_DICTIONARY() { 352 LEADER_DICTIONARY() {
351 leading = false; 353 leading = false;
@@ -373,7 +375,7 @@ As you can see, you have three function. you can use - `SEQ_ONE_KEY` for single-
373 375
374### Tap Dance: A single key can do 3, 5, or 100 different things 376### Tap Dance: A single key can do 3, 5, or 100 different things
375 377
376Hit the semicolon key once, send a semicolon. Hit it twice, rapidly -- send a colon. Hit it three times, and your keyboard's LEDs do a wild dance. That's just one example of what Tap Dance can do. It's one of the nicest community-contributed features in the firmware, conceived and created by [algernon](https://github.com/algernon) in [#451](https://github.com/jackhumbert/qmk_firmware/pull/451). Here's how Algernon describes the feature: 378Hit the semicolon key once, send a semicolon. Hit it twice, rapidly -- send a colon. Hit it three times, and your keyboard's LEDs do a wild dance. That's just one example of what Tap Dance can do. It's one of the nicest community-contributed features in the firmware, conceived and created by [algernon](https://github.com/algernon) in [#451](https://github.com/jackhumbert/qmk_firmware/pull/451). Here's how algernon describes the feature:
377 379
378With this feature one can specify keys that behave differently, based on the amount of times they have been tapped, and when interrupted, they get handled before the interrupter. 380With this feature one can specify keys that behave differently, based on the amount of times they have been tapped, and when interrupted, they get handled before the interrupter.
379 381
@@ -389,7 +391,7 @@ First, you will need `TAP_DANCE_ENABLE=yes` in your `Makefile`, because the feat
389 391
390This array specifies what actions shall be taken when a tap-dance key is in action. Currently, there are three possible options: 392This array specifies what actions shall be taken when a tap-dance key is in action. Currently, there are three possible options:
391 393
392* `ACTION_TAP_DANCE_DOUBLE(kc1, kc2)`: Sends the `kc1` keycode when tapped once, `kc2` otherwise. 394* `ACTION_TAP_DANCE_DOUBLE(kc1, kc2)`: Sends the `kc1` keycode when tapped once, `kc2` otherwise. When the key is held, the appropriate keycode is registered: `kc1` when pressed and held, `kc2` when tapped once, then pressed and held.
393* `ACTION_TAP_DANCE_FN(fn)`: Calls the specified function - defined in the user keymap - with the final tap count of the tap dance action. 395* `ACTION_TAP_DANCE_FN(fn)`: Calls the specified function - defined in the user keymap - with the final tap count of the tap dance action.
394* `ACTION_TAP_DANCE_FN_ADVANCED(on_each_tap_fn, on_dance_finished_fn, on_reset_fn)`: Calls the first specified function - defined in the user keymap - on every tap, the second function on when the dance action finishes (like the previous option), and the last function when the tap dance action resets. 396* `ACTION_TAP_DANCE_FN_ADVANCED(on_each_tap_fn, on_dance_finished_fn, on_reset_fn)`: Calls the first specified function - defined in the user keymap - on every tap, the second function on when the dance action finishes (like the previous option), and the last function when the tap dance action resets.
395 397
@@ -397,8 +399,6 @@ The first option is enough for a lot of cases, that just want dual roles. For ex
397 399
398And that's the bulk of it! 400And that's the bulk of it!
399 401
400Do note, however, that this implementation does have some consequences: keys do not register until either they reach the tapping ceiling, or they time out. This means that if you hold the key, nothing happens, no repeat, no nothing. It is possible to detect held state, and register an action then too, but that's not implemented yet. Keys also unregister immediately after being registered, so you can't even hold the second tap. This is intentional, to be consistent.
401
402And now, on to the explanation of how it works! 402And now, on to the explanation of how it works!
403 403
404The main entry point is `process_tap_dance()`, called from `process_record_quantum()`, which is run for every keypress, and our handler gets to run early. This function checks whether the key pressed is a tap-dance key. If it is not, and a tap-dance was in action, we handle that first, and enqueue the newly pressed key. If it is a tap-dance key, then we check if it is the same as the already active one (if there's one active, that is). If it is not, we fire off the old one first, then register the new one. If it was the same, we increment the counter and the timer. 404The main entry point is `process_tap_dance()`, called from `process_record_quantum()`, which is run for every keypress, and our handler gets to run early. This function checks whether the key pressed is a tap-dance key. If it is not, and a tap-dance was in action, we handle that first, and enqueue the newly pressed key. If it is a tap-dance key, then we check if it is the same as the already active one (if there's one active, that is). If it is not, we fire off the old one first, then register the new one. If it was the same, we increment the counter and the timer.
@@ -421,20 +421,25 @@ enum {
421 421
422/* Have the above three on the keymap, TD(CT_SE), etc... */ 422/* Have the above three on the keymap, TD(CT_SE), etc... */
423 423
424void dance_cln (qk_tap_dance_state_t *state) { 424void dance_cln_finished (qk_tap_dance_state_t *state, void *user_data) {
425 if (state->count == 1) { 425 if (state->count == 1) {
426 register_code (KC_RSFT); 426 register_code (KC_RSFT);
427 register_code (KC_SCLN); 427 register_code (KC_SCLN);
428 unregister_code (KC_SCLN);
429 unregister_code (KC_RSFT);
430 } else { 428 } else {
431 register_code (KC_SCLN); 429 register_code (KC_SCLN);
430 }
431}
432
433void dance_cln_reset (qk_tap_dance_state_t *state, void *user_data) {
434 if (state->count == 1) {
435 unregister_code (KC_RSFT);
436 unregister_code (KC_SCLN);
437 } else {
432 unregister_code (KC_SCLN); 438 unregister_code (KC_SCLN);
433 reset_tap_dance (state);
434 } 439 }
435} 440}
436 441
437void dance_egg (qk_tap_dance_state_t *state) { 442void dance_egg (qk_tap_dance_state_t *state, void *user_data) {
438 if (state->count >= 100) { 443 if (state->count >= 100) {
439 SEND_STRING ("Safety dance!"); 444 SEND_STRING ("Safety dance!");
440 reset_tap_dance (state); 445 reset_tap_dance (state);
@@ -443,7 +448,7 @@ void dance_egg (qk_tap_dance_state_t *state) {
443 448
444// on each tap, light up one led, from right to left 449// on each tap, light up one led, from right to left
445// on the forth tap, turn them off from right to left 450// on the forth tap, turn them off from right to left
446void dance_flsh_each(qk_tap_dance_state_t *state) { 451void dance_flsh_each(qk_tap_dance_state_t *state, void *user_data) {
447 switch (state->count) { 452 switch (state->count) {
448 case 1: 453 case 1:
449 ergodox_right_led_3_on(); 454 ergodox_right_led_3_on();
@@ -464,7 +469,7 @@ void dance_flsh_each(qk_tap_dance_state_t *state) {
464} 469}
465 470
466// on the fourth tap, set the keyboard on flash state 471// on the fourth tap, set the keyboard on flash state
467void dance_flsh_finished(qk_tap_dance_state_t *state) { 472void dance_flsh_finished(qk_tap_dance_state_t *state, void *user_data) {
468 if (state->count >= 4) { 473 if (state->count >= 4) {
469 reset_keyboard(); 474 reset_keyboard();
470 reset_tap_dance(state); 475 reset_tap_dance(state);
@@ -472,7 +477,7 @@ void dance_flsh_finished(qk_tap_dance_state_t *state) {
472} 477}
473 478
474// if the flash state didnt happen, then turn off leds, left to right 479// if the flash state didnt happen, then turn off leds, left to right
475void dance_flsh_reset(qk_tap_dance_state_t *state) { 480void dance_flsh_reset(qk_tap_dance_state_t *state, void *user_data) {
476 ergodox_right_led_1_off(); 481 ergodox_right_led_1_off();
477 _delay_ms(50); 482 _delay_ms(50);
478 ergodox_right_led_2_off(); 483 ergodox_right_led_2_off();
@@ -482,7 +487,7 @@ void dance_flsh_reset(qk_tap_dance_state_t *state) {
482 487
483const qk_tap_dance_action_t tap_dance_actions[] = { 488const qk_tap_dance_action_t tap_dance_actions[] = {
484 [CT_SE] = ACTION_TAP_DANCE_DOUBLE (KC_SPC, KC_ENT) 489 [CT_SE] = ACTION_TAP_DANCE_DOUBLE (KC_SPC, KC_ENT)
485 ,[CT_CLN] = ACTION_TAP_DANCE_FN (dance_cln) 490 ,[CT_CLN] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, dance_cln_finished, dance_cln_reset)
486 ,[CT_EGG] = ACTION_TAP_DANCE_FN (dance_egg) 491 ,[CT_EGG] = ACTION_TAP_DANCE_FN (dance_egg)
487 ,[CT_FLSH] = ACTION_TAP_DANCE_FN_ADVANCED (dance_flsh_each, dance_flsh_finished, dance_flsh_reset) 492 ,[CT_FLSH] = ACTION_TAP_DANCE_FN_ADVANCED (dance_flsh_each, dance_flsh_finished, dance_flsh_reset)
488}; 493};