aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--keyboards/ergodox_ez/keymaps/algernon/Makefile8
-rw-r--r--keyboards/ergodox_ez/keymaps/algernon/keymap.c165
-rw-r--r--keyboards/ergodox_ez/keymaps/algernon/readme.md9
-rw-r--r--keyboards/ergodox_ez/keymaps/algernon/tools/heatmap-adore-layout.json533
4 files changed, 687 insertions, 28 deletions
diff --git a/keyboards/ergodox_ez/keymaps/algernon/Makefile b/keyboards/ergodox_ez/keymaps/algernon/Makefile
index 005f9750c..6bf3976b9 100644
--- a/keyboards/ergodox_ez/keymaps/algernon/Makefile
+++ b/keyboards/ergodox_ez/keymaps/algernon/Makefile
@@ -4,13 +4,19 @@ SLEEP_LED_ENABLE=no
4UNICODE_ENABLE=no 4UNICODE_ENABLE=no
5FORCE_NKRO ?= yes 5FORCE_NKRO ?= yes
6DEBUG_ENABLE = no 6DEBUG_ENABLE = no
7CONSOLE_ENABLE = yes 7CONSOLE_ENABLE = no
8TAP_DANCE_ENABLE = yes 8TAP_DANCE_ENABLE = yes
9KEYLOGGER_ENABLE ?= yes
9 10
10ifeq (${FORCE_NKRO},yes) 11ifeq (${FORCE_NKRO},yes)
11OPT_DEFS += -DFORCE_NKRO 12OPT_DEFS += -DFORCE_NKRO
12endif 13endif
13 14
15ifeq (${KEYLOGGER_ENABLE},yes)
16OPT_DEFS += -DKEYLOGGER_ENABLE
17CONSOLE_ENABLE = yes
18endif
19
14KEYMAP_VERSION = $(shell \ 20KEYMAP_VERSION = $(shell \
15 if [ -d "${KEYMAP_PATH}/.git" ]; then \ 21 if [ -d "${KEYMAP_PATH}/.git" ]; then \
16 cd "${KEYMAP_PATH}" && git describe --abbrev=6 --dirty --always --tags --match 'v*' 2>/dev/null; \ 22 cd "${KEYMAP_PATH}" && git describe --abbrev=6 --dirty --always --tags --match 'v*' 2>/dev/null; \
diff --git a/keyboards/ergodox_ez/keymaps/algernon/keymap.c b/keyboards/ergodox_ez/keymaps/algernon/keymap.c
index 09d8dffd5..c12087292 100644
--- a/keyboards/ergodox_ez/keymaps/algernon/keymap.c
+++ b/keyboards/ergodox_ez/keymaps/algernon/keymap.c
@@ -95,7 +95,9 @@ enum {
95/* Custom keycodes */ 95/* Custom keycodes */
96 96
97enum { 97enum {
98 CT_CLN = 0 98 CT_CLN = 0,
99 CT_MNS,
100 CT_TA,
99}; 101};
100 102
101/* States & timers */ 103/* States & timers */
@@ -115,7 +117,11 @@ uint16_t oh_left_blink_timer = 0;
115uint8_t oh_right_blink = 0; 117uint8_t oh_right_blink = 0;
116uint16_t oh_right_blink_timer = 0; 118uint16_t oh_right_blink_timer = 0;
117 119
120#if KEYLOGGER_ENABLE
118bool log_enable = false; 121bool log_enable = false;
122#endif
123
124bool time_travel = false;
119 125
120/* The Keymap */ 126/* The Keymap */
121 127
@@ -146,7 +152,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
146// left hand 152// left hand
147 KC_GRV ,M(KF_1) ,M(KF_2) ,M(KF_3),M(KF_4),M(KF_5),M(A_PLVR) 153 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 154,M(A_MPN) ,KC_QUOT ,KC_COMM ,KC_DOT ,KC_P ,KC_Y ,KC_LBRC
149,LT(ARRW,KC_TAB) ,KC_A ,KC_O ,KC_E ,KC_U ,KC_I 155,TD(CT_TA) ,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 156,KC_MPLY ,KC_SLSH ,KC_Q ,KC_J ,KC_K ,KC_X ,KC_LPRN
151,KC_NO ,KC_NO ,KC_NO ,KC_NO ,TD(CT_CLN) 157,KC_NO ,KC_NO ,KC_NO ,KC_NO ,TD(CT_CLN)
152 158
@@ -155,11 +161,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
155 ,KC_BSPC,F(F_SFT),M(A_ESC) 161 ,KC_BSPC,F(F_SFT),M(A_ESC)
156 162
157 // right hand 163 // right hand
158 ,KC_APP ,M(KF_6),M(KF_7),M(KF_8),M(KF_9) ,M(KF_10) ,KC_F11 164 ,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 165 ,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 ,LT(ARRW, KC_EQL) 166 ,KC_D ,KC_H ,KC_T ,KC_N ,KC_S ,KC_EQL
161 ,KC_RPRN ,KC_B ,KC_M ,KC_W ,KC_V ,KC_Z ,KC_MSTP 167 ,KC_RPRN ,KC_B ,KC_M ,KC_W ,KC_V ,KC_Z ,KC_MSTP
162 ,KC_MINS,KC_NO ,KC_NO ,KC_NO ,KC_NO 168 ,TD(CT_MNS),KC_NO ,KC_NO ,KC_NO ,KC_NO
163 169
164 ,OSL(NMDIA),M(OH_LEFT) 170 ,OSL(NMDIA),M(OH_LEFT)
165 ,KC_LEAD 171 ,KC_LEAD
@@ -191,7 +197,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
191// left hand 197// left hand
192 KC_GRV ,M(KF_1) ,M(KF_2) ,M(KF_3),M(KF_4),M(KF_5),M(A_PLVR) 198 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_COMM ,KC_DOT ,KC_L ,KC_W ,KC_M ,KC_LBRC 199,M(A_MPN) ,KC_COMM ,KC_DOT ,KC_L ,KC_W ,KC_M ,KC_LBRC
194,LT(ARRW, KC_TAB) ,KC_A ,KC_O ,KC_E ,KC_I ,KC_U 200,TD(CT_TA) ,KC_A ,KC_O ,KC_E ,KC_I ,KC_U
195,KC_MPLY ,KC_SLSH ,KC_Z ,KC_QUOT,KC_K ,KC_X ,KC_LPRN 201,KC_MPLY ,KC_SLSH ,KC_Z ,KC_QUOT,KC_K ,KC_X ,KC_LPRN
196,KC_NO ,KC_NO ,KC_NO ,KC_NO ,TD(CT_CLN) 202,KC_NO ,KC_NO ,KC_NO ,KC_NO ,TD(CT_CLN)
197 203
@@ -200,11 +206,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
200 ,KC_BSPC,F(F_SFT),M(A_ESC) 206 ,KC_BSPC,F(F_SFT),M(A_ESC)
201 207
202 // right hand 208 // right hand
203 ,KC_APP ,M(KF_6),M(KF_7),M(KF_8),M(KF_9) ,M(KF_10) ,KC_F11 209 ,KC_APP ,M(KF_6),M(KF_7) ,M(KF_8),M(KF_9) ,M(KF_10) ,KC_F11
204 ,KC_RBRC ,KC_F ,KC_H ,KC_C ,KC_P ,KC_Y ,KC_BSLS 210 ,KC_RBRC ,KC_F ,KC_H ,KC_C ,KC_P ,KC_Y ,KC_BSLS
205 ,KC_D ,KC_R ,KC_T ,KC_N ,KC_S ,LT(ARRW, KC_EQL) 211 ,KC_D ,KC_R ,KC_T ,KC_N ,KC_S ,KC_EQL
206 ,KC_RPRN ,KC_B ,KC_G ,KC_V ,KC_J ,KC_Q ,KC_MSTP 212 ,KC_RPRN ,KC_B ,KC_G ,KC_V ,KC_J ,KC_Q ,KC_MSTP
207 ,KC_MINS,KC_NO ,KC_NO ,KC_NO ,KC_NO 213 ,TD(CT_MNS),KC_NO ,KC_NO ,KC_NO ,KC_NO
208 214
209 ,OSL(NMDIA),M(OH_LEFT) 215 ,OSL(NMDIA),M(OH_LEFT)
210 ,KC_LEAD 216 ,KC_LEAD
@@ -892,24 +898,92 @@ void ang_tap (uint16_t codes[]) {
892 register_code (code); \ 898 register_code (code); \
893 unregister_code (code) 899 unregister_code (code)
894 900
895void ang_tap_dance (qk_tap_dance_state_t *state) { 901void ang_tap_dance_cln_finished (qk_tap_dance_state_t *state, void *user_data) {
896 switch (state->keycode) { 902 if (state->count == 1) {
897 case TD(CT_CLN): 903 register_code (KC_RSFT);
898 if (state->count == 1) { 904 register_code (KC_SCLN);
899 register_code (KC_RSFT); 905 } else if (state->count == 2) {
900 register_code (KC_SCLN); 906 register_code (KC_SCLN);
901 unregister_code (KC_SCLN); 907 }
902 unregister_code (KC_RSFT); 908}
903 } else if (state->count == 2) { 909
904 register_code (KC_SCLN); 910void ang_tap_dance_cln_reset (qk_tap_dance_state_t *state, void *user_data) {
905 unregister_code (KC_SCLN); 911 if (state->count == 1) {
906 reset_tap_dance (state); 912 unregister_code (KC_SCLN);
907 } 913 unregister_code (KC_RSFT);
914 } else if (state->count == 2) {
915 unregister_code (KC_SCLN);
908 } 916 }
909} 917}
910 918
919void ang_tap_dance_mns_finished (qk_tap_dance_state_t *state, void *user_data) {
920 if (state->count == 1) {
921 register_code (KC_MINS);
922 } else if (state->count == 2) {
923 register_code (KC_RSFT);
924 register_code (KC_MINS);
925 }
926}
927
928void ang_tap_dance_mns_reset (qk_tap_dance_state_t *state, void *user_data) {
929 if (state->count == 1) {
930 unregister_code (KC_MINS);
931 } else if (state->count == 2) {
932 unregister_code (KC_RSFT);
933 unregister_code (KC_MINS);
934 }
935}
936
937typedef struct {
938 bool layer_toggle;
939 bool sticky;
940 bool finished_once;
941} td_ta_state_t;
942
943void ang_tap_dance_ta_finished (qk_tap_dance_state_t *state, void *user_data) {
944 td_ta_state_t *td_ta = (td_ta_state_t *) user_data;
945
946 if (td_ta->finished_once) {
947 return;
948 }
949
950 if (td_ta->sticky) {
951 td_ta->sticky = false;
952 td_ta->layer_toggle = false;
953 layer_off (ARRW);
954 return;
955 }
956
957 td_ta->finished_once = true;
958 if (state->count == 1 && !state->pressed) {
959 register_code (KC_TAB);
960 td_ta->sticky = false;
961 td_ta->layer_toggle = false;
962 } else {
963 td_ta->layer_toggle = true;
964 layer_on (ARRW);
965 td_ta->sticky = (state->count == 2);
966 }
967}
968
969void ang_tap_dance_ta_reset (qk_tap_dance_state_t *state, void *user_data) {
970 td_ta_state_t *td_ta = (td_ta_state_t *) user_data;
971
972 if (!td_ta->layer_toggle)
973 unregister_code (KC_TAB);
974 if (!td_ta->sticky)
975 layer_off (ARRW);
976
977 td_ta->finished_once = false;
978}
979
911const qk_tap_dance_action_t tap_dance_actions[] = { 980const qk_tap_dance_action_t tap_dance_actions[] = {
912 [CT_CLN] = ACTION_TAP_DANCE_FN (ang_tap_dance) 981 [CT_CLN] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, ang_tap_dance_cln_finished, ang_tap_dance_cln_reset)
982 ,[CT_MNS] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, ang_tap_dance_mns_finished, ang_tap_dance_mns_reset)
983 ,[CT_TA] = {
984 .fn = { NULL, ang_tap_dance_ta_finished, ang_tap_dance_ta_reset },
985 .user_data = (void *)&((td_ta_state_t) { false, false, false })
986 }
913}; 987};
914 988
915// Runs constantly in the background, in a loop. 989// Runs constantly in the background, in a loop.
@@ -1002,9 +1076,18 @@ void matrix_scan_user(void) {
1002 leading = false; 1076 leading = false;
1003 leader_end (); 1077 leader_end ();
1004 1078
1079#if KEYLOGGER_ENABLE
1005 SEQ_ONE_KEY (KC_D) { 1080 SEQ_ONE_KEY (KC_D) {
1081 ergodox_led_all_on();
1082 _delay_ms(100);
1083 ergodox_led_all_off();
1006 log_enable = !log_enable; 1084 log_enable = !log_enable;
1007 } 1085 }
1086#endif
1087
1088 SEQ_ONE_KEY (KC_T) {
1089 time_travel = !time_travel;
1090 }
1008 1091
1009 SEQ_ONE_KEY (KC_U) { 1092 SEQ_ONE_KEY (KC_U) {
1010 ang_do_unicode (); 1093 ang_do_unicode ();
@@ -1093,13 +1176,41 @@ void matrix_scan_user(void) {
1093 } 1176 }
1094} 1177}
1095 1178
1179static uint16_t last4[4];
1180
1096bool process_record_user (uint16_t keycode, keyrecord_t *record) { 1181bool process_record_user (uint16_t keycode, keyrecord_t *record) {
1182#if KEYLOGGER_ENABLE
1097 uint8_t layer = biton32(layer_state); 1183 uint8_t layer = biton32(layer_state);
1098 1184
1099 if (log_enable && layer == BASE) { 1185 if (log_enable && layer == BASE) {
1100 xprintf ("KL: col=%d, row=%d\n", record->event.key.col, 1186 xprintf ("KL: col=%d, row=%d\n", record->event.key.col,
1101 record->event.key.row); 1187 record->event.key.row);
1102 } 1188 }
1189#endif
1190
1191 if (time_travel && !record->event.pressed) {
1192 uint8_t p;
1193
1194 // shift cache one to the left
1195 for (p = 0; p < 3; p++) {
1196 last4[p] = last4[p + 1];
1197 }
1198 last4[3] = keycode;
1199
1200 if (last4[0] == KC_D && last4[1] == KC_A && last4[2] == KC_T && last4[3] == KC_E) {
1201 uint16_t codes[] = {KC_E, KC_SPC, KC_MINS, KC_D, KC_SPC, KC_QUOT, 0};
1202 ang_tap (codes);
1203 register_code (KC_RSFT);
1204 register_code (KC_EQL);
1205 unregister_code (KC_EQL);
1206 unregister_code (KC_RSFT);
1207
1208 uint16_t codes2[] = {KC_4, KC_SPC, KC_D, KC_A, KC_Y, KC_S, KC_QUOT, 0};
1209 ang_tap (codes2);
1210
1211 return false;
1212 }
1213 }
1103 1214
1104 return true; 1215 return true;
1105} 1216}
diff --git a/keyboards/ergodox_ez/keymaps/algernon/readme.md b/keyboards/ergodox_ez/keymaps/algernon/readme.md
index 2312dc59e..6fe177511 100644
--- a/keyboards/ergodox_ez/keymaps/algernon/readme.md
+++ b/keyboards/ergodox_ez/keymaps/algernon/readme.md
@@ -50,6 +50,7 @@ At its core, this is a Dvorak layout, with some minor changes. The more interest
50 - `LEAD a` makes the [ADORE layer](#adore-layer) the default. 50 - `LEAD a` makes the [ADORE layer](#adore-layer) the default.
51 - `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. 52 - `LEAD d` toggles logging keypress positions to the HID console.
53 - `LEAD t` toggles time travel. Figuring out the current `date` is left as an exercise to the reader.
53 54
54## ADORE layer 55## ADORE layer
55 56
@@ -148,6 +149,14 @@ The keymap default to forcing NKRO, which seems to upset Windows, and except the
148 149
149# Changelog 150# Changelog
150 151
152## v1.4 - 2016-07-29
153
154* When toggling the key logging on or off, the LEDs will do a little dance.
155* The keylogger is now optional, but enabled by default. Use `KEYLOGGER_ENABLE=no` on the `make` command line to disable it.
156* The `TAB`/`ARRW` key was turned into a tap-dance key, allowing one to toggle the **ARROW** layer on by double-tapping, and as such, avoid the need to hold the key.
157* The `-`/`_` key was turned into a tap-dance key too.
158* There is now a way to travel time with the keyboard, toggle the feature on by hitting `LEAD t`.
159
151## v1.3 - 2016-07-06 160## v1.3 - 2016-07-06
152 161
153* Added support for logging keys, by pressing `LEAD d`. Also included is a tool to generate a [heatmap](#heatmap) out of the logs. 162* Added support for logging keys, by pressing `LEAD d`. Also included is a tool to generate a [heatmap](#heatmap) out of the logs.
diff --git a/keyboards/ergodox_ez/keymaps/algernon/tools/heatmap-adore-layout.json b/keyboards/ergodox_ez/keymaps/algernon/tools/heatmap-adore-layout.json
new file mode 100644
index 000000000..544f61ce8
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/algernon/tools/heatmap-adore-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": 6
122 },
123 "L",
124 {
125 "x": 10.5
126 },
127 "C"
128 ],
129 [
130 {
131 "y": -0.875,
132 "x": 2.5,
133 "c": "#bfbad1",
134 "t": "#0d0d0b",
135 "a": 4
136 },
137 ">\n.",
138 {
139 "x": 1,
140 "c": "#7adabd",
141 "t": "#000000",
142 "a": 6
143 },
144 "W",
145 {
146 "x": 8.5
147 },
148 "H",
149 {
150 "x": 1,
151 "c": "#bfbad1",
152 "t": "#0d0d0b"
153 },
154 "P"
155 ],
156 [
157 {
158 "y": -0.875,
159 "x": 5.5,
160 "c": "#7adabd",
161 "t": "#000000"
162 },
163 "M",
164 {
165 "c": "#93c9b7",
166 "a": 4,
167 "h": 1.5
168 },
169 "{\n[",
170 {
171 "x": 4.5,
172 "h": 1.5
173 },
174 "}\n]",
175 {
176 "c": "#7adabd",
177 "a": 6
178 },
179 "F"
180 ],
181 [
182 {
183 "y": -0.875,
184 "c": "#ffb07b",
185 "t": "#0d0d0b",
186 "f": 6,
187 "w": 1.5
188 },
189 "<i class='fa fa-fast-backward'></i>\n\n<i class='fa fa-fast-forward'></i>",
190 {
191 "c": "#ffb2d2",
192 "a": 4,
193 "f": 3
194 },
195 "<\n,",
196 {
197 "x": 14.5,
198 "a": 6
199 },
200 "Y",
201 {
202 "a": 4,
203 "w": 1.5
204 },
205 "|\n\\"
206 ],
207 [
208 {
209 "y": -0.375,
210 "x": 3.5,
211 "c": "#a7d0db",
212 "t": "#000000",
213 "a": 6
214 },
215 "E",
216 {
217 "x": 10.5
218 },
219 "T"
220 ],
221 [
222 {
223 "y": -0.875,
224 "x": 2.5,
225 "c": "#bfbad1",
226 "t": "#0d0d0b"
227 },
228 "O",
229 {
230 "x": 1,
231 "c": "#7adabd",
232 "t": "#000000",
233 "n": true
234 },
235 "I",
236 {
237 "x": 8.5,
238 "n": true
239 },
240 "R",
241 {
242 "x": 1,
243 "c": "#bfbad1",
244 "t": "#0d0d0b"
245 },
246 "N"
247 ],
248 [
249 {
250 "y": -0.875,
251 "x": 5.5,
252 "c": "#7adabd",
253 "t": "#000000"
254 },
255 "U",
256 {
257 "x": 6.5
258 },
259 "D"
260 ],
261 [
262 {
263 "y": -0.875,
264 "c": "#ffb2d2",
265 "t": "#0d0d0b",
266 "fa": [
267 6
268 ],
269 "w": 1.5
270 },
271 "<i class='fa fa-arrows'></i>\n\nTab",
272 {
273 "f": 3
274 },
275 "A",
276 {
277 "x": 14.5,
278 "f": 3
279 },
280 "S",
281 {
282 "a": 4,
283 "fa": [
284 0,
285 0,
286 0,
287 0,
288 0,
289 0,
290 0,
291 6
292 ],
293 "w": 1.5
294 },
295 "+\n="
296 ],
297 [
298 {
299 "y": -0.625,
300 "x": 6.5,
301 "c": "#93c9b7",
302 "t": "#000000",
303 "a": 7,
304 "h": 1.5
305 },
306 "(",
307 {
308 "x": 4.5,
309 "h": 1.5
310 },
311 ")"
312 ],
313 [
314 {
315 "y": -0.75,
316 "x": 3.5,
317 "c": "#a7d0db",
318 "a": 4,
319 "f": 3
320 },
321 "\"\n'",
322 {
323 "x": 10.5
324 },
325 "V"
326 ],
327 [
328 {
329 "y": -0.875,
330 "x": 2.5,
331 "c": "#bfbad1",
332 "t": "#0d0d0b"
333 },
334 "Z",
335 {
336 "x": 1,
337 "c": "#7adabd",
338 "t": "#000000"
339 },
340 "K",
341 {
342 "x": 8.5
343 },
344 "G",
345 {
346 "x": 1,
347 "c": "#bfbad1",
348 "t": "#0d0d0b"
349 },
350 "J"
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 "Q",
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]