summaryrefslogtreecommitdiff
path: root/tools/razer-quirks-lister.py
diff options
context:
space:
mode:
Diffstat (limited to 'tools/razer-quirks-lister.py')
-rwxr-xr-xtools/razer-quirks-lister.py83
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)