1/* 2 * Copyright 1996-1997 by Frederic Lepied, France. <Frederic.Lepied@sugix.frmug.org> 3 * 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. 13 * 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. 21 * 22 */ 23 24#include "xinput.h" 25 26int 27query_state(Display *display, 28 int argc, 29 char *argv[], 30 char *name, 31 char *desc) 32{ 33 XDeviceInfo *info; 34 XDevice *device; 35 XDeviceState *state; 36 int loop; 37 int loop2; 38 XInputClass *cls; 39 XValuatorState *val_state; 40 XKeyState *key_state; 41 XButtonState *but_state; 42 43 if (argc != 1) { 44 fprintf(stderr, "usage: xinput %s %s\n", name, desc); 45 return 1; 46 } 47 48 info = find_device_info(display, argv[0], True); 49 50 if (!info) { 51 fprintf(stderr, "unable to find device '%s'\n", argv[0]); 52 return 1; 53 } 54 55 device = XOpenDevice(display, info->id); 56 57 if (!device) { 58 fprintf(stderr, "unable to open device '%s'\n", argv[0]); 59 return 1; 60 } 61 62 state = XQueryDeviceState(display, device); 63 64 if (state) { 65 cls = state->data; 66 printf("%d class%s :\n", state->num_classes, 67 (state->num_classes > 1) ? "es" : ""); 68 for(loop=0; loop<state->num_classes; loop++) { 69 switch(cls->class) { 70 case ValuatorClass: 71 val_state = (XValuatorState *) cls; 72 printf("ValuatorClass Mode=%s Proximity=%s\n", 73 val_state->mode & 1 ? "Absolute" : "Relative", 74 val_state->mode & 2 ? "Out" : "In"); 75 for(loop2=0; loop2<val_state->num_valuators; loop2++) { 76 printf("\tvaluator[%d]=%d\n", loop2, val_state->valuators[loop2]); 77 } 78 break; 79 80 case ButtonClass: 81 but_state = (XButtonState *) cls; 82 printf("ButtonClass\n"); 83 for(loop2=1; loop2<=but_state->num_buttons; loop2++) { 84 printf("\tbutton[%d]=%s\n", loop2, 85 (but_state->buttons[loop2 / 8] & (1 << (loop2 % 8))) ? "down" : "up" ); 86 } 87 break; 88 89 case KeyClass: 90 key_state = (XKeyState *) cls; 91 printf("KeyClass\n"); 92 for(loop2=0; loop2<key_state->num_keys; loop2++) { 93 printf("\tkey[%d]=%s\n", loop2, 94 (key_state->keys[loop2 / 8] & (1 << (loop2 % 8))) ? "down" : "up" ); 95 } 96 97 break; 98 99 } 100 cls = (XInputClass *) ((char *) cls + cls->length); 101 } 102 XFreeDeviceState(state); 103 } 104 return EXIT_SUCCESS; 105} 106 107/* end of state.c */ 108