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
