1/* 2 * Copyright 2007-2008 Peter Hutterer 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice (including the next 12 * paragraph) shall be included in all copies or substantial portions of the 13 * Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 21 * DEALINGS IN THE SOFTWARE. 22 * 23 * Author: Peter Hutterer, University of South Australia, NICTA 24 */ 25 26#ifdef HAVE_DIX_CONFIG_H 27#include <dix-config.h> 28#endif 29 30#include <X11/X.h> /* for inputstr.h */ 31#include <X11/Xproto.h> /* Request macro */ 32#include "inputstr.h" /* DeviceIntPtr */ 33#include "windowstr.h" /* window structure */ 34#include "scrnintstr.h" /* screen structure */ 35#include <X11/extensions/XI.h> 36#include <X11/extensions/XI2proto.h> 37#include "extnsionst.h" 38#include "extinit.h" /* LookupDeviceIntRec */ 39#include "exevents.h" 40#include "exglobals.h" 41 42#include "xigetclientpointer.h" 43 44/*********************************************************************** 45 * This procedure allows a client to query another client's client pointer 46 * setting. 47 */ 48 49int 50SProcXIGetClientPointer(ClientPtr client) 51{ 52 char n; 53 REQUEST(xXIGetClientPointerReq); 54 REQUEST_SIZE_MATCH(xXIGetClientPointerReq); 55 56 swaps(&stuff->length, n); 57 swapl(&stuff->win, n); 58 return ProcXIGetClientPointer(client); 59} 60 61int ProcXIGetClientPointer(ClientPtr client) 62{ 63 int rc; 64 ClientPtr winclient; 65 xXIGetClientPointerReply rep; 66 REQUEST(xXIGetClientPointerReq); 67 REQUEST_SIZE_MATCH(xXIGetClientPointerReq); 68 69 if (stuff->win != None) 70 { 71 rc = dixLookupClient(&winclient, stuff->win, client, 72 DixGetAttrAccess); 73 74 if (rc != Success) 75 return BadWindow; 76 } else 77 winclient = client; 78 79 rep.repType = X_Reply; 80 rep.RepType = X_XIGetClientPointer; 81 rep.length = 0; 82 rep.sequenceNumber = client->sequence; 83 rep.set = (winclient->clientPtr != NULL); 84 rep.deviceid = (winclient->clientPtr) ? winclient->clientPtr->id : 0; 85 86 WriteReplyToClient(client, sizeof(xXIGetClientPointerReply), &rep); 87 return Success; 88} 89 90/*********************************************************************** 91 * 92 * This procedure writes the reply for the XGetClientPointer function, 93 * if the client and server have a different byte ordering. 94 * 95 */ 96 97void 98SRepXIGetClientPointer(ClientPtr client, int size, 99 xXIGetClientPointerReply* rep) 100{ 101 char n; 102 swaps(&rep->sequenceNumber, n); 103 swapl(&rep->length, n); 104 swaps(&rep->deviceid, n); 105 WriteToClient(client, size, (char *)rep); 106} 107 108