Skip to content

Instantly share code, notes, and snippets.

Created August 29, 2013 05:14
Show Gist options
  • Save anonymous/6374501 to your computer and use it in GitHub Desktop.
Save anonymous/6374501 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:
* Synchronize with cub.uanic to ensure the generated C files are correct
* 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 LEDs
* 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 ": [ "&#x21a9; Keyboard Return", "&#x21a9;<br/>Return", 3 ],
"ESC ": [ "&#x238b; Keyboard Escape", "&#x238b;<br/>Escape", 3 ],
"BSPC": [ "&#x232b; Keyboard Backspace", "&#x232b;<br/>Backspace", 3 ],
"TAB ": [ "&#x21e5; Keyboard Tab", "&#x21e5;<br/>Tab", 3 ],
"SPC ": [ "&#x2423; Keyboard 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": [ "&#x21ea; Keyboard 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": [ "&#x2196; Keyboard Home", "&#x2196;<br/>Home", 3 ],
"PGUP": [ "&#x21de; Keyboard PageUp", "&#x21de;<br/>PgUp", 3 ],
"DEL ": [ "&#x2326; Keyboard Delete", "&#x2326;</br>Delete", 3 ],
"END ": [ "&#x2198; Keyboard End", "&#x2198;<br/>End", 3 ],
"PGDN": [ "&#x21df; Keyboard PageDown", "&#x21df;<br/>PgDn", 3 ],
"RGHT": [ "&#x21e2; Keyboard Right Arrow", "&#x21e2;", 3 ],
"LEFT": [ "&#x21e0; Keyboard Left Arrow", "&#x21e0;", 3 ],
"DOWN": [ "&#x21e3; Keyboard Down Arrow", "&#x21e3;", 3 ],
"UP ": [ "&#x21e1; Keyboard Up Arrow", "&#x21e1;", 3 ],
"NLCK": [ "&#x2327; Keypad Num Lock and Clear", "&#x2327;<br/>Num Lock", 7 ],
"PSLS": [ "Keypad /", "/", 7 ],
"PAST": [ "Keypad *", "*", 7 ],
"PMNS": [ "Keypad -", "-", 7 ],
"PPLS": [ "Keypad +", "+", 7 ],
"PENT": [ "&#x2324; Keypad 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" ],
"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 ", "FN0 ", "FN0 ", "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 ", "NO ", "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_LAYER_TAP_TOGGLE", "layer": 1 },
{ "action": "ACTION_MODS_TAP_KEY", "LSFT": true, "key": "CAPS" }
]
};
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 ", "FN2 ", "FN2 ", "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 ", "FN1 ", "RSFT", "N ", "M ", "COMM", "DOT ", "SLSH", "NO ",
"NO ", "NO ", "LCTL", "LALT", "LGUI", "NO ", "NO ", "NO ", "NO ", "RGUI", "RALT", "RCTL", "RGHT", "NO ",
"NO ", "NO ", "FN0 ", "BSPC", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "SPC ", "FN0 ", "NO ", "NO "
]
},{
"name": "Control",
"keymap": [
"NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ",
"NO ", "ESC ", "NO ", "FN7 ", "TAB ", "NO ", "FN2 ", "FN2 ", "NO ", "FN8 ", "FN9 ", "LBRC", "RBRC", "NO ",
"NO ", "HOME", "PGDN", "PGUP", "END ", "NO ", "NO ", "NO ", "NO ", "LEFT", "DOWN", "UP ", "RGHT", "NO ",
"NO ", "BSLS", "FN3 ", "SLSH", "FN4 ", "NO ", "FN1 ", "RSFT", "NO ", "EQL ", "FN5 ", "MINS", "FN6 ", "NO ",
"NO ", "NO ", "LCTL", "LALT", "LGUI", "NO ", "NO ", "NO ", "NO ", "LGUI", "RALT", "RCTL", "NO ", "NO ",
"NO ", "NO ", "FN0 ", "BSPC", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "ENT ", "FN0 ", "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 ", "FN0 ", "BSPC", "NO ", "NO ", "NO ", "NO ", "NO ", "NO ", "P0 ", "FN0 ", "NO ", "NO "
]
}
],
"actions": [
{ "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" }
]
};
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_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() {
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) {
if (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());
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 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';
s += '\n';
s += '#define KEYMAP( \\\n';
s += '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, \\\n';
s += '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, \\\n';
s += 'SW3_0, SW3_1, SW3_2, SW3_3, SW3_4, SW3_5, SW3_8, SW3_9, SW3_10, SW3_11, SW3_12, SW3_13, \\\n';
s += '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, \\\n';
s += 'SW1_0, SW1_1, SW1_2, SW1_3, SW1_4, SW1_9, SW1_10, SW1_11, SW1_12, SW1_13, \\\n';
s += ' SW0_5, SW0_6, SW0_7, SW0_8, \\\n';
s += ' SW0_4, SW0_9, \\\n';
s += ' SW0_3, SW0_2, SW0_1, SW0_12,SW0_11,SW0_10 \\\n';
s += ') \\\n';
s += '{ \\\n';
s += ' { ##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 }, \\\n';
s += ' { ##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 }, \\\n';
s += ' { ##SW3_0, ##SW3_1, ##SW3_2, ##SW3_3, ##SW3_4, ##SW3_5, NO, NO, ##SW3_8, ##SW3_9, ##SW3_10, ##SW3_11, ##SW3_12, ##SW3_13 }, \\\n';
s += ' { ##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 }, \\\n';
s += ' { ##SW1_0, ##SW1_1, ##SW1_2, ##SW1_3, ##SW1_4, NO, NO, NO, NO, ##SW1_9, ##SW1_10, ##SW1_11, ##SW1_12, ##SW1_13 }, \\\n';
s += ' { NO, ##SW0_1, ##SW0_2, ##SW0_3, ##SW0_4, ##SW0_5, ##SW0_6, ##SW0_7, ##SW0_8, ##SW0_9, ##SW0_10, ##SW0_11, ##SW0_12, 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;
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';
for (var r = 5; r > 0; r--) {
s += r == 5 ? ' KEYMAP(' : ' ';
for (var c = 0; c < 14; c++) {
if (c == 7) s += ' ';
if (r == 3 && (c > 5 && c < 8)) {
s += ' ,';
} else if (r == 1 && (c > 4 && c < 9)) {
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')] + ',';
s += ' ';
s += keymap[switchmap.indexOf('SW0_7')] + ',';
s += keymap[switchmap.indexOf('SW0_8')] + ',\n';
s += ' ,';
s += keymap[switchmap.indexOf('SW0_4')] + ',';
s += ' ';
s += keymap[switchmap.indexOf('SW0_9')] + ',\n';
s += ' ,';
s += keymap[switchmap.indexOf('SW0_3')] + ',';
s += keymap[switchmap.indexOf('SW0_2')] + ',';
s += keymap[switchmap.indexOf('SW0_1')] + ',';
s += ' ';
s += keymap[switchmap.indexOf('SW0_12')] + ',';
s += keymap[switchmap.indexOf('SW0_11')] + ',';
s += keymap[switchmap.indexOf('SW0_10')] + '\n';
s += ' ),';
}
s += '};\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 + '] = ' + action.action + '('
switch(action.action) {
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';
return s;
};
</script>
<style type="text/css">
body { font-family: "Lucida Sans", sans-serif; font-size: 13px; }
td { font-size: 11px; }
#menu { display: none; }
.s { width: 30px; }
.k { border: 1px solid black; height: 50px; width: 50px; background-color: #fff; text-align: center; cursor: context-menu; }
.h { background-color: #ffc; }
.w { width: 90px; background-color: #ccc; }
.g { background-color: #ccc; }
.l { border: 1px dotted red; background-color: #fcc; text-align: center; }
.fn { color: #00f; cursor: context-menu; width: 100%; height: 100%; }
.fn td { text-align: center; width: 50%; }
.fn .sec { border-left: 1px solid #00f; }
.fn .num { height: 25%; border-top: 1px solid #00f; }
em { font-size: 1.5em; font-style: normal; }
strong { font-style: normal; color: #f00; }
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="LEDa" 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="LEDb" 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="LEDc" 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>keymap.c</h2>
<pre id="keymap_c"/>
<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 text = leds[key][1];
$(this).html(text);
},
"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_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