[PATCH evemu 1/7] Add wrappers around some libevdev utility functions

Peter Hutterer peter.hutterer at who-t.net
Sun Aug 17 21:49:13 PDT 2014


On Fri, Aug 15, 2014 at 01:54:30PM -0400, Benjamin Tissoires wrote:
> On Thu, Aug 14, 2014 at 11:29 PM, Peter Hutterer
> <peter.hutterer at who-t.net> wrote:
> > On Thu, Aug 14, 2014 at 02:00:39PM -0400, Benjamin Tissoires wrote:
> >> Mostly for the python binding so we can get rid of the generated mapping
> >> tables.
> >
> > I've been staring at this and for one reason or another it doesn't feel
> > right but I can't quite put the finger on it. So two questions come up here:
> > * since we need this for the python bindings and internally only, should we
> >   just wrap libevdev directly for these?
> 
> I don't think we want to do that. I don't want to have what should be
> a thin wrapper around one C-lib depend on an other C-lib (even that is
> used internally). I do not see it coming in the future, but this
> allows to change libevdev to another lib or another implementation if
> we want.

at the cost of duplicating the API. evemu is supposed to be an emulation
tool but because it predates libevdev and handles much of libevdev it
already exposes too much anyway. I don't really see why we should make evemu
a copy of libevdev.

> I think the problem comes from the fact that evemu-event (in tools)
> directly makes use of libevdev, instead of using evemu. That is IMO a
> problem for the very same reason (patch to follow).
> 
> evemu is now a convenient library which hides most of the services
> given by libevdev, and I do not want to expose those to the users
> (either in tools/ or python/)
> 
> > * should we add python bindings to libevdev and use them.
> 
> Again, this would be IMO even uglier, and the same reasons as above apply.

really? it would be a matter of e.g.

import libevdev
(type, code) = libevdev.event_from_name("EV_REL", "REL_X")

if e.type == type and e.code == code:
     we have a match

with the difference that the lookup is now handled where it is supposed to
be, rather than pushing it through three different APIs down to where it's
actually handled.

Writing libevdev bindings is probably a PITA, but it still feels better than
letting evemu just wrap libevdev to provide APIs that shouldn't be part of
evemu.

Cheers,
   Peter

