]> diplodocus.org Git - xorg-xinput/blobdiff - src/xinput.c
xinput 1.5.2
[xorg-xinput] / src / xinput.c
index 1a1e7cef9937419df7b704f20a5651959d3fc76f..9ca3832a4ce1993154b95632dab18d6cb3f88beb 100644 (file)
@@ -68,7 +68,7 @@ static entry drivers[] =
      set_mode
     },
     {"list",
      set_mode
     },
     {"list",
-     "[--loop || --short || <device name>...]",
+     "[--short || --long] [<device name>...]",
      list
     },
     {"query-state",
      list
     },
     {"query-state",
@@ -79,10 +79,6 @@ static entry drivers[] =
      "[-proximity] <device name>",
      test
     },
      "[-proximity] <device name>",
      test
     },
-    {"version",
-     "",
-     version
-    },
 #if HAVE_XI2
     { "create-master",
       "<id> [<sendCore (dflt:1)>] [<enable (dflt:1)>]",
 #if HAVE_XI2
     { "create-master",
       "<id> [<sendCore (dflt:1)>] [<enable (dflt:1)>]",
@@ -141,6 +137,37 @@ static entry drivers[] =
     }
 };
 
     }
 };
 
+static const char version_id[] = VERSION;
+
+int
+print_version()
+{
+    XExtensionVersion  *version;
+    Display *display;
+
+    printf("xinput version %s\n", version_id);
+
+    display = XOpenDisplay(NULL);
+
+    printf("XI version on server: ");
+
+    if (display == NULL)
+        printf("Failed to open display.\n");
+    else {
+        version = XGetExtensionVersion(display, INAME);
+        if (!version || (version == (XExtensionVersion*) NoSuchExtension))
+            printf(" Extension not supported.\n");
+        else {
+            printf("%d.%d\n", version->major_version,
+                    version->minor_version);
+            XFree(version);
+            return 0;
+        }
+    }
+
+    return 1;
+}
+
 int
 xinput_version(Display *display)
 {
 int
 xinput_version(Display *display)
 {
@@ -205,10 +232,42 @@ find_device_info(Display  *display,
 }
 
 #ifdef HAVE_XI2
 }
 
 #ifdef HAVE_XI2
+Bool is_pointer(int use)
+{
+    return use == XIMasterPointer || use == XISlavePointer;
+}
+
+Bool is_keyboard(int use)
+{
+    return use == XIMasterKeyboard || use == XISlaveKeyboard;
+}
+
+Bool device_matches(XIDeviceInfo *info, char *name)
+{
+    if (strcmp(info->name, name) == 0) {
+        return True;
+    }
+
+    if (strncmp(name, "pointer:", strlen("pointer:")) == 0 &&
+        strcmp(info->name, name + strlen("pointer:")) == 0 &&
+        is_pointer(info->use)) {
+        return True;
+    }
+
+    if (strncmp(name, "keyboard:", strlen("keyboard:")) == 0 &&
+        strcmp(info->name, name + strlen("keyboard:")) == 0 &&
+        is_keyboard(info->use)) {
+        return True;
+    }
+
+    return False;
+}
+
 XIDeviceInfo*
 xi2_find_device_info(Display *display, char *name)
 {
     XIDeviceInfo *info;
 XIDeviceInfo*
 xi2_find_device_info(Display *display, char *name)
 {
     XIDeviceInfo *info;
+    XIDeviceInfo *found = NULL;
     int ndevices;
     Bool is_id = True;
     int i, id = -1;
     int ndevices;
     Bool is_id = True;
     int i, id = -1;
@@ -227,15 +286,22 @@ xi2_find_device_info(Display *display, char *name)
     info = XIQueryDevice(display, XIAllDevices, &ndevices);
     for(i = 0; i < ndevices; i++)
     {
     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];
+        if (is_id ? info[i].deviceid == id : device_matches (&info[i], name)) {
+            if (found) {
+                fprintf(stderr,
+                        "Warning: There are multiple devices matching '%s'.\n"
+                        "To ensure the correct one is selected, please use "
+                        "the device ID, or prefix the\ndevice name with "
+                        "'pointer:' or 'keyboard:' as appropriate.\n\n", name);
+                XIFreeDeviceInfo(info);
+                return NULL;
+            } else {
+                found = &info[i];
+            }
         }
     }
 
         }
     }
 
-    XIFreeDeviceInfo(info);
-    return NULL;
+    return found;
 }
 #endif
 
 }
 #endif
 
@@ -266,6 +332,13 @@ main(int argc, char * argv[])
        return EXIT_FAILURE;
     }
 
        return EXIT_FAILURE;
     }
 
+    func = argv[1];
+    while((*func) == '-') func++;
+
+    if (strcmp("version", func) == 0) {
+        return print_version(argv[0]);
+    }
+
     display = XOpenDisplay(NULL);
 
     if (display == NULL) {
     display = XOpenDisplay(NULL);
 
     if (display == NULL) {
@@ -278,9 +351,6 @@ main(int argc, char * argv[])
         return EXIT_FAILURE;
     }
 
         return EXIT_FAILURE;
     }
 
-    func = argv[1];
-    while((*func) == '-') func++;
-
     if (!xinput_version(display)) {
        fprintf(stderr, "%s extension not available\n", INAME);
        return EXIT_FAILURE;
     if (!xinput_version(display)) {
        fprintf(stderr, "%s extension not available\n", INAME);
        return EXIT_FAILURE;