]> diplodocus.org Git - xorg-xinput/blob - src/buttonmap.c
xinput 1.4.0
[xorg-xinput] / src / buttonmap.c
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
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 int min;
73
74 map = (unsigned char *) malloc(sizeof(unsigned char) * nbuttons);
75
76 XGetDeviceButtonMapping(display, device, map, nbuttons);
77
78 for(idx=1; idx < nbuttons + 1; idx++) {
79 printf("%d ", map[idx - 1]);
80 }
81 printf("\n");
82 XCloseDevice(display, device);
83 return EXIT_SUCCESS;
84 } else {
85 fprintf(stderr, "Unable to open device\n");
86 return EXIT_FAILURE;
87 }
88 }
89
90
91
92 int
93 set_button_map(Display *display,
94 int argc,
95 char *argv[],
96 char *name,
97 char *desc)
98 {
99 XDeviceInfo *info;
100 XDevice *device;
101 XAnyClassPtr ip;
102 int i;
103 int nbuttons;
104
105 if (argc < 2) {
106 fprintf(stderr, "usage: xinput %s %s\n", name, desc);
107 return EXIT_FAILURE;
108 }
109
110 info = find_device_info(display, argv[0], False);
111
112 if (!info) {
113 fprintf(stderr, "unable to find device %s\n", argv[0]);
114 return EXIT_FAILURE;
115 }
116
117 ip = (XAnyClassPtr) info->inputclassinfo;
118 nbuttons = 0;
119
120 /* try to find the number of buttons */
121 for(i=0; i<info->num_classes; i++) {
122 if (ip->class == ButtonClass) {
123 nbuttons = ((XButtonInfoPtr)ip)->num_buttons;
124 break;
125 }
126 ip = (XAnyClassPtr) ((char *) ip + ip->length);
127 }
128 if (nbuttons == 0) {
129 fprintf(stderr, "device has no buttons\n");
130 return EXIT_FAILURE;
131 }
132
133 device = XOpenDevice(display, info->id);
134 if (device) {
135 int idx;
136 unsigned char *map;
137 int min;
138
139 map = (unsigned char *) malloc(sizeof(unsigned char) * nbuttons);
140
141 XGetDeviceButtonMapping(display, device, map, nbuttons);
142
143 min = (argc > nbuttons + 1) ? nbuttons + 1 : argc;
144
145 for(idx=1; idx < min; idx++) {
146 map[idx - 1] = atoi(argv[idx]);
147 }
148 XSetDeviceButtonMapping(display, device, map, nbuttons);
149 XCloseDevice(display, device);
150 return EXIT_SUCCESS;
151 } else {
152 fprintf(stderr, "Unable to open device\n");
153 return EXIT_FAILURE;
154 }
155 }
156
157 /* end of buttonmap.c */