diff --git a/keymap.json b/keymap.json new file mode 100644 index 0000000..67e3f37 --- /dev/null +++ b/keymap.json @@ -0,0 +1,376 @@ +{ + "0x071c": ["KEY_ESC", null], + "0x071f": ["KEY_1", null], + "0x071e": ["KEY_2", null], + "0x071a": ["KEY_3", null], + "0x0718": ["KEY_4", null], + "0x071d": ["KEY_5", null], + "0x071b": ["KEY_6", null], + "0x0733": ["KEY_7", null], + "0x0735": ["KEY_8", null], + "0x0730": ["KEY_9", null], + "0x0732": ["KEY_0", null], + "0x0736": ["KEY_COMMA", ["KEY_LEFTSHIFT"]], + "0x0737": ["KEY_DOT", ["KEY_LEFTSHIFT"]], + "0x0734": ["KEY_BACKSPACE", null], + "0x072c": ["KEY_TAB", null], + "0x072f": ["KEY_Q", null], + "0x072e": ["KEY_W", null], + "0x072a": ["KEY_E", null], + "0x0728": ["KEY_R", null], + "0x072d": ["KEY_T", null], + "0x072b": ["KEY_Y", null], + "0x070b": ["KEY_U", null], + "0x070d": ["KEY_I", null], + "0x0708": ["KEY_O", null], + "0x070a": ["KEY_P", null], + "0x070e": ["KEY_MINUS", null], + "0x070f": ["KEY_EQUAL", null], + "0x070c": ["KEY_ENTER", null], + "0x073f": ["KEY_A", null], + "0x073e": ["KEY_S", null], + "0x073a": ["KEY_D", null], + "0x0738": ["KEY_F", null], + "0x073d": ["KEY_G", null], + "0x0739": ["KEY_H", null], + "0x0701": ["KEY_J", null], + "0x0705": ["KEY_K", null], + "0x0700": ["KEY_L", null], + "0x0702": ["KEY_SEMICOLON", null], + "0x0706": ["KEY_EQUAL", ["KEY_LEFTSHIFT"]], + "0x0707": ["KEY_8", ["KEY_LEFTSHIFT"]], + "0x073c": ["KEY_LEFTALT", null], + "0x0717": ["KEY_Z", null], + "0x0716": ["KEY_X", null], + "0x0712": ["KEY_C", null], + "0x0710": ["KEY_V", null], + "0x0715": ["KEY_B", null], + "0x0723": ["KEY_N", null], + "0x0725": ["KEY_M", null], + "0x0720": ["KEY_COMMA", null], + "0x0722": ["KEY_DOT", null], + "0x0726": ["KEY_SLASH", null], + "0x0721": ["KEY_SPACE", null], + "0x0727": ["KEY_GRAVE", null], + "0x075c": ["KEY_ESC", ["KEY_LEFTSHIFT"]], + "0x075f": ["KEY_1", ["KEY_LEFTSHIFT"]], + "0x075e": ["KEY_APOSTROPHE", ["KEY_LEFTSHIFT"]], + "0x075a": ["KEY_3", ["KEY_LEFTSHIFT"]], + "0x0758": ["KEY_4", ["KEY_LEFTSHIFT"]], + "0x075d": ["KEY_5", ["KEY_LEFTSHIFT"]], + "0x075b": ["KEY_7", ["KEY_LEFTSHIFT"]], + "0x0773": ["KEY_APOSTROPHE", null], + "0x0775": ["KEY_2", ["KEY_LEFTSHIFT"]], + "0x0770": ["KEY_9", ["KEY_LEFTSHIFT"]], + "0x0772": ["KEY_0", ["KEY_LEFTSHIFT"]], + "0x0776": ["KEY_LEFTBRACE", ["KEY_LEFTSHIFT"]], + "0x0777": ["KEY_RIGHTBRACE", ["KEY_LEFTSHIFT"]], + "0x0774": ["KEY_BACKSPACE", ["KEY_LEFTSHIFT"]], + "0x076c": ["KEY_TAB", ["KEY_LEFTSHIFT"]], + "0x076f": ["KEY_Q", ["KEY_LEFTSHIFT"]], + "0x076e": ["KEY_W", ["KEY_LEFTSHIFT"]], + "0x076a": ["KEY_E", ["KEY_LEFTSHIFT"]], + "0x0768": ["KEY_R", ["KEY_LEFTSHIFT"]], + "0x076d": ["KEY_T", ["KEY_LEFTSHIFT"]], + "0x076b": ["KEY_Y", ["KEY_LEFTSHIFT"]], + "0x074b": ["KEY_U", ["KEY_LEFTSHIFT"]], + "0x074d": ["KEY_I", ["KEY_LEFTSHIFT"]], + "0x0748": ["KEY_O", ["KEY_LEFTSHIFT"]], + "0x074a": ["KEY_P", ["KEY_LEFTSHIFT"]], + "0x074e": ["KEY_MINUS", ["KEY_LEFTSHIFT"]], + "0x074f": ["KEY_BACKSLASH", ["KEY_LEFTSHIFT"]], + "0x074c": ["KEY_ENTER", ["KEY_LEFTSHIFT"]], + "0x077f": ["KEY_A", ["KEY_LEFTSHIFT"]], + "0x077e": ["KEY_S", ["KEY_LEFTSHIFT"]], + "0x077a": ["KEY_D", ["KEY_LEFTSHIFT"]], + "0x0778": ["KEY_F", ["KEY_LEFTSHIFT"]], + "0x077d": ["KEY_G", ["KEY_LEFTSHIFT"]], + "0x0779": ["KEY_H", ["KEY_LEFTSHIFT"]], + "0x0741": ["KEY_J", ["KEY_LEFTSHIFT"]], + "0x0745": ["KEY_K", ["KEY_LEFTSHIFT"]], + "0x0740": ["KEY_L", ["KEY_LEFTSHIFT"]], + "0x0742": ["KEY_SEMICOLON", ["KEY_LEFTSHIFT"]], + "0x0746": ["KEY_BACKSLASH", null], + "0x0747": ["KEY_6", ["KEY_LEFTSHIFT"]], + "0x077c": ["KEY_LEFTALT", ["KEY_LEFTSHIFT"]], + "0x0757": ["KEY_Z", ["KEY_LEFTSHIFT"]], + "0x0756": ["KEY_X", ["KEY_LEFTSHIFT"]], + "0x0752": ["KEY_C", ["KEY_LEFTSHIFT"]], + "0x0750": ["KEY_V", ["KEY_LEFTSHIFT"]], + "0x0755": ["KEY_B", ["KEY_LEFTSHIFT"]], + "0x0763": ["KEY_N", ["KEY_LEFTSHIFT"]], + "0x0765": ["KEY_M", ["KEY_LEFTSHIFT"]], + "0x0760": ["KEY_LEFTBRACE", null], + "0x0762": ["KEY_RIGHTBRACE", null], + "0x0766": ["KEY_SLASH", ["KEY_LEFTSHIFT"]], + "0x0761": ["KEY_SPACE", ["KEY_LEFTSHIFT"]], + "0x0767": ["KEY_GRAVE", ["KEY_LEFTSHIFT"]], + "0x079c": ["KEY_ESC", ["KEY_LEFTCTRL"]], + "0x079f": ["KEY_1", ["KEY_LEFTCTRL"]], + "0x079e": ["KEY_2", ["KEY_LEFTCTRL"]], + "0x079a": ["KEY_3", ["KEY_LEFTCTRL"]], + "0x0798": ["KEY_4", ["KEY_LEFTCTRL"]], + "0x079d": ["KEY_5", ["KEY_LEFTCTRL"]], + "0x079b": ["KEY_6", ["KEY_LEFTCTRL"]], + "0x07b3": ["KEY_7", ["KEY_LEFTCTRL"]], + "0x07b5": ["KEY_8", ["KEY_LEFTCTRL"]], + "0x07b0": ["KEY_9", ["KEY_LEFTCTRL"]], + "0x07b2": ["KEY_0", ["KEY_LEFTCTRL"]], + "0x07b6": ["KEY_MINUS", ["KEY_LEFTCTRL"]], + "0x07b7": ["KEY_EQUAL", ["KEY_LEFTCTRL"]], + "0x07b4": ["KEY_BACKSPACE", ["KEY_LEFTCTRL"]], + "0x07ac": ["KEY_TAB", ["KEY_LEFTCTRL"]], + "0x07af": ["KEY_Q", ["KEY_LEFTCTRL"]], + "0x07ae": ["KEY_W", ["KEY_LEFTCTRL"]], + "0x07aa": ["KEY_E", ["KEY_LEFTCTRL"]], + "0x07a8": ["KEY_R", ["KEY_LEFTCTRL"]], + "0x07ad": ["KEY_T", ["KEY_LEFTCTRL"]], + "0x07ab": ["KEY_Y", ["KEY_LEFTCTRL"]], + "0x078b": ["KEY_U", ["KEY_LEFTCTRL"]], + "0x078d": ["KEY_I", ["KEY_LEFTCTRL"]], + "0x0788": ["KEY_O", ["KEY_LEFTCTRL"]], + "0x078a": ["KEY_P", ["KEY_LEFTCTRL"]], + "0x078e": ["KEY_UP", null], + "0x078f": ["KEY_DOWN", null], + "0x078c": ["KEY_ENTER", ["KEY_LEFTCTRL"]], + "0x07bf": ["KEY_A", ["KEY_LEFTCTRL"]], + "0x07be": ["KEY_S", ["KEY_LEFTCTRL"]], + "0x07ba": ["KEY_D", ["KEY_LEFTCTRL"]], + "0x07b8": ["KEY_F", ["KEY_LEFTCTRL"]], + "0x07bd": ["KEY_G", ["KEY_LEFTCTRL"]], + "0x07b9": ["KEY_H", ["KEY_LEFTCTRL"]], + "0x0781": ["KEY_J", ["KEY_LEFTCTRL"]], + "0x0785": ["KEY_K", ["KEY_LEFTCTRL"]], + "0x0780": ["KEY_L", ["KEY_LEFTCTRL"]], + "0x0782": ["KEY_SEMICOLON", ["KEY_LEFTCTRL"]], + "0x0786": ["KEY_LEFT", null], + "0x0787": ["KEY_RIGHT", null], + "0x07bc": ["KEY_LEFTALT", ["KEY_LEFTCTRL"]], + "0x0797": ["KEY_Z", ["KEY_LEFTCTRL"]], + "0x0796": ["KEY_X", ["KEY_LEFTCTRL"]], + "0x0792": ["KEY_C", ["KEY_LEFTCTRL"]], + "0x0790": ["KEY_V", ["KEY_LEFTCTRL"]], + "0x0795": ["KEY_B", ["KEY_LEFTCTRL"]], + "0x0793": ["KEY_N", ["KEY_LEFTCTRL"]], + "0x07a5": ["KEY_M", ["KEY_LEFTCTRL"]], + "0x07a0": ["KEY_COMMA", ["KEY_LEFTCTRL"]], + "0x07a2": ["KEY_DOT", ["KEY_LEFTCTRL"]], + "0x07a6": ["KEY_SLASH", ["KEY_LEFTCTRL"]], + "0x07a1": ["KEY_SPACE", ["KEY_LEFTCTRL"]], + "0x07a7": [null, null], + "0x07dc": ["KEY_ESC", ["KEY_LEFTMETA"]], + "0x07df": ["KEY_1", ["KEY_LEFTMETA"]], + "0x07de": ["KEY_2", ["KEY_LEFTMETA"]], + "0x07da": ["KEY_3", ["KEY_LEFTMETA"]], + "0x07d8": ["KEY_4", ["KEY_LEFTMETA"]], + "0x07dd": ["KEY_5", ["KEY_LEFTMETA"]], + "0x07db": ["KEY_6", ["KEY_LEFTMETA"]], + "0x07f3": ["KEY_7", ["KEY_LEFTMETA"]], + "0x07f5": ["KEY_8", ["KEY_LEFTMETA"]], + "0x07f0": ["KEY_9", ["KEY_LEFTMETA"]], + "0x07f2": ["KEY_0", ["KEY_LEFTMETA"]], + "0x07f6": ["KEY_MINUS", ["KEY_LEFTMETA"]], + "0x07f7": ["KEY_EQUAL", ["KEY_LEFTMETA"]], + "0x07f4": ["KEY_BACKSPACE", ["KEY_LEFTMETA"]], + "0x07e3": ["KEY_TAB", ["KEY_LEFTMETA"]], + "0x07ef": ["KEY_Q", ["KEY_LEFTSHIFT", "KEY_LEFTMETA"]], + "0x07e0": ["KEY_W", ["KEY_LEFTMETA"]], + "0x07e2": ["KEY_E", ["KEY_LEFTMETA"]], + "0x07e6": ["KEY_R", ["KEY_LEFTMETA"]], + "0x07e1": ["KEY_T", ["KEY_LEFTMETA"]], + "0x07e7": ["KEY_Y", ["KEY_LEFTMETA"]], + "0x07cb": ["KEY_U", ["KEY_LEFTMETA"]], + "0x07cd": ["KEY_I", ["KEY_LEFTMETA"]], + "0x07c8": ["KEY_O", ["KEY_LEFTMETA"]], + "0x07ca": ["KEY_P", ["KEY_LEFTMETA"]], + "0x07ce": ["KEY_PAGEUP", null], + "0x07cf": ["KEY_PAGEDOWN", null], + "0x07cc": ["KEY_ENTER", ["KEY_LEFTMETA"]], + "0x07ff": ["KEY_A", ["KEY_LEFTMETA"]], + "0x07fe": ["KEY_S", ["KEY_LEFTMETA"]], + "0x07fa": ["KEY_D", ["KEY_LEFTMETA"]], + "0x07f8": ["KEY_F", ["KEY_LEFTMETA"]], + "0x07fd": ["KEY_G", ["KEY_LEFTMETA"]], + "0x07f9": ["KEY_H", ["KEY_LEFTMETA"]], + "0x07c1": ["KEY_J", ["KEY_LEFTMETA"]], + "0x07c5": ["KEY_K", ["KEY_LEFTMETA"]], + "0x07c0": ["KEY_L", ["KEY_LEFTMETA"]], + "0x07c2": ["KEY_SEMICOLON", ["KEY_LEFTMETA"]], + "0x07c6": ["KEY_HOME", null], + "0x07c7": ["KEY_END", null], + "0x07fb": ["KEY_S", ["KEY_LEFTSHIFT"]], + "0x07fc": ["KEY_LEFTALT", ["KEY_LEFTMETA"]], + "0x07d7": ["KEY_Z", ["KEY_LEFTMETA"]], + "0x07d6": ["KEY_X", ["KEY_LEFTMETA"]], + "0x07d2": ["KEY_C", ["KEY_LEFTMETA"]], + "0x07d0": ["KEY_V", ["KEY_LEFTMETA"]], + "0x07d5": ["KEY_B", ["KEY_LEFTMETA"]], + "0x07e3": ["KEY_N", ["KEY_LEFTMETA"]], + "0x07e5": ["KEY_M", ["KEY_LEFTMETA"]], + "0x07e0": ["KEY_COMMA", ["KEY_LEFTMETA"]], + "0x07e2": ["KEY_DOT", ["KEY_LEFTMETA"]], + "0x07e6": ["KEY_SLASH", ["KEY_LEFTMETA"]], + "0x07e1": ["KEY_SPACE", ["KEY_LEFTMETA"]], + "0x07e7": [null, null], + "0x051c": ["KEY_ESC", ["KEY_LEFTALT"]], + "0x051f": ["KEY_1", ["KEY_LEFTALT"]], + "0x051e": ["KEY_2", ["KEY_LEFTALT"]], + "0x051a": ["KEY_3", ["KEY_LEFTALT"]], + "0x0518": ["KEY_4", ["KEY_LEFTALT"]], + "0x051d": ["KEY_5", ["KEY_LEFTALT"]], + "0x051b": ["KEY_6", ["KEY_LEFTALT"]], + "0x0533": ["KEY_7", ["KEY_LEFTALT"]], + "0x0535": ["KEY_8", ["KEY_LEFTALT"]], + "0x0530": ["KEY_9", ["KEY_LEFTALT"]], + "0x0532": ["KEY_0", ["KEY_LEFTALT"]], + "0x0536": ["KEY_COMMA", ["KEY_LEFTALT", "KEY_LEFTSHIFT"]], + "0x0537": ["KEY_DOT", ["KEY_LEFTALT", "KEY_LEFTSHIFT"]], + "0x0534": ["KEY_BACKSPACE", ["KEY_LEFTALT"]], + "0x052c": ["KEY_TAB", ["KEY_LEFTALT"]], + "0x052f": ["KEY_Q", ["KEY_LEFTALT"]], + "0x052e": ["KEY_W", ["KEY_LEFTALT"]], + "0x052a": ["KEY_E", ["KEY_LEFTALT"]], + "0x0528": ["KEY_R", ["KEY_LEFTALT"]], + "0x052d": ["KEY_T", ["KEY_LEFTALT"]], + "0x052b": ["KEY_Y", ["KEY_LEFTALT"]], + "0x050b": ["KEY_U", ["KEY_LEFTALT"]], + "0x050d": ["KEY_I", ["KEY_LEFTALT"]], + "0x0508": ["KEY_O", ["KEY_LEFTALT"]], + "0x050a": ["KEY_P", ["KEY_LEFTALT"]], + "0x050e": ["KEY_MINUS", ["KEY_LEFTALT"]], + "0x050f": ["KEY_DOWN", ["KEY_LEFTALT"]], + "0x050c": ["KEY_ENTER", ["KEY_LEFTALT"]], + "0x053f": ["KEY_A", ["KEY_LEFTALT"]], + "0x053e": ["KEY_S", ["KEY_LEFTALT"]], + "0x053a": ["KEY_D", ["KEY_LEFTALT"]], + "0x0538": ["KEY_F", ["KEY_LEFTALT"]], + "0x053d": ["KEY_G", ["KEY_LEFTALT"]], + "0x0539": ["KEY_H", ["KEY_LEFTALT"]], + "0x0501": ["KEY_J", ["KEY_LEFTALT"]], + "0x0505": ["KEY_K", ["KEY_LEFTALT"]], + "0x0500": ["KEY_L", ["KEY_LEFTALT"]], + "0x0502": ["KEY_SEMICOLON", ["KEY_LEFTALT"]], + "0x0506": ["KEY_EQUAL", ["KEY_LEFTSHIFT", "KEY_LEFTALT"]], + "0x0507": ["KEY_RIGHT", ["KEY_LEFTALT"]], + "0x053c": ["KEY_LEFTALT", ["KEY_LEFTALT"]], + "0x0517": ["KEY_Z", ["KEY_LEFTALT"]], + "0x0516": ["KEY_X", ["KEY_LEFTALT"]], + "0x0512": ["KEY_C", ["KEY_LEFTALT"]], + "0x0510": ["KEY_V", ["KEY_LEFTALT"]], + "0x0515": ["KEY_B", ["KEY_LEFTALT"]], + "0x0523": ["KEY_N", ["KEY_LEFTALT"]], + "0x0525": ["KEY_M", ["KEY_LEFTALT"]], + "0x0520": ["KEY_COMMA", ["KEY_LEFTALT"]], + "0x0522": ["KEY_DOT", ["KEY_LEFTALT"]], + "0x0526": ["KEY_SLASH", ["KEY_LEFTALT"]], + "0x0521": ["KEY_SPACE", ["KEY_LEFTALT"]], + "0x0527": ["KEY_GRAVE", ["KEY_LEFTALT"]], + "0x031c": ["KEY_ESC", ["KEY_LEFTMETA"]], + "0x031f": ["KEY_1", ["KEY_LEFTMETA"]], + "0x031e": ["KEY_2", ["KEY_LEFTMETA"]], + "0x031a": ["KEY_3", ["KEY_LEFTMETA"]], + "0x0318": ["KEY_4", ["KEY_LEFTMETA"]], + "0x031d": ["KEY_5", ["KEY_LEFTMETA"]], + "0x031b": ["KEY_6", ["KEY_LEFTMETA"]], + "0x0333": ["KEY_7", ["KEY_LEFTMETA"]], + "0x0335": ["KEY_8", ["KEY_LEFTMETA"]], + "0x0330": ["KEY_9", ["KEY_LEFTMETA"]], + "0x0332": ["KEY_0", ["KEY_LEFTMETA"]], + "0x0336": ["KEY_COMMA", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x0337": ["KEY_DOT", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x0334": ["KEY_BACKSPACE", ["KEY_LEFTMETA"]], + "0x032c": ["KEY_TAB", ["KEY_LEFTMETA"]], + "0x032f": ["KEY_Q", ["KEY_LEFTMETA"]], + "0x032e": ["KEY_W", ["KEY_LEFTMETA"]], + "0x032a": ["KEY_E", ["KEY_LEFTMETA"]], + "0x0328": ["KEY_R", ["KEY_LEFTMETA"]], + "0x032d": ["KEY_T", ["KEY_LEFTMETA"]], + "0x032b": ["KEY_Y", ["KEY_LEFTMETA"]], + "0x030b": ["KEY_U", ["KEY_LEFTMETA"]], + "0x030d": ["KEY_I", ["KEY_LEFTMETA"]], + "0x0308": ["KEY_O", ["KEY_LEFTMETA"]], + "0x030a": ["KEY_P", ["KEY_LEFTMETA"]], + "0x030e": ["KEY_MINUS", ["KEY_LEFTMETA"]], + "0x030f": ["KEY_EQUAL", ["KEY_LEFTMETA"]], + "0x030c": ["KEY_ENTER", ["KEY_LEFTMETA"]], + "0x033f": ["KEY_A", ["KEY_LEFTMETA"]], + "0x033e": ["KEY_S", ["KEY_LEFTMETA"]], + "0x033a": ["KEY_D", ["KEY_LEFTMETA"]], + "0x0338": ["KEY_F", ["KEY_LEFTMETA"]], + "0x033d": ["KEY_G", ["KEY_LEFTMETA"]], + "0x0339": ["KEY_H", ["KEY_LEFTMETA"]], + "0x0301": ["KEY_J", ["KEY_LEFTMETA"]], + "0x0305": ["KEY_K", ["KEY_LEFTMETA"]], + "0x0300": ["KEY_L", ["KEY_LEFTMETA"]], + "0x0302": ["KEY_SEMICOLON", ["KEY_LEFTMETA"]], + "0x0306": ["KEY_EQUAL", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x0307": ["KEY_8", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x033c": ["KEY_LEFTALT", ["KEY_LEFTMETA"]], + "0x0317": ["KEY_Z", ["KEY_LEFTMETA"]], + "0x0316": ["KEY_X", ["KEY_LEFTMETA"]], + "0x0312": ["KEY_C", ["KEY_LEFTMETA"]], + "0x0310": ["KEY_V", ["KEY_LEFTMETA"]], + "0x0315": ["KEY_B", ["KEY_LEFTMETA"]], + "0x0323": ["KEY_N", ["KEY_LEFTMETA"]], + "0x0325": ["KEY_M", ["KEY_LEFTMETA"]], + "0x0320": ["KEY_COMMA", ["KEY_LEFTMETA"]], + "0x0322": ["KEY_DOT", ["KEY_LEFTMETA"]], + "0x0326": ["KEY_SLASH", ["KEY_LEFTMETA"]], + "0x0321": ["KEY_SPACE", ["KEY_LEFTMETA"]], + "0x0327": ["KEY_GRAVE", ["KEY_LEFTMETA"]], + "0x035c": ["KEY_ESC", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x035f": ["KEY_1", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x035e": ["KEY_2", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x035a": ["KEY_3", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x0358": ["KEY_4", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x035d": ["KEY_5", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x035b": ["KEY_6", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x0373": ["KEY_7", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x0375": ["KEY_8", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x0370": ["KEY_9", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x0372": ["KEY_0", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x0376": ["KEY_LEFTBRACE", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x0377": ["KEY_RIGHTBRACE", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x0374": ["KEY_BACKSPACE", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x036c": ["KEY_TAB", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x036f": ["KEY_Q", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x036e": ["KEY_W", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x036a": ["KEY_E", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x0368": ["KEY_R", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x036d": ["KEY_T", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x036b": ["KEY_Y", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x034b": ["KEY_U", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x034d": ["KEY_I", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x0348": ["KEY_O", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x034a": ["KEY_P", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x034e": ["KEY_MINUS", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x034f": ["KEY_BACKSLASH", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x034c": ["KEY_ENTER", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x037f": ["KEY_A", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x037e": ["KEY_S", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x037a": ["KEY_D", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x0378": ["KEY_F", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x037d": ["KEY_G", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x0379": ["KEY_H", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x0341": ["KEY_J", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x0345": ["KEY_K", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x0340": ["KEY_L", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x0342": ["KEY_SEMICOLON", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x0346": ["KEY_BACKSLASH", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x0347": ["KEY_6", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x037c": ["KEY_LEFTALT", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x0357": ["KEY_Z", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x0356": ["KEY_X", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x0352": ["KEY_C", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x0350": ["KEY_V", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x0355": ["KEY_B", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x0363": ["KEY_N", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x0365": ["KEY_M", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x0360": ["KEY_LEFTBRACE", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x0362": ["KEY_RIGHTBRACE", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x0366": ["KEY_SLASH", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x0361": ["KEY_SPACE", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x0367": ["KEY_GRAVE", ["KEY_LEFTMETA", "KEY_LEFTSHIFT"]], + "0x07eb": ["KEY_B", ["KEY_LEFTSHIFT", "KEY_LEFTCTRL"]], + "0x07ec": ["KEY_TAB", ["KEY_LEFTSHIFT", "KEY_LEFTCTRL"]] +} diff --git a/keytari.py b/keytari.py new file mode 100755 index 0000000..0307c40 --- /dev/null +++ b/keytari.py @@ -0,0 +1,98 @@ +#!/usr/bin/env python3 + +import signal +import struct +import sys +import json +import socketserver +import socket +from evdev import uinput, ecodes as e + + +def genconfig(filename): + result = dict() + with open(filename, 'r') as conffile: + config = json.loads(conffile.read()) + for key in config.keys(): + if config[key][0] is not None: + outkey = e.__dict__[config[key][0]] + modifiers = None + if config[key][1] is not None: + modifiers = [e.__dict__[x] for x in config[key][1]] + result[int(key, 16)] = [outkey, modifiers] + return result + + +keymap = dict() + + +class MyTCPHandler(socketserver.BaseRequestHandler): + """ + The request handler class for our server. + + It is instantiated once per connection to the server, and must + override the handle() method to implement communication to the + client. + """ + + def handle(self): + global keymap + self.request.setblocking(False) + self.request.settimeout(1) + with uinput.UInput() as ui: + while True: + try: + # self.request is the TCP socket connected to the client + self.data = struct.unpack(">H", self.request.recv(2))[0] + if not self.data: + return + if self.data in keymap.keys(): + key = keymap[self.data] + # print("%x: %s" % (self.data, key)) + if key[1] is not None: + for k in key[1]: + ui.write(e.EV_KEY, k, 1) + ui.write(e.EV_KEY, key[0], 1) + ui.syn() + if key[1] is not None: + for k in key[1]: + ui.write(e.EV_KEY, k, 0) + ui.write(e.EV_KEY, key[0], 0) + ui.syn() + else: + print("KEY CODE %d (%x) NOT HANDLED" % (self.data, self.data)) + except TimeoutError: + pass + + +def load_config(): + global keymap + keymap = genconfig('/etc/keytari/keymap.json') + + +server = None + + +def int_handler(sig, frame): + server.socket.close() + sys.exit(0) + + +def reload_handler(sig, frame): + load_config() + + +if __name__ == "__main__": + HOST, PORT = "0.0.0.0", 2077 + + load_config() + signal.signal(signal.SIGINT, int_handler) + signal.signal(signal.SIGHUP, reload_handler) + # Create the server, binding to localhost on port 9999 + server = socketserver.TCPServer((HOST, PORT), MyTCPHandler) + server.allow_reuse_address = True + server.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + server.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) + # Activate the server; this will keep running until you + # interrupt the program with Ctrl-C + server.serve_forever()