]> diplodocus.org Git - xorg-xinput/blobdiff - src/xinput.c
xinput 1.6.3
[xorg-xinput] / src / xinput.c
index 2d9a8931456c8b5d1f8147e9268f2ec68e8c6e85..7b27ffeb42d466d7b33411060215bf6b18af1d0b 100644 (file)
@@ -101,12 +101,12 @@ static entry drivers[] =
       set_clientpointer
     },
     { "test-xi2",
       set_clientpointer
     },
     { "test-xi2",
-      "<device>",
+      "[--root] <device>",
       test_xi2,
     },
       test_xi2,
     },
-    { "map-to-crtc",
-      "<device> <crtc name>",
-      map_to_crtc,
+    { "map-to-output",
+      "<device> <output name>",
+      map_to_output,
     },
 #endif
     { "list-props",
     },
 #endif
     { "list-props",
@@ -137,14 +137,24 @@ static entry drivers[] =
       "<device> [--type=atom|float|int] [--format=8|16|32] <property> <val> [<val> ...]",
       set_prop
     },
       "<device> [--type=atom|float|int] [--format=8|16|32] <property> <val> [<val> ...]",
       set_prop
     },
+    {
+      "disable",
+      "<device>",
+      disable,
+    },
+    {
+      "enable",
+      "<device>",
+      enable,
+    },
     {NULL, NULL, NULL
     }
 };
 
 static const char version_id[] = VERSION;
 
     {NULL, NULL, NULL
     }
 };
 
 static const char version_id[] = VERSION;
 
-int
-print_version()
+static int
+print_version(void)
 {
     XExtensionVersion  *version;
     Display *display;
 {
     XExtensionVersion  *version;
     Display *display;
@@ -192,13 +202,26 @@ xinput_version(Display    *display)
     /* Announce our supported version so the server treats us correctly. */
     if (vers >= XI_2_Major)
     {
     /* Announce our supported version so the server treats us correctly. */
     if (vers >= XI_2_Major)
     {
+        const char *forced_version;
         int maj = 2,
             min = 0;
 
         int maj = 2,
             min = 0;
 
-#if HAVE_XI21
+#if HAVE_XI22
+        min = 2;
+#elif HAVE_XI21
         min = 1;
 #endif
 
         min = 1;
 #endif
 
+        forced_version = getenv("XINPUT_XI2_VERSION");
+        if (forced_version) {
+            if (sscanf(forced_version, "%d.%d", &maj, &min) != 2) {
+                fprintf(stderr, "Invalid format of XINPUT_XI2_VERSION "
+                                "environment variable. Need major.minor\n");
+                exit(1);
+            }
+            printf("Overriding XI2 version to: %d.%d\n", maj, min);
+        }
+
         XIQueryVersion(display, &maj, &min);
     }
 #endif
         XIQueryVersion(display, &maj, &min);
     }
 #endif
@@ -238,7 +261,7 @@ find_device_info(Display    *display,
             (is_id && devices[loop].id == id))) {
            if (found) {
                fprintf(stderr,
             (is_id && devices[loop].id == id))) {
            if (found) {
                fprintf(stderr,
-                       "Warning: There are multiple devices named \"%s\".\n"
+                       "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;
                        "To ensure the correct one is selected, please use "
                        "the device ID instead.\n\n", name);
                return NULL;
@@ -250,7 +273,7 @@ find_device_info(Display    *display,
     return found;
 }
 
     return found;
 }
 
-#ifdef HAVE_XI2
+#if HAVE_XI2
 Bool is_pointer(int use)
 {
     return use == XIMasterPointer || use == XISlavePointer;
 Bool is_pointer(int use)
 {
     return use == XIMasterPointer || use == XISlavePointer;
@@ -338,6 +361,26 @@ usage(void)
     }
 }
 
     }
 }
 
+static Bool
+is_xwayland(Display *dpy)
+{
+    XDeviceInfo *devices;
+    int n;
+    Bool is_xwayland = False;
+
+    devices = XListInputDevices(dpy, &n);
+    while (n-- > 0) {
+        if (strncmp(devices[n].name, "xwayland-", 9) == 0) {
+            is_xwayland = True;
+            break;
+        }
+    }
+
+    XFreeDeviceList(devices);
+
+    return is_xwayland;
+}
+
 int
 main(int argc, char * argv[])
 {
 int
 main(int argc, char * argv[])
 {
@@ -354,7 +397,7 @@ main(int argc, char * argv[])
     }
 
     if (strcmp("version", func) == 0) {
     }
 
     if (strcmp("version", func) == 0) {
-        return print_version(argv[0]);
+        return print_version();
     }
 
     if (strcmp("help", func) == 0) {
     }
 
     if (strcmp("help", func) == 0) {
@@ -366,19 +409,22 @@ main(int argc, char * argv[])
 
     if (display == NULL) {
        fprintf(stderr, "Unable to connect to X server\n");
 
     if (display == NULL) {
        fprintf(stderr, "Unable to connect to X server\n");
-       return EXIT_FAILURE;
+       goto out;
     }
 
     if (!XQueryExtension(display, "XInputExtension", &xi_opcode, &event, &error)) {
         printf("X Input extension not available.\n");
     }
 
     if (!XQueryExtension(display, "XInputExtension", &xi_opcode, &event, &error)) {
         printf("X Input extension not available.\n");
-        return EXIT_FAILURE;
+        goto out;
     }
 
     if (!xinput_version(display)) {
        fprintf(stderr, "%s extension not available\n", INAME);
     }
 
     if (!xinput_version(display)) {
        fprintf(stderr, "%s extension not available\n", INAME);
-       return EXIT_FAILURE;
+       goto out;
     }
 
     }
 
+    if (is_xwayland(display))
+        fprintf(stderr, "WARNING: running xinput against an Xwayland server. See the xinput man page for details.\n");
+
     while(driver->func_name) {
        if (strcmp(driver->func_name, func) == 0) {
            int r = (*driver->func)(display, argc-2, argv+2,
     while(driver->func_name) {
        if (strcmp(driver->func_name, func) == 0) {
            int r = (*driver->func)(display, argc-2, argv+2,
@@ -392,6 +438,9 @@ main(int argc, char * argv[])
 
     usage();
 
 
     usage();
 
+out:
+    if (display)
+        XCloseDisplay(display);
     return EXIT_FAILURE;
 }
 
     return EXIT_FAILURE;
 }