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 <[email protected]>
> ---
>  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
_______________________________________________
xorg-devel mailing list
[email protected]
http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to