On Tue, Apr 07, 2009 at 12:07:08PM +0200, Simon Thum wrote:
> I've had some patches laying around for xinput. They make it possible to  
> select devices by using the device's type name.
>
> This is useful for scripting, since some mice have cool names such as  
> "HID:1002-08/15", making it hard to use xinput to just set your mouse.  
> Id's vary by design.
>
> Now you can
> xinput do-stuff [MOUSE-0]

Two things:
- How about an array notation in the form or MOUSE[1]?
  (and make MOUSE[] to have the same behaviour for your current [MOUSE-0])
- I'd prefer a commandline-switch --by-type to trigger this, rather than
  guessing from the name of the device.

> From 95f78f6815570af575ea138b3e98de580b30e167 Mon Sep 17 00:00:00 2001
> From: Simon Thum <[email protected]>
> Date: Thu, 26 Mar 2009 13:52:15 +0100
> Subject: [PATCH] xinput: include device type in device list
> 
> ---
>  src/list.c |    9 ++++++---
>  1 files changed, 6 insertions(+), 3 deletions(-)
> 
> diff --git a/src/list.c b/src/list.c
> index de8aca7..bd71a5c 100644
> --- a/src/list.c
> +++ b/src/list.c
> @@ -26,7 +26,7 @@
>  #include <X11/extensions/XIproto.h> /* for XI_Device***ChangedNotify */
>  
>  static void
> -print_info(XDeviceInfo       *info, Bool shortformat)
> +print_info(Display* dpy, XDeviceInfo *info, Bool shortformat)
>  {
>      int                      i,j;
>      XAnyClassPtr     any;
> @@ -65,6 +65,9 @@ print_info(XDeviceInfo      *info, Bool shortformat)
>      if (shortformat)
>          return;
>  
> +    if(info->type != None)
> +     printf("\tType is %s\n", XGetAtomName(dpy, info->type));
> +
>      if (info->num_classes > 0) {
>       any = (XAnyClassPtr) (info->inputclassinfo);
>       for (i=0; i<info->num_classes; i++) {
> @@ -140,7 +143,7 @@ list(Display      *display,
>          do {
>              info = XListInputDevices(display, &num_devices);
>              for(loop=0; loop<num_devices; loop++) {
> -                print_info(info+loop, shortformat);
> +                print_info(display, info+loop, shortformat);
>              }
>  
>  #if HAVE_XI2
> @@ -175,7 +178,7 @@ list(Display      *display,
>               fprintf(stderr, "unable to find device %s\n", argv[loop]);
>               ret = EXIT_FAILURE;
>           } else {
> -             print_info(info, shortformat);
> +             print_info(display, info, shortformat);
>           }
>       }
>       return ret;
> -- 
> 1.6.0.6

pushed, thanks.

> From 872da62a19c5bfee70cdf4cd046fb723d395b205 Mon Sep 17 00:00:00 2001
> From: Simon Thum <[email protected]>
> Date: Thu, 26 Mar 2009 15:15:26 +0100
> Subject: [PATCH] xinput: new syntax to select devices by type
> 
> see manpage changes for details. 

just copy the text from the man page so git log is still useful.

> Also, states clearly
> when device selection fails because it is a extension
> device.
> ---
>  man/xinput.man |    6 ++++-
>  src/xinput.c   |   58 ++++++++++++++++++++++++++++++++++++++++++++-----------
>  2 files changed, 51 insertions(+), 13 deletions(-)
> 
> diff --git a/man/xinput.man b/man/xinput.man
> index c9ff46f..f66fd71 100644
> --- a/man/xinput.man
> +++ b/man/xinput.man
> @@ -80,7 +80,11 @@ loop displaying events received. If the -proximity is 
> given, ProximityIn
>  and ProximityOut are registered.
>  .PP
>  \fIdevice_name\fP can be the device name as a string or the XID of the
> -device.
> +device. Also possible is a type-based locator notation \fI[Type-Num]\fP
> +(the brackets are literal).
> +\fIType\fP specifies the device type, \fINum\fP is 1 for the first
> +device, 2 for the second and so on. 0 means select the only device of
> +this type; it fails when more than one device has the specified type.  
>  .PP
>  \fIproperty\fP can be the property as a string or the Atom value.
>  .PP
> diff --git a/src/xinput.c b/src/xinput.c
> index 466a814..7dde29b 100644
> --- a/src/xinput.c
> +++ b/src/xinput.c
> @@ -166,8 +166,10 @@ find_device_info(Display *display,
>      int              loop;
>      int              num_devices;
>      int              len = strlen(name);
> -    Bool     is_id = True;
> +    Bool     is_id = True, is_locator, is_name;
>      XID              id = (XID)-1;
> +    int              loc_num;
> +    char     loc_type[100];
>  
>      for(loop=0; loop<len; loop++) {
>       if (!isdigit(name[loop])) {
> @@ -178,24 +180,56 @@ find_device_info(Display        *display,
>  
>      if (is_id) {
>       id = atoi(name);
> +    }else{
> +     if(sscanf(name, "[%[A-Z_a-z ]-%i]", loc_type, &loc_num) == 2) {
> +         is_locator = True;
> +     }
>      }
>  
> +    is_name = !is_id && !is_locator;
> +
>      devices = XListInputDevices(display, &num_devices);
>  
> -    for(loop=0; loop<num_devices; loop++) {
> -     if ((!only_extended || (devices[loop].use >= IsXExtensionDevice)) &&
> -         ((!is_id && strcmp(devices[loop].name, name) == 0) ||
> -          (is_id && devices[loop].id == id))) {
> -         if (found) {
> -             fprintf(stderr,
> -                     "Warning: There are multiple devices named \"%s\".\n"
> -                     "To ensure the correct one is selected, please use "
> -                     "the device ID instead.\n\n", name);
> -         } else {
> -             found = &devices[loop];
> +    if(is_name || is_id){
> +     for(loop=0; loop<num_devices; loop++) {
> +         if ((is_name && strcmp(devices[loop].name, name) == 0) ||
> +             (is_id && devices[loop].id == id)) {
> +             if (found) {
> +                 fprintf(stderr,
> +                         "Warning: There are multiple devices named 
> \"%s\".\n"
> +                         "To ensure the correct one is selected, please use "
> +                         "the device ID instead.\n\n", name);
> +             } else {
> +                 found = &devices[loop];
> +             }
> +         }
> +     }
> +    }else if (is_locator) {
> +     for(loop=0; loop<num_devices; loop++) {
> +         if (devices[loop].type != None &&
> +             strcmp(XGetAtomName(display, devices[loop].type),
> +                    loc_type) == 0) {
> +             //Handle zero -> find only device of given type
> +             if(loc_num == 0 && !found) {
> +                 found = &devices[loop];
> +             }else if(loc_num == 0 && found) {
> +                 fprintf(stderr,
> +                         "Error: selecting only device failed because there"
> +                         "are multiple devices with type %s.\n\n", loc_type);
> +                 return 0;
> +             }else if(loc_num > 1) {
> +                 loc_num--; //countdown
> +             }else if(loc_num == 1 && !found) {
> +                 found = &devices[loop];
> +             }
>           }
>       }
>      }
> +
> +    if (found && only_extended && (found->use >= IsXExtensionDevice)){
> +     fprintf(stderr, "Extension device ignored.\n\n");
> +     return 0;
> +    }
>      return found;
>  }
>  
> -- 
> 1.6.0.6

NACK, for the reasons mentioned above.

> From 4ef4f3601ab93508818e7a7d95582e0f82f5db83 Mon Sep 17 00:00:00 2001
> From: Simon Thum <[email protected]>
> Date: Thu, 26 Mar 2009 15:19:47 +0100
> Subject: [PATCH] xinput: mention set-float-prop in manpage
> 
> ---
>  man/xinput.man |    4 ++++
>  1 files changed, 4 insertions(+), 0 deletions(-)
> 
> diff --git a/man/xinput.man b/man/xinput.man
> index f66fd71..78fd711 100644
> --- a/man/xinput.man
> +++ b/man/xinput.man
> @@ -65,6 +65,10 @@ Sets an integer property for the device.  Appropriate 
> values for \fIformat\fP
>  are 8, 16, or 32, depending on the property.
>  .PP
>  .TP 8
> +.B xinput set-float-prop \fIdevice_name\fP \fIproperty\fP \fIvalue\fP
> +Sets a float property for the device.
> +.PP
> +.TP 8
>  .B xinput watch-props \fIdevice_name\fP
>  Prints to standard out when property changes occur.
>  .PP
> -- 
> 1.6.0.6
 
pushed, thanks.

Cheers,
  Peter
_______________________________________________
xorg-devel mailing list
[email protected]
http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to