summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorRan Benita <ran234@gmail.com>2017-07-29 14:37:23 +0300
committerRan Benita <ran234@gmail.com>2017-07-31 15:55:48 +0300
commit0a19267f309485df0889b67be118274cbb94c7f6 (patch)
tree6f2386e1b55ccbb413bc45c43bc260faae24f681 /scripts
parent00b08eae826f1ef6b7d87308d5da603736126ea8 (diff)
downloadxorg-lib-libxkbcommon-0a19267f309485df0889b67be118274cbb94c7f6.tar.gz
build: move custom targets to scripts/ and remove from makefile
These scripts generate source code that is committed to git and hence do not really belong in the build system. A maintainer runs them as needed. Signed-off-by: Ran Benita <ran234@gmail.com>
Diffstat (limited to 'scripts')
-rwxr-xr-xscripts/makeheader40
-rwxr-xr-xscripts/makekeys51
-rwxr-xr-xscripts/update-keysyms6
-rwxr-xr-xscripts/update-keywords4
4 files changed, 101 insertions, 0 deletions
diff --git a/scripts/makeheader b/scripts/makeheader
new file mode 100755
index 0000000..7b7a07e
--- /dev/null
+++ b/scripts/makeheader
@@ -0,0 +1,40 @@
+#!/usr/bin/env python
+
+from __future__ import print_function
+import re
+
+
+HEADERS = [
+ '/usr/include/X11/keysymdef.h',
+ '/usr/include/X11/XF86keysym.h',
+ '/usr/include/X11/Sunkeysym.h',
+ '/usr/include/X11/DECkeysym.h',
+ '/usr/include/X11/HPkeysym.h',
+]
+
+print('''#ifndef _XKBCOMMON_KEYSYMS_H
+#define _XKBCOMMON_KEYSYMS_H
+
+/* This file is autogenerated; please do not commit directly. */
+
+#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:
+ continue
+
+ # Remove #define _OSF_Keysyms and such.
+ 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:
+ continue
+
+ line = re.sub(r'#define\s*(\w*)XK_', r'#define XKB_KEY_\1', line)
+
+ print(line, end='')
+print('\n\n#endif')
diff --git a/scripts/makekeys b/scripts/makekeys
new file mode 100755
index 0000000..4732f8d
--- /dev/null
+++ b/scripts/makekeys
@@ -0,0 +1,51 @@
+#!/usr/bin/env python
+
+import re, sys, itertools
+
+pattern = re.compile(r'^#define\s+XKB_KEY_(?P<name>\w+)\s+(?P<value>0x[0-9a-fA-F]+)\s')
+matches = [pattern.match(line) for line in open(sys.argv[1])]
+entries = [(m.group("name"), int(m.group("value"), 16)) for m in matches if m]
+
+print('''
+/**
+ * This file comes from libxkbcommon and was generated by makekeys.py
+ * You can always fetch the latest version from:
+ * https://raw.github.com/xkbcommon/libxkbcommon/master/src/ks_tables.h
+ */
+''')
+
+entry_offsets = {}
+
+print('''
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Woverlength-strings"
+static const char *keysym_names =
+'''.strip())
+offs = 0
+for (name, _) in sorted(entries, key=lambda e: e[0].lower()):
+ entry_offsets[name] = offs
+ print(' "{name}\\0"'.format(name=name))
+ offs += len(name) + 1
+print('''
+;
+#pragma GCC diagnostic pop
+'''.strip())
+
+print('''
+struct name_keysym {
+ xkb_keysym_t keysym;
+ uint32_t offset;
+};\n''')
+
+def print_entries(x):
+ for (name, value) in x:
+ print(' {{ 0x{value:08x}, {offs} }}, /* {name} */'.format(offs=entry_offsets[name], value=value, name=name))
+
+print('static const struct name_keysym name_to_keysym[] = {')
+print_entries(sorted(entries, key=lambda e: e[0].lower()))
+print('};\n')
+
+# *.sort() is stable so we always get the first keysym for duplicate
+print('static const struct name_keysym keysym_to_name[] = {')
+print_entries(next(g[1]) for g in itertools.groupby(sorted(entries, key=lambda e: e[1]), key=lambda e: e[1]))
+print('};')
diff --git a/scripts/update-keysyms b/scripts/update-keysyms
new file mode 100755
index 0000000..3356a35
--- /dev/null
+++ b/scripts/update-keysyms
@@ -0,0 +1,6 @@
+#!/bin/sh
+# Run this to regenerate xkbcommon-keysyms.h from the X11 headers
+# defining the keysyms and update the name <-> keysym mapping.
+export LC_CTYPE=C
+scripts/makeheader > xkbcommon/xkbcommon-keysyms.h
+scripts/makekeys xkbcommon/xkbcommon-keysyms.h > src/ks_tables.h
diff --git a/scripts/update-keywords b/scripts/update-keywords
new file mode 100755
index 0000000..65f0d1f
--- /dev/null
+++ b/scripts/update-keywords
@@ -0,0 +1,4 @@
+#!/bin/sh
+# Run this if you add/remove a new keyword to the xkbcomp scanner,
+# or just want to regenerate the gperf file.
+gperf < src/xkbcomp/keywords.gperf > src/xkbcomp/keywords.c