1 /*
2 * Copyright 1996 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
26
27 int
get_button_map(Display * display,int argc,char * argv[],char * name,char * desc)28 get_button_map(Display *display,
29 int argc,
30 char *argv[],
31 char *name,
32 char *desc)
33 {
34 XDeviceInfo *info;
35 XDevice *device;
36 XAnyClassPtr ip;
37 int i;
38 int nbuttons;
39
40 if (argc != 1) {
41 fprintf(stderr, "usage: xinput %s %s\n", name, desc);
42 return EXIT_FAILURE;
43 }
44
45 info = find_device_info(display, argv[0], False);
46
47 if (!info) {
48 fprintf(stderr, "unable to find device '%s'\n", argv[0]);
49 return EXIT_FAILURE;
50 }
51
52 ip = (XAnyClassPtr) info->inputclassinfo;
53 nbuttons = 0;
54
55 /* try to find the number of buttons */
56 for(i=0; i<info->num_classes; i++) {
57 if (ip->class == ButtonClass) {
58 nbuttons = ((XButtonInfoPtr)ip)->num_buttons;
59 break;
60 }
61 ip = (XAnyClassPtr) ((char *) ip + ip->length);
62 }
63 if (nbuttons == 0) {
64 fprintf(stderr, "device has no buttons\n");
65 return EXIT_FAILURE;
66 }
67
68 device = XOpenDevice(display, info->id);
69 if (device) {
70 int idx;
71 unsigned char *map;
72
73 map = (unsigned char *) malloc(sizeof(unsigned char) * nbuttons);
74
75 XGetDeviceButtonMapping(display, device, map, nbuttons);
76
77 for(idx=1; idx < nbuttons + 1; idx++) {
78 printf("%d ", map[idx - 1]);
79 }
80 printf("\n");
81 XCloseDevice(display, device);
82 return EXIT_SUCCESS;
83 } else {
84 fprintf(stderr, "Unable to open device\n");
85 return EXIT_FAILURE;
86 }
87 }
88
89
90
91 int
set_button_map(Display * display,int argc,char * argv[],char * name,char * desc)92 set_button_map(Display *display,
93 int argc,
94 char *argv[],
95 char *name,
96 char *desc)
97 {
98 XDeviceInfo *info;
99 XDevice *device;
100 XAnyClassPtr ip;
101 int i;
102 int nbuttons;
103
104 if (argc < 2) {
105 fprintf(stderr, "usage: xinput %s %s\n", name, desc);
106 return EXIT_FAILURE;
107 }
108
109 info = find_device_info(display, argv[0], False);
110
111 if (!info) {
112 fprintf(stderr, "unable to find device '%s'\n", argv[0]);
113 return EXIT_FAILURE;
114 }
115
116 ip = (XAnyClassPtr) info->inputclassinfo;
117 nbuttons = 0;
118
119 /* try to find the number of buttons */
120 for(i=0; i<info->num_classes; i++) {
121 if (ip->class == ButtonClass) {
122 nbuttons = ((XButtonInfoPtr)ip)->num_buttons;
123 break;
124 }
125 ip = (XAnyClassPtr) ((char *) ip + ip->length);
126 }
127 if (nbuttons == 0) {
128 fprintf(stderr, "device has no buttons\n");
129 return EXIT_FAILURE;
130 }
131
132 device = XOpenDevice(display, info->id);
133 if (device) {
134 int idx;
135 unsigned char *map;
136 int min;
137
138 map = (unsigned char *) malloc(sizeof(unsigned char) * nbuttons);
139
140 XGetDeviceButtonMapping(display, device, map, nbuttons);
141
142 min = (argc > nbuttons + 1) ? nbuttons + 1 : argc;
143
144 for(idx=1; idx < min; idx++) {
145 map[idx - 1] = atoi(argv[idx]);
146 }
147 XSetDeviceButtonMapping(display, device, map, nbuttons);
148 XCloseDevice(display, device);
149 return EXIT_SUCCESS;
150 } else {
151 fprintf(stderr, "Unable to open device\n");
152 return EXIT_FAILURE;
153 }
154 }
155
156 /* end of buttonmap.c */
157