[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