]> diplodocus.org Git - xorg-xinput/blobdiff - src/xinput.c
xinput 1.5.0
[xorg-xinput] / src / xinput.c
index 029b3fbd98a134e54e92a38178cb5b4c81f76e85..149662d2068c4fb8878e91fa565aa65962afc0a0 100644 (file)
 #include <ctype.h>
 #include <string.h>
 
 #include <ctype.h>
 #include <string.h>
 
-typedef int (*prog)(
-#if NeedFunctionPrototypes
-                   Display* display, int argc, char *argv[],
-                   char *prog_name, char *prog_desc
-#endif
-);
+int xi_opcode;
+
+typedef int (*prog)(Display* display, int argc, char *argv[],
+                   char *prog_name, char *prog_desc);
 
 typedef struct
 {
 
 typedef struct
 {
@@ -70,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",
@@ -81,17 +79,13 @@ static entry drivers[] =
      "[-proximity] <device name>",
      test
     },
      "[-proximity] <device name>",
      test
     },
-    {"version",
-     "",
-     version
-    },
 #if HAVE_XI2
     { "create-master",
 #if HAVE_XI2
     { "create-master",
-      "<id> [sendCore (dflt:1)] [enable (dflt:1)]",
+      "<id> [<sendCore (dflt:1)>] [<enable (dflt:1)>]",
       create_master
     },
     { "remove-master",
       create_master
     },
     { "remove-master",
-      "<id> [returnMode (dflt:Floating)] [returnPointer] [returnKeyboard]",
+      "<id> [Floating|AttachToMaster (dflt:Floating)] [<returnPointer>] [<returnKeyboard>]",
       remove_master
     },
     { "reattach",
       remove_master
     },
     { "reattach",
@@ -106,6 +100,10 @@ static entry drivers[] =
       "<window> <device>",
       set_clientpointer
     },
       "<window> <device>",
       set_clientpointer
     },
+    { "test-xi2",
+      "<device>",
+      test_xi2,
+    },
 #endif
     { "list-props",
       "<device> [<device> ...]",
 #endif
     { "list-props",
       "<device> [<device> ...]",
@@ -131,25 +129,62 @@ static entry drivers[] =
       "<device> <property>",
       delete_prop
     },
       "<device> <property>",
       delete_prop
     },
+    { "set-prop",
+      "<device> [--type=atom|float|int] [--format=8|16|32] <property> <val> [<val> ...]",
+      set_prop
+    },
     {NULL, NULL, NULL
     }
 };
 
     {NULL, NULL, NULL
     }
 };
 
-static Bool
-is_xinput_present(Display      *display)
+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)
 {
     XExtensionVersion  *version;
 {
     XExtensionVersion  *version;
-    Bool               present;
+    static int vers = -1;
+
+    if (vers != -1)
+        return vers;
 
     version = XGetExtensionVersion(display, INAME);
 
     if (version && (version != (XExtensionVersion*) NoSuchExtension)) {
 
     version = XGetExtensionVersion(display, INAME);
 
     if (version && (version != (XExtensionVersion*) NoSuchExtension)) {
-       present = version->present;
+       vers = version->major_version;
        XFree(version);
        XFree(version);
-       return present;
-    } else {
-       return False;
     }
     }
+
+    return vers;
 }
 
 XDeviceInfo*
 }
 
 XDeviceInfo*
@@ -187,7 +222,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);
                        "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;
+               return NULL;
            } else {
                found = &devices[loop];
            }
            } else {
                found = &devices[loop];
            }
@@ -197,8 +232,8 @@ find_device_info(Display    *display,
 }
 
 #ifdef HAVE_XI2
 }
 
 #ifdef HAVE_XI2
-int
-xi2_find_device_id(Display *display, char *name)
+XIDeviceInfo*
+xi2_find_device_info(Display *display, char *name)
 {
     XIDeviceInfo *info;
     int ndevices;
 {
     XIDeviceInfo *info;
     int ndevices;
@@ -214,22 +249,20 @@ xi2_find_device_id(Display *display, char *name)
 
     if (is_id) {
        id = atoi(name);
 
     if (is_id) {
        id = atoi(name);
-    } else
+    }
+
+    info = XIQueryDevice(display, XIAllDevices, &ndevices);
+    for(i = 0; i < ndevices; i++)
     {
     {
-        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))
         {
         {
-            if ((is_id && info[i].deviceid == id) ||
-                    (!is_id && strcmp(info[i].name, name) == 0))
-            {
-                id = info[i].deviceid;
-                break;
-            }
+            return &info[i];
         }
         }
-
-        XIFreeDeviceInfo(info);
     }
     }
-    return id;;
+
+    XIFreeDeviceInfo(info);
+    return NULL;
 }
 #endif
 
 }
 #endif
 
@@ -253,12 +286,20 @@ main(int argc, char * argv[])
     Display    *display;
     entry      *driver = drivers;
     char        *func;
     Display    *display;
     entry      *driver = drivers;
     char        *func;
+    int event, error;
 
     if (argc < 2) {
        usage();
        return EXIT_FAILURE;
     }
 
 
     if (argc < 2) {
        usage();
        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) {
@@ -266,10 +307,12 @@ main(int argc, char * argv[])
        return EXIT_FAILURE;
     }
 
        return EXIT_FAILURE;
     }
 
-    func = argv[1];
-    while((*func) == '-') func++;
+    if (!XQueryExtension(display, "XInputExtension", &xi_opcode, &event, &error)) {
+        printf("X Input extension not available.\n");
+        return EXIT_FAILURE;
+    }
 
 
-    if (!is_xinput_present(display)) {
+    if (!xinput_version(display)) {
        fprintf(stderr, "%s extension not available\n", INAME);
        return EXIT_FAILURE;
     }
        fprintf(stderr, "%s extension not available\n", INAME);
        return EXIT_FAILURE;
     }
@@ -279,6 +322,7 @@ main(int argc, char * argv[])
            int r = (*driver->func)(display, argc-2, argv+2,
                                    driver->func_name, driver->arg_desc);
            XSync(display, False);
            int r = (*driver->func)(display, argc-2, argv+2,
                                    driver->func_name, driver->arg_desc);
            XSync(display, False);
+           XCloseDisplay(display);
            return r;
        }
        driver++;
            return r;
        }
        driver++;