]> diplodocus.org Git - xorg-xinput/blobdiff - src/xinput.c
If XI2 is available, list devices through XIQueryDevice.
[xorg-xinput] / src / xinput.c
index 466a814d891041b23673247ff39a75c368421efb..88fe2fa311c0b94a80012894019d085e094a66e4 100644 (file)
@@ -135,25 +135,23 @@ static entry drivers[] =
     }
 };
 
-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*
@@ -191,6 +189,7 @@ find_device_info(Display    *display,
                        "Warning: There are multiple devices named \"%s\".\n"
                        "To ensure the correct one is selected, please use "
                        "the device ID instead.\n\n", name);
+                return NULL;
            } else {
                found = &devices[loop];
            }
@@ -199,6 +198,43 @@ find_device_info(Display   *display,
     return found;
 }
 
+#ifdef HAVE_XI2
+int
+xi2_find_device_id(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);
+    } else
+    {
+        info = XIQueryDevice(display, AllDevices, &ndevices);
+        for(i = 0; i < ndevices; i++)
+        {
+            if ((is_id && info[i].deviceid == id) ||
+                    (!is_id && strcmp(info[i].name, name) == 0))
+            {
+                id = info[i].deviceid;
+                break;
+            }
+        }
+
+        XIFreeDeviceInfo(info);
+    }
+    return id;;
+}
+#endif
+
 static void
 usage(void)
 {
@@ -235,7 +271,7 @@ main(int argc, char * argv[])
     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;
     }