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