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

David Herrmann dh.herrmann at gmail.com
Tue Oct 29 07:43:03 CET 2013


Hi Peter

On Tue, Oct 29, 2013 at 1:57 AM, Peter Hutterer
<peter.hutterer at who-t.net> wrote:
> On Mon, Oct 28, 2013 at 05:16:45PM +0100, David Herrmann wrote:
>> 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("")
>> +
>
> I've moved that into a separate function, left unchanged otherwise.

Sounds good. Does that mean you already picked it up or should I send v3?
Btw., forgot to mention that I didn't modify the python-output. I use
custom C-structs for the name-lookups and I have no idea how to do
that in python (I never learned python..). I am actually not even sure
why we have the separate python output?

Thanks
David

> Cheers,
>    Peter
>
>>       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