[PATCH v3 2/3] config: Introduce InputAttributes in NewInputDeviceRequest

Peter Hutterer peter.hutterer at who-t.net
Wed Dec 16 22:56:52 PST 2009


On Mon, Dec 14, 2009 at 09:09:01PM -0800, Dan Nicholson wrote:
> In order to give NewInputDeviceRequest more information, a new
> InputAttributes type is introduced. Currently, this collects the product
> and vendor name, device path, and sets booleans for attributes such as
> having keys and/or a pointer. Only the HAL backend fills in the
> attributes, though.

> Signed-off-by: Dan Nicholson <dbn.lists at gmail.com>
> ---
>  Xi/stubs.c                     |    3 ++-
>  config/dbus.c                  |    2 +-
>  config/hal.c                   |   28 +++++++++++++++++++++++++++-
>  hw/dmx/dmxinput.c              |    3 ++-
>  hw/kdrive/src/kinput.c         |    3 ++-
>  hw/xfree86/common/xf86Xinput.c |    3 ++-
>  hw/xquartz/darwinXinput.c      |    3 ++-
>  include/input.h                |   15 +++++++++++++++
>  8 files changed, 53 insertions(+), 7 deletions(-)
> 
> diff --git a/Xi/stubs.c b/Xi/stubs.c
> index 400e937..04ba976 100644
> --- a/Xi/stubs.c
> +++ b/Xi/stubs.c
> @@ -227,7 +227,8 @@ ChangeDeviceControl(ClientPtr client, DeviceIntPtr dev,
>   *
>   */
>  int
> -NewInputDeviceRequest(InputOption *options, DeviceIntPtr *pdev)
> +NewInputDeviceRequest(InputOption *options, InputAttributes *attrs,
> +                      DeviceIntPtr *pdev)
>  {
>      return BadValue;
>  }
> diff --git a/config/dbus.c b/config/dbus.c
> index 37462ac..86d9d28 100644
> --- a/config/dbus.c
> +++ b/config/dbus.c
> @@ -147,7 +147,7 @@ add_device(DBusMessage *message, DBusMessage *reply, DBusError *error)
>          dbus_message_iter_next(&iter);
>      }
>  
> -    ret = NewInputDeviceRequest(options, &dev);
> +    ret = NewInputDeviceRequest(options, NULL, &dev);
>      if (ret != Success) {
>          DebugF("[config/dbus] NewInputDeviceRequest failed\n");
>          goto unwind;
> diff --git a/config/hal.c b/config/hal.c
> index 28f55a0..79549fe 100644
> --- a/config/hal.c
> +++ b/config/hal.c
> @@ -191,6 +191,7 @@ device_added(LibHalContext *hal_ctx, const char *udi)
>  {
>      char *path = NULL, *driver = NULL, *name = NULL, *config_info = NULL;
>      InputOption *options = NULL, *tmpo = NULL;
> +    InputAttributes attrs = {0};
>      DeviceIntPtr dev = NULL;
>      DBusError error;
>      struct xkb_options xkb_opts = {0};
> @@ -215,10 +216,28 @@ device_added(LibHalContext *hal_ctx, const char *udi)
>          LogMessage(X_WARNING,"config/hal: no driver or path specified for %s\n", udi);
>          goto unwind;
>      }
> +    attrs.device = xstrdup(path);
>  
>      name = get_prop_string(hal_ctx, udi, "info.product");
>      if (!name)
>          name = xstrdup("(unnamed)");
> +    else
> +        attrs.product = xstrdup(name);
> +
> +    attrs.vendor = get_prop_string(hal_ctx, udi, "info.vendor");
> +
> +    if (libhal_device_query_capability(hal_ctx, udi, "input.keys", NULL))
> +        attrs.flags |= ATTR_KEYBOARD;
> +    if (libhal_device_query_capability(hal_ctx, udi, "input.mouse", NULL))
> +        attrs.flags |= ATTR_POINTER;
> +    if (libhal_device_query_capability(hal_ctx, udi, "input.joystick", NULL))
> +        attrs.flags |= ATTR_JOYSTICK;
> +    if (libhal_device_query_capability(hal_ctx, udi, "input.tablet", NULL))
> +        attrs.flags |= ATTR_TABLET;
> +    if (libhal_device_query_capability(hal_ctx, udi, "input.touchpad", NULL))
> +        attrs.flags |= ATTR_TOUCHPAD;
> +    if (libhal_device_query_capability(hal_ctx, udi, "input.touchscreen", NULL))
> +        attrs.flags |= ATTR_TOUCHSCREEN;
>  
>      options = xcalloc(sizeof(*options), 1);
>      if (!options){
> @@ -400,7 +419,7 @@ device_added(LibHalContext *hal_ctx, const char *udi)
>  
>      /* this isn't an error, but how else do you output something that the user can see? */
>      LogMessage(X_INFO, "config/hal: Adding input device %s\n", name);
> -    if ((rc = NewInputDeviceRequest(options, &dev)) != Success) {
> +    if ((rc = NewInputDeviceRequest(options, &attrs, &dev)) != Success) {
>          LogMessage(X_ERROR, "config/hal: NewInputDeviceRequest failed (%d)\n", rc);
>          dev = NULL;
>          goto unwind;
> @@ -430,6 +449,13 @@ unwind:
>          xfree(tmpo);
>      }
>  
> +    if (attrs.product)
> +        xfree(attrs.product);
> +    if (attrs.vendor)
> +        xfree(attrs.vendor);
> +    if (attrs.device)
> +        xfree(attrs.device);
> +

as ajax said, we can skip these checks.

>      if (xkb_opts.layout)
>          xfree(xkb_opts.layout);
>      if (xkb_opts.rules)
> diff --git a/hw/dmx/dmxinput.c b/hw/dmx/dmxinput.c
> index d9118b6..c099349 100644
> --- a/hw/dmx/dmxinput.c
> +++ b/hw/dmx/dmxinput.c
> @@ -103,7 +103,8 @@ void dmxUpdateWindowInfo(DMXUpdateType type, WindowPtr pWindow)
>  }
>  
>  int
> -NewInputDeviceRequest (InputOption *options, DeviceIntPtr *pdev)
> +NewInputDeviceRequest (InputOption *options, InputAttributes *attrs,
> +                       DeviceIntPtr *pdev)
>  {
>      return BadRequest;
>  }
> diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c
> index 65fc75a..c084591 100644
> --- a/hw/kdrive/src/kinput.c
> +++ b/hw/kdrive/src/kinput.c
> @@ -2249,7 +2249,8 @@ ChangeDeviceControl(register ClientPtr client, DeviceIntPtr pDev,
>  }
>  
>  int
> -NewInputDeviceRequest(InputOption *options, DeviceIntPtr *pdev)
> +NewInputDeviceRequest(InputOption *options, InputAttributes *attrs,
> +                      DeviceIntPtr *pdev)
>  {
>      InputOption *option = NULL;
>      KdPointerInfo *pi = NULL;
> diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c
> index f637cfe..11b7315 100644
> --- a/hw/xfree86/common/xf86Xinput.c
> +++ b/hw/xfree86/common/xf86Xinput.c
> @@ -568,7 +568,8 @@ unwind:
>  }
>  
>  int
> -NewInputDeviceRequest (InputOption *options, DeviceIntPtr *pdev)
> +NewInputDeviceRequest (InputOption *options, InputAttributes *attrs,
> +                       DeviceIntPtr *pdev)
>  {
>      IDevRec *idev = NULL;
>      InputOption *option = NULL;
> diff --git a/hw/xquartz/darwinXinput.c b/hw/xquartz/darwinXinput.c
> index 8af9fc7..43aea61 100644
> --- a/hw/xquartz/darwinXinput.c
> +++ b/hw/xquartz/darwinXinput.c
> @@ -230,7 +230,8 @@ ChangeDeviceControl(ClientPtr client, DeviceIntPtr dev,
>   *
>   */
>  int
> -NewInputDeviceRequest(InputOption *options, DeviceIntPtr *pdev)
> +NewInputDeviceRequest(InputOption *options, InputAttributes *attrs,
> +                      DeviceIntPtr *pdev)
>  {
>    DEBUG_LOG("NewInputDeviceRequest(%p, %p)\n", options, pdev);
>    return BadValue;
> diff --git a/include/input.h b/include/input.h
> index afcc006..8ad50cb 100644
> --- a/include/input.h
> +++ b/include/input.h
> @@ -210,6 +210,20 @@ typedef struct _InputOption {
>      struct _InputOption *next;
>  } InputOption;
>  
> +typedef struct _InputAttributes {
> +    char                *product;
> +    char                *vendor;
> +    char                *device;
> +    int                 flags;

unsigned long maybe? i wouldn't be suprised if a whole bunch of these flags
are added in the future.

> +} InputAttributes;
> +
> +#define ATTR_KEYBOARD (1<<0)
> +#define ATTR_POINTER (1<<1)
> +#define ATTR_JOYSTICK (1<<2)
> +#define ATTR_TABLET (1<<3)
> +#define ATTR_TOUCHPAD (1<<4)
> +#define ATTR_TOUCHSCREEN (1<<5)
> +
>  /* Key has been run through all input processing and events sent to clients. */
>  #define KEY_PROCESSED 1
>  /* Key has not been fully processed, no events have been sent. */
> @@ -514,6 +528,7 @@ void FixUpEventFromWindow(DeviceIntPtr pDev,
>  /* Implemented by the DDX. */
>  extern _X_EXPORT int NewInputDeviceRequest(
>      InputOption *options,
> +    InputAttributes *attrs,
>      DeviceIntPtr *dev);
>  extern  _X_EXPORT void DeleteInputDeviceRequest(
>      DeviceIntPtr dev);
> -- 
> 1.6.2.5
 
this patch needs to bump the ABI_XINPUT_VERSION so we can adjust the input
drivers (well, wacom). other than those minor changes, the patch is fine so
IMO the next one should be the final.

Cheers,
  Peter


More information about the xorg-devel mailing list