From: Wismill Date: Wed, 20 Sep 2023 05:45:15 +0000 (+0200) Subject: Keysyms: improve generator (#364) X-Git-Tag: accepted/tizen/unified/20240109.155348~71 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fupstream%2Flibxkbcommon.git;a=commitdiff_plain;h=b900faf77b5d07805f10a1160cd1c6842cc46b11 Keysyms: improve generator (#364) Motivation: normalization of keysyms header files in `xorgproto`. See: https://gitlab.freedesktop.org/xorg/proto/xorgproto/-/merge_requests/80 Improve `scripts/makeheader`: - Simplify `evdev` and `XK_` substitution and improve alignment. Also, perform some additional `XK_` substitutions in comments. - Format with `black`. --- diff --git a/scripts/makeheader b/scripts/makeheader index bb0db59..f2738bd 100755 --- a/scripts/makeheader +++ b/scripts/makeheader @@ -3,20 +3,63 @@ from __future__ import print_function import re import os -# expected format: -# #define XF86XK_FooBar _EVDEVK(0x123) /* some optional comment */ -evdev_pattern = re.compile(r'^#define\s+XF86XK_(?P\w+)\s+_EVDEVK\((?P0x[0-9A-Fa-f]+)\)') +# Expected format: +# #define XF86XK_FooBar 0x1234 /* some optional comment */ +# or: +# #define XF86XK_FooBar _EVDEVK(0x123) /* some optional comment */ +# We also need to match commented evdev entries: +# /* Use: XF86XK_FooBar _EVDEVK(0x123) some optional comment */ +keysym_entry_pattern = re.compile( + r"""^ + (?P\#define|/\*\s+Use:)\s+ + (?P\w*)XK_(?P\w+)(?P\s+) + (?P_EVDEVK\()?(?P0x[0-9A-Fa-f]+)(?(evdev)\)) + """, + re.VERBOSE, +) -prefix = os.environ.get('X11_HEADERS_PREFIX', '/usr') +# Match remaining XK_ references in the comments, e.g we will replace: +# XF86XK_CamelCaseKernelName _EVDEVK(kernel value) +# #define XKB_KEY_SunCompose 0x0000FF20 /* Same as XK_Multi_key */ +# with: +# XKB_KEY_XF86CamelCaseKernelName _EVDEVK(kernel value) +# #define XKB_KEY_SunCompose 0x0000FF20 /* Same as XKB_KEY_Multi_key */ +xorgproto_keysym_prefix_pattern = re.compile(r"\b(?P\w*)XK_(?!KOREAN\b)") + + +def make_keysym_entry(m: re.Match[str]) -> str: + """ + Perform the substitutions + """ + if m.group("evdev"): + if m.group("define").startswith("#"): + # Replace the xorgproto _EVDEVK macro with the actual value: + # 0x10081000 is the base, the evdev hex code is added to that. + # We replace to make parsing of the keys later easier. + value = 0x10081000 + int(m.group("value"), 16) + value_str = f"{value:#x} " + else: + value_str = f"""_EVDEVK({m.group('value')})""" + else: + value_str = m.group("value") + define = m.group("define") + prefix = m.group("prefix") or "" + name = m.group("name") + spacing = m.group("spacing") + return f"""{define} XKB_KEY_{prefix}{name}{spacing}{value_str}""" + + +prefix = os.environ.get("X11_HEADERS_PREFIX", "/usr") HEADERS = [ - prefix + '/include/X11/keysymdef.h', - prefix + '/include/X11/XF86keysym.h', - prefix + '/include/X11/Sunkeysym.h', - prefix + '/include/X11/DECkeysym.h', - prefix + '/include/X11/HPkeysym.h', + prefix + "/include/X11/keysymdef.h", + prefix + "/include/X11/XF86keysym.h", + prefix + "/include/X11/Sunkeysym.h", + prefix + "/include/X11/DECkeysym.h", + prefix + "/include/X11/HPkeysym.h", ] -print('''#ifndef _XKBCOMMON_KEYSYMS_H +print( + """#ifndef _XKBCOMMON_KEYSYMS_H #define _XKBCOMMON_KEYSYMS_H /* This file is autogenerated; please do not commit directly. */ @@ -27,31 +70,26 @@ print('''#ifndef _XKBCOMMON_KEYSYMS_H */ #define XKB_KEY_NoSymbol 0x000000 /* Special KeySym */ -''') +""" +) for path in HEADERS: with open(path) as header: for line in header: - if '#ifdef' in line or '#ifndef' in line or '#endif' in line: + if "#ifdef" in line or "#ifndef" in line or "#endif" in line: continue # Remove #define _OSF_Keysyms and such. - if '#define _' in line: + if "#define _" in line: continue # Handle a duplicate definition in HPkeysyms.h which kicks in if # it's not already defined. - if 'XK_Ydiaeresis' in line and '0x100000ee' in line: + if "XK_Ydiaeresis" in line and "0x100000ee" in line: continue - # Replace the xorgproto _EVDEVK macro with the actual value - # 0x10081000 is the base, the evdev hex code is added to that. - # We replace to make parsing of the keys later easier. - match = re.match(evdev_pattern, line) - if match: - value = 0x10081000 + int(match.group('value'), 16) - line = re.sub(r'_EVDEVK\(0x([0-9A-Fa-f]+)\)', '{:#x}'.format(value), line) - - line = re.sub(r'#define\s*(\w*)XK_', r'#define XKB_KEY_\1', line) + # Perform _EVDEV and XK_ substitutions + line = keysym_entry_pattern.sub(make_keysym_entry, line) + line = xorgproto_keysym_prefix_pattern.sub(r"XKB_KEY_\1", line) - print(line, end='') -print('\n\n#endif') + print(line, end="") +print("\n\n#endif")