L0 = 128 L1 = 129 L2 = 130 L3 = 131 BKSPC = 132 ENTER = 133 keymap = [ [ [ "q", "w", "f", "p", "b", "j", "l", "u", "y", ";"], [ "a", "r", "s", "t", "g", "k", "n", "e", "i", "o"], [ 0, "x", "c", "d", "v", "m", "h", "z", 0, 0], [ L0, L1, L2, L3, " ",BKSPC, 0, 0, 0,ENTER], ], [ [ "Q", "W", "F", "P", "B", "J", "L", "U", "Y", ":"], [ "A", "R", "S", "T", "G", "K", "N", "E", "I", "O"], [ 0, "X", "C", "D", "V", "M", "H", "Z", 0, 0], [ L0, L1, L2, L3, " ",BKSPC, 0, 0, 0,ENTER], ], [ [ "'", "~", "=", "{", "@", "%", "}", "_", "*", "\""], [ ",", "\\", "+", "(", "<", ">", ")", "-", "/", "."], [ "`", "?", "#", "[", "|", "&", "]", "$", "!", "^"], [ L0, L1, L2, L3, " ",BKSPC, 0, 0, 0,ENTER], ], [ [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [ "1", "2", "3", "4", "5", "6", "7", "8", "9", "0"], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [ L0, L1, L2, L3, " ",BKSPC, 0, 0, 0,ENTER], ], ] # qwerty_keymap = [ # ["z", "x", "c", "v", "b"], # ["a", "s", "d", "f", "g"], # ["q", "w", "e", "r", "t"], # ["1", "2", "3", "4", "5"], # ["6", "7", "8", "9", "0"], # ["y", "u", "i", "o", "p"], # ["h", "j", "k", "l", ";"], # ["n", "m", ",", ".", " "], # ] def visual_to_scancode(table): assert len(table) == 4 assert all(len(row) == 10 for row in table) yield table[3][0:5] yield table[2][0:5] yield table[1][0:5] yield table[0][0:5] yield table[0][5:10] yield table[1][5:10] yield table[2][5:10] yield table[3][5:10] def keymap_table(): for layer in keymap: for state in visual_to_scancode(layer): for key in reversed(state): if type(key) is str: code = ord(key) assert code < 128 yield code elif type(key) is int: yield key else: raise TypeError(key) for _ in range(8 - len(state)): yield ord('?') import sys with open(sys.argv[1], 'wb') as f: f.write(bytes(keymap_table()))