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