#include <ctype.h>
#include <string.h>
-typedef int (*prog)(
-#if NeedFunctionPrototypes
- Display* display, int argc, char *argv[],
- char *prog_name, char *prog_desc
-#endif
-);
+typedef int (*prog)(Display* display, int argc, char *argv[],
+ char *prog_name, char *prog_desc);
typedef struct
{
"<window> <device>",
set_clientpointer
},
+ { "test-xi2",
+ "<device>",
+ test_xi2,
+ },
#endif
{ "list-props",
"<device> [<device> ...]",
}
};
-static Bool
-is_xinput_present(Display *display)
+int
+xinput_version(Display *display)
{
XExtensionVersion *version;
- Bool present;
+ static int vers = -1;
+
+ if (vers != -1)
+ return vers;
-#if HAVE_XI2
- version = XQueryInputVersion(display, XI_2_Major, XI_2_Minor);
-#else
version = XGetExtensionVersion(display, INAME);
-#endif
if (version && (version != (XExtensionVersion*) NoSuchExtension)) {
- present = version->present;
+ vers = version->major_version;
XFree(version);
- return present;
- } else {
- return False;
}
+
+ return vers;
}
XDeviceInfo*
return found;
}
+#ifdef HAVE_XI2
+XIDeviceInfo*
+xi2_find_device_info(Display *display, char *name)
+{
+ XIDeviceInfo *info;
+ int ndevices;
+ Bool is_id = True;
+ int i, id = -1;
+
+ for(i = 0; i < strlen(name); i++) {
+ if (!isdigit(name[i])) {
+ is_id = False;
+ break;
+ }
+ }
+
+ if (is_id) {
+ id = atoi(name);
+ }
+
+ info = XIQueryDevice(display, XIAllDevices, &ndevices);
+ for(i = 0; i < ndevices; i++)
+ {
+ if ((is_id && info[i].deviceid == id) ||
+ (!is_id && strcmp(info[i].name, name) == 0))
+ {
+ return &info[i];
+ }
+ }
+
+ XIFreeDeviceInfo(info);
+ return NULL;
+}
+#endif
+
static void
usage(void)
{
func = argv[1];
while((*func) == '-') func++;
- if (!is_xinput_present(display)) {
+ if (!xinput_version(display)) {
fprintf(stderr, "%s extension not available\n", INAME);
return EXIT_FAILURE;
}
int r = (*driver->func)(display, argc-2, argv+2,
driver->func_name, driver->arg_desc);
XSync(display, False);
+ XCloseDisplay(display);
return r;
}
driver++;