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