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