#include <X11/extensions/XIproto.h> /* for XI_Device***ChangedNotify */
static void
-print_info(XDeviceInfo *info, Bool shortformat)
+print_info(Display* dpy, XDeviceInfo *info, Bool shortformat)
{
int i,j;
XAnyClassPtr any;
if (shortformat)
return;
+ if(info->type != None)
+ printf("\tType is %s\n", XGetAtomName(dpy, info->type));
+
if (info->num_classes > 0) {
any = (XAnyClassPtr) (info->inputclassinfo);
for (i=0; i<info->num_classes; i++) {
}
static int list_xi1(Display *display,
- int argc,
- char *argv[],
- char *name,
- char *desc)
+ int shortformat)
{
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 || shortformat || daemon) {
- int num_devices;
-
- do {
- info = XListInputDevices(display, &num_devices);
- for(loop=0; loop<num_devices; loop++) {
- print_info(info+loop, shortformat);
- }
- } while(daemon);
- } else {
- int ret = EXIT_SUCCESS;
+ int num_devices;
- for(loop=0; loop<argc; loop++) {
- info = find_device_info(display, argv[loop], False);
-
- if (!info) {
- fprintf(stderr, "unable to find device %s\n", argv[loop]);
- ret = EXIT_FAILURE;
- } else {
- print_info(info, shortformat);
- }
- }
- return ret;
+ info = XListInputDevices(display, &num_devices);
+ for(loop=0; loop<num_devices; loop++) {
+ print_info(display, info+loop, shortformat);
}
return EXIT_SUCCESS;
}
print_classes_xi2(Display* display, XIAnyClassInfo **classes,
int num_classes)
{
- int i;
+ int i, j;
printf("\tReporting %d classes:\n", num_classes);
for (i = 0; i < num_classes; i++)
{
+ printf("\t\tClass originated from: %d\n", classes[i]->sourceid);
switch(classes[i]->type)
{
- case ButtonClass:
+ case XIButtonClass:
{
XIButtonClassInfo *b = (XIButtonClassInfo*)classes[i];
+ char *name;
printf("\t\tButtons supported: %d\n", b->num_buttons);
+ printf("\t\tButton labels:");
+ for (j = 0; j < b->num_buttons; j++)
+ {
+ name = (b->labels[j]) ? XGetAtomName(display, b->labels[j]) : NULL;
+ printf(" %s", (name) ? name : "None");
+ XFree(name);
+ }
+ printf("\n");
+ printf("\t\tButton state:");
+ for (j = 0; j < b->state.mask_len * 8; j++)
+ if (XIMaskIsSet(b->state.mask, j))
+ printf(" %d", j);
+ printf("\n");
}
break;
- case KeyClass:
+ case XIKeyClass:
{
XIKeyClassInfo *k = (XIKeyClassInfo*)classes[i];
printf("\t\tKeycodes supported: %d\n", k->num_keycodes);
}
break;
- case ValuatorClass:
+ case XIValuatorClass:
{
XIValuatorClassInfo *v = (XIValuatorClassInfo*)classes[i];
+ char *name = v->label ? XGetAtomName(display, v->label) : NULL;
+
printf("\t\tDetail for Valuator %d:\n", v->number);
- printf("\t\t Name: %s\n", XGetAtomName(display, v->name));
+ printf("\t\t Label: %s\n", (name) ? name : "None");
printf("\t\t Range: %f - %f\n", v->min, v->max);
printf("\t\t Resolution: %d units/m\n", v->resolution);
printf("\t\t Mode: %s\n", v->mode == Absolute ? "absolute" :
"relative");
+ if (v->mode == Absolute)
+ printf("\t\t Current value: %f\n", v->value);
+ XFree(name);
}
break;
}
printf("%-40s\tid=%d\t[", dev->name, dev->deviceid);
switch(dev->use)
{
- case MasterPointer:
+ case XIMasterPointer:
printf("master pointer (%d)]\n", dev->attachment);
break;
- case MasterKeyboard:
+ case XIMasterKeyboard:
printf("master keyboard (%d)]\n", dev->attachment);
break;
- case SlavePointer:
+ case XISlavePointer:
printf("slave pointer (%d)]\n", dev->attachment);
break;
- case SlaveKeyboard:
+ case XISlaveKeyboard:
printf("slave keyboard (%d)]\n", dev->attachment);
break;
- case FloatingSlave:
+ case XIFloatingSlave:
printf("floating slave]\n");
break;
}
}
-int
-list_xi2(Display *display,
- int argc,
- char *argv[],
- char *name,
- char *desc)
+static int
+list_xi2(Display *display,
+ int shortformat)
{
int major = XI_2_Major,
minor = XI_2_Minor;
int ndevices;
- int i, j, shortformat;
+ int i, j;
XIDeviceInfo *info, *dev;
- shortformat = (argc == 1 && strcmp(argv[0], "--short") == 0);
-
if (XIQueryVersion(display, &major, &minor) != Success ||
(major * 1000 + minor) < (XI_2_Major * 1000 + XI_2_Minor))
{
return EXIT_FAILURE;
}
- info = XIQueryDevice(display, AllDevices, &ndevices);
- dev = info;
+ info = XIQueryDevice(display, XIAllDevices, &ndevices);
for(i = 0; i < ndevices; i++)
{
dev = &info[i];
- if (dev->use == MasterPointer || dev->use == MasterKeyboard)
+ if (dev->use == XIMasterPointer || dev->use == XIMasterKeyboard)
{
- if (dev->use == MasterPointer)
+ if (dev->use == XIMasterPointer)
printf("⎡ ");
else
printf("⎣ ");
{
XIDeviceInfo* sd = &info[j];
- if ((sd->use == SlavePointer || sd->use == SlaveKeyboard) &&
+ if ((sd->use == XISlavePointer || sd->use == XISlaveKeyboard) &&
(sd->attachment == dev->deviceid))
{
- printf("%s ↳ ", dev->use == MasterPointer ? "⎜" : " ");
+ printf("%s ↳ ", dev->use == XIMasterPointer ? "⎜" : " ");
print_info_xi2(display, sd, shortformat);
}
}
}
}
+ for (i = 0; i < ndevices; i++)
+ {
+ dev = &info[i];
+ if (dev->use == XIFloatingSlave)
+ {
+ printf("∼ ");
+ print_info_xi2(display, dev, shortformat);
+ }
+ }
+
XIFreeDeviceInfo(info);
return EXIT_SUCCESS;
char *name,
char *desc)
{
+ int shortformat = (argc >= 1 && strcmp(argv[0], "--short") == 0);
+ int longformat = (argc >= 1 && strcmp(argv[0], "--long") == 0);
+ int arg_dev = shortformat || longformat;
+
+ if (argc > arg_dev)
+ {
#ifdef HAVE_XI2
- if (xinput_version(display) == XI_2_Major)
- return list_xi2(display, argc, argv, name, desc);
+ if (xinput_version(display) == XI_2_Major)
+ {
+ XIDeviceInfo *info = xi2_find_device_info(display, argv[arg_dev]);
+
+ if (!info) {
+ fprintf(stderr, "unable to find device %s\n", argv[arg_dev]);
+ return EXIT_FAILURE;
+ } else {
+ print_info_xi2(display, info, shortformat);
+ return EXIT_SUCCESS;
+ }
+ } else
#endif
- return list_xi1(display, argc, argv, name, desc);
+ {
+ XDeviceInfo *info = find_device_info(display, argv[arg_dev], False);
+
+ if (!info) {
+ fprintf(stderr, "unable to find device %s\n", argv[arg_dev]);
+ return EXIT_FAILURE;
+ } else {
+ print_info(display, info, shortformat);
+ return EXIT_SUCCESS;
+ }
+ }
+ } else {
+#ifdef HAVE_XI2
+ if (xinput_version(display) == XI_2_Major)
+ return list_xi2(display, !longformat);
+#endif
+ return list_xi1(display, !longformat);
+ }
}
/* end of list.c */