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