]> diplodocus.org Git - xorg-xinput/blob - src/hierarchy.c
Add Peter and Red Hat's copyright notices and licenses to COPYING
[xorg-xinput] / src / hierarchy.c
1 /*
2 * Copyright 2007 Peter Hutterer <peter@cs.unisa.edu.au>
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.
9 *
10 * The above copyright notice and this permission notice shall be included
11 * in all copies or substantial portions of the Software.
12 *
13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
14 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
15 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
16 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR
17 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
18 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
19 * OTHER DEALINGS IN THE SOFTWARE.
20 *
21 * Except as contained in this notice, the name of the author shall
22 * not be used in advertising or otherwise to promote the sale, use or
23 * other dealings in this Software without prior written authorization
24 * from the author.
25 *
26 */
27
28 #include "xinput.h"
29 #include <string.h>
30
31 #define Error(error, ...) \
32 { \
33 fprintf(stderr, __VA_ARGS__); \
34 return error;\
35 }
36 /**
37 * Create a new master device. Name must be supplied, other values are
38 * optional.
39 */
40 int
41 create_master(Display* dpy, int argc, char** argv, char* name, char *desc)
42 {
43 XIAddMasterInfo c;
44
45 if (argc == 0)
46 {
47 fprintf(stderr, "Usage: xinput %s %s\n", name, desc);
48 return EXIT_FAILURE;
49 }
50
51 c.type = XIAddMaster;
52 c.name = argv[0];
53 c.send_core = (argc >= 2) ? atoi(argv[1]) : 1;
54 c.enable = (argc >= 3) ? atoi(argv[2]) : 1;
55
56 return XIChangeHierarchy(dpy, (XIAnyHierarchyChangeInfo*)&c, 1);
57 }
58
59 /**
60 * Remove a master device.
61 * By default, all attached devices are set to Floating, unless parameters are
62 * given.
63 */
64 int
65 remove_master(Display* dpy, int argc, char** argv, char *name, char *desc)
66 {
67 XIRemoveMasterInfo r;
68 XIDeviceInfo *info;
69 int ret;
70
71 if (argc == 0)
72 {
73 fprintf(stderr, "usage: xinput %s %s\n", name, desc);
74 return EXIT_FAILURE;
75 }
76
77 info = xi2_find_device_info(dpy, argv[0]);
78
79 if (!info) {
80 fprintf(stderr, "unable to find device %s\n", argv[0]);
81 return EXIT_FAILURE;
82 }
83
84 r.type = XIRemoveMaster;
85 r.deviceid = info->deviceid;
86 if (argc >= 2)
87 {
88 if (!strcmp(argv[1], "Floating"))
89 r.return_mode = XIFloating;
90 else if (!strcmp(argv[1], "AttachToMaster"))
91 r.return_mode = XIAttachToMaster;
92 else
93 Error(BadValue, "Invalid return_mode.\n");
94 } else
95 r.return_mode = XIFloating;
96
97 if (r.return_mode == XIAttachToMaster)
98 {
99 r.return_pointer = 0;
100 if (argc >= 3) {
101 info = xi2_find_device_info(dpy, argv[2]);
102 if (!info) {
103 fprintf(stderr, "unable to find device %s\n", argv[2]);
104 return EXIT_FAILURE;
105 }
106
107 r.return_pointer = info->deviceid;
108 }
109
110 r.return_keyboard = 0;
111 if (argc >= 4) {
112 info = xi2_find_device_info(dpy, argv[3]);
113 if (!info) {
114 fprintf(stderr, "unable to find device %s\n", argv[3]);
115 return EXIT_FAILURE;
116 }
117
118 r.return_keyboard = info->deviceid;
119 }
120
121 if (!r.return_pointer || !r.return_keyboard) {
122 int i, ndevices;
123 info = XIQueryDevice(dpy, XIAllMasterDevices, &ndevices);
124 for(i = 0; i < ndevices; i++) {
125 if (info[i].use == XIMasterPointer && !r.return_pointer)
126 r.return_pointer = info[i].deviceid;
127 if (info[i].use == XIMasterKeyboard && !r.return_keyboard)
128 r.return_keyboard = info[i].deviceid;
129 if (r.return_pointer && r.return_keyboard)
130 break;
131 }
132
133 XIFreeDeviceInfo(info);
134 }
135 }
136
137 ret = XIChangeHierarchy(dpy, (XIAnyHierarchyChangeInfo*)&r, 1);
138 return ret;
139 }
140
141 /**
142 * Swap a device from one master to another.
143 */
144 int
145 change_attachment(Display* dpy, int argc, char** argv, char *name, char* desc)
146 {
147 XIDeviceInfo *sd_info, *md_info;
148 XIAttachSlaveInfo c;
149 int ret;
150
151 if (argc < 2)
152 {
153 fprintf(stderr, "usage: xinput %s %s\n", name, desc);
154 return EXIT_FAILURE;
155 }
156
157 sd_info = xi2_find_device_info(dpy, argv[0]);
158 md_info= xi2_find_device_info(dpy, argv[1]);
159
160 if (!sd_info) {
161 fprintf(stderr, "unable to find device %s\n", argv[0]);
162 return EXIT_FAILURE;
163 }
164
165 if (!md_info) {
166 fprintf(stderr, "unable to find device %s\n", argv[1]);
167 return EXIT_FAILURE;
168 }
169
170 c.type = XIAttachSlave;
171 c.deviceid = sd_info->deviceid;
172 c.new_master = md_info->deviceid;
173
174 ret = XIChangeHierarchy(dpy, (XIAnyHierarchyChangeInfo*)&c, 1);
175 return ret;
176 }
177
178 /**
179 * Set a device floating.
180 */
181 int
182 float_device(Display* dpy, int argc, char** argv, char* name, char* desc)
183 {
184 XIDeviceInfo *info;
185 XIDetachSlaveInfo c;
186 int ret;
187
188 if (argc < 1)
189 {
190 fprintf(stderr, "usage: xinput %s %s\n", name, desc);
191 return EXIT_FAILURE;
192 }
193
194 info = xi2_find_device_info(dpy, argv[0]);
195
196 if (!info) {
197 fprintf(stderr, "unable to find device %s\n", argv[0]);
198 return EXIT_FAILURE;
199 }
200
201 c.type = XIDetachSlave;
202 c.deviceid = info->deviceid;
203
204 ret = XIChangeHierarchy(dpy, (XIAnyHierarchyChangeInfo*)&c, 1);
205 return ret;
206 }
207
208