2 # Parses linux/input.h scanning for #define KEY_FOO 134
3 # Prints C header files or Python files that can be used as
4 # mapping and lookup tables.
7 from __future__ import print_function
62 def print_bits(bits, prefix):
63 if not hasattr(bits, prefix):
65 print("static const char * const %s_map[%s_MAX + 1] = {" % (prefix, prefix.upper()))
66 for val, name in list(getattr(bits, prefix).items()):
67 print(" [%s] = \"%s\"," % (name, name))
69 for val, name in list(getattr(bits, "btn").items()):
70 print(" [%s] = \"%s\"," % (name, name))
75 print("static const char * const * const event_type_map[EV_MAX + 1] = {")
77 for prefix in prefixes:
78 if prefix == "BTN_" or prefix == "EV_" or prefix == "INPUT_PROP_":
80 print(" [EV_%s] = %s_map," % (prefix[:-1], prefix[:-1].lower()))
85 print("#pragma GCC diagnostic push")
86 print("#pragma GCC diagnostic ignored \"-Woverride-init\"")
87 print("static const int ev_max[EV_MAX + 1] = {")
88 print(" [0 ... EV_MAX] = -1,")
89 for prefix in prefixes:
90 if prefix == "BTN_" or prefix == "EV_" or prefix == "INPUT_PROP_":
92 print(" [EV_%s] = %s_MAX," % (prefix[:-1], prefix[:-1]))
94 print("#pragma GCC diagnostic pop /* \"-Woverride-init\" */")
97 def print_python_map(bits):
100 for val, name in list(getattr(bits, "ev").items()):
102 if name == "REP" or name == "PWR" or name == "FF_STATUS" or name == "MAX":
104 print(" %d : %s_map," % (val, name.lower()))
109 def print_lookup(bits, prefix):
110 if not hasattr(bits, prefix):
113 names = list(getattr(bits, prefix).items())
115 names = names + btn_additional;
117 for val, name in sorted(names, key=lambda e: e[1]):
118 print(" { .name = \"%s\", .value = %s }," % (name, name))
120 def print_lookup_table(bits):
121 print("struct name_entry {")
122 print(" const char *name;")
123 print(" unsigned int value;")
126 print("static const struct name_entry ev_names[] = {")
127 print_lookup(bits, "ev")
131 print("static const struct name_entry code_names[] = {")
132 for prefix in sorted(names, key=lambda e: e):
133 print_lookup(bits, prefix[:-1].lower())
138 def print_mapping_table(bits):
139 print("/* THIS FILE IS GENERATED, DO NOT EDIT */")
141 print("#ifndef EVENT_NAMES_H")
142 print("#define EVENT_NAMES_H")
145 for prefix in prefixes:
148 print_bits(bits, prefix[:-1].lower())
151 print_lookup_table(bits)
153 print("#endif /* EVENT_NAMES_H */")
155 def parse_define(bits, line):
156 m = re.match(r"^#define\s+(\w+)\s+(\w+)", line)
162 if name in blacklist:
166 value = int(m.group(2), 0)
170 for prefix in prefixes:
171 if not name.startswith(prefix):
174 attrname = prefix[:-1].lower()
176 if not hasattr(bits, attrname):
177 setattr(bits, attrname, {})
178 b = getattr(bits, attrname)
184 lines = fp.readlines()
186 if not line.startswith("#define"):
188 parse_define(bits, line)
193 print("Usage: %s /path/to/linux/input.h" % prog)
195 if __name__ == "__main__":
196 if len(sys.argv) != 2:
200 with open(sys.argv[1]) as f:
202 print_mapping_table(bits)