]> diplodocus.org Git - xorg-xinput/blobdiff - src/list.c
Require inputproto 1.9.99.12
[xorg-xinput] / src / list.c
index e2886424c996a01c7fde28a7638fd5cbb59e140b..2313fbdfbf3360cf52664f853685848b55e6da42 100644 (file)
@@ -5,15 +5,15 @@
  * documentation for any purpose is  hereby granted without fee, provided that
  * the  above copyright   notice appear  in   all  copies and  that both  that
  * copyright  notice   and   this  permission   notice  appear  in  supporting
- * documentation, and that   the  name of  Frederic   Lepied not  be  used  in
+ * documentation, and that   the  name of  the authors  not  be  used  in
  * advertising or publicity pertaining to distribution of the software without
- * specific,  written      prior  permission.     Frederic  Lepied   makes  no
+ * specific,  written      prior  permission.     The authors  make  no
  * representations about the suitability of this software for any purpose.  It
  * is provided "as is" without express or implied warranty.
  *
- * FREDERIC  LEPIED DISCLAIMS ALL   WARRANTIES WITH REGARD  TO  THIS SOFTWARE,
+ * THE AUTHORS DISCLAIM ALL   WARRANTIES WITH REGARD  TO  THIS SOFTWARE,
  * INCLUDING ALL IMPLIED   WARRANTIES OF MERCHANTABILITY  AND   FITNESS, IN NO
- * EVENT  SHALL FREDERIC  LEPIED BE   LIABLE   FOR ANY  SPECIAL, INDIRECT   OR
+ * EVENT  SHALL THE AUTHORS  BE   LIABLE   FOR ANY  SPECIAL, INDIRECT   OR
  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
  * DATA  OR PROFITS, WHETHER  IN  AN ACTION OF  CONTRACT,  NEGLIGENCE OR OTHER
  * TORTIOUS  ACTION, ARISING    OUT OF OR   IN  CONNECTION  WITH THE USE    OR
@@ -26,7 +26,7 @@
 #include <X11/extensions/XIproto.h> /* for XI_Device***ChangedNotify */
 
 static void
-print_info(XDeviceInfo *info, Bool shortformat)
+print_info(Display* dpy, XDeviceInfo   *info, Bool shortformat)
 {
     int                        i,j;
     XAnyClassPtr       any;
@@ -34,7 +34,6 @@ print_info(XDeviceInfo        *info, Bool shortformat)
     XButtonInfoPtr     b;
     XValuatorInfoPtr   v;
     XAxisInfoPtr       a;
-    XAttachInfoPtr      att;
 
     printf("\"%s\"\tid=%ld\t[", info->name, info->id);
 
@@ -63,6 +62,9 @@ print_info(XDeviceInfo        *info, Bool shortformat)
     if (shortformat)
         return;
 
+    if(info->type != None)
+       printf("\tType is %s\n", XGetAtomName(dpy, info->type));
+
     if (info->num_classes > 0) {
        any = (XAnyClassPtr) (info->inputclassinfo);
        for (i=0; i<info->num_classes; i++) {
@@ -93,11 +95,6 @@ print_info(XDeviceInfo       *info, Bool shortformat)
                    printf ("\t\tResolution is %d\n", a->resolution);
                }
                break;
-            case AttachClass:
-                att = (XAttachInfoPtr)any;
-                printf("\tAttached to %d\n", att->attached);
-                break;
-
            default:
                printf ("unknown class\n");
            }
@@ -106,12 +103,11 @@ print_info(XDeviceInfo    *info, Bool shortformat)
     }
 }
 
-int
-list(Display   *display,
-     int       argc,
-     char      *argv[],
-     char      *name,
-     char      *desc)
+static int list_xi1(Display     *display,
+                    int                argc,
+                    char        *argv[],
+                    char        *name,
+                    char        *desc)
 {
     XDeviceInfo                *info;
     int                        loop;
@@ -123,53 +119,24 @@ list(Display      *display,
 
     if (argc == 0 || shortformat || daemon) {
        int             num_devices;
-        XEvent  ev;
-        int     daemon = argc;
-
-        if (daemon)
-        {
-            XiSelectEvent(display, DefaultRootWindow(display),
-                          XI_DeviceHierarchyChangedMask |
-                          XI_DeviceClassesChangedMask);
-        }
 
         do {
             info = XListInputDevices(display, &num_devices);
             for(loop=0; loop<num_devices; loop++) {
-                print_info(info+loop, shortformat);
-            }
-
-            /* just wait for the next generic event to come along */
-            while (daemon && !XNextEvent(display, &ev))
-            {
-                if (ev.type == GenericEvent)
-                {
-                    XGenericEvent* gev = (XGenericEvent*)&ev;
-                    /* we just assume that extension is IReqCode, pretty save
-                       since we don't register for other events. */
-                    if (gev->evtype == XI_DeviceHierarchyChangedNotify)
-                    {
-                        printf("Hierarchy change.\n");
-                    } else if (gev->evtype == XI_DeviceClassesChangedNotify)
-                    {
-                        printf("Device classes changed.\n");
-                        free(((XDeviceClassesChangedEvent*)&ev)->inputclassinfo);
-                    }
-                    break;
-                }
+                print_info(display, info+loop, shortformat);
             }
         } while(daemon);
     } else {
        int     ret = EXIT_SUCCESS;
 
        for(loop=0; loop<argc; loop++) {
-           info = find_device_info(display, argv[0], False);
+           info = find_device_info(display, argv[loop], False);
 
            if (!info) {
-               fprintf(stderr, "unable to find device %s\n", argv[0]);
+               fprintf(stderr, "unable to find device %s\n", argv[loop]);
                ret = EXIT_FAILURE;
            } else {
-               print_info(info, shortformat);
+               print_info(display, info, shortformat);
            }
        }
        return ret;
@@ -177,4 +144,171 @@ list(Display      *display,
     return EXIT_SUCCESS;
 }
 
+#ifdef HAVE_XI2
+/* also used from test_xi2.c */
+void
+print_classes_xi2(Display* display, XIAnyClassInfo **classes,
+                  int num_classes)
+{
+    int i, j;
+
+    printf("\tReporting %d classes:\n", num_classes);
+    for (i = 0; i < num_classes; i++)
+    {
+        printf("\t\tClass originated from: %d\n", classes[i]->sourceid);
+        switch(classes[i]->type)
+        {
+            case XIButtonClass:
+                {
+                    XIButtonClassInfo *b = (XIButtonClassInfo*)classes[i];
+                    printf("\t\tButtons supported: %d\n", b->num_buttons);
+                    printf("\t\tButton labels:");
+                    for (j = 0; j < b->num_buttons; j++)
+                        printf(" %s", (b->labels[j]) ? XGetAtomName(display, b->labels[j]) : "None");
+                    printf("\n");
+                    printf("\t\tButton state:");
+                    for (j = 0; j < b->state.mask_len * 8; j++)
+                        if (XIMaskIsSet(b->state.mask, j))
+                            printf(" %d", j);
+                    printf("\n");
+
+                }
+                break;
+            case XIKeyClass:
+                {
+                    XIKeyClassInfo *k = (XIKeyClassInfo*)classes[i];
+                    printf("\t\tKeycodes supported: %d\n", k->num_keycodes);
+                }
+                break;
+            case XIValuatorClass:
+                {
+                    XIValuatorClassInfo *v = (XIValuatorClassInfo*)classes[i];
+                    printf("\t\tDetail for Valuator %d:\n", v->number);
+                    printf("\t\t  Label: %s\n", v->label ?  XGetAtomName(display, v->label) : "None");
+                    printf("\t\t  Range: %f - %f\n", v->min, v->max);
+                    printf("\t\t  Resolution: %d units/m\n", v->resolution);
+                    printf("\t\t  Mode: %s\n", v->mode == Absolute ? "absolute" :
+                            "relative");
+                    if (v->mode == Absolute)
+                        printf("\t\t  Current value: %f\n", v->value);
+                }
+                break;
+        }
+    }
+
+    printf("\n");
+}
+
+static void
+print_info_xi2(Display* display, XIDeviceInfo *dev, Bool shortformat)
+{
+    printf("%-40s\tid=%d\t[", dev->name, dev->deviceid);
+    switch(dev->use)
+    {
+        case XIMasterPointer:
+            printf("master pointer  (%d)]\n", dev->attachment);
+            break;
+        case XIMasterKeyboard:
+            printf("master keyboard (%d)]\n", dev->attachment);
+            break;
+        case XISlavePointer:
+            printf("slave  pointer  (%d)]\n", dev->attachment);
+            break;
+        case XISlaveKeyboard:
+            printf("slave  keyboard (%d)]\n", dev->attachment);
+            break;
+        case XIFloatingSlave:
+            printf("floating slave]\n");
+            break;
+    }
+
+    if (shortformat)
+        return;
+
+    if (!dev->enabled)
+        printf("\tThis device is disabled\n");
+
+    print_classes_xi2(display, dev->classes, dev->num_classes);
+}
+
+
+int
+list_xi2(Display       *display,
+         int   argc,
+         char  *argv[],
+         char  *name,
+         char  *desc)
+{
+    int major = XI_2_Major,
+        minor = XI_2_Minor;
+    int ndevices;
+    int i, j, shortformat;
+    XIDeviceInfo *info, *dev;
+
+    shortformat = (argc == 1 && strcmp(argv[0], "--short") == 0);
+
+    if (XIQueryVersion(display, &major, &minor) != Success ||
+        (major * 1000 + minor) < (XI_2_Major * 1000 + XI_2_Minor))
+    {
+        fprintf(stderr, "XI2 not supported.\n");
+        return EXIT_FAILURE;
+    }
+
+    info = XIQueryDevice(display, XIAllDevices, &ndevices);
+
+    for(i = 0; i < ndevices; i++)
+    {
+        dev = &info[i];
+        if (dev->use == XIMasterPointer || dev->use == XIMasterKeyboard)
+        {
+            if (dev->use == XIMasterPointer)
+                printf("⎡ ");
+            else
+                printf("⎣ ");
+
+            print_info_xi2(display, dev, shortformat);
+            for (j = 0; j < ndevices; j++)
+            {
+                XIDeviceInfo* sd = &info[j];
+
+                if ((sd->use == XISlavePointer || sd->use == XISlaveKeyboard) &&
+                     (sd->attachment == dev->deviceid))
+                {
+                    printf("%s   ↳ ", dev->use == XIMasterPointer ? "⎜" : " ");
+                    print_info_xi2(display, sd, shortformat);
+                }
+            }
+        }
+    }
+
+    for (i = 0; i < ndevices; i++)
+    {
+        dev = &info[i];
+        if (dev->use == XIFloatingSlave)
+        {
+            printf("∼ ");
+            print_info_xi2(display, dev, shortformat);
+        }
+    }
+
+
+    XIFreeDeviceInfo(info);
+    return EXIT_SUCCESS;
+}
+#endif
+
+int
+list(Display   *display,
+     int       argc,
+     char      *argv[],
+     char      *name,
+     char      *desc)
+{
+#ifdef HAVE_XI2
+    if (xinput_version(display) == XI_2_Major)
+        return list_xi2(display, argc, argv, name, desc);
+#endif
+    return list_xi1(display, argc, argv, name, desc);
+}
+
 /* end of list.c */