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);