[PATCH libevdev v2 3/5] Create event type/code lookup tables

David Herrmann dh.herrmann at gmail.com
Mon Oct 28 17:16:45 CET 2013


Additionally to type->string mapping tables we now also create
string->type lookup tables. The lookup tables are sorted by their name
so binary-search will work.

We create one lookup table for EV_* types and one for all event-codes.
More tables (like bus-names, input-properties, ..) can be added later.

Signed-off-by: David Herrmann <dh.herrmann at gmail.com>
---
 libevdev/make-event-names.py | 60 +++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 56 insertions(+), 4 deletions(-)

diff --git a/libevdev/make-event-names.py b/libevdev/make-event-names.py
index b1db9bc..e8e8321 100755
--- a/libevdev/make-event-names.py
+++ b/libevdev/make-event-names.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 # Parses linux/input.h scanning for #define KEY_FOO 134
-# Prints a C header file or a Python file that can be used as
-# mapping table
+# Prints C header files or Python files that can be used as
+# mapping and lookup tables.
 #
 
 from __future__ import print_function
@@ -39,12 +39,36 @@ blacklist = [
 		"BTN_TRIGGER_HAPPY"
 ]
 
+btn_additional = [
+		[0, "BTN_A"],
+		[0, "BTN_B"],
+		[0, "BTN_X"],
+		[0, "BTN_Y"],
+]
+
+names = [
+		"REL_",
+		"ABS_",
+		"KEY_",
+		"BTN_",
+		"LED_",
+		"SND_",
+		"MSC_",
+		"SW_",
+		"FF_",
+		"SYN_",
+		"REP_",
+]
+
 def print_bits(bits, prefix):
 	if  not hasattr(bits, prefix):
 		return
 	print("static const char * const %s_map[%s_MAX + 1] = {" % (prefix, prefix.upper()))
 	for val, name in list(getattr(bits, prefix).items()):
 		print("	[%s] = \"%s\"," % (name, name))
+	if prefix == "key":
+		for val, name in list(getattr(bits, "btn").items()):
+			print("	[%s] = \"%s\"," % (name, name))
 	print("};")
 	print("")
 
@@ -55,6 +79,9 @@ def print_python_bits(bits, prefix):
 	print("%s_map = {" % (prefix))
 	for val, name in list(getattr(bits, prefix).items()):
 		print("	%d : \"%s\"," % (val, name))
+	if prefix == "key":
+		for val, name in list(getattr(bits, "btn").items()):
+			print("	%d : \"%s\"," % (val, name))
 	print("}")
 	print("for k, v in %s_map.items():" % (prefix))
 	print("	%s_map[v] = k" % (prefix))
@@ -95,6 +122,17 @@ def print_python_map(bits):
 	print("}")
 	print("")
 
+def print_lookup(bits, prefix):
+	if not hasattr(bits, prefix):
+		return
+
+	names = list(getattr(bits, prefix).items())
+	if prefix == "btn":
+		names = names + btn_additional;
+
+	for val, name in sorted(names, key=lambda e: e[1]):
+		print("	{ .name = \"%s\", .value = %s }," % (name, name))
+
 def print_mapping_table(bits):
 	print("/* THIS FILE IS GENERATED, DO NOT EDIT */")
 	print("")
@@ -113,6 +151,22 @@ def print_mapping_table(bits):
 
 	print_map(bits)
 
+	print("struct name_entry {")
+	print("	const char *name;")
+	print("	unsigned int value;")
+	print("};")
+	print("")
+	print("static const struct name_entry ev_names[] = {")
+	print_lookup(bits, "ev")
+	print("};")
+	print("")
+
+	print("static const struct name_entry code_names[] = {")
+	for prefix in sorted(names, key=lambda e: e):
+		print_lookup(bits, prefix[:-1].lower())
+	print("};")
+	print("")
+
 	print("#endif /* EVENT_NAMES_H */")
 
 def print_python_mapping_table(bits):
@@ -156,8 +210,6 @@ def parse_define(bits, line):
 			continue
 
 		attrname = prefix[:-1].lower()
-		if attrname == "btn":
-			attrname = "key"
 
 		if not hasattr(bits, attrname):
 			setattr(bits, attrname, {})
-- 
1.8.4.1



More information about the Input-tools mailing list