imEvToWire.c revision 61b2299d
1/* $Xorg: imEvToWire.c,v 1.3 2000/08/17 19:45:12 cpqbld Exp $ */
2/***********************************************************
3Copyright 1993 by Digital Equipment Corporation, Maynard, Massachusetts,
4
5                        All Rights Reserved
6
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the name of Digital not be
12used in advertising or publicity pertaining to distribution of the
13software without specific, written prior permission.
14
15DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
16ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
17DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
18ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
19WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
20ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
21SOFTWARE.
22
23******************************************************************/
24/* $XFree86$ */
25
26#define NEED_EVENTS
27#ifdef HAVE_CONFIG_H
28#include <config.h>
29#endif
30#include <X11/Xlibint.h>
31#include <X11/Xlib.h>
32#undef NEED_EVENTS
33#include "Ximint.h"
34
35
36#define sw16(n, s) ((s) ?                    \
37		      (((n) << 8 & 0xff00) | \
38		       ((n) >> 8 & 0xff)     \
39		      ) : n)
40
41#define sw32(n, s) ((s) ?                         \
42		      (((n) << 24 & 0xff000000) | \
43		       ((n) <<  8 & 0xff0000) |   \
44		       ((n) >>  8 & 0xff00) |     \
45		       ((n) >> 24 & 0xff)         \
46		      ) : n)
47
48Status
49_XimProtoEventToWire(
50    register XEvent *re,	/* pointer to where event should be reformatted */
51    register xEvent *event,	/* wire protocol event */
52    Bool sw)         /* swap byte? */
53{
54	switch (event->u.u.type = re->type) {
55	      case KeyPress:
56	      case KeyRelease:
57	        {
58			register XKeyEvent *ev = (XKeyEvent*) re;
59			event->u.keyButtonPointer.root	= sw32(ev->root, sw);
60			event->u.keyButtonPointer.event	 =
61			    sw32(ev->window, sw);
62			event->u.keyButtonPointer.child  =
63			    sw32(ev->subwindow, sw);
64			event->u.keyButtonPointer.time	 = sw32(ev->time, sw);
65			event->u.keyButtonPointer.eventX = sw16(ev->x, sw) ;
66			event->u.keyButtonPointer.eventY = sw16(ev->y, sw) ;
67			event->u.keyButtonPointer.rootX	 =
68			    sw16(ev->x_root, sw);
69			event->u.keyButtonPointer.rootY  =
70			    sw16(ev->y_root, sw);
71			event->u.keyButtonPointer.state  = sw16(ev->state, sw);
72			event->u.keyButtonPointer.sameScreen = ev->same_screen;
73			event->u.u.detail = ev->keycode;
74		}
75	      	break;
76	      case ButtonPress:
77	      case ButtonRelease:
78	        {
79			register XButtonEvent *ev =  (XButtonEvent *) re;
80			event->u.keyButtonPointer.root	 = sw32(ev->root, sw);
81			event->u.keyButtonPointer.event	 = sw32(ev->window, sw);
82			event->u.keyButtonPointer.child	 = sw32(ev->subwindow, sw);
83			event->u.keyButtonPointer.time	 = sw32(ev->time, sw);
84			event->u.keyButtonPointer.eventX = sw16(ev->x, sw);
85			event->u.keyButtonPointer.eventY = sw16(ev->y, sw);
86			event->u.keyButtonPointer.rootX	 = sw16(ev->x_root, sw);
87			event->u.keyButtonPointer.rootY	 = sw16(ev->y_root, sw);
88			event->u.keyButtonPointer.state	 = sw16(ev->state, sw);
89			event->u.keyButtonPointer.sameScreen	= ev->same_screen;
90			event->u.u.detail		= ev->button;
91		}
92	        break;
93	      case MotionNotify:
94	        {
95			register XMotionEvent *ev =   (XMotionEvent *)re;
96			event->u.keyButtonPointer.root	= sw32(ev->root, sw);
97			event->u.keyButtonPointer.event	= sw32(ev->window, sw);
98			event->u.keyButtonPointer.child	= sw32(ev->subwindow, sw);
99			event->u.keyButtonPointer.time	= sw32(ev->time, sw);
100			event->u.keyButtonPointer.eventX= sw16(ev->x, sw);
101			event->u.keyButtonPointer.eventY= sw16(ev->y, sw);
102			event->u.keyButtonPointer.rootX	= sw16(ev->x_root, sw);
103			event->u.keyButtonPointer.rootY	= sw16(ev->y_root, sw);
104			event->u.keyButtonPointer.state	= sw16(ev->state, sw);
105			event->u.keyButtonPointer.sameScreen= ev->same_screen;
106			event->u.u.detail		= ev->is_hint;
107		}
108	        break;
109	      case EnterNotify:
110	      case LeaveNotify:
111		{
112			register XCrossingEvent *ev   = (XCrossingEvent *) re;
113			event->u.enterLeave.root	= sw32(ev->root, sw);
114			event->u.enterLeave.event	= sw32(ev->window, sw);
115			event->u.enterLeave.child	= sw32(ev->subwindow, sw);
116			event->u.enterLeave.time	= sw32(ev->time, sw);
117			event->u.enterLeave.eventX	= sw16(ev->x, sw);
118			event->u.enterLeave.eventY	= sw16(ev->y, sw);
119			event->u.enterLeave.rootX	= sw16(ev->x_root, sw);
120			event->u.enterLeave.rootY	= sw16(ev->y_root, sw);
121			event->u.enterLeave.state	= sw16(ev->state, sw);
122			event->u.enterLeave.mode	= ev->mode;
123			event->u.enterLeave.flags	= 0;
124			if (ev->same_screen) {
125				event->u.enterLeave.flags |= ELFlagSameScreen;
126				}
127			if (ev->focus) {
128				event->u.enterLeave.flags |= ELFlagFocus;
129				}
130			event->u.u.detail		= ev->detail;
131		}
132		  break;
133	      case FocusIn:
134	      case FocusOut:
135		{
136			register XFocusChangeEvent *ev = (XFocusChangeEvent *) re;
137			event->u.focus.window	= sw32(ev->window, sw);
138			event->u.focus.mode	= ev->mode;
139			event->u.u.detail	= ev->detail;
140		}
141		  break;
142	      case KeymapNotify:
143		{
144			register XKeymapEvent *ev = (XKeymapEvent *) re;
145			memcpy((char *)(((xKeymapEvent *) event)->map),
146			       &ev->key_vector[1],
147			       sizeof (((xKeymapEvent *) event)->map));
148		}
149		break;
150	      case Expose:
151		{
152			register XExposeEvent *ev = (XExposeEvent *) re;
153			event->u.expose.window		= sw32(ev->window, sw);
154			event->u.expose.x		= sw16(ev->x, sw);
155			event->u.expose.y		= sw16(ev->y, sw);
156			event->u.expose.width		= sw16(ev->width, sw);
157			event->u.expose.height		= sw16(ev->height, sw);
158			event->u.expose.count		= sw16(ev->count, sw);
159		}
160		break;
161	      case GraphicsExpose:
162		{
163		    register XGraphicsExposeEvent *ev =
164			(XGraphicsExposeEvent *) re;
165		    event->u.graphicsExposure.drawable	= sw32(ev->drawable, sw);
166		    event->u.graphicsExposure.x		= sw16(ev->x, sw);
167		    event->u.graphicsExposure.y		= sw16(ev->y, sw);
168		    event->u.graphicsExposure.width	= sw16(ev->width, sw);
169		    event->u.graphicsExposure.height	= sw16(ev->height, sw);
170		    event->u.graphicsExposure.count	= sw16(ev->count, sw);
171		    event->u.graphicsExposure.majorEvent= ev->major_code;
172		    event->u.graphicsExposure.minorEvent= sw16(ev->minor_code, sw);
173		}
174		break;
175	      case NoExpose:
176		{
177		    register XNoExposeEvent *ev = (XNoExposeEvent *) re;
178		    event->u.noExposure.drawable	= sw32(ev->drawable, sw);
179		    event->u.noExposure.majorEvent	= ev->major_code;
180		    event->u.noExposure.minorEvent	= sw16(ev->minor_code, sw);
181		}
182		break;
183	      case VisibilityNotify:
184		{
185		    register XVisibilityEvent *ev = (XVisibilityEvent *) re;
186		    event->u.visibility.window		= sw32(ev->window, sw);
187		    event->u.visibility.state		= ev->state;
188		}
189		break;
190	      case CreateNotify:
191		{
192		    register XCreateWindowEvent *ev =
193			 (XCreateWindowEvent *) re;
194		    event->u.createNotify.window	= sw32(ev->window, sw);
195		    event->u.createNotify.parent	= sw32(ev->parent, sw);
196		    event->u.createNotify.x		= sw16(ev->x, sw);
197		    event->u.createNotify.y		= sw16(ev->y, sw);
198		    event->u.createNotify.width		= sw16(ev->width, sw);
199		    event->u.createNotify.height	= sw16(ev->height, sw);
200		    event->u.createNotify.borderWidth	= sw16(ev->border_width, sw);
201		    event->u.createNotify.override	= ev->override_redirect;
202		}
203		break;
204	      case DestroyNotify:
205		{
206		    register XDestroyWindowEvent *ev =
207				(XDestroyWindowEvent *) re;
208		    event->u.destroyNotify.window	= sw32(ev->window, sw);
209		    event->u.destroyNotify.event	= sw32(ev->event, sw);
210		}
211		break;
212	      case UnmapNotify:
213		{
214		    register XUnmapEvent *ev = (XUnmapEvent *) re;
215		    event->u.unmapNotify.window	= sw32(ev->window, sw);
216		    event->u.unmapNotify.event	= sw32(ev->event, sw);
217		    event->u.unmapNotify.fromConfigure	= ev->from_configure;
218		}
219		break;
220	      case MapNotify:
221		{
222		    register XMapEvent *ev = (XMapEvent *) re;
223		    event->u.mapNotify.window	= sw32(ev->window, sw);
224		    event->u.mapNotify.event	= sw32(ev->event, sw);
225		    event->u.mapNotify.override	= ev->override_redirect;
226		}
227		break;
228	      case MapRequest:
229		{
230		    register XMapRequestEvent *ev = (XMapRequestEvent *) re;
231		    event->u.mapRequest.window	= sw32(ev->window, sw);
232		    event->u.mapRequest.parent	= sw32(ev->parent, sw);
233		}
234		break;
235	      case ReparentNotify:
236		{
237		    register XReparentEvent *ev = (XReparentEvent *) re;
238		    event->u.reparent.window	= sw32(ev->window, sw);
239		    event->u.reparent.event	= sw32(ev->event, sw);
240		    event->u.reparent.parent	= sw32(ev->parent, sw);
241		    event->u.reparent.x		= sw16(ev->x, sw);
242		    event->u.reparent.y		= sw16(ev->y, sw);
243		    event->u.reparent.override	= ev->override_redirect;
244		}
245		break;
246	      case ConfigureNotify:
247		{
248		    register XConfigureEvent *ev = (XConfigureEvent *) re;
249		    event->u.configureNotify.window	= sw32(ev->window, sw);
250		    event->u.configureNotify.event	= sw32(ev->event, sw);
251		    event->u.configureNotify.aboveSibling	= sw32(ev->above, sw);
252		    event->u.configureNotify.x		= sw16(ev->x, sw);
253		    event->u.configureNotify.y		= sw16(ev->y, sw);
254		    event->u.configureNotify.width	= sw16(ev->width, sw);
255		    event->u.configureNotify.height	= sw16(ev->height, sw);
256		    event->u.configureNotify.borderWidth= sw16(ev->border_width, sw);
257		    event->u.configureNotify.override	= ev->override_redirect;
258		}
259		break;
260	      case ConfigureRequest:
261		{
262		    register XConfigureRequestEvent *ev =
263		        (XConfigureRequestEvent *) re;
264		    event->u.configureRequest.window	= sw32(ev->window, sw);
265		    event->u.configureRequest.parent	= sw32(ev->parent, sw);
266		    event->u.configureRequest.sibling   = sw32(ev->above, sw);
267		    event->u.configureRequest.x		= sw16(ev->x, sw);
268		    event->u.configureRequest.y		= sw16(ev->y, sw);
269		    event->u.configureRequest.width	= sw16(ev->width, sw);
270		    event->u.configureRequest.height	= sw16(ev->height, sw);
271		    event->u.configureRequest.borderWidth= sw16(ev->border_width, sw);
272		    event->u.configureRequest.valueMask= sw16(ev->value_mask, sw);
273		    event->u.u.detail 			= ev->detail;
274		}
275		break;
276	      case GravityNotify:
277		{
278		    register XGravityEvent *ev  = (XGravityEvent *) re;
279		    event->u.gravity.window	= sw32(ev->window, sw);
280		    event->u.gravity.event	= sw32(ev->event, sw);
281		    event->u.gravity.x		= sw16(ev->x, sw);
282		    event->u.gravity.y		= sw16(ev->y, sw);
283		}
284		break;
285	      case ResizeRequest:
286		{
287		    register XResizeRequestEvent *ev =
288			(XResizeRequestEvent *) re;
289		    event->u.resizeRequest.window	= sw32(ev->window, sw);
290		    event->u.resizeRequest.width	= sw16(ev->width, sw);
291		    event->u.resizeRequest.height	= sw16(ev->height, sw);
292		}
293		break;
294	      case CirculateNotify:
295		{
296		    register XCirculateEvent *ev = (XCirculateEvent *) re;
297		    event->u.circulate.window		= sw32(ev->window, sw);
298		    event->u.circulate.event		= sw32(ev->event, sw);
299		    event->u.circulate.place		= ev->place;
300		}
301		break;
302	      case CirculateRequest:
303		{
304		    register XCirculateRequestEvent *ev =
305		        (XCirculateRequestEvent *) re;
306		    event->u.circulate.window		= sw32(ev->window, sw);
307		    event->u.circulate.event		= sw32(ev->parent, sw);
308		    event->u.circulate.place		= ev->place;
309		}
310		break;
311	      case PropertyNotify:
312		{
313		    register XPropertyEvent *ev = (XPropertyEvent *) re;
314		    event->u.property.window		= sw32(ev->window, sw);
315		    event->u.property.atom		= sw32(ev->atom, sw);
316		    event->u.property.time		= sw32(ev->time, sw);
317		    event->u.property.state		= ev->state;
318		}
319		break;
320	      case SelectionClear:
321		{
322		    register XSelectionClearEvent *ev =
323			 (XSelectionClearEvent *) re;
324		    event->u.selectionClear.window	= sw32(ev->window, sw);
325		    event->u.selectionClear.atom	= sw32(ev->selection, sw);
326		    event->u.selectionClear.time	= sw32(ev->time, sw);
327		}
328		break;
329	      case SelectionRequest:
330		{
331		    register XSelectionRequestEvent *ev =
332		        (XSelectionRequestEvent *) re;
333		    event->u.selectionRequest.owner	= sw32(ev->owner, sw);
334		    event->u.selectionRequest.requestor	= sw32(ev->requestor, sw);
335		    event->u.selectionRequest.selection	= sw32(ev->selection, sw);
336		    event->u.selectionRequest.target	= sw32(ev->target, sw);
337		    event->u.selectionRequest.property	= sw32(ev->property, sw);
338		    event->u.selectionRequest.time	= sw32(ev->time, sw);
339		}
340		break;
341	      case SelectionNotify:
342		{
343		    register XSelectionEvent *ev = (XSelectionEvent *) re;
344		    event->u.selectionNotify.requestor	= sw32(ev->requestor, sw);
345		    event->u.selectionNotify.selection	= sw32(ev->selection, sw);
346		    event->u.selectionNotify.target	= sw32(ev->target, sw);
347		    event->u.selectionNotify.property	= sw32(ev->property, sw);
348		    event->u.selectionNotify.time	= sw32(ev->time, sw);
349		}
350		break;
351	      case ColormapNotify:
352		{
353		    register XColormapEvent *ev = (XColormapEvent *) re;
354		    event->u.colormap.window		= sw32(ev->window, sw);
355		    event->u.colormap.colormap		= sw32(ev->colormap, sw);
356		    event->u.colormap.new		= ev->new;
357		    event->u.colormap.state		= ev->state;
358	        }
359		break;
360	      case ClientMessage:
361		{
362		   register int i;
363		   register XClientMessageEvent *ev
364		   			= (XClientMessageEvent *) re;
365		   event->u.clientMessage.window = sw32(ev->window, sw);
366		   event->u.u.detail		 = ev->format;
367		   switch (ev->format) {
368			case 8:
369			  event->u.clientMessage.u.b.type   = sw32(ev->message_type, sw);
370			  for (i = 0; i < 20; i++)
371			   event->u.clientMessage.u.b.bytes[i] = ev->data.b[i];
372			  break;
373			case 16:
374			  event->u.clientMessage.u.s.type   = sw32(ev->message_type, sw);
375			  event->u.clientMessage.u.s.shorts0   = sw16(ev->data.s[0], sw);
376			  event->u.clientMessage.u.s.shorts1   = sw16(ev->data.s[1], sw);
377			  event->u.clientMessage.u.s.shorts2   = sw16(ev->data.s[2], sw);
378			  event->u.clientMessage.u.s.shorts3   = sw16(ev->data.s[3], sw);
379			  event->u.clientMessage.u.s.shorts4   = sw16(ev->data.s[4], sw);
380			  event->u.clientMessage.u.s.shorts5   = sw16(ev->data.s[5], sw);
381			  event->u.clientMessage.u.s.shorts6   = sw16(ev->data.s[6], sw);
382			  event->u.clientMessage.u.s.shorts7   = sw16(ev->data.s[7], sw);
383			  event->u.clientMessage.u.s.shorts8   = sw16(ev->data.s[8], sw);
384			  event->u.clientMessage.u.s.shorts9   = sw16(ev->data.s[9], sw);
385			  break;
386			case 32:
387			  event->u.clientMessage.u.l.type   = sw32(ev->message_type, sw);
388			  event->u.clientMessage.u.l.longs0   = sw32(ev->data.l[0], sw);
389			  event->u.clientMessage.u.l.longs1   = sw32(ev->data.l[1], sw);
390			  event->u.clientMessage.u.l.longs2   = sw32(ev->data.l[2], sw);
391			  event->u.clientMessage.u.l.longs3   = sw32(ev->data.l[3], sw);
392			  event->u.clientMessage.u.l.longs4   = sw32(ev->data.l[4], sw);
393			  break;
394			default:
395			  /* client passing bogus data, let server complain */
396			  break;
397			}
398		    }
399		break;
400	      case MappingNotify:
401		  {
402		    register XMappingEvent *ev = (XMappingEvent *) re;
403		    event->u.mappingNotify.firstKeyCode = ev->first_keycode;
404		    event->u.mappingNotify.request 	= ev->request;
405		    event->u.mappingNotify.count	= ev->count;
406		   }
407		break;
408
409	      default:
410		return(0);
411	}
412	/* Common process */
413	if (((XAnyEvent *)re)->send_event)
414	    event->u.u.type |= 0x80;
415	event->u.u.sequenceNumber =
416	    ((XAnyEvent *)re)->serial & ~((unsigned long)0xffff);
417	event->u.u.sequenceNumber = sw16(event->u.u.sequenceNumber, sw);
418	return(1);
419}
420
421
422/*
423 * reformat a wire event into an XEvent structure of the right type.
424 */
425Bool
426_XimProtoWireToEvent(
427    register XEvent *re,	/* pointer to where event should be reformatted */
428    register xEvent *event,	/* wire protocol event */
429    Bool sw)                /* swap byte? */
430{
431
432	re->type = event->u.u.type & 0x7f;
433	((XAnyEvent *)re)->serial = sw16(event->u.u.sequenceNumber, sw);
434	((XAnyEvent *)re)->send_event = ((event->u.u.type & 0x80) != 0);
435	((XAnyEvent *)re)->display = NULL;
436
437	/* Ignore the leading bit of the event type since it is set when a
438		client sends an event rather than the server. */
439
440	switch (event-> u.u.type & 0177) {
441	      case KeyPress:
442	      case KeyRelease:
443	        {
444			register XKeyEvent *ev = (XKeyEvent*) re;
445			ev->root 	= sw32(event->u.keyButtonPointer.root, sw);
446			ev->window 	= sw32(event->u.keyButtonPointer.event, sw);
447			ev->subwindow 	= sw32(event->u.keyButtonPointer.child, sw);
448			ev->time 	= sw32(event->u.keyButtonPointer.time, sw);
449			ev->x 		= cvtINT16toInt(sw16(event->u.keyButtonPointer.eventX, sw));
450			ev->y 		= cvtINT16toInt(sw16(event->u.keyButtonPointer.eventY, sw));
451			ev->x_root 	= cvtINT16toInt(sw16(event->u.keyButtonPointer.rootX, sw));
452			ev->y_root 	= cvtINT16toInt(sw16(event->u.keyButtonPointer.rootY, sw));
453			ev->state	= sw16(event->u.keyButtonPointer.state, sw);
454			ev->same_screen	= event->u.keyButtonPointer.sameScreen;
455			ev->keycode 	= event->u.u.detail;
456		}
457	      	break;
458	      case ButtonPress:
459	      case ButtonRelease:
460	        {
461			register XButtonEvent *ev =  (XButtonEvent *) re;
462			ev->root 	= sw32(event->u.keyButtonPointer.root, sw);
463			ev->window 	= sw32(event->u.keyButtonPointer.event, sw);
464			ev->subwindow 	= sw32(event->u.keyButtonPointer.child, sw);
465			ev->time 	= sw32(event->u.keyButtonPointer.time, sw);
466			ev->x 		= cvtINT16toInt(sw16(event->u.keyButtonPointer.eventX, sw));
467			ev->y 		= cvtINT16toInt(sw16(event->u.keyButtonPointer.eventY, sw));
468			ev->x_root 	= cvtINT16toInt(sw16(event->u.keyButtonPointer.rootX, sw));
469			ev->y_root 	= cvtINT16toInt(sw16(event->u.keyButtonPointer.rootY, sw));
470			ev->state	= sw16(event->u.keyButtonPointer.state, sw);
471			ev->same_screen	= event->u.keyButtonPointer.sameScreen;
472			ev->button 	= event->u.u.detail;
473		}
474	        break;
475	      case MotionNotify:
476	        {
477			register XMotionEvent *ev =   (XMotionEvent *)re;
478			ev->root 	= sw32(event->u.keyButtonPointer.root, sw);
479			ev->window 	= sw32(event->u.keyButtonPointer.event, sw);
480			ev->subwindow 	= sw32(event->u.keyButtonPointer.child, sw);
481			ev->time 	= sw32(event->u.keyButtonPointer.time, sw);
482			ev->x 		= cvtINT16toInt(sw16(event->u.keyButtonPointer.eventX, sw));
483			ev->y 		= cvtINT16toInt(sw16(event->u.keyButtonPointer.eventY, sw));
484			ev->x_root 	= cvtINT16toInt(sw16(event->u.keyButtonPointer.rootX, sw));
485			ev->y_root 	= cvtINT16toInt(sw16(event->u.keyButtonPointer.rootY, sw));
486			ev->state	= sw16(event->u.keyButtonPointer.state, sw);
487			ev->same_screen	= event->u.keyButtonPointer.sameScreen;
488			ev->is_hint 	= event->u.u.detail;
489		}
490	        break;
491	      case EnterNotify:
492	      case LeaveNotify:
493		{
494			register XCrossingEvent *ev   = (XCrossingEvent *) re;
495			ev->root	= sw32(event->u.enterLeave.root, sw);
496			ev->window	= sw32(event->u.enterLeave.event, sw);
497			ev->subwindow	= sw32(event->u.enterLeave.child, sw);
498			ev->time	= sw32(event->u.enterLeave.time, sw);
499			ev->x		= cvtINT16toInt(sw16(event->u.enterLeave.eventX, sw));
500			ev->y		= cvtINT16toInt(sw16(event->u.enterLeave.eventY, sw));
501			ev->x_root	= cvtINT16toInt(sw16(event->u.enterLeave.rootX, sw));
502			ev->y_root	= cvtINT16toInt(sw16(event->u.enterLeave.rootY, sw));
503			ev->state	= sw16(event->u.enterLeave.state, sw);
504			ev->mode	= event->u.enterLeave.mode;
505			ev->same_screen = (event->u.enterLeave.flags &
506				ELFlagSameScreen) && True;
507			ev->focus	= (event->u.enterLeave.flags &
508			  	ELFlagFocus) && True;
509			ev->detail	= event->u.u.detail;
510		}
511		  break;
512	      case FocusIn:
513	      case FocusOut:
514		{
515			register XFocusChangeEvent *ev = (XFocusChangeEvent *) re;
516			ev->window 	= sw32(event->u.focus.window, sw);
517			ev->mode	= event->u.focus.mode;
518			ev->detail	= event->u.u.detail;
519		}
520		  break;
521	      case KeymapNotify:
522		{
523			register XKeymapEvent *ev = (XKeymapEvent *) re;
524			ev->window	= None;
525			memcpy(&ev->key_vector[1],
526			       (char *)((xKeymapEvent *) event)->map,
527			       sizeof (((xKeymapEvent *) event)->map));
528		}
529		break;
530	      case Expose:
531		{
532			register XExposeEvent *ev = (XExposeEvent *) re;
533			ev->window	= sw32(event->u.expose.window, sw);
534			ev->x		= sw16(event->u.expose.x, sw);
535			ev->y		= sw16(event->u.expose.y, sw);
536			ev->width	= sw16(event->u.expose.width, sw);
537			ev->height	= sw16(event->u.expose.height, sw);
538			ev->count	= sw16(event->u.expose.count, sw);
539		}
540		break;
541	      case GraphicsExpose:
542		{
543		    register XGraphicsExposeEvent *ev =
544			(XGraphicsExposeEvent *) re;
545		    ev->drawable	= sw32(event->u.graphicsExposure.drawable, sw);
546		    ev->x		= sw16(event->u.graphicsExposure.x, sw);
547		    ev->y		= sw16(event->u.graphicsExposure.y, sw);
548		    ev->width		= sw16(event->u.graphicsExposure.width, sw);
549		    ev->height		= sw16(event->u.graphicsExposure.height, sw);
550		    ev->count		= sw16(event->u.graphicsExposure.count, sw);
551		    ev->major_code	= event->u.graphicsExposure.majorEvent;
552		    ev->minor_code	= sw16(event->u.graphicsExposure.minorEvent, sw);
553		}
554		break;
555	      case NoExpose:
556		{
557		    register XNoExposeEvent *ev = (XNoExposeEvent *) re;
558		    ev->drawable	= sw32(event->u.noExposure.drawable, sw);
559		    ev->major_code	= event->u.noExposure.majorEvent;
560		    ev->minor_code	= sw16(event->u.noExposure.minorEvent, sw);
561		}
562		break;
563	      case VisibilityNotify:
564		{
565		    register XVisibilityEvent *ev = (XVisibilityEvent *) re;
566		    ev->window		= sw32(event->u.visibility.window, sw);
567		    ev->state		= event->u.visibility.state;
568		}
569		break;
570	      case CreateNotify:
571		{
572		    register XCreateWindowEvent *ev =
573			 (XCreateWindowEvent *) re;
574		    ev->window		= sw32(event->u.createNotify.window, sw);
575		    ev->parent		= sw32(event->u.createNotify.parent, sw);
576		    ev->x		= cvtINT16toInt(sw16(event->u.createNotify.x, sw));
577		    ev->y		= cvtINT16toInt(sw16(event->u.createNotify.y, sw));
578		    ev->width		= sw16(event->u.createNotify.width, sw);
579		    ev->height		= sw16(event->u.createNotify.height, sw);
580		    ev->border_width	= sw16(event->u.createNotify.borderWidth, sw);
581		    ev->override_redirect	= event->u.createNotify.override;
582		}
583		break;
584	      case DestroyNotify:
585		{
586		    register XDestroyWindowEvent *ev =
587				(XDestroyWindowEvent *) re;
588		    ev->window		= sw32(event->u.destroyNotify.window, sw);
589		    ev->event		= sw32(event->u.destroyNotify.event, sw);
590		}
591		break;
592	      case UnmapNotify:
593		{
594		    register XUnmapEvent *ev = (XUnmapEvent *) re;
595		    ev->window		= sw32(event->u.unmapNotify.window, sw);
596		    ev->event		= sw32(event->u.unmapNotify.event, sw);
597		    ev->from_configure	= event->u.unmapNotify.fromConfigure;
598		}
599		break;
600	      case MapNotify:
601		{
602		    register XMapEvent *ev = (XMapEvent *) re;
603		    ev->window		= sw32(event->u.mapNotify.window, sw);
604		    ev->event		= sw32(event->u.mapNotify.event, sw);
605		    ev->override_redirect	= event->u.mapNotify.override;
606		}
607		break;
608	      case MapRequest:
609		{
610		    register XMapRequestEvent *ev = (XMapRequestEvent *) re;
611		    ev->window		= sw32(event->u.mapRequest.window, sw);
612		    ev->parent		= sw32(event->u.mapRequest.parent, sw);
613		}
614		break;
615	      case ReparentNotify:
616		{
617		    register XReparentEvent *ev = (XReparentEvent *) re;
618		    ev->event		= sw32(event->u.reparent.event, sw);
619		    ev->window		= sw32(event->u.reparent.window, sw);
620		    ev->parent		= sw32(event->u.reparent.parent, sw);
621		    ev->x		= cvtINT16toInt(sw16(event->u.reparent.x, sw));
622		    ev->y		= cvtINT16toInt(sw16(event->u.reparent.y, sw));
623		    ev->override_redirect	= event->u.reparent.override;
624		}
625		break;
626	      case ConfigureNotify:
627		{
628		    register XConfigureEvent *ev = (XConfigureEvent *) re;
629		    ev->event	= sw32(event->u.configureNotify.event, sw);
630		    ev->window	= sw32(event->u.configureNotify.window, sw);
631		    ev->above	= sw32(event->u.configureNotify.aboveSibling, sw);
632		    ev->x	= cvtINT16toInt(sw16(event->u.configureNotify.x, sw));
633		    ev->y	= cvtINT16toInt(sw16(event->u.configureNotify.y, sw));
634		    ev->width	= sw16(event->u.configureNotify.width, sw);
635		    ev->height	= sw16(event->u.configureNotify.height, sw);
636		    ev->border_width  = sw16(event->u.configureNotify.borderWidth, sw);
637		    ev->override_redirect = event->u.configureNotify.override;
638		}
639		break;
640	      case ConfigureRequest:
641		{
642		    register XConfigureRequestEvent *ev =
643		        (XConfigureRequestEvent *) re;
644		    ev->window		= sw32(event->u.configureRequest.window, sw);
645		    ev->parent		= sw32(event->u.configureRequest.parent, sw);
646		    ev->above		= sw32(event->u.configureRequest.sibling, sw);
647		    ev->x		= cvtINT16toInt(sw16(event->u.configureRequest.x, sw));
648		    ev->y		= cvtINT16toInt(sw16(event->u.configureRequest.y, sw));
649		    ev->width		= sw16(event->u.configureRequest.width, sw);
650		    ev->height		= sw16(event->u.configureRequest.height, sw);
651		    ev->border_width	= sw16(event->u.configureRequest.borderWidth, sw);
652		    ev->value_mask	= sw16(event->u.configureRequest.valueMask, sw);
653		    ev->detail  	= event->u.u.detail;
654		}
655		break;
656	      case GravityNotify:
657		{
658		    register XGravityEvent *ev = (XGravityEvent *) re;
659		    ev->window		= sw32(event->u.gravity.window, sw);
660		    ev->event		= sw32(event->u.gravity.event, sw);
661		    ev->x		= cvtINT16toInt(sw16(event->u.gravity.x, sw));
662		    ev->y		= cvtINT16toInt(sw16(event->u.gravity.y, sw));
663		}
664		break;
665	      case ResizeRequest:
666		{
667		    register XResizeRequestEvent *ev =
668			(XResizeRequestEvent *) re;
669		    ev->window		= sw32(event->u.resizeRequest.window, sw);
670		    ev->width		= sw16(event->u.resizeRequest.width, sw);
671		    ev->height		= sw16(event->u.resizeRequest.height, sw);
672		}
673		break;
674	      case CirculateNotify:
675		{
676		    register XCirculateEvent *ev = (XCirculateEvent *) re;
677		    ev->window		= sw32(event->u.circulate.window, sw);
678		    ev->event		= sw32(event->u.circulate.event, sw);
679		    ev->place		= event->u.circulate.place;
680		}
681		break;
682	      case CirculateRequest:
683		{
684		    register XCirculateRequestEvent *ev =
685		        (XCirculateRequestEvent *) re;
686		    ev->window		= sw32(event->u.circulate.window, sw);
687		    ev->parent		= sw32(event->u.circulate.event, sw);
688		    ev->place		= event->u.circulate.place;
689		}
690		break;
691	      case PropertyNotify:
692		{
693		    register XPropertyEvent *ev = (XPropertyEvent *) re;
694		    ev->window		= sw32(event->u.property.window, sw);
695		    ev->atom		= sw32(event->u.property.atom, sw);
696		    ev->time		= sw32(event->u.property.time, sw);
697		    ev->state		= event->u.property.state;
698		}
699		break;
700	      case SelectionClear:
701		{
702		    register XSelectionClearEvent *ev =
703			 (XSelectionClearEvent *) re;
704		    ev->window		= sw32(event->u.selectionClear.window, sw);
705		    ev->selection	= sw32(event->u.selectionClear.atom, sw);
706		    ev->time		= sw32(event->u.selectionClear.time, sw);
707		}
708		break;
709	      case SelectionRequest:
710		{
711		    register XSelectionRequestEvent *ev =
712		        (XSelectionRequestEvent *) re;
713		    ev->owner		= sw32(event->u.selectionRequest.owner, sw);
714		    ev->requestor	= sw32(event->u.selectionRequest.requestor, sw);
715		    ev->selection	= sw32(event->u.selectionRequest.selection, sw);
716		    ev->target		= sw32(event->u.selectionRequest.target, sw);
717		    ev->property	= sw32(event->u.selectionRequest.property, sw);
718		    ev->time		= sw32(event->u.selectionRequest.time, sw);
719		}
720		break;
721	      case SelectionNotify:
722		{
723		    register XSelectionEvent *ev = (XSelectionEvent *) re;
724		    ev->requestor	= sw32(event->u.selectionNotify.requestor, sw);
725		    ev->selection	= sw32(event->u.selectionNotify.selection, sw);
726		    ev->target		= sw32(event->u.selectionNotify.target, sw);
727		    ev->property	= sw32(event->u.selectionNotify.property, sw);
728		    ev->time		= sw32(event->u.selectionNotify.time, sw);
729		}
730		break;
731	      case ColormapNotify:
732		{
733		    register XColormapEvent *ev = (XColormapEvent *) re;
734		    ev->window		= sw32(event->u.colormap.window, sw);
735		    ev->colormap	= sw32(event->u.colormap.colormap, sw);
736		    ev->new		= event->u.colormap.new;
737		    ev->state		= event->u.colormap.state;
738	        }
739		break;
740	      case ClientMessage:
741		{
742		   register int i;
743		   register XClientMessageEvent *ev
744		   			= (XClientMessageEvent *) re;
745		   ev->window		= sw32(event->u.clientMessage.window, sw);
746		   ev->format		= event->u.u.detail;
747		   switch (ev->format) {
748			case 8:
749			   ev->message_type = sw32(event->u.clientMessage.u.b.type, sw);
750			   for (i = 0; i < 20; i++)
751			     ev->data.b[i] = event->u.clientMessage.u.b.bytes[i];
752			   break;
753			case 16:
754			   ev->message_type = sw32(event->u.clientMessage.u.s.type, sw);
755			   ev->data.s[0] = cvtINT16toShort(sw16(event->u.clientMessage.u.s.shorts0, sw));
756			   ev->data.s[1] = cvtINT16toShort(sw16(event->u.clientMessage.u.s.shorts1, sw));
757			   ev->data.s[2] = cvtINT16toShort(sw16(event->u.clientMessage.u.s.shorts2, sw));
758			   ev->data.s[3] = cvtINT16toShort(sw16(event->u.clientMessage.u.s.shorts3, sw));
759			   ev->data.s[4] = cvtINT16toShort(sw16(event->u.clientMessage.u.s.shorts4, sw));
760			   ev->data.s[5] = cvtINT16toShort(sw16(event->u.clientMessage.u.s.shorts5, sw));
761			   ev->data.s[6] = cvtINT16toShort(sw16(event->u.clientMessage.u.s.shorts6, sw));
762			   ev->data.s[7] = cvtINT16toShort(sw16(event->u.clientMessage.u.s.shorts7, sw));
763			   ev->data.s[8] = cvtINT16toShort(sw16(event->u.clientMessage.u.s.shorts8, sw));
764			   ev->data.s[9] = cvtINT16toShort(sw16(event->u.clientMessage.u.s.shorts9, sw));
765			   break;
766			case 32:
767			   ev->message_type = sw32(event->u.clientMessage.u.l.type, sw);
768			   ev->data.l[0] = cvtINT32toLong(sw32(event->u.clientMessage.u.l.longs0, sw));
769			   ev->data.l[1] = cvtINT32toLong(sw32(event->u.clientMessage.u.l.longs1, sw));
770			   ev->data.l[2] = cvtINT32toLong(sw32(event->u.clientMessage.u.l.longs2, sw));
771			   ev->data.l[3] = cvtINT32toLong(sw32(event->u.clientMessage.u.l.longs3, sw));
772			   ev->data.l[4] = cvtINT32toLong(sw32(event->u.clientMessage.u.l.longs4, sw));
773			   break;
774			default: /* XXX should never occur */
775				break;
776		    }
777	        }
778		break;
779	      case MappingNotify:
780		{
781		   register XMappingEvent *ev = (XMappingEvent *)re;
782		   ev->window		= 0;
783		   ev->first_keycode 	= event->u.mappingNotify.firstKeyCode;
784		   ev->request 		= event->u.mappingNotify.request;
785		   ev->count 		= event->u.mappingNotify.count;
786		}
787		break;
788	      default:
789		return(False);
790	}
791	return(True);
792}
793