extinit.c revision 1b5d61b8
105b261ecSmrg/************************************************************
205b261ecSmrg
305b261ecSmrgCopyright 1989, 1998  The Open Group
405b261ecSmrg
505b261ecSmrgPermission to use, copy, modify, distribute, and sell this software and its
605b261ecSmrgdocumentation for any purpose is hereby granted without fee, provided that
705b261ecSmrgthe above copyright notice appear in all copies and that both that
805b261ecSmrgcopyright notice and this permission notice appear in supporting
905b261ecSmrgdocumentation.
1005b261ecSmrg
1105b261ecSmrgThe above copyright notice and this permission notice shall be included in
1205b261ecSmrgall copies or substantial portions of the Software.
1305b261ecSmrg
1405b261ecSmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1505b261ecSmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1605b261ecSmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
1705b261ecSmrgOPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
1805b261ecSmrgAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
1905b261ecSmrgCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2005b261ecSmrg
2105b261ecSmrgExcept as contained in this notice, the name of The Open Group shall not be
2205b261ecSmrgused in advertising or otherwise to promote the sale, use or other dealings
2305b261ecSmrgin this Software without prior written authorization from The Open Group.
2405b261ecSmrg
2505b261ecSmrgCopyright 1989 by Hewlett-Packard Company, Palo Alto, California.
2605b261ecSmrg
2705b261ecSmrg			All Rights Reserved
2805b261ecSmrg
2905b261ecSmrgPermission to use, copy, modify, and distribute this software and its
3005b261ecSmrgdocumentation for any purpose and without fee is hereby granted,
3105b261ecSmrgprovided that the above copyright notice appear in all copies and that
3205b261ecSmrgboth that copyright notice and this permission notice appear in
3305b261ecSmrgsupporting documentation, and that the name of Hewlett-Packard not be
3405b261ecSmrgused in advertising or publicity pertaining to distribution of the
3505b261ecSmrgsoftware without specific, written prior permission.
3605b261ecSmrg
3705b261ecSmrgHEWLETT-PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
3805b261ecSmrgALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
3905b261ecSmrgHEWLETT-PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
4005b261ecSmrgANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
4105b261ecSmrgWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
4205b261ecSmrgARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
4305b261ecSmrgSOFTWARE.
4405b261ecSmrg
4505b261ecSmrg********************************************************/
4605b261ecSmrg
4705b261ecSmrg/********************************************************************
4805b261ecSmrg *
4905b261ecSmrg *  Dispatch routines and initialization routines for the X input extension.
5005b261ecSmrg *
5105b261ecSmrg */
5205b261ecSmrg#define	 NUMTYPES 15
5305b261ecSmrg
5405b261ecSmrg#ifdef HAVE_DIX_CONFIG_H
5505b261ecSmrg#include <dix-config.h>
5605b261ecSmrg#endif
5705b261ecSmrg
5805b261ecSmrg#include "inputstr.h"
5935c4bbdfSmrg#include "gcstruct.h"           /* pointer for extnsionst.h */
6035c4bbdfSmrg#include "extnsionst.h"         /* extension entry   */
6105b261ecSmrg#include <X11/extensions/XI.h>
6205b261ecSmrg#include <X11/extensions/XIproto.h>
636747b715Smrg#include <X11/extensions/XI2proto.h>
644642e01fSmrg#include <X11/extensions/geproto.h>
6535c4bbdfSmrg#include "geext.h"              /* extension interfaces for ge */
6605b261ecSmrg
6705b261ecSmrg#include "dixevents.h"
6805b261ecSmrg#include "exevents.h"
6905b261ecSmrg#include "extinit.h"
7005b261ecSmrg#include "exglobals.h"
7105b261ecSmrg#include "swaprep.h"
724642e01fSmrg#include "privates.h"
736747b715Smrg#include "protocol-versions.h"
7405b261ecSmrg
7505b261ecSmrg/* modules local to Xi */
7605b261ecSmrg#include "allowev.h"
7705b261ecSmrg#include "chgdctl.h"
7805b261ecSmrg#include "chgfctl.h"
7905b261ecSmrg#include "chgkbd.h"
8005b261ecSmrg#include "chgprop.h"
8105b261ecSmrg#include "chgptr.h"
8205b261ecSmrg#include "closedev.h"
8305b261ecSmrg#include "devbell.h"
8405b261ecSmrg#include "getbmap.h"
8505b261ecSmrg#include "getdctl.h"
8605b261ecSmrg#include "getfctl.h"
8705b261ecSmrg#include "getfocus.h"
8805b261ecSmrg#include "getkmap.h"
8905b261ecSmrg#include "getmmap.h"
9005b261ecSmrg#include "getprop.h"
9105b261ecSmrg#include "getselev.h"
9205b261ecSmrg#include "getvers.h"
9305b261ecSmrg#include "grabdev.h"
9405b261ecSmrg#include "grabdevb.h"
9505b261ecSmrg#include "grabdevk.h"
9605b261ecSmrg#include "gtmotion.h"
9705b261ecSmrg#include "listdev.h"
9805b261ecSmrg#include "opendev.h"
9905b261ecSmrg#include "queryst.h"
10005b261ecSmrg#include "selectev.h"
10105b261ecSmrg#include "sendexev.h"
10205b261ecSmrg#include "chgkmap.h"
10305b261ecSmrg#include "setbmap.h"
10405b261ecSmrg#include "setdval.h"
10505b261ecSmrg#include "setfocus.h"
10605b261ecSmrg#include "setmmap.h"
10705b261ecSmrg#include "setmode.h"
10805b261ecSmrg#include "ungrdev.h"
10905b261ecSmrg#include "ungrdevb.h"
11005b261ecSmrg#include "ungrdevk.h"
1116747b715Smrg#include "xiallowev.h"
1126747b715Smrg#include "xiselectev.h"
1136747b715Smrg#include "xigrabdev.h"
1146747b715Smrg#include "xipassivegrab.h"
1156747b715Smrg#include "xisetdevfocus.h"
1164642e01fSmrg#include "xiproperty.h"
1176747b715Smrg#include "xichangecursor.h"
1186747b715Smrg#include "xichangehierarchy.h"
1196747b715Smrg#include "xigetclientpointer.h"
1206747b715Smrg#include "xiquerydevice.h"
1216747b715Smrg#include "xiquerypointer.h"
1226747b715Smrg#include "xiqueryversion.h"
1236747b715Smrg#include "xisetclientpointer.h"
1246747b715Smrg#include "xiwarppointer.h"
12535c4bbdfSmrg#include "xibarriers.h"
1266747b715Smrg
1276747b715Smrg/* Masks for XI events have to be aligned with core event (partially anyway).
1286747b715Smrg * If DeviceButtonMotionMask is != ButtonMotionMask, event delivery
1296747b715Smrg * breaks down. The device needs the dev->button->motionMask. If DBMM is
1306747b715Smrg * the same as BMM, we can ensure that both core and device events can be
1316747b715Smrg * delivered, without the need for extra structures in the DeviceIntRec. */
13235c4bbdfSmrgconst Mask DeviceKeyPressMask = KeyPressMask;
13335c4bbdfSmrgconst Mask DeviceKeyReleaseMask = KeyReleaseMask;
13435c4bbdfSmrgconst Mask DeviceButtonPressMask = ButtonPressMask;
13535c4bbdfSmrgconst Mask DeviceButtonReleaseMask = ButtonReleaseMask;
13635c4bbdfSmrgconst Mask DeviceProximityMask = (1L << 4);
13735c4bbdfSmrgconst Mask DeviceStateNotifyMask = (1L << 5);
13835c4bbdfSmrgconst Mask DevicePointerMotionMask = PointerMotionMask;
13935c4bbdfSmrgconst Mask DevicePointerMotionHintMask = PointerMotionHintMask;
14035c4bbdfSmrgconst Mask DeviceButton1MotionMask = Button1MotionMask;
14135c4bbdfSmrgconst Mask DeviceButton2MotionMask = Button2MotionMask;
14235c4bbdfSmrgconst Mask DeviceButton3MotionMask = Button3MotionMask;
14335c4bbdfSmrgconst Mask DeviceButton4MotionMask = Button4MotionMask;
14435c4bbdfSmrgconst Mask DeviceButton5MotionMask = Button5MotionMask;
14535c4bbdfSmrgconst Mask DeviceButtonMotionMask = ButtonMotionMask;
14635c4bbdfSmrgconst Mask DeviceFocusChangeMask = (1L << 14);
14735c4bbdfSmrgconst Mask DeviceMappingNotifyMask = (1L << 15);
14835c4bbdfSmrgconst Mask ChangeDeviceNotifyMask = (1L << 16);
14935c4bbdfSmrgconst Mask DeviceButtonGrabMask = (1L << 17);
15035c4bbdfSmrgconst Mask DeviceOwnerGrabButtonMask = (1L << 17);
15135c4bbdfSmrgconst Mask DevicePresenceNotifyMask = (1L << 18);
15235c4bbdfSmrgconst Mask DevicePropertyNotifyMask = (1L << 19);
15335c4bbdfSmrgconst Mask XIAllMasks = (1L << 20) - 1;
1544642e01fSmrg
15505b261ecSmrgint ExtEventIndex;
15605b261ecSmrgMask ExtExclusiveMasks[EMASKSIZE];
15705b261ecSmrg
15835c4bbdfSmrgstatic struct dev_type {
15905b261ecSmrg    Atom type;
16035c4bbdfSmrg    const char *name;
16105b261ecSmrg} dev_type[] = {
16235c4bbdfSmrg    {0, XI_KEYBOARD},
16335c4bbdfSmrg    {0, XI_MOUSE},
16435c4bbdfSmrg    {0, XI_TABLET},
16535c4bbdfSmrg    {0, XI_TOUCHSCREEN},
16635c4bbdfSmrg    {0, XI_TOUCHPAD},
16735c4bbdfSmrg    {0, XI_BARCODE},
16835c4bbdfSmrg    {0, XI_BUTTONBOX},
16935c4bbdfSmrg    {0, XI_KNOB_BOX},
17035c4bbdfSmrg    {0, XI_ONE_KNOB},
17135c4bbdfSmrg    {0, XI_NINE_KNOB},
17235c4bbdfSmrg    {0, XI_TRACKBALL},
17335c4bbdfSmrg    {0, XI_QUADRATURE},
17435c4bbdfSmrg    {0, XI_ID_MODULE},
17535c4bbdfSmrg    {0, XI_SPACEBALL},
17635c4bbdfSmrg    {0, XI_DATAGLOVE},
17735c4bbdfSmrg    {0, XI_EYETRACKER},
17835c4bbdfSmrg    {0, XI_CURSORKEYS},
17935c4bbdfSmrg    {0, XI_FOOTMOUSE}
18035c4bbdfSmrg};
18105b261ecSmrg
18205b261ecSmrgCARD8 event_base[numInputClasses];
18305b261ecSmrgXExtEventInfo EventInfo[32];
18405b261ecSmrg
1856747b715Smrgstatic DeviceIntRec xi_all_devices;
1866747b715Smrgstatic DeviceIntRec xi_all_master_devices;
1876747b715Smrg
1884642e01fSmrg/**
1894642e01fSmrg * Dispatch vector. Functions defined in here will be called when the matching
1904642e01fSmrg * request arrives.
1914642e01fSmrg */
19235c4bbdfSmrgstatic int (*ProcIVector[]) (ClientPtr) = {
19335c4bbdfSmrg    NULL,                       /*  0 */
19435c4bbdfSmrg        ProcXGetExtensionVersion,       /*  1 */
19535c4bbdfSmrg        ProcXListInputDevices,  /*  2 */
19635c4bbdfSmrg        ProcXOpenDevice,        /*  3 */
19735c4bbdfSmrg        ProcXCloseDevice,       /*  4 */
19835c4bbdfSmrg        ProcXSetDeviceMode,     /*  5 */
19935c4bbdfSmrg        ProcXSelectExtensionEvent,      /*  6 */
20035c4bbdfSmrg        ProcXGetSelectedExtensionEvents,        /*  7 */
20135c4bbdfSmrg        ProcXChangeDeviceDontPropagateList,     /*  8 */
20235c4bbdfSmrg        ProcXGetDeviceDontPropagateList,        /*  9 */
20335c4bbdfSmrg        ProcXGetDeviceMotionEvents,     /* 10 */
20435c4bbdfSmrg        ProcXChangeKeyboardDevice,      /* 11 */
20535c4bbdfSmrg        ProcXChangePointerDevice,       /* 12 */
20635c4bbdfSmrg        ProcXGrabDevice,        /* 13 */
20735c4bbdfSmrg        ProcXUngrabDevice,      /* 14 */
20835c4bbdfSmrg        ProcXGrabDeviceKey,     /* 15 */
20935c4bbdfSmrg        ProcXUngrabDeviceKey,   /* 16 */
21035c4bbdfSmrg        ProcXGrabDeviceButton,  /* 17 */
21135c4bbdfSmrg        ProcXUngrabDeviceButton,        /* 18 */
21235c4bbdfSmrg        ProcXAllowDeviceEvents, /* 19 */
21335c4bbdfSmrg        ProcXGetDeviceFocus,    /* 20 */
21435c4bbdfSmrg        ProcXSetDeviceFocus,    /* 21 */
21535c4bbdfSmrg        ProcXGetFeedbackControl,        /* 22 */
21635c4bbdfSmrg        ProcXChangeFeedbackControl,     /* 23 */
21735c4bbdfSmrg        ProcXGetDeviceKeyMapping,       /* 24 */
21835c4bbdfSmrg        ProcXChangeDeviceKeyMapping,    /* 25 */
21935c4bbdfSmrg        ProcXGetDeviceModifierMapping,  /* 26 */
22035c4bbdfSmrg        ProcXSetDeviceModifierMapping,  /* 27 */
22135c4bbdfSmrg        ProcXGetDeviceButtonMapping,    /* 28 */
22235c4bbdfSmrg        ProcXSetDeviceButtonMapping,    /* 29 */
22335c4bbdfSmrg        ProcXQueryDeviceState,  /* 30 */
22435c4bbdfSmrg        ProcXSendExtensionEvent,        /* 31 */
22535c4bbdfSmrg        ProcXDeviceBell,        /* 32 */
22635c4bbdfSmrg        ProcXSetDeviceValuators,        /* 33 */
22735c4bbdfSmrg        ProcXGetDeviceControl,  /* 34 */
22835c4bbdfSmrg        ProcXChangeDeviceControl,       /* 35 */
2294642e01fSmrg        /* XI 1.5 */
23035c4bbdfSmrg        ProcXListDeviceProperties,      /* 36 */
23135c4bbdfSmrg        ProcXChangeDeviceProperty,      /* 37 */
23235c4bbdfSmrg        ProcXDeleteDeviceProperty,      /* 38 */
23335c4bbdfSmrg        ProcXGetDeviceProperty, /* 39 */
2346747b715Smrg        /* XI 2 */
23535c4bbdfSmrg        ProcXIQueryPointer,     /* 40 */
23635c4bbdfSmrg        ProcXIWarpPointer,      /* 41 */
23735c4bbdfSmrg        ProcXIChangeCursor,     /* 42 */
23835c4bbdfSmrg        ProcXIChangeHierarchy,  /* 43 */
23935c4bbdfSmrg        ProcXISetClientPointer, /* 44 */
24035c4bbdfSmrg        ProcXIGetClientPointer, /* 45 */
24135c4bbdfSmrg        ProcXISelectEvents,     /* 46 */
24235c4bbdfSmrg        ProcXIQueryVersion,     /* 47 */
24335c4bbdfSmrg        ProcXIQueryDevice,      /* 48 */
24435c4bbdfSmrg        ProcXISetFocus,         /* 49 */
24535c4bbdfSmrg        ProcXIGetFocus,         /* 50 */
24635c4bbdfSmrg        ProcXIGrabDevice,       /* 51 */
24735c4bbdfSmrg        ProcXIUngrabDevice,     /* 52 */
24835c4bbdfSmrg        ProcXIAllowEvents,      /* 53 */
24935c4bbdfSmrg        ProcXIPassiveGrabDevice,        /* 54 */
25035c4bbdfSmrg        ProcXIPassiveUngrabDevice,      /* 55 */
25135c4bbdfSmrg        ProcXIListProperties,   /* 56 */
25235c4bbdfSmrg        ProcXIChangeProperty,   /* 57 */
25335c4bbdfSmrg        ProcXIDeleteProperty,   /* 58 */
25435c4bbdfSmrg        ProcXIGetProperty,      /* 59 */
25535c4bbdfSmrg        ProcXIGetSelectedEvents, /* 60 */
25635c4bbdfSmrg        ProcXIBarrierReleasePointer /* 61 */
2574642e01fSmrg};
2584642e01fSmrg
2594642e01fSmrg/* For swapped clients */
26035c4bbdfSmrgstatic int (*SProcIVector[]) (ClientPtr) = {
26135c4bbdfSmrg    NULL,                       /*  0 */
26235c4bbdfSmrg        SProcXGetExtensionVersion,      /*  1 */
26335c4bbdfSmrg        SProcXListInputDevices, /*  2 */
26435c4bbdfSmrg        SProcXOpenDevice,       /*  3 */
26535c4bbdfSmrg        SProcXCloseDevice,      /*  4 */
26635c4bbdfSmrg        SProcXSetDeviceMode,    /*  5 */
26735c4bbdfSmrg        SProcXSelectExtensionEvent,     /*  6 */
26835c4bbdfSmrg        SProcXGetSelectedExtensionEvents,       /*  7 */
26935c4bbdfSmrg        SProcXChangeDeviceDontPropagateList,    /*  8 */
27035c4bbdfSmrg        SProcXGetDeviceDontPropagateList,       /*  9 */
27135c4bbdfSmrg        SProcXGetDeviceMotionEvents,    /* 10 */
27235c4bbdfSmrg        SProcXChangeKeyboardDevice,     /* 11 */
27335c4bbdfSmrg        SProcXChangePointerDevice,      /* 12 */
27435c4bbdfSmrg        SProcXGrabDevice,       /* 13 */
27535c4bbdfSmrg        SProcXUngrabDevice,     /* 14 */
27635c4bbdfSmrg        SProcXGrabDeviceKey,    /* 15 */
27735c4bbdfSmrg        SProcXUngrabDeviceKey,  /* 16 */
27835c4bbdfSmrg        SProcXGrabDeviceButton, /* 17 */
27935c4bbdfSmrg        SProcXUngrabDeviceButton,       /* 18 */
28035c4bbdfSmrg        SProcXAllowDeviceEvents,        /* 19 */
28135c4bbdfSmrg        SProcXGetDeviceFocus,   /* 20 */
28235c4bbdfSmrg        SProcXSetDeviceFocus,   /* 21 */
28335c4bbdfSmrg        SProcXGetFeedbackControl,       /* 22 */
28435c4bbdfSmrg        SProcXChangeFeedbackControl,    /* 23 */
28535c4bbdfSmrg        SProcXGetDeviceKeyMapping,      /* 24 */
28635c4bbdfSmrg        SProcXChangeDeviceKeyMapping,   /* 25 */
28735c4bbdfSmrg        SProcXGetDeviceModifierMapping, /* 26 */
28835c4bbdfSmrg        SProcXSetDeviceModifierMapping, /* 27 */
28935c4bbdfSmrg        SProcXGetDeviceButtonMapping,   /* 28 */
29035c4bbdfSmrg        SProcXSetDeviceButtonMapping,   /* 29 */
29135c4bbdfSmrg        SProcXQueryDeviceState, /* 30 */
29235c4bbdfSmrg        SProcXSendExtensionEvent,       /* 31 */
29335c4bbdfSmrg        SProcXDeviceBell,       /* 32 */
29435c4bbdfSmrg        SProcXSetDeviceValuators,       /* 33 */
29535c4bbdfSmrg        SProcXGetDeviceControl, /* 34 */
29635c4bbdfSmrg        SProcXChangeDeviceControl,      /* 35 */
29735c4bbdfSmrg        SProcXListDeviceProperties,     /* 36 */
29835c4bbdfSmrg        SProcXChangeDeviceProperty,     /* 37 */
29935c4bbdfSmrg        SProcXDeleteDeviceProperty,     /* 38 */
30035c4bbdfSmrg        SProcXGetDeviceProperty,        /* 39 */
30135c4bbdfSmrg        SProcXIQueryPointer,    /* 40 */
30235c4bbdfSmrg        SProcXIWarpPointer,     /* 41 */
30335c4bbdfSmrg        SProcXIChangeCursor,    /* 42 */
30435c4bbdfSmrg        SProcXIChangeHierarchy, /* 43 */
30535c4bbdfSmrg        SProcXISetClientPointer,        /* 44 */
30635c4bbdfSmrg        SProcXIGetClientPointer,        /* 45 */
30735c4bbdfSmrg        SProcXISelectEvents,    /* 46 */
30835c4bbdfSmrg        SProcXIQueryVersion,    /* 47 */
30935c4bbdfSmrg        SProcXIQueryDevice,     /* 48 */
31035c4bbdfSmrg        SProcXISetFocus,        /* 49 */
31135c4bbdfSmrg        SProcXIGetFocus,        /* 50 */
31235c4bbdfSmrg        SProcXIGrabDevice,      /* 51 */
31335c4bbdfSmrg        SProcXIUngrabDevice,    /* 52 */
31435c4bbdfSmrg        SProcXIAllowEvents,     /* 53 */
31535c4bbdfSmrg        SProcXIPassiveGrabDevice,       /* 54 */
31635c4bbdfSmrg        SProcXIPassiveUngrabDevice,     /* 55 */
31735c4bbdfSmrg        SProcXIListProperties,  /* 56 */
31835c4bbdfSmrg        SProcXIChangeProperty,  /* 57 */
31935c4bbdfSmrg        SProcXIDeleteProperty,  /* 58 */
32035c4bbdfSmrg        SProcXIGetProperty,     /* 59 */
32135c4bbdfSmrg        SProcXIGetSelectedEvents,       /* 60 */
32235c4bbdfSmrg        SProcXIBarrierReleasePointer /* 61 */
3234642e01fSmrg};
3244642e01fSmrg
32505b261ecSmrg/*****************************************************************
32605b261ecSmrg *
32705b261ecSmrg * Globals referenced elsewhere in the server.
32805b261ecSmrg *
32905b261ecSmrg */
33005b261ecSmrg
33105b261ecSmrgint IReqCode = 0;
3324642e01fSmrgint IEventBase = 0;
33305b261ecSmrgint BadDevice = 0;
33405b261ecSmrgstatic int BadEvent = 1;
33505b261ecSmrgint BadMode = 2;
33605b261ecSmrgint DeviceBusy = 3;
33705b261ecSmrgint BadClass = 4;
33805b261ecSmrg
33905b261ecSmrgint DeviceValuator;
34005b261ecSmrgint DeviceKeyPress;
34105b261ecSmrgint DeviceKeyRelease;
34205b261ecSmrgint DeviceButtonPress;
34305b261ecSmrgint DeviceButtonRelease;
34405b261ecSmrgint DeviceMotionNotify;
34505b261ecSmrgint DeviceFocusIn;
34605b261ecSmrgint DeviceFocusOut;
34705b261ecSmrgint ProximityIn;
34805b261ecSmrgint ProximityOut;
34905b261ecSmrgint DeviceStateNotify;
35005b261ecSmrgint DeviceKeyStateNotify;
35105b261ecSmrgint DeviceButtonStateNotify;
35205b261ecSmrgint DeviceMappingNotify;
35305b261ecSmrgint ChangeDeviceNotify;
35405b261ecSmrgint DevicePresenceNotify;
3554642e01fSmrgint DevicePropertyNotify;
35605b261ecSmrg
35735c4bbdfSmrgRESTYPE RT_INPUTCLIENT;
35805b261ecSmrg
35905b261ecSmrg/*****************************************************************
36005b261ecSmrg *
36105b261ecSmrg * Externs defined elsewhere in the X server.
36205b261ecSmrg *
36305b261ecSmrg */
36405b261ecSmrg
3656747b715Smrgextern XExtensionVersion XIVersion;
36605b261ecSmrg
36735c4bbdfSmrgMask PropagateMask[EMASKSIZE];
36805b261ecSmrg
36905b261ecSmrg/*****************************************************************
37005b261ecSmrg *
3714642e01fSmrg * Versioning support
37205b261ecSmrg *
37305b261ecSmrg */
37405b261ecSmrg
3756747b715SmrgDevPrivateKeyRec XIClientPrivateKeyRec;
3764642e01fSmrg
3774642e01fSmrg/*****************************************************************
3784642e01fSmrg *
3794642e01fSmrg * Declarations of local routines.
3804642e01fSmrg *
3814642e01fSmrg */
3824642e01fSmrg
38305b261ecSmrg/*************************************************************************
38405b261ecSmrg *
38505b261ecSmrg * ProcIDispatch - main dispatch routine for requests to this extension.
38605b261ecSmrg * This routine is used if server and client have the same byte ordering.
38705b261ecSmrg *
38805b261ecSmrg */
38905b261ecSmrg
39005b261ecSmrgstatic int
39105b261ecSmrgProcIDispatch(ClientPtr client)
39205b261ecSmrg{
39305b261ecSmrg    REQUEST(xReq);
394475c125cSmrg    if (stuff->data >= ARRAY_SIZE(ProcIVector) || !ProcIVector[stuff->data])
3954642e01fSmrg        return BadRequest;
3964642e01fSmrg
3971b5d61b8Smrg    UpdateCurrentTimeIf();
39835c4bbdfSmrg    return (*ProcIVector[stuff->data]) (client);
39905b261ecSmrg}
40005b261ecSmrg
40105b261ecSmrg/*******************************************************************************
40205b261ecSmrg *
4034642e01fSmrg * SProcXDispatch
40405b261ecSmrg *
40505b261ecSmrg * Main swapped dispatch routine for requests to this extension.
40605b261ecSmrg * This routine is used if server and client do not have the same byte ordering.
40705b261ecSmrg *
40805b261ecSmrg */
40905b261ecSmrg
4101b5d61b8Smrgstatic int _X_COLD
41105b261ecSmrgSProcIDispatch(ClientPtr client)
41205b261ecSmrg{
41305b261ecSmrg    REQUEST(xReq);
414475c125cSmrg    if (stuff->data >= ARRAY_SIZE(SProcIVector) || !SProcIVector[stuff->data])
4154642e01fSmrg        return BadRequest;
4164642e01fSmrg
4171b5d61b8Smrg    UpdateCurrentTimeIf();
41835c4bbdfSmrg    return (*SProcIVector[stuff->data]) (client);
41905b261ecSmrg}
42005b261ecSmrg
42105b261ecSmrg/**********************************************************************
42205b261ecSmrg *
42305b261ecSmrg * SReplyIDispatch
42405b261ecSmrg * Swap any replies defined in this extension.
42505b261ecSmrg *
42605b261ecSmrg */
42705b261ecSmrg
4281b5d61b8Smrgstatic void _X_COLD
42905b261ecSmrgSReplyIDispatch(ClientPtr client, int len, xGrabDeviceReply * rep)
43035c4bbdfSmrg{
43135c4bbdfSmrg    /* All we look at is the type field */
43235c4bbdfSmrg    /* This is common to all replies    */
43305b261ecSmrg    if (rep->RepType == X_GetExtensionVersion)
43435c4bbdfSmrg        SRepXGetExtensionVersion(client, len,
43535c4bbdfSmrg                                 (xGetExtensionVersionReply *) rep);
43605b261ecSmrg    else if (rep->RepType == X_ListInputDevices)
43735c4bbdfSmrg        SRepXListInputDevices(client, len, (xListInputDevicesReply *) rep);
43805b261ecSmrg    else if (rep->RepType == X_OpenDevice)
43935c4bbdfSmrg        SRepXOpenDevice(client, len, (xOpenDeviceReply *) rep);
44005b261ecSmrg    else if (rep->RepType == X_SetDeviceMode)
44135c4bbdfSmrg        SRepXSetDeviceMode(client, len, (xSetDeviceModeReply *) rep);
44205b261ecSmrg    else if (rep->RepType == X_GetSelectedExtensionEvents)
44335c4bbdfSmrg        SRepXGetSelectedExtensionEvents(client, len,
44435c4bbdfSmrg                                        (xGetSelectedExtensionEventsReply *)
44535c4bbdfSmrg                                        rep);
44605b261ecSmrg    else if (rep->RepType == X_GetDeviceDontPropagateList)
44735c4bbdfSmrg        SRepXGetDeviceDontPropagateList(client, len,
44835c4bbdfSmrg                                        (xGetDeviceDontPropagateListReply *)
44935c4bbdfSmrg                                        rep);
45005b261ecSmrg    else if (rep->RepType == X_GetDeviceMotionEvents)
45135c4bbdfSmrg        SRepXGetDeviceMotionEvents(client, len,
45235c4bbdfSmrg                                   (xGetDeviceMotionEventsReply *) rep);
45305b261ecSmrg    else if (rep->RepType == X_GrabDevice)
45435c4bbdfSmrg        SRepXGrabDevice(client, len, (xGrabDeviceReply *) rep);
45505b261ecSmrg    else if (rep->RepType == X_GetDeviceFocus)
45635c4bbdfSmrg        SRepXGetDeviceFocus(client, len, (xGetDeviceFocusReply *) rep);
45705b261ecSmrg    else if (rep->RepType == X_GetFeedbackControl)
45835c4bbdfSmrg        SRepXGetFeedbackControl(client, len, (xGetFeedbackControlReply *) rep);
45905b261ecSmrg    else if (rep->RepType == X_GetDeviceKeyMapping)
46035c4bbdfSmrg        SRepXGetDeviceKeyMapping(client, len,
46135c4bbdfSmrg                                 (xGetDeviceKeyMappingReply *) rep);
46205b261ecSmrg    else if (rep->RepType == X_GetDeviceModifierMapping)
46335c4bbdfSmrg        SRepXGetDeviceModifierMapping(client, len,
46435c4bbdfSmrg                                      (xGetDeviceModifierMappingReply *) rep);
46505b261ecSmrg    else if (rep->RepType == X_SetDeviceModifierMapping)
46635c4bbdfSmrg        SRepXSetDeviceModifierMapping(client, len,
46735c4bbdfSmrg                                      (xSetDeviceModifierMappingReply *) rep);
46805b261ecSmrg    else if (rep->RepType == X_GetDeviceButtonMapping)
46935c4bbdfSmrg        SRepXGetDeviceButtonMapping(client, len,
47035c4bbdfSmrg                                    (xGetDeviceButtonMappingReply *) rep);
47105b261ecSmrg    else if (rep->RepType == X_SetDeviceButtonMapping)
47235c4bbdfSmrg        SRepXSetDeviceButtonMapping(client, len,
47335c4bbdfSmrg                                    (xSetDeviceButtonMappingReply *) rep);
47405b261ecSmrg    else if (rep->RepType == X_QueryDeviceState)
47535c4bbdfSmrg        SRepXQueryDeviceState(client, len, (xQueryDeviceStateReply *) rep);
47605b261ecSmrg    else if (rep->RepType == X_SetDeviceValuators)
47735c4bbdfSmrg        SRepXSetDeviceValuators(client, len, (xSetDeviceValuatorsReply *) rep);
47805b261ecSmrg    else if (rep->RepType == X_GetDeviceControl)
47935c4bbdfSmrg        SRepXGetDeviceControl(client, len, (xGetDeviceControlReply *) rep);
48005b261ecSmrg    else if (rep->RepType == X_ChangeDeviceControl)
48135c4bbdfSmrg        SRepXChangeDeviceControl(client, len,
48235c4bbdfSmrg                                 (xChangeDeviceControlReply *) rep);
4834642e01fSmrg    else if (rep->RepType == X_ListDeviceProperties)
48435c4bbdfSmrg        SRepXListDeviceProperties(client, len,
48535c4bbdfSmrg                                  (xListDevicePropertiesReply *) rep);
4864642e01fSmrg    else if (rep->RepType == X_GetDeviceProperty)
48735c4bbdfSmrg        SRepXGetDeviceProperty(client, len, (xGetDevicePropertyReply *) rep);
4886747b715Smrg    else if (rep->RepType == X_XIQueryPointer)
48935c4bbdfSmrg        SRepXIQueryPointer(client, len, (xXIQueryPointerReply *) rep);
4906747b715Smrg    else if (rep->RepType == X_XIGetClientPointer)
49135c4bbdfSmrg        SRepXIGetClientPointer(client, len, (xXIGetClientPointerReply *) rep);
4926747b715Smrg    else if (rep->RepType == X_XIQueryVersion)
49335c4bbdfSmrg        SRepXIQueryVersion(client, len, (xXIQueryVersionReply *) rep);
4946747b715Smrg    else if (rep->RepType == X_XIQueryDevice)
49535c4bbdfSmrg        SRepXIQueryDevice(client, len, (xXIQueryDeviceReply *) rep);
4966747b715Smrg    else if (rep->RepType == X_XIGrabDevice)
49735c4bbdfSmrg        SRepXIGrabDevice(client, len, (xXIGrabDeviceReply *) rep);
4989ace9065Smrg    else if (rep->RepType == X_XIPassiveGrabDevice)
49935c4bbdfSmrg        SRepXIPassiveGrabDevice(client, len, (xXIPassiveGrabDeviceReply *) rep);
5006747b715Smrg    else if (rep->RepType == X_XIListProperties)
50135c4bbdfSmrg        SRepXIListProperties(client, len, (xXIListPropertiesReply *) rep);
5026747b715Smrg    else if (rep->RepType == X_XIGetProperty)
50335c4bbdfSmrg        SRepXIGetProperty(client, len, (xXIGetPropertyReply *) rep);
5046747b715Smrg    else if (rep->RepType == X_XIGetSelectedEvents)
50535c4bbdfSmrg        SRepXIGetSelectedEvents(client, len, (xXIGetSelectedEventsReply *) rep);
5066747b715Smrg    else if (rep->RepType == X_XIGetFocus)
50735c4bbdfSmrg        SRepXIGetFocus(client, len, (xXIGetFocusReply *) rep);
50805b261ecSmrg    else {
50935c4bbdfSmrg        FatalError("XINPUT confused sending swapped reply");
51005b261ecSmrg    }
51105b261ecSmrg}
51205b261ecSmrg
51305b261ecSmrg/************************************************************************
51405b261ecSmrg *
51505b261ecSmrg * This function swaps the DeviceValuator event.
51605b261ecSmrg *
51705b261ecSmrg */
51805b261ecSmrg
51905b261ecSmrgstatic void
52005b261ecSmrgSEventDeviceValuator(deviceValuator * from, deviceValuator * to)
52105b261ecSmrg{
52205b261ecSmrg    int i;
52305b261ecSmrg    INT32 *ip B32;
52405b261ecSmrg
52505b261ecSmrg    *to = *from;
52635c4bbdfSmrg    swaps(&to->sequenceNumber);
52735c4bbdfSmrg    swaps(&to->device_state);
52805b261ecSmrg    ip = &to->valuator0;
52905b261ecSmrg    for (i = 0; i < 6; i++) {
53035c4bbdfSmrg        swapl(ip + i);
53105b261ecSmrg    }
53205b261ecSmrg}
53305b261ecSmrg
53405b261ecSmrgstatic void
53505b261ecSmrgSEventFocus(deviceFocus * from, deviceFocus * to)
53605b261ecSmrg{
53705b261ecSmrg    *to = *from;
53835c4bbdfSmrg    swaps(&to->sequenceNumber);
53935c4bbdfSmrg    swapl(&to->time);
54035c4bbdfSmrg    swapl(&to->window);
54105b261ecSmrg}
54205b261ecSmrg
54305b261ecSmrgstatic void
54405b261ecSmrgSDeviceStateNotifyEvent(deviceStateNotify * from, deviceStateNotify * to)
54505b261ecSmrg{
54605b261ecSmrg    int i;
54705b261ecSmrg    INT32 *ip B32;
54805b261ecSmrg
54905b261ecSmrg    *to = *from;
55035c4bbdfSmrg    swaps(&to->sequenceNumber);
55135c4bbdfSmrg    swapl(&to->time);
55205b261ecSmrg    ip = &to->valuator0;
55305b261ecSmrg    for (i = 0; i < 3; i++) {
55435c4bbdfSmrg        swapl(ip + i);
55505b261ecSmrg    }
55605b261ecSmrg}
55705b261ecSmrg
55805b261ecSmrgstatic void
55905b261ecSmrgSDeviceKeyStateNotifyEvent(deviceKeyStateNotify * from,
56035c4bbdfSmrg                           deviceKeyStateNotify * to)
56105b261ecSmrg{
56205b261ecSmrg    *to = *from;
56335c4bbdfSmrg    swaps(&to->sequenceNumber);
56405b261ecSmrg}
56505b261ecSmrg
56605b261ecSmrgstatic void
56705b261ecSmrgSDeviceButtonStateNotifyEvent(deviceButtonStateNotify * from,
56835c4bbdfSmrg                              deviceButtonStateNotify * to)
56905b261ecSmrg{
57005b261ecSmrg    *to = *from;
57135c4bbdfSmrg    swaps(&to->sequenceNumber);
57205b261ecSmrg}
57305b261ecSmrg
57405b261ecSmrgstatic void
57505b261ecSmrgSChangeDeviceNotifyEvent(changeDeviceNotify * from, changeDeviceNotify * to)
57605b261ecSmrg{
57705b261ecSmrg    *to = *from;
57835c4bbdfSmrg    swaps(&to->sequenceNumber);
57935c4bbdfSmrg    swapl(&to->time);
58005b261ecSmrg}
58105b261ecSmrg
58205b261ecSmrgstatic void
58305b261ecSmrgSDeviceMappingNotifyEvent(deviceMappingNotify * from, deviceMappingNotify * to)
58405b261ecSmrg{
58505b261ecSmrg    *to = *from;
58635c4bbdfSmrg    swaps(&to->sequenceNumber);
58735c4bbdfSmrg    swapl(&to->time);
58805b261ecSmrg}
58905b261ecSmrg
59005b261ecSmrgstatic void
59135c4bbdfSmrgSDevicePresenceNotifyEvent(devicePresenceNotify * from,
59235c4bbdfSmrg                           devicePresenceNotify * to)
59305b261ecSmrg{
59405b261ecSmrg    *to = *from;
59535c4bbdfSmrg    swaps(&to->sequenceNumber);
59635c4bbdfSmrg    swapl(&to->time);
59735c4bbdfSmrg    swaps(&to->control);
59805b261ecSmrg}
59905b261ecSmrg
6004642e01fSmrgstatic void
60135c4bbdfSmrgSDevicePropertyNotifyEvent(devicePropertyNotify * from,
60235c4bbdfSmrg                           devicePropertyNotify * to)
6034642e01fSmrg{
6044642e01fSmrg    *to = *from;
60535c4bbdfSmrg    swaps(&to->sequenceNumber);
60635c4bbdfSmrg    swapl(&to->time);
60735c4bbdfSmrg    swapl(&to->atom);
6084642e01fSmrg}
6094642e01fSmrg
6106747b715Smrgstatic void
61135c4bbdfSmrgSDeviceLeaveNotifyEvent(xXILeaveEvent * from, xXILeaveEvent * to)
6126747b715Smrg{
6136747b715Smrg    *to = *from;
61435c4bbdfSmrg    swaps(&to->sequenceNumber);
61535c4bbdfSmrg    swapl(&to->length);
61635c4bbdfSmrg    swaps(&to->evtype);
61735c4bbdfSmrg    swaps(&to->deviceid);
61835c4bbdfSmrg    swapl(&to->time);
61935c4bbdfSmrg    swapl(&to->root);
62035c4bbdfSmrg    swapl(&to->event);
62135c4bbdfSmrg    swapl(&to->child);
62235c4bbdfSmrg    swapl(&to->root_x);
62335c4bbdfSmrg    swapl(&to->root_y);
62435c4bbdfSmrg    swapl(&to->event_x);
62535c4bbdfSmrg    swapl(&to->event_y);
62635c4bbdfSmrg    swaps(&to->sourceid);
62735c4bbdfSmrg    swaps(&to->buttons_len);
62835c4bbdfSmrg    swapl(&to->mods.base_mods);
62935c4bbdfSmrg    swapl(&to->mods.latched_mods);
63035c4bbdfSmrg    swapl(&to->mods.locked_mods);
6316747b715Smrg}
63205b261ecSmrg
63305b261ecSmrgstatic void
63435c4bbdfSmrgSDeviceChangedEvent(xXIDeviceChangedEvent * from, xXIDeviceChangedEvent * to)
6356747b715Smrg{
6366747b715Smrg    int i, j;
6376747b715Smrg    xXIAnyInfo *any;
6386747b715Smrg
6396747b715Smrg    *to = *from;
6406747b715Smrg    memcpy(&to[1], &from[1], from->length * 4);
6416747b715Smrg
64235c4bbdfSmrg    any = (xXIAnyInfo *) &to[1];
64335c4bbdfSmrg    for (i = 0; i < to->num_classes; i++) {
6446747b715Smrg        int length = any->length;
6456747b715Smrg
64635c4bbdfSmrg        switch (any->type) {
64735c4bbdfSmrg        case KeyClass:
6486747b715Smrg        {
64935c4bbdfSmrg            xXIKeyInfo *ki = (xXIKeyInfo *) any;
65035c4bbdfSmrg            uint32_t *key = (uint32_t *) &ki[1];
65135c4bbdfSmrg
65235c4bbdfSmrg            for (j = 0; j < ki->num_keycodes; j++, key++)
65335c4bbdfSmrg                swapl(key);
65435c4bbdfSmrg            swaps(&ki->num_keycodes);
65535c4bbdfSmrg        }
65635c4bbdfSmrg            break;
65735c4bbdfSmrg        case ButtonClass:
65835c4bbdfSmrg        {
65935c4bbdfSmrg            xXIButtonInfo *bi = (xXIButtonInfo *) any;
66035c4bbdfSmrg            Atom *labels = (Atom *) ((char *) bi + sizeof(xXIButtonInfo) +
66135c4bbdfSmrg                                     pad_to_int32(bits_to_bytes
66235c4bbdfSmrg                                                  (bi->num_buttons)));
66335c4bbdfSmrg            for (j = 0; j < bi->num_buttons; j++)
66435c4bbdfSmrg                swapl(&labels[j]);
66535c4bbdfSmrg            swaps(&bi->num_buttons);
66635c4bbdfSmrg        }
66735c4bbdfSmrg            break;
66835c4bbdfSmrg        case ValuatorClass:
66935c4bbdfSmrg        {
67035c4bbdfSmrg            xXIValuatorInfo *ai = (xXIValuatorInfo *) any;
67135c4bbdfSmrg
67235c4bbdfSmrg            swapl(&ai->label);
67335c4bbdfSmrg            swapl(&ai->min.integral);
67435c4bbdfSmrg            swapl(&ai->min.frac);
67535c4bbdfSmrg            swapl(&ai->max.integral);
67635c4bbdfSmrg            swapl(&ai->max.frac);
67735c4bbdfSmrg            swapl(&ai->resolution);
67835c4bbdfSmrg            swaps(&ai->number);
67935c4bbdfSmrg        }
68035c4bbdfSmrg            break;
6816747b715Smrg        }
6826747b715Smrg
68335c4bbdfSmrg        swaps(&any->type);
68435c4bbdfSmrg        swaps(&any->length);
68535c4bbdfSmrg        swaps(&any->sourceid);
6866747b715Smrg
68735c4bbdfSmrg        any = (xXIAnyInfo *) ((char *) any + length * 4);
6886747b715Smrg    }
6896747b715Smrg
69035c4bbdfSmrg    swaps(&to->sequenceNumber);
69135c4bbdfSmrg    swapl(&to->length);
69235c4bbdfSmrg    swaps(&to->evtype);
69335c4bbdfSmrg    swaps(&to->deviceid);
69435c4bbdfSmrg    swapl(&to->time);
69535c4bbdfSmrg    swaps(&to->num_classes);
69635c4bbdfSmrg    swaps(&to->sourceid);
6976747b715Smrg
6986747b715Smrg}
6996747b715Smrg
70035c4bbdfSmrgstatic void
70135c4bbdfSmrgSDeviceEvent(xXIDeviceEvent * from, xXIDeviceEvent * to)
70205b261ecSmrg{
70305b261ecSmrg    int i;
7046747b715Smrg    char *ptr;
7056747b715Smrg    char *vmask;
70605b261ecSmrg
7076747b715Smrg    memcpy(to, from, sizeof(xEvent) + from->length * 4);
7086747b715Smrg
70935c4bbdfSmrg    swaps(&to->sequenceNumber);
71035c4bbdfSmrg    swapl(&to->length);
71135c4bbdfSmrg    swaps(&to->evtype);
71235c4bbdfSmrg    swaps(&to->deviceid);
71335c4bbdfSmrg    swapl(&to->time);
71435c4bbdfSmrg    swapl(&to->detail);
71535c4bbdfSmrg    swapl(&to->root);
71635c4bbdfSmrg    swapl(&to->event);
71735c4bbdfSmrg    swapl(&to->child);
71835c4bbdfSmrg    swapl(&to->root_x);
71935c4bbdfSmrg    swapl(&to->root_y);
72035c4bbdfSmrg    swapl(&to->event_x);
72135c4bbdfSmrg    swapl(&to->event_y);
72235c4bbdfSmrg    swaps(&to->buttons_len);
72335c4bbdfSmrg    swaps(&to->valuators_len);
72435c4bbdfSmrg    swaps(&to->sourceid);
72535c4bbdfSmrg    swapl(&to->mods.base_mods);
72635c4bbdfSmrg    swapl(&to->mods.latched_mods);
72735c4bbdfSmrg    swapl(&to->mods.locked_mods);
72835c4bbdfSmrg    swapl(&to->mods.effective_mods);
72935c4bbdfSmrg    swapl(&to->flags);
73035c4bbdfSmrg
73135c4bbdfSmrg    ptr = (char *) (&to[1]);
7326747b715Smrg    ptr += from->buttons_len * 4;
73335c4bbdfSmrg    vmask = ptr;                /* valuator mask */
7346747b715Smrg    ptr += from->valuators_len * 4;
73535c4bbdfSmrg    for (i = 0; i < from->valuators_len * 32; i++) {
73635c4bbdfSmrg        if (BitIsOn(vmask, i)) {
73735c4bbdfSmrg            swapl(((uint32_t *) ptr));
7386747b715Smrg            ptr += 4;
73935c4bbdfSmrg            swapl(((uint32_t *) ptr));
7406747b715Smrg            ptr += 4;
7416747b715Smrg        }
7426747b715Smrg    }
7436747b715Smrg}
7446747b715Smrg
74535c4bbdfSmrgstatic void
74635c4bbdfSmrgSDeviceHierarchyEvent(xXIHierarchyEvent * from, xXIHierarchyEvent * to)
7476747b715Smrg{
7486747b715Smrg    int i;
7496747b715Smrg    xXIHierarchyInfo *info;
7506747b715Smrg
7516747b715Smrg    *to = *from;
7526747b715Smrg    memcpy(&to[1], &from[1], from->length * 4);
75335c4bbdfSmrg    swaps(&to->sequenceNumber);
75435c4bbdfSmrg    swapl(&to->length);
75535c4bbdfSmrg    swaps(&to->evtype);
75635c4bbdfSmrg    swaps(&to->deviceid);
75735c4bbdfSmrg    swapl(&to->time);
75835c4bbdfSmrg    swapl(&to->flags);
75935c4bbdfSmrg    swaps(&to->num_info);
76035c4bbdfSmrg
76135c4bbdfSmrg    info = (xXIHierarchyInfo *) &to[1];
76235c4bbdfSmrg    for (i = 0; i < from->num_info; i++) {
76335c4bbdfSmrg        swaps(&info->deviceid);
76435c4bbdfSmrg        swaps(&info->attachment);
7656747b715Smrg        info++;
7666747b715Smrg    }
7676747b715Smrg}
7686747b715Smrg
76935c4bbdfSmrgstatic void
77035c4bbdfSmrgSXIPropertyEvent(xXIPropertyEvent * from, xXIPropertyEvent * to)
7716747b715Smrg{
7726747b715Smrg    *to = *from;
77335c4bbdfSmrg    swaps(&to->sequenceNumber);
77435c4bbdfSmrg    swapl(&to->length);
77535c4bbdfSmrg    swaps(&to->evtype);
77635c4bbdfSmrg    swaps(&to->deviceid);
77735c4bbdfSmrg    swapl(&to->property);
7786747b715Smrg}
7796747b715Smrg
78035c4bbdfSmrgstatic void
78135c4bbdfSmrgSRawEvent(xXIRawEvent * from, xXIRawEvent * to)
7826747b715Smrg{
7836747b715Smrg    int i;
7846747b715Smrg    FP3232 *values;
7856747b715Smrg    unsigned char *mask;
7866747b715Smrg
7876747b715Smrg    memcpy(to, from, sizeof(xEvent) + from->length * 4);
7886747b715Smrg
78935c4bbdfSmrg    swaps(&to->sequenceNumber);
79035c4bbdfSmrg    swapl(&to->length);
79135c4bbdfSmrg    swaps(&to->evtype);
79235c4bbdfSmrg    swaps(&to->deviceid);
79335c4bbdfSmrg    swapl(&to->time);
79435c4bbdfSmrg    swapl(&to->detail);
7956747b715Smrg
79635c4bbdfSmrg    mask = (unsigned char *) &to[1];
79735c4bbdfSmrg    values = (FP3232 *) (mask + from->valuators_len * 4);
7986747b715Smrg
79935c4bbdfSmrg    for (i = 0; i < from->valuators_len * 4 * 8; i++) {
80035c4bbdfSmrg        if (BitIsOn(mask, i)) {
8016747b715Smrg            /* for each bit set there are two FP3232 values on the wire, in
8026747b715Smrg             * the order abcABC for data and data_raw. Here we swap as if
8036747b715Smrg             * they were in aAbBcC order because it's easier and really
8046747b715Smrg             * doesn't matter.
8056747b715Smrg             */
80635c4bbdfSmrg            swapl(&values->integral);
80735c4bbdfSmrg            swapl(&values->frac);
8086747b715Smrg            values++;
80935c4bbdfSmrg            swapl(&values->integral);
81035c4bbdfSmrg            swapl(&values->frac);
8116747b715Smrg            values++;
8126747b715Smrg        }
8136747b715Smrg    }
8146747b715Smrg
81535c4bbdfSmrg    swaps(&to->valuators_len);
8166747b715Smrg}
8176747b715Smrg
81835c4bbdfSmrgstatic void
81935c4bbdfSmrgSTouchOwnershipEvent(xXITouchOwnershipEvent * from, xXITouchOwnershipEvent * to)
82035c4bbdfSmrg{
82135c4bbdfSmrg    *to = *from;
82235c4bbdfSmrg    swaps(&to->sequenceNumber);
82335c4bbdfSmrg    swapl(&to->length);
82435c4bbdfSmrg    swaps(&to->evtype);
82535c4bbdfSmrg    swaps(&to->deviceid);
82635c4bbdfSmrg    swapl(&to->time);
82735c4bbdfSmrg    swaps(&to->sourceid);
82835c4bbdfSmrg    swapl(&to->touchid);
82935c4bbdfSmrg    swapl(&to->flags);
83035c4bbdfSmrg    swapl(&to->root);
83135c4bbdfSmrg    swapl(&to->event);
83235c4bbdfSmrg    swapl(&to->child);
83335c4bbdfSmrg}
83435c4bbdfSmrg
83535c4bbdfSmrgstatic void
83635c4bbdfSmrgSBarrierEvent(xXIBarrierEvent * from,
83735c4bbdfSmrg              xXIBarrierEvent * to) {
83835c4bbdfSmrg
83935c4bbdfSmrg    *to = *from;
84035c4bbdfSmrg
84135c4bbdfSmrg    swaps(&to->sequenceNumber);
84235c4bbdfSmrg    swapl(&to->length);
84335c4bbdfSmrg    swaps(&to->evtype);
84435c4bbdfSmrg    swapl(&to->time);
84535c4bbdfSmrg    swaps(&to->deviceid);
84635c4bbdfSmrg    swaps(&to->sourceid);
84735c4bbdfSmrg    swapl(&to->event);
84835c4bbdfSmrg    swapl(&to->root);
84935c4bbdfSmrg    swapl(&to->root_x);
85035c4bbdfSmrg    swapl(&to->root_y);
85135c4bbdfSmrg
85235c4bbdfSmrg    swapl(&to->dx.integral);
85335c4bbdfSmrg    swapl(&to->dx.frac);
85435c4bbdfSmrg    swapl(&to->dy.integral);
85535c4bbdfSmrg    swapl(&to->dy.frac);
85635c4bbdfSmrg    swapl(&to->dtime);
85735c4bbdfSmrg    swapl(&to->barrier);
85835c4bbdfSmrg    swapl(&to->eventid);
85935c4bbdfSmrg}
8606747b715Smrg
8616747b715Smrg/** Event swapping function for XI2 events. */
8621b5d61b8Smrgvoid _X_COLD
8636747b715SmrgXI2EventSwap(xGenericEvent *from, xGenericEvent *to)
8646747b715Smrg{
86535c4bbdfSmrg    switch (from->evtype) {
86635c4bbdfSmrg    case XI_Enter:
86735c4bbdfSmrg    case XI_Leave:
86835c4bbdfSmrg    case XI_FocusIn:
86935c4bbdfSmrg    case XI_FocusOut:
87035c4bbdfSmrg        SDeviceLeaveNotifyEvent((xXILeaveEvent *) from, (xXILeaveEvent *) to);
87135c4bbdfSmrg        break;
87235c4bbdfSmrg    case XI_DeviceChanged:
87335c4bbdfSmrg        SDeviceChangedEvent((xXIDeviceChangedEvent *) from,
87435c4bbdfSmrg                            (xXIDeviceChangedEvent *) to);
87535c4bbdfSmrg        break;
87635c4bbdfSmrg    case XI_HierarchyChanged:
87735c4bbdfSmrg        SDeviceHierarchyEvent((xXIHierarchyEvent *) from,
87835c4bbdfSmrg                              (xXIHierarchyEvent *) to);
87935c4bbdfSmrg        break;
88035c4bbdfSmrg    case XI_PropertyEvent:
88135c4bbdfSmrg        SXIPropertyEvent((xXIPropertyEvent *) from, (xXIPropertyEvent *) to);
88235c4bbdfSmrg        break;
88335c4bbdfSmrg    case XI_Motion:
88435c4bbdfSmrg    case XI_KeyPress:
88535c4bbdfSmrg    case XI_KeyRelease:
88635c4bbdfSmrg    case XI_ButtonPress:
88735c4bbdfSmrg    case XI_ButtonRelease:
88835c4bbdfSmrg    case XI_TouchBegin:
88935c4bbdfSmrg    case XI_TouchUpdate:
89035c4bbdfSmrg    case XI_TouchEnd:
89135c4bbdfSmrg        SDeviceEvent((xXIDeviceEvent *) from, (xXIDeviceEvent *) to);
89235c4bbdfSmrg        break;
89335c4bbdfSmrg    case XI_TouchOwnership:
89435c4bbdfSmrg        STouchOwnershipEvent((xXITouchOwnershipEvent *) from,
89535c4bbdfSmrg                             (xXITouchOwnershipEvent *) to);
89635c4bbdfSmrg        break;
89735c4bbdfSmrg    case XI_RawMotion:
89835c4bbdfSmrg    case XI_RawKeyPress:
89935c4bbdfSmrg    case XI_RawKeyRelease:
90035c4bbdfSmrg    case XI_RawButtonPress:
90135c4bbdfSmrg    case XI_RawButtonRelease:
90235c4bbdfSmrg    case XI_RawTouchBegin:
90335c4bbdfSmrg    case XI_RawTouchUpdate:
90435c4bbdfSmrg    case XI_RawTouchEnd:
90535c4bbdfSmrg        SRawEvent((xXIRawEvent *) from, (xXIRawEvent *) to);
90635c4bbdfSmrg        break;
90735c4bbdfSmrg    case XI_BarrierHit:
90835c4bbdfSmrg    case XI_BarrierLeave:
90935c4bbdfSmrg        SBarrierEvent((xXIBarrierEvent *) from,
91035c4bbdfSmrg                      (xXIBarrierEvent *) to);
91135c4bbdfSmrg        break;
91235c4bbdfSmrg    default:
91335c4bbdfSmrg        ErrorF("[Xi] Unknown event type to swap. This is a bug.\n");
91435c4bbdfSmrg        break;
9156747b715Smrg    }
91605b261ecSmrg}
91705b261ecSmrg
91805b261ecSmrg/**************************************************************************
91905b261ecSmrg *
9206747b715Smrg * Allow the specified event to have its propagation suppressed.
9216747b715Smrg * The default is to not allow suppression of propagation.
92205b261ecSmrg *
92305b261ecSmrg */
92405b261ecSmrg
9256747b715Smrgstatic void
9266747b715SmrgAllowPropagateSuppress(Mask mask)
92705b261ecSmrg{
92805b261ecSmrg    int i;
92905b261ecSmrg
9304642e01fSmrg    for (i = 0; i < MAXDEVICES; i++)
93135c4bbdfSmrg        PropagateMask[i] |= mask;
93205b261ecSmrg}
93305b261ecSmrg
93405b261ecSmrg/**************************************************************************
93505b261ecSmrg *
93605b261ecSmrg * Record an event mask where there is no unique corresponding event type.
93705b261ecSmrg * We can't call SetMaskForEvent, since that would clobber the existing
93805b261ecSmrg * mask for that event.  MotionHint and ButtonMotion are examples.
93905b261ecSmrg *
94005b261ecSmrg * Since extension event types will never be less than 64, we can use
94105b261ecSmrg * 0-63 in the EventInfo array as the "type" to be used to look up this
9424642e01fSmrg * mask.  This means that the corresponding macros such as
94305b261ecSmrg * DevicePointerMotionHint must have access to the same constants.
94405b261ecSmrg *
94505b261ecSmrg */
94605b261ecSmrg
94705b261ecSmrgstatic void
94805b261ecSmrgSetEventInfo(Mask mask, int constant)
94905b261ecSmrg{
95005b261ecSmrg    EventInfo[ExtEventIndex].mask = mask;
95105b261ecSmrg    EventInfo[ExtEventIndex++].type = constant;
95205b261ecSmrg}
95305b261ecSmrg
95405b261ecSmrg/**************************************************************************
95505b261ecSmrg *
95605b261ecSmrg * Allow the specified event to be restricted to being selected by one
95705b261ecSmrg * client at a time.
95805b261ecSmrg * The default is to allow more than one client to select the event.
95905b261ecSmrg *
96005b261ecSmrg */
96105b261ecSmrg
96205b261ecSmrgstatic void
96305b261ecSmrgSetExclusiveAccess(Mask mask)
96405b261ecSmrg{
96505b261ecSmrg    int i;
96605b261ecSmrg
9674642e01fSmrg    for (i = 0; i < MAXDEVICES; i++)
96835c4bbdfSmrg        ExtExclusiveMasks[i] |= mask;
96905b261ecSmrg}
97005b261ecSmrg
97105b261ecSmrg/**************************************************************************
97205b261ecSmrg *
97305b261ecSmrg * Assign the specified mask to the specified event.
97405b261ecSmrg *
97505b261ecSmrg */
97605b261ecSmrg
97705b261ecSmrgstatic void
97805b261ecSmrgSetMaskForExtEvent(Mask mask, int event)
97905b261ecSmrg{
9804642e01fSmrg    int i;
98105b261ecSmrg
98205b261ecSmrg    EventInfo[ExtEventIndex].mask = mask;
98305b261ecSmrg    EventInfo[ExtEventIndex++].type = event;
98405b261ecSmrg
98505b261ecSmrg    if ((event < LASTEvent) || (event >= 128))
98635c4bbdfSmrg        FatalError("MaskForExtensionEvent: bogus event number");
9874642e01fSmrg
9884642e01fSmrg    for (i = 0; i < MAXDEVICES; i++)
9894642e01fSmrg        SetMaskForEvent(i, mask, event);
99005b261ecSmrg}
99105b261ecSmrg
99205b261ecSmrg/************************************************************************
99305b261ecSmrg *
99405b261ecSmrg * This function sets up extension event types and masks.
99505b261ecSmrg *
99605b261ecSmrg */
99705b261ecSmrg
99805b261ecSmrgstatic void
99905b261ecSmrgFixExtensionEvents(ExtensionEntry * extEntry)
100005b261ecSmrg{
100105b261ecSmrg    DeviceValuator = extEntry->eventBase;
100205b261ecSmrg    DeviceKeyPress = DeviceValuator + 1;
100305b261ecSmrg    DeviceKeyRelease = DeviceKeyPress + 1;
100405b261ecSmrg    DeviceButtonPress = DeviceKeyRelease + 1;
100505b261ecSmrg    DeviceButtonRelease = DeviceButtonPress + 1;
100605b261ecSmrg    DeviceMotionNotify = DeviceButtonRelease + 1;
100705b261ecSmrg    DeviceFocusIn = DeviceMotionNotify + 1;
100805b261ecSmrg    DeviceFocusOut = DeviceFocusIn + 1;
100905b261ecSmrg    ProximityIn = DeviceFocusOut + 1;
101005b261ecSmrg    ProximityOut = ProximityIn + 1;
101105b261ecSmrg    DeviceStateNotify = ProximityOut + 1;
101205b261ecSmrg    DeviceMappingNotify = DeviceStateNotify + 1;
101305b261ecSmrg    ChangeDeviceNotify = DeviceMappingNotify + 1;
101405b261ecSmrg    DeviceKeyStateNotify = ChangeDeviceNotify + 1;
101505b261ecSmrg    DeviceButtonStateNotify = DeviceKeyStateNotify + 1;
101605b261ecSmrg    DevicePresenceNotify = DeviceButtonStateNotify + 1;
10174642e01fSmrg    DevicePropertyNotify = DevicePresenceNotify + 1;
101805b261ecSmrg
101905b261ecSmrg    event_base[KeyClass] = DeviceKeyPress;
102005b261ecSmrg    event_base[ButtonClass] = DeviceButtonPress;
102105b261ecSmrg    event_base[ValuatorClass] = DeviceMotionNotify;
102205b261ecSmrg    event_base[ProximityClass] = ProximityIn;
102305b261ecSmrg    event_base[FocusClass] = DeviceFocusIn;
102405b261ecSmrg    event_base[OtherClass] = DeviceStateNotify;
102505b261ecSmrg
102605b261ecSmrg    BadDevice += extEntry->errorBase;
102705b261ecSmrg    BadEvent += extEntry->errorBase;
102805b261ecSmrg    BadMode += extEntry->errorBase;
102905b261ecSmrg    DeviceBusy += extEntry->errorBase;
103005b261ecSmrg    BadClass += extEntry->errorBase;
103105b261ecSmrg
10326747b715Smrg    SetMaskForExtEvent(DeviceKeyPressMask, DeviceKeyPress);
10336747b715Smrg    AllowPropagateSuppress(DeviceKeyPressMask);
10346747b715Smrg    SetCriticalEvent(DeviceKeyPress);
103505b261ecSmrg
10366747b715Smrg    SetMaskForExtEvent(DeviceKeyReleaseMask, DeviceKeyRelease);
10376747b715Smrg    AllowPropagateSuppress(DeviceKeyReleaseMask);
10386747b715Smrg    SetCriticalEvent(DeviceKeyRelease);
103905b261ecSmrg
10406747b715Smrg    SetMaskForExtEvent(DeviceButtonPressMask, DeviceButtonPress);
10416747b715Smrg    AllowPropagateSuppress(DeviceButtonPressMask);
10426747b715Smrg    SetCriticalEvent(DeviceButtonPress);
104305b261ecSmrg
10446747b715Smrg    SetMaskForExtEvent(DeviceButtonReleaseMask, DeviceButtonRelease);
10456747b715Smrg    AllowPropagateSuppress(DeviceButtonReleaseMask);
10466747b715Smrg    SetCriticalEvent(DeviceButtonRelease);
104705b261ecSmrg
10486747b715Smrg    SetMaskForExtEvent(DeviceProximityMask, ProximityIn);
10496747b715Smrg    SetMaskForExtEvent(DeviceProximityMask, ProximityOut);
105005b261ecSmrg
10516747b715Smrg    SetMaskForExtEvent(DeviceStateNotifyMask, DeviceStateNotify);
105205b261ecSmrg
10536747b715Smrg    SetMaskForExtEvent(DevicePointerMotionMask, DeviceMotionNotify);
10546747b715Smrg    AllowPropagateSuppress(DevicePointerMotionMask);
10556747b715Smrg    SetCriticalEvent(DeviceMotionNotify);
105605b261ecSmrg
105705b261ecSmrg    SetEventInfo(DevicePointerMotionHintMask, _devicePointerMotionHint);
10586747b715Smrg    SetEventInfo(DeviceButton1MotionMask, _deviceButton1Motion);
10596747b715Smrg    SetEventInfo(DeviceButton2MotionMask, _deviceButton2Motion);
10606747b715Smrg    SetEventInfo(DeviceButton3MotionMask, _deviceButton3Motion);
10616747b715Smrg    SetEventInfo(DeviceButton4MotionMask, _deviceButton4Motion);
10626747b715Smrg    SetEventInfo(DeviceButton5MotionMask, _deviceButton5Motion);
106305b261ecSmrg    SetEventInfo(DeviceButtonMotionMask, _deviceButtonMotion);
106405b261ecSmrg
106505b261ecSmrg    SetMaskForExtEvent(DeviceFocusChangeMask, DeviceFocusIn);
106605b261ecSmrg    SetMaskForExtEvent(DeviceFocusChangeMask, DeviceFocusOut);
106705b261ecSmrg
10686747b715Smrg    SetMaskForExtEvent(DeviceMappingNotifyMask, DeviceMappingNotify);
10696747b715Smrg    SetMaskForExtEvent(ChangeDeviceNotifyMask, ChangeDeviceNotify);
107005b261ecSmrg
107105b261ecSmrg    SetEventInfo(DeviceButtonGrabMask, _deviceButtonGrab);
107205b261ecSmrg    SetExclusiveAccess(DeviceButtonGrabMask);
107305b261ecSmrg
107405b261ecSmrg    SetEventInfo(DeviceOwnerGrabButtonMask, _deviceOwnerGrabButton);
107505b261ecSmrg    SetEventInfo(DevicePresenceNotifyMask, _devicePresence);
10764642e01fSmrg    SetMaskForExtEvent(DevicePropertyNotifyMask, DevicePropertyNotify);
10774642e01fSmrg
107805b261ecSmrg    SetEventInfo(0, _noExtensionEvent);
107905b261ecSmrg}
108005b261ecSmrg
108105b261ecSmrg/************************************************************************
108205b261ecSmrg *
10834642e01fSmrg * This function restores extension event types and masks to their
108405b261ecSmrg * initial state.
108505b261ecSmrg *
108605b261ecSmrg */
108705b261ecSmrg
108805b261ecSmrgstatic void
108905b261ecSmrgRestoreExtensionEvents(void)
109005b261ecSmrg{
10914642e01fSmrg    int i, j;
109205b261ecSmrg
109305b261ecSmrg    IReqCode = 0;
10944642e01fSmrg    IEventBase = 0;
109505b261ecSmrg
109605b261ecSmrg    for (i = 0; i < ExtEventIndex - 1; i++) {
109735c4bbdfSmrg        if ((EventInfo[i].type >= LASTEvent) && (EventInfo[i].type < 128)) {
10984642e01fSmrg            for (j = 0; j < MAXDEVICES; j++)
10994642e01fSmrg                SetMaskForEvent(j, 0, EventInfo[i].type);
11004642e01fSmrg        }
110135c4bbdfSmrg        EventInfo[i].mask = 0;
110235c4bbdfSmrg        EventInfo[i].type = 0;
110305b261ecSmrg    }
110405b261ecSmrg    ExtEventIndex = 0;
110505b261ecSmrg    DeviceValuator = 0;
110605b261ecSmrg    DeviceKeyPress = 1;
110705b261ecSmrg    DeviceKeyRelease = 2;
110805b261ecSmrg    DeviceButtonPress = 3;
110905b261ecSmrg    DeviceButtonRelease = 4;
111005b261ecSmrg    DeviceMotionNotify = 5;
111105b261ecSmrg    DeviceFocusIn = 6;
111205b261ecSmrg    DeviceFocusOut = 7;
111305b261ecSmrg    ProximityIn = 8;
111405b261ecSmrg    ProximityOut = 9;
111505b261ecSmrg    DeviceStateNotify = 10;
111605b261ecSmrg    DeviceMappingNotify = 11;
111705b261ecSmrg    ChangeDeviceNotify = 12;
111805b261ecSmrg    DeviceKeyStateNotify = 13;
111905b261ecSmrg    DeviceButtonStateNotify = 13;
112005b261ecSmrg    DevicePresenceNotify = 14;
11214642e01fSmrg    DevicePropertyNotify = 15;
112205b261ecSmrg
112305b261ecSmrg    BadDevice = 0;
112405b261ecSmrg    BadEvent = 1;
112505b261ecSmrg    BadMode = 2;
112605b261ecSmrg    DeviceBusy = 3;
112705b261ecSmrg    BadClass = 4;
112805b261ecSmrg
112905b261ecSmrg}
113005b261ecSmrg
113105b261ecSmrg/***********************************************************************
113205b261ecSmrg *
113305b261ecSmrg * IResetProc.
113405b261ecSmrg * Remove reply-swapping routine.
113505b261ecSmrg * Remove event-swapping routine.
113605b261ecSmrg *
113705b261ecSmrg */
113805b261ecSmrg
113905b261ecSmrgstatic void
114005b261ecSmrgIResetProc(ExtensionEntry * unused)
114105b261ecSmrg{
114205b261ecSmrg    ReplySwapVector[IReqCode] = ReplyNotSwappd;
114305b261ecSmrg    EventSwapVector[DeviceValuator] = NotImplemented;
114405b261ecSmrg    EventSwapVector[DeviceKeyPress] = NotImplemented;
114505b261ecSmrg    EventSwapVector[DeviceKeyRelease] = NotImplemented;
114605b261ecSmrg    EventSwapVector[DeviceButtonPress] = NotImplemented;
114705b261ecSmrg    EventSwapVector[DeviceButtonRelease] = NotImplemented;
114805b261ecSmrg    EventSwapVector[DeviceMotionNotify] = NotImplemented;
114905b261ecSmrg    EventSwapVector[DeviceFocusIn] = NotImplemented;
115005b261ecSmrg    EventSwapVector[DeviceFocusOut] = NotImplemented;
115105b261ecSmrg    EventSwapVector[ProximityIn] = NotImplemented;
115205b261ecSmrg    EventSwapVector[ProximityOut] = NotImplemented;
115305b261ecSmrg    EventSwapVector[DeviceStateNotify] = NotImplemented;
115405b261ecSmrg    EventSwapVector[DeviceKeyStateNotify] = NotImplemented;
115505b261ecSmrg    EventSwapVector[DeviceButtonStateNotify] = NotImplemented;
115605b261ecSmrg    EventSwapVector[DeviceMappingNotify] = NotImplemented;
115705b261ecSmrg    EventSwapVector[ChangeDeviceNotify] = NotImplemented;
115805b261ecSmrg    EventSwapVector[DevicePresenceNotify] = NotImplemented;
11594642e01fSmrg    EventSwapVector[DevicePropertyNotify] = NotImplemented;
116005b261ecSmrg    RestoreExtensionEvents();
116105b261ecSmrg
116235c4bbdfSmrg    free(xi_all_devices.name);
116335c4bbdfSmrg    free(xi_all_master_devices.name);
116435c4bbdfSmrg
116535c4bbdfSmrg    XIBarrierReset();
116635c4bbdfSmrg}
11674642e01fSmrg
116805b261ecSmrg/***********************************************************************
116905b261ecSmrg *
117005b261ecSmrg * Assign an id and type to an input device.
117105b261ecSmrg *
117205b261ecSmrg */
117305b261ecSmrg
11744642e01fSmrgvoid
117535c4bbdfSmrgAssignTypeAndName(DeviceIntPtr dev, Atom type, const char *name)
117605b261ecSmrg{
11776747b715Smrg    dev->xinput_type = type;
11789ace9065Smrg    dev->name = strdup(name);
117905b261ecSmrg}
118005b261ecSmrg
118105b261ecSmrg/***********************************************************************
118205b261ecSmrg *
118305b261ecSmrg * Make device type atoms.
118405b261ecSmrg *
118505b261ecSmrg */
118605b261ecSmrg
118705b261ecSmrgstatic void
118805b261ecSmrgMakeDeviceTypeAtoms(void)
118905b261ecSmrg{
119005b261ecSmrg    int i;
119105b261ecSmrg
119205b261ecSmrg    for (i = 0; i < NUMTYPES; i++)
119335c4bbdfSmrg        dev_type[i].type =
119435c4bbdfSmrg            MakeAtom(dev_type[i].name, strlen(dev_type[i].name), 1);
119505b261ecSmrg}
119605b261ecSmrg
119705b261ecSmrg/*****************************************************************************
119805b261ecSmrg *
119905b261ecSmrg *	SEventIDispatch
120005b261ecSmrg *
120105b261ecSmrg *	Swap any events defined in this extension.
120205b261ecSmrg */
120305b261ecSmrg#define DO_SWAP(func,type) func ((type *)from, (type *)to)
120405b261ecSmrg
12051b5d61b8Smrgstatic void _X_COLD
120635c4bbdfSmrgSEventIDispatch(xEvent *from, xEvent *to)
120705b261ecSmrg{
120805b261ecSmrg    int type = from->u.u.type & 0177;
120905b261ecSmrg
121005b261ecSmrg    if (type == DeviceValuator)
121135c4bbdfSmrg        DO_SWAP(SEventDeviceValuator, deviceValuator);
121205b261ecSmrg    else if (type == DeviceKeyPress) {
121335c4bbdfSmrg        SKeyButtonPtrEvent(from, to);
121435c4bbdfSmrg        to->u.keyButtonPointer.pad1 = from->u.keyButtonPointer.pad1;
121535c4bbdfSmrg    }
121635c4bbdfSmrg    else if (type == DeviceKeyRelease) {
121735c4bbdfSmrg        SKeyButtonPtrEvent(from, to);
121835c4bbdfSmrg        to->u.keyButtonPointer.pad1 = from->u.keyButtonPointer.pad1;
121935c4bbdfSmrg    }
122035c4bbdfSmrg    else if (type == DeviceButtonPress) {
122135c4bbdfSmrg        SKeyButtonPtrEvent(from, to);
122235c4bbdfSmrg        to->u.keyButtonPointer.pad1 = from->u.keyButtonPointer.pad1;
122335c4bbdfSmrg    }
122435c4bbdfSmrg    else if (type == DeviceButtonRelease) {
122535c4bbdfSmrg        SKeyButtonPtrEvent(from, to);
122635c4bbdfSmrg        to->u.keyButtonPointer.pad1 = from->u.keyButtonPointer.pad1;
122735c4bbdfSmrg    }
122835c4bbdfSmrg    else if (type == DeviceMotionNotify) {
122935c4bbdfSmrg        SKeyButtonPtrEvent(from, to);
123035c4bbdfSmrg        to->u.keyButtonPointer.pad1 = from->u.keyButtonPointer.pad1;
123135c4bbdfSmrg    }
123235c4bbdfSmrg    else if (type == DeviceFocusIn)
123335c4bbdfSmrg        DO_SWAP(SEventFocus, deviceFocus);
123405b261ecSmrg    else if (type == DeviceFocusOut)
123535c4bbdfSmrg        DO_SWAP(SEventFocus, deviceFocus);
123605b261ecSmrg    else if (type == ProximityIn) {
123735c4bbdfSmrg        SKeyButtonPtrEvent(from, to);
123835c4bbdfSmrg        to->u.keyButtonPointer.pad1 = from->u.keyButtonPointer.pad1;
123935c4bbdfSmrg    }
124035c4bbdfSmrg    else if (type == ProximityOut) {
124135c4bbdfSmrg        SKeyButtonPtrEvent(from, to);
124235c4bbdfSmrg        to->u.keyButtonPointer.pad1 = from->u.keyButtonPointer.pad1;
124335c4bbdfSmrg    }
124435c4bbdfSmrg    else if (type == DeviceStateNotify)
124535c4bbdfSmrg        DO_SWAP(SDeviceStateNotifyEvent, deviceStateNotify);
124605b261ecSmrg    else if (type == DeviceKeyStateNotify)
124735c4bbdfSmrg        DO_SWAP(SDeviceKeyStateNotifyEvent, deviceKeyStateNotify);
124805b261ecSmrg    else if (type == DeviceButtonStateNotify)
124935c4bbdfSmrg        DO_SWAP(SDeviceButtonStateNotifyEvent, deviceButtonStateNotify);
125005b261ecSmrg    else if (type == DeviceMappingNotify)
125135c4bbdfSmrg        DO_SWAP(SDeviceMappingNotifyEvent, deviceMappingNotify);
125205b261ecSmrg    else if (type == ChangeDeviceNotify)
125335c4bbdfSmrg        DO_SWAP(SChangeDeviceNotifyEvent, changeDeviceNotify);
12544642e01fSmrg    else if (type == DevicePresenceNotify)
125535c4bbdfSmrg        DO_SWAP(SDevicePresenceNotifyEvent, devicePresenceNotify);
12564642e01fSmrg    else if (type == DevicePropertyNotify)
125735c4bbdfSmrg        DO_SWAP(SDevicePropertyNotifyEvent, devicePropertyNotify);
125805b261ecSmrg    else {
125935c4bbdfSmrg        FatalError("XInputExtension: Impossible event!\n");
126005b261ecSmrg    }
126105b261ecSmrg}
126205b261ecSmrg
126305b261ecSmrg/**********************************************************************
126405b261ecSmrg *
126505b261ecSmrg * IExtensionInit - initialize the input extension.
126605b261ecSmrg *
126705b261ecSmrg * Called from InitExtensions in main() or from QueryExtension() if the
126805b261ecSmrg * extension is dynamically loaded.
126905b261ecSmrg *
127005b261ecSmrg * This extension has several events and errors.
127105b261ecSmrg *
12724642e01fSmrg * XI is mandatory nowadays, so if we fail to init XI, we die.
127305b261ecSmrg */
127405b261ecSmrg
127505b261ecSmrgvoid
127605b261ecSmrgXInputExtensionInit(void)
127705b261ecSmrg{
127805b261ecSmrg    ExtensionEntry *extEntry;
127935c4bbdfSmrg
12806747b715Smrg    XExtensionVersion thisversion = { XI_Present,
12816747b715Smrg        SERVER_XI_MAJOR_VERSION,
12826747b715Smrg        SERVER_XI_MINOR_VERSION,
12836747b715Smrg    };
128405b261ecSmrg
128535c4bbdfSmrg    if (!dixRegisterPrivateKey
128635c4bbdfSmrg        (&XIClientPrivateKeyRec, PRIVATE_CLIENT, sizeof(XIClientRec)))
12874642e01fSmrg        FatalError("Cannot request private for XI.\n");
12884642e01fSmrg
128935c4bbdfSmrg    if (!XIBarrierInit())
129035c4bbdfSmrg        FatalError("Could not initialize barriers.\n");
129135c4bbdfSmrg
129205b261ecSmrg    extEntry = AddExtension(INAME, IEVENTS, IERRORS, ProcIDispatch,
129335c4bbdfSmrg                            SProcIDispatch, IResetProc, StandardMinorOpcode);
129405b261ecSmrg    if (extEntry) {
129535c4bbdfSmrg        IReqCode = extEntry->base;
129635c4bbdfSmrg        IEventBase = extEntry->eventBase;
129735c4bbdfSmrg        XIVersion = thisversion;
129835c4bbdfSmrg        MakeDeviceTypeAtoms();
129935c4bbdfSmrg        RT_INPUTCLIENT = CreateNewResourceType((DeleteType) InputClientGone,
130035c4bbdfSmrg                                               "INPUTCLIENT");
130135c4bbdfSmrg        if (!RT_INPUTCLIENT)
130235c4bbdfSmrg            FatalError("Failed to add resource type for XI.\n");
130335c4bbdfSmrg        FixExtensionEvents(extEntry);
130435c4bbdfSmrg        ReplySwapVector[IReqCode] = (ReplySwapPtr) SReplyIDispatch;
130535c4bbdfSmrg        EventSwapVector[DeviceValuator] = SEventIDispatch;
130635c4bbdfSmrg        EventSwapVector[DeviceKeyPress] = SEventIDispatch;
130735c4bbdfSmrg        EventSwapVector[DeviceKeyRelease] = SEventIDispatch;
130835c4bbdfSmrg        EventSwapVector[DeviceButtonPress] = SEventIDispatch;
130935c4bbdfSmrg        EventSwapVector[DeviceButtonRelease] = SEventIDispatch;
131035c4bbdfSmrg        EventSwapVector[DeviceMotionNotify] = SEventIDispatch;
131135c4bbdfSmrg        EventSwapVector[DeviceFocusIn] = SEventIDispatch;
131235c4bbdfSmrg        EventSwapVector[DeviceFocusOut] = SEventIDispatch;
131335c4bbdfSmrg        EventSwapVector[ProximityIn] = SEventIDispatch;
131435c4bbdfSmrg        EventSwapVector[ProximityOut] = SEventIDispatch;
131535c4bbdfSmrg        EventSwapVector[DeviceStateNotify] = SEventIDispatch;
131635c4bbdfSmrg        EventSwapVector[DeviceKeyStateNotify] = SEventIDispatch;
131735c4bbdfSmrg        EventSwapVector[DeviceButtonStateNotify] = SEventIDispatch;
131835c4bbdfSmrg        EventSwapVector[DeviceMappingNotify] = SEventIDispatch;
131935c4bbdfSmrg        EventSwapVector[ChangeDeviceNotify] = SEventIDispatch;
132035c4bbdfSmrg        EventSwapVector[DevicePresenceNotify] = SEventIDispatch;
132135c4bbdfSmrg
132235c4bbdfSmrg        GERegisterExtension(IReqCode, XI2EventSwap);
132335c4bbdfSmrg
132435c4bbdfSmrg        memset(&xi_all_devices, 0, sizeof(xi_all_devices));
132535c4bbdfSmrg        memset(&xi_all_master_devices, 0, sizeof(xi_all_master_devices));
132635c4bbdfSmrg        xi_all_devices.id = XIAllDevices;
132735c4bbdfSmrg        xi_all_devices.name = strdup("XIAllDevices");
132835c4bbdfSmrg        xi_all_master_devices.id = XIAllMasterDevices;
132935c4bbdfSmrg        xi_all_master_devices.name = strdup("XIAllMasterDevices");
133035c4bbdfSmrg
133135c4bbdfSmrg        inputInfo.all_devices = &xi_all_devices;
133235c4bbdfSmrg        inputInfo.all_master_devices = &xi_all_master_devices;
133335c4bbdfSmrg
133435c4bbdfSmrg        XIResetProperties();
133535c4bbdfSmrg    }
133635c4bbdfSmrg    else {
133735c4bbdfSmrg        FatalError("IExtensionInit: AddExtensions failed\n");
133805b261ecSmrg    }
133905b261ecSmrg}
1340