macro_recorder: move recorder aliases to keycodes.py

main
Ilya Zhuravlev 2020-12-26 04:47:01 -05:00
parent 65a1e9d7c6
commit b15a017750
3 changed files with 104 additions and 307 deletions

View File

@ -5,8 +5,9 @@
class Keycode:
masked_keycodes = set()
recorder_alias_to_keycode = dict()
def __init__(self, code, qmk_id, label, tooltip=None, masked=False, printable=None):
def __init__(self, code, qmk_id, label, tooltip=None, masked=False, printable=None, recorder_alias=None):
self.code = code
self.qmk_id = qmk_id
self.label = label
@ -17,9 +18,19 @@ class Keycode:
# if this is printable keycode, what character does it normally output (i.e. non-shifted state)
self.printable = printable
if recorder_alias:
for alias in recorder_alias:
if alias in self.recorder_alias_to_keycode:
raise RuntimeError("Misconfigured: two keycodes claim the same alias {}".format(alias))
self.recorder_alias_to_keycode[alias] = self
if masked:
self.masked_keycodes.add(code)
@classmethod
def find_by_recorder_alias(cls, alias):
return cls.recorder_alias_to_keycode.get(alias)
K = Keycode
@ -29,85 +40,85 @@ KEYCODES_SPECIAL = [
]
KEYCODES_BASIC = [
K(0x04, "KC_A", "A", printable="a"),
K(0x05, "KC_B", "B", printable="b"),
K(0x06, "KC_C", "C", printable="c"),
K(0x07, "KC_D", "D", printable="d"),
K(0x08, "KC_E", "E", printable="e"),
K(0x09, "KC_F", "F", printable="f"),
K(0x0A, "KC_G", "G", printable="g"),
K(0x0B, "KC_H", "H", printable="h"),
K(0x0C, "KC_I", "I", printable="i"),
K(0x0D, "KC_J", "J", printable="j"),
K(0x0E, "KC_K", "K", printable="k"),
K(0x0F, "KC_L", "L", printable="l"),
K(0x10, "KC_M", "M", printable="m"),
K(0x11, "KC_N", "N", printable="n"),
K(0x12, "KC_O", "O", printable="o"),
K(0x13, "KC_P", "P", printable="p"),
K(0x14, "KC_Q", "Q", printable="q"),
K(0x15, "KC_R", "R", printable="r"),
K(0x16, "KC_S", "S", printable="s"),
K(0x17, "KC_T", "T", printable="t"),
K(0x18, "KC_U", "U", printable="u"),
K(0x19, "KC_V", "V", printable="v"),
K(0x1A, "KC_W", "W", printable="w"),
K(0x1B, "KC_X", "X", printable="x"),
K(0x1C, "KC_Y", "Y", printable="y"),
K(0x1D, "KC_Z", "Z", printable="z"),
K(0x1E, "KC_1", "!\n1", printable="1"),
K(0x1F, "KC_2", "@\n2", printable="2"),
K(0x20, "KC_3", "#\n3", printable="3"),
K(0x21, "KC_4", "$\n4", printable="4"),
K(0x22, "KC_5", "%\n5", printable="5"),
K(0x23, "KC_6", "^\n6", printable="6"),
K(0x24, "KC_7", "&\n7", printable="7"),
K(0x25, "KC_8", "*\n8", printable="8"),
K(0x26, "KC_9", "(\n9", printable="9"),
K(0x27, "KC_0", ")\n0", printable="0"),
K(0x28, "KC_ENTER", "Enter"),
K(0x29, "KC_ESCAPE", "Esc"),
K(0x2A, "KC_BSPACE", "Bksp"),
K(0x2B, "KC_TAB", "Tab"),
K(0x2C, "KC_SPACE", "Space"),
K(0x2D, "KC_MINUS", "_\n-", printable="-"),
K(0x2E, "KC_EQUAL", "+\n=", printable="="),
K(0x2F, "KC_LBRACKET", "{\n[", printable="["),
K(0x30, "KC_RBRACKET", "}\n]", printable="]"),
K(0x31, "KC_BSLASH", "|\n\\", printable="\\"),
K(0x33, "KC_SCOLON", ":\n;", printable=";"),
K(0x34, "KC_QUOTE", "\"\n'", printable="'"),
K(0x35, "KC_GRAVE", "~\n`", printable="`"),
K(0x36, "KC_COMMA", "<\n,", printable=","),
K(0x37, "KC_DOT", ">\n.", printable="."),
K(0x38, "KC_SLASH", "?\n/", printable="/"),
K(0x39, "KC_CAPSLOCK", "Caps\nLock"),
K(0x3A, "KC_F1", "F1"),
K(0x3B, "KC_F2", "F2"),
K(0x3C, "KC_F3", "F3"),
K(0x3D, "KC_F4", "F4"),
K(0x3E, "KC_F5", "F5"),
K(0x3F, "KC_F6", "F6"),
K(0x40, "KC_F7", "F7"),
K(0x41, "KC_F8", "F8"),
K(0x42, "KC_F9", "F9"),
K(0x43, "KC_F10", "F10"),
K(0x44, "KC_F11", "F11"),
K(0x45, "KC_F12", "F12"),
K(0x04, "KC_A", "A", printable="a", recorder_alias=["a"]),
K(0x05, "KC_B", "B", printable="b", recorder_alias=["b"]),
K(0x06, "KC_C", "C", printable="c", recorder_alias=["c"]),
K(0x07, "KC_D", "D", printable="d", recorder_alias=["d"]),
K(0x08, "KC_E", "E", printable="e", recorder_alias=["e"]),
K(0x09, "KC_F", "F", printable="f", recorder_alias=["f"]),
K(0x0A, "KC_G", "G", printable="g", recorder_alias=["g"]),
K(0x0B, "KC_H", "H", printable="h", recorder_alias=["h"]),
K(0x0C, "KC_I", "I", printable="i", recorder_alias=["i"]),
K(0x0D, "KC_J", "J", printable="j", recorder_alias=["j"]),
K(0x0E, "KC_K", "K", printable="k", recorder_alias=["k"]),
K(0x0F, "KC_L", "L", printable="l", recorder_alias=["l"]),
K(0x10, "KC_M", "M", printable="m", recorder_alias=["m"]),
K(0x11, "KC_N", "N", printable="n", recorder_alias=["n"]),
K(0x12, "KC_O", "O", printable="o", recorder_alias=["o"]),
K(0x13, "KC_P", "P", printable="p", recorder_alias=["p"]),
K(0x14, "KC_Q", "Q", printable="q", recorder_alias=["q"]),
K(0x15, "KC_R", "R", printable="r", recorder_alias=["r"]),
K(0x16, "KC_S", "S", printable="s", recorder_alias=["s"]),
K(0x17, "KC_T", "T", printable="t", recorder_alias=["t"]),
K(0x18, "KC_U", "U", printable="u", recorder_alias=["u"]),
K(0x19, "KC_V", "V", printable="v", recorder_alias=["v"]),
K(0x1A, "KC_W", "W", printable="w", recorder_alias=["w"]),
K(0x1B, "KC_X", "X", printable="x", recorder_alias=["x"]),
K(0x1C, "KC_Y", "Y", printable="y", recorder_alias=["y"]),
K(0x1D, "KC_Z", "Z", printable="z", recorder_alias=["z"]),
K(0x1E, "KC_1", "!\n1", printable="1", recorder_alias=["1"]),
K(0x1F, "KC_2", "@\n2", printable="2", recorder_alias=["2"]),
K(0x20, "KC_3", "#\n3", printable="3", recorder_alias=["3"]),
K(0x21, "KC_4", "$\n4", printable="4", recorder_alias=["4"]),
K(0x22, "KC_5", "%\n5", printable="5", recorder_alias=["5"]),
K(0x23, "KC_6", "^\n6", printable="6", recorder_alias=["6"]),
K(0x24, "KC_7", "&\n7", printable="7", recorder_alias=["7"]),
K(0x25, "KC_8", "*\n8", printable="8", recorder_alias=["8"]),
K(0x26, "KC_9", "(\n9", printable="9", recorder_alias=["9"]),
K(0x27, "KC_0", ")\n0", printable="0", recorder_alias=["0"]),
K(0x28, "KC_ENTER", "Enter", recorder_alias=["enter"]),
K(0x29, "KC_ESCAPE", "Esc", recorder_alias=["esc"]),
K(0x2A, "KC_BSPACE", "Bksp", recorder_alias=["backspace"]),
K(0x2B, "KC_TAB", "Tab", recorder_alias=["tab"]),
K(0x2C, "KC_SPACE", "Space", recorder_alias=["space"]),
K(0x2D, "KC_MINUS", "_\n-", printable="-", recorder_alias=["-"]),
K(0x2E, "KC_EQUAL", "+\n=", printable="=", recorder_alias=["="]),
K(0x2F, "KC_LBRACKET", "{\n[", printable="[", recorder_alias=["["]),
K(0x30, "KC_RBRACKET", "}\n]", printable="]", recorder_alias=["]"]),
K(0x31, "KC_BSLASH", "|\n\\", printable="\\", recorder_alias=["\\"]),
K(0x33, "KC_SCOLON", ":\n;", printable=";", recorder_alias=[";"]),
K(0x34, "KC_QUOTE", "\"\n'", printable="'", recorder_alias=["'"]),
K(0x35, "KC_GRAVE", "~\n`", printable="`", recorder_alias=["`"]),
K(0x36, "KC_COMMA", "<\n,", printable=",", recorder_alias=[","]),
K(0x37, "KC_DOT", ">\n.", printable=".", recorder_alias=["."]),
K(0x38, "KC_SLASH", "?\n/", printable="/", recorder_alias=["/"]),
K(0x39, "KC_CAPSLOCK", "Caps\nLock", recorder_alias=["caps lock"]),
K(0x3A, "KC_F1", "F1", recorder_alias=["f1"]),
K(0x3B, "KC_F2", "F2", recorder_alias=["f2"]),
K(0x3C, "KC_F3", "F3", recorder_alias=["f3"]),
K(0x3D, "KC_F4", "F4", recorder_alias=["f4"]),
K(0x3E, "KC_F5", "F5", recorder_alias=["f5"]),
K(0x3F, "KC_F6", "F6", recorder_alias=["f6"]),
K(0x40, "KC_F7", "F7", recorder_alias=["f7"]),
K(0x41, "KC_F8", "F8", recorder_alias=["f8"]),
K(0x42, "KC_F9", "F9", recorder_alias=["f9"]),
K(0x43, "KC_F10", "F10", recorder_alias=["f10"]),
K(0x44, "KC_F11", "F11", recorder_alias=["f11"]),
K(0x45, "KC_F12", "F12", recorder_alias=["f12"]),
K(0x46, "KC_PSCREEN", "Print\nScreen"),
K(0x47, "KC_SCROLLLOCK", "Scroll\nLock"),
K(0x48, "KC_PAUSE", "Pause"),
K(0x49, "KC_INSERT", "Insert"),
K(0x4A, "KC_HOME", "Home"),
K(0x4B, "KC_PGUP", "Page\nUp"),
K(0x4C, "KC_DELETE", "Del"),
K(0x4D, "KC_END", "End"),
K(0x4E, "KC_PGDOWN", "Page\nDown"),
K(0x4F, "KC_RIGHT", "Right"),
K(0x50, "KC_LEFT", "Left"),
K(0x51, "KC_DOWN", "Down"),
K(0x52, "KC_UP", "Up"),
K(0x53, "KC_NUMLOCK", "Num\nLock"),
K(0x47, "KC_SCROLLLOCK", "Scroll\nLock", recorder_alias=["scroll lock"]),
K(0x48, "KC_PAUSE", "Pause", recorder_alias=["pause", "break"]),
K(0x49, "KC_INSERT", "Insert", recorder_alias=["insert"]),
K(0x4A, "KC_HOME", "Home", recorder_alias=["home"]),
K(0x4B, "KC_PGUP", "Page\nUp", recorder_alias=["page up"]),
K(0x4C, "KC_DELETE", "Del", recorder_alias=["delete"]),
K(0x4D, "KC_END", "End", recorder_alias=["end"]),
K(0x4E, "KC_PGDOWN", "Page\nDown", recorder_alias=["page down"]),
K(0x4F, "KC_RIGHT", "Right", recorder_alias=["right"]),
K(0x50, "KC_LEFT", "Left", recorder_alias=["left"]),
K(0x51, "KC_DOWN", "Down", recorder_alias=["down"]),
K(0x52, "KC_UP", "Up", recorder_alias=["up"]),
K(0x53, "KC_NUMLOCK", "Num\nLock", recorder_alias=["num lock"]),
K(0x54, "KC_KP_SLASH", "/"),
K(0x55, "KC_KP_ASTERISK", "*"),
K(0x56, "KC_KP_MINUS", "-"),
@ -124,18 +135,18 @@ KEYCODES_BASIC = [
K(0x61, "KC_KP_9", "9"),
K(0x62, "KC_KP_0", "0"),
K(0x63, "KC_KP_DOT", "."),
K(0x65, "KC_APPLICATION", "Menu"),
K(0x65, "KC_APPLICATION", "Menu", recorder_alias=["menu", "left menu", "right menu"]),
K(0x67, "KC_KP_EQUAL", "="),
K(0x85, "KC_KP_COMMA", ","),
K(0xE0, "KC_LCTRL", "LCtrl"),
K(0xE1, "KC_LSHIFT", "LShift"),
K(0xE2, "KC_LALT", "LAlt"),
K(0xE3, "KC_LGUI", "LGui"),
K(0xE4, "KC_RCTRL", "RCtrl"),
K(0xE5, "KC_RSHIFT", "RShift"),
K(0xE0, "KC_LCTRL", "LCtrl", recorder_alias=["left ctrl", "ctrl"]),
K(0xE1, "KC_LSHIFT", "LShift", recorder_alias=["left shift", "shift"]),
K(0xE2, "KC_LALT", "LAlt", recorder_alias=["alt"]),
K(0xE3, "KC_LGUI", "LGui", recorder_alias=["left windows", "windows"]),
K(0xE4, "KC_RCTRL", "RCtrl", recorder_alias=["right ctrl"]),
K(0xE5, "KC_RSHIFT", "RShift", recorder_alias=["right shift"]),
K(0xE6, "KC_RALT", "RAlt"),
K(0xE7, "KC_RGUI", "RGui"),
K(0xE7, "KC_RGUI", "RGui", recorder_alias=["right windows"]),
]
KEYCODES_SHIFTED = [

View File

@ -6,7 +6,7 @@ from PyQt5.QtCore import pyqtSignal, QProcess
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QPushButton, QApplication
from fbs_runtime.application_context import is_frozen
from keycodes import KEYCODES_BASIC
from keycodes import Keycode
from macro_key import KeyUp, KeyDown
from util import tr
@ -16,95 +16,6 @@ class LinuxRecorder(QWidget):
keystroke = pyqtSignal(object)
stopped = pyqtSignal()
mapping_qmk_id = {
"esc": "KC_ESCAPE",
"1": "KC_1",
"2": "KC_2",
"3": "KC_3",
"4": "KC_4",
"5": "KC_5",
"6": "KC_6",
"7": "KC_7",
"8": "KC_8",
"9": "KC_9",
"0": "KC_0",
"-": "KC_MINUS",
"=": "KC_EQUAL",
"backspace": "KC_BSPACE",
"tab": "KC_TAB",
"q": "KC_Q",
"w": "KC_W",
"e": "KC_E",
"r": "KC_R",
"t": "KC_T",
"y": "KC_Y",
"u": "KC_U",
"i": "KC_I",
"o": "KC_O",
"p": "KC_P",
"[": "KC_LBRACKET",
"]": "KC_RBRACKET",
"enter": "KC_ENTER",
"ctrl": "KC_LCTRL",
"a": "KC_A",
"s": "KC_S",
"d": "KC_D",
"f": "KC_F",
"g": "KC_G",
"h": "KC_H",
"j": "KC_J",
"k": "KC_K",
"l": "KC_L",
";": "KC_SCOLON",
"'": "KC_QUOTE",
"`": "KC_GRAVE",
"shift": "KC_LSHIFT",
"\\": "KC_BSLASH",
"z": "KC_Z",
"x": "KC_X",
"c": "KC_C",
"v": "KC_V",
"b": "KC_B",
"n": "KC_N",
"m": "KC_M",
",": "KC_COMMA",
".": "KC_DOT",
"/": "KC_SLASH",
"alt": "KC_LALT",
"space": "KC_SPACE",
"caps lock": "KC_CAPSLOCK",
"f1": "KC_F1",
"f2": "KC_F2",
"f3": "KC_F3",
"f4": "KC_F4",
"f5": "KC_F5",
"f6": "KC_F6",
"f7": "KC_F7",
"f8": "KC_F8",
"f9": "KC_F9",
"f10": "KC_F10",
"f11": "KC_F11",
"f12": "KC_F12",
"num lock": "KC_NUMLOCK",
"scroll lock": "KC_SCROLLLOCK",
"break": "KC_PAUSE",
"home": "KC_HOME",
"up": "KC_UP",
"page up": "KC_PGUP",
"left": "KC_LEFT",
"right": "KC_RIGHT",
"end": "KC_END",
"down": "KC_DOWN",
"page down": "KC_PGDOWN",
"insert": "KC_INSERT",
"delete": "KC_DELETE",
"pause": "KC_PAUSE",
"windows": "KC_LGUI",
"menu": "KC_APPLICATION",
}
mapping = dict()
def __init__(self):
super().__init__()
@ -145,30 +56,11 @@ class LinuxRecorder(QWidget):
self.hide()
self.stopped.emit()
def action2cls(self, action):
if action == "up":
return KeyUp
elif action == "down":
return KeyDown
else:
raise RuntimeError("unexpected action={}".format(action))
def key2code(self, key):
return self.mapping.get(key, None)
def on_output(self):
if self.process.canReadLine():
line = bytes(self.process.readLine()).decode("utf-8")
action, key = line.strip().split(":")
code = self.key2code(key)
code = Keycode.find_by_recorder_alias(key)
if code is not None:
self.keystroke.emit(self.action2cls(action)(code))
for linux, qmk in LinuxRecorder.mapping_qmk_id.items():
for k in KEYCODES_BASIC:
if k.qmk_id == qmk:
LinuxRecorder.mapping[linux] = k
break
if linux not in LinuxRecorder.mapping:
raise RuntimeError("Misconfigured - cannot determine QMK keycode value for {}:{} pair".format(linux, qmk))
action2cls = {"down": KeyDown, "up": KeyUp}
self.keystroke.emit(action2cls[action](code))

View File

@ -5,7 +5,7 @@ from PyQt5 import QtCore
from PyQt5.QtCore import pyqtSignal
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QPushButton, QApplication
from keycodes import KEYCODES_BASIC
from keycodes import Keycode
from macro_key import KeyUp, KeyDown
from util import tr
@ -15,103 +15,6 @@ class WindowsRecorder(QWidget):
keystroke = pyqtSignal(object)
stopped = pyqtSignal()
mapping_qmk_id = {
"esc": "KC_ESCAPE",
"1": "KC_1",
"2": "KC_2",
"3": "KC_3",
"4": "KC_4",
"5": "KC_5",
"6": "KC_6",
"7": "KC_7",
"8": "KC_8",
"9": "KC_9",
"0": "KC_0",
"-": "KC_MINUS",
"=": "KC_EQUAL",
"backspace": "KC_BSPACE",
"tab": "KC_TAB",
"q": "KC_Q",
"w": "KC_W",
"e": "KC_E",
"r": "KC_R",
"t": "KC_T",
"y": "KC_Y",
"u": "KC_U",
"i": "KC_I",
"o": "KC_O",
"p": "KC_P",
"[": "KC_LBRACKET",
"]": "KC_RBRACKET",
"enter": "KC_ENTER",
"ctrl": "KC_LCTRL",
"a": "KC_A",
"s": "KC_S",
"d": "KC_D",
"f": "KC_F",
"g": "KC_G",
"h": "KC_H",
"j": "KC_J",
"k": "KC_K",
"l": "KC_L",
";": "KC_SCOLON",
"'": "KC_QUOTE",
"`": "KC_GRAVE",
"shift": "KC_LSHIFT",
"\\": "KC_BSLASH",
"z": "KC_Z",
"x": "KC_X",
"c": "KC_C",
"v": "KC_V",
"b": "KC_B",
"n": "KC_N",
"m": "KC_M",
",": "KC_COMMA",
".": "KC_DOT",
"/": "KC_SLASH",
"alt": "KC_LALT",
"space": "KC_SPACE",
"caps lock": "KC_CAPSLOCK",
"f1": "KC_F1",
"f2": "KC_F2",
"f3": "KC_F3",
"f4": "KC_F4",
"f5": "KC_F5",
"f6": "KC_F6",
"f7": "KC_F7",
"f8": "KC_F8",
"f9": "KC_F9",
"f10": "KC_F10",
"f11": "KC_F11",
"f12": "KC_F12",
"num lock": "KC_NUMLOCK",
"scroll lock": "KC_SCROLLLOCK",
"break": "KC_PAUSE",
"home": "KC_HOME",
"up": "KC_UP",
"page up": "KC_PGUP",
"left": "KC_LEFT",
"right": "KC_RIGHT",
"end": "KC_END",
"down": "KC_DOWN",
"page down": "KC_PGDOWN",
"insert": "KC_INSERT",
"delete": "KC_DELETE",
"pause": "KC_PAUSE",
"windows": "KC_LGUI",
"menu": "KC_APPLICATION",
"left windows": "KC_LGUI",
"right windows": "KC_RGUI",
"left shift": "KC_LSHIFT",
"right shift": "KC_RSHIFT",
"left ctrl": "KC_LCTRL",
"right ctrl": "KC_RCTRL",
"left menu": "KC_APPLICATION",
"right menu": "KC_APPLICATION",
}
mapping = dict()
def __init__(self):
super().__init__()
@ -148,16 +51,7 @@ class WindowsRecorder(QWidget):
self.stopped.emit()
def on_key(self, ev):
code = self.mapping.get(ev.name)
code = Keycode.find_by_recorder_alias(ev.name)
if code is not None:
action2cls = {"down": KeyDown, "up": KeyUp}
self.keystroke.emit(action2cls[ev.event_type](code))
for windows, qmk in WindowsRecorder.mapping_qmk_id.items():
for k in KEYCODES_BASIC:
if k.qmk_id == qmk:
WindowsRecorder.mapping[windows] = k
break
if windows not in WindowsRecorder.mapping:
raise RuntimeError("Misconfigured - cannot determine QMK keycode value for {}:{} pair".format(windows, qmk))