Bug Summary

File:XExtInt.c
Location:line 784, column 25
Description:Value stored to 'data' is never read

Annotated Source Code

1/************************************************************
2
3Copyright 1989, 1998 The Open Group
4
5Permission to use, copy, modify, distribute, and sell this software and its
6documentation for any purpose is hereby granted without fee, provided that
7the above copyright notice appear in all copies and that both that
8copyright notice and this permission notice appear in supporting
9documentation.
10
11The above copyright notice and this permission notice shall be included in
12all copies or substantial portions of the Software.
13
14THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
18AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
19CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20
21Except as contained in this notice, the name of The Open Group shall not be
22used in advertising or otherwise to promote the sale, use or other dealings
23in this Software without prior written authorization from The Open Group.
24
25Copyright 1989 by Hewlett-Packard Company, Palo Alto, California.
26
27 All Rights Reserved
28
29Permission to use, copy, modify, and distribute this software and its
30documentation for any purpose and without fee is hereby granted,
31provided that the above copyright notice appear in all copies and that
32both that copyright notice and this permission notice appear in
33supporting documentation, and that the name of Hewlett-Packard not be
34used in advertising or publicity pertaining to distribution of the
35software without specific, written prior permission.
36
37HEWLETT-PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
38ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
39HEWLETT-PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
40ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
41WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
42ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
43SOFTWARE.
44
45********************************************************/
46
47/***********************************************************************
48 *
49 * Input Extension library internal functions.
50 *
51 */
52
53#if HAVE_CONFIG_H1
54#include <config.h>
55#endif
56
57#include <stdio.h>
58#include <stdint.h>
59#include <X11/extensions/XI.h>
60#include <X11/extensions/XI2.h>
61#include <X11/extensions/XIproto.h>
62#include <X11/extensions/XI2proto.h>
63#include <X11/Xlibint.h>
64#include <X11/extensions/XInput.h>
65#include <X11/extensions/XInput2.h>
66#include <X11/extensions/extutil.h>
67#include <X11/extensions/geproto.h>
68#include <X11/extensions/ge.h>
69#include <X11/extensions/Xge.h>
70#include "XIint.h"
71
72#define ENQUEUE_EVENT1 True1
73#define DONT_ENQUEUE0 False0
74#define FP1616toDBL(x)((x) * 1.0 / (1 << 16)) ((x) * 1.0 / (1 << 16))
75
76int copy_classes(XIDeviceInfo *to, xXIAnyInfo* from, int *nclasses);
77int size_classes(xXIAnyInfo* from, int nclasses);
78
79static XExtensionInfo *xinput_info;
80static const char *xinput_extension_name = INAME"XInputExtension";
81
82static int XInputClose(
83 Display * /* dpy */,
84 XExtCodes * /* codes */
85);
86
87static char *XInputError(
88 Display * /* dpy */,
89 int /* code */,
90 XExtCodes * /* codes */,
91 char * /* buf */,
92 int /* n */
93);
94
95static Boolint XInputWireToEvent(
96 Display * /* dpy */,
97 XEvent * /* re */,
98 xEvent * /* event */
99);
100static Boolint XInputWireToCookie(
101 Display* /* display */,
102 XGenericEventCookie* /* re */,
103 xEvent* /* event */
104);
105
106static Boolint XInputCopyCookie(
107 Display* /* display */,
108 XGenericEventCookie* /* in */,
109 XGenericEventCookie* /* out */
110);
111
112static int
113wireToDeviceEvent(xXIDeviceEvent *in, XGenericEventCookie* out);
114static int
115wireToDeviceChangedEvent(xXIDeviceChangedEvent *in, XGenericEventCookie *cookie);
116static int
117wireToHierarchyChangedEvent(xXIHierarchyEvent *in, XGenericEventCookie *cookie);
118static int
119wireToRawEvent(XExtDisplayInfo *info, xXIRawEvent *in, XGenericEventCookie *cookie);
120static int
121wireToEnterLeave(xXIEnterEvent *in, XGenericEventCookie *cookie);
122static int
123wireToPropertyEvent(xXIPropertyEvent *in, XGenericEventCookie *cookie);
124static int
125wireToTouchOwnershipEvent(xXITouchOwnershipEvent *in,
126 XGenericEventCookie *cookie);
127static int
128wireToBarrierEvent(xXIBarrierEvent *in,
129 XGenericEventCookie *cookie);
130
131static /* const */ XEvent emptyevent;
132
133typedef Statusint (*core_event_to_wire)(Display*, XEvent*, xEvent*);
134
135static /* const */ XExtensionHooks xinput_extension_hooks = {
136 NULL((void*)0), /* create_gc */
137 NULL((void*)0), /* copy_gc */
138 NULL((void*)0), /* flush_gc */
139 NULL((void*)0), /* free_gc */
140 NULL((void*)0), /* create_font */
141 NULL((void*)0), /* free_font */
142 XInputClose, /* close_display */
143 XInputWireToEvent, /* wire_to_event */
144 (core_event_to_wire)_XiEventToWire, /* event_to_wire */
145 NULL((void*)0), /* error */
146 XInputError, /* error_string */
147};
148
149static const char *XInputErrorList[] = {
150 "BadDevice, invalid or uninitialized input device", /* BadDevice */
151 "BadEvent, invalid event type", /* BadEvent */
152 "BadMode, invalid mode parameter", /* BadMode */
153 "DeviceBusy, device is busy", /* DeviceBusy */
154 "BadClass, invalid event class", /* BadClass */
155};
156
157/* Get the version supported by the server to know which number of
158* events are support. Otherwise, a wrong number of events may smash
159* the Xlib-internal event processing vector.
160*
161* Since the extension hasn't been initialized yet, we need to
162* manually get the opcode, then the version.
163*/
164static int
165_XiFindEventsSupported(Display *dpy)
166{
167 XExtCodes codes;
168 XExtensionVersion *extversion = NULL((void*)0);
169 int nevents = 0;
170
171 if (!XQueryExtension(dpy, INAME"XInputExtension", &codes.major_opcode,
172 &codes.first_event, &codes.first_error))
173 goto out;
174
175 LockDisplay(dpy)if ((dpy)->lock_fns) (*(dpy)->lock_fns->lock_display
)(dpy)
;
176 extversion = _XiGetExtensionVersionRequest(dpy, INAME"XInputExtension", codes.major_opcode);
177 UnlockDisplay(dpy)if ((dpy)->lock_fns) (*(dpy)->lock_fns->unlock_display
)(dpy)
;
178 SyncHandle()if (dpy->synchandler) (*dpy->synchandler)(dpy);
179
180 if (!extversion || !extversion->present)
181 goto out;
182
183 if (extversion->major_version >= 2)
184 nevents = IEVENTS17; /* number is fixed, XI2 adds GenericEvents only */
185 else if (extversion->major_version <= 0)
186 {
187 printf("XInput_find_display: invalid extension version %d.%d\n",
188 extversion->major_version, extversion->minor_version);
189 goto out;
190 }
191 else
192 {
193 switch(extversion->minor_version)
194 {
195 case XI_Add_DeviceProperties_Minor5:
196 nevents = XI_DevicePropertyNotify16 + 1;
197 break;
198 case XI_Add_DevicePresenceNotify_Minor4:
199 nevents = XI_DevicePresenceNotify15 + 1;
200 break;
201 default:
202 nevents = XI_DeviceButtonstateNotify14 + 1;
203 break;
204 }
205 }
206
207out:
208 if (extversion)
209 XFree(extversion);
210 return nevents;
211}
212
213
214_X_HIDDEN__attribute__((visibility("hidden")))
215XExtDisplayInfo *XInput_find_display (Display *dpy)
216{
217 XExtDisplayInfo *dpyinfo;
218 if (!xinput_info) { if (!(xinput_info = XextCreateExtension())) return NULL((void*)0); }
219 if (!(dpyinfo = XextFindDisplay (xinput_info, dpy)))
220 {
221 int nevents = _XiFindEventsSupported(dpy);
222
223 dpyinfo = XextAddDisplay (xinput_info, dpy,
224 xinput_extension_name,
225 &xinput_extension_hooks,
226 nevents, NULL((void*)0));
227 if (dpyinfo->codes) /* NULL if XI doesn't exist on the server */
228 {
229 XESetWireToEventCookie(dpy, dpyinfo->codes->major_opcode, XInputWireToCookie);
230 XESetCopyEventCookie(dpy, dpyinfo->codes->major_opcode, XInputCopyCookie);
231 }
232 }
233 return dpyinfo;
234}
235
236static XEXT_GENERATE_ERROR_STRING(XInputError, xinput_extension_name,char *XInputError (Display *dpy, int code, XExtCodes *codes, char
*buf, int n) { code -= codes->first_error; if (code >=
0 && code < 5) { char tmp[256]; __builtin___snprintf_chk
(tmp, sizeof(tmp), 0, __builtin_object_size (tmp, 2 > 1 ?
1 : 0), "%s.%d", xinput_extension_name, code); XGetErrorDatabaseText
(dpy, "XProtoError", tmp, XInputErrorList[code], buf, n); return
buf; } return (char *)0; }
237 IERRORS, XInputErrorList)char *XInputError (Display *dpy, int code, XExtCodes *codes, char
*buf, int n) { code -= codes->first_error; if (code >=
0 && code < 5) { char tmp[256]; __builtin___snprintf_chk
(tmp, sizeof(tmp), 0, __builtin_object_size (tmp, 2 > 1 ?
1 : 0), "%s.%d", xinput_extension_name, code); XGetErrorDatabaseText
(dpy, "XProtoError", tmp, XInputErrorList[code], buf, n); return
buf; } return (char *)0; }
238/*******************************************************************
239*
240* Input extension versions.
241*
242*/
243static XExtensionVersion versions[] = { {XI_Absent0, 0, 0},
244{XI_Present1, XI_Initial_Release_Major1, XI_Initial_Release_Minor0},
245{XI_Present1, XI_Add_XDeviceBell_Major1, XI_Add_XDeviceBell_Minor1},
246{XI_Present1, XI_Add_XSetDeviceValuators_Major1,
247 XI_Add_XSetDeviceValuators_Minor2},
248{XI_Present1, XI_Add_XChangeDeviceControl_Major1,
249 XI_Add_XChangeDeviceControl_Minor3},
250{XI_Present1, XI_Add_DevicePresenceNotify_Major1,
251 XI_Add_DevicePresenceNotify_Minor4},
252{XI_Present1, XI_Add_DeviceProperties_Major1,
253 XI_Add_DeviceProperties_Minor5},
254{XI_Present1, 2, 0},
255{XI_Present1, 2, 1},
256{XI_Present1, 2, 2}
257};
258
259/***********************************************************************
260 *
261 * Return errors reported by this extension.
262 *
263 */
264
265void
266_xibaddevice(
267 Display *dpy,
268 int *error)
269{
270 XExtDisplayInfo *info = XInput_find_display(dpy);
271
272 *error = info->codes->first_error + XI_BadDevice0;
273}
274
275void
276_xibadclass(
277 Display *dpy,
278 int *error)
279{
280 XExtDisplayInfo *info = XInput_find_display(dpy);
281
282 *error = info->codes->first_error + XI_BadClass4;
283}
284
285void
286_xibadevent(
287 Display *dpy,
288 int *error)
289{
290 XExtDisplayInfo *info = XInput_find_display(dpy);
291
292 *error = info->codes->first_error + XI_BadEvent1;
293}
294
295void
296_xibadmode(
297 Display *dpy,
298 int *error)
299{
300 XExtDisplayInfo *info = XInput_find_display(dpy);
301
302 *error = info->codes->first_error + XI_BadMode2;
303}
304
305void
306_xidevicebusy(
307 Display *dpy,
308 int *error)
309{
310 XExtDisplayInfo *info = XInput_find_display(dpy);
311
312 *error = info->codes->first_error + XI_DeviceBusy3;
313}
314
315static int XInputCheckExtension(Display *dpy, XExtDisplayInfo *info)
316{
317 XextCheckExtension (dpy, info, xinput_extension_name, 0)if (!((info) && ((info)->codes))) { XMissingExtension
(dpy, xinput_extension_name); return 0; }
;
318 return 1;
319}
320
321/*****************************************************************
322 * Compare version numbers between info and the built-in version table.
323 * Returns
324 * -1 if info's version is less than version_index's version,
325 * 0 if equal (or DontCheck),
326 * 1 if info's version is greater than version_index's version.
327 * Returns -2 on initialization errors which shouldn't happen if you call it
328 * correctly.
329 */
330_X_HIDDEN__attribute__((visibility("hidden"))) int
331_XiCheckVersion(XExtDisplayInfo *info,
332 int version_index)
333{
334 XExtensionVersion *ext;
335
336 if (versions[version_index].major_version == Dont_Check0)
337 return 0;
338
339 if (!info->data)
340 return -2;
341
342 ext = ((XInputData *) info->data)->vers;
343 if (!ext)
344 return -2;
345
346 if (ext->major_version == versions[version_index].major_version &&
347 ext->minor_version == versions[version_index].minor_version)
348 return 0;
349
350 if (ext->major_version < versions[version_index].major_version ||
351 (ext->major_version == versions[version_index].major_version &&
352 ext->minor_version < versions[version_index].minor_version))
353 return -1;
354 else
355 return 1;
356}
357
358/***********************************************************************
359 *
360 * Check to see if the input extension is installed in the server.
361 * Also check to see if the version is >= the requested version.
362 *
363 */
364
365_X_HIDDEN__attribute__((visibility("hidden"))) int
366_XiCheckExtInit(
367 register Display *dpy,
368 register int version_index,
369 XExtDisplayInfo *info)
370{
371 if (!XInputCheckExtension(dpy, info)) {
372 UnlockDisplay(dpy)if ((dpy)->lock_fns) (*(dpy)->lock_fns->unlock_display
)(dpy)
;
373 return (-1);
374 }
375
376 if (info->data == NULL((void*)0)) {
377 info->data = (XPointer) Xmalloc(sizeof(XInputData))malloc(((sizeof(XInputData)) == 0 ? 1 : (sizeof(XInputData)))
)
;
378 if (!info->data) {
379 UnlockDisplay(dpy)if ((dpy)->lock_fns) (*(dpy)->lock_fns->unlock_display
)(dpy)
;
380 return (-1);
381 }
382 ((XInputData *) info->data)->vers =
383 _XiGetExtensionVersionRequest(dpy, "XInputExtension", info->codes->major_opcode);
384 }
385
386 if (_XiCheckVersion(info, version_index) < 0) {
387 UnlockDisplay(dpy)if ((dpy)->lock_fns) (*(dpy)->lock_fns->unlock_display
)(dpy)
;
388 return -1;
389 }
390
391 return (0);
392}
393
394/***********************************************************************
395 *
396 * Close display routine.
397 *
398 */
399
400static int
401XInputClose(
402 Display *dpy,
403 XExtCodes *codes)
404{
405 XExtDisplayInfo *info = XInput_find_display(dpy);
406
407 if (info->data != NULL((void*)0)) {
408 XFree((char *)((XInputData *) info->data)->vers);
409 XFree((char *)info->data);
410 }
411
412 if (!XextRemoveDisplay(xinput_info, dpy))
413 return 0;
414
415 if (xinput_info->ndisplays == 0) {
416 XextDestroyExtension(xinput_info);
417 xinput_info = NULL((void*)0);
418 }
419
420 return 1;
421}
422
423static int
424Ones(Mask mask)
425{
426 register Mask y;
427
428 y = (mask >> 1) & 033333333333;
429 y = mask - y - ((y >> 1) & 033333333333);
430 return (((y + (y >> 3)) & 030707070707) % 077);
431}
432
433static int count_bits(unsigned char* ptr, int len)
434{
435 int bits = 0;
436 unsigned int i;
437 unsigned char x;
438
439 for (i = 0; i < len; i++)
440 {
441 x = ptr[i];
442 while(x > 0)
443 {
444 bits += (x & 0x1);
445 x >>= 1;
446 }
447 }
448 return bits;
449}
450
451int
452_XiGetDevicePresenceNotifyEvent(Display * dpy)
453{
454 XExtDisplayInfo *info = XInput_find_display(dpy);
455
456 return info->codes->first_event + XI_DevicePresenceNotify15;
457}
458
459/***********************************************************************
460 *
461 * Handle Input extension events.
462 * Reformat a wire event into an XEvent structure of the right type.
463 *
464 */
465
466static Boolint
467XInputWireToEvent(
468 Display *dpy,
469 XEvent *re,
470 xEvent *event)
471{
472 unsigned int type, reltype;
473 XExtDisplayInfo *info = XInput_find_display(dpy);
474 XEvent *save = (XEvent *) info->data;
475
476 type = event->u.u.type & 0x7f;
477 reltype = (type - info->codes->first_event);
478
479 if (type == GenericEvent35 ||
480 (reltype != XI_DeviceValuator0 &&
481 reltype != XI_DeviceKeystateNotify13 &&
482 reltype != XI_DeviceButtonstateNotify14)) {
483 *save = emptyevent;
484 save->type = type;
485 ((XAnyEvent *) save)->serial = _XSetLastRequestRead(dpy,
486 (xGenericReply *)
487 event);
488 ((XAnyEvent *) save)->send_event = ((event->u.u.type & 0x80) != 0);
489 ((XAnyEvent *) save)->display = dpy;
490 }
491
492 /* Process traditional events */
493 if (type != GenericEvent35)
494 {
495 switch (reltype) {
496 case XI_DeviceMotionNotify5:
497 {
498 register XDeviceMotionEvent *ev = (XDeviceMotionEvent *) save;
499 deviceKeyButtonPointer *ev2 = (deviceKeyButtonPointer *) event;
500
501 ev->root = ev2->root;
502 ev->window = ev2->event;
503 ev->subwindow = ev2->child;
504 ev->time = ev2->time;
505 ev->x_root = ev2->root_x;
506 ev->y_root = ev2->root_y;
507 ev->x = ev2->event_x;
508 ev->y = ev2->event_y;
509 ev->state = ev2->state;
510 ev->same_screen = ev2->same_screen;
511 ev->is_hint = ev2->detail;
512 ev->deviceid = ev2->deviceid & DEVICE_BITS0x7F;
513 return (DONT_ENQUEUE0);
514 }
515 break;
516 case XI_DeviceKeyPress1:
517 case XI_DeviceKeyRelease2:
518 {
519 register XDeviceKeyEvent *ev = (XDeviceKeyEvent *) save;
520 deviceKeyButtonPointer *ev2 = (deviceKeyButtonPointer *) event;
521
522 ev->root = ev2->root;
523 ev->window = ev2->event;
524 ev->subwindow = ev2->child;
525 ev->time = ev2->time;
526 ev->x_root = ev2->root_x;
527 ev->y_root = ev2->root_y;
528 ev->x = ev2->event_x;
529 ev->y = ev2->event_y;
530 ev->state = ev2->state;
531 ev->same_screen = ev2->same_screen;
532 ev->keycode = ev2->detail;
533 ev->deviceid = ev2->deviceid & DEVICE_BITS0x7F;
534 if (ev2->deviceid & MORE_EVENTS0x80)
535 return (DONT_ENQUEUE0);
536 else {
537 *re = *save;
538 return (ENQUEUE_EVENT1);
539 }
540 }
541 break;
542 case XI_DeviceButtonPress3:
543 case XI_DeviceButtonRelease4:
544 {
545 register XDeviceButtonEvent *ev = (XDeviceButtonEvent *) save;
546 deviceKeyButtonPointer *ev2 = (deviceKeyButtonPointer *) event;
547
548 ev->root = ev2->root;
549 ev->window = ev2->event;
550 ev->subwindow = ev2->child;
551 ev->time = ev2->time;
552 ev->x_root = ev2->root_x;
553 ev->y_root = ev2->root_y;
554 ev->x = ev2->event_x;
555 ev->y = ev2->event_y;
556 ev->state = ev2->state;
557 ev->same_screen = ev2->same_screen;
558 ev->button = ev2->detail;
559 ev->deviceid = ev2->deviceid & DEVICE_BITS0x7F;
560 if (ev2->deviceid & MORE_EVENTS0x80)
561 return (DONT_ENQUEUE0);
562 else {
563 *re = *save;
564 return (ENQUEUE_EVENT1);
565 }
566 }
567 break;
568 case XI_ProximityIn8:
569 case XI_ProximityOut9:
570 {
571 register XProximityNotifyEvent *ev = (XProximityNotifyEvent *) save;
572 deviceKeyButtonPointer *ev2 = (deviceKeyButtonPointer *) event;
573
574 ev->root = ev2->root;
575 ev->window = ev2->event;
576 ev->subwindow = ev2->child;
577 ev->time = ev2->time;
578 ev->x_root = ev2->root_x;
579 ev->y_root = ev2->root_y;
580 ev->x = ev2->event_x;
581 ev->y = ev2->event_y;
582 ev->state = ev2->state;
583 ev->same_screen = ev2->same_screen;
584 ev->deviceid = ev2->deviceid & DEVICE_BITS0x7F;
585 if (ev2->deviceid & MORE_EVENTS0x80)
586 return (DONT_ENQUEUE0);
587 else {
588 *re = *save;
589 return (ENQUEUE_EVENT1);
590 }
591 }
592 break;
593 case XI_DeviceValuator0:
594 {
595 deviceValuator *xev = (deviceValuator *) event;
596 int save_type = save->type - info->codes->first_event;
597 int i;
598
599 if (save_type == XI_DeviceKeyPress1 || save_type == XI_DeviceKeyRelease2) {
600 XDeviceKeyEvent *kev = (XDeviceKeyEvent *) save;
601
602 kev->device_state = xev->device_state;
603 kev->axes_count = xev->num_valuators;
604 kev->first_axis = xev->first_valuator;
605 i = xev->num_valuators;
606 if (i > 6)
607 i = 6;
608 switch (i) {
609 case 6:
610 kev->axis_data[5] = xev->valuator5;
611 case 5:
612 kev->axis_data[4] = xev->valuator4;
613 case 4:
614 kev->axis_data[3] = xev->valuator3;
615 case 3:
616 kev->axis_data[2] = xev->valuator2;
617 case 2:
618 kev->axis_data[1] = xev->valuator1;
619 case 1:
620 kev->axis_data[0] = xev->valuator0;
621 }
622 } else if (save_type == XI_DeviceButtonPress3 ||
623 save_type == XI_DeviceButtonRelease4) {
624 XDeviceButtonEvent *bev = (XDeviceButtonEvent *) save;
625
626 bev->device_state = xev->device_state;
627 bev->axes_count = xev->num_valuators;
628 bev->first_axis = xev->first_valuator;
629 i = xev->num_valuators;
630 if (i > 6)
631 i = 6;
632 switch (i) {
633 case 6:
634 bev->axis_data[5] = xev->valuator5;
635 case 5:
636 bev->axis_data[4] = xev->valuator4;
637 case 4:
638 bev->axis_data[3] = xev->valuator3;
639 case 3:
640 bev->axis_data[2] = xev->valuator2;
641 case 2:
642 bev->axis_data[1] = xev->valuator1;
643 case 1:
644 bev->axis_data[0] = xev->valuator0;
645 }
646 } else if (save_type == XI_DeviceMotionNotify5) {
647 XDeviceMotionEvent *mev = (XDeviceMotionEvent *) save;
648
649 mev->device_state = xev->device_state;
650 mev->axes_count = xev->num_valuators;
651 mev->first_axis = xev->first_valuator;
652 i = xev->num_valuators;
653 if (i > 6)
654 i = 6;
655 switch (i) {
656 case 6:
657 mev->axis_data[5] = xev->valuator5;
658 case 5:
659 mev->axis_data[4] = xev->valuator4;
660 case 4:
661 mev->axis_data[3] = xev->valuator3;
662 case 3:
663 mev->axis_data[2] = xev->valuator2;
664 case 2:
665 mev->axis_data[1] = xev->valuator1;
666 case 1:
667 mev->axis_data[0] = xev->valuator0;
668 }
669 } else if (save_type == XI_ProximityIn8 || save_type == XI_ProximityOut9) {
670 XProximityNotifyEvent *pev = (XProximityNotifyEvent *) save;
671
672 pev->device_state = xev->device_state;
673 pev->axes_count = xev->num_valuators;
674 pev->first_axis = xev->first_valuator;
675 i = xev->num_valuators;
676 if (i > 6)
677 i = 6;
678 switch (i) {
679 case 6:
680 pev->axis_data[5] = xev->valuator5;
681 case 5:
682 pev->axis_data[4] = xev->valuator4;
683 case 4:
684 pev->axis_data[3] = xev->valuator3;
685 case 3:
686 pev->axis_data[2] = xev->valuator2;
687 case 2:
688 pev->axis_data[1] = xev->valuator1;
689 case 1:
690 pev->axis_data[0] = xev->valuator0;
691 }
692 } else if (save_type == XI_DeviceStateNotify10) {
693 int j;
694 XDeviceStateNotifyEvent *sev = (XDeviceStateNotifyEvent *) save;
695 XInputClass *any = (XInputClass *) & sev->data[0];
696 XValuatorStatus *v;
697
698 for (i = 0; i < sev->num_classes; i++)
699 if (any->class != ValuatorClass2)
700 any = (XInputClass *) ((char *)any + any->length);
701 v = (XValuatorStatus *) any;
702 i = v->num_valuators;
703 j = xev->num_valuators;
704 if (j > 3)
705 j = 3;
706 switch (j) {
707 case 3:
708 v->valuators[i + 2] = xev->valuator2;
709 case 2:
710 v->valuators[i + 1] = xev->valuator1;
711 case 1:
712 v->valuators[i + 0] = xev->valuator0;
713 }
714 v->num_valuators += j;
715
716 }
717 *re = *save;
718 return (ENQUEUE_EVENT1);
719 }
720 break;
721 case XI_DeviceFocusIn6:
722 case XI_DeviceFocusOut7:
723 {
724 register XDeviceFocusChangeEvent *ev = (XDeviceFocusChangeEvent *) re;
725 deviceFocus *fev = (deviceFocus *) event;
726
727 *ev = *((XDeviceFocusChangeEvent *) save);
728 ev->window = fev->window;
729 ev->time = fev->time;
730 ev->mode = fev->mode;
731 ev->detail = fev->detail;
732 ev->deviceid = fev->deviceid & DEVICE_BITS0x7F;
733 return (ENQUEUE_EVENT1);
734 }
735 break;
736 case XI_DeviceStateNotify10:
737 {
738 int j;
739 XDeviceStateNotifyEvent *stev = (XDeviceStateNotifyEvent *) save;
740 deviceStateNotify *sev = (deviceStateNotify *) event;
741 char *data;
742
743 stev->window = None0L;
744 stev->deviceid = sev->deviceid & DEVICE_BITS0x7F;
745 stev->time = sev->time;
746 stev->num_classes = Ones((Mask) sev->classes_reported & InputClassBits0x3F);
747 data = (char *)&stev->data[0];
748 if (sev->classes_reported & (1 << KeyClass0)) {
749 register XKeyStatus *kstev = (XKeyStatus *) data;
750
751 kstev->class = KeyClass0;
752 kstev->length = sizeof(XKeyStatus);
753 kstev->num_keys = sev->num_keys;
754 memcpy((char *)&kstev->keys[0], (char *)&sev->keys[0], 4)__builtin___memcpy_chk ((char *)&kstev->keys[0], (char
*)&sev->keys[0], 4, __builtin_object_size ((char *)&
kstev->keys[0], 0))
;
755 data += sizeof(XKeyStatus);
756 }
757 if (sev->classes_reported & (1 << ButtonClass1)) {
758 register XButtonStatus *bev = (XButtonStatus *) data;
759
760 bev->class = ButtonClass1;
761 bev->length = sizeof(XButtonStatus);
762 bev->num_buttons = sev->num_buttons;
763 memcpy((char *)bev->buttons, (char *)sev->buttons, 4)__builtin___memcpy_chk ((char *)bev->buttons, (char *)sev->
buttons, 4, __builtin_object_size ((char *)bev->buttons, 0
))
;
764 data += sizeof(XButtonStatus);
765 }
766 if (sev->classes_reported & (1 << ValuatorClass2)) {
767 register XValuatorStatus *vev = (XValuatorStatus *) data;
768
769 vev->class = ValuatorClass2;
770 vev->length = sizeof(XValuatorStatus);
771 vev->num_valuators = sev->num_valuators;
772 vev->mode = sev->classes_reported >> ModeBitsShift6;
773 j = sev->num_valuators;
774 if (j > 3)
775 j = 3;
776 switch (j) {
777 case 3:
778 vev->valuators[2] = sev->valuator2;
779 case 2:
780 vev->valuators[1] = sev->valuator1;
781 case 1:
782 vev->valuators[0] = sev->valuator0;
783 }
784 data += sizeof(XValuatorStatus);
Value stored to 'data' is never read
785 }
786 if (sev->deviceid & MORE_EVENTS0x80)
787 return (DONT_ENQUEUE0);
788 else {
789 *re = *save;
790 return (ENQUEUE_EVENT1);
791 }
792 }
793 break;
794 case XI_DeviceKeystateNotify13:
795 {
796 int i;
797 XInputClass *anyclass;
798 register XKeyStatus *kv;
799 deviceKeyStateNotify *ksev = (deviceKeyStateNotify *) event;
800 XDeviceStateNotifyEvent *kstev = (XDeviceStateNotifyEvent *) save;
801
802 anyclass = (XInputClass *) & kstev->data[0];
803 for (i = 0; i < kstev->num_classes; i++)
804 if (anyclass->class == KeyClass0)
805 break;
806 else
807 anyclass = (XInputClass *) ((char *)anyclass +
808 anyclass->length);
809
810 kv = (XKeyStatus *) anyclass;
811 kv->num_keys = 256;
812 memcpy((char *)&kv->keys[4], (char *)ksev->keys, 28)__builtin___memcpy_chk ((char *)&kv->keys[4], (char *)
ksev->keys, 28, __builtin_object_size ((char *)&kv->
keys[4], 0))
;
813 if (ksev->deviceid & MORE_EVENTS0x80)
814 return (DONT_ENQUEUE0);
815 else {
816 *re = *save;
817 return (ENQUEUE_EVENT1);
818 }
819 }
820 break;
821 case XI_DeviceButtonstateNotify14:
822 {
823 int i;
824 XInputClass *anyclass;
825 register XButtonStatus *bv;
826 deviceButtonStateNotify *bsev = (deviceButtonStateNotify *) event;
827 XDeviceStateNotifyEvent *bstev = (XDeviceStateNotifyEvent *) save;
828
829 anyclass = (XInputClass *) & bstev->data[0];
830 for (i = 0; i < bstev->num_classes; i++)
831 if (anyclass->class == ButtonClass1)
832 break;
833 else
834 anyclass = (XInputClass *) ((char *)anyclass +
835 anyclass->length);
836
837 bv = (XButtonStatus *) anyclass;
838 bv->num_buttons = 256;
839 memcpy((char *)&bv->buttons[4], (char *)bsev->buttons, 28)__builtin___memcpy_chk ((char *)&bv->buttons[4], (char
*)bsev->buttons, 28, __builtin_object_size ((char *)&
bv->buttons[4], 0))
;
840 if (bsev->deviceid & MORE_EVENTS0x80)
841 return (DONT_ENQUEUE0);
842 else {
843 *re = *save;
844 return (ENQUEUE_EVENT1);
845 }
846 }
847 break;
848 case XI_DeviceMappingNotify11:
849 {
850 register XDeviceMappingEvent *ev = (XDeviceMappingEvent *) re;
851 deviceMappingNotify *ev2 = (deviceMappingNotify *) event;
852
853 *ev = *((XDeviceMappingEvent *) save);
854 ev->window = 0;
855 ev->first_keycode = ev2->firstKeyCode;
856 ev->request = ev2->request;
857 ev->count = ev2->count;
858 ev->time = ev2->time;
859 ev->deviceid = ev2->deviceid & DEVICE_BITS0x7F;
860 return (ENQUEUE_EVENT1);
861 }
862 break;
863 case XI_ChangeDeviceNotify12:
864 {
865 register XChangeDeviceNotifyEvent *ev = (XChangeDeviceNotifyEvent *) re;
866 changeDeviceNotify *ev2 = (changeDeviceNotify *) event;
867
868 *ev = *((XChangeDeviceNotifyEvent *) save);
869 ev->window = 0;
870 ev->request = ev2->request;
871 ev->time = ev2->time;
872 ev->deviceid = ev2->deviceid & DEVICE_BITS0x7F;
873 return (ENQUEUE_EVENT1);
874 }
875 break;
876
877 case XI_DevicePresenceNotify15:
878 {
879 XDevicePresenceNotifyEvent *ev = (XDevicePresenceNotifyEvent *) re;
880 devicePresenceNotify *ev2 = (devicePresenceNotify *) event;
881
882 *ev = *(XDevicePresenceNotifyEvent *) save;
883 ev->window = 0;
884 ev->time = ev2->time;
885 ev->devchange = ev2->devchange;
886 ev->deviceid = ev2->deviceid;
887 ev->control = ev2->control;
888 return (ENQUEUE_EVENT1);
889 }
890 break;
891 case XI_DevicePropertyNotify16:
892 {
893 XDevicePropertyNotifyEvent* ev = (XDevicePropertyNotifyEvent*)re;
894 devicePropertyNotify *ev2 = (devicePropertyNotify*)event;
895
896 *ev = *(XDevicePropertyNotifyEvent*)save;
897 ev->time = ev2->time;
898 ev->deviceid = ev2->deviceid;
899 ev->atom = ev2->atom;
900 ev->state = ev2->state;
901 return ENQUEUE_EVENT1;
902 }
903 break;
904 default:
905 printf("XInputWireToEvent: UNKNOWN WIRE EVENT! type=%d\n", type);
906 break;
907 }
908 }
909 return (DONT_ENQUEUE0);
910}
911
912static void xge_copy_to_cookie(xGenericEvent* ev,
913 XGenericEventCookie *cookie)
914{
915 cookie->type = ev->type;
916 cookie->evtype = ev->evtype;
917 cookie->extension = ev->extension;
918}
919
920static Boolint
921XInputWireToCookie(
922 Display *dpy,
923 XGenericEventCookie *cookie,
924 xEvent *event)
925{
926 XExtDisplayInfo *info = XInput_find_display(dpy);
927 XEvent *save = (XEvent *) info->data;
928 xGenericEvent* ge = (xGenericEvent*)event;
929
930 if (ge->extension != info->codes->major_opcode)
931 {
932 printf("XInputWireToCookie: wrong extension opcode %d\n",
933 ge->extension);
934 return DONT_ENQUEUE0;
935 }
936
937 *save = emptyevent;
938 save->type = event->u.u.type;
939 ((XAnyEvent*)save)->serial = _XSetLastRequestRead(dpy, (xGenericReply *) event);
940 ((XAnyEvent*)save)->send_event = ((event->u.u.type & 0x80) != 0);
941 ((XAnyEvent*)save)->display = dpy;
942
943 xge_copy_to_cookie((xGenericEvent*)event, (XGenericEventCookie*)save);
944 switch(ge->evtype)
945 {
946 case XI_Motion6:
947 case XI_ButtonPress4:
948 case XI_ButtonRelease5:
949 case XI_KeyPress2:
950 case XI_KeyRelease3:
951 case XI_TouchBegin18:
952 case XI_TouchUpdate19:
953 case XI_TouchEnd20:
954 *cookie = *(XGenericEventCookie*)save;
955 if (!wireToDeviceEvent((xXIDeviceEvent*)event, cookie))
956 {
957 printf("XInputWireToCookie: CONVERSION FAILURE! evtype=%d\n",
958 ge->evtype);
959 break;
960 }
961 return ENQUEUE_EVENT1;
962 case XI_DeviceChanged1:
963 *cookie = *(XGenericEventCookie*)save;
964 if (!wireToDeviceChangedEvent((xXIDeviceChangedEvent*)event, cookie))
965 {
966 printf("XInputWireToCookie: CONVERSION FAILURE! evtype=%d\n",
967 ge->evtype);
968 break;
969 }
970 return ENQUEUE_EVENT1;
971 case XI_HierarchyChanged11:
972 *cookie = *(XGenericEventCookie*)save;
973 if (!wireToHierarchyChangedEvent((xXIHierarchyEvent*)event, cookie))
974 {
975 printf("XInputWireToCookie: CONVERSION FAILURE! evtype=%d\n",
976 ge->evtype);
977 break;
978 }
979 return ENQUEUE_EVENT1;
980 case XI_TouchOwnership21:
981 *cookie = *(XGenericEventCookie*)save;
982 if (!wireToTouchOwnershipEvent((xXITouchOwnershipEvent*)event,
983 cookie))
984 {
985 printf("XInputWireToCookie: CONVERSION FAILURE! evtype=%d\n",
986 ge->evtype);
987 break;
988 }
989 return ENQUEUE_EVENT1;
990
991 case XI_RawKeyPress13:
992 case XI_RawKeyRelease14:
993 case XI_RawButtonPress15:
994 case XI_RawButtonRelease16:
995 case XI_RawMotion17:
996 case XI_RawTouchBegin22:
997 case XI_RawTouchUpdate23:
998 case XI_RawTouchEnd24:
999 *cookie = *(XGenericEventCookie*)save;
1000 if (!wireToRawEvent(info, (xXIRawEvent*)event, cookie))
1001 {
1002 printf("XInputWireToCookie: CONVERSION FAILURE! evtype=%d\n",
1003 ge->evtype);
1004 break;
1005 }
1006 return ENQUEUE_EVENT1;
1007 case XI_Enter7:
1008 case XI_Leave8:
1009 case XI_FocusIn9:
1010 case XI_FocusOut10:
1011 *cookie = *(XGenericEventCookie*)save;
1012 if (!wireToEnterLeave((xXIEnterEvent*)event, cookie))
1013 {
1014 printf("XInputWireToCookie: CONVERSION FAILURE! evtype=%d\n",
1015 ge->evtype);
1016 break;
1017 }
1018 return ENQUEUE_EVENT1;
1019 case XI_PropertyEvent12:
1020 *cookie = *(XGenericEventCookie*)save;
1021 if (!wireToPropertyEvent((xXIPropertyEvent*)event, cookie))
1022 {
1023 printf("XInputWireToCookie: CONVERSION FAILURE! evtype=%d\n",
1024 ge->evtype);
1025 break;
1026 }
1027 return ENQUEUE_EVENT1;
1028 case XI_BarrierHit25:
1029 case XI_BarrierLeave26:
1030 *cookie = *(XGenericEventCookie*)save;
1031 if (!wireToBarrierEvent((xXIBarrierEvent*)event, cookie))
1032 {
1033 printf("XInputWireToCookie: CONVERSION FAILURE! evtype=%d\n",
1034 ge->evtype);
1035 break;
1036 }
1037 return ENQUEUE_EVENT1;
1038 default:
1039 printf("XInputWireToCookie: Unknown generic event. type %d\n", ge->evtype);
1040
1041 }
1042 return DONT_ENQUEUE0;
1043}
1044
1045/**
1046 * Calculate length in bytes needed for the device event with the given
1047 * button mask length, valuator mask length + valuator mask. All parameters
1048 * in bytes.
1049 */
1050static inline int
1051sizeDeviceEvent(int buttons_len, int valuators_len,
1052 unsigned char *valuators_mask)
1053{
1054 int len;
1055
1056 len = sizeof(XIDeviceEvent);
1057 len += sizeof(XIButtonState) + buttons_len;
1058 len += sizeof(XIValuatorState) + valuators_len;
1059 len += count_bits(valuators_mask, valuators_len) * sizeof(double);
1060 len += sizeof(XIModifierState) + sizeof(XIGroupState);
1061
1062 return len;
1063}
1064
1065/* Return the size with added padding so next element would be
1066 double-aligned unless the architecture is known to allow unaligned
1067 data accesses. Not doing this can cause a bus error on
1068 MIPS N32. */
1069static int
1070pad_to_double(int size)
1071{
1072#if !defined(__i386__) && !defined(__sh__)
1073 if (size % sizeof(double) != 0)
1074 size += sizeof(double) - size % sizeof(double);
1075#endif
1076 return size;
1077}
1078
1079/**
1080 * Set structure and atoms to size in bytes of XIButtonClassInfo, its
1081 * button state mask and labels array.
1082 */
1083static void
1084sizeXIButtonClassType(int num_buttons, int* structure, int* state, int* atoms)
1085{
1086 int size;
1087 int labels;
1088
1089 *structure = pad_to_double(sizeof(XIButtonClassInfo));
1090 size = ((((num_buttons + 7)/8) + 3)/4);
1091
1092 /* Force mask alignment with longs to avoid unaligned
1093 * access when accessing the atoms. */
1094 *state = pad_to_double(size * 4);
1095 labels = num_buttons * sizeof(Atom);
1096
1097 /* Force mask alignment with longs to avoid
1098 * unaligned access when accessing the atoms. */
1099 labels += ((((num_buttons + 7)/8) + 3)/4) * sizeof(Atom);
1100 *atoms = pad_to_double(labels);
1101}
1102
1103/**
1104 * Set structure and keycodes to size in bytes of XIKeyClassInfo and
1105 * its keycodes array.
1106 */
1107static void
1108sizeXIKeyClassType(int num_keycodes, int* structure, int* keycodes)
1109{
1110 *structure = pad_to_double(sizeof(XIKeyClassInfo));
1111 *keycodes = pad_to_double(num_keycodes * sizeof(int));
1112}
1113
1114/**
1115 * Return the size in bytes required to store the matching class type
1116 * num_elements is num_buttons for XIButtonClass or num_keycodes for
1117 * XIKeyClass.
1118 *
1119 * Also used from copy_classes in XIQueryDevice.c
1120 */
1121static int
1122sizeDeviceClassType(int type, int num_elements)
1123{
1124 int l = 0;
1125 int extra1 = 0;
1126 int extra2 = 0;
1127 switch(type)
1128 {
1129 case XIButtonClass1:
1130 sizeXIButtonClassType(num_elements, &l, &extra1, &extra2);
1131 l += extra1 + extra2;
1132 break;
1133 case XIKeyClass0:
1134 sizeXIKeyClassType(num_elements, &l, &extra1);
1135 l += extra1;
1136 break;
1137 case XIValuatorClass2:
1138 l = pad_to_double(sizeof(XIValuatorClassInfo));
1139 break;
1140 case XIScrollClass3:
1141 l = pad_to_double(sizeof(XIScrollClassInfo));
1142 break;
1143 case XITouchClass8:
1144 l = pad_to_double(sizeof(XITouchClassInfo));
1145 break;
1146 default:
1147 printf("sizeDeviceClassType: unknown type %d\n", type);
1148 break;
1149 }
1150 return l;
1151}
1152
1153static Boolint
1154copyHierarchyEvent(XGenericEventCookie *cookie_in,
1155 XGenericEventCookie *cookie_out)
1156{
1157 XIHierarchyEvent *in, *out;
1158 void *ptr;
1159
1160 in = cookie_in->data;
1161
1162 ptr = cookie_out->data = malloc(sizeof(XIHierarchyEvent) +
1163 in->num_info * sizeof(XIHierarchyInfo));
1164 if (!ptr)
1165 return False0;
1166
1167 out = next_block(&ptr, sizeof(XIHierarchyEvent));
1168 *out = *in;
1169 out->info = next_block(&ptr, in->num_info * sizeof(XIHierarchyInfo));
1170 memcpy(out->info, in->info, in->num_info * sizeof(XIHierarchyInfo))__builtin___memcpy_chk (out->info, in->info, in->num_info
* sizeof(XIHierarchyInfo), __builtin_object_size (out->info
, 0))
;
1171
1172 return True1;
1173}
1174
1175static Boolint
1176copyDeviceChangedEvent(XGenericEventCookie *in_cookie,
1177 XGenericEventCookie *out_cookie)
1178{
1179 int len, i;
1180 XIDeviceChangedEvent *in, *out;
1181 XIAnyClassInfo *any;
1182 void *ptr;
1183
1184 in = in_cookie->data;
1185
1186 len = sizeof(XIDeviceChangedEvent);
1187 len += in->num_classes * sizeof(XIAnyClassInfo*);
1188
1189 for (i = 0; i < in->num_classes; i++)
1190 {
1191 any = in->classes[i];
1192 switch(any->type)
1193 {
1194 case XIButtonClass1:
1195 len += sizeDeviceClassType(XIButtonClass1,
1196 ((XIButtonClassInfo*)any)->num_buttons);
1197 break;
1198 case XIKeyClass0:
1199 len += sizeDeviceClassType(XIKeyClass0,
1200 ((XIKeyClassInfo*)any)->num_keycodes);
1201 break;
1202 case XIValuatorClass2:
1203 len += sizeDeviceClassType(XIValuatorClass2, 0);
1204 break;
1205 case XIScrollClass3:
1206 len += sizeDeviceClassType(XIScrollClass3, 0);
1207 break;
1208 default:
1209 printf("copyDeviceChangedEvent: unknown type %d\n",
1210 any->type);
1211 break;
1212 }
1213
1214 }
1215
1216 ptr = out_cookie->data = malloc(len);
1217 if (!ptr)
1218 return False0;
1219 out = next_block(&ptr, sizeof(XIDeviceChangedEvent));
1220 *out = *in;
1221
1222 out->classes = next_block(&ptr,
1223 out->num_classes * sizeof(XIAnyClassInfo*));
1224
1225 for (i = 0; i < in->num_classes; i++)
1226 {
1227 any = in->classes[i];
1228
1229 switch(any->type)
1230 {
1231 case XIButtonClass1:
1232 {
1233 int struct_size;
1234 int state_size;
1235 int labels_size;
1236 XIButtonClassInfo *bin, *bout;
1237 bin = (XIButtonClassInfo*)any;
1238 sizeXIButtonClassType(bin->num_buttons, &struct_size,
1239 &state_size, &labels_size);
1240 bout = next_block(&ptr, struct_size);
1241
1242 *bout = *bin;
1243 bout->state.mask = next_block(&ptr, state_size);
1244 memcpy(bout->state.mask, bin->state.mask,__builtin___memcpy_chk (bout->state.mask, bin->state.mask
, bout->state.mask_len, __builtin_object_size (bout->state
.mask, 0))
1245 bout->state.mask_len)__builtin___memcpy_chk (bout->state.mask, bin->state.mask
, bout->state.mask_len, __builtin_object_size (bout->state
.mask, 0))
;
1246
1247 bout->labels = next_block(&ptr, labels_size);
1248 memcpy(bout->labels, bin->labels, bout->num_buttons * sizeof(Atom))__builtin___memcpy_chk (bout->labels, bin->labels, bout
->num_buttons * sizeof(Atom), __builtin_object_size (bout->
labels, 0))
;
1249 out->classes[i] = (XIAnyClassInfo*)bout;
1250 break;
1251 }
1252 case XIKeyClass0:
1253 {
1254 XIKeyClassInfo *kin, *kout;
1255 int struct_size;
1256 int keycodes_size;
1257 kin = (XIKeyClassInfo*)any;
1258 sizeXIKeyClassType(kin->num_keycodes, &struct_size,
1259 &keycodes_size);
1260
1261 kout = next_block(&ptr, struct_size);
1262 *kout = *kin;
1263 kout->keycodes = next_block(&ptr, keycodes_size);
1264 memcpy(kout->keycodes, kin->keycodes, kout->num_keycodes * sizeof(int))__builtin___memcpy_chk (kout->keycodes, kin->keycodes, kout
->num_keycodes * sizeof(int), __builtin_object_size (kout->
keycodes, 0))
;
1265 out->classes[i] = (XIAnyClassInfo*)kout;
1266 break;
1267 }
1268 case XIValuatorClass2:
1269 {
1270 XIValuatorClassInfo *vin, *vout;
1271 vin = (XIValuatorClassInfo*)any;
1272 vout = next_block(&ptr,
1273 sizeDeviceClassType(XIValuatorClass2, 0));
1274 *vout = *vin;
1275 out->classes[i] = (XIAnyClassInfo*)vout;
1276 break;
1277 }
1278 case XIScrollClass3:
1279 {
1280 XIScrollClassInfo *sin, *sout;
1281 sin = (XIScrollClassInfo*)any;
1282 sout = next_block(&ptr,
1283 sizeDeviceClassType(XIScrollClass3, 0));
1284 *sout = *sin;
1285 out->classes[i] = (XIAnyClassInfo*)sout;
1286 break;
1287 }
1288 }
1289 }
1290
1291 return True1;
1292}
1293
1294static Boolint
1295copyDeviceEvent(XGenericEventCookie *cookie_in,
1296 XGenericEventCookie *cookie_out)
1297{
1298 int len;
1299 XIDeviceEvent *in, *out;
1300 int bits; /* valuator bits */
1301 void *ptr;
1302
1303 in = cookie_in->data;
1304 bits = count_bits(in->valuators.mask, in->valuators.mask_len);
1305
1306 len = sizeDeviceEvent(in->buttons.mask_len, in->valuators.mask_len,
1307 in->valuators.mask);
1308
1309 ptr = cookie_out->data = malloc(len);
1310 if (!ptr)
1311 return False0;
1312
1313 out = next_block(&ptr, sizeof(XIDeviceEvent));
1314 *out = *in;
1315
1316 out->buttons.mask = next_block(&ptr, in->buttons.mask_len);
1317 memcpy(out->buttons.mask, in->buttons.mask,__builtin___memcpy_chk (out->buttons.mask, in->buttons.
mask, out->buttons.mask_len, __builtin_object_size (out->
buttons.mask, 0))
1318 out->buttons.mask_len)__builtin___memcpy_chk (out->buttons.mask, in->buttons.
mask, out->buttons.mask_len, __builtin_object_size (out->
buttons.mask, 0))
;
1319 out->valuators.mask = next_block(&ptr, in->valuators.mask_len);
1320 memcpy(out->valuators.mask, in->valuators.mask,__builtin___memcpy_chk (out->valuators.mask, in->valuators
.mask, out->valuators.mask_len, __builtin_object_size (out
->valuators.mask, 0))
1321 out->valuators.mask_len)__builtin___memcpy_chk (out->valuators.mask, in->valuators
.mask, out->valuators.mask_len, __builtin_object_size (out
->valuators.mask, 0))
;
1322 out->valuators.values = next_block(&ptr, bits * sizeof(double));
1323 memcpy(out->valuators.values, in->valuators.values,__builtin___memcpy_chk (out->valuators.values, in->valuators
.values, bits * sizeof(double), __builtin_object_size (out->
valuators.values, 0))
1324 bits * sizeof(double))__builtin___memcpy_chk (out->valuators.values, in->valuators
.values, bits * sizeof(double), __builtin_object_size (out->
valuators.values, 0))
;
1325
1326 return True1;
1327}
1328
1329static Boolint
1330copyEnterEvent(XGenericEventCookie *cookie_in,
1331 XGenericEventCookie *cookie_out)
1332{
1333 int len;
1334 XIEnterEvent *in, *out;
1335 void *ptr;
1336
1337 in = cookie_in->data;
1338
1339 len = sizeof(XIEnterEvent) + in->buttons.mask_len;
1340
1341 ptr = cookie_out->data = malloc(len);
1342 if (!ptr)
1343 return False0;
1344
1345 out = next_block(&ptr, sizeof(XIEnterEvent));
1346 *out = *in;
1347
1348 out->buttons.mask = next_block(&ptr, in->buttons.mask_len);
1349 memcpy(out->buttons.mask, in->buttons.mask, out->buttons.mask_len)__builtin___memcpy_chk (out->buttons.mask, in->buttons.
mask, out->buttons.mask_len, __builtin_object_size (out->
buttons.mask, 0))
;
1350
1351 return True1;
1352}
1353
1354static Boolint
1355copyPropertyEvent(XGenericEventCookie *cookie_in,
1356 XGenericEventCookie *cookie_out)
1357{
1358 XIPropertyEvent *in, *out;
1359
1360 in = cookie_in->data;
1361
1362 out = cookie_out->data = malloc(sizeof(XIPropertyEvent));
1363 if (!out)
1364 return False0;
1365
1366 *out = *in;
1367 return True1;
1368}
1369
1370static Boolint
1371copyTouchOwnershipEvent(XGenericEventCookie *cookie_in,
1372 XGenericEventCookie *cookie_out)
1373{
1374 XITouchOwnershipEvent *in, *out;
1375
1376 in = cookie_in->data;
1377
1378 out = cookie_out->data = malloc(sizeof(XITouchOwnershipEvent));
1379 if (!out)
1380 return False0;
1381
1382 *out = *in;
1383 return True1;
1384}
1385
1386static Boolint
1387copyRawEvent(XGenericEventCookie *cookie_in,
1388 XGenericEventCookie *cookie_out)
1389{
1390 XIRawEvent *in, *out;
1391 void *ptr;
1392 int len;
1393 int bits;
1394
1395 in = cookie_in->data;
1396
1397 bits = count_bits(in->valuators.mask, in->valuators.mask_len);
1398 len = sizeof(XIRawEvent) + in->valuators.mask_len;
1399 len += bits * sizeof(double) * 2;
1400
1401 ptr = cookie_out->data = malloc(len);
1402 if (!ptr)
1403 return False0;
1404
1405 out = next_block(&ptr, sizeof(XIRawEvent));
1406 *out = *in;
1407 out->valuators.mask = next_block(&ptr, out->valuators.mask_len);
1408 memcpy(out->valuators.mask, in->valuators.mask, out->valuators.mask_len)__builtin___memcpy_chk (out->valuators.mask, in->valuators
.mask, out->valuators.mask_len, __builtin_object_size (out
->valuators.mask, 0))
;
1409
1410 out->valuators.values = next_block(&ptr, bits * sizeof(double));
1411 memcpy(out->valuators.values, in->valuators.values, bits * sizeof(double))__builtin___memcpy_chk (out->valuators.values, in->valuators
.values, bits * sizeof(double), __builtin_object_size (out->
valuators.values, 0))
;
1412
1413 out->raw_values = next_block(&ptr, bits * sizeof(double));
1414 memcpy(out->raw_values, in->raw_values, bits * sizeof(double))__builtin___memcpy_chk (out->raw_values, in->raw_values
, bits * sizeof(double), __builtin_object_size (out->raw_values
, 0))
;
1415
1416 return True1;
1417}
1418
1419static Boolint
1420copyBarrierEvent(XGenericEventCookie *in_cookie,
1421 XGenericEventCookie *out_cookie)
1422{
1423 XIBarrierEvent *in, *out;
1424
1425 in = in_cookie->data;
1426
1427 out = out_cookie->data = calloc(1, sizeof(XIBarrierEvent));
1428 if (!out)
1429 return False0;
1430 *out = *in;
1431
1432 return True1;
1433}
1434
1435static Boolint
1436XInputCopyCookie(Display *dpy, XGenericEventCookie *in, XGenericEventCookie *out)
1437{
1438 int ret = True1;
1439
1440 XExtDisplayInfo *info = XInput_find_display(dpy);
1441
1442 if (in->extension != info->codes->major_opcode)
1443 {
1444 printf("XInputCopyCookie: wrong extension opcode %d\n",
1445 in->extension);
1446 return False0;
1447 }
1448
1449 *out = *in;
1450 out->data = NULL((void*)0);
1451 out->cookie = 0;
1452
1453 switch(in->evtype) {
1454 case XI_Motion6:
1455 case XI_ButtonPress4:
1456 case XI_ButtonRelease5:
1457 case XI_KeyPress2:
1458 case XI_KeyRelease3:
1459 case XI_TouchBegin18:
1460 case XI_TouchUpdate19:
1461 case XI_TouchEnd20:
1462 ret = copyDeviceEvent(in, out);
1463 break;
1464 case XI_DeviceChanged1:
1465 ret = copyDeviceChangedEvent(in, out);
1466 break;
1467 case XI_HierarchyChanged11:
1468 ret = copyHierarchyEvent(in, out);
1469 break;
1470 case XI_Enter7:
1471 case XI_Leave8:
1472 case XI_FocusIn9:
1473 case XI_FocusOut10:
1474 ret = copyEnterEvent(in, out);
1475 break;
1476 case XI_PropertyEvent12:
1477 ret = copyPropertyEvent(in, out);
1478 break;
1479 case XI_TouchOwnership21:
1480 ret = copyTouchOwnershipEvent(in, out);
1481 break;
1482 case XI_RawKeyPress13:
1483 case XI_RawKeyRelease14:
1484 case XI_RawButtonPress15:
1485 case XI_RawButtonRelease16:
1486 case XI_RawMotion17:
1487 case XI_RawTouchBegin22:
1488 case XI_RawTouchUpdate23:
1489 case XI_RawTouchEnd24:
1490 ret = copyRawEvent(in, out);
1491 break;
1492 case XI_BarrierHit25:
1493 case XI_BarrierLeave26:
1494 ret = copyBarrierEvent(in, out);
1495 break;
1496 default:
1497 printf("XInputCopyCookie: unknown evtype %d\n", in->evtype);
1498 ret = False0;
1499 }
1500
1501 if (!ret)
1502 printf("XInputCopyCookie: Failed to copy evtype %d", in->evtype);
1503 return ret;
1504}
1505
1506static int
1507wireToDeviceEvent(xXIDeviceEvent *in, XGenericEventCookie* cookie)
1508{
1509 int len, i;
1510 unsigned char *ptr;
1511 void *ptr_lib;
1512 FP3232 *values;
1513 XIDeviceEvent *out;
1514
1515 ptr = (unsigned char*)&in[1] + in->buttons_len * 4;
1516
1517 len = sizeDeviceEvent(in->buttons_len * 4, in->valuators_len * 4, ptr);
1518
1519 cookie->data = ptr_lib = malloc(len);
1520
1521 out = next_block(&ptr_lib, sizeof(XIDeviceEvent));
1522 out->display = cookie->display;
1523 out->type = in->type;
1524 out->serial = cookie->serial;
1525 out->extension = in->extension;
1526 out->evtype = in->evtype;
1527 out->send_event = ((in->type & 0x80) != 0);
1528 out->time = in->time;
1529 out->deviceid = in->deviceid;
1530 out->sourceid = in->sourceid;
1531 out->detail = in->detail;
1532 out->root = in->root;
1533 out->event = in->event;
1534 out->child = in->child;
1535 out->root_x = FP1616toDBL(in->root_x)((in->root_x) * 1.0 / (1 << 16));
1536 out->root_y = FP1616toDBL(in->root_y)((in->root_y) * 1.0 / (1 << 16));
1537 out->event_x = FP1616toDBL(in->event_x)((in->event_x) * 1.0 / (1 << 16));
1538 out->event_y = FP1616toDBL(in->event_y)((in->event_y) * 1.0 / (1 << 16));
1539 out->flags = in->flags;
1540 out->mods.base = in->mods.base_mods;
1541 out->mods.locked = in->mods.locked_mods;
1542 out->mods.latched = in->mods.latched_mods;
1543 out->mods.effective = in->mods.effective_mods;
1544 out->group.base = in->group.base_group;
1545 out->group.locked = in->group.locked_group;
1546 out->group.latched = in->group.latched_group;
1547 out->group.effective = in->group.effective_group;
1548 out->buttons.mask_len = in->buttons_len * 4;
1549 out->valuators.mask_len = in->valuators_len * 4;
1550
1551 out->buttons.mask = next_block(&ptr_lib, out->buttons.mask_len);
1552
1553 /* buttons */
1554 ptr = (unsigned char*)&in[1];
1555 memcpy(out->buttons.mask, ptr, out->buttons.mask_len)__builtin___memcpy_chk (out->buttons.mask, ptr, out->buttons
.mask_len, __builtin_object_size (out->buttons.mask, 0))
;
1556 ptr += in->buttons_len * 4;
1557
1558 /* valuators */
1559 out->valuators.mask = next_block(&ptr_lib, out->valuators.mask_len);
1560 memcpy(out->valuators.mask, ptr, out->valuators.mask_len)__builtin___memcpy_chk (out->valuators.mask, ptr, out->
valuators.mask_len, __builtin_object_size (out->valuators.
mask, 0))
;
1561 ptr += in->valuators_len * 4;
1562
1563 len = count_bits(out->valuators.mask, out->valuators.mask_len);
1564 out->valuators.values = next_block(&ptr_lib, len * sizeof(double));
1565
1566 values = (FP3232*)ptr;
1567 for (i = 0; i < len; i++, values++)
1568 {
1569 out->valuators.values[i] = values->integral;
1570 out->valuators.values[i] += ((double)values->frac / (1 << 16) / (1 << 16));
1571 }
1572
1573
1574 return 1;
1575}
1576
1577_X_HIDDEN__attribute__((visibility("hidden"))) int
1578size_classes(xXIAnyInfo* from, int nclasses)
1579{
1580 int len, i;
1581 xXIAnyInfo *any_wire;
1582 char *ptr_wire;
1583
1584 /* len for to->classes */
1585 len = pad_to_double(nclasses * sizeof(XIAnyClassInfo*));
1586 ptr_wire = (char*)from;
1587 for (i = 0; i < nclasses; i++)
1588 {
1589 int l = 0;
1590 any_wire = (xXIAnyInfo*)ptr_wire;
1591 switch(any_wire->type)
1592 {
1593 case XIButtonClass1:
1594 l = sizeDeviceClassType(XIButtonClass1,
1595 ((xXIButtonInfo*)any_wire)->num_buttons);
1596 break;
1597 case XIKeyClass0:
1598 l = sizeDeviceClassType(XIKeyClass0,
1599 ((xXIKeyInfo*)any_wire)->num_keycodes);
1600 break;
1601 case XIValuatorClass2:
1602 l = sizeDeviceClassType(XIValuatorClass2, 0);
1603 break;
1604 case XIScrollClass3:
1605 l = sizeDeviceClassType(XIScrollClass3, 0);
1606 break;
1607 case XITouchClass8:
1608 l = sizeDeviceClassType(XITouchClass8, 0);
1609 break;
1610 }
1611
1612 len += l;
1613 ptr_wire += any_wire->length * 4;
1614 }
1615
1616 return len;
1617}
1618
1619/* Copy classes from any into to->classes and return the number of bytes
1620 * copied. Memory layout of to->classes is
1621 * [clsptr][clsptr][clsptr][classinfo][classinfo]...
1622 * |________|___________^
1623 * |______________________^
1624 */
1625_X_HIDDEN__attribute__((visibility("hidden"))) int
1626copy_classes(XIDeviceInfo* to, xXIAnyInfo* from, int *nclasses)
1627{
1628 XIAnyClassInfo *any_lib;
1629 xXIAnyInfo *any_wire;
1630 void *ptr_lib;
1631 char *ptr_wire;
1632 int i, len;
1633 int cls_idx = 0;
1634
1635 if (!to->classes)
1636 return -1;
1637
1638 ptr_wire = (char*)from;
1639 ptr_lib = to->classes;
1640 to->classes = next_block(&ptr_lib,
1641 pad_to_double((*nclasses) * sizeof(XIAnyClassInfo*)));
1642 memset(to->classes, 0, (*nclasses) * sizeof(XIAnyClassInfo*))__builtin___memset_chk (to->classes, 0, (*nclasses) * sizeof
(XIAnyClassInfo*), __builtin_object_size (to->classes, 0))
;
1643 len = 0; /* count wire length */
1644
1645 for (i = 0; i < *nclasses; i++)
1646 {
1647 any_lib = (XIAnyClassInfo*)ptr_lib;
1648 any_wire = (xXIAnyInfo*)ptr_wire;
1649
1650 switch(any_wire->type)
1651 {
1652 case XIButtonClass1:
1653 {
1654 XIButtonClassInfo *cls_lib;
1655 xXIButtonInfo *cls_wire;
1656 uint32_t *atoms;
1657 int j;
1658 int struct_size;
1659 int state_size;
1660 int labels_size;
1661 int wire_mask_size;
1662
1663 cls_wire = (xXIButtonInfo*)any_wire;
1664 sizeXIButtonClassType(cls_wire->num_buttons,
1665 &struct_size, &state_size,
1666 &labels_size);
1667 cls_lib = next_block(&ptr_lib, struct_size);
1668 wire_mask_size = ((cls_wire->num_buttons + 7)/8 + 3)/4 * 4;
1669
1670 cls_lib->type = cls_wire->type;
1671 cls_lib->sourceid = cls_wire->sourceid;
1672 cls_lib->num_buttons = cls_wire->num_buttons;
1673 cls_lib->state.mask_len = state_size;
1674 cls_lib->state.mask = next_block(&ptr_lib, state_size);
1675 memcpy(cls_lib->state.mask, &cls_wire[1],__builtin___memcpy_chk (cls_lib->state.mask, &cls_wire
[1], wire_mask_size, __builtin_object_size (cls_lib->state
.mask, 0))
1676 wire_mask_size)__builtin___memcpy_chk (cls_lib->state.mask, &cls_wire
[1], wire_mask_size, __builtin_object_size (cls_lib->state
.mask, 0))
;
1677 if (state_size != wire_mask_size)
1678 memset(&cls_lib->state.mask[wire_mask_size], 0,__builtin___memset_chk (&cls_lib->state.mask[wire_mask_size
], 0, state_size - wire_mask_size, __builtin_object_size (&
cls_lib->state.mask[wire_mask_size], 0))
1679 state_size - wire_mask_size)__builtin___memset_chk (&cls_lib->state.mask[wire_mask_size
], 0, state_size - wire_mask_size, __builtin_object_size (&
cls_lib->state.mask[wire_mask_size], 0))
;
1680
1681 cls_lib->labels = next_block(&ptr_lib, labels_size);
1682
1683 atoms =(uint32_t*)((char*)&cls_wire[1] + wire_mask_size);
1684 for (j = 0; j < cls_lib->num_buttons; j++)
1685 cls_lib->labels[j] = *atoms++;
1686
1687 to->classes[cls_idx++] = any_lib;
1688 break;
1689 }
1690 case XIKeyClass0:
1691 {
1692 XIKeyClassInfo *cls_lib;
1693 xXIKeyInfo *cls_wire;
1694 int struct_size;
1695 int keycodes_size;
1696
1697 cls_wire = (xXIKeyInfo*)any_wire;
1698 sizeXIKeyClassType(cls_wire->num_keycodes,
1699 &struct_size, &keycodes_size);
1700 cls_lib = next_block(&ptr_lib, struct_size);
1701
1702 cls_lib->type = cls_wire->type;
1703 cls_lib->sourceid = cls_wire->sourceid;
1704 cls_lib->num_keycodes = cls_wire->num_keycodes;
1705 cls_lib->keycodes = next_block(&ptr_lib, keycodes_size);
1706 memcpy(cls_lib->keycodes, &cls_wire[1],__builtin___memcpy_chk (cls_lib->keycodes, &cls_wire[1
], cls_lib->num_keycodes, __builtin_object_size (cls_lib->
keycodes, 0))
1707 cls_lib->num_keycodes)__builtin___memcpy_chk (cls_lib->keycodes, &cls_wire[1
], cls_lib->num_keycodes, __builtin_object_size (cls_lib->
keycodes, 0))
;
1708
1709 to->classes[cls_idx++] = any_lib;
1710 break;
1711 }
1712 case XIValuatorClass2:
1713 {
1714 XIValuatorClassInfo *cls_lib;
1715 xXIValuatorInfo *cls_wire;
1716
1717 cls_lib =
1718 next_block(&ptr_lib,
1719 sizeDeviceClassType(XIValuatorClass2, 0));
1720 cls_wire = (xXIValuatorInfo*)any_wire;
1721
1722 cls_lib->type = cls_wire->type;
1723 cls_lib->sourceid = cls_wire->sourceid;
1724 cls_lib->number = cls_wire->number;
1725 cls_lib->label = cls_wire->label;
1726 cls_lib->resolution = cls_wire->resolution;
1727 cls_lib->min = cls_wire->min.integral;
1728 cls_lib->max = cls_wire->max.integral;
1729 cls_lib->value = cls_wire->value.integral;
1730 /* FIXME: fractional parts */
1731 cls_lib->mode = cls_wire->mode;
1732
1733 to->classes[cls_idx++] = any_lib;
1734 }
1735 break;
1736 case XIScrollClass3:
1737 {
1738 XIScrollClassInfo *cls_lib;
1739 xXIScrollInfo *cls_wire;
1740
1741 cls_lib =
1742 next_block(&ptr_lib,
1743 sizeDeviceClassType(XIScrollClass3, 0));
1744 cls_wire = (xXIScrollInfo*)any_wire;
1745
1746 cls_lib->type = cls_wire->type;
1747 cls_lib->sourceid = cls_wire->sourceid;
1748 cls_lib->number = cls_wire->number;
1749 cls_lib->scroll_type= cls_wire->scroll_type;
1750 cls_lib->flags = cls_wire->flags;
1751 cls_lib->increment = cls_wire->increment.integral;
1752 cls_lib->increment += (unsigned int)cls_wire->increment.frac/(double)(1ULL << 32);
1753
1754 to->classes[cls_idx++] = any_lib;
1755 }
1756 break;
1757 case XITouchClass8:
1758 {
1759 XITouchClassInfo *cls_lib;
1760 xXITouchInfo *cls_wire;
1761
1762 cls_wire = (xXITouchInfo*)any_wire;
1763 cls_lib = next_block(&ptr_lib, sizeof(XITouchClassInfo));
1764
1765 cls_lib->type = cls_wire->type;
1766 cls_lib->sourceid = cls_wire->sourceid;
1767 cls_lib->mode = cls_wire->mode;
1768 cls_lib->num_touches = cls_wire->num_touches;
1769
1770 to->classes[cls_idx++] = any_lib;
1771 }
1772 break;
1773 }
1774 len += any_wire->length * 4;
1775 ptr_wire += any_wire->length * 4;
1776 }
1777
1778 /* we may have skipped unknown classes, reset nclasses */
1779 *nclasses = cls_idx;
1780 return len;
1781}
1782
1783
1784static int
1785wireToDeviceChangedEvent(xXIDeviceChangedEvent *in, XGenericEventCookie *cookie)
1786{
1787 XIDeviceChangedEvent *out;
1788 XIDeviceInfo info;
1789 int len;
1790 int nclasses = in->num_classes;
1791
1792 len = size_classes((xXIAnyInfo*)&in[1], in->num_classes);
1793
1794 cookie->data = out = malloc(sizeof(XIDeviceChangedEvent) + len);
1795
1796 out->type = in->type;
1797 out->serial = cookie->serial;
1798 out->display = cookie->display;
1799 out->extension = in->extension;
1800 out->evtype = in->evtype;
1801 out->send_event = ((in->type & 0x80) != 0);
1802 out->time = in->time;
1803 out->deviceid = in->deviceid;
1804 out->sourceid = in->sourceid;
1805 out->reason = in->reason;
1806
1807 out->classes = (XIAnyClassInfo**)&out[1];
1808
1809 info.classes = out->classes;
1810
1811 copy_classes(&info, (xXIAnyInfo*)&in[1], &nclasses);
1812 out->num_classes = nclasses;
1813
1814 return 1;
1815}
1816
1817static int
1818wireToHierarchyChangedEvent(xXIHierarchyEvent *in, XGenericEventCookie *cookie)
1819{
1820 int i;
1821 XIHierarchyInfo *info_out;
1822 xXIHierarchyInfo *info_in;
1823 XIHierarchyEvent *out;
1824
1825 cookie->data = out = malloc(sizeof(XIHierarchyEvent) + in->num_info * sizeof(XIHierarchyInfo));;
1826
1827 out->info = (XIHierarchyInfo*)&out[1];
1828 out->display = cookie->display;
1829 out->type = in->type;
1830 out->serial = cookie->serial;
1831 out->extension = in->extension;
1832 out->evtype = in->evtype;
1833 out->send_event = ((in->type & 0x80) != 0);
1834 out->time = in->time;
1835 out->flags = in->flags;
1836 out->num_info = in->num_info;
1837
1838 info_out = out->info;
1839 info_in = (xXIHierarchyInfo*)&in[1];
1840
1841 for (i = 0; i < out->num_info; i++, info_out++, info_in++)
1842 {
1843 info_out->deviceid = info_in->deviceid;
1844 info_out->attachment = info_in->attachment;
1845 info_out->use = info_in->use;
1846 info_out->enabled = info_in->enabled;
1847 info_out->flags = info_in->flags;
1848 }
1849
1850 return 1;
1851}
1852
1853static int
1854wireToRawEvent(XExtDisplayInfo *info, xXIRawEvent *in, XGenericEventCookie *cookie)
1855{
1856 int len, i, bits;
1857 FP3232 *values;
1858 XIRawEvent *out;
1859 void *ptr;
1860
1861 len = sizeof(XIRawEvent) + in->valuators_len * 4;
1862 bits = count_bits((unsigned char*)&in[1], in->valuators_len * 4);
1863 len += bits * sizeof(double) * 2; /* raw + normal */
1864
1865 cookie->data = ptr = calloc(1, len);
1866 if (!ptr)
1867 return 0;
1868
1869 out = next_block(&ptr, sizeof(XIRawEvent));
1870 out->type = in->type;
1871 out->serial = cookie->serial;
1872 out->display = cookie->display;
1873 out->extension = in->extension;
1874 out->evtype = in->evtype;
1875 out->send_event = ((in->type & 0x80) != 0);
1876 out->time = in->time;
1877 out->detail = in->detail;
1878 out->deviceid = in->deviceid;
1879 out->flags = in->flags;
1880
1881 /* https://bugs.freedesktop.org/show_bug.cgi?id=34240 */
1882 if (_XiCheckVersion(info, XInput_2_29) >= 0)
1883 out->sourceid = in->sourceid;
1884 else
1885 out->sourceid = 0;
1886
1887 out->valuators.mask_len = in->valuators_len * 4;
1888 out->valuators.mask = next_block(&ptr, out->valuators.mask_len);
1889 memcpy(out->valuators.mask, &in[1], out->valuators.mask_len)__builtin___memcpy_chk (out->valuators.mask, &in[1], out
->valuators.mask_len, __builtin_object_size (out->valuators
.mask, 0))
;
1890
1891 out->valuators.values = next_block(&ptr, bits * sizeof(double));
1892 out->raw_values = next_block(&ptr, bits * sizeof(double));
1893
1894 values = (FP3232*)(((char*)&in[1]) + in->valuators_len * 4);
1895 for (i = 0; i < bits; i++)
1896 {
1897 out->valuators.values[i] = values->integral;
1898 out->valuators.values[i] += ((double)values->frac / (1 << 16) / (1 << 16));
1899 out->raw_values[i] = (values + bits)->integral;
1900 out->raw_values[i] += ((double)(values + bits)->frac / (1 << 16) / (1 << 16));
1901 values++;
1902 }
1903
1904 return 1;
1905}
1906
1907/* Memory layout of XIEnterEvents:
1908 [event][modifiers][group][button]
1909 */
1910static int
1911wireToEnterLeave(xXIEnterEvent *in, XGenericEventCookie *cookie)
1912{
1913 int len;
1914 XIEnterEvent *out;
1915
1916 len = sizeof(XIEnterEvent) + in->buttons_len * 4;
1917
1918 cookie->data = out = malloc(len);
1919 out->buttons.mask = (unsigned char*)&out[1];
1920
1921 out->type = in->type;
1922 out->serial = cookie->serial;
1923 out->display = cookie->display;
1924 out->extension = in->extension;
1925 out->evtype = in->evtype;
1926 out->send_event = ((in->type & 0x80) != 0);
1927 out->time = in->time;
1928 out->detail = in->detail;
1929 out->deviceid = in->deviceid;
1930 out->root = in->root;
1931 out->event = in->event;
1932 out->child = in->child;
1933 out->sourceid = in->sourceid;
1934 out->root_x = FP1616toDBL(in->root_x)((in->root_x) * 1.0 / (1 << 16));
1935 out->root_y = FP1616toDBL(in->root_y)((in->root_y) * 1.0 / (1 << 16));
1936 out->event_x = FP1616toDBL(in->event_x)((in->event_x) * 1.0 / (1 << 16));
1937 out->event_y = FP1616toDBL(in->event_y)((in->event_y) * 1.0 / (1 << 16));
1938 out->mode = in->mode;
1939 out->focus = in->focus;
1940 out->same_screen = in->same_screen;
1941
1942 out->mods.base = in->mods.base_mods;
1943 out->mods.locked = in->mods.locked_mods;
1944 out->mods.latched = in->mods.latched_mods;
1945 out->mods.effective = in->mods.effective_mods;
1946 out->group.base = in->group.base_group;
1947 out->group.locked = in->group.locked_group;
1948 out->group.latched = in->group.latched_group;
1949 out->group.effective = in->group.effective_group;
1950
1951 out->buttons.mask_len = in->buttons_len * 4;
1952 memcpy(out->buttons.mask, &in[1], out->buttons.mask_len)__builtin___memcpy_chk (out->buttons.mask, &in[1], out
->buttons.mask_len, __builtin_object_size (out->buttons
.mask, 0))
;
1953
1954 return 1;
1955}
1956
1957static int
1958wireToPropertyEvent(xXIPropertyEvent *in, XGenericEventCookie *cookie)
1959{
1960 XIPropertyEvent *out = malloc(sizeof(XIPropertyEvent));
1961
1962 cookie->data = out;
1963
1964 out->type = in->type;
1965 out->serial = cookie->serial;
1966 out->extension = in->extension;
1967 out->evtype = in->evtype;
1968 out->send_event = ((in->type & 0x80) != 0);
1969 out->time = in->time;
1970 out->property = in->property;
1971 out->what = in->what;
1972 out->deviceid = in->deviceid;
1973
1974 return 1;
1975}
1976
1977static int
1978wireToTouchOwnershipEvent(xXITouchOwnershipEvent *in,
1979 XGenericEventCookie *cookie)
1980{
1981 XITouchOwnershipEvent *out = malloc(sizeof(XITouchOwnershipEvent));
1982
1983 cookie->data = out;
1984
1985 out->type = in->type;
1986 out->serial = cookie->serial;
1987 out->display = cookie->display;
1988 out->extension = in->extension;
1989 out->evtype = in->evtype;
1990 out->send_event = ((in->type & 0x80) != 0);
1991 out->time = in->time;
1992 out->deviceid = in->deviceid;
1993 out->sourceid = in->sourceid;
1994 out->touchid = in->touchid;
1995 out->root = in->root;
1996 out->event = in->event;
1997 out->child = in->child;
1998 out->flags = in->flags;
1999
2000 return 1;
2001}
2002
2003#define FP3232_TO_DOUBLE(x)((double) (x).integral + (x).frac / (1ULL << 32)) ((double) (x).integral + (x).frac / (1ULL << 32))
2004
2005static int
2006wireToBarrierEvent(xXIBarrierEvent *in, XGenericEventCookie *cookie)
2007{
2008 XIBarrierEvent *out = malloc(sizeof(XIBarrierEvent));
2009
2010 cookie->data = out;
2011
2012 out->display = cookie->display;
2013 out->type = in->type;
2014 out->serial = cookie->serial;
2015 out->extension = in->extension;
2016 out->evtype = in->evtype;
2017 out->send_event = ((in->type & 0x80) != 0);
2018 out->time = in->time;
2019 out->deviceid = in->deviceid;
2020 out->sourceid = in->sourceid;
2021 out->event = in->event;
2022 out->root = in->root;
2023 out->root_x = FP1616toDBL(in->root_x)((in->root_x) * 1.0 / (1 << 16));
2024 out->root_y = FP1616toDBL(in->root_y)((in->root_y) * 1.0 / (1 << 16));
2025 out->dx = FP3232_TO_DOUBLE (in->dx)((double) (in->dx).integral + (in->dx).frac / (1ULL <<
32))
;
2026 out->dy = FP3232_TO_DOUBLE (in->dy)((double) (in->dy).integral + (in->dy).frac / (1ULL <<
32))
;
2027 out->dtime = in->dtime;
2028 out->flags = in->flags;
2029 out->barrier = in->barrier;
2030 out->eventid = in->eventid;
2031
2032 return 1;
2033}