/*
* 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;
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);
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");
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");
}
{
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;
return EXIT_SUCCESS;
}
-/* end of list.c
- */
+/* end of list.c */