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.
37 print_info(Display* dpy, XDeviceInfo *info, enum print_format format)
46 if (format == FORMAT_NAME)
48 printf("%s\n", info->name);
50 } else if (format == FORMAT_ID)
52 printf("%ld\n", info->id);
56 printf("\"%s\"\tid=%ld\t[", info->name, info->id);
65 case IsXExtensionDevice:
66 printf("XExtensionDevice");
68 case IsXExtensionKeyboard:
69 printf("XExtensionKeyboard");
71 case IsXExtensionPointer:
72 printf("XExtensionPointer");
75 printf("Unknown class");
80 if (format == FORMAT_SHORT)
83 if(info->type != None)
84 printf("\tType is %s\n", XGetAtomName(dpy, info->type));
86 if (info->num_classes > 0) {
87 any = (XAnyClassPtr) (info->inputclassinfo);
88 for (i=0; i<info->num_classes; i++) {
91 k = (XKeyInfoPtr) any;
92 printf("\tNum_keys is %d\n", k->num_keys);
93 printf("\tMin_keycode is %d\n", k->min_keycode);
94 printf("\tMax_keycode is %d\n", k->max_keycode);
98 b = (XButtonInfoPtr) any;
99 printf("\tNum_buttons is %d\n", b->num_buttons);
103 v = (XValuatorInfoPtr) any;
104 a = (XAxisInfoPtr) ((char *) v +
105 sizeof (XValuatorInfo));
106 printf("\tNum_axes is %d\n", v->num_axes);
107 printf("\tMode is %s\n", (v->mode == Absolute) ? "Absolute" : "Relative");
108 printf("\tMotion_buffer is %ld\n", v->motion_buffer);
109 for (j=0; j<v->num_axes; j++, a++) {
110 printf("\tAxis %d :\n", j);
111 printf("\t\tMin_value is %d\n", a->min_value);
112 printf("\t\tMax_value is %d\n", a->max_value);
113 printf ("\t\tResolution is %d\n", a->resolution);
117 printf ("unknown class\n");
119 any = (XAnyClassPtr) ((char *) any + any->length);
124 static int list_xi1(Display *display,
125 enum print_format format)
131 info = XListInputDevices(display, &num_devices);
132 for(loop=0; loop<num_devices; loop++) {
133 print_info(display, info+loop, format);
139 /* also used from test_xi2.c */
141 print_classes_xi2(Display* display, XIAnyClassInfo **classes,
146 printf("\tReporting %d classes:\n", num_classes);
147 for (i = 0; i < num_classes; i++)
149 printf("\t\tClass originated from: %d. Type: ", classes[i]->sourceid);
150 switch(classes[i]->type)
154 XIButtonClassInfo *b = (XIButtonClassInfo*)classes[i];
156 printf("XIButtonClass\n");
157 printf("\t\tButtons supported: %d\n", b->num_buttons);
158 printf("\t\tButton labels:");
159 for (j = 0; j < b->num_buttons; j++)
161 name = (b->labels[j]) ? XGetAtomName(display, b->labels[j]) : NULL;
163 printf(" \"%s\"", name);
169 printf("\t\tButton state:");
170 for (j = 0; j < b->state.mask_len * 8; j++)
171 if (XIMaskIsSet(b->state.mask, j))
179 XIKeyClassInfo *k = (XIKeyClassInfo*)classes[i];
180 printf("XIKeyClass\n");
181 printf("\t\tKeycodes supported: %d\n", k->num_keycodes);
184 case XIValuatorClass:
186 XIValuatorClassInfo *v = (XIValuatorClassInfo*)classes[i];
187 char *name = v->label ? XGetAtomName(display, v->label) : NULL;
189 /* Bug in X servers 1.7..1.8.1, mode was | OutOfProximity */
190 v->mode &= DeviceMode;
192 printf("XIValuatorClass\n");
193 printf("\t\tDetail for Valuator %d:\n", v->number);
194 printf("\t\t Label: %s\n", (name) ? name : "None");
195 printf("\t\t Range: %f - %f\n", v->min, v->max);
196 printf("\t\t Resolution: %d units/m\n", v->resolution);
197 printf("\t\t Mode: %s\n", v->mode == Absolute ? "absolute" :
199 if (v->mode == Absolute)
200 printf("\t\t Current value: %f\n", v->value);
207 XIScrollClassInfo *s = (XIScrollClassInfo*)classes[i];
209 printf("XIScrollClass\n");
210 printf("\t\tScroll info for Valuator %d\n", s->number);
211 printf("\t\t type: %d (%s)\n", s->scroll_type,
212 (s->scroll_type == XIScrollTypeHorizontal) ? "horizontal" :
213 (s->scroll_type == XIScrollTypeVertical) ? "vertical" : "unknown");
214 printf("\t\t increment: %f\n", s->increment);
215 printf("\t\t flags: 0x%x", s->flags);
218 if (s->flags & XIScrollFlagNoEmulation)
219 printf(" no-emulation ");
220 if (s->flags & XIScrollFlagPreferred)
221 printf(" preferred ");
231 XITouchClassInfo *t = (XITouchClassInfo*)classes[i];
233 printf("XITouchClass\n");
234 printf("\t\tTouch mode: %s\n",
235 (t->mode == XIDirectTouch) ? "direct" : "dependent");
236 printf("\t\tMax number of touches: %d\n", t->num_touches);
246 print_info_xi2(Display* display, XIDeviceInfo *dev, enum print_format format)
248 if (format == FORMAT_NAME)
250 printf("%s\n", dev->name);
252 } else if (format == FORMAT_ID)
254 printf("%d\n", dev->deviceid);
258 printf("%-40s\tid=%d\t[", dev->name, dev->deviceid);
261 case XIMasterPointer:
262 printf("master pointer (%d)]\n", dev->attachment);
264 case XIMasterKeyboard:
265 printf("master keyboard (%d)]\n", dev->attachment);
268 printf("slave pointer (%d)]\n", dev->attachment);
270 case XISlaveKeyboard:
271 printf("slave keyboard (%d)]\n", dev->attachment);
273 case XIFloatingSlave:
274 printf("floating slave]\n");
278 if (format == FORMAT_SHORT)
282 printf("\tThis device is disabled\n");
284 print_classes_xi2(display, dev->classes, dev->num_classes);
289 list_xi2(Display *display,
290 enum print_format format)
294 XIDeviceInfo *info, *dev;
296 info = XIQueryDevice(display, XIAllDevices, &ndevices);
298 for(i = 0; i < ndevices; i++)
301 if (dev->use == XIMasterPointer || dev->use == XIMasterKeyboard)
303 if (format == FORMAT_SHORT || format == FORMAT_LONG)
305 if (dev->use == XIMasterPointer)
311 print_info_xi2(display, dev, format);
312 for (j = 0; j < ndevices; j++)
314 XIDeviceInfo* sd = &info[j];
316 if ((sd->use == XISlavePointer || sd->use == XISlaveKeyboard) &&
317 (sd->attachment == dev->deviceid))
319 if (format == FORMAT_SHORT || format == FORMAT_LONG)
320 printf("%s ↳ ", dev->use == XIMasterPointer ? "⎜" : " ");
321 print_info_xi2(display, sd, format);
327 for (i = 0; i < ndevices; i++)
330 if (dev->use == XIFloatingSlave)
333 print_info_xi2(display, dev, format);
338 XIFreeDeviceInfo(info);
344 list(Display *display,
350 enum print_format format = FORMAT_NONE;
355 if (strcmp(argv[0], "--short") == 0)
356 format = FORMAT_SHORT;
357 else if (strcmp(argv[0], "--long") == 0)
358 format = FORMAT_LONG;
359 else if (strcmp(argv[0], "--name-only") == 0)
360 format = FORMAT_NAME;
361 else if (strcmp(argv[0], "--id-only") == 0)
369 if (format == FORMAT_NONE)
370 format = FORMAT_LONG;
372 if (xinput_version(display) == XI_2_Major)
374 XIDeviceInfo *info = xi2_find_device_info(display, argv[arg_dev]);
377 fprintf(stderr, "unable to find device %s\n", argv[arg_dev]);
380 print_info_xi2(display, info, format);
386 XDeviceInfo *info = find_device_info(display, argv[arg_dev], False);
389 fprintf(stderr, "unable to find device %s\n", argv[arg_dev]);
392 print_info(display, info, format);
397 if (format == FORMAT_NONE)
398 format = FORMAT_SHORT;
400 if (xinput_version(display) == XI_2_Major)
401 return list_xi2(display, format);
403 return list_xi1(display, format);