]> diplodocus.org Git - xorg-xinput/blobdiff - src/list.c
xinput 1.4.0
[xorg-xinput] / src / list.c
index 9ef3d6163360cecba905bee90716f903538b3967..de8aca7981f41a68e49eb105d08e70de3cc0c893 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 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
  * 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.
  *
  * 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
  * 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
  * 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
@@ -23,6 +23,7 @@
 
 #include "xinput.h"
 #include <string.h>
 
 #include "xinput.h"
 #include <string.h>
+#include <X11/extensions/XIproto.h> /* for XI_Device***ChangedNotify */
 
 static void
 print_info(XDeviceInfo *info, Bool shortformat)
 
 static void
 print_info(XDeviceInfo *info, Bool shortformat)
@@ -33,6 +34,9 @@ print_info(XDeviceInfo        *info, Bool shortformat)
     XButtonInfoPtr     b;
     XValuatorInfoPtr   v;
     XAxisInfoPtr       a;
     XButtonInfoPtr     b;
     XValuatorInfoPtr   v;
     XAxisInfoPtr       a;
+#if HAVE_XI2
+    XAttachInfoPtr      att;
+#endif
 
     printf("\"%s\"\tid=%ld\t[", info->name, info->id);
 
 
     printf("\"%s\"\tid=%ld\t[", info->name, info->id);
 
@@ -91,7 +95,12 @@ print_info(XDeviceInfo       *info, Bool shortformat)
                    printf ("\t\tResolution is %d\n", a->resolution);
                }
                break;
                    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");
            }
            default:
                printf ("unknown class\n");
            }
@@ -110,25 +119,60 @@ list(Display      *display,
     XDeviceInfo                *info;
     int                        loop;
     int                 shortformat = False;
     XDeviceInfo                *info;
     int                        loop;
     int                 shortformat = False;
+    int                 daemon = False;
 
     shortformat = (argc == 1 && strcmp(argv[0], "--short") == 0);
 
     shortformat = (argc == 1 && strcmp(argv[0], "--short") == 0);
+    daemon = (argc == 1 && strcmp(argv[0], "--loop") == 0);
 
 
-    if (argc == 0 || shortformat) {
+    if (argc == 0 || shortformat || daemon) {
        int             num_devices;
        int             num_devices;
-
-       info = XListInputDevices(display, &num_devices);
-
-       for(loop=0; loop<num_devices; loop++) {
-           print_info(info+loop, shortformat);
-       }
+        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++) {
     } 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) {
 
            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);
                ret = EXIT_FAILURE;
            } else {
                print_info(info, shortformat);