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