> > The patch itself is fine, I just don't know if that's really what we want to
> > do.
> >
> > Cheers,
> >    Peter
> >
> >> We export here accessors around type/code/property.
> >>
> >> Signed-off-by: Benjamin Tissoires <benjamin.tissoires at gmail.com>
> >> ---
> >>  python/evemu/base.py | 25 ++++++++++++++++++++
> >>  src/evemu.c          | 25 ++++++++++++++++++++
> >>  src/evemu.h          | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++
> >>  src/libevemu.ver     |  9 +++++++
> >>  4 files changed, 125 insertions(+)
> >>
> >> diff --git a/python/evemu/base.py b/python/evemu/base.py
> >> index 8d8b3de..53758dd 100644
> >> --- a/python/evemu/base.py
> >> +++ b/python/evemu/base.py
> >> @@ -405,6 +405,31 @@ class LibEvemu(LibraryWrapper):
> >>              "argtypes": (c_void_p,),
> >>              "restype": None
> >>              },
> >> +        #const char *evemu_event_type_get_name(unsigned int type);
> >> +        "evemu_event_type_get_name": {
> >> +            "argtypes": (c_uint,),
> >> +            "restype": c_char_p
> >> +            },
> >> +        #int evemu_event_type_from_name(const char *name);
> >> +        "evemu_event_type_from_name": {
> >> +            "argtypes": (c_char_p,),
> >> +            "restype": c_int
> >> +            },
> >> +        #const char *evemu_event_code_get_name(unsigned int type, unsigned int code);
> >> +        "evemu_event_code_get_name": {
> >> +            "argtypes": (c_uint, c_uint,),
> >> +            "restype": c_char_p
> >> +            },
> >> +        #int evemu_event_code_from_name(unsigned int type, const char *name);
> >> +        "evemu_event_code_from_name": {
> >> +            "argtypes": (c_uint, c_char_p,),
> >> +            "restype": c_int
> >> +            },
> >> +        #const char *evemu_property_get_name(unsigned int prop);
> >> +        "evemu_property_get_name": {
> >> +            "argtypes": (c_uint,),
> >> +            "restype": c_char_p
> >> +            },
> >>          }
> >>
> >>  class InputEvent(ctypes.Structure):
> >> diff --git a/src/evemu.c b/src/evemu.c
> >> index aae1913..1821f40 100644
> >> --- a/src/evemu.c
> >> +++ b/src/evemu.c
> >> @@ -802,3 +802,28 @@ void evemu_destroy(struct evemu_device *dev)
> >>               dev->uidev = NULL;
> >>       }
> >>  }
> >> +
> >> +const char *evemu_event_type_get_name(unsigned int type)
> >> +{
> >> +     return libevdev_event_type_get_name(type);
> >> +}
> >> +
> >> +const char *evemu_event_code_get_name(unsigned int type, unsigned int code)
> >> +{
> >> +     return libevdev_event_code_get_name(type, code);
> >> +}
> >> +
> >> +const char *evemu_property_get_name(unsigned int prop)
> >> +{
> >> +     return libevdev_property_get_name(prop);
> >> +}
> >> +
> >> +int evemu_event_type_from_name(const char *name)
> >> +{
> >> +     return libevdev_event_type_from_name(name);
> >> +}
> >> +
> >> +int evemu_event_code_from_name(unsigned int type, const char *name)
> >> +{
> >> +     return libevdev_event_code_from_name(type, name);
> >> +}
> >> diff --git a/src/evemu.h b/src/evemu.h
> >> index ae3f7d3..c2af364 100644
> >> --- a/src/evemu.h
> >> +++ b/src/evemu.h
> >> @@ -165,6 +165,72 @@ unsigned int evemu_get_id_version(const struct evemu_device *dev);
> >>  void evemu_set_id_version(struct evemu_device *dev, unsigned int version);
> >>
> >>  /**
> >> + * evemu_event_type_get_name() - get the name of an event type
> >> + *
> >> + * @type: The event type to return the name for.
> >> + *
> >> + * Returns he name of the given event type (e.g. EV_ABS) or NULL for an
> >> + * invalid type
> >> + */
> >> +const char *evemu_event_type_get_name(unsigned int type);
> >> +
> >> +/**
> >> + * evemu_event_code_get_name() - get the name of an event code
> >> + *
> >> + * @type: The event type for the code to query (EV_SYN, EV_REL, etc.)
> >> + * @code: The event code to return the name for (e.g. ABS_X)
> >> + *
> >> + * Returns the name of the given event code (e.g. ABS_X) or NULL for an
> >> + * invalid type or code
> >> + */
> >> +const char *evemu_event_code_get_name(unsigned int type, unsigned int code);
> >> +
> >> +/**
> >> + * evemu_property_get_name() - get the name of an input property
> >> + *
> >> + * @prop: The input prop to return the name for (e.g. INPUT_PROP_BUTTONPAD)
> >> + *
> >> + * Returns the name of the given input prop (e.g. INPUT_PROP_BUTTONPAD) or NULL for an
> >> + * invalid property
> >> + */
> >> +const char *evemu_property_get_name(unsigned int prop);
> >> +
> >> +/**
> >> + * evemu_event_type_from_name() - get the code of a given event type name
> >> + *
> >> + * Look up an event-type by its name. Event-types start with "EV_" followed by
> >> + * the name (eg., "EV_ABS"). The "EV_" prefix must be included in the name. It
> >> + * returns the constant assigned to the event-type or -1 if not found.
> >> + *
> >> + * @name: A non-NULL string describing an input-event type ("EV_KEY",
> >> + * "EV_ABS", ...), zero-terminated.
> >> + *
> >> + * Returns the given type constant for the passed name or -1 if not found.
> >> + */
> >> +int evemu_event_type_from_name(const char *name);
> >> +
> >> +/**
> >> + * evemu_event_code_from_name() - get the numerical code of a given event code name
> >> + *
> >> + * Look up an event code by its type and name. Event codes start with a fixed
> >> + * prefix followed by their name (eg., "ABS_X"). The prefix must be included in
> >> + * the name. It returns the constant assigned to the event code or -1 if not
> >> + * found.
> >> + *
> >> + * You have to pass the event type where to look for the name. For instance, to
> >> + * resolve "ABS_X" you need to pass EV_ABS as type and "ABS_X" as string.
> >> + * Supported event codes are codes starting with SYN_, KEY_, BTN_, REL_, ABS_,
> >> + * MSC_, SND_, SW_, LED_, REP_, FF_.
> >> + *
> >> + * @type: The event type (EV_* constant) where to look for the name.
> >> + * @name: A non-NULL string describing an input-event code ("KEY_A",
> >> + * "ABS_X", "BTN_Y", ...), zero-terminated.
> >> + *
> >> + * Returns the given code constant for the passed name or -1 if not found.
> >> + */
> >> +int evemu_event_code_from_name(unsigned int type, const char *name);
> >> +
> >> +/**
> >>   * evemu_get_abs_minimum() - get kernel minimum value of event type
> >>   * @dev: the device in use
> >>   * @code: the event type code to query
> >> diff --git a/src/libevemu.ver b/src/libevemu.ver
> >> index d5f914f..3cfae96 100644
> >> --- a/src/libevemu.ver
> >> +++ b/src/libevemu.ver
> >> @@ -45,3 +45,12 @@ EVEMU_2.0 {
> >>    local:
> >>      *;
> >>  };
> >> +
> >> +EVEMU_2.1 {
> >> +  global:
> >> +    evemu_event_type_get_name;
> >> +    evemu_event_type_from_name;
> >> +    evemu_event_code_get_name;
> >> +    evemu_event_code_from_name;
> >> +    evemu_property_get_name;
> >> +} EVEMU_2.0;
> >> --
> >> 2.0.4
> >>


More information about the Input-tools mailing list