Skip to content

Instantly share code, notes, and snippets.

@wjanssens
Forked from anonymous/gist:6374501
Last active December 21, 2015 22:19
Show Gist options
  • Save wjanssens/6374574 to your computer and use it in GitHub Desktop.
Save wjanssens/6374574 to your computer and use it in GitHub Desktop.
<!--
Copyright 2013 Warren Janssens <warren.janssens@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<!-- Dependencies:
http://medialize.github.io/jQuery-contextMenu/
-->
<!-- Change Log:
August 2013: Initial Development
-->
<!-- TODO:
* Test in IE to find stray trailing commas
* Show Layer 0 for TRNS keys (in grey?)
* Test generated files on on real hardware!
* Add import/export of the JSON values stored in local storage
* Add export of generated C files
* Implement macros
* Implement esoteric layer functions
-->
<html>
<head>
<link rel="stylesheet" href="jquery.contextMenu.css"/>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/jquery-ui.min.js"></script>
<script src="jquery.contextMenu.js"></script>
<script src="jquery.ui.position.js"></script>
<script type="text/javascript">
var categories = [ "Letters", "Numbers & Symbols", "Symbols", "Non-Printable / Navigation", "F1 - F12", "F13 - F24", "Controls", "Keypad", "Unix", "International", "Language", "Miscellaneous", "Modifiers", "Virtual", "Consumer", "WWW", "Mouse", "fn" ];
var keycodes = {
"TRNS": [ "&#x25e6; Transparent", "&#x25e6;", null ],
"NO ": [ "&#x00d8; No Event", "&#x00d8;", null ],
"ROLL_OVER": [ "Keyboard ErrorRollOver", null ],
"POST_FAIL": [ "Keyboard POSTFail", null ],
"UNDEFINED": [ "Keyboard ErrorUndefined", null ],
"A ": [ "Keyboard a and A", "A", 0 ],
"B ": [ "Keyboard b and B", "B", 0 ],
"C ": [ "Keyboard c and C", "C", 0 ],
"D ": [ "Keyboard d and D", "D", 0 ],
"E ": [ "Keyboard e and E", "E", 0 ],
"F ": [ "Keyboard f and F", "F", 0 ],
"G ": [ "Keyboard g and G", "G", 0 ],
"H ": [ "Keyboard h and H", "H", 0 ],
"I ": [ "Keyboard i and I", "I", 0 ],
"J ": [ "Keyboard j and J", "J", 0 ],
"K ": [ "Keyboard k and K", "K", 0 ],
"L ": [ "Keyboard l and L", "L", 0 ],
"M ": [ "Keyboard m and M", "M", 0 ],
"N ": [ "Keyboard n and N", "N", 0 ],
"O ": [ "Keyboard o and O", "O", 0 ],
"P ": [ "Keyboard p and P", "P", 0 ],
"Q ": [ "Keyboard q and Q", "Q", 0 ],
"R ": [ "Keyboard r and R", "R", 0 ],
"S ": [ "Keyboard s and S", "S", 0 ],
"T ": [ "Keyboard t and T", "T", 0 ],
"U ": [ "Keyboard u and U", "U", 0 ],
"V ": [ "Keyboard v and V", "V", 0 ],
"W ": [ "Keyboard w and W", "W", 0 ],
"X ": [ "Keyboard x and X", "X", 0 ],
"Y ": [ "Keyboard y and Y", "Y", 0 ],
"Z ": [ "Keyboard z and Z", "Z", 0 ],
"1 ": [ "Keyboard 1 and !", "!<br/>1", 1 ],
"2 ": [ "Keyboard 2 and @", "@<br/>2", 1 ],
"3 ": [ "Keyboard 3 and #", "#<br/>3", 1 ],
"4 ": [ "Keyboard 4 and $", "$<br/>4", 1 ],
"5 ": [ "Keyboard 5 and %", "%<br/>5", 1 ],
"6 ": [ "Keyboard 6 and ^", "^<br/>6", 1 ],
"7 ": [ "Keyboard 7 and &", "&<br/>7", 1 ],
"8 ": [ "Keyboard 8 and *", "*<br/>8", 1 ],
"9 ": [ "Keyboard 9 and (", "(<br/>9", 1 ],
"0 ": [ "Keyboard 0 and )", ")<br/>0", 1 ],
"ENT ": [ "Keyboard &#x21a9; Return", "&#x21a9;<br/>Return", 3 ],
"ESC ": [ "Keyboard &#x238b; Escape", "&#x238b;<br/>Escape", 3 ],
"BSPC": [ "Keyboard &#x232b; Backspace", "&#x232b;<br/>Backspace", 3 ],
"TAB ": [ "Keyboard &#x21e5; Tab", "&#x21e5;<br/>Tab", 3 ],
"SPC ": [ "Keyboard &#x2423; Spacebar", "&#x2423;<br/>Space", 3 ],
"MINS": [ "Keyboard - and _", "_<br/>-", 2 ],
"EQL ": [ "Keyboard = and +", "+<br/>=", 2 ],
"LBRC": [ "Keyboard [ and {", "{<br/>[", 2 ],
"RBRC": [ "Keyboard ] and }", "}<br/>]", 2 ],
"BSLS": [ "Keyboard \\ and |", "|<br/>\\", 2 ],
"NUHS": [ "Keyboard Non-US # and ~", "<strong>~<br/>#</strong>", 2 ],
"SCLN": [ "Keyboard ; and :", ":<br/>;", 2 ],
"QUOT": [ "Keyboard ' and \"", "\"<br/>'", 2 ],
"GRV ": [ "Keyboard ` and ~", "~<br/>`", 2 ],
"COMM": [ "Keyboard , and <", "&lt;<br/>,", 2 ],
"DOT ": [ "Keyboard . and >", "><br/>.", 2 ],
"SLSH": [ "Keyboard / and ?", "?<br/>/", 2 ],
"CAPS": [ "Keyboard &#x21ea; Caps Lock", "&#x21ea;<br/>Caps", 6 ],
"F1 ": [ "Keyboard F1", "F1", 4 ],
"F2 ": [ "Keyboard F2", "F2", 4 ],
"F3 ": [ "Keyboard F3", "F3", 4 ],
"F4 ": [ "Keyboard F4", "F4", 4 ],
"F5 ": [ "Keyboard F5", "F5", 4 ],
"F6 ": [ "Keyboard F6", "F6", 4 ],
"F7 ": [ "Keyboard F7", "F7", 4 ],
"F8 ": [ "Keyboard F8", "F8", 4 ],
"F9 ": [ "Keyboard F9", "F9", 4 ],
"F10 ": [ "Keyboard F10", "F10", 4 ],
"F11 ": [ "Keyboard F11", "F11", 4 ],
"F12 ": [ "Keyboard F12", "F12", 4 ],
"PSCR": [ "Keyboard Print Screen", "PrintScr<br/>SysReq", 6 ],
"SLCK": [ "Keyboard Scroll Lock", "Scroll<br/>Lock", 6 ],
"PAUS": [ "Keyboard Pause", "Pause<br/>Break", 6 ],
"INT ": [ "Keyboard Insert", "Insert", 6 ],
"HOME": [ "Keyboard &#x2196; Home", "&#x2196;<br/>Home", 3 ],
"PGUP": [ "Keyboard &#x21de; PageUp", "&#x21de;<br/>PgUp", 3 ],
"DEL ": [ "Keyboard &#x2326; Delete", "&#x2326;</br>Delete", 3 ],
"END ": [ "Keyboard &#x2198; End", "&#x2198;<br/>End", 3 ],
"PGDN": [ "Keyboard &#x21df; PageDown", "&#x21df;<br/>PgDn", 3 ],
"RGHT": [ "Keyboard &#x21e2; Right Arrow", "&#x21e2;", 3 ],
"LEFT": [ "Keyboard &#x21e0; Left Arrow", "&#x21e0;", 3 ],
"DOWN": [ "Keyboard &#x21e3; Down Arrow", "&#x21e3;", 3 ],
"UP ": [ "Keyboard &#x21e1; Up Arrow", "&#x21e1;", 3 ],
"NLCK": [ "Keypad &#x2327; Num Lock and Clear", "&#x2327;<br/>Num Lock", 7 ],
"PSLS": [ "Keypad /", "/", 7 ],
"PAST": [ "Keypad *", "*", 7 ],
"PMNS": [ "Keypad -", "-", 7 ],
"PPLS": [ "Keypad +", "+", 7 ],
"PENT": [ "Keypad &#x2324; Enter", "&#x2324;<br/>Enter", 7 ],
"P1 ": [ "Keypad 1 and End", "1<br/>&#x2198;", 7 ],
"P2 ": [ "Keypad 2 and Down Arrow", "2<br>&#x21e3;", 7 ],
"P3 ": [ "Keypad 3 and PageDn", "3<br/>&#x21df;", 7 ],
"P4 ": [ "Keypad 4 and Left Arrow", "4<br/>&#x21e0;", 7 ],
"P5 ": [ "Keypad 5", "5<br/>", 7 ],
"P6 ": [ "Keypad 6 and Right Arrow", "6<br/>&#x21e2;", 7 ],
"P7 ": [ "Keypad 7 and Home", "7<br/>&#x2196;", 7 ],
"P8 ": [ "Keypad 8 and Up Arrow", "8<br/>&#x21e1;", 7 ],
"P9 ": [ "Keypad 9 and PageUp", "9<br/>&#x21de;", 7 ],
"P0 ": [ "Keypad 0 and Insert", "0<br/>Insert", 7 ],
"PDOT": [ "Keypad . and Delete", ".<br/>Delete", 7 ],
"NUBS": [ "Keyboard Non-US \\ and |", "<strong>|<br/>\\</strong>", 2 ],
"APP ": [ "Keyboard Application / Compose", "Compose", 6 ],
"POWER": [ "Keyboard Power", "Power", 6 ],
"PEQL": [ "Keypad =", "=", 7 ],
"F13 ": [ "Keyboard F13", "F13", 5 ],
"F14 ": [ "Keyboard F14", "F14", 5 ],
"F15 ": [ "Keyboard F15", "F15", 5 ],
"F16 ": [ "Keyboard F16", "F16", 5 ],
"F17 ": [ "Keyboard F17", "F17", 5 ],
"F18 ": [ "Keyboard F18", "F18", 5 ],
"F19 ": [ "Keyboard F19", "F19", 5 ],
"F20 ": [ "Keyboard F20", "F20", 5 ],
"F21 ": [ "Keyboard F21", "F21", 5 ],
"F22 ": [ "Keyboard F22", "F22", 5 ],
"F23 ": [ "Keyboard F23", "F23", 5 ],
"F24 ": [ "Keyboard F24", "F24", 5 ],
"EXECUTE": [ "Keyboard Execute", "Execute", 8 ],
"HELP": [ "Keyboard Help", "Help", 8 ],
"MENU": [ "Keyboard Menu", "Menu", 8 ],
"SELECT": [ "Keyboard Select", "Select", 8 ],
"STOP": [ "Keyboard Stop", "Stop", 8 ],
"AGAIN": [ "Keyboard Again", "Again", 8 ],
"UNDO": [ "Keyboard Undo", "Undo", 8 ],
"CUT": [ "Keyboard Cut", "Cut", 8 ],
"COPY": [ "Keyboard Copy", "Copy", 8 ],
"PASTE": [ "Keyboard Paste", "Paste", 8 ],
"FIND": [ "Keyboard Find", "Find", 8 ],
"_MUTE": [ "Keyboard Mute", "<del>Mute</del>", 6 ],
"_VOLUP": [ "Keyboard Volume Up", "<del>Vol+</del>", 6 ],
"_VOLDOWN": [ "Keyboard Volume Down", "<del>Vol-</del>", 6 ],
"LOCKING_CAPS": [ "Keyboard Locking Caps Lock", "<del>Caps Lock</del>", 6 ],
"LOCKING_NUM": [ "Keyboard Locking Num Lock", "<del>Num Lock</del>", 6 ],
"LOCKING_SCROLL": [ "Keyboard Locking Scroll Lock", "<del>Num Lock</del>", 6 ],
"PCMM": [ "Keypad Comma", ",", 7 ],
"KP_EQUAL_AS400": [ "Keypad = (AS400)", "AS400<br/>=", 7 ],
"RO ": [ "Keyboard Intl 1 (/ and ?)", "<strong>?<br/>/</strong>", 9 ],
"KANA": [ "Keyboard Intl 2 (Japanese / English)", "Kana", 9 ],
"JYEN": [ "Keyboard Intl 3 (Yen)", "&#x00a5;", 9 ],
"HENK": [ "Keyboard Intl 4 (Henkan)", "XFER", 9 ],
"MHEN": [ "Keyboard Intl 5 (Muhenkan)", "NFER", 9 ],
"INT6": [ "Keyboard Intl 6 (,)", "Int,", 9 ],
"INT7": [ "Keyboard Intl 7 (Single/Double)", "SB/DB", 9 ],
"INT8": [ "Keyboard Intl 8", "Int8", 9 ],
"INT9": [ "Keyboard Intl 9", "Int9", 9 ],
"LANG1": [ "Keyboard Lang 1 (Hangul / English)", "Hangul", 10 ],
"LANG2": [ "Keyboard Lang 2 (Hanja)", "Hanja", 10 ],
"LANG3": [ "Keyboard Lang 3 (Katakana)", "Katakana", 10 ],
"LANG4": [ "Keyboard Lang 4 (Hiragana)", "Hiragana", 10 ],
"LANG5": [ "Keyboard Lang 5 (Zenkaku / Hankaku)", "ZenHan", 10 ],
"LANG6": [ "Keyboard Lang 6", "Lang6", 10 ],
"LANG7": [ "Keyboard Lang 7", "Lang7", 10 ],
"LANG8": [ "Keyboard Lang 8", "Lang8", 10 ],
"LANG9": [ "Keyboard Lang 9", "Lang9", 10 ],
"ALT_ERASE": [ "Keyboard Alternate Erase", "Alt<br/>Erase", 11 ],
"SYSREQ": [ "Keyboard SysReq/Attention", "SysReq", 11 ],
"CANCEL": [ "Keyboard Cancel", "Cancel", 11 ],
"CLEAR": [ "Keyboard Clear", "Clear", 11 ],
"PRIOR": [ "Keyboard Prior", "Prior", 11 ],
"RETURN": [ "Keyboard Return", "Return", 11 ],
"SEPARATOR": [ "Keyboard Separator", "Separator", 11 ],
"OUT ": [ "Keyboard Out", "Out", 11 ],
"OPER": [ "Keyboard Oper", "Oper", 11 ],
"CLEAR_AGAIN": [ "Keyboard Clear/Again", "Clr/Again", 11 ],
"CRSEL": [ "Keyboard CrSel/Props", "CrSel", 11 ],
"EXSEL": [ "Keyboard ExSel", "ExSel", 11 ],
"LCTL": [ "&#x2303; Keyboard Left Control", "&#x2303;<br/>LControl", 12 ],
"LSFT": [ "&#x21e7; Keyboard Left Shift", "&#x21e7;<br/>LShift", 12 ],
"LALT": [ "&#x2325; Keyboard Left Alt", "&#x2325;<br/>Alt", 12 ],
"LGUI": [ "&#x25c6; Keyboard Left GUI", "&#x25c6;<br/>LGUI", 12 ],
"RCTL": [ "&#x2303; Keyboard Right Control", "&#x2303;<br/>RControl", 12 ],
"RSFT": [ "&#x21e7; Keyboard Right Shift", "&#x21e7;<br/>RShift", 12 ],
"RALT": [ "&#x2325; Keyboard Right Alt", "&#x2325;<br/>AltGr", 12 ],
"RGUI": [ "&#x25c6; Keyboard Right GUI", "&#x25c6;<br/>RGUI", 12 ],
"PWR ": [ "System Power Down", "Power", 13 ],
"SLEP": [ "System Sleep", "Sleep", 13 ],
"WAKE": [ "System Wake", "Wake", 13 ],
"MUTE": [ "Consumer Mute", "Mute", 14 ],
"VOLU": [ "Consumer Volume Down", "Vol-", 14 ],
"VOLD": [ "Consumer Volume Up", "Vol+", 14 ],
"MNXT": [ "Consumer Media Next Track", ">>", 14 ],
"MPRV": [ "Consumer Media Previous Track", "<<", 14 ],
"MSTP": [ "Consumer Media Stop", "&#x25fc;", 14 ],
"MPLY": [ "Consumer Media Play/Pause", ">||", 14 ],
"MSEL": [ "Consumer Media Select", "Sel", 14 ],
"MAIL": [ "Consumer Mail", "&#x2709;<br/>Mail", 14 ],
"CALC": [ "Consumer Calculator", "Calc", 14 ],
"MYCM": [ "Consumer My Computer", "My<br/>Computer", 14, ],
"WSCH": [ "Consumer WWW Search", "WWW<br/>Search", 15 ],
"WHOM": [ "Consumer WWW Home", "WWW<br/>Home", 15 ],
"WBAK": [ "Consumer WWW Back", "WWW<br/>Back", 15 ],
"WFWD": [ "Consumer WWW Forward", "WWW<br/>Forward", 15 ],
"WSTP": [ "Consumer WWW Stop", "WWW<br/>Stop", 15 ],
"WREF": [ "Consumer WWW Refresh", "WWW<br/>Refresh", 15 ],
"WFAV": [ "Consumer WWW Favorites", "WWW<br/>Favorites", 15 ],
"MS_U": [ "Mouse Cursor Up", "Mouse<br/>Cursor Up", 16 ],
"MS_D": [ "Mouse Cursor Down", "Mouse<br/>Cur Down", 16 ],
"MS_L": [ "Mouse Cursor Left", "Mouse<br/>Cur Left", 16 ],
"MS_R": [ "Mouse Cursor Right", "Mouse<br/>Cur Right", 16 ],
"BTN1": [ "Mouse Button 1", "Mouse<br/>Button 1", 16 ],
"BTN2": [ "Mouse Button 2", "Mouse<br/>Button 2", 16 ],
"BTN3": [ "Mouse Button 3", "Mouse<br/>Button 3", 16 ],
"BTN4": [ "Mouse Button 4", "Mouse<br/>Button 4", 16 ],
"BTN5": [ "Mouse Button 5", "Mouse<br/>Button 5", 16 ],
"WH_U": [ "Mouse Wheel Up", "Mouse<br/>Wheel Up", 16 ],
"WH_D": [ "Mouse Wheel Down", "Mouse<br/>Wheel Down", 16 ],
"WH_L": [ "Mouse Wheel Left", "Mouse<br/>Wheel Left", 16 ],
"WH_R": [ "Mouse Wheel Right", "Mouse<br/>Wheel Right", 16 ],
"ACL0": [ "Mouse Acceleration 0", "Mouse<br/>Accel 0", 16 ],
"ACL1": [ "Mouse Acceleration 1", "Mouse<br/>Accel 1", 16 ],
"ACL2": [ "Mouse Acceleration 2", "Mouse<br/>Accel 2", 16 ],
"FN0 ": [ "Function 0", "fn0", 17 ],
"FN1 ": [ "Function 1", "fn1", 17 ],
"FN2 ": [ "Function 2", "fn2", 17 ],
"FN3 ": [ "Function 3", "fn3", 17 ],
"FN4 ": [ "Function 4", "fn4", 17 ],
"FN5 ": [ "Function 5", "fn5", 17 ],
"FN6 ": [ "Function 6", "fn6", 17 ],
"FN7 ": [ "Function 7", "fn7", 17 ],
"FN8 ": [ "Function 8", "fn8", 17 ],
"FN9 ": [ "Function 9", "fn9", 17 ],
"FN10": [ "Function 10", "fn10", 17 ],
"FN11": [ "Function 11", "fn11", 17 ],
"FN12": [ "Function 12", "fn12", 17 ],
"FN13": [ "Function 13", "fn13", 17 ],
"FN14": [ "Function 14", "fn14", 17 ],
"FN15": [ "Function 15", "fn15", 17 ],
"FN16": [ "Function 16", "fn16", 17 ],
"FN17": [ "Function 17", "fn17", 17 ],
"FN18": [ "Function 18", "fn18", 17 ],
"FN19": [ "Function 19", "fn19", 17 ],
"FN20": [ "Function 20", "fn20", 17 ],
"FN21": [ "Function 21", "fn21", 17 ],
"FN22": [ "Function 22", "fn22", 17 ],
"FN23": [ "Function 23", "fn23", 17 ],
"FN24": [ "Function 24", "fn24", 17 ],
"FN25": [ "Function 25", "fn25", 17 ],
"FN26": [ "Function 26", "fn26", 17 ],
"FN27": [ "Function 27", "fn27", 17 ],
"FN28": [ "Function 28", "fn28", 17 ],
"FN29": [ "Function 29", "fn29", 17 ],
"FN30": [ "Function 30", "fn30", 17 ],
"FN31": [ "Function 31", "fn31", 17 ]
};
var leds = {
"NUM_LOCK": [ "Num Lock", "Num<br/>Lock" ],
"NUM_LOCK_INV": [ "Num Lock (Inverted)", "Num<br/>Lock<br/>(Inverted)" ],
"CAPS_LOCK": [ "Caps Lock", "Caps<br/>Lock" ],
"SCROLL_LOCK": [ "Scroll Lock", "Scroll<br/>Lock" ],
"COMPOSE": [ "Compose", "Compose" ],
"KANA": [ "Kana", "Kana" ]
};
var randomUUID = function() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
return v.toString(16);
});
}
var defaults = {
};
var blankUUID = randomUUID();
defaults[blankUUID] = {
"uuid": blankUUID,
"name": "Blank",
"layer": 0,
"layers": [
{
"name": "Default",
"keymap": [
"NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ",
"NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ",
"NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ",
"NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ",
"NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ",
"NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO "
]
}
],
"actions": [
]
};
var defaultUUID = randomUUID();
defaults[defaultUUID] = {
"uuid": defaultUUID,
"name": "Default",
"layer": 0,
"layers": [
{
"name": "Default",
"keymap": [
"EQL ", "1 ", "2 ", "3 ", "4 ", "5 ", "NO ", "NO ", "6 ", "7 ", "8 ", "9 ", "0 ", "MINS",
"TAB ", "Q ", "W ", "E ", "R ", "T ", "NO ", "NO ", "Y ", "U ", "I ", "O ", "P ", "BSLS",
"ESC ", "A ", "S ", "D ", "F ", "G ", "NO ", "NO ", "H ", "J ", "K ", "L ", "SCLN", "QUOT",
"FN1 ", "Z ", "X ", "C ", "V ", "B ", "FN1 ", "FN1 ", "N ", "M ", "COMM", "DOT ", "SLSH", "RSFT",
"LGUI", "GRV ", "NUBS", "LBRC", "RBRC", "NO ", "NO ", "NO ", "NO ", "LEFT", "DOWN", "UP ", "RGHT", "RGUI",
"NO ", "END ", "DEL ", "BSPC", "HOME", "LCTL", "LALT", "RALT", "RCTL", "PGUP", "SPC ", "ENT ", "PGDN", "NO "
]
},{
"name": "Keypad",
"keymap": [
"NO ", "F13 ", "F14 ", "F15 ", "F16 ", "NO ", "FN0 ", "NO ", "NO ", "NLCK", "PEQL", "PSLS", "PAST", "NO ",
"NO ", "F9 ", "F10 ", "F11 ", "F12 ", "NO ", "NO ", "NO ", "NO ", "P7 ", "P8 ", "P9 ", "PMNS", "NO ",
"NO ", "F5 ", "F6 ", "F7 ", "F8 ", "NO ", "NO ", "NO ", "NO ", "P4 ", "P5 ", "P6 ", "PPLS", "NO ",
"FN1 ", "F1 ", "F2 ", "F3 ", "F4 ", "NO ", "TRNS", "TRNS", "NO ", "P1 ", "P2 ", "P3 ", "PENT", "RSFT",
"LGUI", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "P0 ", "P0 ", "PDOT", "PENT", "RGUI",
"NO ", "END ", "DEL ", "BSPC", "HOME", "LCTL", "LALT", "RALT", "RCTL", "PGUP", "P0 ", "ENT ", "PGDN", "NO "
]
}
],
"actions": [
{ "action": "ACTION_FUNCTION(TEENSY)" },
{ "action": "ACTION_LAYER_TAP_TOGGLE", "layer": 1 },
{ "action": "ACTION_MODS_TAP_KEY", "LSFT": true, "key": "CAPS" }
],
"led": [ "NUM_LOCK", "CAPS_LOCK", "SCROLL_LOCK" ]
};
var minimalUUID = randomUUID();
defaults[minimalUUID] = {
"uuid": minimalUUID,
"name": "Minimal",
"layer": 0,
"layers": [
{
"name": "Typing",
"keymap": [
"NO ", "1 ", "2 ", "3 ", "4 ", "5 ", "NO ", "NO ", "6 ", "7 ", "8 ", "9 ", "0 ", "NO ",
"NO ", "Q ", "W ", "E ", "R ", "T ", "FN3 ", "FN3 ", "Y ", "U ", "I ", "O ", "P ", "NO ",
"NO ", "A ", "S ", "D ", "F ", "G ", "NO ", "NO ", "H ", "J ", "K ", "L ", "SCLN", "NO ",
"NO ", "Z ", "X ", "C ", "V ", "B ", "FN2 ", "RSFT", "N ", "M ", "COMM", "DOT ", "SLSH", "NO ",
"NO ", "NO ", "LCTL", "LALT", "LGUI", "NO ", "NO ", "NO ", "NO ", "RGUI", "RALT", "RCTL", "NO ", "NO ",
"NO ", "NO ", "FN1 ", "BSPC", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "SPC ", "FN1 ", "NO ", "NO "
]
},{
"name": "Control",
"keymap": [
"NO ", "ESC ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ",
"NO ", "FN8 ", "TAB ", "GRV ", "FN11", "NO ", "FN3 ", "FN3 ", "NO ", "FN9 ", "FN10", "LBRC", "RBRC", "NO ",
"NO ", "HOME", "PGDN", "PGUP", "END ", "NO ", "NO ", "NO ", "NO ", "LEFT", "DOWN", "UP ", "RGHT", "NO ",
"NO ", "BSLS", "FN4 ", "SLSH", "FN5 ", "NO ", "FN2 ", "RSFT", "NO ", "EQL ", "FN6 ", "MINS", "FN7 ", "NO ",
"NO ", "NO ", "LCTL", "LALT", "LGUI", "NO ", "NO ", "NO ", "NO ", "LGUI", "RALT", "RCTL", "NO ", "NO ",
"NO ", "NO ", "FN1 ", "DEL ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "ENT ", "FN1 ", "NO ", "NO "
]
},{
"name": "Keypad",
"keymap": [
"NO ", "F13 ", "F14 ", "F15 ", "F16 ", "NO ", "NO ", "NO ", "NO ", "NLCK", "PEQL", "PSLS", "PAST", "NO ",
"NO ", "F9 ", "F10 ", "F11 ", "F12 ", "NO ", "FN2 ", "FN2 ", "NO ", "P7 ", "P8 ", "P9 ", "PMNS", "NO ",
"NO ", "F5 ", "F6 ", "F7 ", "F8 ", "NO ", "NO ", "NO ", "NO ", "P4 ", "P5 ", "P6 ", "PPLS", "NO ",
"NO ", "F1 ", "F2 ", "F3 ", "F4 ", "NO ", "FN1 ", "RSFT", "NO ", "P1 ", "P2 ", "P3 ", "PENT", "NO ",
"NO ", "NO ", "LCTL", "LALT", "LGUI", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "PDOT", "PENT", "NO ",
"NO ", "NO ", "FN1 ", "BSPC", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "P0 ", "FN1 ", "NO ", "NO "
]
}
],
"actions": [
{ "action": "ACTION_FUNCTION(TEENSY)" },
{ "action": "ACTION_LAYER_TAP_TOGGLE", "layer": 1 },
{ "action": "ACTION_MODS_TAP_KEY", "LSFT": true, "key": "CAPS" },
{ "action": "ACTION_LAYER_TAP_TOGGLE", "layer": 2 },
{ "action": "ACTION_MODS_KEY", "LSFT": true, "key": "BSLS" },
{ "action": "ACTION_MODS_KEY", "LSFT": true, "key": "SLSH" },
{ "action": "ACTION_MODS_KEY", "LSFT": true, "key": "EQL " },
{ "action": "ACTION_MODS_KEY", "LSFT": true, "key": "MINS" },
{ "action": "ACTION_MODS_KEY", "RSFT": true, "key": "TAB " },
{ "action": "ACTION_MODS_KEY", "LSFT": true, "key": "LBRC" },
{ "action": "ACTION_MODS_KEY", "LSFT": true, "key": "RBRC" },
{ "action": "ACTION_MODS_KEY", "RSFT": true, "key": "GRV " }
],
"led": [ "NUM_LOCK", "CAPS_LOCK", "SCROLL_LOCK" ]
};
var key64UUID = randomUUID();
defaults[key64UUID] = {
"uuid": key64UUID,
"name": "Key64",
"layer": 0,
"layers": [
{
"name": "Standard",
"keymap": [
"ESC ", "1 ", "2 ", "3 ", "4 ", "5 ", "NO ", "NO ", "6 ", "7 ", "8 ", "9 ", "0 ", "FN0 ",
"LALT", "Q ", "W ", "F ", "P ", "G ", "CAPS", "FN2 ", "J ", "L ", "U ", "Y ", "SCLN", "LALT",
"LCTL", "A ", "R ", "S ", "T ", "D ", "NO ", "NO ", "H ", "N ", "E ", "I ", "O ", "RCTL",
"LSFT", "Z ", "X ", "C ", "V ", "B ", "TAB ", "ENT ", "K ", "M ", "COMM", "DOT ", "SLSH", "RSFT",
"NO ", "HOME", "PGDN", "PGUP", "END ", "NO ", "NO ", "NO ", "NO ", "LEFT", "DOWN", "UP ", "RGHT", "NO ",
"NO ", "NO ", "BSPC", "RALT", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "FN1 ", "SPC ", "NO ", "NO "
]
},
{
"name": "Symbol",
"keymap": [
"ESC ", "F1 ", "F2 ", "F3 ", "F4 ", "F5 ", "NO ", "NO ", "F6 ", "F7 ", "F8 ", "F9 ", "F10 ", "FN0 ",
"LALT", "FN3 ", "GRV ", "FN4 ", "FN5 ", "BSLS", "SLCK", "FN22", "FN6 ", "FN7 ", "FN8 ", "F11 ", "F12 ", "LALT",
"LCTL", "FN9 ", "LBRC", "FN10", "QUOT", "MINS", "NO ", "NO ", "FN11", "FN12", "FN13", "RBRC", "FN14", "RCTL",
"LSFT", "FN15", "FN16", "FN17", "EQL ", "FN18", "LGUI", "RGUI", "FN19", "FN20", "FN21", "MPLY", "MUTE", "RSFT",
"NO ", "PSCR", "PAUS", "INT ", "HELP", "NO ", "NO ", "NO ", "NO ", "MPRV", "VOLD", "VOLU", "MNXT", "NO ",
"NO ", "NO ", "DEL ", "RALT", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "FN1 ", "SPC ", "NO ", "NO "
]
},
{
"name": "Keypad",
"keymap": [
"ESC ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NLCK", "P7 ", "P8 ", "P9 ", "INT ", "ESC ",
"LALT", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "FN22", "PSLS", "P4 ", "P5 ", "P6 ", "PAST", "TAB ",
"LCTL", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "PMNS", "P1 ", "P2 ", "P3 ", "PPLS", "BSPC",
"LSFT", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "SPC ", "PEQL", "P0 ", "NO ", "PDOT", "PCMM", "DEL ",
"NO ", "HOME", "PGDN", "PGUP", "END ", "NO ", "NO ", "NO ", "NO ", "LEFT", "DOWN", "UP ", "RGHT", "NO ",
"NO ", "NO ", "NO ", "BSPC", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "PENT", "NO ", "NO ", "NO "
]
},
{
"name": "Mouse",
"keymap": [
"NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ",
"LALT", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "FN22", "NO ", "WH_L", "WH_D", "WH_U", "WH_R", "LALT",
"LCTL", "NO ", "ACL0", "ACL1", "ACL2", "BTN4", "NO ", "NO ", "BTN5", "MS_L", "MS_D", "MS_U", "MS_R", "RCTL",
"LSFT", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "RSFT",
"NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ",
"NO ", "NO ", "BTN3", "BTN2", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "BTN1", "NO ", "NO ", "NO "
]
}
],
"actions": [
{ "action": "ACTION_FUNCTION(TEENSY)" },
{ "action": "ACTION_LAYER_TAP_TOGGLE", "layer": 1 },
{ "action": "ACTION_LAYER_TAP_TOGGLE", "layer": 2 },
{ "action": "ACTION_MODS_KEY", "RSFT": true, "key": "GRV " },
{ "action": "ACTION_MODS_KEY", "RSFT": true, "key": "4 " },
{ "action": "ACTION_MODS_KEY", "RSFT": true, "key": "2 " },
{ "action": "ACTION_MODS_KEY", "RSFT": true, "key": "6 " },
{ "action": "ACTION_MODS_KEY", "RSFT": true, "key": "5 " },
{ "action": "ACTION_MODS_KEY", "RSFT": true, "key": "8 " },
{ "action": "ACTION_MODS_KEY", "RSFT": true, "key": "LBRC" },
{ "action": "ACTION_MODS_KEY", "RSFT": true, "key": "9 " },
{ "action": "ACTION_MODS_KEY", "RSFT": true, "key": "MINS" },
{ "action": "ACTION_MODS_KEY", "RSFT": true, "key": "QUOT" },
{ "action": "ACTION_MODS_KEY", "RSFT": true, "key": "0 " },
{ "action": "ACTION_MODS_KEY", "RSFT": true, "key": "RBRC" },
{ "action": "ACTION_MODS_KEY", "RSFT": true, "key": "1 " },
{ "action": "ACTION_MODS_KEY", "RSFT": true, "key": "3 " },
{ "action": "ACTION_MODS_KEY", "RSFT": true, "key": "COMM" },
{ "action": "ACTION_MODS_KEY", "RSFT": true, "key": "BSLS" },
{ "action": "ACTION_MODS_KEY", "RSFT": true, "key": "7 " },
{ "action": "ACTION_MODS_KEY", "RSFT": true, "key": "EQL " },
{ "action": "ACTION_MODS_KEY", "RSFT": true, "key": "DOT " },
{ "action": "ACTION_LAYER_TAP_TOGGLE", "layer": 3 }
],
"led": [ "NUM_LOCK", "CAPS_LOCK", "SCROLL_LOCK" ]
};
var current = defaults[blankUUID];
var saveLayout = function() {
var save = true;
$.each(defaults, function(key, value) {
if (current.uuid == key) save = false;
});
if (save) {
window.localStorage[current.uuid] = JSON.stringify(current);
}
};
var cloneLayout = function() {
var name = current.name;
current = JSON.parse(JSON.stringify(current));
current.uuid = randomUUID();
current.name = "Copy of " + name;
redraw();
}
var refreshCombo = function() {
var s = "<optgroup label='Defaults'>";
$.each(defaults, function(uuid, l) {
s += "<option " + (l.uuid == current.uuid ? "selected" : "") + " value='" + l.uuid + "'>" + l.name + "</option>";
});
s+= "</optgroup><optgroup label='Saved'>";
for (var i = 0; i < window.localStorage.length; i++) {
var uuid = window.localStorage.key(i);
var l = JSON.parse(window.localStorage.getItem(uuid));
s += "<option " + (l.uuid == current.uuid ? "selected" : "") + " value='" + l.uuid + "'>" + l.name + "</option>";
}
s += "</optgroup>";
$('#layouts').html(s);
};
// this table is used a a bi-directional lookup table
var switchmap = [
"SW5_0", "SW5_1", "SW5_2", "SW5_3", "SW5_4", "SW5_5", "SW5_6", "SW5_7", "SW5_8", "SW5_9", "SW5_10", "SW5_11", "SW5_12", "SW5_13",
"SW4_0", "SW4_1", "SW4_2", "SW4_3", "SW4_4", "SW4_5", "SW4_6", "SW4_7", "SW4_8", "SW4_9", "SW4_10", "SW4_11", "SW4_12", "SW4_13",
"SW3_0", "SW3_1", "SW3_2", "SW3_3", "SW3_4", "SW3_5", "SW3_6", "SW3_7", "SW3_8", "SW3_9", "SW3_10", "SW3_11", "SW3_12", "SW3_13", // 6, 7 don't exist
"SW2_0", "SW2_1", "SW2_2", "SW2_3", "SW2_4", "SW2_5", "SW2_6", "SW2_7", "SW2_8", "SW2_9", "SW2_10", "SW2_11", "SW2_12", "SW2_13",
"SW1_0", "SW1_1", "SW1_2", "SW1_3", "SW1_4", "SW1_5", "SW1_6", "SW1_7", "SW1_8", "SW1_9", "SW1_10", "SW1_11", "SW1_12", "SW1_13", // 5, 6, 7, 8 don't exist (but are on PCB)
"SW0_0", "SW0_1", "SW0_2", "SW0_3", "SW0_4", "SW0_5", "SW0_6", "SW0_7", "SW0_8", "SW0_9", "SW0_10", "SW0_11", "SW0_12", "SW0_13", // 0, 13 don't exist
];
var format_modifiers = function(action) {
var result = '';
$.each(action, function(key, value) {
if (value) {
switch(key) {
case "LCTL": result += '<em>&#x2303;<sup>L</sup></em>'; break;
case "LSFT": result += '<em>&#x21e7;<sup>L</sup></em>'; break;
case "LALT": result += '<em>&#x2325;<sup>L</sup></em>'; break;
case "LGUI": result += '<em>&#x25c6;<sup>L</sup></em>'; break;
case "RCTL": result += '<em>&#x2303;<sup>R</sup></em>'; break;
case "RSFT": result += '<em>&#x21e7;<sup>R</sup></em>'; break;
case "RALT": result += '<em>&#x2325;<sup>R</sup></em>'; break;
case "RGUI": result += '<em>&#x25c6;<sup>R</sup></em>'; break;
}
}
});
return result;
};
var format_key = function(action) {
return (action.key) ? keycodes[action.key][1] : '';
};
var format_action = function(action, fn) {
var s = "<table fn='" + fn + "' class='fn'><tr><td>";
var span = 1;
switch (action.action) {
case "ACTION_FUNCTION(TEENSY)": s += "Teensy"; break;
case "ACTION_MODS": s += format_modifiers(action); break;
case "ACTION_MODS_KEY": s += format_modifiers(action) + "</td><td>" + format_key(action); span = 2; break;
case "ACTION_MODS_TAP_KEY": s += format_modifiers(action) + "</td><td class='sec'>" + format_key(action); span = 2; break;
case "ACTION_MODS_ONESHOT": s += format_modifiers(action) + "</td><td class='sec'>"; span = 2; break;
case "ACTION_LAYER_MOMENTARY": s += "&#x21e7; L" + action.layer; break;
case "ACTION_LAYER_TOGGLE": s += "&#x21ea; L" + action.layer; break;
case "ACTION_LAYER_TAP_KEY": s += "&#x21e7; L" + action.layer + "</td><td class='sec'>" + format_key(action); span = 2; break;
case "ACTION_LAYER_TAP_TOGGLE": s += "&#x21e7; L" + action.layer + "</td><td class='sec'>&#x21ea; L" + action.layer; span = 2; break;
case "MACRO": s += "Macro"; break;
default: s += "Undefined";
}
s += "</td></tr><tr><td class='num' colspan='" + span + "'>fn";
s += fn;
s += "</td></tr><table>";
return s;
};
var redraw = function() {
for (var i = 0; i < 4; i++) {
if (!current.led) break;
var key = current.led[i];
if (key) {
var text = leds[key][1];
var cell = $('#LED' + i);
cell.html(text);
}
}
var layer = current.layers[current.layer];
$('#layoutName').attr("value", current.name);
$('#layerName').val(layer.name);
$('#layerNumber').text('Layer ' + current.layer);
var map = layer.keymap;
$.each(map, function(index, value) {
var swid = switchmap[index];
var conf = keycodes[value][1];
var cat = keycodes[value][2];
if (!conf) conf = "NO ";
var html = conf;
if (cat == 12) {
var hack = {};
hack[value] = value;
html = format_modifiers(hack);
} else if (cat == 17) {
while (current.actions.length < 32) {
current.actions.push({});
}
var fn = parseInt(conf.substring(2))
html = format_action(current.actions[fn], fn);
}
var cell = $('#' + swid);
if (cell) cell.html(html);
});
$('#layer').text('Layer ' + current.layer);
$('#keymap_c').text(keymap_c());
$('#led_c').text(led_c());
saveLayout();
};
var modifier_bitset = function(modifiers) {
var s = '';
$.each(['LCTL', 'LSFT', 'LALT', 'LGUI', 'RCTL', 'RSFT', 'RALT', 'RGUI'], function(index, value) {
if (modifiers[value]) {
if (s.length > 0) s += ' | ';
s += value;
}
});
return s;
}
var led_c = function() {
var s = '#include <stdint.h>\n';
s += '#include <avr/io.h>\n';
s += '#include "print.h"\n';
s += '#include "debug.h"\n';
s += '#include "led.h"\n';
s += '#include "ergodox.h"\n\n';
s += 'void led_set(uint8_t usb_led) {\n';
if (current.led) {
for (var i = 0; i < 3; i++) {
var inv = false;
var l = current.led[i];
if (l) {
if ('NUM_LOCK_INV' == l) {
inv = true;
l = 'NUM_LOCK';
}
s += ' if (usb_led & (1<<USB_LED_'+l+')) {\n';
s += ' ergodox_right_led_'+(i+1)+(inv ? '_on();\n':'_off();\n');
s += ' } else {\n'
s += ' ergodox_right_led_'+(i+1)+(inv ? '_off();\n':'_on();\n');
s += ' }\n';
}
}
}
s += '}\n'
return s;
}
var keymap_c = function() {
var s = '#include <stdint.h>\n';
s += '#include <stdbool.h>\n';
s += '#include <avr/pgmspace.h>\n';
s += '#include "keycode.h"\n';
s += '#include "action.h"\n';
s += '#include "action_macro.h"\n';
s += '#include "report.h"\n';
s += '#include "host.h"\n';
s += '#include "debug.h"\n';
s += '#include "keymap.h"\n\n';
s += '#define KEYMAP( \\\n';
s += 'k00, k01, k02, k03, k04, k05, k06,\\\n';
s += 'k10, k11, k12, k13, k14, k15, k16,\\\n';
s += 'k20, k21, k22, k23, k24, k24,\\\n';
s += 'k30, k31, k32, k33, k34, k35, k36,\\\n';
s += 'k40, k41, k42, k43, k44,\\\n';
s += ' k55, k56,\\\n';
s += ' k54,\\\n';
s += ' k53, k52, k51,\\\n';
s += 'k07, k08, k09, k0A, k0B, k0C, k0D,\\\n';
s += 'k17, k18, k19, k1A, k1B, k1C, k1D,\\\n';
s += ' k28, k29, k2A, k2B, k2C, K2D \\\n';
s += 'k37, k38, k39, k3A, k3B, k3C, k3D,\\\n';
s += ' k49, k4A, k4B, K4C, K4D,\\\n';
s += 'k57, k58,\\\n';
s += 'k59,\\\n';
s += 'k5C, k5B, k5A,\\\n';
s += ') \\\n';
s += '{ \\\n';
s += ' { KC_##k00,KC_##k10,KC_##k20,KC_##k30,KC_##k40,KC_NO },\\\n';
s += ' { KC_##k01,KC_##k11,KC_##k21,KC_##k31,KC_##k41,KC_##k51 },\\\n';
s += ' { KC_##k02,KC_##k12,KC_##k22,KC_##k32,KC_##k42,KC_##k52 },\\\n';
s += ' { KC_##k03,KC_##k13,KC_##k23,KC_##k33,KC_##k43,KC_##k53 },\\\n';
s += ' { KC_##k04,KC_##k14,KC_##k24,KC_##k34,KC_##k44,KC_##k54 },\\\n';
s += ' { KC_##k05,KC_##k15,KC_##k25,KC_##k35,KC_NO ,KC_##k55 },\\\n';
s += ' { KC_##k06,KC_##k16,KC_NO ,KC_##k36,KC_NO ,KC_##k56 },\\\n';
s += ' { KC_##k07,KC_##k17,KC_NO ,KC_##k37,KC_NO ,KC_NO },\\\n';
s += ' { KC_##k08,KC_##k18,KC_##k28,KC_##k38,KC_NO ,KC_##k57 },\\\n';
s += ' { KC_##k09,KC_##k19,KC_##k29,KC_##k39,KC_##k49,KC_##k58 },\\\n';
s += ' { KC_##k0A,KC_##k1A,KC_##k2A,KC_##k3A,KC_##k4A,KC_##k59 },\\\n';
s += ' { KC_##k0B,KC_##k1B,KC_##k2B,KC_##k3B,KC_##k4B,KC_##k5A },\\\n';
s += ' { KC_##k0C,KC_##k1C,KC_##k2C,KC_##k3C,KC_##k4C,KC_##k5B },\\\n';
s += ' { KC_##k0D,KC_##k1D,KC_##k2D,KC_##k3D,KC_##k4D,KC_NO },\\\n';
s += '}\n';
s += 'static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = ';
for (var l = 0; l < current.layers.length; l++) {
var layer = current.layers[l];
var include = false;
var keymap = layer.keymap;
// if the whole layer is blank, stop
for (var k = 0; k < 84; k++) {
if (keymap[k] != "TRNS" && keymap[k] != "NO ") {
include = true;
break;
}
}
if (!include) break;
s += '{\n';
s += ' /* Layer ' + l + ': ' + layer.name + ' */\n';
s += ' KEYMAP(\n';
for (var r = 5; r > 0; r--) {
s += ' ';
for (var c = 0; c < 7; c++) {
if (r == 3 && c == 6) {
s += ' ,';
} else if (r == 1 && (c == 5 || c == 6)) {
s += ' ,';
} else {
s += keymap[switchmap.indexOf('SW'+r+'_'+c)];
s += ',';
}
}
s += '\n';
}
s += ' ';
s += keymap[switchmap.indexOf('SW0_5')] + ',';
s += keymap[switchmap.indexOf('SW0_6')] + ',\n';
s += ' ';
s += keymap[switchmap.indexOf('SW0_4')] + ',\n';
s += ' ';
s += keymap[switchmap.indexOf('SW0_3')] + ',';
s += keymap[switchmap.indexOf('SW0_2')] + ',';
s += keymap[switchmap.indexOf('SW0_1')] + ',\n';
for (var r = 5; r > 0; r--) {
s += ' ';
for (var c = 7; c < 14; c++) {
if (r == 3 && c == 7) {
s += ' ,';
} else if (r == 1 && (c == 7 || c == 8)) {
s += ' ,';
} else {
s += keymap[switchmap.indexOf('SW'+r+'_'+c)];
s += ',';
}
}
s += '\n';
}
s += ' ';
s += keymap[switchmap.indexOf('SW0_7')] + ',';
s += keymap[switchmap.indexOf('SW0_8')] + ',\n';
s += ' ';
s += keymap[switchmap.indexOf('SW0_9')] + ',\n';
s += ' ';
s += keymap[switchmap.indexOf('SW0_12')] + ',';
s += keymap[switchmap.indexOf('SW0_11')] + ',';
s += keymap[switchmap.indexOf('SW0_10')] + '\n';
s += ' ),';
}
s += '};\n';
s += 'enum function_id\n TEENSY_KEY,\n};\n';
s += 'static const uint16_t PROGMEM fn_actions[] = {\n';
for (var a = 0; a < current.actions.length; a++) {
var action = current.actions[a];
if (!action.action) break;
s += ' [' + a + '] = ';
if (action.action == 'ACTION_FUNCTION(TEENSY_KEY)') {
s += 'ACTION_FUNCTION(TEENSY_KEY),\n';
} else {
s += action.action + '('
switch(action.action) {
case "": break;
case "ACTION_MODS": s += modifier_bitset(action); break;
case "ACTION_MODS_KEY": s += modifier_bitset(action) + ', KC_' + action.key; break;
case "ACTION_MODS_TAP_KEY": s += modifier_bitset(action) + ', KC_' + action.key; break;
case "ACTION_MODS_ONESHOT": s += modifier_bitset(action); break;
case "ACTION_LAYER_MOMENTARY": s += action.layer; break;
case "ACTION_LAYER_TOGGLE": s += action.layer; break;
case "ACTION_LAYER_TAP_KEY": s += action.layer + ', KC_' + action.key; break;
case "ACTION_LAYER_TAP_TOGGLE": s += action.layer; break;
case "MACRO": s+= macro(action.macro); break;
};
s += '),\n';
}
}
s += '};\n';
s += 'void action_function(keyrecord_t *event, uint8_t id, uint8_t opt) {\n';
s += ' if (id == TEENSY_KEY) {\n';
s += ' clear_keyboard();\n _delay_ms(250);\n';
s += ' bootloader_jump();\n }\n}\n';
return s;
};
</script>
<style type="text/css">
body { font-family: "Lucida Sans", sans-serif; font-size: 13px; color: #002b36; }
td { font-size: 11px; }
#menu { display: none; }
.s { width: 30px; }
.k { border: 1px solid #002b36; height: 50px; width: 50px; background-color: #fdf6e3; text-align: center; cursor: context-menu; }
.h { background-color: #b58900; }
.w { width: 90px; background-color: #eee8d5; }
.g { background-color: #eee8d5; }
.l { border: 1px solid #002b36; background-color: #cb4b16; text-align: center; cursor: context-menu; }
.fn { color: #268bd2; cursor: context-menu; width: 100%; height: 100%; }
.fn td { text-align: center; width: 50%; }
.fn .sec { border-left: 1px solid #268bd2; }
.fn .num { height: 25%; border-top: 1px solid #268bd2; }
em { font-size: 1.5em; font-style: normal; }
strong { font-style: normal; color: #d33682; }
sup { font-size: .5em; }
pre { font-size: 9px; }
</style>
</head>
<body>
<select id="layouts"></select>
<button id="deleteLayout">Delete</button>
<button id="newLayout">New</button>
<input id="layoutName" value="Default"></input>
<table class="keyboard">
<tr>
<td id="SW5_0" class="k w"/><td id="SW5_1" class="k"/><td id="SW5_2" class="k"/><td id="SW5_3" class="k"/><td id="SW5_4" class="k"/><td id="SW5_5" class="k"/><td id="SW5_6" class="k g"/>
<td class="s" colspan="4"/><td id="LED0" class="l"/>
<td id="SW5_7" class="k g"/><td id="SW5_8" class="k"/><td id="SW5_9" class="k"/><td id="SW5_10" class="k"/><td id="SW5_11" class="k"/><td id="SW5_12" class="k"/><td id="SW5_13" class="k w"/>
</tr>
<tr>
<td id="SW4_0" class="k w"/><td id="SW4_1" class="k"/><td id="SW4_2" class="k"/><td id="SW4_3" class="k"/><td id="SW4_4" class="k"/><td id="SW4_5" class="k"/><td id="SW4_6" class="k g"/>
<td class="s" colspan="4"/><td id="LED1" class="l"/>
<td id="SW4_7" class="k g"/><td id="SW4_8" class="k"/><td id="SW4_9" class="k"/><td id="SW4_10" class="k"/><td id="SW4_11" class="k"/><td id="SW4_12" class="k"/><td id="SW4_13" class="k w"/>
</tr>
<tr>
<td id="SW3_0" class="k w"/><td id="SW3_1" class="k h"/><td id="SW3_2" class="k h"/><td id="SW3_3" class="k h"/><td id="SW3_4" class="k h"/><td id="SW3_5" class="k"/><td class="s"/>
<td class="s" colspan="5"/>
<td class="s"/><td id="SW3_8" class="k"/><td id="SW3_9" class="k h"/><td id="SW3_10" class="k h"/><td id="SW3_11" class="k h"/><td id="SW3_12" class="k h"/><td id="SW3_13" class="k w"/>
</tr>
<tr>
<td id="SW2_0" class="k w"/><td id="SW2_1" class="k"/><td id="SW2_2" class="k"/><td id="SW2_3" class="k"/><td id="SW2_4" class="k"/><td id="SW2_5" class="k"/><td id="SW2_6" class="k g"/>
<td class="s" colspan="4"/><td id="LED2" class="l"/>
<td id="SW2_7" class="k g"/><td id="SW2_8" class="k"/><td id="SW2_9" class="k"/><td id="SW2_10" class="k"/><td id="SW2_11" class="k"/><td id="SW2_12" class="k"/><td id="SW2_13" class="k w"/>
</tr>
<tr>
<td id="SW1_0" class="k"/><td id="SW1_1" class="k"><td id="SW1_2" class="k"/><td id="SW1_3" class="k"/><td id="SW1_4" class="k"/><td class="s" colspan="2"/>
<td id="SW0_5" class="k g"/><td id="SW0_6" class="k g"/><td class="s"/><td id="SW0_7" class="k g"/><td id="SW0_8" class="k g"/>
<td class="s" colspan="2"/><td id="SW1_9" class="k"/><td id="SW1_10" class="k"/><td id="SW1_11" class="k"/><td id="SW1_12" class="k"/><td id="SW1_13" class="k"/>
</tr>
<tr>
<td class="s" colspan="6"/>
<td id="SW0_3" class="k g" rowspan="2"/><td id="SW0_2" class="k g" rowspan="2"/><td id="SW0_4" class="k g"/><td class="s"/><td id="SW0_9" class="k g"/><td id="SW0_11" class="k g" rowspan="2"/><td id="SW0_10" class="k g" rowspan="2"/>
</tr>
<tr>
<td class="s" colspan="6"/>
<td id="SW0_1" class="k g"/><td class="s"/><td id="SW0_12" class="k g"/>
</tr>
</table>
<div id="toolbar">
<button id="prevLayer">-</button>
<span id="layerNumber">Layer 0</span>
<button id="nextLayer">+</button>
<input id="layerName" type="text"></input>
<button id="deleteLayer">Delete</button>
<button id="newLayer">New</button>
</div>
<h2>led.c</h2>
<pre id="led_c"></pre>
<h2>keymap.c</h2>
<pre id="keymap_c"></pre>
<script>
$(function() {
refreshCombo();
redraw();
$('#layouts').change(function(x) {
current = null;
var selected = $("#layouts option:selected").attr("value");
$.each(defaults, function(uuid, l) {
if (uuid == selected) {
current = l;
}
});
if (current == null) {
current = JSON.parse(window.localStorage.getItem(selected));
}
redraw();
});
$('#layoutName').change(function() {
current.name = $('#layoutName').val();
saveLayout();
refreshCombo();
});
$('#newLayout').button({
"text": true
}).click(function() {
cloneLayout();
refreshCombo();
});
$('#deleteLayout').button({
"text": true
}).click(function() {
window.localStorage.removeItem(current.uuid);
refreshCombo();
});
$("#prevLayer").button({
text: true,
}).click(function() {
current.layer--;
if (current.layer < 0) current.layer = current.layers.length - 1;
redraw();
});
$("#nextLayer").button({
"text": true,
}).click(function() {
current.layer++;
if (current.layer >= current.layers.length) current.layer = 0;
redraw();
});
$("#newLayer").button({
"text": true,
}).click(function() {
if (current.layers.length >= 32) return;
var l = { "name": "Undefined", "keymap": [] };
for (var i = 0; i < 84; i++) l.keymap[i] = "TRNS";
current.layers.push(l);
current.layer = current.layers.length - 1;
redraw();
});
$("#deleteLayer").button({
"text": true,
}).click(function() {
if (current.layer == 0) return;
current.layers.splice(current.layer--, 1);
redraw();
});
$('#layerName').change(function() {
current.layers[current.layer].name = $(this).val();
});
var items = {
"TRNS": { "name": keycodes["TRNS"][0] },
"NO ": { "name": keycodes["NO "][0] },
};
$.each(keycodes, function(name, array) {
var c = categories[array[2]];
if (c) {
if (!items[c]) items[c] = { "name": c, "items": {} };
var i = items[c].items;
i[name] = { "name": array[0] };
}
});
$.contextMenu({
"trigger": "left",
"selector": ".k",
"callback": function(key, options) {
var id = $(this).attr('id');
var layer = current.layers[current.layer];
var map = layer.keymap;
var idx = switchmap.indexOf(id);
map[idx] = key;
redraw();
},
"items": items
});
var items = {
}
$.each(leds, function(name, array) {
items[name] = { "name": array[0] };
});
$.contextMenu({
"trigger": "left",
"selector": ".l",
"callback": function(key, option) {
var id = $(this).attr('id');
var num = parseInt(id.substring(3));
if (!current.led) current.led = [undefined, undefined, undefined];
current.led[num] = key;
redraw();
},
"items": items
});
var keyOptions = {};
$.each(keycodes, function(name, array) {
if (array[2] && array[2] < 17) {
keyOptions[name] = array[0];
}
});
var layerOptions = {};
for (var i = 0; i < 32; i++) {
layerOptions[i] = 'Layer ' + i;
}
var modifierItems = {};
$.each(['LCTL', 'LSFT', 'LALT', 'LGUI', 'RCTL', 'RSFT', 'RALT', 'RGUI'], function(index, value) {
modifierItems[value] = { "name": keycodes[value][0], "type": "checkbox" };
});
var items = {
"remove": {
"name": "Remove Function",
"callback": function(key, options) {
var $this = this;
var sw = this.parents(".k").attr('id');
current.layers[current.layer].keymap[switchmap.indexOf(sw)] = 'NO ';
redraw();
}
},
"action": {
"name": "Action",
"type": "select",
"options": {
"ACTION_FUNCTION(TEENSY_KEY)": "Teensy Key",
"ACTION_MODS": "Modifiers",
"ACTION_MODS_KEY": "Modifiers and Key",
"ACTION_MODS_TAP_KEY": "Modifiers or Key",
"ACTION_MODS_ONESHOT": "Modifier One-Shot",
"ACTION_LAYER_MOMENTARY": "Momentary Layer",
"ACTION_LAYER_TOGGLE": "Toggle Layer",
"ACTION_LAYER_TAP_KEY": "Momentary Layer or Key",
"ACTION_LAYER_TAP_TOGGLE": "Momentary Layer or Toggle Layer",
"MACRO": "Macro"
}
},
"modifiers": {
"name": "Modifiers",
"items": modifierItems
},
"key": {
"name": "Key",
"type": "select",
"options": keyOptions
},
"layer": {
"name": "Layer",
"type": "select",
"options": layerOptions
},
"macro": {
"name": "Macro",
"type": "text"
}
}
$.contextMenu({
"trigger": "left",
"selector": ".fn",
"events": {
"show": function(opt) {
var $this = this;
var action = current.actions[parseInt($this.attr('fn'))];
$.contextMenu.setInputValues(opt, action);
},
"hide": function(opt) {
var $this = this;
var action = current.actions[parseInt($this.attr("fn"))];
$.contextMenu.getInputValues(opt, action);
redraw();
}
},
"items": items
});
});
</script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment