]> diplodocus.org Git - xorg-xinput/blobdiff - src/list.c
xinput 1.5.0
[xorg-xinput] / src / list.c
index 24edc70b43fc9196a11ee74335b61799685ad4c2..ecf1f4ba5499813d774e7e7740420d0d01d2749e 100644 (file)
@@ -104,42 +104,15 @@ print_info(Display* dpy, XDeviceInfo      *info, Bool shortformat)
 }
 
 static int list_xi1(Display     *display,
-                    int                argc,
-                    char        *argv[],
-                    char        *name,
-                    char        *desc)
+                    int                shortformat)
 {
     XDeviceInfo                *info;
     int                        loop;
-    int                 shortformat = False;
-    int                 daemon = False;
+    int                 num_devices;
 
-    shortformat = (argc == 1 && strcmp(argv[0], "--short") == 0);
-    daemon = (argc == 1 && strcmp(argv[0], "--loop") == 0);
-
-    if (argc == 0 || shortformat || daemon) {
-       int             num_devices;
-
-        do {
-            info = XListInputDevices(display, &num_devices);
-            for(loop=0; loop<num_devices; loop++) {
-                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[loop], False);
-
-           if (!info) {
-               fprintf(stderr, "unable to find device %s\n", argv[loop]);
-               ret = EXIT_FAILURE;
-           } else {
-               print_info(display, info, shortformat);
-           }
-       }
-       return ret;
+    info = XListInputDevices(display, &num_devices);
+    for(loop=0; loop<num_devices; loop++) {
+        print_info(display, info+loop, shortformat);
     }
     return EXIT_SUCCESS;
 }
@@ -150,35 +123,55 @@ void
 print_classes_xi2(Display* display, XIAnyClassInfo **classes,
                   int num_classes)
 {
-    int i;
+    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 ButtonClass:
+            case XIButtonClass:
                 {
                     XIButtonClassInfo *b = (XIButtonClassInfo*)classes[i];
+                    char *name;
                     printf("\t\tButtons supported: %d\n", b->num_buttons);
+                    printf("\t\tButton labels:");
+                    for (j = 0; j < b->num_buttons; j++)
+                    {
+                        name = (b->labels[j]) ? XGetAtomName(display, b->labels[j]) : NULL;
+                        printf(" %s", (name) ? name : "None");
+                        XFree(name);
+                    }
+                    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 KeyClass:
+            case XIKeyClass:
                 {
                     XIKeyClassInfo *k = (XIKeyClassInfo*)classes[i];
                     printf("\t\tKeycodes supported: %d\n", k->num_keycodes);
                 }
                 break;
-            case ValuatorClass:
+            case XIValuatorClass:
                 {
                     XIValuatorClassInfo *v = (XIValuatorClassInfo*)classes[i];
+                    char *name = v->label ?  XGetAtomName(display, v->label) : NULL;
+
                     printf("\t\tDetail for Valuator %d:\n", v->number);
-                    printf("\t\t  Name: %s\n", XGetAtomName(display, v->name));
+                    printf("\t\t  Label: %s\n",  (name) ? name : "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);
+                    XFree(name);
                 }
                 break;
         }
@@ -193,19 +186,19 @@ print_info_xi2(Display* display, XIDeviceInfo *dev, Bool shortformat)
     printf("%-40s\tid=%d\t[", dev->name, dev->deviceid);
     switch(dev->use)
     {
-        case MasterPointer:
+        case XIMasterPointer:
             printf("master pointer  (%d)]\n", dev->attachment);
             break;
-        case MasterKeyboard:
+        case XIMasterKeyboard:
             printf("master keyboard (%d)]\n", dev->attachment);
             break;
-        case SlavePointer:
+        case XISlavePointer:
             printf("slave  pointer  (%d)]\n", dev->attachment);
             break;
-        case SlaveKeyboard:
+        case XISlaveKeyboard:
             printf("slave  keyboard (%d)]\n", dev->attachment);
             break;
-        case FloatingSlave:
+        case XIFloatingSlave:
             printf("floating slave]\n");
             break;
     }
@@ -220,21 +213,16 @@ print_info_xi2(Display* display, XIDeviceInfo *dev, Bool shortformat)
 }
 
 
-int
-list_xi2(Display       *display,
-         int   argc,
-         char  *argv[],
-         char  *name,
-         char  *desc)
+static int
+list_xi2(Display *display,
+         int     shortformat)
 {
     int major = XI_2_Major,
         minor = XI_2_Minor;
     int ndevices;
-    int i, j, shortformat;
+    int i, j;
     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))
     {
@@ -242,15 +230,14 @@ list_xi2(Display  *display,
         return EXIT_FAILURE;
     }
 
-    info = XIQueryDevice(display, AllDevices, &ndevices);
-    dev = info;
+    info = XIQueryDevice(display, XIAllDevices, &ndevices);
 
     for(i = 0; i < ndevices; i++)
     {
         dev = &info[i];
-        if (dev->use == MasterPointer || dev->use == MasterKeyboard)
+        if (dev->use == XIMasterPointer || dev->use == XIMasterKeyboard)
         {
-            if (dev->use == MasterPointer)
+            if (dev->use == XIMasterPointer)
                 printf("⎡ ");
             else
                 printf("⎣ ");
@@ -260,16 +247,26 @@ list_xi2(Display  *display,
             {
                 XIDeviceInfo* sd = &info[j];
 
-                if ((sd->use == SlavePointer || sd->use == SlaveKeyboard) &&
+                if ((sd->use == XISlavePointer || sd->use == XISlaveKeyboard) &&
                      (sd->attachment == dev->deviceid))
                 {
-                    printf("%s   ↳ ", dev->use == MasterPointer ? "⎜" : " ");
+                    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;
@@ -283,11 +280,44 @@ list(Display      *display,
      char      *name,
      char      *desc)
 {
+    int shortformat = (argc >= 1 && strcmp(argv[0], "--short") == 0);
+    int longformat = (argc >= 1 && strcmp(argv[0], "--long") == 0);
+    int arg_dev = shortformat || longformat;
+
+    if (argc > arg_dev)
+    {
+#ifdef HAVE_XI2
+        if (xinput_version(display) == XI_2_Major)
+        {
+            XIDeviceInfo *info = xi2_find_device_info(display, argv[arg_dev]);
+
+            if (!info) {
+                fprintf(stderr, "unable to find device %s\n", argv[arg_dev]);
+                return EXIT_FAILURE;
+            } else {
+                print_info_xi2(display, info, shortformat);
+                return EXIT_SUCCESS;
+            }
+        } else
+#endif
+        {
+            XDeviceInfo *info = find_device_info(display, argv[arg_dev], False);
+
+            if (!info) {
+                fprintf(stderr, "unable to find device %s\n", argv[arg_dev]);
+                return EXIT_FAILURE;
+            } else {
+                print_info(display, info, shortformat);
+                return EXIT_SUCCESS;
+            }
+        }
+    } else {
 #ifdef HAVE_XI2
-    if (xinput_version(display) == XI_2_Major)
-        return list_xi2(display, argc, argv, name, desc);
+        if (xinput_version(display) == XI_2_Major)
+            return list_xi2(display, !longformat);
 #endif
-    return list_xi1(display, argc, argv, name, desc);
+        return list_xi1(display, !longformat);
+    }
 }
 
 /* end of list.c */