#!/usr/bin/env python3 # # This script creates a custom layout, overriding the TDLE key with the first # argument given. import argparse import tempfile from pathlib import Path import subprocess import os import re import sys # Template to force our key to TLDE template = """ default xkb_symbols "basic" {{ include "us(basic)" replace key {{ [ {} ] }}; }}; """ parser = argparse.ArgumentParser( description="Tool to verify whether a keysym is resolved" ) parser.add_argument("keysym", type=str, help="XKB keysym") parser.add_argument( "--tool", type=str, nargs=1, default=["xkbcli", "compile-keymap"], help="Full path to the xkbcli-compile-keymap tool", ) args = parser.parse_args() with tempfile.TemporaryDirectory() as tmpdir: symfile = Path(tmpdir) / "symbols" / "keytest" symfile.parent.mkdir() with symfile.open(mode="w") as f: f.write(template.format(args.keysym)) try: cmd = [ *args.tool, "--layout", "keytest", ] env = os.environ.copy() env["XKB_CONFIG_EXTRA_PATH"] = tmpdir result = subprocess.run( cmd, env=env, capture_output=True, universal_newlines=True ) if result.returncode != 0: print("ERROR: Failed to compile:") print(result.stderr) sys.exit(1) # grep for TLDE actually being remapped for l in result.stdout.split("\n"): match = re.match(r"\s+key \\s+{\s+\[\s+(?P\w+)\s+\]\s+}", l) if match: if args.keysym == match.group("keysym"): sys.exit(0) elif match.group("keysym") == "NoSymbol": print("ERROR: key {} not resolved:".format(args.keysym), l) else: print("ERROR: key {} mapped to wrong key:".format(args.keysym), l) sys.exit(1) print(result.stdout) print("ERROR: above keymap is missing key mapping for {}".format(args.keysym)) sys.exit(1) except FileNotFoundError as err: print("ERROR: invalid or missing tool: {}".format(err)) sys.exit(1)