aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Schumacher <twschum@gmail.com>2019-11-21 06:07:33 -0500
committerDrashna Jaelre <drashna@live.com>2019-11-21 03:07:33 -0800
commit84065e1d7458ad6b0a04a82fed4dfc69a4ded2b2 (patch)
treec3985a31591fb3f2c3252caf49d7751cd5d8cb10
parent90bb7db48e658624c6c4609c832ac1451e4db98b (diff)
downloadqmk_firmware-84065e1d7458ad6b0a04a82fed4dfc69a4ded2b2.tar.gz
qmk_firmware-84065e1d7458ad6b0a04a82fed4dfc69a4ded2b2.zip
[Keymap] Add DZ60, Levinson keymaps, twschum user files (#7358)
* Adds layout for DZ60rev2 plate B, options 4 and 10 * Use KC_TRANS for layer keys * Format layer0 with visual key size layout * Add RGB controls; add start description; add KC_LOCK * Update comments on rules.mk for DZ60 * Gets keymap compiling * Fix wiring for shift on row 3 * Hold a with other key to send Ctrl-A before other key * Adds compile-time defined mac-compatability media keycodes * Adds logic in place for capturing taps (w/ timeout) * Add send_keys(...) which can send up to 64 nested keycodes * Implement send_keys callable with n repeats * Tweaks some of the keymap * Add reset keycode; add disable to custom shortcuts * Adds a special "off" layer where bonus mod goes to layer 0, every other key KC_NO * Adjust timeout; mousekey settings * Changes layout of Home,End,PgUp/Dn on the dedicated arrow keys L1/L2 * PoC on rgb lighted layer indication * Refactors color table defines * Adds logic for controlling layer lights * Only change state on one side of the event lol * Switch back to Tapping Toggle for layer 4 * Add custom config file for keyboard; TT and mousekey settings * Code cleanup; starting to refactor special ctrl tapping keys functions * Move defines and reak out functions * Remove debugging light * Adjust keymaps; add enter * Adds a couple custom macros * Add simplified version of keymap to help debug issues * Adds basi numpad configuration for levinson keyboard half * Use ANSI ctrl key as layer 1 for better one hand (`) * Adapt to new 8bit hue from #5547; layer enum use everywhere * Move custom code out to users/ space * Flip col pins, move key assignments to "left hand" * Update readme * Implement placeholder macros * Notes * Reduce tapping time for SFT_T(/) * Adds vim features; refactors things * Adds fork of the vim features written by xton * Use correct backspace keycode * Add VIM_ESC * Add "OFF" to the RGB/HSV definitions * Clean up rules, use new "OFF" definition * Add windows KC_CALCULATOR key to numpad * Reformat layers with better guide; change layer names * Add sleep key * Change timeout delay * Add a "code paste" which surrounds a ^V with ``` * Try removing shift tap on rshift / * Update macros * Update the "code paste" macro * Update keymap with reset, calc, equals * Update keyboards/dz60/keymaps/twschum_b_4_10_simple/keymap.c Co-Authored-By: Drashna Jaelre <drashna@live.com> * Update keyboards/dz60/keymaps/twschum_b_4_10/keymap.c Co-Authored-By: Drashna Jaelre <drashna@live.com> * Update users/twschum/twschum.c Co-Authored-By: Drashna Jaelre <drashna@live.com> * Update users/twschum/twschum.c Co-Authored-By: Drashna Jaelre <drashna@live.com> * Revert quantum/rgblight_list.h * Better name for split space layout; rename KEYMAP->LAYOUT * Rename KEYMAP->LAYOUT * Use simpler :flash command * Clean up layout files * Use qmk's MOD_MASK_CTRL * Sync lufa submodule * Cleanup from noroadsleft's PR comments * Modernize vim layer code
-rw-r--r--keyboards/dz60/keymaps/split_space_arrows/keymap.c67
-rw-r--r--keyboards/dz60/keymaps/split_space_arrows/rules.mk7
-rw-r--r--keyboards/dz60/keymaps/twschum_b_4_10/config.h24
-rw-r--r--keyboards/dz60/keymaps/twschum_b_4_10/keymap.c123
-rw-r--r--keyboards/dz60/keymaps/twschum_b_4_10/layout.json4877
-rw-r--r--keyboards/dz60/keymaps/twschum_b_4_10/rules.mk15
-rw-r--r--keyboards/dz60/rules.mk6
-rw-r--r--keyboards/keebio/levinson/keymaps/numpad/config.h34
-rw-r--r--keyboards/keebio/levinson/keymaps/numpad/keymap.c123
-rw-r--r--keyboards/keebio/levinson/keymaps/numpad/readme.md4
-rw-r--r--keyboards/keebio/levinson/keymaps/numpad/rules.mk3
-rw-r--r--users/twschum/config.h0
-rw-r--r--users/twschum/readme.md14
-rw-r--r--users/twschum/rules.mk5
-rw-r--r--users/twschum/twschum.c257
-rw-r--r--users/twschum/twschum.h131
-rw-r--r--users/twschum/xtonhasvim.c593
-rw-r--r--users/twschum/xtonhasvim.h62
18 files changed, 6342 insertions, 3 deletions
diff --git a/keyboards/dz60/keymaps/split_space_arrows/keymap.c b/keyboards/dz60/keymaps/split_space_arrows/keymap.c
new file mode 100644
index 000000000..6dbfaa937
--- /dev/null
+++ b/keyboards/dz60/keymaps/split_space_arrows/keymap.c
@@ -0,0 +1,67 @@
1#include QMK_KEYBOARD_H
2
3/* DZ60 layout using following options (from layouts diagram on KBDfans):
4 * - plate B (2.25u lshift)
5 * - opt 4 (1.75, 1, 1 on rshift)
6 * - opt 10 (2.75, 1.25, 2.25 on space, 5x1u bottom right keys)
7 * http://www.keyboard-layout-editor.com/#/gists/225f0f4dcf6671405f744fabe314627c
8 */
9
10#define LAYOUT_b_4_10( \
11 K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, \
12 K100, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, \
13 K200, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, \
14 K300, K302, K303, K304, K305, K306, K307, K308, K309, K310, K312, K313, K314, \
15 K400, K401, K403, K404, K406, K408, K410, K411, K412, K413, K414 \
16 ) { \
17 { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, KC_NO, K014 }, \
18 { K100, KC_NO, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114 }, \
19 { K200, KC_NO, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, KC_NO }, \
20 { K300, KC_NO, K302, K303, K304, K305, K306, K307, K308, K309, K310, KC_NO, K312, K313, K314 }, \
21 { K400, K401, KC_NO, K403, K404, KC_NO, K406, KC_NO, K408, KC_NO, K410, K411, K412, K413, K414 } \
22}
23
24const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
25 /* Layer 0: basic qwerty */
26 LAYOUT_b_4_10(
27 // |--------|--------|--------|--------|--------|--------|--------|--------|--------|--------|--------|--------|--------||------2.0-------|
28 KC_ESC, 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,
29 // |--------|--------|--------|--------|--------|--------|--------|--------|--------|--------|--------|--------|--------||----------------|
30 //
31 // |----1.5-----||--------|--------|--------|--------|--------|--------|--------|--------|--------|--------|--------|--------|----1.5-----|
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,
33 // |------------||--------|--------|--------|--------|--------|--------|--------|--------|--------|--------|--------|--------|------------|
34 //
35 // |----1.75------||--------|--------|--------|--------|--------|--------|--------|--------|--------|--------|--------|------2.25--------||
36 KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
37 // |--------------||--------|--------|--------|--------|--------|--------|--------|--------|--------|--------|--------|------------------||
38 //
39 // |------2.25--------|--------|--------|--------|--------|--------|--------|--------|--------|--------||----1.75------|--------|--------||
40 KC_LSHIFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, SFT_T(KC_SLSH), KC_UP, KC_HYPR,
41 // |------------------|--------|--------|--------|--------|--------|--------|--------|--------|--------||--------------|--------|--------||
42 //
43 // |---1.25---|---1.25---||---1.25---||--------2.75----------||---1.25---|------2.25--------||--------|--------|--------|--------|--------|
44 KC_MEH, KC_LALT, KC_LGUI, KC_SPC, TT(1), MO(1), TG(1), TT(2), KC_LEFT, KC_DOWN, KC_RGHT
45 // |----------|----------||----------||----------------------||----------|------------------||--------|--------|--------|--------|--------|
46 ),
47
48 /* Layer 1: primary fn layer */
49 LAYOUT_b_4_10(
50 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_DEL,
51 KC_TAB, KC_NO, KC_HOME, KC_UP, KC_END, KC_NO, KC_HOME, KC_PGDN, KC_PGUP, KC_END, KC_NO, KC_NO, KC_NO, KC_NO,
52 KC_CAPS, KC_NO, KC_LEFT, KC_DOWN, KC_RIGHT, KC_NO, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_NO, KC_NO, KC_ENT,
53 KC_LSFT, KC_MPRV, KC_AUDIO_MUTE, KC_AUDIO_VOL_DOWN, KC_AUDIO_VOL_UP, KC_MNXT, KC_NO, KC_NO, KC_NO, KC_NO, KC_LOCK, KC_PGUP, KC_INS,
54 KC_MEH, KC_LALT, KC_LGUI, KC_MEDIA_PLAY_PAUSE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGDN, KC_END
55 ),
56
57 /* Layer 2: mouse navigation */
58 /* Layer 3: numpad */
59 /* Layer 4: RGB lighting controls and keyboard config, reset */
60 LAYOUT_b_4_10(
61 KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, TO(5),
62 KC_NO, KC_NO, KC_NO, KC_NO, RESET, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, RGB_HUD,
63 KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, RGB_MODE_PLAIN, RGB_MODE_FORWARD, KC_RSHIFT,
64 KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, RGB_TOG, RGB_VAI, RGB_HUI,
65 KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, RGB_SAD, RGB_VAD, RGB_SAI
66 ),
67};
diff --git a/keyboards/dz60/keymaps/split_space_arrows/rules.mk b/keyboards/dz60/keymaps/split_space_arrows/rules.mk
new file mode 100644
index 000000000..5d38b9d36
--- /dev/null
+++ b/keyboards/dz60/keymaps/split_space_arrows/rules.mk
@@ -0,0 +1,7 @@
1# Build Options
2# override the options specified in dz60/rules.mk
3BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration
4MOUSEKEY_ENABLE = yes # Mouse keys
5EXTRAKEY_ENABLE = yes # Audio control and System control
6RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
7KEY_LOCK_ENABLE = yes # Enables use of KC_LOCK
diff --git a/keyboards/dz60/keymaps/twschum_b_4_10/config.h b/keyboards/dz60/keymaps/twschum_b_4_10/config.h
new file mode 100644
index 000000000..15cabda36
--- /dev/null
+++ b/keyboards/dz60/keymaps/twschum_b_4_10/config.h
@@ -0,0 +1,24 @@
1#pragma once
2
3// number of taps for TT Tap-Toggle keys to toggle
4#ifdef TAPPING_TOGGLE
5#undef TAPPING_TOGGLE
6#endif
7#define TAPPING_TOGGLE 2
8
9// time in ms that counts as a "tap" for various features
10#ifdef TAPPING_TERM
11#undef TAPPING_TERM
12#endif
13#define TAPPING_TERM 100
14
15// https://docs.qmk.fm/features/mouse-keys#configuring-the-behavior-of-mousekeys
16#define MOUSEKEY_DELAY 0
17#define MOUSEKEY_INTERVAL 20
18#define MOUSEKEY_MAX_SPEED 10
19#define MOUSEKEY_TIME_TO_MAX 15
20#define MOUSEKEY_WHEEL_MAX_SPEED 1
21#define MOUSEKEY_WHEEL_TIME_TO_MAX 255
22
23// flags from user/twschum/
24#define TWSCHUM_TAPPING_CTRL_PREFIX 1
diff --git a/keyboards/dz60/keymaps/twschum_b_4_10/keymap.c b/keyboards/dz60/keymaps/twschum_b_4_10/keymap.c
new file mode 100644
index 000000000..6efb56713
--- /dev/null
+++ b/keyboards/dz60/keymaps/twschum_b_4_10/keymap.c
@@ -0,0 +1,123 @@
1#include QMK_KEYBOARD_H
2#include "twschum.h"
3
4/* DZ60 layout using following options (from layouts diagram on KBDfans):
5 * - plate B (2.25u lshift)
6 * - opt 4 (1.75, 1, 1 on rshift)
7 * - opt 10 (2.75, 1.25, 2.25 on space, 5x1u bottom right keys)
8 * http://www.keyboard-layout-editor.com/#/gists/225f0f4dcf6671405f744fabe314627c
9 */
10
11
12#define LAYOUT_b_4_10( \
13 K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, \
14 K100, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, \
15 K200, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, \
16 K300, K302, K303, K304, K305, K306, K307, K308, K309, K310, K312, K313, K314, \
17 K400, K401, K403, K404, K406, K408, K410, K411, K412, K413, K414 \
18 ) { \
19 { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, XXXXXXX, K014 }, \
20 { K100, XXXXXXX, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114 }, \
21 { K200, XXXXXXX, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, XXXXXXX }, \
22 { K300, XXXXXXX, K302, K303, K304, K305, K306, K307, K308, K309, K310, XXXXXXX, K312, K313, K314 }, \
23 { K400, K401, XXXXXXX, K403, K404, XXXXXXX, K406, XXXXXXX, K408, XXXXXXX, K410, K411, K412, K413, K414 } \
24}
25
26const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
27
28 /* base 60% qwerty */
29 LAYOUT_b_4_10(
30 // |--------|----1---|----2---|----3---|---4----|---5----|---6----|---7----|---8----|---9----|---0----|-- - ---|-- = ---||------2.0-------|
31 KC_ESC, 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,
32 // |--------|--------|--------|--------|--------|--------|--------|--------|--------|--------|--------|--------|--------||----------------|
33 //
34 // |----1.5-----||---Q----|---W----|---E----|---R----|---T----|---Y----|---U----|---I----|---O----|---P----|---[----|---]----|----1.5-----|
35 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,
36 // |------------||--------|--------|--------|--------|--------|--------|--------|--------|--------|--------|--------|--------|------------|
37 //
38 // |----1.75------||---A----|---S----|---D----|---F----|---G----|---H----|---J----|---K----|---L----|---;----|---'----|------2.25--------||
39 KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
40 // |--------------||--------|--------|--------|--------|--------|--------|--------|--------|--------|--------|--------|------------------||
41 //
42 // |------2.25--------|---Z----|---X----|---C----|---V----|---B----|---N----|---M----|---,----|---.----||----1.75------|--------|--------||
43 KC_LSHIFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, /*SFT_T*/KC_SLSH, KC_UP, VIM_START,
44 // |------------------|--------|--------|--------|--------|--------|--------|--------|--------|--------||--------------|--------|--------||
45 //
46 // |---1.25---|---1.25---||---1.25---||--------2.75----------||---1.25---|------2.25--------||--------|--------|--------|--------|--------|
47 MO(_Fn), KC_LALT, KC_LGUI, KC_SPC, TT(_Nav), MO(_Fn), TG(_Num), TT(_Cfg), KC_LEFT, KC_DOWN, KC_RGHT
48 // |----------|----------||----------||----------------------||----------|------------------||--------|--------|--------|--------|--------|
49 ),
50
51 /* vim mode */
52 LAYOUT_b_4_10(
53 VIM_ESC, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
54 _______, _______, VIM_W, VIM_E, KC_R, _______, VIM_Y, VIM_U, VIM_I, VIM_O, VIM_P, _______, _______, _______,
55 _______, VIM_A, VIM_S, VIM_D, _______, VIM_G, VIM_H, VIM_J, VIM_K, VIM_L, _______, _______, _______,
56 VIM_SHIFT, _______, VIM_X, VIM_C, VIM_V, VIM_B, _______, _______, VIM_COMMA, VIM_PERIOD, _______, _______, VIM_ESC,
57 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
58 ),
59
60 /* primary fn layer */
61 LAYOUT_b_4_10(
62 // |--------|----1---|----2---|----3---|---4----|---5----|---6----|---7----|---8----|---9----|---0----|-- - ---|-- = ---||------2.0-------|
63 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_DEL,
64 // |--------|--------|--------|--------|--------|--------|--------|--------|--------|--------|--------|--------|--------||----------------|
65 //
66 // |----1.5-----||---Q----|---W----|---E----|---R----|---T----|---Y----|---U----|---I----|---O----|---P----|---[----|---]----|----1.5-----|
67 KC_TAB, CODE_PASTE, KC_HOME, KC_UP, KC_END, XXXXXXX, KC_HOME, KC_PGDN, KC_PGUP, KC_END, LESS_PD, XXXXXXX, XXXXXXX, CODE_PASTE,
68 // |------------||--------|--------|--------|--------|--------|--------|--------|--------|--------|--------|--------|--------|------------|
69 //
70 // |----1.75------||---A----|---S----|---D----|---F----|---G----|---H----|---J----|---K----|---L----|---;----|---'----|------2.25--------||
71 KC_CAPS, SALT_CMD, KC_LEFT, KC_DOWN, KC_RGHT, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, XXXXXXX, XXXXXXX, KC_ENT,
72 // |--------------||--------|--------|--------|--------|--------|--------|--------|--------|--------|--------|--------|------------------||
73 //
74 // |------2.25--------|---Z----|---X----|---C----|---V----|---B----|---N----|---M----|---,----|---.----||----1.75------|--------|--------||
75 KC_LSHIFT, KC_MPRV, KC_MUTE, KC_VOLD, KC_VOLU, KC_MNXT, _______, _______, XXXXXXX, XXXXXXX, KC_LOCK, KC_PGUP, KC_INS,
76 // |------------------|--------|--------|--------|--------|--------|--------|--------|--------|--------||--------------|--------|--------||
77 //
78 // |---1.25---|---1.25---||---1.25---||--------2.75----------||---1.25---|------2.25--------||--------|--------|--------|--------|--------|
79 KC_MEH, KC_LALT, KC_LGUI, KC_MEDIA_PLAY_PAUSE, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_END
80 // |----------|----------||----------||----------------------||----------|------------------||--------|--------|--------|--------|--------|
81 ),
82
83 /* mouse navigation */
84 LAYOUT_b_4_10(
85 TO(_Base), KC_MS_ACCEL0, KC_MS_ACCEL1, KC_MS_ACCEL2, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
86 XXXXXXX, XXXXXXX, KC_MS_BTN2, KC_MS_UP, KC_MS_BTN1, XXXXXXX, XXXXXXX, KC_SLEP, KC_PGDN, KC_PGUP, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
87 KC_LCTL, KC_MS_BTN3, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, XXXXXXX, KC_MS_WH_LEFT, KC_MS_WH_DOWN, KC_MS_WH_UP, KC_MS_WH_RIGHT, XXXXXXX, XXXXXXX, XXXXXXX,
88 KC_LSHIFT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX,
89 XXXXXXX, XXXXXXX, XXXXXXX, KC_MS_BTN1, _______, _______, _______, _______, _______, _______, _______
90 ),
91
92 /* numpad layer */
93 LAYOUT_b_4_10(
94 _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_BSPC,
95 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_KP_7, KC_KP_8, KC_KP_9, KC_KP_MINUS, KC_KP_PLUS, XXXXXXX, XXXXXXX, XXXXXXX,
96 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_KP_4, KC_KP_5, KC_KP_6, KC_KP_SLASH, KC_KP_ASTERISK, XXXXXXX, KC_ENT,
97 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_KP_1, KC_KP_2, KC_KP_3, KC_KP_DOT, KC_KP_ENTER, XXXXXXX, XXXXXXX,
98 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_KP_0, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX
99 ),
100
101
102 /* RGB lighting controls and keyboard config, reset */
103 LAYOUT_b_4_10(
104 _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, TG_L0_RGB, XXXXXXX, XXXXXXX, TO(_None),
105 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RESET, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_HUD,
106 EN_CTRL_SHORTCUTS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, TG_LAYER_RGB, RGB_MODE_PLAIN, RGB_MODE_FORWARD, KC_RSHIFT,
107 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MAKE, XXXXXXX, XXXXXXX, RGB_TOG, RGB_VAI, RGB_HUI,
108 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, RGB_SAD, RGB_VAD, RGB_SAI
109 ),
110
111 /* soft "off" state where none of the keystroke register */
112 LAYOUT_b_4_10(
113 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
114 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
115 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
116 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, TO(_Base),
117 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
118 ),
119};
120
121uint8_t vim_cmd_layer(void) {
122 return _Vim;
123}
diff --git a/keyboards/dz60/keymaps/twschum_b_4_10/layout.json b/keyboards/dz60/keymaps/twschum_b_4_10/layout.json
new file mode 100644
index 000000000..cd484f9d8
--- /dev/null
+++ b/keyboards/dz60/keymaps/twschum_b_4_10/layout.json
@@ -0,0 +1,4877 @@
1{
2 "configKeymap":{
3 "keys":[
4 "K00",
5 "K01",
6 "K02",
7 "K03",
8 "K04",
9 "K05",
10 "K06",
11 "K07",
12 "K08",
13 "K09",
14 "K0A",
15 "K0B",
16 "K0C",
17 "K0D",
18 "K2D",
19 "K10",
20 "K11",
21 "K12",
22 "K13",
23 "K14",
24 "K15",
25 "K16",
26 "K17",
27 "K18",
28 "K19",
29 "K1A",
30 "K1B",
31 "K1C",
32 "K1D",
33 "K20",
34 "K21",
35 "K22",
36 "K23",
37 "K24",
38 "K25",
39 "K26",
40 "K27",
41 "K28",
42 "K29",
43 "K2A",
44 "K2B",
45 "K2C",
46 "K30",
47 "K31",
48 "K32",
49 "K33",
50 "K34",
51 "K35",
52 "K36",
53 "K37",
54 "K38",
55 "K39",
56 "K3A",
57 "K3B",
58 "K3C",
59 "K3D",
60 "K40",
61 "K41",
62 "K42",
63 "K44",
64 "K45",
65 "K46",
66 "K48",
67 "K49",
68 "K4A",
69 "K4B",
70 "K4C"
71 ],
72 "positions":[
73 [
74 "K00",
75 "K01",
76 "K02",
77 "K03",
78 "K04",
79 "K05",
80 "K06",
81 "K07",
82 "K08",
83 "K09",
84 "K0A",
85 "K0B",
86 "K0C",
87 "K0D"
88 ],
89 [
90 "K10",
91 "K11",
92 "K12",
93 "K13",
94 "K14",
95 "K15",
96 "K16",
97 "K17",
98 "K18",
99 "K19",
100 "K1A",
101 "K1B",
102 "K1C",
103 "K1D"
104 ],
105 [
106 "K20",
107 "K21",
108 "K22",
109 "K23",
110 "K24",
111 "K25",
112 "K26",
113 "K27",
114 "K28",
115 "K29",
116 "K2A",
117 "K2B",
118 "K2C",
119 "K2D"
120 ],
121 [
122 "K30",
123 "K31",
124 "K32",
125 "K33",
126 "K34",
127 "K35",
128 "K36",
129 "K37",
130 "K38",
131 "K39",
132 "K3A",
133 "K3B",
134 "K3C",
135 "K3D"
136 ],
137 [
138 "K40",
139 "K41",
140 "K42",
141 "KC_NO",
142 "K44",
143 "K45",
144 "K46",
145 "KC_NO",
146 "K48",
147 "K49",
148 "K4A",
149 "K4B",
150 "K4C",
151 "KC_NO"
152 ]
153 ]
154 },
155 "keySections":[
156 {
157 "row1":[
158 {
159 "id":"k00",
160 "value":"ESC",
161 "type":"normal",
162 "secondary":null,
163 "showMenu":false,
164 "shape":"k100"
165 },
166 {
167 "id":"k01",
168 "value":"1",
169 "type":"normal",
170 "secondary":null,
171 "showMenu":false,
172 "shape":"k100"
173 },
174 {
175 "id":"k02",
176 "value":"2",
177 "type":"normal",
178 "secondary":null,
179 "showMenu":false,
180 "shape":"k100"
181 },
182 {
183 "id":"k03",
184 "value":"3",
185 "type":"normal",
186 "secondary":null,
187 "showMenu":false,
188 "shape":"k100"
189 },
190 {
191 "id":"k04",
192 "value":"4",
193 "type":"normal",
194 "secondary":null,
195 "showMenu":false,
196 "shape":"k100"
197 },
198 {
199 "id":"k05",
200 "value":"5",
201 "type":"normal",
202 "secondary":null,
203 "showMenu":false,
204 "shape":"k100"
205 },
206 {
207 "id":"k06",
208 "value":"6",
209 "type":"normal",
210 "secondary":null,
211 "showMenu":false,
212 "shape":"k100"
213 },
214 {
215 "id":"k07",
216 "value":"7",
217 "type":"normal",
218 "secondary":null,
219 "showMenu":false,
220 "shape":"k100"
221 },
222 {
223 "id":"k08",
224 "value":"8",
225 "type":"normal",
226 "secondary":null,
227 "showMenu":false,
228 "shape":"k100"
229 },
230 {
231 "id":"k09",
232 "value":"9",
233 "type":"normal",
234 "secondary":null,
235 "showMenu":false,
236 "shape":"k100"
237 },
238 {
239 "id":"k0A",
240 "value":"0",
241 "type":"normal",
242 "secondary":null,
243 "showMenu":false,
244 "shape":"k100"
245 },
246 {
247 "id":"k0B",
248 "value":"MINS",
249 "type":"normal",
250 "secondary":null,
251 "showMenu":false,
252 "shape":"k100"
253 },
254 {
255 "id":"k0C",
256 "value":"EQL",
257 "type":"normal",
258 "secondary":null,
259 "showMenu":false,
260 "shape":"k100"
261 }
262 ],
263 "backspace":[
264 [
265 {
266 "id":"k0D",
267 "value":"BSPC",
268 "type":"normal",
269 "secondary":null,
270 "showMenu":false,
271 "shape":"k200",
272 "zone":"Backspace"
273 },
274 {
275 "id":"k2D",
276 "value":"NO",
277 "type":"nodisplay",
278 "showMenu":false
279 }
280 ],
281 [
282 {
283 "id":"k0D",
284 "value":"PSCR",
285 "type":"normal",
286 "secondary":null,
287 "showMenu":false,
288 "shape":"k100",
289 "zone":"Backspace"
290 },
291 {
292 "id":"k2D",
293 "value":"PAUS",
294 "type":"normal",
295 "secondary":null,
296 "showMenu":false,
297 "shape":"k100",
298 "zone":"Backspace"
299 }
300 ]
301 ],
302 "row2":[
303 {
304 "id":"k10",
305 "value":"TAB",
306 "type":"normal",
307 "secondary":null,
308 "showMenu":false,
309 "shape":"k150"
310 },
311 {
312 "id":"k11",
313 "value":"Q",
314 "type":"normal",
315 "secondary":null,
316 "showMenu":false,
317 "shape":"k100"
318 },
319 {
320 "id":"k12",
321 "value":"W",
322 "type":"normal",
323 "secondary":null,
324 "showMenu":false,
325 "shape":"k100"
326 },
327 {
328 "id":"k13",
329 "value":"E",
330 "type":"normal",
331 "secondary":null,
332 "showMenu":false,
333 "shape":"k100"
334 },
335 {
336 "id":"k14",
337 "value":"R",
338 "type":"normal",
339 "secondary":null,
340 "showMenu":false,
341 "shape":"k100"
342 },
343 {
344 "id":"k15",
345 "value":"T",
346 "type":"normal",
347 "secondary":null,
348 "showMenu":false,
349 "shape":"k100"
350 },
351 {
352 "id":"k16",
353 "value":"Y",
354 "type":"normal",
355 "secondary":null,
356 "showMenu":false,
357 "shape":"k100"
358 },
359 {
360 "id":"k17",
361 "value":"U",
362 "type":"normal",
363 "secondary":null,
364 "showMenu":false,
365 "shape":"k100"
366 },
367 {
368 "id":"k18",
369 "value":"I",
370 "type":"normal",
371 "secondary":null,
372 "showMenu":false,
373 "shape":"k100"
374 },
375 {
376 "id":"k19",
377 "value":"O",
378 "type":"normal",
379 "secondary":null,
380 "showMenu":false,
381 "shape":"k100"
382 },
383 {
384 "id":"k1A",
385 "value":"P",
386 "type":"normal",
387 "secondary":null,
388 "showMenu":false,
389 "shape":"k100"
390 },
391 {
392 "id":"k1B",
393 "value":"LBRC",
394 "type":"normal",
395 "secondary":null,
396 "showMenu":false,
397 "shape":"k100"
398 },
399 {
400 "id":"k1C",
401 "value":"RBRC",
402 "type":"normal",
403 "secondary":null,
404 "showMenu":false,
405 "shape":"k100"
406 }
407 ],
408 "row2pipe":[
409 [
410 {
411 "id":"k1D",
412 "value":"BSLS",
413 "type":"normal",
414 "secondary":null,
415 "showMenu":false,
416 "shape":"k150",
417 "zone":"Enter"
418 }
419 ],
420 [
421 {
422 "id":"k1D",
423 "value":"ENT",
424 "type":"normal",
425 "secondary":null,
426 "showMenu":false,
427 "shape":"kISO",
428 "zone":"Enter"
429 }
430 ]
431 ],
432 "caps":[
433 [
434 {
435 "id":"k20",
436 "value":"LCTL",
437 "type":"normal",
438 "secondary":"LCTL",
439 "showMenu":false,
440 "shape":"k175",
441 "zone":"Caps Lock"
442 }
443 ],
444 [
445 {
446 "id":"k20",
447 "value":"CAPS",
448 "type":"normal",
449 "secondary":null,
450 "showMenu":false,
451 "shape":"k175stepped",
452 "zone":"Caps Lock"
453 }
454 ]
455 ],
456 "row3":[
457 {
458 "id":"k21",
459 "value":"A",
460 "type":"normal",
461 "secondary":null,
462 "showMenu":false,
463 "shape":"k100"
464 },
465 {
466 "id":"k22",
467 "value":"S",
468 "type":"normal",
469 "secondary":null,
470 "showMenu":false,
471 "shape":"k100"
472 },
473 {
474 "id":"k23",
475 "value":"D",
476 "type":"normal",
477 "secondary":null,
478 "showMenu":false,
479 "shape":"k100"
480 },
481 {
482 "id":"k24",
483 "value":"F",
484 "type":"normal",
485 "secondary":null,
486 "showMenu":false,
487 "shape":"k100"
488 },
489 {
490 "id":"k25",
491 "value":"G",
492 "type":"normal",
493 "secondary":null,
494 "showMenu":false,
495 "shape":"k100"
496 },
497 {
498 "id":"k26",
499 "value":"H",
500 "type":"normal",
501 "secondary":null,
502 "showMenu":false,
503 "shape":"k100"
504 },
505 {
506 "id":"k27",
507 "value":"J",
508 "type":"normal",
509 "secondary":null,
510 "showMenu":false,
511 "shape":"k100"
512 },
513 {
514 "id":"k28",
515 "value":"K",
516 "type":"normal",
517 "secondary":null,
518 "showMenu":false,
519 "shape":"k100"
520 },
521 {
522 "id":"k29",
523 "value":"L",
524 "type":"normal",
525 "secondary":null,
526 "showMenu":false,
527 "shape":"k100"
528 },
529 {
530 "id":"k2A",
531 "value":"SCLN",
532 "type":"normal",
533 "secondary":null,
534 "showMenu":false,
535 "shape":"k100"
536 },
537 {
538 "id":"k2B",
539 "value":"QUOT",
540 "type":"normal",
541 "secondary":null,
542 "showMenu":false,
543 "shape":"k100"
544 }
545 ],
546 "enter":[
547 [
548 {
549 "id":"k2C",
550 "value":"ENT",
551 "type":"normal",
552 "secondary":null,
553 "showMenu":false,
554 "shape":"k225",
555 "zone":"Enter"
556 }
557 ],
558 [
559 {
560 "id":"k2C",
561 "value":"NUHS",
562 "type":"normal",
563 "secondary":null,
564 "showMenu":false,
565 "shape":"k100",
566 "zone":"Enter"
567 }
568 ]
569 ],
570 "leftShift":[
571 [
572 {
573 "id":"k30",
574 "value":"LSFT",
575 "type":"normal",
576 "secondary":null,
577 "showMenu":false,
578 "shape":"k225",
579 "zone":"Left Shift"
580 },
581 {
582 "id":"k31",
583 "value":"NO",
584 "type":"nodisplay",
585 "showMenu":false
586 }
587 ],
588 [
589 {
590 "id":"k30",
591 "value":"LSFT",
592 "type":"normal",
593 "secondary":null,
594 "showMenu":false,
595 "shape":"k125",
596 "zone":"Left Shift"
597 },
598 {
599 "id":"k31",
600 "value":"NUBS",
601 "type":"normal",
602 "secondary":null,
603 "showMenu":false,
604 "shape":"k100",
605 "zone":"Left Shift"
606 }
607 ]
608 ],
609 "row4":[
610 {
611 "id":"k32",
612 "value":"Z",
613 "type":"normal",
614 "secondary":null,
615 "showMenu":false,
616 "shape":"k100"
617 },
618 {
619 "id":"k33",
620 "value":"X",
621 "type":"normal",
622 "secondary":null,
623 "showMenu":false,
624 "shape":"k100"
625 },
626 {
627 "id":"k34",
628 "value":"C",
629 "type":"normal",
630 "secondary":null,
631 "showMenu":false,
632 "shape":"k100"
633 },
634 {
635 "id":"k35",
636 "value":"V",
637 "type":"normal",
638 "secondary":null,
639 "showMenu":false,
640 "shape":"k100"
641 },
642 {
643 "id":"k36",
644 "value":"B",
645 "type":"normal",
646 "secondary":null,
647 "showMenu":false,
648 "shape":"k100"
649 },
650 {
651 "id":"k37",
652 "value":"N",
653 "type":"normal",
654 "secondary":null,
655 "showMenu":false,
656 "shape":"k100"
657 },
658 {
659 "id":"k38",
660 "value":"M",
661 "type":"normal",
662 "secondary":null,
663 "showMenu":false,
664 "shape":"k100"
665 },
666 {
667 "id":"k39",
668 "value":"COMM",
669 "type":"normal",
670 "secondary":null,
671 "showMenu":false,
672 "shape":"k100"
673 },
674 {
675 "id":"k3A",
676 "value":"DOT",
677 "type":"normal",
678 "secondary":null,
679 "showMenu":false,
680 "shape":"k100"
681 }
682 ],
683 "rightShift":[
684 [
685 {
686 "id":"k3B",
687 "value":"SLSH",
688 "type":"normal",
689 "secondary":null,
690 "showMenu":false,
691 "shape":"k100",
692 "zone":"Right Shift"
693 },
694 {
695 "id":"k3C",
696 "value":"RSFT",
697 "type":"normal",
698 "secondary":null,
699 "showMenu":false,
700 "shape":"k275",
701 "zone":"Right Shift"
702 },
703 {
704 "id":"k3D",
705 "value":"NO",
706 "type":"nodisplay"
707 }
708 ],
709 [
710 {
711 "id":"k3B",
712 "value":"SLSH",
713 "type":"normal",
714 "secondary":null,
715 "showMenu":false,
716 "shape":"k100",
717 "zone":"Right Shift"
718 },
719 {
720 "id":"k3C",
721 "value":"RSFT",
722 "type":"normal",
723 "secondary":null,
724 "showMenu":false,
725 "shape":"k175",
726 "zone":"Right Shift"
727 },
728 {
729 "id":"k3D",
730 "value":"L1",
731 "type":"momentary",
732 "secondary":null,
733 "showMenu":false,
734 "shape":"k100",
735 "zone":"Right Shift"
736 }
737 ],
738 [
739 {
740 "id":"k3B",
741 "value":"SLSH",
742 "type":"tapkey",
743 "secondary":"RSFT",
744 "showMenu":false,
745 "shape":"k175",
746 "zone":"Right Shift"
747 },
748 {
749 "id":"k3C",
750 "value":"UP",
751 "type":"normal",
752 "secondary":null,
753 "showMenu":false,
754 "shape":"k100",
755 "zone":"Right Shift"
756 },
757 {
758 "id":"k3D",
759 "value":"HYPR",
760 "type":"normal",
761 "secondary":null,
762 "showMenu":false,
763 "shape":"k100",
764 "zone":"Right Shift"
765 }
766 ]
767 ],
768 "row5":[
769 [
770 {
771 "id":"k40",
772 "value":"MEH",
773 "type":"normal",
774 "secondary":"MEH",
775 "showMenu":false,
776 "shape":"k125",
777 "zone":"Bottom Row"
778 },
779 {
780 "id":"k41",
781 "value":"LALT",
782 "type":"normal",
783 "secondary":null,
784 "showMenu":false,
785 "shape":"k125",
786 "zone":"Bottom Row"
787 },
788 {
789 "id":"k42",
790 "value":"LGUI",
791 "type":"normal",
792 "secondary":null,
793 "showMenu":false,
794 "shape":"k125",
795 "zone":"Bottom Row"
796 }
797 ],
798 [
799 {
800 "id":"k40",
801 "value":"LCTL",
802 "type":"normal",
803 "secondary":null,
804 "showMenu":false,
805 "shape":"k150",
806 "zone":"Bottom Row"
807 },
808 {
809 "id":"k41",
810 "value":"LGUI",
811 "type":"normal",
812 "secondary":null,
813 "showMenu":false,
814 "shape":"k100",
815 "zone":"Bottom Row"
816 },
817 {
818 "id":"k42",
819 "value":"LALT",
820 "type":"normal",
821 "secondary":null,
822 "showMenu":false,
823 "shape":"k150",
824 "zone":"Bottom Row"
825 }
826 ]
827 ],
828 "space":[
829 [
830 [
831 {
832 "id":"k44",
833 "value":"NO",
834 "type":"nodisplay"
835 },
836 {
837 "id":"k45",
838 "value":"SPC",
839 "type":"normal",
840 "secondary":null,
841 "showMenu":false,
842 "shape":"k625",
843 "zone":"Space"
844 },
845 {
846 "id":"k46",
847 "value":"NO",
848 "type":"nodisplay"
849 }
850 ],
851 [
852 {
853 "id":"k44",
854 "value":"SPC",
855 "type":"normal",
856 "secondary":null,
857 "showMenu":false,
858 "shape":"k275",
859 "zone":"Space"
860 },
861 {
862 "id":"k45",
863 "value":"L2",
864 "type":"taptoggle",
865 "secondary":null,
866 "showMenu":false,
867 "shape":"k125",
868 "zone":"Space"
869 },
870 {
871 "id":"k46",
872 "value":"L1",
873 "type":"momentary",
874 "secondary":null,
875 "showMenu":false,
876 "shape":"k225",
877 "zone":"Space"
878 }
879 ],
880 [
881 {
882 "id":"k44",
883 "value":"ENT",
884 "type":"normal",
885 "secondary":null,
886 "showMenu":false,
887 "shape":"k225",
888 "zone":"Space"
889 },
890 {
891 "id":"k45",
892 "value":"BL_STEP",
893 "type":"normal",
894 "secondary":null,
895 "showMenu":false,
896 "shape":"k125",
897 "zone":"Space"
898 },
899 {
900 "id":"k46",
901 "value":"SPC",
902 "type":"normal",
903 "secondary":null,
904 "showMenu":false,
905 "shape":"k275",
906 "zone":"Space"
907 }
908 ]
909 ],
910 [
911 [
912 {
913 "id":"k44",
914 "value":"NO",
915 "type":"nodisplay"
916 },
917 {
918 "id":"k45",
919 "value":"SPC",
920 "type":"normal",
921 "secondary":null,
922 "showMenu":false,
923 "shape":"k700",
924 "zone":"Space"
925 },
926 {
927 "id":"k46",
928 "value":"NO",
929 "type":"nodisplay"
930 }
931 ],
932 [
933 {
934 "id":"k44",
935 "value":"ENT",
936 "type":"normal",
937 "secondary":null,
938 "showMenu":false,
939 "shape":"k275",
940 "zone":"Space"
941 },
942 {
943 "id":"k45",
944 "value":"BL_STEP",
945 "type":"normal",
946 "secondary":null,
947 "showMenu":false,
948 "shape":"k150",
949 "zone":"Space"
950 },
951 {
952 "id":"k46",
953 "value":"SPC",
954 "type":"normal",
955 "secondary":null,
956 "showMenu":false,
957 "shape":"k275",
958 "zone":"Space"
959 }
960 ]
961 ]
962 ],
963 "bottomRight":[
964 [
965 [
966 {
967 "id":"k48",
968 "value":"RGUI",
969 "type":"normal",
970 "secondary":null,
971 "showMenu":false,
972 "shape":"k125",
973 "zone":"Bottom Right"
974 },
975 {
976 "id":"k49",
977 "value":"RALT",
978 "type":"normal",
979 "secondary":null,
980 "showMenu":false,
981 "shape":"k125",
982 "zone":"Bottom Right"
983 },
984 {
985 "id":"k4A",
986 "value":"NO",
987 "type":"nodisplay"
988 },
989 {
990 "id":"k4B",
991 "value":"APP",
992 "type":"normal",
993 "secondary":null,
994 "showMenu":false,
995 "shape":"k125",
996 "zone":"Bottom Right"
997 },
998 {
999 "id":"k4C",
1000 "value":"RCTL",
1001 "type":"normal",
1002 "secondary":null,
1003 "showMenu":false,
1004 "shape":"k125",
1005 "zone":"Bottom Right"
1006 }
1007 ],
1008 [
1009 {
1010 "id":"k48",
1011 "value":"L3",
1012 "type":"taptoggle",
1013 "secondary":null,
1014 "showMenu":false,
1015 "shape":"k100",
1016 "zone":"Bottom Right"
1017 },
1018 {
1019 "id":"k49",
1020 "value":"L4",
1021 "type":"direct",
1022 "secondary":null,
1023 "showMenu":false,
1024 "shape":"k100",
1025 "zone":"Bottom Right"
1026 },
1027 {
1028 "id":"k4A",
1029 "value":"LEFT",
1030 "type":"normal",
1031 "secondary":null,
1032 "showMenu":false,
1033 "shape":"k100",
1034 "zone":"Bottom Right"
1035 },
1036 {
1037 "id":"k4B",
1038 "value":"DOWN",
1039 "type":"normal",
1040 "secondary":null,
1041 "showMenu":false,
1042 "shape":"k100",
1043 "zone":"Bottom Right"
1044 },
1045 {
1046 "id":"k4C",
1047 "value":"RIGHT",
1048 "type":"normal",
1049 "secondary":null,
1050 "showMenu":false,
1051 "shape":"k100",
1052 "zone":"Bottom Right"
1053 }
1054 ]
1055 ],
1056 [
1057 [
1058 {
1059 "id":"k48",
1060 "value":"NO",
1061 "type":"nodisplay"
1062 },
1063 {
1064 "id":"k49",
1065 "value":"RALT",
1066 "type":"normal",
1067 "secondary":null,
1068 "showMenu":false,
1069 "shape":"k150",
1070 "zone":"Bottom Right"
1071 },
1072 {
1073 "id":"k4A",
1074 "value":"NO",
1075 "type":"nodisplay"
1076 },
1077 {
1078 "id":"k4B",
1079 "value":"APP",
1080 "type":"normal",
1081 "secondary":null,
1082 "showMenu":false,
1083 "shape":"k100",
1084 "zone":"Bottom Right"
1085 },
1086 {
1087 "id":"k4C",
1088 "value":"RCTL",
1089 "type":"normal",
1090 "secondary":null,
1091 "showMenu":false,
1092 "shape":"k150",
1093 "zone":"Bottom Right"
1094 }
1095 ],
1096 [
1097 {
1098 "id":"k48",
1099 "value":"NO",
1100 "type":"nodisplay"
1101 },
1102 {
1103 "id":"k49",
1104 "value":"RALT",
1105 "type":"normal",
1106 "secondary":null,
1107 "showMenu":false,
1108 "shape":"k100",
1109 "zone":"Bottom Right"
1110 },
1111 {
1112 "id":"k4A",
1113 "value":"LEFT",
1114 "type":"normal",
1115 "secondary":null,
1116 "showMenu":false,
1117 "shape":"k100",
1118 "zone":"Bottom Right"
1119 },
1120 {
1121 "id":"k4B",
1122 "value":"DOWN",
1123 "type":"normal",
1124 "secondary":null,
1125 "showMenu":false,
1126 "shape":"k100",
1127 "zone":"Bottom Right"
1128 },
1129 {
1130 "id":"k4C",
1131 "value":"RIGHT",
1132 "type":"normal",
1133 "secondary":null,
1134 "showMenu":false,
1135 "shape":"k100",
1136 "zone":"Bottom Right"
1137 }
1138 ]
1139 ]
1140 ]
1141 },
1142 {
1143 "row1":[
1144 {
1145 "id":"k00",
1146 "value":"GRV",
1147 "type":"normal",
1148 "secondary":null,
1149 "showMenu":false,
1150 "shape":"k100"
1151 },
1152 {
1153 "id":"k01",
1154 "value":"F1",
1155 "type":"normal",
1156 "secondary":null,
1157 "showMenu":false,
1158 "shape":"k100"
1159 },
1160 {
1161 "id":"k02",
1162 "value":"F2",
1163 "type":"normal",
1164 "secondary":null,
1165 "showMenu":false,
1166 "shape":"k100"
1167 },
1168 {
1169 "id":"k03",
1170 "value":"F3",
1171 "type":"normal",
1172 "secondary":null,
1173 "showMenu":false,
1174 "shape":"k100"
1175 },
1176 {
1177 "id":"k04",
1178 "value":"F4",
1179 "type":"normal",
1180 "secondary":null,
1181 "showMenu":false,
1182 "shape":"k100"
1183 },
1184 {
1185 "id":"k05",
1186 "value":"F5",
1187 "type":"normal",
1188 "secondary":null,
1189 "showMenu":false,
1190 "shape":"k100"
1191 },
1192 {
1193 "id":"k06",
1194 "value":"F6",
1195 "type":"normal",
1196 "secondary":null,
1197 "showMenu":false,
1198 "shape":"k100"
1199 },
1200 {
1201 "id":"k07",
1202 "value":"F7",
1203 "type":"normal",
1204 "secondary":null,
1205 "showMenu":false,
1206 "shape":"k100"
1207 },
1208 {
1209 "id":"k08",
1210 "value":"F8",
1211 "type":"normal",
1212 "secondary":null,
1213 "showMenu":false,
1214 "shape":"k100"
1215 },
1216 {
1217 "id":"k09",
1218 "value":"F9",
1219 "type":"normal",
1220 "secondary":null,
1221 "showMenu":false,
1222 "shape":"k100"
1223 },
1224 {
1225 "id":"k0A",
1226 "value":"F10",
1227 "type":"normal",
1228 "secondary":null,
1229 "showMenu":false,
1230 "shape":"k100"
1231 },
1232 {
1233 "id":"k0B",
1234 "value":"F11",
1235 "type":"normal",
1236 "secondary":null,
1237 "showMenu":false,
1238 "shape":"k100"
1239 },
1240 {
1241 "id":"k0C",
1242 "value":"F12",
1243 "type":"normal",
1244 "secondary":null,
1245 "showMenu":false,
1246 "shape":"k100"
1247 }
1248 ],
1249 "backspace":[
1250 [
1251 {
1252 "id":"k0D",
1253 "value":"DEL",
1254 "type":"normal",
1255 "secondary":null,
1256 "showMenu":false,
1257 "shape":"k200"
1258 },
1259 {
1260 "id":"k2D",
1261 "value":"NO",
1262 "type":"nodisplay",
1263 "showMenu":false
1264 }
1265 ],
1266 [
1267 {
1268 "id":"k0D",
1269 "value":"TRNS",
1270 "type":"normal",
1271 "secondary":null,
1272 "showMenu":false,
1273 "shape":"k100"
1274 },
1275 {
1276 "id":"k2D",
1277 "value":"TRNS",
1278 "type":"normal",
1279 "secondary":null,
1280 "showMenu":false,
1281 "shape":"k100"
1282 }
1283 ]
1284 ],
1285 "row2":[
1286 {
1287 "id":"k10",
1288 "value":"TRNS",
1289 "type":"normal",
1290 "secondary":null,
1291 "showMenu":false,
1292 "shape":"k150"
1293 },
1294 {
1295 "id":"k11",
1296 "value":"TRNS",
1297 "type":"normal",
1298 "secondary":null,
1299 "showMenu":false,
1300 "shape":"k100"
1301 },
1302 {
1303 "id":"k12",
1304 "value":"TRNS",
1305 "type":"normal",
1306 "secondary":null,
1307 "showMenu":false,
1308 "shape":"k100"
1309 },
1310 {
1311 "id":"k13",
1312 "value":"TRNS",
1313 "type":"normal",
1314 "secondary":null,
1315 "showMenu":false,
1316 "shape":"k100"
1317 },
1318 {
1319 "id":"k14",
1320 "value":"TRNS",
1321 "type":"normal",
1322 "secondary":null,
1323 "showMenu":false,
1324 "shape":"k100"
1325 },
1326 {
1327 "id":"k15",
1328 "value":"TRNS",
1329 "type":"normal",
1330 "secondary":null,
1331 "showMenu":false,
1332 "shape":"k100"
1333 },
1334 {
1335 "id":"k16",
1336 "value":"TRNS",
1337 "type":"normal",
1338 "secondary":null,
1339 "showMenu":false,
1340 "shape":"k100"
1341 },
1342 {
1343 "id":"k17",
1344 "value":"TRNS",
1345 "type":"normal",
1346 "secondary":null,
1347 "showMenu":false,
1348 "shape":"k100"
1349 },
1350 {
1351 "id":"k18",
1352 "value":"TRNS",
1353 "type":"normal",
1354 "secondary":null,
1355 "showMenu":false,
1356 "shape":"k100"
1357 },
1358 {
1359 "id":"k19",
1360 "value":"TRNS",
1361 "type":"normal",
1362 "secondary":null,
1363 "showMenu":false,
1364 "shape":"k100"
1365 },
1366 {
1367 "id":"k1A",
1368 "value":"TRNS",
1369 "type":"normal",
1370 "secondary":null,
1371 "showMenu":false,
1372 "shape":"k100"
1373 },
1374 {
1375 "id":"k1B",
1376 "value":"TRNS",
1377 "type":"normal",
1378 "secondary":null,
1379 "showMenu":false,
1380 "shape":"k100"
1381 },
1382 {
1383 "id":"k1C",
1384 "value":"TRNS",
1385 "type":"normal",
1386 "secondary":null,
1387 "showMenu":false,
1388 "shape":"k100"
1389 }
1390 ],
1391 "row2pipe":[
1392 [
1393 {
1394 "id":"k1D",
1395 "value":"TRNS",
1396 "type":"normal",
1397 "secondary":null,
1398 "showMenu":false,
1399 "shape":"k150"
1400 }
1401 ],
1402 [
1403 {
1404 "id":"k1D",
1405 "value":"TRNS",
1406 "type":"normal",
1407 "secondary":null,
1408 "showMenu":false,
1409 "shape":"kISO"
1410 }
1411 ]
1412 ],
1413 "caps":[
1414 [
1415 {
1416 "id":"k20",
1417 "value":"CAPS",
1418 "type":"normal",
1419 "secondary":"LCTL",
1420 "showMenu":false,
1421 "shape":"k175"
1422 }
1423 ],
1424 [
1425 {
1426 "id":"k20",
1427 "value":"TRNS",
1428 "type":"normal",
1429 "secondary":null,
1430 "showMenu":false,
1431 "shape":"k175stepped"
1432 }
1433 ]
1434 ],
1435 "row3":[
1436 {
1437 "id":"k21",
1438 "value":"TRNS",
1439 "type":"normal",
1440 "secondary":null,
1441 "showMenu":false,
1442 "shape":"k100"
1443 },
1444 {
1445 "id":"k22",
1446 "value":"TRNS",
1447 "type":"normal",
1448 "secondary":null,
1449 "showMenu":false,
1450 "shape":"k100"
1451 },
1452 {
1453 "id":"k23",
1454 "value":"TRNS",
1455 "type":"normal",
1456 "secondary":null,
1457 "showMenu":false,
1458 "shape":"k100"
1459 },
1460 {
1461 "id":"k24",
1462 "value":"TRNS",
1463 "type":"normal",
1464 "secondary":null,
1465 "showMenu":false,
1466 "shape":"k100"
1467 },
1468 {
1469 "id":"k25",
1470 "value":"TRNS",
1471 "type":"normal",
1472 "secondary":null,
1473 "showMenu":false,
1474 "shape":"k100"
1475 },
1476 {
1477 "id":"k26",
1478 "value":"LEFT",
1479 "type":"normal",
1480 "secondary":null,
1481 "showMenu":false,
1482 "shape":"k100"
1483 },
1484 {
1485 "id":"k27",
1486 "value":"DOWN",
1487 "type":"normal",
1488 "secondary":null,
1489 "showMenu":false,
1490 "shape":"k100"
1491 },
1492 {
1493 "id":"k28",
1494 "value":"UP",
1495 "type":"normal",
1496 "secondary":null,
1497 "showMenu":false,
1498 "shape":"k100"
1499 },
1500 {
1501 "id":"k29",
1502 "value":"RIGHT",
1503 "type":"normal",
1504 "secondary":null,
1505 "showMenu":false,
1506 "shape":"k100"
1507 },
1508 {
1509 "id":"k2A",
1510 "value":"TRNS",
1511 "type":"normal",
1512 "secondary":null,
1513 "showMenu":false,
1514 "shape":"k100"
1515 },
1516 {
1517 "id":"k2B",
1518 "value":"TRNS",
1519 "type":"normal",
1520 "secondary":null,
1521 "showMenu":false,
1522 "shape":"k100"
1523 }
1524 ],
1525 "enter":[
1526 [
1527 {
1528 "id":"k2C",
1529 "value":"TRNS",
1530 "type":"normal",
1531 "secondary":null,
1532 "showMenu":false,
1533 "shape":"k225"
1534 }
1535 ],
1536 [
1537 {
1538 "id":"k2C",
1539 "value":"TRNS",
1540 "type":"normal",
1541 "secondary":null,
1542 "showMenu":false,
1543 "shape":"k100"
1544 }
1545 ]
1546 ],
1547 "leftShift":[
1548 [
1549 {
1550 "id":"k30",
1551 "value":"LSFT",
1552 "type":"normal",
1553 "secondary":null,
1554 "showMenu":false,
1555 "shape":"k225"
1556 },
1557 {
1558 "id":"k31",
1559 "value":"NO",
1560 "type":"nodisplay",
1561 "showMenu":false
1562 }
1563 ],
1564 [
1565 {
1566 "id":"k30",
1567 "value":"TRNS",
1568 "type":"normal",
1569 "secondary":null,
1570 "showMenu":false,
1571 "shape":"k125"
1572 },
1573 {
1574 "id":"k31",
1575 "value":"TRNS",
1576 "type":"normal",
1577 "secondary":null,
1578 "showMenu":false,
1579 "shape":"k100"
1580 }
1581 ]
1582 ],
1583 "row4":[
1584 {
1585 "id":"k32",
1586 "value":"TRNS",
1587 "type":"normal",
1588 "secondary":null,
1589 "showMenu":false,
1590 "shape":"k100"
1591 },
1592 {
1593 "id":"k33",
1594 "value":"TRNS",
1595 "type":"normal",
1596 "secondary":null,
1597 "showMenu":false,
1598 "shape":"k100"
1599 },
1600 {
1601 "id":"k34",
1602 "value":"TRNS",
1603 "type":"normal",
1604 "secondary":null,
1605 "showMenu":false,
1606 "shape":"k100"
1607 },
1608 {
1609 "id":"k35",
1610 "value":"TRNS",
1611 "type":"normal",
1612 "secondary":null,
1613 "showMenu":false,
1614 "shape":"k100"
1615 },
1616 {
1617 "id":"k36",
1618 "value":"TRNS",
1619 "type":"normal",
1620 "secondary":null,
1621 "showMenu":false,
1622 "shape":"k100"
1623 },
1624 {
1625 "id":"k37",
1626 "value":"TRNS",
1627 "type":"normal",
1628 "secondary":null,
1629 "showMenu":false,
1630 "shape":"k100"
1631 },
1632 {
1633 "id":"k38",
1634 "value":"TRNS",
1635 "type":"normal",
1636 "secondary":null,
1637 "showMenu":false,
1638 "shape":"k100"
1639 },
1640 {
1641 "id":"k39",
1642 "value":"TRNS",
1643 "type":"normal",
1644 "secondary":null,
1645 "showMenu":false,
1646 "shape":"k100"
1647 },
1648 {
1649 "id":"k3A",
1650 "value":"TRNS",
1651 "type":"normal",
1652 "secondary":null,
1653 "showMenu":false,
1654 "shape":"k100"
1655 }
1656 ],
1657 "rightShift":[
1658 [
1659 {
1660 "id":"k3B",
1661 "value":"TRNS",
1662 "type":"normal",
1663 "secondary":null,
1664 "showMenu":false,
1665 "shape":"k100"
1666 },
1667 {
1668 "id":"k3C",
1669 "value":"TRNS",
1670 "type":"normal",
1671 "secondary":null,
1672 "showMenu":false,
1673 "shape":"k275"
1674 },
1675 {
1676 "id":"k3D",
1677 "value":"NO",
1678 "type":"nodisplay"
1679 }
1680 ],
1681 [
1682 {
1683 "id":"k3B",
1684 "value":"TRNS",
1685 "type":"normal",
1686 "secondary":null,
1687 "showMenu":false,
1688 "shape":"k100"
1689 },
1690 {
1691 "id":"k3C",
1692 "value":"TRNS",
1693 "type":"normal",
1694 "secondary":null,
1695 "showMenu":false,
1696 "shape":"k175"
1697 },
1698 {
1699 "id":"k3D",
1700 "value":"TRNS",
1701 "type":"normal",
1702 "secondary":null,
1703 "showMenu":false,
1704 "shape":"k100"
1705 }
1706 ],
1707 [
1708 {
1709 "id":"k3B",
1710 "value":"TRNS",
1711 "type":"normal",
1712 "secondary":"RSFT",
1713 "showMenu":false,
1714 "shape":"k175"
1715 },
1716 {
1717 "id":"k3C",
1718 "value":"TRNS",
1719 "type":"normal",
1720 "secondary":null,
1721 "showMenu":false,
1722 "shape":"k100"
1723 },
1724 {
1725 "id":"k3D",
1726 "value":"TRNS",
1727 "type":"normal",
1728 "secondary":null,
1729 "showMenu":false,
1730 "shape":"k100"
1731 }
1732 ]
1733 ],
1734 "row5":[
1735 [
1736 {
1737 "id":"k40",
1738 "value":"TRNS",
1739 "type":"normal",
1740 "secondary":"MEH",
1741 "showMenu":false,
1742 "shape":"k125"
1743 },
1744 {
1745 "id":"k41",
1746 "value":"TRNS",
1747 "type":"normal",
1748 "secondary":null,
1749 "showMenu":false,
1750 "shape":"k125"
1751 },
1752 {
1753 "id":"k42",
1754 "value":"TRNS",
1755 "type":"normal",
1756 "secondary":null,
1757 "showMenu":false,
1758 "shape":"k125"
1759 }
1760 ],
1761 [
1762 {
1763 "id":"k40",
1764 "value":"TRNS",
1765 "type":"normal",
1766 "secondary":null,
1767 "showMenu":false,
1768 "shape":"k150"
1769 },
1770 {
1771 "id":"k41",
1772 "value":"TRNS",
1773 "type":"normal",
1774 "secondary":null,
1775 "showMenu":false,
1776 "shape":"k100"
1777 },
1778 {
1779 "id":"k42",
1780 "value":"TRNS",
1781 "type":"normal",
1782 "secondary":null,
1783 "showMenu":false,
1784 "shape":"k150"
1785 }
1786 ]
1787 ],
1788 "space":[
1789 [
1790 [
1791 {
1792 "id":"k44",
1793 "value":"NO",
1794 "type":"nodisplay"
1795 },
1796 {
1797 "id":"k45",
1798 "value":"TRNS",
1799 "type":"normal",
1800 "secondary":null,
1801 "showMenu":false,
1802 "shape":"k625"
1803 },
1804 {
1805 "id":"k46",
1806 "value":"NO",
1807 "type":"nodisplay"
1808 }
1809 ],
1810 [
1811 {
1812 "id":"k44",
1813 "value":"TRNS",
1814 "type":"normal",
1815 "secondary":null,
1816 "showMenu":false,
1817 "shape":"k275"
1818 },
1819 {
1820 "id":"k45",
1821 "value":"TRNS",
1822 "type":"normal",
1823 "secondary":null,
1824 "showMenu":false,
1825 "shape":"k125"
1826 },
1827 {
1828 "id":"k46",
1829 "value":"TRNS",
1830 "type":"normal",
1831 "secondary":null,
1832 "showMenu":false,
1833 "shape":"k225"
1834 }
1835 ],
1836 [
1837 {
1838 "id":"k44",
1839 "value":"TRNS",
1840 "type":"normal",
1841 "secondary":null,
1842 "showMenu":false,
1843 "shape":"k225"
1844 },
1845 {
1846 "id":"k45",
1847 "value":"TRNS",
1848 "type":"normal",
1849 "secondary":null,
1850 "showMenu":false,
1851 "shape":"k125"
1852 },
1853 {
1854 "id":"k46",
1855 "value":"TRNS",
1856 "type":"normal",
1857 "secondary":null,
1858 "showMenu":false,
1859 "shape":"k275"
1860 }
1861 ]
1862 ],
1863 [
1864 [
1865 {
1866 "id":"k44",
1867 "value":"NO",
1868 "type":"nodisplay"
1869 },
1870 {
1871 "id":"k45",
1872 "value":"TRNS",
1873 "type":"normal",
1874 "secondary":null,
1875 "showMenu":false,
1876 "shape":"k700"
1877 },
1878 {
1879 "id":"k46",
1880 "value":"NO",
1881 "type":"nodisplay"
1882 }
1883 ],
1884 [
1885 {
1886 "id":"k44",
1887 "value":"TRNS",
1888 "type":"normal",
1889 "secondary":null,
1890 "showMenu":false,
1891 "shape":"k275"
1892 },
1893 {
1894 "id":"k45",
1895 "value":"TRNS",
1896 "type":"normal",
1897 "secondary":null,
1898 "showMenu":false,
1899 "shape":"k150"
1900 },
1901 {
1902 "id":"k46",
1903 "value":"TRNS",
1904 "type":"normal",
1905 "secondary":null,
1906 "showMenu":false,
1907 "shape":"k275"
1908 }
1909 ]
1910 ]
1911 ],
1912 "bottomRight":[
1913 [
1914 [
1915 {
1916 "id":"k48",
1917 "value":"TRNS",
1918 "type":"normal",
1919 "secondary":null,
1920 "showMenu":false,
1921 "shape":"k125"
1922 },
1923 {
1924 "id":"k49",
1925 "value":"TRNS",
1926 "type":"normal",
1927 "secondary":null,
1928 "showMenu":false,
1929 "shape":"k125"
1930 },
1931 {
1932 "id":"k4A",
1933 "value":"NO",
1934 "type":"nodisplay"
1935 },
1936 {
1937 "id":"k4B",
1938 "value":"TRNS",
1939 "type":"normal",
1940 "secondary":null,
1941 "showMenu":false,
1942 "shape":"k125"
1943 },
1944 {
1945 "id":"k4C",
1946 "value":"TRNS",
1947 "type":"normal",
1948 "secondary":null,
1949 "showMenu":false,
1950 "shape":"k125"
1951 }
1952 ],
1953 [
1954 {
1955 "id":"k48",
1956 "value":"TRNS",
1957 "type":"normal",
1958 "secondary":null,
1959 "showMenu":false,
1960 "shape":"k100"
1961 },
1962 {
1963 "id":"k49",
1964 "value":"TRNS",
1965 "type":"normal",
1966 "secondary":null,
1967 "showMenu":false,
1968 "shape":"k100"
1969 },
1970 {
1971 "id":"k4A",
1972 "value":"TRNS",
1973 "type":"normal",
1974 "secondary":null,
1975 "showMenu":false,
1976 "shape":"k100"
1977 },
1978 {
1979 "id":"k4B",
1980 "value":"TRNS",
1981 "type":"normal",
1982 "secondary":null,
1983 "showMenu":false,
1984 "shape":"k100"
1985 },
1986 {
1987 "id":"k4C",
1988 "value":"TRNS",
1989 "type":"normal",
1990 "secondary":null,
1991 "showMenu":false,
1992 "shape":"k100"
1993 }
1994 ]
1995 ],
1996 [
1997 [
1998 {
1999 "id":"k48",
2000 "value":"NO",
2001 "type":"nodisplay"
2002 },
2003 {
2004 "id":"k49",
2005 "value":"TRNS",
2006 "type":"normal",
2007 "secondary":null,
2008 "showMenu":false,
2009 "shape":"k150"
2010 },
2011 {
2012 "id":"k4A",
2013 "value":"NO",
2014 "type":"nodisplay"
2015 },
2016 {
2017 "id":"k4B",
2018 "value":"TRNS",
2019 "type":"normal",
2020 "secondary":null,
2021 "showMenu":false,
2022 "shape":"k100"
2023 },
2024 {
2025 "id":"k4C",
2026 "value":"TRNS",
2027 "type":"normal",
2028 "secondary":null,
2029 "showMenu":false,
2030 "shape":"k150"
2031 }
2032 ],
2033 [
2034 {
2035 "id":"k48",
2036 "value":"NO",
2037 "type":"nodisplay"
2038 },
2039 {
2040 "id":"k49",
2041 "value":"TRNS",
2042 "type":"normal",
2043 "secondary":null,
2044 "showMenu":false,
2045 "shape":"k100"
2046 },
2047 {
2048 "id":"k4A",
2049 "value":"TRNS",
2050 "type":"normal",
2051 "secondary":null,
2052 "showMenu":false,
2053 "shape":"k100"
2054 },
2055 {
2056 "id":"k4B",
2057 "value":"TRNS",
2058 "type":"normal",
2059 "secondary":null,
2060 "showMenu":false,
2061 "shape":"k100"
2062 },
2063 {
2064 "id":"k4C",
2065 "value":"TRNS",
2066 "type":"normal",
2067 "secondary":null,
2068 "showMenu":false,
2069 "shape":"k100"
2070 }
2071 ]
2072 ]
2073 ]
2074 },
2075 {
2076 "row1":[
2077 {
2078 "id":"k00",
2079 "value":"TRNS",
2080 "type":"normal",
2081 "secondary":null,
2082 "showMenu":false,
2083 "shape":"k100"
2084 },
2085 {
2086 "id":"k01",
2087 "value":"TRNS",
2088 "type":"normal",
2089 "secondary":null,
2090 "showMenu":false,
2091 "shape":"k100"
2092 },
2093 {
2094 "id":"k02",
2095 "value":"TRNS",
2096 "type":"normal",
2097 "secondary":null,
2098 "showMenu":false,
2099 "shape":"k100"
2100 },
2101 {
2102 "id":"k03",
2103 "value":"TRNS",
2104 "type":"normal",
2105 "secondary":null,
2106 "showMenu":false,
2107 "shape":"k100"
2108 },
2109 {
2110 "id":"k04",
2111 "value":"TRNS",
2112 "type":"normal",
2113 "secondary":null,
2114 "showMenu":false,
2115 "shape":"k100"
2116 },
2117 {
2118 "id":"k05",
2119 "value":"TRNS",
2120 "type":"normal",
2121 "secondary":null,
2122 "showMenu":false,
2123 "shape":"k100"
2124 },
2125 {
2126 "id":"k06",
2127 "value":"TRNS",
2128 "type":"normal",
2129 "secondary":null,
2130 "showMenu":false,
2131 "shape":"k100"
2132 },
2133 {
2134 "id":"k07",
2135 "value":"TRNS",
2136 "type":"normal",
2137 "secondary":null,
2138 "showMenu":false,
2139 "shape":"k100"
2140 },
2141 {
2142 "id":"k08",
2143 "value":"TRNS",
2144 "type":"normal",
2145 "secondary":null,
2146 "showMenu":false,
2147 "shape":"k100"
2148 },
2149 {
2150 "id":"k09",
2151 "value":"TRNS",
2152 "type":"normal",
2153 "secondary":null,
2154 "showMenu":false,
2155 "shape":"k100"
2156 },
2157 {
2158 "id":"k0A",
2159 "value":"TRNS",
2160 "type":"normal",
2161 "secondary":null,
2162 "showMenu":false,
2163 "shape":"k100"
2164 },
2165 {
2166 "id":"k0B",
2167 "value":"TRNS",
2168 "type":"normal",
2169 "secondary":null,
2170 "showMenu":false,
2171 "shape":"k100"
2172 },
2173 {
2174 "id":"k0C",
2175 "value":"TRNS",
2176 "type":"normal",
2177 "secondary":null,
2178 "showMenu":false,
2179 "shape":"k100"
2180 }
2181 ],
2182 "backspace":[
2183 [
2184 {
2185 "id":"k0D",
2186 "value":"TRNS",
2187 "type":"normal",
2188 "secondary":null,
2189 "showMenu":false,
2190 "shape":"k200"
2191 },
2192 {
2193 "id":"k2D",
2194 "value":"NO",
2195 "type":"nodisplay",
2196 "showMenu":false
2197 }
2198 ],
2199 [
2200 {
2201 "id":"k0D",
2202 "value":"TRNS",
2203 "type":"normal",
2204 "secondary":null,
2205 "showMenu":false,
2206 "shape":"k100"
2207 },
2208 {
2209 "id":"k2D",
2210 "value":"TRNS",
2211 "type":"normal",
2212 "secondary":null,
2213 "showMenu":false,
2214 "shape":"k100"
2215 }
2216 ]
2217 ],
2218 "row2":[
2219 {
2220 "id":"k10",
2221 "value":"TRNS",
2222 "type":"normal",
2223 "secondary":null,
2224 "showMenu":false,
2225 "shape":"k150"
2226 },
2227 {
2228 "id":"k11",
2229 "value":"TRNS",
2230 "type":"normal",
2231 "secondary":null,
2232 "showMenu":false,
2233 "shape":"k100"
2234 },
2235 {
2236 "id":"k12",
2237 "value":"TRNS",
2238 "type":"normal",
2239 "secondary":null,
2240 "showMenu":false,
2241 "shape":"k100"
2242 },
2243 {
2244 "id":"k13",
2245 "value":"TRNS",
2246 "type":"normal",
2247 "secondary":null,
2248 "showMenu":false,
2249 "shape":"k100"
2250 },
2251 {
2252 "id":"k14",
2253 "value":"TRNS",
2254 "type":"normal",
2255 "secondary":null,
2256 "showMenu":false,
2257 "shape":"k100"
2258 },
2259 {
2260 "id":"k15",
2261 "value":"TRNS",
2262 "type":"normal",
2263 "secondary":null,
2264 "showMenu":false,
2265 "shape":"k100"
2266 },
2267 {
2268 "id":"k16",
2269 "value":"TRNS",
2270 "type":"normal",
2271 "secondary":null,
2272 "showMenu":false,
2273 "shape":"k100"
2274 },
2275 {
2276 "id":"k17",
2277 "value":"TRNS",
2278 "type":"normal",
2279 "secondary":null,
2280 "showMenu":false,
2281 "shape":"k100"
2282 },
2283 {
2284 "id":"k18",
2285 "value":"TRNS",
2286 "type":"normal",
2287 "secondary":null,
2288 "showMenu":false,
2289 "shape":"k100"
2290 },
2291 {
2292 "id":"k19",
2293 "value":"TRNS",
2294 "type":"normal",
2295 "secondary":null,
2296 "showMenu":false,
2297 "shape":"k100"
2298 },
2299 {
2300 "id":"k1A",
2301 "value":"TRNS",
2302 "type":"normal",
2303 "secondary":null,
2304 "showMenu":false,
2305 "shape":"k100"
2306 },
2307 {
2308 "id":"k1B",
2309 "value":"TRNS",
2310 "type":"normal",
2311 "secondary":null,
2312 "showMenu":false,
2313 "shape":"k100"
2314 },
2315 {
2316 "id":"k1C",
2317 "value":"TRNS",
2318 "type":"normal",
2319 "secondary":null,
2320 "showMenu":false,
2321 "shape":"k100"
2322 }
2323 ],
2324 "row2pipe":[
2325 [
2326 {
2327 "id":"k1D",
2328 "value":"TRNS",
2329 "type":"normal",
2330 "secondary":null,
2331 "showMenu":false,
2332 "shape":"k150"
2333 }
2334 ],
2335 [
2336 {
2337 "id":"k1D",
2338 "value":"TRNS",
2339 "type":"normal",
2340 "secondary":null,
2341 "showMenu":false,
2342 "shape":"kISO"
2343 }
2344 ]
2345 ],
2346 "caps":[
2347 [
2348 {
2349 "id":"k20",
2350 "value":"TRNS",
2351 "type":"normal",
2352 "secondary":"LCTL",
2353 "showMenu":false,
2354 "shape":"k175"
2355 }
2356 ],
2357 [
2358 {
2359 "id":"k20",
2360 "value":"TRNS",
2361 "type":"normal",
2362 "secondary":null,
2363 "showMenu":false,
2364 "shape":"k175stepped"
2365 }
2366 ]
2367 ],
2368 "row3":[
2369 {
2370 "id":"k21",
2371 "value":"TRNS",
2372 "type":"normal",
2373 "secondary":null,
2374 "showMenu":false,
2375 "shape":"k100"
2376 },
2377 {
2378 "id":"k22",
2379 "value":"TRNS",
2380 "type":"normal",
2381 "secondary":null,
2382 "showMenu":false,
2383 "shape":"k100"
2384 },
2385 {
2386 "id":"k23",
2387 "value":"TRNS",
2388 "type":"normal",
2389 "secondary":null,
2390 "showMenu":false,
2391 "shape":"k100"
2392 },
2393 {
2394 "id":"k24",
2395 "value":"TRNS",
2396 "type":"normal",
2397 "secondary":null,
2398 "showMenu":false,
2399 "shape":"k100"
2400 },
2401 {
2402 "id":"k25",
2403 "value":"TRNS",
2404 "type":"normal",
2405 "secondary":null,
2406 "showMenu":false,
2407 "shape":"k100"
2408 },
2409 {
2410 "id":"k26",
2411 "value":"TRNS",
2412 "type":"normal",
2413 "secondary":null,
2414 "showMenu":false,
2415 "shape":"k100"
2416 },
2417 {
2418 "id":"k27",
2419 "value":"TRNS",
2420 "type":"normal",
2421 "secondary":null,
2422 "showMenu":false,
2423 "shape":"k100"
2424 },
2425 {
2426 "id":"k28",
2427 "value":"TRNS",
2428 "type":"normal",
2429 "secondary":null,
2430 "showMenu":false,
2431 "shape":"k100"
2432 },
2433 {
2434 "id":"k29",
2435 "value":"TRNS",
2436 "type":"normal",
2437 "secondary":null,
2438 "showMenu":false,
2439 "shape":"k100"
2440 },
2441 {
2442 "id":"k2A",
2443 "value":"TRNS",
2444 "type":"normal",
2445 "secondary":null,
2446 "showMenu":false,
2447 "shape":"k100"
2448 },
2449 {
2450 "id":"k2B",
2451 "value":"TRNS",
2452 "type":"normal",
2453 "secondary":null,
2454 "showMenu":false,
2455 "shape":"k100"
2456 }
2457 ],
2458 "enter":[
2459 [
2460 {
2461 "id":"k2C",
2462 "value":"TRNS",
2463 "type":"normal",
2464 "secondary":null,
2465 "showMenu":false,
2466 "shape":"k225"
2467 }
2468 ],
2469 [
2470 {
2471 "id":"k2C",
2472 "value":"TRNS",
2473 "type":"normal",
2474 "secondary":null,
2475 "showMenu":false,
2476 "shape":"k100"
2477 }
2478 ]
2479 ],
2480 "leftShift":[
2481 [
2482 {
2483 "id":"k30",
2484 "value":"TRNS",
2485 "type":"normal",
2486 "secondary":null,
2487 "showMenu":false,
2488 "shape":"k225"
2489 },
2490 {
2491 "id":"k31",
2492 "value":"NO",
2493 "type":"nodisplay",
2494 "showMenu":false
2495 }
2496 ],
2497 [
2498 {
2499 "id":"k30",
2500 "value":"TRNS",
2501 "type":"normal",
2502 "secondary":null,
2503 "showMenu":false,
2504 "shape":"k125"
2505 },
2506 {
2507 "id":"k31",
2508 "value":"TRNS",
2509 "type":"normal",
2510 "secondary":null,
2511 "showMenu":false,
2512 "shape":"k100"
2513 }
2514 ]
2515 ],
2516 "row4":[
2517 {
2518 "id":"k32",
2519 "value":"TRNS",
2520 "type":"normal",
2521 "secondary":null,
2522 "showMenu":false,
2523 "shape":"k100"
2524 },
2525 {
2526 "id":"k33",
2527 "value":"TRNS",
2528 "type":"normal",
2529 "secondary":null,
2530 "showMenu":false,
2531 "shape":"k100"
2532 },
2533 {
2534 "id":"k34",
2535 "value":"TRNS",
2536 "type":"normal",
2537 "secondary":null,
2538 "showMenu":false,
2539 "shape":"k100"
2540 },
2541 {
2542 "id":"k35",
2543 "value":"TRNS",
2544 "type":"normal",
2545 "secondary":null,
2546 "showMenu":false,
2547 "shape":"k100"
2548 },
2549 {
2550 "id":"k36",
2551 "value":"TRNS",
2552 "type":"normal",
2553 "secondary":null,
2554 "showMenu":false,
2555 "shape":"k100"
2556 },
2557 {
2558 "id":"k37",
2559 "value":"TRNS",
2560 "type":"normal",
2561 "secondary":null,
2562 "showMenu":false,
2563 "shape":"k100"
2564 },
2565 {
2566 "id":"k38",
2567 "value":"TRNS",
2568 "type":"normal",
2569 "secondary":null,
2570 "showMenu":false,
2571 "shape":"k100"
2572 },
2573 {
2574 "id":"k39",
2575 "value":"TRNS",
2576 "type":"normal",
2577 "secondary":null,
2578 "showMenu":false,
2579 "shape":"k100"
2580 },
2581 {
2582 "id":"k3A",
2583 "value":"TRNS",
2584 "type":"normal",
2585 "secondary":null,
2586 "showMenu":false,
2587 "shape":"k100"
2588 }
2589 ],
2590 "rightShift":[
2591 [
2592 {
2593 "id":"k3B",
2594 "value":"TRNS",
2595 "type":"normal",
2596 "secondary":null,
2597 "showMenu":false,
2598 "shape":"k100"
2599 },
2600 {
2601 "id":"k3C",
2602 "value":"TRNS",
2603 "type":"normal",
2604 "secondary":null,
2605 "showMenu":false,
2606 "shape":"k275"
2607 },
2608 {
2609 "id":"k3D",
2610 "value":"NO",
2611 "type":"nodisplay"
2612 }
2613 ],
2614 [
2615 {
2616 "id":"k3B",
2617 "value":"TRNS",
2618 "type":"normal",
2619 "secondary":null,
2620 "showMenu":false,
2621 "shape":"k100"
2622 },
2623 {
2624 "id":"k3C",
2625 "value":"TRNS",
2626 "type":"normal",
2627 "secondary":null,
2628 "showMenu":false,
2629 "shape":"k175"
2630 },
2631 {
2632 "id":"k3D",
2633 "value":"TRNS",
2634 "type":"normal",
2635 "secondary":null,
2636 "showMenu":false,
2637 "shape":"k100"
2638 }
2639 ],
2640 [
2641 {
2642 "id":"k3B",
2643 "value":"TRNS",
2644 "type":"normal",
2645 "secondary":"RSFT",
2646 "showMenu":false,
2647 "shape":"k175"
2648 },
2649 {
2650 "id":"k3C",
2651 "value":"TRNS",
2652 "type":"normal",
2653 "secondary":null,
2654 "showMenu":false,
2655 "shape":"k100"
2656 },
2657 {
2658 "id":"k3D",
2659 "value":"TRNS",
2660 "type":"normal",
2661 "secondary":null,
2662 "showMenu":false,
2663 "shape":"k100"
2664 }
2665 ]
2666 ],
2667 "row5":[
2668 [
2669 {
2670 "id":"k40",
2671 "value":"TRNS",
2672 "type":"normal",
2673 "secondary":"MEH",
2674 "showMenu":false,
2675 "shape":"k125"
2676 },
2677 {
2678 "id":"k41",
2679 "value":"TRNS",
2680 "type":"normal",
2681 "secondary":null,
2682 "showMenu":false,
2683 "shape":"k125"
2684 },
2685 {
2686 "id":"k42",
2687 "value":"TRNS",
2688 "type":"normal",
2689 "secondary":null,
2690 "showMenu":false,
2691 "shape":"k125"
2692 }
2693 ],
2694 [
2695 {
2696 "id":"k40",
2697 "value":"TRNS",
2698 "type":"normal",
2699 "secondary":null,
2700 "showMenu":false,
2701 "shape":"k150"
2702 },
2703 {
2704 "id":"k41",
2705 "value":"TRNS",
2706 "type":"normal",
2707 "secondary":null,
2708 "showMenu":false,
2709 "shape":"k100"
2710 },
2711 {
2712 "id":"k42",
2713 "value":"TRNS",
2714 "type":"normal",
2715 "secondary":null,
2716 "showMenu":false,
2717 "shape":"k150"
2718 }
2719 ]
2720 ],
2721 "space":[
2722 [
2723 [
2724 {
2725 "id":"k44",
2726 "value":"NO",
2727 "type":"nodisplay"
2728 },
2729 {
2730 "id":"k45",
2731 "value":"TRNS",
2732 "type":"normal",
2733 "secondary":null,
2734 "showMenu":false,
2735 "shape":"k625"
2736 },
2737 {
2738 "id":"k46",
2739 "value":"NO",
2740 "type":"nodisplay"
2741 }
2742 ],
2743 [
2744 {
2745 "id":"k44",
2746 "value":"TRNS",
2747 "type":"normal",
2748 "secondary":null,
2749 "showMenu":false,
2750 "shape":"k275"
2751 },
2752 {
2753 "id":"k45",
2754 "value":"TRNS",
2755 "type":"normal",
2756 "secondary":null,
2757 "showMenu":false,
2758 "shape":"k125"
2759 },
2760 {
2761 "id":"k46",
2762 "value":"TRNS",
2763 "type":"normal",
2764 "secondary":null,
2765 "showMenu":false,
2766 "shape":"k225"
2767 }
2768 ],
2769 [
2770 {
2771 "id":"k44",
2772 "value":"TRNS",
2773 "type":"normal",
2774 "secondary":null,
2775 "showMenu":false,
2776 "shape":"k225"
2777 },
2778 {
2779 "id":"k45",
2780 "value":"TRNS",
2781 "type":"normal",
2782 "secondary":null,
2783 "showMenu":false,
2784 "shape":"k125"
2785 },
2786 {
2787 "id":"k46",
2788 "value":"TRNS",
2789 "type":"normal",
2790 "secondary":null,
2791 "showMenu":false,
2792 "shape":"k275"
2793 }
2794 ]
2795 ],
2796 [
2797 [
2798 {
2799 "id":"k44",
2800 "value":"NO",
2801 "type":"nodisplay"
2802 },
2803 {
2804 "id":"k45",
2805 "value":"TRNS",
2806 "type":"normal",
2807 "secondary":null,
2808 "showMenu":false,
2809 "shape":"k700"
2810 },
2811 {
2812 "id":"k46",
2813 "value":"NO",
2814 "type":"nodisplay"
2815 }
2816 ],
2817 [
2818 {
2819 "id":"k44",
2820 "value":"TRNS",
2821 "type":"normal",
2822 "secondary":null,
2823 "showMenu":false,
2824 "shape":"k275"
2825 },
2826 {
2827 "id":"k45",
2828 "value":"TRNS",
2829 "type":"normal",
2830 "secondary":null,
2831 "showMenu":false,
2832 "shape":"k150"
2833 },
2834 {
2835 "id":"k46",
2836 "value":"TRNS",
2837 "type":"normal",
2838 "secondary":null,
2839 "showMenu":false,
2840 "shape":"k275"
2841 }
2842 ]
2843 ]
2844 ],
2845 "bottomRight":[
2846 [
2847 [
2848 {
2849 "id":"k48",
2850 "value":"TRNS",
2851 "type":"normal",
2852 "secondary":null,
2853 "showMenu":false,
2854 "shape":"k125"
2855 },
2856 {
2857 "id":"k49",
2858 "value":"TRNS",
2859 "type":"normal",
2860 "secondary":null,
2861 "showMenu":false,
2862 "shape":"k125"
2863 },
2864 {
2865 "id":"k4A",
2866 "value":"NO",
2867 "type":"nodisplay"
2868 },
2869 {
2870 "id":"k4B",
2871 "value":"TRNS",
2872 "type":"normal",
2873 "secondary":null,
2874 "showMenu":false,
2875 "shape":"k125"
2876 },
2877 {
2878 "id":"k4C",
2879 "value":"TRNS",
2880 "type":"normal",
2881 "secondary":null,
2882 "showMenu":false,
2883 "shape":"k125"
2884 }
2885 ],
2886 [
2887 {
2888 "id":"k48",
2889 "value":"TRNS",
2890 "type":"normal",
2891 "secondary":null,
2892 "showMenu":false,
2893 "shape":"k100"
2894 },
2895 {
2896 "id":"k49",
2897 "value":"TRNS",
2898 "type":"normal",
2899 "secondary":null,
2900 "showMenu":false,
2901 "shape":"k100"
2902 },
2903 {
2904 "id":"k4A",
2905 "value":"TRNS",
2906 "type":"normal",
2907 "secondary":null,
2908 "showMenu":false,
2909 "shape":"k100"
2910 },
2911 {
2912 "id":"k4B",
2913 "value":"TRNS",
2914 "type":"normal",
2915 "secondary":null,
2916 "showMenu":false,
2917 "shape":"k100"
2918 },
2919 {
2920 "id":"k4C",
2921 "value":"TRNS",
2922 "type":"normal",
2923 "secondary":null,
2924 "showMenu":false,
2925 "shape":"k100"
2926 }
2927 ]
2928 ],
2929 [
2930 [
2931 {
2932 "id":"k48",
2933 "value":"NO",
2934 "type":"nodisplay"
2935 },
2936 {
2937 "id":"k49",
2938 "value":"TRNS",
2939 "type":"normal",
2940 "secondary":null,
2941 "showMenu":false,
2942 "shape":"k150"
2943 },
2944 {
2945 "id":"k4A",
2946 "value":"NO",
2947 "type":"nodisplay"
2948 },
2949 {
2950 "id":"k4B",
2951 "value":"TRNS",
2952 "type":"normal",
2953 "secondary":null,
2954 "showMenu":false,
2955 "shape":"k100"
2956 },
2957 {
2958 "id":"k4C",
2959 "value":"TRNS",
2960 "type":"normal",
2961 "secondary":null,
2962 "showMenu":false,
2963 "shape":"k150"
2964 }
2965 ],
2966 [
2967 {
2968 "id":"k48",
2969 "value":"NO",
2970 "type":"nodisplay"
2971 },
2972 {
2973 "id":"k49",
2974 "value":"TRNS",
2975 "type":"normal",
2976 "secondary":null,
2977 "showMenu":false,
2978 "shape":"k100"
2979 },
2980 {
2981 "id":"k4A",
2982 "value":"TRNS",
2983 "type":"normal",
2984 "secondary":null,
2985 "showMenu":false,
2986 "shape":"k100"
2987 },
2988 {
2989 "id":"k4B",
2990 "value":"TRNS",
2991 "type":"normal",
2992 "secondary":null,
2993 "showMenu":false,
2994 "shape":"k100"
2995 },
2996 {
2997 "id":"k4C",
2998 "value":"TRNS",
2999 "type":"normal",
3000 "secondary":null,
3001 "showMenu":false,
3002 "shape":"k100"
3003 }
3004 ]
3005 ]
3006 ]
3007 },
3008 {
3009 "row1":[
3010 {
3011 "id":"k00",
3012 "value":"TRNS",
3013 "type":"normal",
3014 "secondary":null,
3015 "showMenu":false,
3016 "shape":"k100"
3017 },
3018 {
3019 "id":"k01",
3020 "value":"TRNS",
3021 "type":"normal",
3022 "secondary":null,
3023 "showMenu":false,
3024 "shape":"k100"
3025 },
3026 {
3027 "id":"k02",
3028 "value":"TRNS",
3029 "type":"normal",
3030 "secondary":null,
3031 "showMenu":false,
3032 "shape":"k100"
3033 },
3034 {
3035 "id":"k03",
3036 "value":"TRNS",
3037 "type":"normal",
3038 "secondary":null,
3039 "showMenu":false,
3040 "shape":"k100"
3041 },
3042 {
3043 "id":"k04",
3044 "value":"TRNS",
3045 "type":"normal",
3046 "secondary":null,
3047 "showMenu":false,
3048 "shape":"k100"
3049 },
3050 {
3051 "id":"k05",
3052 "value":"TRNS",
3053 "type":"normal",
3054 "secondary":null,
3055 "showMenu":false,
3056 "shape":"k100"
3057 },
3058 {
3059 "id":"k06",
3060 "value":"TRNS",
3061 "type":"normal",
3062 "secondary":null,
3063 "showMenu":false,
3064 "shape":"k100"
3065 },
3066 {
3067 "id":"k07",
3068 "value":"PSLS",
3069 "type":"normal",
3070 "secondary":null,
3071 "showMenu":false,
3072 "shape":"k100"
3073 },
3074 {
3075 "id":"k08",
3076 "value":"PAST",
3077 "type":"normal",
3078 "secondary":null,
3079 "showMenu":false,
3080 "shape":"k100"
3081 },
3082 {
3083 "id":"k09",
3084 "value":"PEQL",
3085 "type":"normal",
3086 "secondary":null,
3087 "showMenu":false,
3088 "shape":"k100"
3089 },
3090 {
3091 "id":"k0A",
3092 "value":"TRNS",
3093 "type":"normal",
3094 "secondary":null,
3095 "showMenu":false,
3096 "shape":"k100"
3097 },
3098 {
3099 "id":"k0B",
3100 "value":"TRNS",
3101 "type":"normal",
3102 "secondary":null,
3103 "showMenu":false,
3104 "shape":"k100"
3105 },
3106 {
3107 "id":"k0C",
3108 "value":"TRNS",
3109 "type":"normal",
3110 "secondary":null,
3111 "showMenu":false,
3112 "shape":"k100"
3113 }
3114 ],
3115 "backspace":[
3116 [
3117 {
3118 "id":"k0D",
3119 "value":"TRNS",
3120 "type":"normal",
3121 "secondary":null,
3122 "showMenu":false,
3123 "shape":"k200"
3124 },
3125 {
3126 "id":"k2D",
3127 "value":"NO",
3128 "type":"nodisplay",
3129 "showMenu":false
3130 }
3131 ],
3132 [
3133 {
3134 "id":"k0D",
3135 "value":"TRNS",
3136 "type":"normal",
3137 "secondary":null,
3138 "showMenu":false,
3139 "shape":"k100"
3140 },
3141 {
3142 "id":"k2D",
3143 "value":"TRNS",
3144 "type":"normal",
3145 "secondary":null,
3146 "showMenu":false,
3147 "shape":"k100"
3148 }
3149 ]
3150 ],
3151 "row2":[
3152 {
3153 "id":"k10",
3154 "value":"TRNS",
3155 "type":"normal",
3156 "secondary":null,
3157 "showMenu":false,
3158 "shape":"k150"
3159 },
3160 {
3161 "id":"k11",
3162 "value":"TRNS",
3163 "type":"normal",
3164 "secondary":null,
3165 "showMenu":false,
3166 "shape":"k100"
3167 },
3168 {
3169 "id":"k12",
3170 "value":"TRNS",
3171 "type":"normal",
3172 "secondary":null,
3173 "showMenu":false,
3174 "shape":"k100"
3175 },
3176 {
3177 "id":"k13",
3178 "value":"TRNS",
3179 "type":"normal",
3180 "secondary":null,
3181 "showMenu":false,
3182 "shape":"k100"
3183 },
3184 {
3185 "id":"k14",
3186 "value":"TRNS",
3187 "type":"normal",
3188 "secondary":null,
3189 "showMenu":false,
3190 "shape":"k100"
3191 },
3192 {
3193 "id":"k15",
3194 "value":"TRNS",
3195 "type":"normal",
3196 "secondary":null,
3197 "showMenu":false,
3198 "shape":"k100"
3199 },
3200 {
3201 "id":"k16",
3202 "value":"P7",
3203 "type":"normal",
3204 "secondary":null,
3205 "showMenu":false,
3206 "shape":"k100"
3207 },
3208 {
3209 "id":"k17",
3210 "value":"P8",
3211 "type":"normal",
3212 "secondary":null,
3213 "showMenu":false,
3214 "shape":"k100"
3215 },
3216 {
3217 "id":"k18",
3218 "value":"P8",
3219 "type":"normal",
3220 "secondary":null,
3221 "showMenu":false,
3222 "shape":"k100"
3223 },
3224 {
3225 "id":"k19",
3226 "value":"PMNS",
3227 "type":"normal",
3228 "secondary":null,
3229 "showMenu":false,
3230 "shape":"k100"
3231 },
3232 {
3233 "id":"k1A",
3234 "value":"TRNS",
3235 "type":"normal",
3236 "secondary":null,
3237 "showMenu":false,
3238 "shape":"k100"
3239 },
3240 {
3241 "id":"k1B",
3242 "value":"TRNS",
3243 "type":"normal",
3244 "secondary":null,
3245 "showMenu":false,
3246 "shape":"k100"
3247 },
3248 {
3249 "id":"k1C",
3250 "value":"TRNS",
3251 "type":"normal",
3252 "secondary":null,
3253 "showMenu":false,
3254 "shape":"k100"
3255 }
3256 ],
3257 "row2pipe":[
3258 [
3259 {
3260 "id":"k1D",
3261 "value":"TRNS",
3262 "type":"normal",
3263 "secondary":null,
3264 "showMenu":false,
3265 "shape":"k150"
3266 }
3267 ],
3268 [
3269 {
3270 "id":"k1D",
3271 "value":"TRNS",
3272 "type":"normal",
3273 "secondary":null,
3274 "showMenu":false,
3275 "shape":"kISO"
3276 }
3277 ]
3278 ],
3279 "caps":[
3280 [
3281 {
3282 "id":"k20",
3283 "value":"TRNS",
3284 "type":"normal",
3285 "secondary":"LCTL",
3286 "showMenu":false,
3287 "shape":"k175"
3288 }
3289 ],
3290 [
3291 {
3292 "id":"k20",
3293 "value":"TRNS",
3294 "type":"normal",
3295 "secondary":null,
3296 "showMenu":false,
3297 "shape":"k175stepped"
3298 }
3299 ]
3300 ],
3301 "row3":[
3302 {
3303 "id":"k21",
3304 "value":"TRNS",
3305 "type":"normal",
3306 "secondary":null,
3307 "showMenu":false,
3308 "shape":"k100"
3309 },
3310 {
3311 "id":"k22",
3312 "value":"TRNS",
3313 "type":"normal",
3314 "secondary":null,
3315 "showMenu":false,
3316 "shape":"k100"
3317 },
3318 {
3319 "id":"k23",
3320 "value":"TRNS",
3321 "type":"normal",
3322 "secondary":null,
3323 "showMenu":false,
3324 "shape":"k100"
3325 },
3326 {
3327 "id":"k24",
3328 "value":"TRNS",
3329 "type":"normal",
3330 "secondary":null,
3331 "showMenu":false,
3332 "shape":"k100"
3333 },
3334 {
3335 "id":"k25",
3336 "value":"TRNS",
3337 "type":"normal",
3338 "secondary":null,
3339 "showMenu":false,
3340 "shape":"k100"
3341 },
3342 {
3343 "id":"k26",
3344 "value":"P4",
3345 "type":"normal",
3346 "secondary":null,
3347 "showMenu":false,
3348 "shape":"k100"
3349 },
3350 {
3351 "id":"k27",
3352 "value":"P5",
3353 "type":"normal",
3354 "secondary":null,
3355 "showMenu":false,
3356 "shape":"k100"
3357 },
3358 {
3359 "id":"k28",
3360 "value":"P6",
3361 "type":"normal",
3362 "secondary":null,
3363 "showMenu":false,
3364 "shape":"k100"
3365 },
3366 {
3367 "id":"k29",
3368 "value":"PPLS",
3369 "type":"normal",
3370 "secondary":null,
3371 "showMenu":false,
3372 "shape":"k100"
3373 },
3374 {
3375 "id":"k2A",
3376 "value":"TRNS",
3377 "type":"normal",
3378 "secondary":null,
3379 "showMenu":false,
3380 "shape":"k100"
3381 },
3382 {
3383 "id":"k2B",
3384 "value":"TRNS",
3385 "type":"normal",
3386 "secondary":null,
3387 "showMenu":false,
3388 "shape":"k100"
3389 }
3390 ],
3391 "enter":[
3392 [
3393 {
3394 "id":"k2C",
3395 "value":"TRNS",
3396 "type":"normal",
3397 "secondary":null,
3398 "showMenu":false,
3399 "shape":"k225"
3400 }
3401 ],
3402 [
3403 {
3404 "id":"k2C",
3405 "value":"TRNS",
3406 "type":"normal",
3407 "secondary":null,
3408 "showMenu":false,
3409 "shape":"k100"
3410 }
3411 ]
3412 ],
3413 "leftShift":[
3414 [
3415 {
3416 "id":"k30",
3417 "value":"TRNS",
3418 "type":"normal",
3419 "secondary":null,
3420 "showMenu":false,
3421 "shape":"k225"
3422 },
3423 {
3424 "id":"k31",
3425 "value":"NO",
3426 "type":"nodisplay",
3427 "showMenu":false
3428 }
3429 ],
3430 [
3431 {
3432 "id":"k30",
3433 "value":"TRNS",
3434 "type":"normal",
3435 "secondary":null,
3436 "showMenu":false,
3437 "shape":"k125"
3438 },
3439 {
3440 "id":"k31",
3441 "value":"TRNS",
3442 "type":"normal",
3443 "secondary":null,
3444 "showMenu":false,
3445 "shape":"k100"
3446 }
3447 ]
3448 ],
3449 "row4":[
3450 {
3451 "id":"k32",
3452 "value":"TRNS",
3453 "type":"normal",
3454 "secondary":null,
3455 "showMenu":false,
3456 "shape":"k100"
3457 },
3458 {
3459 "id":"k33",
3460 "value":"TRNS",
3461 "type":"normal",
3462 "secondary":null,
3463 "showMenu":false,
3464 "shape":"k100"
3465 },
3466 {
3467 "id":"k34",
3468 "value":"TRNS",
3469 "type":"normal",
3470 "secondary":null,
3471 "showMenu":false,
3472 "shape":"k100"
3473 },
3474 {
3475 "id":"k35",
3476 "value":"TRNS",
3477 "type":"normal",
3478 "secondary":null,
3479 "showMenu":false,
3480 "shape":"k100"
3481 },
3482 {
3483 "id":"k36",
3484 "value":"TRNS",
3485 "type":"normal",
3486 "secondary":null,
3487 "showMenu":false,
3488 "shape":"k100"
3489 },
3490 {
3491 "id":"k37",
3492 "value":"P1",
3493 "type":"normal",
3494 "secondary":null,
3495 "showMenu":false,
3496 "shape":"k100"
3497 },
3498 {
3499 "id":"k38",
3500 "value":"P2",
3501 "type":"normal",
3502 "secondary":null,
3503 "showMenu":false,
3504 "shape":"k100"
3505 },
3506 {
3507 "id":"k39",
3508 "value":"P3",
3509 "type":"normal",
3510 "secondary":null,
3511 "showMenu":false,
3512 "shape":"k100"
3513 },
3514 {
3515 "id":"k3A",
3516 "value":"PDOT",
3517 "type":"normal",
3518 "secondary":null,
3519 "showMenu":false,
3520 "shape":"k100"
3521 }
3522 ],
3523 "rightShift":[
3524 [
3525 {
3526 "id":"k3B",
3527 "value":"TRNS",
3528 "type":"normal",
3529 "secondary":null,
3530 "showMenu":false,
3531 "shape":"k100"
3532 },
3533 {
3534 "id":"k3C",
3535 "value":"TRNS",
3536 "type":"normal",
3537 "secondary":null,
3538 "showMenu":false,
3539 "shape":"k275"
3540 },
3541 {
3542 "id":"k3D",
3543 "value":"NO",
3544 "type":"nodisplay"
3545 }
3546 ],
3547 [
3548 {
3549 "id":"k3B",
3550 "value":"TRNS",
3551 "type":"normal",
3552 "secondary":null,
3553 "showMenu":false,
3554 "shape":"k100"
3555 },
3556 {
3557 "id":"k3C",
3558 "value":"TRNS",
3559 "type":"normal",
3560 "secondary":null,
3561 "showMenu":false,
3562 "shape":"k175"
3563 },
3564 {
3565 "id":"k3D",
3566 "value":"TRNS",
3567 "type":"normal",
3568 "secondary":null,
3569 "showMenu":false,
3570 "shape":"k100"
3571 }
3572 ],
3573 [
3574 {
3575 "id":"k3B",
3576 "value":"PENT",
3577 "type":"normal",
3578 "secondary":"RSFT",
3579 "showMenu":false,
3580 "shape":"k175"
3581 },
3582 {
3583 "id":"k3C",
3584 "value":"TRNS",
3585 "type":"normal",
3586 "secondary":null,
3587 "showMenu":false,
3588 "shape":"k100"
3589 },
3590 {
3591 "id":"k3D",
3592 "value":"TRNS",
3593 "type":"normal",
3594 "secondary":null,
3595 "showMenu":false,
3596 "shape":"k100"
3597 }
3598 ]
3599 ],
3600 "row5":[
3601 [
3602 {
3603 "id":"k40",
3604 "value":"TRNS",
3605 "type":"normal",
3606 "secondary":"MEH",
3607 "showMenu":false,
3608 "shape":"k125"
3609 },
3610 {
3611 "id":"k41",
3612 "value":"TRNS",
3613 "type":"normal",
3614 "secondary":null,
3615 "showMenu":false,
3616 "shape":"k125"
3617 },
3618 {
3619 "id":"k42",
3620 "value":"TRNS",
3621 "type":"normal",
3622 "secondary":null,
3623 "showMenu":false,
3624 "shape":"k125"
3625 }
3626 ],
3627 [
3628 {
3629 "id":"k40",
3630 "value":"TRNS",
3631 "type":"normal",
3632 "secondary":null,
3633 "showMenu":false,
3634 "shape":"k150"
3635 },
3636 {
3637 "id":"k41",
3638 "value":"TRNS",
3639 "type":"normal",
3640 "secondary":null,
3641 "showMenu":false,
3642 "shape":"k100"
3643 },
3644 {
3645 "id":"k42",
3646 "value":"TRNS",
3647 "type":"normal",
3648 "secondary":null,
3649 "showMenu":false,
3650 "shape":"k150"
3651 }
3652 ]
3653 ],
3654 "space":[
3655 [
3656 [
3657 {
3658 "id":"k44",
3659 "value":"NO",
3660 "type":"nodisplay"
3661 },
3662 {
3663 "id":"k45",
3664 "value":"TRNS",
3665 "type":"normal",
3666 "secondary":null,
3667 "showMenu":false,
3668 "shape":"k625"
3669 },
3670 {
3671 "id":"k46",
3672 "value":"NO",
3673 "type":"nodisplay"
3674 }
3675 ],
3676 [
3677 {
3678 "id":"k44",
3679 "value":"TRNS",
3680 "type":"normal",
3681 "secondary":null,
3682 "showMenu":false,
3683 "shape":"k275"
3684 },
3685 {
3686 "id":"k45",
3687 "value":"TRNS",
3688 "type":"normal",
3689 "secondary":null,
3690 "showMenu":false,
3691 "shape":"k125"
3692 },
3693 {
3694 "id":"k46",
3695 "value":"P0",
3696 "type":"normal",
3697 "secondary":null,
3698 "showMenu":false,
3699 "shape":"k225"
3700 }
3701 ],
3702 [
3703 {
3704 "id":"k44",
3705 "value":"TRNS",
3706 "type":"normal",
3707 "secondary":null,
3708 "showMenu":false,
3709 "shape":"k225"
3710 },
3711 {
3712 "id":"k45",
3713 "value":"TRNS",
3714 "type":"normal",
3715 "secondary":null,
3716 "showMenu":false,
3717 "shape":"k125"
3718 },
3719 {
3720 "id":"k46",
3721 "value":"TRNS",
3722 "type":"normal",
3723 "secondary":null,
3724 "showMenu":false,
3725 "shape":"k275"
3726 }
3727 ]
3728 ],
3729 [
3730 [
3731 {
3732 "id":"k44",
3733 "value":"NO",
3734 "type":"nodisplay"
3735 },
3736 {
3737 "id":"k45",
3738 "value":"TRNS",
3739 "type":"normal",
3740 "secondary":null,
3741 "showMenu":false,
3742 "shape":"k700"
3743 },
3744 {
3745 "id":"k46",
3746 "value":"NO",
3747 "type":"nodisplay"
3748 }
3749 ],
3750 [
3751 {
3752 "id":"k44",
3753 "value":"TRNS",
3754 "type":"normal",
3755 "secondary":null,
3756 "showMenu":false,
3757 "shape":"k275"
3758 },
3759 {
3760 "id":"k45",
3761 "value":"TRNS",
3762 "type":"normal",
3763 "secondary":null,
3764 "showMenu":false,
3765 "shape":"k150"
3766 },
3767 {
3768 "id":"k46",
3769 "value":"TRNS",
3770 "type":"normal",
3771 "secondary":null,
3772 "showMenu":false,
3773 "shape":"k275"
3774 }
3775 ]
3776 ]
3777 ],
3778 "bottomRight":[
3779 [
3780 [
3781 {
3782 "id":"k48",
3783 "value":"TRNS",
3784 "type":"normal",
3785 "secondary":null,
3786 "showMenu":false,
3787 "shape":"k125"
3788 },
3789 {
3790 "id":"k49",
3791 "value":"TRNS",
3792 "type":"normal",
3793 "secondary":null,
3794 "showMenu":false,
3795 "shape":"k125"
3796 },
3797 {
3798 "id":"k4A",
3799 "value":"NO",
3800 "type":"nodisplay"
3801 },
3802 {
3803 "id":"k4B",
3804 "value":"TRNS",
3805 "type":"normal",
3806 "secondary":null,
3807 "showMenu":false,
3808 "shape":"k125"
3809 },
3810 {
3811 "id":"k4C",
3812 "value":"TRNS",
3813 "type":"normal",
3814 "secondary":null,
3815 "showMenu":false,
3816 "shape":"k125"
3817 }
3818 ],
3819 [
3820 {
3821 "id":"k48",
3822 "value":"TRNS",
3823 "type":"normal",
3824 "secondary":null,
3825 "showMenu":false,
3826 "shape":"k100"
3827 },
3828 {
3829 "id":"k49",
3830 "value":"TRNS",
3831 "type":"normal",
3832 "secondary":null,
3833 "showMenu":false,
3834 "shape":"k100"
3835 },
3836 {
3837 "id":"k4A",
3838 "value":"TRNS",
3839 "type":"normal",
3840 "secondary":null,
3841 "showMenu":false,
3842 "shape":"k100"
3843 },
3844 {
3845 "id":"k4B",
3846 "value":"TRNS",
3847 "type":"normal",
3848 "secondary":null,
3849 "showMenu":false,
3850 "shape":"k100"
3851 },
3852 {
3853 "id":"k4C",
3854 "value":"TRNS",
3855 "type":"normal",
3856 "secondary":null,
3857 "showMenu":false,
3858 "shape":"k100"
3859 }
3860 ]
3861 ],
3862 [
3863 [
3864 {
3865 "id":"k48",
3866 "value":"NO",
3867 "type":"nodisplay"
3868 },
3869 {
3870 "id":"k49",
3871 "value":"TRNS",
3872 "type":"normal",
3873 "secondary":null,
3874 "showMenu":false,
3875 "shape":"k150"
3876 },
3877 {
3878 "id":"k4A",
3879 "value":"NO",
3880 "type":"nodisplay"
3881 },
3882 {
3883 "id":"k4B",
3884 "value":"TRNS",
3885 "type":"normal",
3886 "secondary":null,
3887 "showMenu":false,
3888 "shape":"k100"
3889 },
3890 {
3891 "id":"k4C",
3892 "value":"TRNS",
3893 "type":"normal",
3894 "secondary":null,
3895 "showMenu":false,
3896 "shape":"k150"
3897 }
3898 ],
3899 [
3900 {
3901 "id":"k48",
3902 "value":"NO",
3903 "type":"nodisplay"
3904 },
3905 {
3906 "id":"k49",
3907 "value":"TRNS",
3908 "type":"normal",
3909 "secondary":null,
3910 "showMenu":false,
3911 "shape":"k100"
3912 },
3913 {
3914 "id":"k4A",
3915 "value":"TRNS",
3916 "type":"normal",
3917 "secondary":null,
3918 "showMenu":false,
3919 "shape":"k100"
3920 },
3921 {
3922 "id":"k4B",
3923 "value":"TRNS",
3924 "type":"normal",
3925 "secondary":null,
3926 "showMenu":false,
3927 "shape":"k100"
3928 },
3929 {
3930 "id":"k4C",
3931 "value":"TRNS",
3932 "type":"normal",
3933 "secondary":null,
3934 "showMenu":false,
3935 "shape":"k100"
3936 }
3937 ]
3938 ]
3939 ]
3940 },
3941 {
3942 "row1":[
3943 {
3944 "id":"k00",
3945 "value":"TRNS",
3946 "type":"normal",
3947 "secondary":null,
3948 "showMenu":false,
3949 "shape":"k100"
3950 },
3951 {
3952 "id":"k01",
3953 "value":"TRNS",
3954 "type":"normal",
3955 "secondary":null,
3956 "showMenu":false,
3957 "shape":"k100"
3958 },
3959 {
3960 "id":"k02",
3961 "value":"TRNS",
3962 "type":"normal",
3963 "secondary":null,
3964 "showMenu":false,
3965 "shape":"k100"
3966 },
3967 {
3968 "id":"k03",
3969 "value":"TRNS",
3970 "type":"normal",
3971 "secondary":null,
3972 "showMenu":false,
3973 "shape":"k100"
3974 },
3975 {
3976 "id":"k04",
3977 "value":"TRNS",
3978 "type":"normal",
3979 "secondary":null,
3980 "showMenu":false,
3981 "shape":"k100"
3982 },
3983 {
3984 "id":"k05",
3985 "value":"TRNS",
3986 "type":"normal",
3987 "secondary":null,
3988 "showMenu":false,
3989 "shape":"k100"
3990 },
3991 {
3992 "id":"k06",
3993 "value":"TRNS",
3994 "type":"normal",
3995 "secondary":null,
3996 "showMenu":false,
3997 "shape":"k100"
3998 },
3999 {
4000 "id":"k07",
4001 "value":"TRNS",
4002 "type":"normal",
4003 "secondary":null,
4004 "showMenu":false,
4005 "shape":"k100"
4006 },
4007 {
4008 "id":"k08",
4009 "value":"TRNS",
4010 "type":"normal",
4011 "secondary":null,
4012 "showMenu":false,
4013 "shape":"k100"
4014 },
4015 {
4016 "id":"k09",
4017 "value":"TRNS",
4018 "type":"normal",
4019 "secondary":null,
4020 "showMenu":false,
4021 "shape":"k100"
4022 },
4023 {
4024 "id":"k0A",
4025 "value":"TRNS",
4026 "type":"normal",
4027 "secondary":null,
4028 "showMenu":false,
4029 "shape":"k100"
4030 },
4031 {
4032 "id":"k0B",
4033 "value":"TRNS",
4034 "type":"normal",
4035 "secondary":null,
4036 "showMenu":false,
4037 "shape":"k100"
4038 },
4039 {
4040 "id":"k0C",
4041 "value":"TRNS",
4042 "type":"normal",
4043 "secondary":null,
4044 "showMenu":false,
4045 "shape":"k100"
4046 }
4047 ],
4048 "backspace":[
4049 [
4050 {
4051 "id":"k0D",
4052 "value":"TRNS",
4053 "type":"normal",
4054 "secondary":null,
4055 "showMenu":false,
4056 "shape":"k200"
4057 },
4058 {
4059 "id":"k2D",
4060 "value":"NO",
4061 "type":"nodisplay",
4062 "showMenu":false
4063 }
4064 ],
4065 [
4066 {
4067 "id":"k0D",
4068 "value":"TRNS",
4069 "type":"normal",
4070 "secondary":null,
4071 "showMenu":false,
4072 "shape":"k100"
4073 },
4074 {
4075 "id":"k2D",
4076 "value":"TRNS",
4077 "type":"normal",
4078 "secondary":null,
4079 "showMenu":false,
4080 "shape":"k100"
4081 }
4082 ]
4083 ],
4084 "row2":[
4085 {
4086 "id":"k10",
4087 "value":"TRNS",
4088 "type":"normal",
4089 "secondary":null,
4090 "showMenu":false,
4091 "shape":"k150"
4092 },
4093 {
4094 "id":"k11",
4095 "value":"TRNS",
4096 "type":"normal",
4097 "secondary":null,
4098 "showMenu":false,
4099 "shape":"k100"
4100 },
4101 {
4102 "id":"k12",
4103 "value":"TRNS",
4104 "type":"normal",
4105 "secondary":null,
4106 "showMenu":false,
4107 "shape":"k100"
4108 },
4109 {
4110 "id":"k13",
4111 "value":"TRNS",
4112 "type":"normal",
4113 "secondary":null,
4114 "showMenu":false,
4115 "shape":"k100"
4116 },
4117 {
4118 "id":"k14",
4119 "value":"TRNS",
4120 "type":"normal",
4121 "secondary":null,
4122 "showMenu":false,
4123 "shape":"k100"
4124 },
4125 {
4126 "id":"k15",
4127 "value":"TRNS",
4128 "type":"normal",
4129 "secondary":null,
4130 "showMenu":false,
4131 "shape":"k100"
4132 },
4133 {
4134 "id":"k16",
4135 "value":"TRNS",
4136 "type":"normal",
4137 "secondary":null,
4138 "showMenu":false,
4139 "shape":"k100"
4140 },
4141 {
4142 "id":"k17",
4143 "value":"TRNS",
4144 "type":"normal",
4145 "secondary":null,
4146 "showMenu":false,
4147 "shape":"k100"
4148 },
4149 {
4150 "id":"k18",
4151 "value":"TRNS",
4152 "type":"normal",
4153 "secondary":null,
4154 "showMenu":false,
4155 "shape":"k100"
4156 },
4157 {
4158 "id":"k19",
4159 "value":"TRNS",
4160 "type":"normal",
4161 "secondary":null,
4162 "showMenu":false,
4163 "shape":"k100"
4164 },
4165 {
4166 "id":"k1A",
4167 "value":"TRNS",
4168 "type":"normal",
4169 "secondary":null,
4170 "showMenu":false,
4171 "shape":"k100"
4172 },
4173 {
4174 "id":"k1B",
4175 "value":"TRNS",
4176 "type":"normal",
4177 "secondary":null,
4178 "showMenu":false,
4179 "shape":"k100"
4180 },
4181 {
4182 "id":"k1C",
4183 "value":"TRNS",
4184 "type":"normal",
4185 "secondary":null,
4186 "showMenu":false,
4187 "shape":"k100"
4188 }
4189 ],
4190 "row2pipe":[
4191 [
4192 {
4193 "id":"k1D",
4194 "value":"TRNS",
4195 "type":"normal",
4196 "secondary":null,
4197 "showMenu":false,
4198 "shape":"k150"
4199 }
4200 ],
4201 [
4202 {
4203 "id":"k1D",
4204 "value":"TRNS",
4205 "type":"normal",
4206 "secondary":null,
4207 "showMenu":false,
4208 "shape":"kISO"
4209 }
4210 ]
4211 ],
4212 "caps":[
4213 [
4214 {
4215 "id":"k20",
4216 "value":"TRNS",
4217 "type":"normal",
4218 "secondary":"LCTL",
4219 "showMenu":false,
4220 "shape":"k175"
4221 }
4222 ],
4223 [
4224 {
4225 "id":"k20",
4226 "value":"TRNS",
4227 "type":"normal",
4228 "secondary":null,
4229 "showMenu":false,
4230 "shape":"k175stepped"
4231 }
4232 ]
4233 ],
4234 "row3":[
4235 {
4236 "id":"k21",
4237 "value":"TRNS",
4238 "type":"normal",
4239 "secondary":null,
4240 "showMenu":false,
4241 "shape":"k100"
4242 },
4243 {
4244 "id":"k22",
4245 "value":"TRNS",
4246 "type":"normal",
4247 "secondary":null,
4248 "showMenu":false,
4249 "shape":"k100"
4250 },
4251 {
4252 "id":"k23",
4253 "value":"TRNS",
4254 "type":"normal",
4255 "secondary":null,
4256 "showMenu":false,
4257 "shape":"k100"
4258 },
4259 {
4260 "id":"k24",
4261 "value":"TRNS",
4262 "type":"normal",
4263 "secondary":null,
4264 "showMenu":false,
4265 "shape":"k100"
4266 },
4267 {
4268 "id":"k25",
4269 "value":"TRNS",
4270 "type":"normal",
4271 "secondary":null,
4272 "showMenu":false,
4273 "shape":"k100"
4274 },
4275 {
4276 "id":"k26",
4277 "value":"TRNS",
4278 "type":"normal",
4279 "secondary":null,
4280 "showMenu":false,
4281 "shape":"k100"
4282 },
4283 {
4284 "id":"k27",
4285 "value":"TRNS",
4286 "type":"normal",
4287 "secondary":null,
4288 "showMenu":false,
4289 "shape":"k100"
4290 },
4291 {
4292 "id":"k28",
4293 "value":"TRNS",
4294 "type":"normal",
4295 "secondary":null,
4296 "showMenu":false,
4297 "shape":"k100"
4298 },
4299 {
4300 "id":"k29",
4301 "value":"TRNS",
4302 "type":"normal",
4303 "secondary":null,
4304 "showMenu":false,
4305 "shape":"k100"
4306 },
4307 {
4308 "id":"k2A",
4309 "value":"TRNS",
4310 "type":"normal",
4311 "secondary":null,
4312 "showMenu":false,
4313 "shape":"k100"
4314 },
4315 {
4316 "id":"k2B",
4317 "value":"TRNS",
4318 "type":"normal",
4319 "secondary":null,
4320 "showMenu":false,
4321 "shape":"k100"
4322 }
4323 ],
4324 "enter":[
4325 [
4326 {
4327 "id":"k2C",
4328 "value":"TRNS",
4329 "type":"normal",
4330 "secondary":null,
4331 "showMenu":false,
4332 "shape":"k225"
4333 }
4334 ],
4335 [
4336 {
4337 "id":"k2C",
4338 "value":"TRNS",
4339 "type":"normal",
4340 "secondary":null,
4341 "showMenu":false,
4342 "shape":"k100"
4343 }
4344 ]
4345 ],
4346 "leftShift":[
4347 [
4348 {
4349 "id":"k30",
4350 "value":"TRNS",
4351 "type":"normal",
4352 "secondary":null,
4353 "showMenu":false,
4354 "shape":"k225"
4355 },
4356 {
4357 "id":"k31",
4358 "value":"NO",
4359 "type":"nodisplay",
4360 "showMenu":false
4361 }
4362 ],
4363 [
4364 {
4365 "id":"k30",
4366 "value":"TRNS",
4367 "type":"normal",
4368 "secondary":null,
4369 "showMenu":false,
4370 "shape":"k125"
4371 },
4372 {
4373 "id":"k31",
4374 "value":"TRNS",
4375 "type":"normal",
4376 "secondary":null,
4377 "showMenu":false,
4378 "shape":"k100"
4379 }
4380 ]
4381 ],
4382 "row4":[
4383 {
4384 "id":"k32",
4385 "value":"TRNS",
4386 "type":"normal",
4387 "secondary":null,
4388 "showMenu":false,
4389 "shape":"k100"
4390 },
4391 {
4392 "id":"k33",
4393 "value":"TRNS",
4394 "type":"normal",
4395 "secondary":null,
4396 "showMenu":false,
4397 "shape":"k100"
4398 },
4399 {
4400 "id":"k34",
4401 "value":"TRNS",
4402 "type":"normal",
4403 "secondary":null,
4404 "showMenu":false,
4405 "shape":"k100"
4406 },
4407 {
4408 "id":"k35",
4409 "value":"TRNS",
4410 "type":"normal",
4411 "secondary":null,
4412 "showMenu":false,
4413 "shape":"k100"
4414 },
4415 {
4416 "id":"k36",
4417 "value":"TRNS",
4418 "type":"normal",
4419 "secondary":null,
4420 "showMenu":false,
4421 "shape":"k100"
4422 },
4423 {
4424 "id":"k37",
4425 "value":"TRNS",
4426 "type":"normal",
4427 "secondary":null,
4428 "showMenu":false,
4429 "shape":"k100"
4430 },
4431 {
4432 "id":"k38",
4433 "value":"TRNS",
4434 "type":"normal",
4435 "secondary":null,
4436 "showMenu":false,
4437 "shape":"k100"
4438 },
4439 {
4440 "id":"k39",
4441 "value":"TRNS",
4442 "type":"normal",
4443 "secondary":null,
4444 "showMenu":false,
4445 "shape":"k100"
4446 },
4447 {
4448 "id":"k3A",
4449 "value":"TRNS",
4450 "type":"normal",
4451 "secondary":null,
4452 "showMenu":false,
4453 "shape":"k100"
4454 }
4455 ],
4456 "rightShift":[
4457 [
4458 {
4459 "id":"k3B",
4460 "value":"TRNS",
4461 "type":"normal",
4462 "secondary":null,
4463 "showMenu":false,
4464 "shape":"k100"
4465 },
4466 {
4467 "id":"k3C",
4468 "value":"TRNS",
4469 "type":"normal",
4470 "secondary":null,
4471 "showMenu":false,
4472 "shape":"k275"
4473 },
4474 {
4475 "id":"k3D",
4476 "value":"NO",
4477 "type":"nodisplay"
4478 }
4479 ],
4480 [
4481 {
4482 "id":"k3B",
4483 "value":"TRNS",
4484 "type":"normal",
4485 "secondary":null,
4486 "showMenu":false,
4487 "shape":"k100"
4488 },
4489 {
4490 "id":"k3C",
4491 "value":"TRNS",
4492 "type":"normal",
4493 "secondary":null,
4494 "showMenu":false,
4495 "shape":"k175"
4496 },
4497 {
4498 "id":"k3D",
4499 "value":"TRNS",
4500 "type":"normal",
4501 "secondary":null,
4502 "showMenu":false,
4503 "shape":"k100"
4504 }
4505 ],
4506 [
4507 {
4508 "id":"k3B",
4509 "value":"TRNS",
4510 "type":"normal",
4511 "secondary":"RSFT",
4512 "showMenu":false,
4513 "shape":"k175"
4514 },
4515 {
4516 "id":"k3C",
4517 "value":"HOME",
4518 "type":"normal",
4519 "secondary":null,
4520 "showMenu":false,
4521 "shape":"k100"
4522 },
4523 {
4524 "id":"k3D",
4525 "value":"PGUP",
4526 "type":"normal",
4527 "secondary":null,
4528 "showMenu":false,
4529 "shape":"k100"
4530 }
4531 ]
4532 ],
4533 "row5":[
4534 [
4535 {
4536 "id":"k40",
4537 "value":"TRNS",
4538 "type":"normal",
4539 "secondary":"MEH",
4540 "showMenu":false,
4541 "shape":"k125"
4542 },
4543 {
4544 "id":"k41",
4545 "value":"TRNS",
4546 "type":"normal",
4547 "secondary":null,
4548 "showMenu":false,
4549 "shape":"k125"
4550 },
4551 {
4552 "id":"k42",
4553 "value":"TRNS",
4554 "type":"normal",
4555 "secondary":null,
4556 "showMenu":false,
4557 "shape":"k125"
4558 }
4559 ],
4560 [
4561 {
4562 "id":"k40",
4563 "value":"TRNS",
4564 "type":"normal",
4565 "secondary":null,
4566 "showMenu":false,
4567 "shape":"k150"
4568 },
4569 {
4570 "id":"k41",
4571 "value":"TRNS",
4572 "type":"normal",
4573 "secondary":null,
4574 "showMenu":false,
4575 "shape":"k100"
4576 },
4577 {
4578 "id":"k42",
4579 "value":"TRNS",
4580 "type":"normal",
4581 "secondary":null,
4582 "showMenu":false,
4583 "shape":"k150"
4584 }
4585 ]
4586 ],
4587 "space":[
4588 [
4589 [
4590 {
4591 "id":"k44",
4592 "value":"NO",
4593 "type":"nodisplay"
4594 },
4595 {
4596 "id":"k45",
4597 "value":"TRNS",
4598 "type":"normal",
4599 "secondary":null,
4600 "showMenu":false,
4601 "shape":"k625"
4602 },
4603 {
4604 "id":"k46",
4605 "value":"NO",
4606 "type":"nodisplay"
4607 }
4608 ],
4609 [
4610 {
4611 "id":"k44",
4612 "value":"TRNS",
4613 "type":"normal",
4614 "secondary":null,
4615 "showMenu":false,
4616 "shape":"k275"
4617 },
4618 {
4619 "id":"k45",
4620 "value":"TRNS",
4621 "type":"normal",
4622 "secondary":null,
4623 "showMenu":false,
4624 "shape":"k125"
4625 },
4626 {
4627 "id":"k46",
4628 "value":"TRNS",
4629 "type":"normal",
4630 "secondary":null,
4631 "showMenu":false,
4632 "shape":"k225"
4633 }
4634 ],
4635 [
4636 {
4637 "id":"k44",
4638 "value":"TRNS",
4639 "type":"normal",
4640 "secondary":null,
4641 "showMenu":false,
4642 "shape":"k225"
4643 },
4644 {
4645 "id":"k45",
4646 "value":"TRNS",
4647 "type":"normal",
4648 "secondary":null,
4649 "showMenu":false,
4650 "shape":"k125"
4651 },
4652 {
4653 "id":"k46",
4654 "value":"TRNS",
4655 "type":"normal",
4656 "secondary":null,
4657 "showMenu":false,
4658 "shape":"k275"
4659 }
4660 ]
4661 ],
4662 [
4663 [
4664 {
4665 "id":"k44",
4666 "value":"NO",
4667 "type":"nodisplay"
4668 },
4669 {
4670 "id":"k45",
4671 "value":"TRNS",
4672 "type":"normal",
4673 "secondary":null,
4674 "showMenu":false,
4675 "shape":"k700"
4676 },
4677 {
4678 "id":"k46",
4679 "value":"NO",
4680 "type":"nodisplay"
4681 }
4682 ],
4683 [
4684 {
4685 "id":"k44",
4686 "value":"TRNS",
4687 "type":"normal",
4688 "secondary":null,
4689 "showMenu":false,
4690 "shape":"k275"
4691 },
4692 {
4693 "id":"k45",
4694 "value":"TRNS",
4695 "type":"normal",
4696 "secondary":null,
4697 "showMenu":false,
4698 "shape":"k150"
4699 },
4700 {
4701 "id":"k46",
4702 "value":"TRNS",
4703 "type":"normal",
4704 "secondary":null,
4705 "showMenu":false,
4706 "shape":"k275"
4707 }
4708 ]
4709 ]
4710 ],
4711 "bottomRight":[
4712 [
4713 [
4714 {
4715 "id":"k48",
4716 "value":"TRNS",
4717 "type":"normal",
4718 "secondary":null,
4719 "showMenu":false,
4720 "shape":"k125"
4721 },
4722 {
4723 "id":"k49",
4724 "value":"TRNS",
4725 "type":"normal",
4726 "secondary":null,
4727 "showMenu":false,
4728 "shape":"k125"
4729 },
4730 {
4731 "id":"k4A",
4732 "value":"NO",
4733 "type":"nodisplay"
4734 },
4735 {
4736 "id":"k4B",
4737 "value":"TRNS",
4738 "type":"normal",
4739 "secondary":null,
4740 "showMenu":false,
4741 "shape":"k125"
4742 },
4743 {
4744 "id":"k4C",
4745 "value":"TRNS",
4746 "type":"normal",
4747 "secondary":null,
4748 "showMenu":false,
4749 "shape":"k125"
4750 }
4751 ],
4752 [
4753 {
4754 "id":"k48",
4755 "value":"TRNS",
4756 "type":"normal",
4757 "secondary":null,
4758 "showMenu":false,
4759 "shape":"k100"
4760 },
4761 {
4762 "id":"k49",
4763 "value":"TRNS",
4764 "type":"normal",
4765 "secondary":null,
4766 "showMenu":false,
4767 "shape":"k100"
4768 },
4769 {
4770 "id":"k4A",
4771 "value":"DEL",
4772 "type":"normal",
4773 "secondary":null,
4774 "showMenu":false,
4775 "shape":"k100"
4776 },
4777 {
4778 "id":"k4B",
4779 "value":"HOME",
4780 "type":"normal",
4781 "secondary":null,
4782 "showMenu":false,
4783 "shape":"k100"
4784 },
4785 {
4786 "id":"k4C",
4787 "value":"PGDN",
4788 "type":"normal",
4789 "secondary":null,
4790 "showMenu":false,
4791 "shape":"k100"
4792 }
4793 ]
4794 ],
4795 [
4796 [
4797 {
4798 "id":"k48",
4799 "value":"NO",
4800 "type":"nodisplay"
4801 },
4802 {
4803 "id":"k49",
4804 "value":"TRNS",
4805 "type":"normal",
4806 "secondary":null,
4807 "showMenu":false,
4808 "shape":"k150"
4809 },
4810 {
4811 "id":"k4A",
4812 "value":"NO",
4813 "type":"nodisplay"
4814 },
4815 {
4816 "id":"k4B",
4817 "value":"TRNS",
4818 "type":"normal",
4819 "secondary":null,
4820 "showMenu":false,
4821 "shape":"k100"
4822 },
4823 {
4824 "id":"k4C",
4825 "value":"TRNS",
4826 "type":"normal",
4827 "secondary":null,
4828 "showMenu":false,
4829 "shape":"k150"
4830 }
4831 ],
4832 [
4833 {
4834 "id":"k48",
4835 "value":"NO",
4836 "type":"nodisplay"
4837 },
4838 {
4839 "id":"k49",
4840 "value":"TRNS",
4841 "type":"normal",
4842 "secondary":null,
4843 "showMenu":false,
4844 "shape":"k100"
4845 },
4846 {
4847 "id":"k4A",
4848 "value":"TRNS",
4849 "type":"normal",
4850 "secondary":null,
4851 "showMenu":false,
4852 "shape":"k100"
4853 },
4854 {
4855 "id":"k4B",
4856 "value":"TRNS",
4857 "type":"normal",
4858 "secondary":null,
4859 "showMenu":false,
4860 "shape":"k100"
4861 },
4862 {
4863 "id":"k4C",
4864 "value":"TRNS",
4865 "type":"normal",
4866 "secondary":null,
4867 "showMenu":false,
4868 "shape":"k100"
4869 }
4870 ]
4871 ]
4872 ]
4873 }
4874 ],
4875 "layoutName":"twschum_DZ60_b_4_10_v1.2",
4876 "timestamp":1525116588644
4877}
diff --git a/keyboards/dz60/keymaps/twschum_b_4_10/rules.mk b/keyboards/dz60/keymaps/twschum_b_4_10/rules.mk
new file mode 100644
index 000000000..1610eace7
--- /dev/null
+++ b/keyboards/dz60/keymaps/twschum_b_4_10/rules.mk
@@ -0,0 +1,15 @@
1# Build Options
2# override the options specified in dz60/rules.mk
3BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration
4MOUSEKEY_ENABLE = yes # Mouse keys
5EXTRAKEY_ENABLE = yes # Audio control and System control
6CONSOLE_ENABLE = no # Console for debug
7COMMAND_ENABLE = no # Commands for debug and configuration
8# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
9NKRO_ENABLE = yes # USB Nkey Rollover
10BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
11RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
12KEY_LOCK_ENABLE = yes # Enables use of KC_LOCK
13
14# Enables including users/twschum/twschum.h
15USER_NAME := twschum
diff --git a/keyboards/dz60/rules.mk b/keyboards/dz60/rules.mk
index 556d9e55c..7ed2571da 100644
--- a/keyboards/dz60/rules.mk
+++ b/keyboards/dz60/rules.mk
@@ -21,8 +21,8 @@ CONSOLE_ENABLE = no # Console for debug(+400)
21COMMAND_ENABLE = no # Commands for debug and configuration 21COMMAND_ENABLE = no # Commands for debug and configuration
22SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend 22SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
23NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work 23NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
24BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality 24BACKLIGHT_ENABLE = yes # Enable per-key backlight LEDs
25AUDIO_ENABLE = no 25AUDIO_ENABLE = no # There is no speaker on this PCB
26RGBLIGHT_ENABLE = yes 26RGBLIGHT_ENABLE = yes # Enable the RGB underglow LEDs
27 27
28LAYOUTS = 60_ansi 60_ansi_split_bs_rshift 60_hhkb 60_iso 60_abnt2 28LAYOUTS = 60_ansi 60_ansi_split_bs_rshift 60_hhkb 60_iso 60_abnt2
diff --git a/keyboards/keebio/levinson/keymaps/numpad/config.h b/keyboards/keebio/levinson/keymaps/numpad/config.h
new file mode 100644
index 000000000..7e10bc445
--- /dev/null
+++ b/keyboards/keebio/levinson/keymaps/numpad/config.h
@@ -0,0 +1,34 @@
1/*
2This is the c configuration file for the keymap
3
4Copyright 2012 Jun Wako <wakojun@gmail.com>
5Copyright 2015 Jack Humbert
6Copyright 2018 Danny Nguyen <danny@keeb.io>
7
8This program is free software: you can redistribute it and/or modify
9it under the terms of the GNU General Public License as published by
10the Free Software Foundation, either version 2 of the License, or
11(at your option) any later version.
12
13This program is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16GNU General Public License for more details.
17
18You should have received a copy of the GNU General Public License
19along with this program. If not, see <http://www.gnu.org/licenses/>.
20*/
21
22#pragma once
23
24// #define USE_I2C
25// Need to flip the rows
26#undef MATRIX_COL_PINS
27#define MATRIX_COL_PINS { B6, B2, B3, B1, F7, F6 }
28
29/* Select hand configuration */
30// #define MASTER_RIGHT
31// #define EE_HANDS
32
33/* Time in ms until oneshot layer times out */
34#define ONESHOT_TIMEOUT 3000
diff --git a/keyboards/keebio/levinson/keymaps/numpad/keymap.c b/keyboards/keebio/levinson/keymaps/numpad/keymap.c
new file mode 100644
index 000000000..32a1113c5
--- /dev/null
+++ b/keyboards/keebio/levinson/keymaps/numpad/keymap.c
@@ -0,0 +1,123 @@
1#include QMK_KEYBOARD_H
2
3/* Add the stings you want to send as macros, see
4 * https://docs.qmk.fm/#/feature_macros for what all can be used
5 */
6#define MACRO_0 "zero"
7#define MACRO_1 "one"
8#define MACRO_2 "two"
9#define MACRO_3 "three"
10#define MACRO_4 "four"
11#define MACRO_5 "five"
12#define MACRO_6 "six"
13#define MACRO_7 "seven"
14#define MACRO_8 "eight"
15#define MACRO_9 "nine"
16
17enum macro_keycodes {
18 M0 = SAFE_RANGE,
19 M1,
20 M2,
21 M3,
22 M4,
23 M5,
24 M6,
25 M7,
26 M8,
27 M9
28};
29
30const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
31
32/* Numpad
33 * ,-----------------------------------------------------------------------------------.
34 * | 0 | 1 | 4 | 7 | BkSp |OSL(1)| | | | | | |
35 * |------+------+------+------+------+------+------+------+------+------+------+------|
36 * | , | 2 | 5 | 8 | / | Down | | | | | | |
37 * |------+------+------+------+------+------+------+------+------+------+------+------|
38 * | . | 3 | 6 | 9 | * | Up | | | | | | |
39 * |------+------+------+------+------+------+------+------+------+------+------+------|
40 * | Enter | + | - | = | MO(1)| | | | | | |
41 * `-----------------------------------------------------------------------------------'
42 */
43[0] = LAYOUT_ortho_4x12( \
44 KC_KP_0, KC_KP_1, KC_KP_4, KC_KP_7, KC_BSPACE, OSL(1), KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \
45 KC_COMMA, KC_KP_2, KC_KP_5, KC_KP_8, KC_KP_SLASH, KC_DOWN, KC_NO, KC_A, KC_B, KC_C, KC_D, KC_NO, \
46 KC_KP_DOT, KC_KP_3, KC_KP_6, KC_KP_9, KC_KP_ASTERISK, KC_UP, KC_NO, KC_E, KC_F, KC_G, KC_H, KC_NO, \
47 KC_KP_ENTER, KC_NO, KC_KP_PLUS, KC_KP_MINUS, KC_KP_EQUAL, MO(1), KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO \
48),
49/* Macro layer - the number keys are macros,
50 * other functions on remaining keys
51 * ,-----------------------------------------.
52 * | M(0) | M(1) | M(4) | M(7) | | Esc |
53 * |------+------+------+------+------+------|
54 * | Left | M(2) | M(5) | M(8) | | |
55 * |------+------+------+------+------+------|
56 * | Right| M(3) | M(6) | M(9) | | |
57 * |------+------+------+------+------+------|
58 * | NumLock | RESET| | | Calc |
59 * `-----------------------------------------'
60 */
61[1] = LAYOUT_ortho_4x12( \
62 M0, M1, M4, M7, KC_NO, KC_ESC, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \
63 KC_LEFT, M2, M5, M8, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \
64 KC_RIGHT, M3, M6, M8, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \
65 KC_NUMLOCK, RESET, KC_NO, KC_NO, KC_CALC, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO \
66)
67};
68
69bool process_record_user(uint16_t keycode, keyrecord_t *record) {
70 switch (keycode) {
71 case M0:
72 if (record->event.pressed) {
73 SEND_STRING(MACRO_0);
74 }
75 break;
76 case M1:
77 if (record->event.pressed) {
78 SEND_STRING(MACRO_1);
79 }
80 break;
81 case M2:
82 if (record->event.pressed) {
83 SEND_STRING(MACRO_2);
84 }
85 break;
86 case M3:
87 if (record->event.pressed) {
88 SEND_STRING(MACRO_3);
89 }
90 break;
91 case M4:
92 if (record->event.pressed) {
93 SEND_STRING(MACRO_4);
94 }
95 break;
96 case M5:
97 if (record->event.pressed) {
98 SEND_STRING(MACRO_5);
99 }
100 break;
101 case M6:
102 if (record->event.pressed) {
103 SEND_STRING(MACRO_6);
104 }
105 break;
106 case M7:
107 if (record->event.pressed) {
108 SEND_STRING(MACRO_7);
109 }
110 break;
111 case M8:
112 if (record->event.pressed) {
113 SEND_STRING(MACRO_8);
114 }
115 break;
116 case M9:
117 if (record->event.pressed) {
118 SEND_STRING(MACRO_9);
119 }
120 break;
121 }
122 return true;
123};
diff --git a/keyboards/keebio/levinson/keymaps/numpad/readme.md b/keyboards/keebio/levinson/keymaps/numpad/readme.md
new file mode 100644
index 000000000..0c15ac54d
--- /dev/null
+++ b/keyboards/keebio/levinson/keymaps/numpad/readme.md
@@ -0,0 +1,4 @@
1# Numpad Layout
2[Layout Example](http://www.keyboard-layout-editor.com/##@@_c=%23ffd100&a:7%3B&=&_c=%23909596&f:5%3B&=&=&=%3B&@_c=%23c4c8c5&st=MX1A-L1xx&f:6%3B&=Esc&=%2F%2F&=*&=%3F%3B&@=7&=8&=9&=%E2%80%93%3B&@=4&_n:true%3B&=5&=6&=+%3B&@=1&=2&=3&_c=%23ffd100&h:2%3B&=%3B&@_c=%23c4c8c5%3B&=0&_a:5%3B&=%3C%0A,&=%3E%0A.)
3
4Uses a single half of the Levinson a vertical 4x6 numpad/macropad.
diff --git a/keyboards/keebio/levinson/keymaps/numpad/rules.mk b/keyboards/keebio/levinson/keymaps/numpad/rules.mk
new file mode 100644
index 000000000..639c76834
--- /dev/null
+++ b/keyboards/keebio/levinson/keymaps/numpad/rules.mk
@@ -0,0 +1,3 @@
1# Build Options
2BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
3RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
diff --git a/users/twschum/config.h b/users/twschum/config.h
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/users/twschum/config.h
diff --git a/users/twschum/readme.md b/users/twschum/readme.md
new file mode 100644
index 000000000..b354e4b79
--- /dev/null
+++ b/users/twschum/readme.md
@@ -0,0 +1,14 @@
1Copyright 2019 Tim Schumacher <twschum@gmail.com> @twschum
2
3This program is free software: you can redistribute it and/or modify
4it under the terms of the GNU General Public License as published by
5the Free Software Foundation, either version 2 of the License, or
6(at your option) any later version.
7
8This program is distributed in the hope that it will be useful,
9but WITHOUT ANY WARRANTY; without even the implied warranty of
10MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11GNU General Public License for more details.
12
13You should have received a copy of the GNU General Public License
14along with this program. If not, see <http://www.gnu.org/licenses/>.
diff --git a/users/twschum/rules.mk b/users/twschum/rules.mk
new file mode 100644
index 000000000..9878e6f69
--- /dev/null
+++ b/users/twschum/rules.mk
@@ -0,0 +1,5 @@
1SRC += twschum.c
2SRC += xtonhasvim.c
3ifeq ($(strip $(FLASH_BOOTLOADER)), yes)
4 OPT_DEFS += -DFLASH_BOOTLOADER
5endif
diff --git a/users/twschum/twschum.c b/users/twschum/twschum.c
new file mode 100644
index 000000000..2d34f9571
--- /dev/null
+++ b/users/twschum/twschum.c
@@ -0,0 +1,257 @@
1#include "twschum.h"
2
3#ifdef TWSCHUM_TAPPING_CTRL_PREFIX
4// state for the great state machine of custom actions!
5#define TIMEOUT_DELAY 200 // ms
6static uint16_t idle_timer;
7static bool timeout_is_active = false;
8
9static bool ctrl_shortcuts_enabled_g = false;
10//static bool B_down = 0; // TODO just use top bit from count
11//static int8_t B_count = 0;
12
13#define N_TAPPING_CTRL_KEYS 2
14static struct Tapping_ctrl_key_t special_keys_g[N_TAPPING_CTRL_KEYS] = {
15 {false, 0, KC_B}, {false, 0, KC_A}
16};
17
18static inline void start_idle_timer(void) {
19 idle_timer = timer_read();
20 timeout_is_active = true;
21}
22static inline void clear_state_after_idle_timeout(void) {
23 idle_timer = 0;
24 timeout_is_active = false;
25
26 // send timed out plain keys from tapping ctrl mod
27 for (int i = 0; i < N_TAPPING_CTRL_KEYS; ++i) {
28 struct Tapping_ctrl_key_t* key = special_keys_g + i;
29 repeat_send_keys(key->count, key->keycode);
30 key->count = 0;
31 }
32}
33
34inline void matrix_scan_user(void) {
35 if (timeout_is_active && timer_elapsed(idle_timer) > TIMEOUT_DELAY) {
36 clear_state_after_idle_timeout();
37 }
38}
39
40static inline bool tap_ctrl_event(struct Tapping_ctrl_key_t* key, keyrecord_t* record) {
41 if (!ctrl_shortcuts_enabled_g) {
42 // normal operation, just send the plain keycode
43 if (record->event.pressed) {
44 register_code(key->keycode);
45 }
46 else {
47 unregister_code(key->keycode);
48 }
49 return false;
50 }
51 key->down = record->event.pressed;
52 // increment count and reset timer when key pressed
53 // start the timeout when released
54 if (key->down) {
55 ++(key->count);
56 timeout_is_active = false;
57 idle_timer = 0;
58 }
59 else {
60 if (key->count) {
61 start_idle_timer();
62 }
63 }
64 return false;
65}
66
67static inline bool tap_ctrl_other_pressed(void) {
68 for (int i = 0; i < N_TAPPING_CTRL_KEYS; ++i) {
69 struct Tapping_ctrl_key_t* key = special_keys_g + i;
70 if (key->count) {
71 if (key->down) {
72 // another key has been pressed while the leader key is down,
73 // so send number of ctrl-KEY combos before the other key
74 repeat_send_keys(key->count, KC_LCTL, key->keycode);
75 key->count = 0;
76 }
77 else {
78 // another key pressed after leader key released,
79 // need to send the plain keycode plus potential mods
80 if (get_mods() & MOD_MASK_CTRL) {
81 // make sure to send a shift if prssed
82 repeat_send_keys(key->count, KC_RSHIFT, key->keycode);
83 }
84 else {
85 repeat_send_keys(key->count, key->keycode);
86 }
87 key->count = 0;
88 }
89 return true; // will send the other keycode
90 }
91 }
92 return true; // safe default
93}
94#endif /* TWSCHUM_TAPPING_CTRL_PREFIX */
95
96
97/* Use RGB underglow to indicate layer
98 * https://docs.qmk.fm/reference/customizing-functionality
99 */
100// add to quantum/rgblight_list.h
101#ifdef RGBLIGHT_ENABLE
102static bool rgb_layers_enabled = true;
103static bool rgb_L0_enabled = false;
104
105layer_state_t layer_state_set_user(layer_state_t state) {
106 if (!rgb_layers_enabled) {
107 return state;
108 }
109 switch (get_highest_layer(state)) {
110 case _Base:
111 if (rgb_L0_enabled) {
112 rgblight_sethsv_noeeprom(_Base_HSV_ON);
113 }
114 else {
115 rgblight_sethsv_noeeprom(_Base_HSV_OFF);
116 }
117 break;
118 case _Vim:
119 rgblight_sethsv_noeeprom(_Vim_HSV);
120 break;
121 case _Fn:
122 rgblight_sethsv_noeeprom(_Fn_HSV);
123 break;
124 case _Nav:
125 rgblight_sethsv_noeeprom(_Nav_HSV);
126 break;
127 case _Num:
128 rgblight_sethsv_noeeprom(_Num_HSV);
129 break;
130 case _Cfg:
131 rgblight_sethsv_noeeprom(_Cfg_HSV);
132 break;
133 case _None:
134 rgblight_sethsv_noeeprom(_None_HSV);
135 break;
136 }
137 return state;
138}
139#endif /* RGBLIGHT_ENABLE */
140
141/* process_record_vimlayer: handles the VIM_ keycodes from xtonhasvim's vim
142 * emulation layer
143 * add process_record_keymap to allow specific keymap to still add keys
144 * Makes the callstack look like:
145 * process_record_
146 * _quantum
147 * _kb
148 * _user
149 * _keymap
150 * _vimlayer
151 */
152__attribute__ ((weak))
153bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
154 return true;
155}
156
157/* Return True to continue processing keycode, false to stop further processing
158 * process_record_keymap to be call by process_record_user in the vim addon */
159bool process_record_user(uint16_t keycode, keyrecord_t *record) {
160
161 /* keymap gets first whack, then vimlayer */
162 if(!process_record_keymap(keycode, record)) return false;
163 if(!process_record_vimlayer(keycode, record)) return false;
164
165 switch (keycode) {
166 /* KC_MAKE is a keycode to be used with any keymap
167 * Outputs `make <keyboard>:<keymap>`
168 * Holding shift will add the appropriate flashing command (:dfu,
169 * :teensy, :avrdude, :dfu-util) for a majority of keyboards.
170 * Holding control will add some commands that will speed up compiling
171 * time by processing multiple files at once
172 * For the boards that lack a shift key, or that you want to always
173 * attempt the flashing part, you can add FLASH_BOOTLOADER = yes to the
174 * rules.mk of that keymap.
175 */
176 case KC_MAKE: // Compiles the firmware, and adds the flash command based on keyboard bootloader
177 if (!record->event.pressed) {
178 uint8_t temp_mod = get_mods();
179 uint8_t temp_osm = get_oneshot_mods();
180 clear_mods(); clear_oneshot_mods();
181 SEND_STRING("make " QMK_KEYBOARD ":" QMK_KEYMAP);
182 #ifndef FLASH_BOOTLOADER
183 if ( (temp_mod | temp_osm) & MOD_MASK_SHIFT ) {
184 SEND_STRING(":flash");
185 }
186 #endif
187 if ( (temp_mod | temp_osm) & MOD_MASK_CTRL) {
188 SEND_STRING(" -j8 --output-sync");
189 }
190 SEND_STRING(SS_TAP(X_ENTER));
191 set_mods(temp_mod);
192 }
193 break;
194
195 #ifdef RGBLIGHT_ENABLE
196 case TG_LAYER_RGB:
197 if (record->event.pressed) {
198 rgb_layers_enabled = !rgb_layers_enabled;
199 }
200 return false;
201 case TG_L0_RGB:
202 if (record->event.pressed) {
203 rgb_L0_enabled = !rgb_L0_enabled;
204 }
205 return false;
206 #endif
207
208 case SALT_CMD:
209 if (!record->event.pressed) {
210 SEND_STRING(SALT_CMD_MACRO);
211 }
212 return false;
213 case LESS_PD:
214 if (!record->event.pressed) {
215 SEND_STRING(LESS_PD_MACRO);
216 }
217 return false;
218 case CODE_PASTE:
219 if (!record->event.pressed) {
220 SEND_STRING(CODE_PASTE_MACRO);
221 }
222 return false;
223
224 #ifdef TWSCHUM_TAPPING_CTRL_PREFIX
225 case EN_CTRL_SHORTCUTS:
226 if (record->event.pressed) {
227 ctrl_shortcuts_enabled_g = !ctrl_shortcuts_enabled_g;
228 start_idle_timer(); // need to clear out state in some cases
229 }
230 return false;
231 case CTRL_A:
232 return tap_ctrl_event(&special_keys_g[1], record);
233 case CTRL_B:
234 return tap_ctrl_event(&special_keys_g[0], record);
235 default:
236 if (record->event.pressed) {
237 return tap_ctrl_other_pressed();
238 }
239 #endif
240 }
241 return true;
242}
243
244#ifdef RGBLIGHT_ENABLE
245void matrix_init_user(void) {
246 // called once on board init
247 rgblight_enable();
248}
249#endif
250
251void suspend_power_down_user(void) {
252 // TODO shut off backlighting
253}
254
255void suspend_wakeup_init_user(void) {
256 // TODO turn on backlighting
257}
diff --git a/users/twschum/twschum.h b/users/twschum/twschum.h
new file mode 100644
index 000000000..e8c9aeffc
--- /dev/null
+++ b/users/twschum/twschum.h
@@ -0,0 +1,131 @@
1#pragma once
2#include <stdarg.h>
3#include "quantum.h"
4#include "xtonhasvim.h"
5
6/**************************
7 * QMK Features Used
8 **************************
9 * RGBLIGHT_ENABLE
10 * - Adds layer indication via RGB underglow
11 * - see the `layer_definitions` enum and following _*_HSV #defines
12 *
13 *
14 *
15 **************************
16 * Custom Feature Flags
17 **************************
18 *
19 * TWSCHUM_TAPPING_CTRL_PREFIX
20 * - Adds feature that makes sending nested sequences of C-a, C-b[, C-b, ...]
21 * as simple as C-a b [b ...]
22 * - Not necessarily super useful outside specialized nested tmux sessions,
23 * but it was a fun state-machine to build
24 *
25 * TWSCHUM_VIM_LAYER
26 * - Fork of xtonhasvim, adding vim-emulation
27 *
28 * TWSCHUM_IS_MAC
29 * - Flag for handling media keys and other settings between OSX and Win/Unix
30 * without having to include bootmagic
31 *
32 **************************
33 * Features Wishlist
34 **************************
35 * use VIM_Q as macro recorder!
36 * Dynamic macros
37 * Leader functions
38 * Uniicode leader commands??? (symbolic unicode)
39 * Mac mode vs not: -probably bootmagic or use default with dynamic swap out here
40 * KC_MFFD(KC_MEDIA_FAST_FORWARD) and KC_MRWD(KC_MEDIA_REWIND) instead of KC_MNXT and KC_MPRV
41 */
42
43/* Each layer gets a color, overwritable per keyboard */
44enum layers_definitions {
45 _Base,
46 _Vim,
47 _Fn,
48 _Nav,
49 _Num,
50 _Cfg,
51 _None,
52};
53#ifdef RGBLIGHT_ENABLE
54#define _Base_HSV_ON HSV_WHITE
55#define _Base_HSV_OFF 0, 0, 0
56#define _Vim_HSV HSV_ORANGE
57#define _Fn_HSV HSV_GREEN
58#define _Nav_HSV HSV_AZURE
59#define _Num_HSV HSV_GOLD
60#define _Cfg_HSV HSV_RED
61#define _None_HSV HSV_WHITE
62#endif
63
64enum extra_keycodes {
65 TWSCHUM_START = VIM_SAFE_RANGE,
66 KC_MAKE, // types the make command for this keyboard
67#ifdef TWSCHUM_TAPPING_CTRL_PREFIX
68 CTRL_A,
69 CTRL_B,
70 EN_CTRL_SHORTCUTS,
71#endif
72#ifdef RGBLIGHT_ENABLE
73 TG_LAYER_RGB, // Toggle between standard RGB underglow, and RGB underglow to do layer indication
74 TG_L0_RGB, // Toggle color on or off of layer0
75#endif
76 SALT_CMD, // macro
77 LESS_PD, // macro
78 CODE_PASTE, // macro
79 KEYMAP_SAFE_RANGE, // range to start for the keymap
80};
81#define SALT_CMD_MACRO "sudo salt \\* cmd.run ''"SS_TAP(X_LEFT)
82#define LESS_PD_MACRO "sudo less /pipedream/cache/"
83// TODO mac vs linux
84#define CODE_PASTE_MACRO SS_LSFT("\n")"```"SS_LSFT("\n")SS_LALT("v")SS_LSFT("\n")"```"
85
86
87/* PP_NARG macro returns the number of arguments passed to it.
88 * https://groups.google.com/forum/#!topic/comp.std.c/d-6Mj5Lko_s
89 */
90#define PP_NARG(...) PP_NARG_(__VA_ARGS__,PP_RSEQ_N())
91#define PP_NARG_(...) PP_ARG_N(__VA_ARGS__)
92#define PP_MAX_ARGS 64
93#define PP_ARG_N( \
94 _1, _2, _3, _4, _5, _6, _7, _8, _9,_10, \
95 _11,_12,_13,_14,_15,_16,_17,_18,_19,_20, \
96 _21,_22,_23,_24,_25,_26,_27,_28,_29,_30, \
97 _31,_32,_33,_34,_35,_36,_37,_38,_39,_40, \
98 _41,_42,_43,_44,_45,_46,_47,_48,_49,_50, \
99 _51,_52,_53,_54,_55,_56,_57,_58,_59,_60, \
100 _61,_62,_63,N,...) N
101#define PP_RSEQ_N() 63,62,61,60, \
102 59,58,57,56,55,54,53,52,51,50, \
103 49,48,47,46,45,44,43,42,41,40, \
104 39,38,37,36,35,34,33,32,31,30, \
105 29,28,27,26,25,24,23,22,21,20, \
106 19,18,17,16,15,14,13,12,11,10, \
107 9,8,7,6,5,4,3,2,1,0
108
109#define send_keys(...) send_n_keys(PP_NARG(__VA_ARGS__), __VA_ARGS__)
110static inline void send_n_keys(int n, ...) {
111 uint8_t i = 0;
112 uint16_t keycodes[PP_MAX_ARGS];
113 va_list keys;
114 va_start(keys, n);
115 for (; i < n; ++i) {
116 keycodes[i] = (uint16_t)va_arg(keys, int); // cast suppresses warning
117 register_code(keycodes[i]);
118 }
119 for (; n > 0; --n) {
120 unregister_code(keycodes[n-1]);
121 }
122 va_end(keys);
123}
124#define repeat_send_keys(n, ...) {for (int i=0; i < n; ++i) {send_keys(__VA_ARGS__);}}
125
126/* State functions for nested c-a & c-b leader keystrokes */
127struct Tapping_ctrl_key_t {
128 bool down;
129 int8_t count;
130 const uint16_t keycode;
131};
diff --git a/users/twschum/xtonhasvim.c b/users/twschum/xtonhasvim.c
new file mode 100644
index 000000000..a1adf39f0
--- /dev/null
+++ b/users/twschum/xtonhasvim.c
@@ -0,0 +1,593 @@
1 /* Copyright 2015-2017 Christon DeWan *
2 * This program is free software: you can redistribute it and/or modify
3 * it under the terms of the GNU General Public License as published by
4 * the Free Software Foundation, either version 2 of the License, or
5 * (at your option) any later version.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 *
12 * You should have received a copy of the GNU General Public License
13 * along with this program. If not, see <http://www.gnu.org/licenses/>.
14 */
15
16#include "xtonhasvim.h"
17
18
19uint16_t vstate = VIM_START;
20static bool yank_was_lines = false;
21static bool SHIFTED = false;
22static uint32_t mod_override_layer_state = 0;
23static uint16_t mod_override_triggering_key = 0;
24
25static void edit(void) { vstate = VIM_START; layer_clear(); }
26#define EDIT edit()
27
28
29static void simple_movement(uint16_t keycode) {
30 switch(keycode) {
31 case VIM_B:
32 register_code(KC_LALT);
33 tap_code16(LSFT(KC_LEFT)); // select to start of this word
34 unregister_code(KC_LALT);
35 break;
36 case VIM_E:
37 register_code(KC_LALT);
38 tap_code16(LSFT(KC_RIGHT)); // select to end of this word
39 unregister_code(KC_LALT);
40 break;
41 case VIM_H:
42 tap_code16(LSFT(KC_LEFT));
43 break;
44 case VIM_J:
45 tap_code16(LGUI(KC_LEFT));
46 tap_code16(LSFT(KC_DOWN));
47 tap_code16(LSFT(KC_DOWN));
48 break;
49 case VIM_K:
50 tap_code16(LGUI(KC_LEFT));
51 tap_code(KC_DOWN);
52 tap_code16(LSFT(KC_UP));
53 tap_code16(LSFT(KC_UP));
54 break;
55 case VIM_L:
56 tap_code16(LSFT(KC_RIGHT));
57 break;
58 case VIM_W:
59 register_code(KC_LALT);
60 tap_code16(LSFT(KC_RIGHT)); // select to end of this word
61 tap_code16(LSFT(KC_RIGHT)); // select to end of next word
62 tap_code16(LSFT(KC_LEFT)); // select to start of next word
63 unregister_code(KC_LALT);
64 break;
65 }
66}
67
68static void comma_period(uint16_t keycode) {
69 switch (keycode) {
70 case VIM_COMMA:
71 if (SHIFTED) {
72 // indent
73 tap_code16(LGUI(KC_LBRACKET));
74 } else {
75 // toggle comment
76 tap_code16(LGUI(KC_SLASH));
77 }
78 break;
79 case VIM_PERIOD:
80 if (SHIFTED) {
81 // outdent
82 tap_code16(LGUI(KC_RBRACKET));
83 }
84 break;
85 }
86}
87
88
89bool process_record_vimlayer(uint16_t keycode, keyrecord_t *record) {
90
91 /****** mod passthru *****/
92 if(record->event.pressed && layer_state_is(vim_cmd_layer()) && (IS_MOD(keycode) || keycode == LSFT(KC_LALT))) {
93 mod_override_layer_state = layer_state;
94 mod_override_triggering_key = keycode;
95 // TODO: change this to track key location instead
96 layer_clear();
97 return true; // let the event fall through...
98 }
99 if(mod_override_layer_state && !record->event.pressed && keycode == mod_override_triggering_key) {
100 layer_state_set(mod_override_layer_state);
101 mod_override_layer_state = 0;
102 mod_override_triggering_key = 0;
103 return true;
104 }
105
106 if (VIM_START <= keycode && keycode <= VIM_ESC) {
107 if(keycode == VIM_SHIFT) {
108 SHIFTED = record->event.pressed;
109 return false;
110 }
111
112 if (record->event.pressed) {
113 if(keycode == VIM_START) {
114 // entry from anywhere
115 layer_on(vim_cmd_layer());
116 vstate = VIM_START;
117
118 // reset state
119 yank_was_lines = false;
120 SHIFTED = false;
121 mod_override_layer_state = 0;
122 mod_override_triggering_key = 0;
123
124 return false;
125 }
126 switch(vstate) {
127 case VIM_START:
128 switch(keycode){
129 /*****************************
130 * ground state
131 *****************************/
132 case VIM_A:
133 if(SHIFTED) {
134 // tap_code16(LGUI(KC_RIGHT));
135 tap_code16(LCTL(KC_E));
136 } else {
137 tap_code(KC_RIGHT);
138 }
139 EDIT;
140 break;
141 case VIM_B:
142 register_code(KC_LALT);
143 register_code(KC_LEFT);
144 break;
145 case VIM_C:
146 if(SHIFTED) {
147 register_code(KC_LSHIFT);
148 tap_code16(LGUI(KC_RIGHT));
149 unregister_code(KC_LSHIFT);
150 tap_code16(LGUI(KC_X));
151 yank_was_lines = false;
152 EDIT;
153 } else {
154 vstate = VIM_C;
155 }
156 break;
157 case VIM_D:
158 if(SHIFTED) {
159 tap_code16(LCTL(KC_K));
160 } else {
161 vstate = VIM_D;
162 }
163 break;
164 case VIM_E:
165 register_code(KC_LALT);
166 register_code(KC_RIGHT);
167 break;
168 case VIM_G:
169 if(SHIFTED) {
170 tap_code(KC_END);
171 } else {
172 vstate = VIM_G;
173 }
174 break;
175 case VIM_H:
176 register_code(KC_LEFT);
177 break;
178 case VIM_I:
179 if(SHIFTED){
180 tap_code16(LCTL(KC_A));
181 }
182 EDIT;
183 break;
184 case VIM_J:
185 if(SHIFTED) {
186 tap_code16(LGUI(KC_RIGHT));
187 tap_code(KC_DEL);
188 } else {
189 register_code(KC_DOWN);
190 }
191 break;
192 case VIM_K:
193 register_code(KC_UP);
194 break;
195 case VIM_L:
196 register_code(KC_RIGHT);
197 break;
198 case VIM_O:
199 if(SHIFTED) {
200 tap_code16(LGUI(KC_LEFT));
201 tap_code(KC_ENTER);
202 tap_code(KC_UP);
203 EDIT;
204 } else {
205 tap_code16(LGUI(KC_RIGHT));
206 tap_code(KC_ENTER);
207 EDIT;
208 }
209 break;
210 case VIM_P:
211 if(SHIFTED) {
212 tap_code16(LGUI(KC_LEFT));
213 tap_code16(LGUI(KC_V));
214 } else {
215 if(yank_was_lines) {
216 tap_code16(LGUI(KC_RIGHT));
217 tap_code(KC_RIGHT);
218 tap_code16(LGUI(KC_V));
219 } else {
220 tap_code16(LGUI(KC_V));
221 }
222 }
223 break;
224 case VIM_S:
225 // s for substitute?
226 if(SHIFTED) {
227 tap_code16(LGUI(KC_LEFT));
228 register_code(KC_LSHIFT);
229 tap_code16(LGUI(KC_RIGHT));
230 unregister_code(KC_LSHIFT);
231 tap_code16(LGUI(KC_X));
232 yank_was_lines = false;
233 EDIT;
234 } else {
235 tap_code16(LSFT(KC_RIGHT));
236 tap_code16(LGUI(KC_X));
237 yank_was_lines = false;
238 EDIT;
239 }
240 break;
241 case VIM_U:
242 if(SHIFTED) {
243 register_code(KC_LSFT);
244 tap_code16(LGUI(KC_Z));
245 unregister_code(KC_LSHIFT);
246 } else {
247 tap_code16(LGUI(KC_Z));
248 }
249 break;
250 case VIM_V:
251 if(SHIFTED) {
252 tap_code16(LGUI(KC_LEFT));
253 tap_code16(LSFT(KC_DOWN));
254 vstate = VIM_VS;
255 } else {
256 vstate = VIM_V;
257 }
258 break;
259 case VIM_W:
260 register_code(KC_LALT);
261 tap_code(KC_RIGHT);
262 tap_code(KC_RIGHT);
263 tap_code(KC_LEFT);
264 unregister_code(KC_LALT);
265 break;
266 case VIM_X:
267 // tap_code16(LSFT(KC_RIGHT));
268 // tap_code16(LGUI(KC_X));
269 register_code(KC_DEL);
270 break;
271 case VIM_Y:
272 if(SHIFTED) {
273 tap_code16(LGUI(KC_LEFT));
274 tap_code16(LSFT(KC_DOWN));
275 tap_code16(LGUI(KC_C));
276 tap_code(KC_RIGHT);
277 yank_was_lines = true;
278 } else {
279 vstate = VIM_Y;
280 }
281 break;
282 case VIM_COMMA:
283 case VIM_PERIOD:
284 comma_period(keycode);
285 break;
286 }
287 break;
288 case VIM_C:
289 /*****************************
290 * c- ...for change. I never use this...
291 *****************************/
292 switch(keycode) {
293 case VIM_B:
294 case VIM_E:
295 case VIM_H:
296 case VIM_J:
297 case VIM_K:
298 case VIM_L:
299 case VIM_W:
300 simple_movement(keycode);
301 tap_code16(LGUI(KC_X));
302 yank_was_lines = false;
303 EDIT;
304 break;
305
306 case VIM_C:
307 tap_code16(LGUI(KC_LEFT));
308 register_code(KC_LSHIFT);
309 tap_code16(LGUI(KC_RIGHT));
310 unregister_code(KC_LSHIFT);
311 tap_code16(LGUI(KC_X));
312 yank_was_lines = false;
313 EDIT;
314 break;
315 case VIM_I:
316 vstate = VIM_CI;
317 break;
318 default:
319 vstate = VIM_START;
320 break;
321 }
322 break;
323 case VIM_CI:
324 /*****************************
325 * ci- ...change inner word
326 *****************************/
327 switch(keycode) {
328 case VIM_W:
329 tap_code16(LALT(KC_LEFT));
330 register_code(KC_LSHIFT);
331 tap_code16(LALT(KC_RIGHT));
332 unregister_code(KC_LSHIFT);
333 tap_code16(LGUI(KC_X));
334 yank_was_lines = false;
335 EDIT;
336 default:
337 vstate = VIM_START;
338 break;
339 }
340 break;
341 case VIM_D:
342 /*****************************
343 * d- ...delete stuff
344 *****************************/
345 switch(keycode) {
346 case VIM_B:
347 case VIM_E:
348 case VIM_H:
349 case VIM_J:
350 case VIM_K:
351 case VIM_L:
352 case VIM_W:
353 simple_movement(keycode);
354 tap_code16(LGUI(KC_X));
355 yank_was_lines = false;
356 vstate = VIM_START;
357 break;
358 case VIM_D:
359 tap_code16(LGUI(KC_LEFT));
360 tap_code16(LSFT(KC_DOWN));
361 tap_code16(LGUI(KC_X));
362 yank_was_lines = true;
363 vstate = VIM_START;
364 break;
365 case VIM_I:
366 vstate = VIM_DI;
367 break;
368 default:
369 vstate = VIM_START;
370 break;
371 }
372 break;
373 case VIM_DI:
374 /*****************************
375 * ci- ...delete a word... FROM THE INSIDE!
376 *****************************/
377 switch(keycode) {
378 case VIM_W:
379 tap_code16(LALT(KC_LEFT));
380 register_code(KC_LSHIFT);
381 tap_code16(LALT(KC_RIGHT));
382 unregister_code(KC_LSHIFT);
383 tap_code16(LGUI(KC_X));
384 yank_was_lines = false;
385 vstate = VIM_START;
386 default:
387 vstate = VIM_START;
388 break;
389 }
390 break;
391 case VIM_V:
392 /*****************************
393 * visual!
394 *****************************/
395 switch(keycode) {
396 case VIM_D:
397 case VIM_X:
398 tap_code16(LGUI(KC_X));
399 yank_was_lines = false;
400 vstate = VIM_START;
401 break;
402 case VIM_B:
403 register_code(KC_LALT);
404 register_code(KC_LSHIFT);
405 register_code(KC_LEFT);
406 // leave open for key repeat
407 break;
408 case VIM_E:
409 register_code(KC_LALT);
410 register_code(KC_LSHIFT);
411 register_code(KC_RIGHT);
412 // leave open for key repeat
413 break;
414 case VIM_H:
415 register_code(KC_LSHIFT);
416 register_code(KC_LEFT);
417 break;
418 case VIM_I:
419 vstate = VIM_VI;
420 break;
421 case VIM_J:
422 register_code(KC_LSHIFT);
423 register_code(KC_DOWN);
424 break;
425 case VIM_K:
426 register_code(KC_LSHIFT);
427 register_code(KC_UP);
428 break;
429 case VIM_L:
430 register_code(KC_LSHIFT);
431 register_code(KC_RIGHT);
432 break;
433 case VIM_W:
434 register_code(KC_LALT);
435 tap_code16(LSFT(KC_RIGHT)); // select to end of this word
436 tap_code16(LSFT(KC_RIGHT)); // select to end of next word
437 tap_code16(LSFT(KC_LEFT)); // select to start of next word
438 unregister_code(KC_LALT);
439 break;
440 case VIM_P:
441 tap_code16(LGUI(KC_V));
442 vstate = VIM_START;
443 break;
444 case VIM_Y:
445 tap_code16(LGUI(KC_C));
446 tap_code(KC_RIGHT);
447 yank_was_lines = false;
448 vstate = VIM_START;
449 break;
450 case VIM_V:
451 case VIM_ESC:
452 tap_code(KC_RIGHT);
453 vstate = VIM_START;
454 break;
455 case VIM_COMMA:
456 case VIM_PERIOD:
457 comma_period(keycode);
458 break;
459 default:
460 // do nothing
461 break;
462 }
463 break;
464 case VIM_VI:
465 /*****************************
466 * vi- ...select a word... FROM THE INSIDE!
467 *****************************/
468 switch(keycode) {
469 case VIM_W:
470 tap_code16(LALT(KC_LEFT));
471 register_code(KC_LSHIFT);
472 tap_code16(LALT(KC_RIGHT));
473 unregister_code(KC_LSHIFT);
474 vstate = VIM_V;
475 default:
476 // ignore
477 vstate = VIM_V;
478 break;
479 }
480 break;
481 case VIM_VS:
482 /*****************************
483 * visual line
484 *****************************/
485 switch(keycode) {
486 case VIM_D:
487 case VIM_X:
488 tap_code16(LGUI(KC_X));
489 yank_was_lines = true;
490 vstate = VIM_START;
491 break;
492 case VIM_J:
493 register_code(KC_LSHIFT);
494 register_code(KC_DOWN);
495 break;
496 case VIM_K:
497 register_code(KC_LSHIFT);
498 register_code(KC_UP);
499 break;
500 case VIM_Y:
501 tap_code16(LGUI(KC_C));
502 yank_was_lines = true;
503 tap_code(KC_RIGHT);
504 vstate = VIM_START;
505 break;
506 case VIM_P:
507 tap_code16(LGUI(KC_V));
508 vstate = VIM_START;
509 break;
510 case VIM_V:
511 case VIM_ESC:
512 tap_code(KC_RIGHT);
513 vstate = VIM_START;
514 break;
515 case VIM_COMMA:
516 case VIM_PERIOD:
517 comma_period(keycode);
518 break;
519 default:
520 // do nothing
521 break;
522 }
523 break;
524 case VIM_G:
525 /*****************************
526 * gg, and a grab-bag of other macros i find useful
527 *****************************/
528 switch(keycode) {
529 case VIM_G:
530 tap_code(KC_HOME);
531 break;
532 // codes b
533 case VIM_H:
534 tap_code16(LCTL(KC_A));
535 break;
536 case VIM_J:
537 register_code(KC_PGDN);
538 break;
539 case VIM_K:
540 register_code(KC_PGUP);
541 break;
542 case VIM_L:
543 tap_code16(LCTL(KC_E));
544 break;
545 default:
546 // do nothing
547 break;
548 }
549 vstate = VIM_START;
550 break;
551 case VIM_Y:
552 /*****************************
553 * yoink!
554 *****************************/
555 switch(keycode) {
556 case VIM_B:
557 case VIM_E:
558 case VIM_H:
559 case VIM_J:
560 case VIM_K:
561 case VIM_L:
562 case VIM_W:
563 simple_movement(keycode);
564 tap_code16(LGUI(KC_C));
565 tap_code(KC_RIGHT);
566 yank_was_lines = false;
567 break;
568 case VIM_Y:
569 tap_code16(LGUI(KC_LEFT));
570 tap_code16(LSFT(KC_DOWN));
571 tap_code16(LGUI(KC_C));
572 tap_code(KC_RIGHT);
573 yank_was_lines = true;
574 break;
575 default:
576 // NOTHING
577 break;
578 }
579 vstate = VIM_START;
580 break;
581 }
582 } else {
583 /************************
584 * key unregister_code events
585 ************************/
586 clear_keyboard();
587 }
588 return false;
589 } else {
590 return true;
591 }
592}
593
diff --git a/users/twschum/xtonhasvim.h b/users/twschum/xtonhasvim.h
new file mode 100644
index 000000000..fd9ebd4f0
--- /dev/null
+++ b/users/twschum/xtonhasvim.h
@@ -0,0 +1,62 @@
1 /* Copyright 2015-2017 Christon DeWan
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16
17#ifndef USERSPACE
18#define USERSPACE
19
20#include QMK_KEYBOARD_H
21
22enum xtonhasvim_keycodes {
23 VIM_START = SAFE_RANGE, // bookend for vim states
24 VIM_A,
25 VIM_B,
26 VIM_C,
27 VIM_CI,
28 VIM_D,
29 VIM_DI,
30 VIM_E,
31 VIM_H,
32 VIM_G,
33 VIM_I,
34 VIM_J,
35 VIM_K,
36 VIM_L,
37 VIM_O,
38 VIM_P,
39 VIM_S,
40 VIM_U,
41 VIM_V,
42 VIM_VS, // visual-line
43 VIM_VI,
44 VIM_W,
45 VIM_X,
46 VIM_Y,
47 VIM_PERIOD, // to support indent/outdent
48 VIM_COMMA, // and toggle comments
49 VIM_SHIFT, // avoid side-effect of supporting real shift.
50 VIM_ESC, // bookend
51 VIM_SAFE_RANGE // start other keycodes here.
52};
53
54bool process_record_vimlayer(uint16_t keycode, keyrecord_t *record);
55
56// NOTE: Define this in keymap.c to return vim layer
57extern uint8_t vim_cmd_layer(void);
58
59extern uint16_t vstate;
60
61
62#endif