list.c revision 5b944e2a
1b1297603Smrg/*
2b1297603Smrg * Copyright 1996 by Frederic Lepied, France. <Frederic.Lepied@sugix.frmug.org>
3b1297603Smrg *
4b1297603Smrg * Permission to use, copy, modify, distribute, and sell this software and its
5b1297603Smrg * documentation for any purpose is  hereby granted without fee, provided that
6b1297603Smrg * the  above copyright   notice appear  in   all  copies and  that both  that
7b1297603Smrg * copyright  notice   and   this  permission   notice  appear  in  supporting
85b944e2aSmrg * documentation, and that   the  name of  the authors  not  be  used  in
9b1297603Smrg * advertising or publicity pertaining to distribution of the software without
105b944e2aSmrg * specific,  written      prior  permission.     The authors  make  no
11b1297603Smrg * representations about the suitability of this software for any purpose.  It
12b1297603Smrg * is provided "as is" without express or implied warranty.
13b1297603Smrg *
145b944e2aSmrg * THE AUTHORS DISCLAIM ALL   WARRANTIES WITH REGARD  TO  THIS SOFTWARE,
15b1297603Smrg * INCLUDING ALL IMPLIED   WARRANTIES OF MERCHANTABILITY  AND   FITNESS, IN NO
165b944e2aSmrg * EVENT  SHALL THE AUTHORS  BE   LIABLE   FOR ANY  SPECIAL, INDIRECT   OR
17b1297603Smrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
18b1297603Smrg * DATA  OR PROFITS, WHETHER  IN  AN ACTION OF  CONTRACT,  NEGLIGENCE OR OTHER
19b1297603Smrg * TORTIOUS  ACTION, ARISING    OUT OF OR   IN  CONNECTION  WITH THE USE    OR
20b1297603Smrg * PERFORMANCE OF THIS SOFTWARE.
21b1297603Smrg *
22b1297603Smrg */
23b1297603Smrg
24b1297603Smrg#include "xinput.h"
25b1297603Smrg#include <string.h>
265b944e2aSmrg#include <X11/extensions/XIproto.h> /* for XI_Device***ChangedNotify */
27b1297603Smrg
28b1297603Smrgstatic void
29b1297603Smrgprint_info(XDeviceInfo	*info, Bool shortformat)
30b1297603Smrg{
31b1297603Smrg    int			i,j;
32b1297603Smrg    XAnyClassPtr	any;
33b1297603Smrg    XKeyInfoPtr		k;
34b1297603Smrg    XButtonInfoPtr	b;
35b1297603Smrg    XValuatorInfoPtr	v;
36b1297603Smrg    XAxisInfoPtr	a;
375b944e2aSmrg#if HAVE_XI2
385b944e2aSmrg    XAttachInfoPtr      att;
395b944e2aSmrg#endif
40b1297603Smrg
41b1297603Smrg    printf("\"%s\"\tid=%ld\t[", info->name, info->id);
42b1297603Smrg
43b1297603Smrg    switch (info->use) {
44b1297603Smrg    case IsXPointer:
45b1297603Smrg       printf("XPointer");
46b1297603Smrg       break;
47b1297603Smrg    case IsXKeyboard:
48b1297603Smrg       printf("XKeyboard");
49b1297603Smrg       break;
50b1297603Smrg    case IsXExtensionDevice:
51b1297603Smrg       printf("XExtensionDevice");
52b1297603Smrg       break;
53b1297603Smrg    case IsXExtensionKeyboard:
54b1297603Smrg       printf("XExtensionKeyboard");
55b1297603Smrg       break;
56b1297603Smrg    case IsXExtensionPointer:
57b1297603Smrg       printf("XExtensionPointer");
58b1297603Smrg       break;
59b1297603Smrg    default:
60b1297603Smrg       printf("Unknown class");
61b1297603Smrg       break;
62b1297603Smrg    }
63b1297603Smrg    printf("]\n");
64b1297603Smrg
65b1297603Smrg    if (shortformat)
66b1297603Smrg        return;
67b1297603Smrg
68b1297603Smrg    if (info->num_classes > 0) {
69b1297603Smrg	any = (XAnyClassPtr) (info->inputclassinfo);
70b1297603Smrg	for (i=0; i<info->num_classes; i++) {
71b1297603Smrg	    switch (any->class) {
72b1297603Smrg	    case KeyClass:
73b1297603Smrg		k = (XKeyInfoPtr) any;
74b1297603Smrg		printf("\tNum_keys is %d\n", k->num_keys);
75b1297603Smrg		printf("\tMin_keycode is %d\n", k->min_keycode);
76b1297603Smrg		printf("\tMax_keycode is %d\n", k->max_keycode);
77b1297603Smrg		break;
78b1297603Smrg
79b1297603Smrg	    case ButtonClass:
80b1297603Smrg		b = (XButtonInfoPtr) any;
81b1297603Smrg		printf("\tNum_buttons is %d\n", b->num_buttons);
82b1297603Smrg		break;
83b1297603Smrg
84b1297603Smrg	    case ValuatorClass:
85b1297603Smrg		v = (XValuatorInfoPtr) any;
86b1297603Smrg		a = (XAxisInfoPtr) ((char *) v +
87b1297603Smrg				    sizeof (XValuatorInfo));
88b1297603Smrg		printf("\tNum_axes is %d\n", v->num_axes);
89b1297603Smrg		printf("\tMode is %s\n", (v->mode == Absolute) ? "Absolute" : "Relative");
90b1297603Smrg		printf("\tMotion_buffer is %ld\n", v->motion_buffer);
91b1297603Smrg		for (j=0; j<v->num_axes; j++, a++) {
92b1297603Smrg		    printf("\tAxis %d :\n", j);
93b1297603Smrg		    printf("\t\tMin_value is %d\n", a->min_value);
94b1297603Smrg		    printf("\t\tMax_value is %d\n", a->max_value);
95b1297603Smrg		    printf ("\t\tResolution is %d\n", a->resolution);
96b1297603Smrg		}
97b1297603Smrg		break;
985b944e2aSmrg#if HAVE_XI2
995b944e2aSmrg            case AttachClass:
1005b944e2aSmrg                att = (XAttachInfoPtr)any;
1015b944e2aSmrg                printf("\tAttached to %d\n", att->attached);
1025b944e2aSmrg                break;
1035b944e2aSmrg#endif
104b1297603Smrg	    default:
105b1297603Smrg		printf ("unknown class\n");
106b1297603Smrg	    }
107b1297603Smrg	    any = (XAnyClassPtr) ((char *) any + any->length);
108b1297603Smrg	}
109b1297603Smrg    }
110b1297603Smrg}
111b1297603Smrg
112b1297603Smrgint
113b1297603Smrglist(Display	*display,
114b1297603Smrg     int	argc,
115b1297603Smrg     char	*argv[],
116b1297603Smrg     char	*name,
117b1297603Smrg     char	*desc)
118b1297603Smrg{
119b1297603Smrg    XDeviceInfo		*info;
120b1297603Smrg    int			loop;
121b1297603Smrg    int                 shortformat = False;
1225b944e2aSmrg    int                 daemon = False;
123b1297603Smrg
124b1297603Smrg    shortformat = (argc == 1 && strcmp(argv[0], "--short") == 0);
1255b944e2aSmrg    daemon = (argc == 1 && strcmp(argv[0], "--loop") == 0);
126b1297603Smrg
1275b944e2aSmrg    if (argc == 0 || shortformat || daemon) {
128b1297603Smrg	int		num_devices;
1295b944e2aSmrg        XEvent  ev;
1305b944e2aSmrg
1315b944e2aSmrg#if HAVE_XI2
1325b944e2aSmrg        if (daemon)
1335b944e2aSmrg        {
1345b944e2aSmrg            XiSelectEvent(display, DefaultRootWindow(display), NULL,
1355b944e2aSmrg                          XI_DeviceHierarchyChangedMask |
1365b944e2aSmrg                          XI_DeviceClassesChangedMask);
1375b944e2aSmrg        }
1385b944e2aSmrg#endif
1395b944e2aSmrg
1405b944e2aSmrg        do {
1415b944e2aSmrg            info = XListInputDevices(display, &num_devices);
1425b944e2aSmrg            for(loop=0; loop<num_devices; loop++) {
1435b944e2aSmrg                print_info(info+loop, shortformat);
1445b944e2aSmrg            }
1455b944e2aSmrg
1465b944e2aSmrg#if HAVE_XI2
1475b944e2aSmrg            /* just wait for the next generic event to come along */
1485b944e2aSmrg            while (daemon && !XNextEvent(display, &ev))
1495b944e2aSmrg            {
1505b944e2aSmrg                if (ev.type == GenericEvent)
1515b944e2aSmrg                {
1525b944e2aSmrg                    XGenericEvent* gev = (XGenericEvent*)&ev;
1535b944e2aSmrg                    /* we just assume that extension is IReqCode, pretty save
1545b944e2aSmrg                       since we don't register for other events. */
1555b944e2aSmrg                    if (gev->evtype == XI_DeviceHierarchyChangedNotify)
1565b944e2aSmrg                    {
1575b944e2aSmrg                        printf("Hierarchy change.\n");
1585b944e2aSmrg                    } else if (gev->evtype == XI_DeviceClassesChangedNotify)
1595b944e2aSmrg                    {
1605b944e2aSmrg                        printf("Device classes changed.\n");
1615b944e2aSmrg                        free(((XDeviceClassesChangedEvent*)&ev)->inputclassinfo);
1625b944e2aSmrg                    }
1635b944e2aSmrg                    break;
1645b944e2aSmrg                }
1655b944e2aSmrg            }
1665b944e2aSmrg#endif
1675b944e2aSmrg        } while(daemon);
168b1297603Smrg    } else {
169b1297603Smrg	int	ret = EXIT_SUCCESS;
170b1297603Smrg
171b1297603Smrg	for(loop=0; loop<argc; loop++) {
1725b944e2aSmrg	    info = find_device_info(display, argv[loop], False);
173b1297603Smrg
174b1297603Smrg	    if (!info) {
1755b944e2aSmrg		fprintf(stderr, "unable to find device %s\n", argv[loop]);
176b1297603Smrg		ret = EXIT_FAILURE;
177b1297603Smrg	    } else {
178b1297603Smrg		print_info(info, shortformat);
179b1297603Smrg	    }
180b1297603Smrg	}
181b1297603Smrg	return ret;
182b1297603Smrg    }
183b1297603Smrg    return EXIT_SUCCESS;
184b1297603Smrg}
185b1297603Smrg
186b1297603Smrg/* end of list.c */
187