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