diff options
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 | |||
| 4 | UNICODE_ENABLE=no | 4 | UNICODE_ENABLE=no |
| 5 | FORCE_NKRO ?= yes | 5 | FORCE_NKRO ?= yes |
| 6 | DEBUG_ENABLE = no | 6 | DEBUG_ENABLE = no |
| 7 | CONSOLE_ENABLE = yes | 7 | CONSOLE_ENABLE = no |
| 8 | TAP_DANCE_ENABLE = yes | 8 | TAP_DANCE_ENABLE = yes |
| 9 | KEYLOGGER_ENABLE ?= yes | ||
| 9 | 10 | ||
| 10 | ifeq (${FORCE_NKRO},yes) | 11 | ifeq (${FORCE_NKRO},yes) |
| 11 | OPT_DEFS += -DFORCE_NKRO | 12 | OPT_DEFS += -DFORCE_NKRO |
| 12 | endif | 13 | endif |
| 13 | 14 | ||
| 15 | ifeq (${KEYLOGGER_ENABLE},yes) | ||
| 16 | OPT_DEFS += -DKEYLOGGER_ENABLE | ||
| 17 | CONSOLE_ENABLE = yes | ||
| 18 | endif | ||
| 19 | |||
| 14 | KEYMAP_VERSION = $(shell \ | 20 | KEYMAP_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 | ||
| 97 | enum { | 97 | enum { |
| 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; | |||
| 115 | uint8_t oh_right_blink = 0; | 117 | uint8_t oh_right_blink = 0; |
| 116 | uint16_t oh_right_blink_timer = 0; | 118 | uint16_t oh_right_blink_timer = 0; |
| 117 | 119 | ||
| 120 | #if KEYLOGGER_ENABLE | ||
| 118 | bool log_enable = false; | 121 | bool log_enable = false; |
| 122 | #endif | ||
| 123 | |||
| 124 | bool 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 | ||
| 895 | void ang_tap_dance (qk_tap_dance_state_t *state) { | 901 | void 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); | 910 | void 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 | ||
| 919 | void 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 | |||
| 928 | void 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 | |||
| 937 | typedef struct { | ||
| 938 | bool layer_toggle; | ||
| 939 | bool sticky; | ||
| 940 | bool finished_once; | ||
| 941 | } td_ta_state_t; | ||
| 942 | |||
| 943 | void 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 | |||
| 969 | void 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 | |||
| 911 | const qk_tap_dance_action_t tap_dance_actions[] = { | 980 | const 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 | ||
| 1179 | static uint16_t last4[4]; | ||
| 1180 | |||
| 1096 | bool process_record_user (uint16_t keycode, keyrecord_t *record) { | 1181 | bool 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 | ] | ||
