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

Peter Hutterer peter.hutterer at who-t.net
Tue Oct 29 08:54:38 CET 2013


On 29/10/13 16:43 , David Herrmann wrote:
> 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?

I picked it up already, no need for a 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..).

you'd just use a dict in the form of
    absbits["ABS_X"] = 0

and then
   return absbits.get(key, -1)


  I am actually not even sure
> why we have the separate python output?

it's a leftover from evemu, where the script comes from. Need to check 
whether that's still needed.

Cheers,
   Peter

>
> 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