diff options
Diffstat (limited to 'tools/razer-quirks-lister.py')
-rwxr-xr-x | tools/razer-quirks-lister.py | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/tools/razer-quirks-lister.py b/tools/razer-quirks-lister.py new file mode 100755 index 00000000..6069ade7 --- /dev/null +++ b/tools/razer-quirks-lister.py @@ -0,0 +1,83 @@ +#!/usr/bin/env python3 +# +# SPDX-License-Identifier: MIT +# +# This utility clones the openrazer repository, extracts the known VID/PID combos +# for "RazerBlade" keyboards and spits out a libinput-compatible quirks file +# with those keyboards listed as "Internal". +# +# Usage: +# $ cd path/to/libinput.git/ +# $ ./tools/razer-quirks-list.py + +from pathlib import Path +from collections import namedtuple +import tempfile +import shutil +import subprocess +import sys + + +KeyboardDescriptor = namedtuple("KeyboardDescriptor", ["vid", "pid", "name"]) + +with tempfile.TemporaryDirectory() as tmpdir: + # Clone the openrazer directory and add its Python modyle basedir + # to our sys.path so we can import it + subprocess.run( + [ + "git", + "clone", + "--quiet", + "--depth=1", + "https://github.com/openrazer/openrazer", + ], + cwd=tmpdir, + check=True, + ) + sys.path.append(str(Path(tmpdir) / "openrazer" / "daemon")) + + import openrazer_daemon.hardware.keyboards as razer_keyboards # type: ignore + + keyboards: list[KeyboardDescriptor] = [] + + # All classnames for the keyboards we care about start with RazerBlade + for clsname in filter(lambda c: c.startswith("RazerBlade"), dir(razer_keyboards)): + kbd = getattr(razer_keyboards, clsname) + try: + k = KeyboardDescriptor(name=clsname, vid=kbd.USB_VID, pid=kbd.USB_PID) + keyboards.append(k) + except AttributeError: + continue + + tmpfile = Path(tmpdir) / "30-vendor-razer.quirks" + try: + quirksfile = next(Path("quirks").glob("30-vendor-razer.quirks")) + except StopIteration: + print("Unable to find the razer quirks file.") + raise SystemExit(1) + + with open(tmpfile, "w") as output: + with open(quirksfile) as input: + for line in input: + output.write(line) + if line.startswith("# AUTOGENERATED"): + output.write("\n") + break + + for kbd in sorted(keyboards, key=lambda k: k.vid << 16 | k.pid): + print( + "\n".join( + ( + f"[{kbd.name} Keyboard]", + "MatchUdevType=keyboard", + "MatchBus=usb", + f"MatchVendor=0x{kbd.vid:04X}", + f"MatchProduct=0x{kbd.pid:04X}", + "AttrKeyboardIntegration=internal", + ) + ), + file=output, + ) + print(file=output) + + shutil.copy(tmpfile, quirksfile) |