1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
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__stderrp, "usage: xinput %s %s\n", name, desc); |
42 | return EXIT_FAILURE1; |
43 | } |
44 | |
45 | info = find_device_info(display, argv[0], False0); |
46 | |
47 | if (!info) { |
48 | fprintf(stderr__stderrp, "unable to find device '%s'\n", argv[0]); |
49 | return EXIT_FAILURE1; |
50 | } |
51 | |
52 | ip = (XAnyClassPtr) info->inputclassinfo; |
53 | nbuttons = 0; |
54 | |
55 | |
56 | for(i=0; i<info->num_classes; i++) { |
57 | if (ip->class == ButtonClass1) { |
58 | nbuttons = ((XButtonInfoPtr)ip)->num_buttons; |
59 | break; |
60 | } |
61 | ip = (XAnyClassPtr) ((char *) ip + ip->length); |
62 | } |
63 | if (nbuttons == 0) { |
64 | fprintf(stderr__stderrp, "device has no buttons\n"); |
65 | return EXIT_FAILURE1; |
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_SUCCESS0; |
83 | } else { |
84 | fprintf(stderr__stderrp, "Unable to open device\n"); |
85 | return EXIT_FAILURE1; |
86 | } |
87 | } |
88 | |
89 | |
90 | |
91 | int |
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__stderrp, "usage: xinput %s %s\n", name, desc); |
106 | return EXIT_FAILURE1; |
107 | } |
108 | |
109 | info = find_device_info(display, argv[0], False0); |
110 | |
111 | if (!info) { |
| 3 | | Assuming 'info' is non-null | |
|
| |
112 | fprintf(stderr__stderrp, "unable to find device '%s'\n", argv[0]); |
113 | return EXIT_FAILURE1; |
114 | } |
115 | |
116 | ip = (XAnyClassPtr) info->inputclassinfo; |
117 | nbuttons = 0; |
118 | |
119 | |
120 | for(i=0; i<info->num_classes; i++) { |
| 5 | | Loop condition is true. Entering loop body | |
|
121 | if (ip->class == ButtonClass1) { |
| |
122 | nbuttons = ((XButtonInfoPtr)ip)->num_buttons; |
123 | break; |
| 7 | | Execution continues on line 127 | |
|
124 | } |
125 | ip = (XAnyClassPtr) ((char *) ip + ip->length); |
126 | } |
127 | if (nbuttons == 0) { |
| 8 | | Assuming 'nbuttons' is not equal to 0 | |
|
| |
128 | fprintf(stderr__stderrp, "device has no buttons\n"); |
129 | return EXIT_FAILURE1; |
130 | } |
131 | |
132 | device = XOpenDevice(display, info->id); |
133 | if (device) { |
| 10 | | Assuming 'device' is non-null | |
|
| |
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++) { |
| 14 | | Assuming 'idx' is >= 'min' | |
|
| 15 | | Loop condition is false. Execution continues on line 147 | |
|
145 | map[idx - 1] = atoi(argv[idx]); |
146 | } |
147 | XSetDeviceButtonMapping(display, device, map, nbuttons); |
148 | XCloseDevice(display, device); |
| 16 | | Potential leak of memory pointed to by 'map' |
|
149 | return EXIT_SUCCESS0; |
150 | } else { |
151 | fprintf(stderr__stderrp, "Unable to open device\n"); |
152 | return EXIT_FAILURE1; |
153 | } |
154 | } |
155 | |
156 | |