Hi,
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]
Details in the man page. Also a man entry for set-float-prop.
Cheers,
Simon
>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
>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. 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
>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
_______________________________________________
xorg-devel mailing list
[email protected]
http://lists.x.org/mailman/listinfo/xorg-devel