]> diplodocus.org Git - xorg-xinput/blobdiff - src/list.c
Require inputproto 1.9.99.4
[xorg-xinput] / src / list.c
index 141bff7a9e3763d4fa69d6edf045868083c7f9ff..de8aca7981f41a68e49eb105d08e70de3cc0c893 100644 (file)
@@ -1,19 +1,19 @@
 /*
  * Copyright 1996 by Frederic Lepied, France. <Frederic.Lepied@sugix.frmug.org>
- *                                                                            
+ *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * 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,
+ * is provided "as is" without express or implied warranty.
+ *
+ * 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
  */
 
 #include "xinput.h"
-
-static const char rcs_id[] = "$Id: list.c,v 1.1.1.2 1997/06/09 16:00:48 fred Exp $";
+#include <string.h>
+#include <X11/extensions/XIproto.h> /* for XI_Device***ChangedNotify */
 
 static void
-print_info(XDeviceInfo *info)
+print_info(XDeviceInfo *info, Bool shortformat)
 {
     int                        i,j;
     XAnyClassPtr       any;
@@ -34,10 +34,36 @@ print_info(XDeviceInfo      *info)
     XButtonInfoPtr     b;
     XValuatorInfoPtr   v;
     XAxisInfoPtr       a;
+#if HAVE_XI2
+    XAttachInfoPtr      att;
+#endif
 
-    printf("\"%s\"\tid=%ld\t[%s]\n", info->name, info->id,
-          (info->use == IsXExtensionDevice) ? "XExtensionDevice" :
-          ((info->use == IsXPointer) ? "XPointer" : "XKeyboard"));
+    printf("\"%s\"\tid=%ld\t[", info->name, info->id);
+
+    switch (info->use) {
+    case IsXPointer:
+       printf("XPointer");
+       break;
+    case IsXKeyboard:
+       printf("XKeyboard");
+       break;
+    case IsXExtensionDevice:
+       printf("XExtensionDevice");
+       break;
+    case IsXExtensionKeyboard:
+       printf("XExtensionKeyboard");
+       break;
+    case IsXExtensionPointer:
+       printf("XExtensionPointer");
+       break;
+    default:
+       printf("Unknown class");
+       break;
+    }
+    printf("]\n");
+
+    if (shortformat)
+        return;
 
     if (info->num_classes > 0) {
        any = (XAnyClassPtr) (info->inputclassinfo);
@@ -57,7 +83,7 @@ print_info(XDeviceInfo        *info)
 
            case ValuatorClass:
                v = (XValuatorInfoPtr) any;
-               a = (XAxisInfoPtr) ((char *) v + 
+               a = (XAxisInfoPtr) ((char *) v +
                                    sizeof (XValuatorInfo));
                printf("\tNum_axes is %d\n", v->num_axes);
                printf("\tMode is %s\n", (v->mode == Absolute) ? "Absolute" : "Relative");
@@ -69,7 +95,12 @@ print_info(XDeviceInfo       *info)
                    printf ("\t\tResolution is %d\n", a->resolution);
                }
                break;
-               
+#if HAVE_XI2
+            case AttachClass:
+                att = (XAttachInfoPtr)any;
+                printf("\tAttached to %d\n", att->attached);
+                break;
+#endif
            default:
                printf ("unknown class\n");
            }
@@ -87,26 +118,64 @@ list(Display       *display,
 {
     XDeviceInfo                *info;
     int                        loop;
+    int                 shortformat = False;
+    int                 daemon = False;
+
+    shortformat = (argc == 1 && strcmp(argv[0], "--short") == 0);
+    daemon = (argc == 1 && strcmp(argv[0], "--loop") == 0);
 
-    if (argc == 0) {
+    if (argc == 0 || shortformat || daemon) {
        int             num_devices;
-    
-       info = XListInputDevices(display, &num_devices);
-       
-       for(loop=0; loop<num_devices; loop++) {
-           print_info(info+loop);
-       }
+        XEvent  ev;
+
+#if HAVE_XI2
+        if (daemon)
+        {
+            XiSelectEvent(display, DefaultRootWindow(display), NULL,
+                          XI_DeviceHierarchyChangedMask |
+                          XI_DeviceClassesChangedMask);
+        }
+#endif
+
+        do {
+            info = XListInputDevices(display, &num_devices);
+            for(loop=0; loop<num_devices; loop++) {
+                print_info(info+loop, shortformat);
+            }
+
+#if HAVE_XI2
+            /* 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;
+                }
+            }
+#endif
+        } 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);
+               print_info(info, shortformat);
            }
        }
        return ret;
@@ -114,5 +183,4 @@ list(Display        *display,
     return EXIT_SUCCESS;
 }
 
-/* end of list.c
- */
+/* end of list.c */