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