2 * Copyright 1996 by Frederic Lepied, France. <Frederic.Lepied@sugix.frmug.org>
4 * Permission to use, copy, modify, distribute, and sell this software and its
5 * documentation for any purpose is hereby granted without fee, provided that
6 * the above copyright notice appear in all copies and that both that
7 * copyright notice and this permission notice appear in supporting
8 * documentation, and that the name of the authors not be used in
9 * advertising or publicity pertaining to distribution of the software without
10 * specific, written prior permission. The authors make no
11 * representations about the suitability of this software for any purpose. It
12 * is provided "as is" without express or implied warranty.
14 * THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
15 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
16 * EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
17 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
18 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
19 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
20 * PERFORMANCE OF THIS SOFTWARE.
26 #include <X11/extensions/XIproto.h> /* for XI_Device***ChangedNotify */
29 print_info(Display* dpy, XDeviceInfo *info, Bool shortformat)
38 printf("\"%s\"\tid=%ld\t[", info->name, info->id);
47 case IsXExtensionDevice:
48 printf("XExtensionDevice");
50 case IsXExtensionKeyboard:
51 printf("XExtensionKeyboard");
53 case IsXExtensionPointer:
54 printf("XExtensionPointer");
57 printf("Unknown class");
65 if(info->type != None)
66 printf("\tType is %s\n", XGetAtomName(dpy, info->type));
68 if (info->num_classes > 0) {
69 any = (XAnyClassPtr) (info->inputclassinfo);
70 for (i=0; i<info->num_classes; i++) {
73 k = (XKeyInfoPtr) any;
74 printf("\tNum_keys is %d\n", k->num_keys);
75 printf("\tMin_keycode is %d\n", k->min_keycode);
76 printf("\tMax_keycode is %d\n", k->max_keycode);
80 b = (XButtonInfoPtr) any;
81 printf("\tNum_buttons is %d\n", b->num_buttons);
85 v = (XValuatorInfoPtr) any;
86 a = (XAxisInfoPtr) ((char *) v +
87 sizeof (XValuatorInfo));
88 printf("\tNum_axes is %d\n", v->num_axes);
89 printf("\tMode is %s\n", (v->mode == Absolute) ? "Absolute" : "Relative");
90 printf("\tMotion_buffer is %ld\n", v->motion_buffer);
91 for (j=0; j<v->num_axes; j++, a++) {
92 printf("\tAxis %d :\n", j);
93 printf("\t\tMin_value is %d\n", a->min_value);
94 printf("\t\tMax_value is %d\n", a->max_value);
95 printf ("\t\tResolution is %d\n", a->resolution);
99 printf ("unknown class\n");
101 any = (XAnyClassPtr) ((char *) any + any->length);
106 static int list_xi1(Display *display,
113 info = XListInputDevices(display, &num_devices);
114 for(loop=0; loop<num_devices; loop++) {
115 print_info(display, info+loop, shortformat);
121 /* also used from test_xi2.c */
123 print_classes_xi2(Display* display, XIAnyClassInfo **classes,
128 printf("\tReporting %d classes:\n", num_classes);
129 for (i = 0; i < num_classes; i++)
131 printf("\t\tClass originated from: %d\n", classes[i]->sourceid);
132 switch(classes[i]->type)
136 XIButtonClassInfo *b = (XIButtonClassInfo*)classes[i];
138 printf("\t\tButtons supported: %d\n", b->num_buttons);
139 printf("\t\tButton labels:");
140 for (j = 0; j < b->num_buttons; j++)
142 name = (b->labels[j]) ? XGetAtomName(display, b->labels[j]) : NULL;
143 printf(" %s", (name) ? name : "None");
147 printf("\t\tButton state:");
148 for (j = 0; j < b->state.mask_len * 8; j++)
149 if (XIMaskIsSet(b->state.mask, j))
157 XIKeyClassInfo *k = (XIKeyClassInfo*)classes[i];
158 printf("\t\tKeycodes supported: %d\n", k->num_keycodes);
161 case XIValuatorClass:
163 XIValuatorClassInfo *v = (XIValuatorClassInfo*)classes[i];
164 char *name = v->label ? XGetAtomName(display, v->label) : NULL;
166 /* XXX: Bug in X servers 1.7..1.8.1, mode was |
167 OutOfProximity. Remove this once 1.9 is out. */
168 v->mode &= DeviceMode;
170 printf("\t\tDetail for Valuator %d:\n", v->number);
171 printf("\t\t Label: %s\n", (name) ? name : "None");
172 printf("\t\t Range: %f - %f\n", v->min, v->max);
173 printf("\t\t Resolution: %d units/m\n", v->resolution);
174 printf("\t\t Mode: %s\n", v->mode == Absolute ? "absolute" :
176 if (v->mode == Absolute)
177 printf("\t\t Current value: %f\n", v->value);
188 print_info_xi2(Display* display, XIDeviceInfo *dev, Bool shortformat)
190 printf("%-40s\tid=%d\t[", dev->name, dev->deviceid);
193 case XIMasterPointer:
194 printf("master pointer (%d)]\n", dev->attachment);
196 case XIMasterKeyboard:
197 printf("master keyboard (%d)]\n", dev->attachment);
200 printf("slave pointer (%d)]\n", dev->attachment);
202 case XISlaveKeyboard:
203 printf("slave keyboard (%d)]\n", dev->attachment);
205 case XIFloatingSlave:
206 printf("floating slave]\n");
214 printf("\tThis device is disabled\n");
216 print_classes_xi2(display, dev->classes, dev->num_classes);
221 list_xi2(Display *display,
224 int major = XI_2_Major,
228 XIDeviceInfo *info, *dev;
230 if (XIQueryVersion(display, &major, &minor) != Success ||
231 (major * 1000 + minor) < (XI_2_Major * 1000 + XI_2_Minor))
233 fprintf(stderr, "XI2 not supported.\n");
237 info = XIQueryDevice(display, XIAllDevices, &ndevices);
239 for(i = 0; i < ndevices; i++)
242 if (dev->use == XIMasterPointer || dev->use == XIMasterKeyboard)
244 if (dev->use == XIMasterPointer)
249 print_info_xi2(display, dev, shortformat);
250 for (j = 0; j < ndevices; j++)
252 XIDeviceInfo* sd = &info[j];
254 if ((sd->use == XISlavePointer || sd->use == XISlaveKeyboard) &&
255 (sd->attachment == dev->deviceid))
257 printf("%s ↳ ", dev->use == XIMasterPointer ? "⎜" : " ");
258 print_info_xi2(display, sd, shortformat);
264 for (i = 0; i < ndevices; i++)
267 if (dev->use == XIFloatingSlave)
270 print_info_xi2(display, dev, shortformat);
275 XIFreeDeviceInfo(info);
281 list(Display *display,
287 int shortformat = (argc >= 1 && strcmp(argv[0], "--short") == 0);
288 int longformat = (argc >= 1 && strcmp(argv[0], "--long") == 0);
289 int arg_dev = shortformat || longformat;
294 if (xinput_version(display) == XI_2_Major)
296 XIDeviceInfo *info = xi2_find_device_info(display, argv[arg_dev]);
299 fprintf(stderr, "unable to find device %s\n", argv[arg_dev]);
302 print_info_xi2(display, info, shortformat);
308 XDeviceInfo *info = find_device_info(display, argv[arg_dev], False);
311 fprintf(stderr, "unable to find device %s\n", argv[arg_dev]);
314 print_info(display, info, shortformat);
320 if (xinput_version(display) == XI_2_Major)
321 return list_xi2(display, !longformat);
323 return list_xi1(display, !longformat);