]> diplodocus.org Git - xorg-xinput/blobdiff - src/xinput.c
Require inputproto 1.9.99.12
[xorg-xinput] / src / xinput.c
index e174388b288d3df316f4b5b6efd547e3702ef023..007fe2cd1248336e5d577678ada99966d7be1d33 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
-);
+typedef int (*prog)(Display* display, int argc, char *argv[],
+                   char *prog_name, char *prog_desc);
 
 typedef struct
 {
 
 typedef struct
 {
@@ -106,6 +102,11 @@ static entry drivers[] =
       "<window> <device>",
       set_clientpointer
     },
       "<window> <device>",
       set_clientpointer
     },
+    { "test-xi2",
+      "<device>",
+      test_xi2,
+    },
+#endif
     { "list-props",
       "<device> [<device> ...]",
       list_props
     { "list-props",
       "<device> [<device> ...]",
       list_props
@@ -114,6 +115,14 @@ static entry drivers[] =
       "<device> <property> <format (8, 16, 32)> <val> [<val> ...]",
       set_int_prop
     },
       "<device> <property> <format (8, 16, 32)> <val> [<val> ...]",
       set_int_prop
     },
+    { "set-float-prop",
+      "<device> <property> <val> [<val> ...]",
+      set_float_prop
+    },
+    { "set-atom-prop",
+      "<device> <property> <val> [<val> ...]",
+      set_atom_prop
+    },
     { "watch-props",
       "<device>",
       watch_props
     { "watch-props",
       "<device>",
       watch_props
@@ -122,30 +131,31 @@ static entry drivers[] =
       "<device> <property>",
       delete_prop
     },
       "<device> <property>",
       delete_prop
     },
-#endif
-    {0, 0, 0
+    { "set-prop",
+      "<device> <property> <val> [<val> ...]",
+      set_prop
+    },
+    {NULL, NULL, NULL
     }
 };
 
     }
 };
 
-static Bool
-is_xinput_present(Display      *display)
+int
+xinput_version(Display *display)
 {
     XExtensionVersion  *version;
 {
     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);
     version = XGetExtensionVersion(display, INAME);
-#endif
 
     if (version && (version != (XExtensionVersion*) NoSuchExtension)) {
 
     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*
@@ -159,7 +169,7 @@ find_device_info(Display    *display,
     int                num_devices;
     int                len = strlen(name);
     Bool       is_id = True;
     int                num_devices;
     int                len = strlen(name);
     Bool       is_id = True;
-    XID                id;
+    XID                id = (XID)-1;
 
     for(loop=0; loop<len; loop++) {
        if (!isdigit(name[loop])) {
 
     for(loop=0; loop<len; loop++) {
        if (!isdigit(name[loop])) {
@@ -183,6 +193,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;
            } else {
                found = &devices[loop];
            }
            } else {
                found = &devices[loop];
            }
@@ -191,6 +202,41 @@ find_device_info(Display   *display,
     return found;
 }
 
     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)
 {
 static void
 usage(void)
 {
@@ -227,7 +273,7 @@ main(int argc, char * argv[])
     func = argv[1];
     while((*func) == '-') func++;
 
     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;
     }
        fprintf(stderr, "%s extension not available\n", INAME);
        return EXIT_FAILURE;
     }
@@ -236,7 +282,8 @@ main(int argc, char * argv[])
        if (strcmp(driver->func_name, func) == 0) {
            int r = (*driver->func)(display, argc-2, argv+2,
                                    driver->func_name, driver->arg_desc);
        if (strcmp(driver->func_name, func) == 0) {
            int r = (*driver->func)(display, argc-2, argv+2,
                                    driver->func_name, driver->arg_desc);
-           XFlush(display);
+           XSync(display, False);
+           XCloseDisplay(display);
            return r;
        }
        driver++;
            return r;
        }
        driver++;