Skip to content

Instantly share code, notes, and snippets.

@niun
Last active September 25, 2024 02:29
Show Gist options
  • Save niun/acc0451bd6bd62192d6561c3b75b5cd8 to your computer and use it in GitHub Desktop.
Save niun/acc0451bd6bd62192d6561c3b75b5cd8 to your computer and use it in GitHub Desktop.
Convert windows keyboard XML files from kbdlayout.info to Vial keymap python files
# coding: utf-8
"""Example result of vial_import_win_layout.py"""
keymap = {
"KC_1": '! ¹\n1 ¡', # Keyboard 1 and Bang, Win: VK_1, AT-101 position: 2
"KC_2": '@ \n2 ²', # Keyboard 2 and At, Win: VK_2, AT-101 position: 3
"KC_3": '# \n3 ³', # Keyboard 3 And Hash, Win: VK_3, AT-101 position: 4
"KC_4": '$ £\n4 ¤', # Keyboard 4 and Dollar, Win: VK_4, AT-101 position: 5
"KC_5": '% \n5 €', # Keyboard 5 and Percent, Win: VK_5, AT-101 position: 6
"KC_6": '^ \n6 ¼', # Keyboard 6 and Caret, Win: VK_6, AT-101 position: 7
"KC_7": '& \n7 ½', # Keyboard 7 and Ampersand, Win: VK_7, AT-101 position: 8
"KC_8": '* \n8 ¾', # Keyboard 8 and Star, Win: VK_8, AT-101 position: 9
"KC_9": '( \n9 ‘', # Keyboard 9 and Left Bracket, Win: VK_9, AT-101 position: 10
"KC_0": ') \n0 ’', # Keyboard 0 and Right Bracket, Win: VK_0, AT-101 position: 11
"KC_MINUS": '_ \n- ¥', # Keyboard Dash and Underscore, Win: VK_OEM_MINUS, AT-101 position: 12
"KC_EQUAL": '+ ÷\n= ×', # Keyboard Equals and Plus, Win: VK_OEM_PLUS, AT-101 position: 13
"KC_BSPACE": ' \n␡ ', # Keyboard Delete, Win: VK_BACK, AT-101 position: 15
"KC_Q": 'Q Ä\nq ä', # Keyboard Q, Win: VK_Q, AT-101 position: 17
"KC_W": 'W Å\nw å', # Keyboard W, Win: VK_W, AT-101 position: 18
"KC_E": 'E É\ne é', # Keyboard E, Win: VK_E, AT-101 position: 19
"KC_R": 'R \nr ®', # Keyboard R, Win: VK_R, AT-101 position: 20
"KC_T": 'T Þ\nt þ', # Keyboard T, Win: VK_T, AT-101 position: 21
"KC_Y": 'Y Ü\ny ü', # Keyboard Y, Win: VK_Y, AT-101 position: 22
"KC_U": 'U Ú\nu ú', # Keyboard U, Win: VK_U, AT-101 position: 23
"KC_I": 'I Í\ni í', # Keyboard I, Win: VK_I, AT-101 position: 24
"KC_O": 'O Ó\no ó', # Keyboard O, Win: VK_O, AT-101 position: 25
"KC_P": 'P Ö\np ö', # Keyboard P, Win: VK_P, AT-101 position: 26
"KC_LBRACKET": '{ \n[ «', # Keyboard Left Brace, Win: VK_OEM_4, AT-101 position: 27
"KC_RBRACKET": '} \n] »', # Keyboard Right Brace, Win: VK_OEM_6, AT-101 position: 28
"KC_A": 'A Á\na á', # Keyboard A, Win: VK_A, AT-101 position: 31
"KC_S": 'S §\ns ß', # Keyboard S, Win: VK_S, AT-101 position: 32
"KC_D": 'D Ð\nd ð', # Keyboard D, Win: VK_D, AT-101 position: 33
"KC_F": 'F \nf ', # Keyboard F, Win: VK_F, AT-101 position: 34
"KC_G": 'G \ng ', # Keyboard G, Win: VK_G, AT-101 position: 35
"KC_H": 'H \nh ', # Keyboard H, Win: VK_H, AT-101 position: 36
"KC_J": 'J \nj ', # Keyboard J, Win: VK_J, AT-101 position: 37
"KC_K": 'K \nk ', # Keyboard K, Win: VK_K, AT-101 position: 38
"KC_L": 'L Ø\nl ø', # Keyboard L, Win: VK_L, AT-101 position: 39
"KC_SCOLON": ': °\n; ¶', # Keyboard SemiColon and Colon, Win: VK_OEM_1, AT-101 position: 40
"KC_QUOTE": '" ¨\n\' ´', # Keyboard Apostrophe and Double Quotation Mark, Win: VK_OEM_7, AT-101 position: 41
"KC_GRAVE": '~ \n` ', # Keyboard Grave Accent and Tilde, Win: VK_OEM_3, AT-101 position: 1
"KC_NONUS_HASH": '| ¦\n\\ ¬', # Keyboard Non-US, Win: VK_OEM_5, AT-101 position: 42
"KC_Z": 'Z Æ\nz æ', # Keyboard Z, Win: VK_Z, AT-101 position: 46
"KC_X": 'X \nx ', # Keyboard X, Win: VK_X, AT-101 position: 47
"KC_C": 'C ¢\nc ©', # Keyboard C, Win: VK_C, AT-101 position: 48
"KC_V": 'V \nv ', # Keyboard V, Win: VK_V, AT-101 position: 49
"KC_B": 'B \nb ', # Keyboard B, Win: VK_B, AT-101 position: 50
"KC_N": 'N Ñ\nn ñ', # Keyboard N, Win: VK_N, AT-101 position: 51
"KC_M": 'M \nm µ', # Keyboard M, Win: VK_M, AT-101 position: 52
"KC_COMMA": '< Ç\n, ç', # Keyboard Comma, Win: VK_OEM_COMMA, AT-101 position: 53
"KC_DOT": '> \n. ', # Keyboard Period, Win: VK_OEM_PERIOD, AT-101 position: 54
"KC_SLASH": '? \n/ ¿', # Keyboard QuestionMark, Win: VK_OEM_2, AT-101 position: 55
"KC_KP_ASTERISK": '* \n* ', # Keypad Star, Win: VK_MULTIPLY, AT-101 position: 100
"KC_SPACE": '␣ \n␣ ', # Keyboard Spacebar, Win: VK_SPACE, AT-101 position: 61
"KC_KP_7": ' \n7 ', # Keypad 7 and Home, Win: VK_HOME, AT-101 position: 91
"KC_KP_8": ' \n8 ', # Keypad 8 and Up Arrow, Win: VK_UP, AT-101 position: 96
"KC_KP_9": ' \n9 ', # Keypad 9 and PageUp, Win: VK_PRIOR, AT-101 position: 101
"KC_KP_MINUS": '- \n- ', # Keypad Dash, Win: VK_SUBTRACT, AT-101 position: 105
"KC_KP_4": ' \n4 ', # Keypad 4 and Left Arrow, Win: VK_LEFT, AT-101 position: 92
"KC_KP_5": ' \n5 ', # Keypad 5, Win: VK_CLEAR, AT-101 position: 97
"KC_KP_6": ' \n6 ', # Keypad 6 and Right Arrow, Win: VK_RIGHT, AT-101 position: 102
"KC_KP_PLUS": '+ \n+ ', # Keypad Plus, Win: VK_ADD, AT-101 position: 106
"KC_KP_1": ' \n1 ', # Keypad 1 and End, Win: VK_END, AT-101 position: 93
"KC_KP_2": ' \n2 ', # Keypad 2 and Down Arrow, Win: VK_DOWN, AT-101 position: 98
"KC_KP_3": ' \n3 ', # Keypad 3 and PageDn, Win: VK_NEXT, AT-101 position: 103
"KC_KP_0": ' \n0 ', # Keypad 0 and Insert, Win: VK_INSERT, AT-101 position: 99
"KC_KP_DOT": ' \n. ', # Keypad Period, Win: VK_DELETE, AT-101 position: 104
"KC_NONUS_BSLASH": '| \n\\ ', # Keyboard Non-US Slash Bar, Win: VK_OEM_102, AT-101 position: 45
"KC_KP_SLASH": '/ \n/ ', # Keypad Forward Slash, Win: VK_DIVIDE, AT-101 position: 95
"KC_RALT": 'AltGr',
"RALT(kc)": 'AltGr\n(kc)',
"RALT_T(kc)": 'AltGr_T\n(kc)',
}
"""
Convert layouts files like http://kbdlayout.info/KBDUSX/download/xml
to keymap python files used in the python sources of Vial
(https://github.com/vial-kb/vial-gui).
This script needs to be put in the vial-gui src/main/python directory
together with the win_to_hid.json file so the script is able to import
the keycodes module from vial-gui.
"""
from typing import NamedTuple
import sys
import xml.etree.ElementTree as ET
import json
import html
import argparse
from pathlib import Path
from keycodes.keycodes import Keycode
SCRIPT_DIR = Path(__file__).parent
WIN_TO_HID_FILE = SCRIPT_DIR / "win_to_hid.json"
def normalize_code(num: str|int) -> str:
if isinstance(num, int):
return f"{num:04X}"
if isinstance(num, str):
inum = int(num, base=16)
return f"{inum:04X}"
def make_printable(text: str) -> str:
text = html.unescape(text)
printable = ""
for c in text:
if ord(c) == 0x20:
printable += chr(0x2423)
elif c.isprintable():
printable += c
elif ord(c) < 0x20:
printable += chr(0x2400 + ord(c))
elif ord(c) == 127:
printable += chr(0x2421)
return printable
class KeyLabel(NamedTuple):
ll: str
lr: str
ul: str
ur: str
def get_chr_pos(modifiers: str) -> int:
pos = 0
if modifiers == "WITHOUT":
return pos
mods = set(modifiers.split())
if len({"VK_SHIFT", "VK_CAPITAL"}.intersection(mods)) == 1:
pos += 2
if {"VK_CONTROL", "VK_MENU"}.issubset(mods):
pos += 1
return pos
def get_key_label(key_results: list[ET.Element]) -> KeyLabel | None:
label_matrix = [" ", " ", " ", " "]
for result_elem in key_results:
modifiers = result_elem.attrib.get("With", "WITHOUT")
if 'Text' in result_elem.attrib:
text = result_elem.attrib['Text']
else:
dead_key = result_elem.find("DeadKeyTable")
if dead_key is None:
continue
text = dead_key.attrib.get("Accent")
if text is None:
continue
label_matrix[get_chr_pos(modifiers)] = make_printable(text)
if "".join(label_matrix).strip():
return KeyLabel(*label_matrix)
return None
def main():
parser = argparse.ArgumentParser(
description="Convert windows keynboard layout xml file from"
"kbdlayout.info to a vial keymap python file")
parser.add_argument('xml_file', help='Input xml file location', type=Path)
args = parser.parse_args()
assert isinstance(args.xml_file, Path)
if not args.xml_file.exists():
sys.exit(f"Given xml file '{args.xml_file}' does not exist.")
infilepath = args.xml_file
outfilepath = infilepath.with_suffix(".py")
# Load Windows Scancode => HID ID conversion table:
with WIN_TO_HID_FILE.open("r", encoding="utf-8") as infile:
key_data = json.load(infile)
win_codes = key_data['win_scan_codes']
# Load Windows Keyboard layout definition file:
tree = ET.parse(infilepath)
root = tree.getroot()
altgr = root.attrib.get('RightAltIsAltGr', 'false').lower() == "true"
print(root.tag, f"- AltGr: {altgr}")
key_root = root.find("PhysicalKeys")
if key_root is None:
sys.exit(f"Unable to find physical key definitions in file {infilepath}.")
# Assemble Keymap:
class KeyMapEntry(NamedTuple):
qmk_id: str
label: str
comment: str = ""
keys: list[KeyMapEntry] = []
for key in key_root.findall("./PK[@SC]"):
attribs = key.attrib
vk_id = attribs.get("VK", "")
key_results = key.findall("./Result")
if not list(key_results):
continue
key_label = get_key_label(key_results)
if key_label is None:
continue
hid_key = win_codes[normalize_code(attribs['SC'])]
hid_id = int(hid_key['hid_id'], base=16)
qmk_id = Keycode.serialize(hid_id)
label_text = f"{key_label.ul} {key_label.ur}\n{key_label.ll} {key_label.lr}"
comment = f"{hid_key['hid_name']}, Win: {vk_id}, AT-101 position: {hid_key['loc']}"
keys.append(KeyMapEntry(qmk_id, label_text, comment))
print(attribs['SC'], vk_id, f"==> {qmk_id}:")
print(" ╭──────╮")
print(f" │ {key_label.ul} {key_label.ur} │")
print(f" │ {key_label.ll} {key_label.lr} │")
print(" ╰──────╯\n")
if altgr:
keys.append(KeyMapEntry("KC_RALT", "AltGr"))
keys.append(KeyMapEntry("RALT(kc)", "AltGr\n(kc)"))
keys.append(KeyMapEntry("RALT_T(kc)", "AltGr_T\n(kc)"))
# Write Keymap to file:
with outfilepath.open('w', encoding='utf-8') as outf:
outf.write("# coding: utf-8\n\n")
outf.write("keymap = {\n")
for key in keys:
comment = f" # {key.comment}" if key.comment else ""
outf.write(f' "{key.qmk_id}": {repr(key.label)},{comment}\n')
outf.write("}")
if __name__ == "__main__":
main()
{
"purpose": "Windows Keyboard scancodes mapped to USB HID Usage Name and ID",
"source_url": "https://learn.microsoft.com/en-us/windows/win32/inputdev/about-keyboard-input#scan-codes",
"fieldnames": {
"hid_page_name": "HID Usage Page Name",
"hid_name": "HID Usage Name",
"hid_page": "HID Usage Page",
"hid_id": "HID Usage ID",
"win_sc": "Scan 1 Make",
"loc": "Key Location"
},
"win_scan_codes": {
"E05E": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard Power",
"hid_page": "0x0007",
"hid_id": "0x0066",
"win_sc": "0xE05E",
"loc": ""
},
"E05F": {
"hid_page_name": "Generic Desktop",
"hid_name": "System Sleep",
"hid_page": "0x0001",
"hid_id": "0x0082",
"win_sc": "0xE05F",
"loc": ""
},
"E063": {
"hid_page_name": "Generic Desktop",
"hid_name": "System Wake Up",
"hid_page": "0x0001",
"hid_id": "0x0083",
"win_sc": "0xE063",
"loc": ""
},
"00FF": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "ErrorRollOver",
"hid_page": "0x0007",
"hid_id": "0x0001",
"win_sc": "0x00FF",
"loc": ""
},
"001E": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard A",
"hid_page": "0x0007",
"hid_id": "0x0004",
"win_sc": "0x001E",
"loc": "31"
},
"0030": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard B",
"hid_page": "0x0007",
"hid_id": "0x0005",
"win_sc": "0x0030",
"loc": "50"
},
"002E": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard C",
"hid_page": "0x0007",
"hid_id": "0x0006",
"win_sc": "0x002E",
"loc": "48"
},
"0020": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard D",
"hid_page": "0x0007",
"hid_id": "0x0007",
"win_sc": "0x0020",
"loc": "33"
},
"0012": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard E",
"hid_page": "0x0007",
"hid_id": "0x0008",
"win_sc": "0x0012",
"loc": "19"
},
"0021": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard F",
"hid_page": "0x0007",
"hid_id": "0x0009",
"win_sc": "0x0021",
"loc": "34"
},
"0022": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard G",
"hid_page": "0x0007",
"hid_id": "0x000A",
"win_sc": "0x0022",
"loc": "35"
},
"0023": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard H",
"hid_page": "0x0007",
"hid_id": "0x000B",
"win_sc": "0x0023",
"loc": "36"
},
"0017": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard I",
"hid_page": "0x0007",
"hid_id": "0x000C",
"win_sc": "0x0017",
"loc": "24"
},
"0024": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard J",
"hid_page": "0x0007",
"hid_id": "0x000D",
"win_sc": "0x0024",
"loc": "37"
},
"0025": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard K",
"hid_page": "0x0007",
"hid_id": "0x000E",
"win_sc": "0x0025",
"loc": "38"
},
"0026": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard L",
"hid_page": "0x0007",
"hid_id": "0x000F",
"win_sc": "0x0026",
"loc": "39"
},
"0032": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard M",
"hid_page": "0x0007",
"hid_id": "0x0010",
"win_sc": "0x0032",
"loc": "52"
},
"0031": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard N",
"hid_page": "0x0007",
"hid_id": "0x0011",
"win_sc": "0x0031",
"loc": "51"
},
"0018": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard O",
"hid_page": "0x0007",
"hid_id": "0x0012",
"win_sc": "0x0018",
"loc": "25"
},
"0019": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard P",
"hid_page": "0x0007",
"hid_id": "0x0013",
"win_sc": "0x0019",
"loc": "26"
},
"0010": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard Q",
"hid_page": "0x0007",
"hid_id": "0x0014",
"win_sc": "0x0010",
"loc": "17"
},
"0013": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard R",
"hid_page": "0x0007",
"hid_id": "0x0015",
"win_sc": "0x0013",
"loc": "20"
},
"001F": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard S",
"hid_page": "0x0007",
"hid_id": "0x0016",
"win_sc": "0x001F",
"loc": "32"
},
"0014": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard T",
"hid_page": "0x0007",
"hid_id": "0x0017",
"win_sc": "0x0014",
"loc": "21"
},
"0016": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard U",
"hid_page": "0x0007",
"hid_id": "0x0018",
"win_sc": "0x0016",
"loc": "23"
},
"002F": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard V",
"hid_page": "0x0007",
"hid_id": "0x0019",
"win_sc": "0x002F",
"loc": "49"
},
"0011": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard W",
"hid_page": "0x0007",
"hid_id": "0x001A",
"win_sc": "0x0011",
"loc": "18"
},
"002D": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard X",
"hid_page": "0x0007",
"hid_id": "0x001B",
"win_sc": "0x002D",
"loc": "47"
},
"0015": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard Y",
"hid_page": "0x0007",
"hid_id": "0x001C",
"win_sc": "0x0015",
"loc": "22"
},
"002C": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard Z",
"hid_page": "0x0007",
"hid_id": "0x001D",
"win_sc": "0x002C",
"loc": "46"
},
"0002": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard 1 and Bang",
"hid_page": "0x0007",
"hid_id": "0x001E",
"win_sc": "0x0002",
"loc": "2"
},
"0003": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard 2 and At",
"hid_page": "0x0007",
"hid_id": "0x001F",
"win_sc": "0x0003",
"loc": "3"
},
"0004": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard 3 And Hash",
"hid_page": "0x0007",
"hid_id": "0x0020",
"win_sc": "0x0004",
"loc": "4"
},
"0005": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard 4 and Dollar",
"hid_page": "0x0007",
"hid_id": "0x0021",
"win_sc": "0x0005",
"loc": "5"
},
"0006": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard 5 and Percent",
"hid_page": "0x0007",
"hid_id": "0x0022",
"win_sc": "0x0006",
"loc": "6"
},
"0007": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard 6 and Caret",
"hid_page": "0x0007",
"hid_id": "0x0023",
"win_sc": "0x0007",
"loc": "7"
},
"0008": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard 7 and Ampersand",
"hid_page": "0x0007",
"hid_id": "0x0024",
"win_sc": "0x0008",
"loc": "8"
},
"0009": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard 8 and Star",
"hid_page": "0x0007",
"hid_id": "0x0025",
"win_sc": "0x0009",
"loc": "9"
},
"000A": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard 9 and Left Bracket",
"hid_page": "0x0007",
"hid_id": "0x0026",
"win_sc": "0x000A",
"loc": "10"
},
"000B": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard 0 and Right Bracket",
"hid_page": "0x0007",
"hid_id": "0x0027",
"win_sc": "0x000B",
"loc": "11"
},
"001C": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard Return Enter",
"hid_page": "0x0007",
"hid_id": "0x0028",
"win_sc": "0x001C",
"loc": "43"
},
"0001": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard Escape",
"hid_page": "0x0007",
"hid_id": "0x0029",
"win_sc": "0x0001",
"loc": "110"
},
"000E": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard Delete",
"hid_page": "0x0007",
"hid_id": "0x002A",
"win_sc": "0x000E",
"loc": "15"
},
"000F": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard Tab",
"hid_page": "0x0007",
"hid_id": "0x002B",
"win_sc": "0x000F",
"loc": "16"
},
"0039": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard Spacebar",
"hid_page": "0x0007",
"hid_id": "0x002C",
"win_sc": "0x0039",
"loc": "61"
},
"000C": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard Dash and Underscore",
"hid_page": "0x0007",
"hid_id": "0x002D",
"win_sc": "0x000C",
"loc": "12"
},
"000D": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard Equals and Plus",
"hid_page": "0x0007",
"hid_id": "0x002E",
"win_sc": "0x000D",
"loc": "13"
},
"001A": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard Left Brace",
"hid_page": "0x0007",
"hid_id": "0x002F",
"win_sc": "0x001A",
"loc": "27"
},
"001B": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard Right Brace",
"hid_page": "0x0007",
"hid_id": "0x0030",
"win_sc": "0x001B",
"loc": "28"
},
"002B": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard Non-US",
"hid_page": "0x0007",
"hid_id": "0x0032",
"win_sc": "0x002B",
"loc": "42"
},
"0027": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard SemiColon and Colon",
"hid_page": "0x0007",
"hid_id": "0x0033",
"win_sc": "0x0027",
"loc": "40"
},
"0028": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard Apostrophe and Double Quotation Mark",
"hid_page": "0x0007",
"hid_id": "0x0034",
"win_sc": "0x0028",
"loc": "41"
},
"0029": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard Grave Accent and Tilde",
"hid_page": "0x0007",
"hid_id": "0x0035",
"win_sc": "0x0029",
"loc": "1"
},
"0033": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard Comma",
"hid_page": "0x0007",
"hid_id": "0x0036",
"win_sc": "0x0033",
"loc": "53"
},
"0034": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard Period",
"hid_page": "0x0007",
"hid_id": "0x0037",
"win_sc": "0x0034",
"loc": "54"
},
"0035": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard QuestionMark",
"hid_page": "0x0007",
"hid_id": "0x0038",
"win_sc": "0x0035",
"loc": "55"
},
"003A": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard Caps Lock",
"hid_page": "0x0007",
"hid_id": "0x0039",
"win_sc": "0x003A",
"loc": "30"
},
"003B": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard F1",
"hid_page": "0x0007",
"hid_id": "0x003A",
"win_sc": "0x003B",
"loc": "112"
},
"003C": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard F2",
"hid_page": "0x0007",
"hid_id": "0x003B",
"win_sc": "0x003C",
"loc": "113"
},
"003D": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard F3",
"hid_page": "0x0007",
"hid_id": "0x003C",
"win_sc": "0x003D",
"loc": "114"
},
"003E": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard F4",
"hid_page": "0x0007",
"hid_id": "0x003D",
"win_sc": "0x003E",
"loc": "115"
},
"003F": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard F5",
"hid_page": "0x0007",
"hid_id": "0x003E",
"win_sc": "0x003F",
"loc": "116"
},
"0040": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard F6",
"hid_page": "0x0007",
"hid_id": "0x003F",
"win_sc": "0x0040",
"loc": "117"
},
"0041": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard F7",
"hid_page": "0x0007",
"hid_id": "0x0040",
"win_sc": "0x0041",
"loc": "118"
},
"0042": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard F8",
"hid_page": "0x0007",
"hid_id": "0x0041",
"win_sc": "0x0042",
"loc": "119"
},
"0043": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard F9",
"hid_page": "0x0007",
"hid_id": "0x0042",
"win_sc": "0x0043",
"loc": "120"
},
"0044": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard F10",
"hid_page": "0x0007",
"hid_id": "0x0043",
"win_sc": "0x0044",
"loc": "121"
},
"0057": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard F11",
"hid_page": "0x0007",
"hid_id": "0x0044",
"win_sc": "0x0057",
"loc": "122"
},
"0058": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard F12",
"hid_page": "0x0007",
"hid_id": "0x0045",
"win_sc": "0x0058",
"loc": "123"
},
"E037": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard PrintScreen",
"hid_page": "0x0007",
"hid_id": "0x0046",
"win_sc": "0xE037"
},
"0046": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard Scroll Lock",
"hid_page": "0x0007",
"hid_id": "0x0047",
"win_sc": "0x0046",
"loc": "125"
},
"E11D45": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard Pause",
"hid_page": "0x0007",
"hid_id": "0x0048",
"win_sc": "0xE11D45"
},
"E052": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard Insert",
"hid_page": "0x0007",
"hid_id": "0x0049",
"win_sc": "0xE052",
"loc": "75"
},
"E047": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard Home",
"hid_page": "0x0007",
"hid_id": "0x004A",
"win_sc": "0xE047",
"loc": "80"
},
"E049": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard PageUp",
"hid_page": "0x0007",
"hid_id": "0x004B",
"win_sc": "0xE049",
"loc": "85"
},
"E053": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard Delete Forward",
"hid_page": "0x0007",
"hid_id": "0x004C",
"win_sc": "0xE053",
"loc": "76"
},
"E04F": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard End",
"hid_page": "0x0007",
"hid_id": "0x004D",
"win_sc": "0xE04F",
"loc": "81"
},
"E051": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard PageDown",
"hid_page": "0x0007",
"hid_id": "0x004E",
"win_sc": "0xE051",
"loc": "86"
},
"E04D": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard RightArrow",
"hid_page": "0x0007",
"hid_id": "0x004F",
"win_sc": "0xE04D",
"loc": "89"
},
"E04B": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard LeftArrow",
"hid_page": "0x0007",
"hid_id": "0x0050",
"win_sc": "0xE04B",
"loc": "79"
},
"E050": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard DownArrow",
"hid_page": "0x0007",
"hid_id": "0x0051",
"win_sc": "0xE050",
"loc": "84"
},
"E048": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard UpArrow",
"hid_page": "0x0007",
"hid_id": "0x0052",
"win_sc": "0xE048",
"loc": "83"
},
"0045": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keypad Num Lock and Clear",
"hid_page": "0x0007",
"hid_id": "0x0053",
"win_sc": "0x0045"
},
"E035": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keypad Forward Slash",
"hid_page": "0x0007",
"hid_id": "0x0054",
"win_sc": "0xE035",
"loc": "95"
},
"0037": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keypad Star",
"hid_page": "0x0007",
"hid_id": "0x0055",
"win_sc": "0x0037",
"loc": "100"
},
"004A": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keypad Dash",
"hid_page": "0x0007",
"hid_id": "0x0056",
"win_sc": "0x004A",
"loc": "105"
},
"004E": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keypad Plus",
"hid_page": "0x0007",
"hid_id": "0x0057",
"win_sc": "0x004E",
"loc": "106"
},
"E01C": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keypad ENTER",
"hid_page": "0x0007",
"hid_id": "0x0058",
"win_sc": "0xE01C",
"loc": "108"
},
"004F": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keypad 1 and End",
"hid_page": "0x0007",
"hid_id": "0x0059",
"win_sc": "0x004F",
"loc": "93"
},
"0050": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keypad 2 and Down Arrow",
"hid_page": "0x0007",
"hid_id": "0x005A",
"win_sc": "0x0050",
"loc": "98"
},
"0051": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keypad 3 and PageDn",
"hid_page": "0x0007",
"hid_id": "0x005B",
"win_sc": "0x0051",
"loc": "103"
},
"004B": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keypad 4 and Left Arrow",
"hid_page": "0x0007",
"hid_id": "0x005C",
"win_sc": "0x004B",
"loc": "92"
},
"004C": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keypad 5",
"hid_page": "0x0007",
"hid_id": "0x005D",
"win_sc": "0x004C",
"loc": "97"
},
"004D": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keypad 6 and Right Arrow",
"hid_page": "0x0007",
"hid_id": "0x005E",
"win_sc": "0x004D",
"loc": "102"
},
"0047": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keypad 7 and Home",
"hid_page": "0x0007",
"hid_id": "0x005F",
"win_sc": "0x0047",
"loc": "91"
},
"0048": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keypad 8 and Up Arrow",
"hid_page": "0x0007",
"hid_id": "0x0060",
"win_sc": "0x0048",
"loc": "96"
},
"0049": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keypad 9 and PageUp",
"hid_page": "0x0007",
"hid_id": "0x0061",
"win_sc": "0x0049",
"loc": "101"
},
"0052": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keypad 0 and Insert",
"hid_page": "0x0007",
"hid_id": "0x0062",
"win_sc": "0x0052",
"loc": "99"
},
"0053": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keypad Period",
"hid_page": "0x0007",
"hid_id": "0x0063",
"win_sc": "0x0053",
"loc": "104"
},
"0056": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard Non-US Slash Bar",
"hid_page": "0x0007",
"hid_id": "0x0064",
"win_sc": "0x0056",
"loc": "45"
},
"E05D": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard Application",
"hid_page": "0x0007",
"hid_id": "0x0065",
"win_sc": "0xE05D",
"loc": "129"
},
"0059": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keypad Equals",
"hid_page": "0x0007",
"hid_id": "0x0067",
"win_sc": "0x0059",
"loc": ""
},
"0064": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard F13",
"hid_page": "0x0007",
"hid_id": "0x0068",
"win_sc": "0x0064",
"loc": ""
},
"0065": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard F14",
"hid_page": "0x0007",
"hid_id": "0x0069",
"win_sc": "0x0065",
"loc": ""
},
"0066": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard F15",
"hid_page": "0x0007",
"hid_id": "0x006A",
"win_sc": "0x0066",
"loc": ""
},
"0067": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard F16",
"hid_page": "0x0007",
"hid_id": "0x006B",
"win_sc": "0x0067",
"loc": ""
},
"0068": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard F17",
"hid_page": "0x0007",
"hid_id": "0x006C",
"win_sc": "0x0068",
"loc": ""
},
"0069": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard F18",
"hid_page": "0x0007",
"hid_id": "0x006D",
"win_sc": "0x0069",
"loc": ""
},
"006A": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard F19",
"hid_page": "0x0007",
"hid_id": "0x006E",
"win_sc": "0x006A",
"loc": ""
},
"006B": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard F20",
"hid_page": "0x0007",
"hid_id": "0x006F",
"win_sc": "0x006B",
"loc": ""
},
"006C": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard F21",
"hid_page": "0x0007",
"hid_id": "0x0070",
"win_sc": "0x006C",
"loc": ""
},
"006D": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard F22",
"hid_page": "0x0007",
"hid_id": "0x0071",
"win_sc": "0x006D",
"loc": ""
},
"006E": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard F23",
"hid_page": "0x0007",
"hid_id": "0x0072",
"win_sc": "0x006E",
"loc": ""
},
"0076": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard LANG5",
"hid_page": "0x0007",
"hid_id": "0x0094",
"win_sc": "0x0076",
"loc": ""
},
"007E": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keypad Comma",
"hid_page": "0x0007",
"hid_id": "0x0085",
"win_sc": "0x007E",
"loc": "107 *Note 4"
},
"0073": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard International1",
"hid_page": "0x0007",
"hid_id": "0x0087",
"win_sc": "0x0073",
"loc": "56 *Note 4, 5"
},
"0070": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard International2",
"hid_page": "0x0007",
"hid_id": "0x0088",
"win_sc": "0x0070",
"loc": "133 *Note 5"
},
"007D": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard International3",
"hid_page": "0x0007",
"hid_id": "0x0089",
"win_sc": "0x007D",
"loc": "14 *Note 5"
},
"0079": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard International4",
"hid_page": "0x0007",
"hid_id": "0x008A",
"win_sc": "0x0079",
"loc": "132 *Note 5"
},
"007B": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard International5",
"hid_page": "0x0007",
"hid_id": "0x008B",
"win_sc": "0x007B",
"loc": "131 *Note 5"
},
"005C": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard International6",
"hid_page": "0x0007",
"hid_id": "0x008C",
"win_sc": "0x005C",
"loc": ""
},
"0072": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard LANG1",
"hid_page": "0x0007",
"hid_id": "0x0090",
"win_sc": "0x0072 *Note 6"
},
"0071": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard LANG2",
"hid_page": "0x0007",
"hid_id": "0x0091",
"win_sc": "0x0071 *Note 6"
},
"0078": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard LANG3",
"hid_page": "0x0007",
"hid_id": "0x0092",
"win_sc": "0x0078",
"loc": ""
},
"0077": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard LANG4",
"hid_page": "0x0007",
"hid_id": "0x0093",
"win_sc": "0x0077",
"loc": ""
},
"001D": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard LeftControl",
"hid_page": "0x0007",
"hid_id": "0x00E0",
"win_sc": "0x001D",
"loc": "58"
},
"002A": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard LeftShift",
"hid_page": "0x0007",
"hid_id": "0x00E1",
"win_sc": "0x002A",
"loc": "44"
},
"0038": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard LeftAlt",
"hid_page": "0x0007",
"hid_id": "0x00E2",
"win_sc": "0x0038",
"loc": "60"
},
"E05B": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard Left GUI",
"hid_page": "0x0007",
"hid_id": "0x00E3",
"win_sc": "0xE05B",
"loc": "127"
},
"E01D": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard RightControl",
"hid_page": "0x0007",
"hid_id": "0x00E4",
"win_sc": "0xE01D",
"loc": "64"
},
"0036": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard RightShift",
"hid_page": "0x0007",
"hid_id": "0x00E5",
"win_sc": "0x0036",
"loc": "57"
},
"E038": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard RightAlt",
"hid_page": "0x0007",
"hid_id": "0x00E6",
"win_sc": "0xE038",
"loc": "62"
},
"E05C": {
"hid_page_name": "Keyboard/Keypad",
"hid_name": "Keyboard Right GUI",
"hid_page": "0x0007",
"hid_id": "0x00E7",
"win_sc": "0xE05C",
"loc": "128"
},
"E019": {
"hid_page_name": "Consumer",
"hid_name": "Scan Next Track",
"hid_page": "0x000C",
"hid_id": "0x00B5",
"win_sc": "0xE019",
"loc": ""
},
"E010": {
"hid_page_name": "Consumer",
"hid_name": "Scan Previous Track",
"hid_page": "0x000C",
"hid_id": "0x00B6",
"win_sc": "0xE010",
"loc": ""
},
"E024": {
"hid_page_name": "Consumer",
"hid_name": "Stop",
"hid_page": "0x000C",
"hid_id": "0x00B7",
"win_sc": "0xE024",
"loc": ""
},
"E022": {
"hid_page_name": "Consumer",
"hid_name": "Play/Pause",
"hid_page": "0x000C",
"hid_id": "0x00CD",
"win_sc": "0xE022",
"loc": ""
},
"E020": {
"hid_page_name": "Consumer",
"hid_name": "Mute",
"hid_page": "0x000C",
"hid_id": "0x00E2",
"win_sc": "0xE020",
"loc": ""
},
"E030": {
"hid_page_name": "Consumer",
"hid_name": "Volume Increment",
"hid_page": "0x000C",
"hid_id": "0x00E9",
"win_sc": "0xE030",
"loc": ""
},
"E02E": {
"hid_page_name": "Consumer",
"hid_name": "Volume Decrement",
"hid_page": "0x000C",
"hid_id": "0x00EA",
"win_sc": "0xE02E",
"loc": ""
},
"E06D": {
"hid_page_name": "Consumer",
"hid_name": "AL Consumer Control Configuration",
"hid_page": "0x000C",
"hid_id": "0x0183",
"win_sc": "0xE06D",
"loc": ""
},
"E06C": {
"hid_page_name": "Consumer",
"hid_name": "AL Email Reader",
"hid_page": "0x000C",
"hid_id": "0x018A",
"win_sc": "0xE06C",
"loc": ""
},
"E021": {
"hid_page_name": "Consumer",
"hid_name": "AL Calculator",
"hid_page": "0x000C",
"hid_id": "0x0192",
"win_sc": "0xE021",
"loc": ""
},
"E06B": {
"hid_page_name": "Consumer",
"hid_name": "AL Local Machine Browser",
"hid_page": "0x000C",
"hid_id": "0x0194",
"win_sc": "0xE06B",
"loc": ""
},
"E065": {
"hid_page_name": "Consumer",
"hid_name": "AC Search",
"hid_page": "0x000C",
"hid_id": "0x0221",
"win_sc": "0xE065",
"loc": ""
},
"E032": {
"hid_page_name": "Consumer",
"hid_name": "AC Home",
"hid_page": "0x000C",
"hid_id": "0x0223",
"win_sc": "0xE032",
"loc": ""
},
"E06A": {
"hid_page_name": "Consumer",
"hid_name": "AC Back",
"hid_page": "0x000C",
"hid_id": "0x0224",
"win_sc": "0xE06A",
"loc": ""
},
"E069": {
"hid_page_name": "Consumer",
"hid_name": "AC Forward",
"hid_page": "0x000C",
"hid_id": "0x0225",
"win_sc": "0xE069",
"loc": ""
},
"E068": {
"hid_page_name": "Consumer",
"hid_name": "AC Stop",
"hid_page": "0x000C",
"hid_id": "0x0226",
"win_sc": "0xE068",
"loc": ""
},
"E067": {
"hid_page_name": "Consumer",
"hid_name": "AC Refresh",
"hid_page": "0x000C",
"hid_id": "0x0227",
"win_sc": "0xE067",
"loc": ""
},
"E066": {
"hid_page_name": "Consumer",
"hid_name": "AC Bookmarks",
"hid_page": "0x000C",
"hid_id": "0x022A",
"win_sc": "0xE066",
"loc": ""
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment