1
2 /*
3
4 Copyright 1985, 1986, 1987, 1998 The Open Group
5
6 Permission to use, copy, modify, distribute, and sell this software and its
7 documentation for any purpose is hereby granted without fee, provided that
8 the above copyright notice appear in all copies and that both that
9 copyright notice and this permission notice appear in supporting
10 documentation.
11
12 The above copyright notice and this permission notice shall be included
13 in all copies or substantial portions of the Software.
14
15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
16 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18 IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
19 OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
20 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
21 OTHER DEALINGS IN THE SOFTWARE.
22
23 Except as contained in this notice, the name of The Open Group shall
24 not be used in advertising or otherwise to promote the sale, use or
25 other dealings in this Software without prior written authorization
26 from The Open Group.
27
28 */
29
30 /*
31 * XEvToWire.c - Internal support routines for the C subroutine
32 * interface library (Xlib) to the X Window System Protocol V11.0.
33 */
34
35 #ifdef HAVE_CONFIG_H
36 #include <config.h>
37 #endif
38 #include "Xlibint.h"
39
40 /*
41 * Reformat an XEvent structure to a wire event of the right type.
42 * Return True on success. If the type is unrecognized, return what
43 * _XUnknownNativeEvent returns (i.e., False).
44 */
45 Status
_XEventToWire(register Display * dpy,register XEvent * re,register xEvent * event)46 _XEventToWire(
47 register Display *dpy,
48 register XEvent *re, /* in: from */
49 register xEvent *event) /* out: to */
50 {
51 switch (event->u.u.type = re->type) {
52 case KeyPress:
53 case KeyRelease:
54 {
55 register XKeyEvent *ev = (XKeyEvent*) re;
56 event->u.keyButtonPointer.root = ev->root;
57 event->u.keyButtonPointer.event = ev->window;
58 event->u.keyButtonPointer.child = ev->subwindow;
59 event->u.keyButtonPointer.time = ev->time;
60 event->u.keyButtonPointer.eventX = ev->x ;
61 event->u.keyButtonPointer.eventY = ev->y ;
62 event->u.keyButtonPointer.rootX = ev->x_root;
63 event->u.keyButtonPointer.rootY = ev->y_root;
64 event->u.keyButtonPointer.state = ev->state;
65 event->u.keyButtonPointer.sameScreen = ev->same_screen;
66 event->u.u.detail = ev->keycode;
67 }
68 break;
69 case ButtonPress:
70 case ButtonRelease:
71 {
72 register XButtonEvent *ev = (XButtonEvent *) re;
73 event->u.keyButtonPointer.root = ev->root;
74 event->u.keyButtonPointer.event = ev->window;
75 event->u.keyButtonPointer.child = ev->subwindow;
76 event->u.keyButtonPointer.time = ev->time;
77 event->u.keyButtonPointer.eventX = ev->x;
78 event->u.keyButtonPointer.eventY = ev->y;
79 event->u.keyButtonPointer.rootX = ev->x_root;
80 event->u.keyButtonPointer.rootY = ev->y_root;
81 event->u.keyButtonPointer.state = ev->state;
82 event->u.keyButtonPointer.sameScreen = ev->same_screen;
83 event->u.u.detail = ev->button;
84 }
85 break;
86 case MotionNotify:
87 {
88 register XMotionEvent *ev = (XMotionEvent *)re;
89 event->u.keyButtonPointer.root = ev->root;
90 event->u.keyButtonPointer.event = ev->window;
91 event->u.keyButtonPointer.child = ev->subwindow;
92 event->u.keyButtonPointer.time = ev->time;
93 event->u.keyButtonPointer.eventX= ev->x;
94 event->u.keyButtonPointer.eventY= ev->y;
95 event->u.keyButtonPointer.rootX = ev->x_root;
96 event->u.keyButtonPointer.rootY = ev->y_root;
97 event->u.keyButtonPointer.state = ev->state;
98 event->u.keyButtonPointer.sameScreen= ev->same_screen;
99 event->u.u.detail = ev->is_hint;
100 }
101 break;
102 case EnterNotify:
103 case LeaveNotify:
104 {
105 register XCrossingEvent *ev = (XCrossingEvent *) re;
106 event->u.enterLeave.root = ev->root;
107 event->u.enterLeave.event = ev->window;
108 event->u.enterLeave.child = ev->subwindow;
109 event->u.enterLeave.time = ev->time;
110 event->u.enterLeave.eventX = ev->x;
111 event->u.enterLeave.eventY = ev->y;
112 event->u.enterLeave.rootX = ev->x_root;
113 event->u.enterLeave.rootY = ev->y_root;
114 event->u.enterLeave.state = ev->state;
115 event->u.enterLeave.mode = ev->mode;
116 event->u.enterLeave.flags = 0;
117 if (ev->same_screen) {
118 event->u.enterLeave.flags |= ELFlagSameScreen;
119 }
120 if (ev->focus) {
121 event->u.enterLeave.flags |= ELFlagFocus;
122 }
123 event->u.u.detail = ev->detail;
124 }
125 break;
126 case FocusIn:
127 case FocusOut:
128 {
129 register XFocusChangeEvent *ev = (XFocusChangeEvent *) re;
130 event->u.focus.window = ev->window;
131 event->u.focus.mode = ev->mode;
132 event->u.u.detail = ev->detail;
133 }
134 break;
135 case KeymapNotify:
136 {
137 register XKeymapEvent *ev = (XKeymapEvent *) re;
138 memcpy ((char *)(((xKeymapEvent *) event)->map),
139 &ev->key_vector[1],
140 sizeof (((xKeymapEvent *) event)->map));
141 }
142 break;
143 case Expose:
144 {
145 register XExposeEvent *ev = (XExposeEvent *) re;
146 event->u.expose.window = ev->window;
147 event->u.expose.x = ev->x;
148 event->u.expose.y = ev->y;
149 event->u.expose.width = ev->width;
150 event->u.expose.height = ev->height;
151 event->u.expose.count = ev->count;
152 }
153 break;
154 case GraphicsExpose:
155 {
156 register XGraphicsExposeEvent *ev =
157 (XGraphicsExposeEvent *) re;
158 event->u.graphicsExposure.drawable = ev->drawable;
159 event->u.graphicsExposure.x = ev->x;
160 event->u.graphicsExposure.y = ev->y;
161 event->u.graphicsExposure.width = ev->width;
162 event->u.graphicsExposure.height = ev->height;
163 event->u.graphicsExposure.count = ev->count;
164 event->u.graphicsExposure.majorEvent= ev->major_code;
165 event->u.graphicsExposure.minorEvent= ev->minor_code;
166 }
167 break;
168 case NoExpose:
169 {
170 register XNoExposeEvent *ev = (XNoExposeEvent *) re;
171 event->u.noExposure.drawable = ev->drawable;
172 event->u.noExposure.majorEvent = ev->major_code;
173 event->u.noExposure.minorEvent = ev->minor_code;
174 }
175 break;
176 case VisibilityNotify:
177 {
178 register XVisibilityEvent *ev = (XVisibilityEvent *) re;
179 event->u.visibility.window = ev->window;
180 event->u.visibility.state = ev->state;
181 }
182 break;
183 case CreateNotify:
184 {
185 register XCreateWindowEvent *ev =
186 (XCreateWindowEvent *) re;
187 event->u.createNotify.window = ev->window;
188 event->u.createNotify.parent = ev->parent;
189 event->u.createNotify.x = ev->x;
190 event->u.createNotify.y = ev->y;
191 event->u.createNotify.width = ev->width;
192 event->u.createNotify.height = ev->height;
193 event->u.createNotify.borderWidth = ev->border_width;
194 event->u.createNotify.override = ev->override_redirect;
195 }
196 break;
197 case DestroyNotify:
198 {
199 register XDestroyWindowEvent *ev =
200 (XDestroyWindowEvent *) re;
201 event->u.destroyNotify.window = ev->window;
202 event->u.destroyNotify.event = ev->event;
203 }
204 break;
205 case UnmapNotify:
206 {
207 register XUnmapEvent *ev = (XUnmapEvent *) re;
208 event->u.unmapNotify.window = ev->window;
209 event->u.unmapNotify.event = ev->event;
210 event->u.unmapNotify.fromConfigure = ev->from_configure;
211 }
212 break;
213 case MapNotify:
214 {
215 register XMapEvent *ev = (XMapEvent *) re;
216 event->u.mapNotify.window = ev->window;
217 event->u.mapNotify.event = ev->event;
218 event->u.mapNotify.override = ev->override_redirect;
219 }
220 break;
221 case MapRequest:
222 {
223 register XMapRequestEvent *ev = (XMapRequestEvent *) re;
224 event->u.mapRequest.window = ev->window;
225 event->u.mapRequest.parent = ev->parent;
226 }
227 break;
228 case ReparentNotify:
229 {
230 register XReparentEvent *ev = (XReparentEvent *) re;
231 event->u.reparent.window = ev->window;
232 event->u.reparent.event = ev->event;
233 event->u.reparent.parent = ev->parent;
234 event->u.reparent.x = ev->x;
235 event->u.reparent.y = ev->y;
236 event->u.reparent.override = ev->override_redirect;
237 }
238 break;
239 case ConfigureNotify:
240 {
241 register XConfigureEvent *ev = (XConfigureEvent *) re;
242 event->u.configureNotify.window = ev->window;
243 event->u.configureNotify.event = ev->event;
244 event->u.configureNotify.aboveSibling = ev->above;
245 event->u.configureNotify.x = ev->x;
246 event->u.configureNotify.y = ev->y;
247 event->u.configureNotify.width = ev->width;
248 event->u.configureNotify.height = ev->height;
249 event->u.configureNotify.borderWidth= ev->border_width;
250 event->u.configureNotify.override = ev->override_redirect;
251 }
252 break;
253 case ConfigureRequest:
254 {
255 register XConfigureRequestEvent *ev =
256 (XConfigureRequestEvent *) re;
257 event->u.configureRequest.window = ev->window;
258 event->u.configureRequest.parent = ev->parent;
259 event->u.configureRequest.sibling = ev->above;
260 event->u.configureRequest.x = ev->x;
261 event->u.configureRequest.y = ev->y;
262 event->u.configureRequest.width = ev->width;
263 event->u.configureRequest.height = ev->height;
264 event->u.configureRequest.borderWidth= ev->border_width;
265 event->u.configureRequest.valueMask= ev->value_mask;
266 event->u.u.detail = ev->detail;
267 }
268 break;
269 case GravityNotify:
270 {
271 register XGravityEvent *ev = (XGravityEvent *) re;
272 event->u.gravity.window = ev->window;
273 event->u.gravity.event = ev->event;
274 event->u.gravity.x = ev->x;
275 event->u.gravity.y = ev->y;
276 }
277 break;
278 case ResizeRequest:
279 {
280 register XResizeRequestEvent *ev =
281 (XResizeRequestEvent *) re;
282 event->u.resizeRequest.window = ev->window;
283 event->u.resizeRequest.width = ev->width;
284 event->u.resizeRequest.height = ev->height;
285 }
286 break;
287 case CirculateNotify:
288 {
289 register XCirculateEvent *ev = (XCirculateEvent *) re;
290 event->u.circulate.window = ev->window;
291 event->u.circulate.event = ev->event;
292 event->u.circulate.place = ev->place;
293 }
294 break;
295 case CirculateRequest:
296 {
297 register XCirculateRequestEvent *ev =
298 (XCirculateRequestEvent *) re;
299 event->u.circulate.window = ev->window;
300 event->u.circulate.event = ev->parent;
301 event->u.circulate.place = ev->place;
302 }
303 break;
304 case PropertyNotify:
305 {
306 register XPropertyEvent *ev = (XPropertyEvent *) re;
307 event->u.property.window = ev->window;
308 event->u.property.atom = ev->atom;
309 event->u.property.time = ev->time;
310 event->u.property.state = ev->state;
311 }
312 break;
313 case SelectionClear:
314 {
315 register XSelectionClearEvent *ev =
316 (XSelectionClearEvent *) re;
317 event->u.selectionClear.window = ev->window;
318 event->u.selectionClear.atom = ev->selection;
319 event->u.selectionClear.time = ev->time;
320 }
321 break;
322 case SelectionRequest:
323 {
324 register XSelectionRequestEvent *ev =
325 (XSelectionRequestEvent *) re;
326 event->u.selectionRequest.owner = ev->owner;
327 event->u.selectionRequest.requestor = ev->requestor;
328 event->u.selectionRequest.selection = ev->selection;
329 event->u.selectionRequest.target = ev->target;
330 event->u.selectionRequest.property = ev->property;
331 event->u.selectionRequest.time = ev->time;
332 }
333 break;
334 case SelectionNotify:
335 {
336 register XSelectionEvent *ev = (XSelectionEvent *) re;
337 event->u.selectionNotify.requestor = ev->requestor;
338 event->u.selectionNotify.selection = ev->selection;
339 event->u.selectionNotify.target = ev->target;
340 event->u.selectionNotify.property = ev->property;
341 event->u.selectionNotify.time = ev->time;
342 }
343 break;
344 case ColormapNotify:
345 {
346 register XColormapEvent *ev = (XColormapEvent *) re;
347 event->u.colormap.window = ev->window;
348 event->u.colormap.colormap = ev->colormap;
349 event->u.colormap.new = ev->new;
350 event->u.colormap.state = ev->state;
351 }
352 break;
353 case ClientMessage:
354 {
355 register int i;
356 register XClientMessageEvent *ev
357 = (XClientMessageEvent *) re;
358 event->u.clientMessage.window = ev->window;
359 event->u.u.detail = ev->format;
360 switch (ev->format) {
361 case 8:
362 event->u.clientMessage.u.b.type = ev->message_type;
363 for (i = 0; i < 20; i++)
364 event->u.clientMessage.u.b.bytes[i] = ev->data.b[i];
365 break;
366 case 16:
367 event->u.clientMessage.u.s.type = ev->message_type;
368 event->u.clientMessage.u.s.shorts0 = ev->data.s[0];
369 event->u.clientMessage.u.s.shorts1 = ev->data.s[1];
370 event->u.clientMessage.u.s.shorts2 = ev->data.s[2];
371 event->u.clientMessage.u.s.shorts3 = ev->data.s[3];
372 event->u.clientMessage.u.s.shorts4 = ev->data.s[4];
373 event->u.clientMessage.u.s.shorts5 = ev->data.s[5];
374 event->u.clientMessage.u.s.shorts6 = ev->data.s[6];
375 event->u.clientMessage.u.s.shorts7 = ev->data.s[7];
376 event->u.clientMessage.u.s.shorts8 = ev->data.s[8];
377 event->u.clientMessage.u.s.shorts9 = ev->data.s[9];
378 break;
379 case 32:
380 event->u.clientMessage.u.l.type = ev->message_type;
381 event->u.clientMessage.u.l.longs0 = ev->data.l[0];
382 event->u.clientMessage.u.l.longs1 = ev->data.l[1];
383 event->u.clientMessage.u.l.longs2 = ev->data.l[2];
384 event->u.clientMessage.u.l.longs3 = ev->data.l[3];
385 event->u.clientMessage.u.l.longs4 = ev->data.l[4];
386 break;
387 default:
388 /* client passing bogus data, let server complain */
389 break;
390 }
391 }
392 break;
393 case MappingNotify:
394 {
395 register XMappingEvent *ev = (XMappingEvent *) re;
396 event->u.mappingNotify.firstKeyCode = ev->first_keycode;
397 event->u.mappingNotify.request = ev->request;
398 event->u.mappingNotify.count = ev->count;
399 }
400 break;
401
402 default:
403 return(_XUnknownNativeEvent(dpy, re, event));
404 }
405 return(1);
406 }
407