xref: /aosp_15_r20/external/libxkbcommon/test/test-keysym.py (revision 2b949d0487e80d67f1fda82db69e101e761f8064)
1*2b949d04SAndroid Build Coastguard Worker#!/usr/bin/env python3
2*2b949d04SAndroid Build Coastguard Worker#
3*2b949d04SAndroid Build Coastguard Worker# This script creates a custom layout, overriding the TDLE key with the first
4*2b949d04SAndroid Build Coastguard Worker# argument given.
5*2b949d04SAndroid Build Coastguard Worker
6*2b949d04SAndroid Build Coastguard Workerimport argparse
7*2b949d04SAndroid Build Coastguard Workerimport tempfile
8*2b949d04SAndroid Build Coastguard Workerfrom pathlib import Path
9*2b949d04SAndroid Build Coastguard Workerimport subprocess
10*2b949d04SAndroid Build Coastguard Workerimport os
11*2b949d04SAndroid Build Coastguard Workerimport re
12*2b949d04SAndroid Build Coastguard Workerimport sys
13*2b949d04SAndroid Build Coastguard Worker
14*2b949d04SAndroid Build Coastguard Worker# Template to force our key to TLDE
15*2b949d04SAndroid Build Coastguard Workertemplate = """
16*2b949d04SAndroid Build Coastguard Workerdefault
17*2b949d04SAndroid Build Coastguard Workerxkb_symbols "basic" {{
18*2b949d04SAndroid Build Coastguard Worker    include "us(basic)"
19*2b949d04SAndroid Build Coastguard Worker    replace key <TLDE> {{ [ {} ] }};
20*2b949d04SAndroid Build Coastguard Worker}};
21*2b949d04SAndroid Build Coastguard Worker"""
22*2b949d04SAndroid Build Coastguard Worker
23*2b949d04SAndroid Build Coastguard Workerparser = argparse.ArgumentParser(
24*2b949d04SAndroid Build Coastguard Worker    description='Tool to verify whether a keysym is resolved'
25*2b949d04SAndroid Build Coastguard Worker)
26*2b949d04SAndroid Build Coastguard Workerparser.add_argument('keysym', type=str, help='XKB keysym')
27*2b949d04SAndroid Build Coastguard Workerparser.add_argument('--tool', type=str, nargs=1,
28*2b949d04SAndroid Build Coastguard Worker                    default=['xkbcli', 'compile-keymap'],
29*2b949d04SAndroid Build Coastguard Worker                    help='Full path to the xkbcli-compile-keymap tool')
30*2b949d04SAndroid Build Coastguard Workerargs = parser.parse_args()
31*2b949d04SAndroid Build Coastguard Worker
32*2b949d04SAndroid Build Coastguard Workerwith tempfile.TemporaryDirectory() as tmpdir:
33*2b949d04SAndroid Build Coastguard Worker    symfile = Path(tmpdir) / "symbols" / "keytest"
34*2b949d04SAndroid Build Coastguard Worker    symfile.parent.mkdir()
35*2b949d04SAndroid Build Coastguard Worker    with symfile.open(mode='w') as f:
36*2b949d04SAndroid Build Coastguard Worker        f.write(template.format(args.keysym))
37*2b949d04SAndroid Build Coastguard Worker
38*2b949d04SAndroid Build Coastguard Worker    try:
39*2b949d04SAndroid Build Coastguard Worker        cmd = [
40*2b949d04SAndroid Build Coastguard Worker            *args.tool,
41*2b949d04SAndroid Build Coastguard Worker            '--layout', 'keytest',
42*2b949d04SAndroid Build Coastguard Worker        ]
43*2b949d04SAndroid Build Coastguard Worker
44*2b949d04SAndroid Build Coastguard Worker        env = os.environ.copy()
45*2b949d04SAndroid Build Coastguard Worker        env['XKB_CONFIG_EXTRA_PATH'] = tmpdir
46*2b949d04SAndroid Build Coastguard Worker
47*2b949d04SAndroid Build Coastguard Worker        result = subprocess.run(cmd, env=env, capture_output=True,
48*2b949d04SAndroid Build Coastguard Worker                                universal_newlines=True)
49*2b949d04SAndroid Build Coastguard Worker        if result.returncode != 0:
50*2b949d04SAndroid Build Coastguard Worker            print('ERROR: Failed to compile:')
51*2b949d04SAndroid Build Coastguard Worker            print(result.stderr)
52*2b949d04SAndroid Build Coastguard Worker            sys.exit(1)
53*2b949d04SAndroid Build Coastguard Worker
54*2b949d04SAndroid Build Coastguard Worker        # grep for TLDE actually being remapped
55*2b949d04SAndroid Build Coastguard Worker        for l in result.stdout.split('\n'):
56*2b949d04SAndroid Build Coastguard Worker            match = re.match(r'\s+key \<TLDE\>\s+{\s+\[\s+(?P<keysym>\w+)\s+\]\s+}', l)
57*2b949d04SAndroid Build Coastguard Worker            if match:
58*2b949d04SAndroid Build Coastguard Worker                if args.keysym == match.group('keysym'):
59*2b949d04SAndroid Build Coastguard Worker                    sys.exit(0)
60*2b949d04SAndroid Build Coastguard Worker                elif match.group('keysym') == 'NoSymbol':
61*2b949d04SAndroid Build Coastguard Worker                    print('ERROR: key {} not resolved:'.format(args.keysym), l)
62*2b949d04SAndroid Build Coastguard Worker                else:
63*2b949d04SAndroid Build Coastguard Worker                    print('ERROR: key {} mapped to wrong key:'.format(args.keysym), l)
64*2b949d04SAndroid Build Coastguard Worker                sys.exit(1)
65*2b949d04SAndroid Build Coastguard Worker
66*2b949d04SAndroid Build Coastguard Worker        print(result.stdout)
67*2b949d04SAndroid Build Coastguard Worker        print('ERROR: above keymap is missing key mapping for {}'.format(args.keysym))
68*2b949d04SAndroid Build Coastguard Worker        sys.exit(1)
69*2b949d04SAndroid Build Coastguard Worker    except FileNotFoundError as err:
70*2b949d04SAndroid Build Coastguard Worker        print('ERROR: invalid or missing tool: {}'.format(err))
71*2b949d04SAndroid Build Coastguard Worker        sys.exit(1)
72