From b15a017750e5fa75b3891a0847977dcd16a3e687 Mon Sep 17 00:00:00 2001 From: Ilya Zhuravlev Date: Sat, 26 Dec 2020 04:47:01 -0500 Subject: [PATCH] macro_recorder: move recorder aliases to keycodes.py --- src/main/python/keycodes.py | 185 ++++++++++++---------- src/main/python/macro_recorder_linux.py | 116 +------------- src/main/python/macro_recorder_windows.py | 110 +------------ 3 files changed, 104 insertions(+), 307 deletions(-) diff --git a/src/main/python/keycodes.py b/src/main/python/keycodes.py index 536ee81..8b14766 100644 --- a/src/main/python/keycodes.py +++ b/src/main/python/keycodes.py @@ -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 = [ diff --git a/src/main/python/macro_recorder_linux.py b/src/main/python/macro_recorder_linux.py index e1dd108..75f0982 100644 --- a/src/main/python/macro_recorder_linux.py +++ b/src/main/python/macro_recorder_linux.py @@ -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)) diff --git a/src/main/python/macro_recorder_windows.py b/src/main/python/macro_recorder_windows.py index e03fd93..9a0e0c5 100644 --- a/src/main/python/macro_recorder_windows.py +++ b/src/main/python/macro_recorder_windows.py @@ -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))