xisetclientpointer.c revision 7e31ba66
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/*********************************************************************** 27 * 28 * Request to set the client pointer for the owner of the given window. 29 * All subsequent calls that are ambiguous will choose the client pointer as 30 * default value. 31 */ 32 33#ifdef HAVE_DIX_CONFIG_H 34#include <dix-config.h> 35#endif 36 37#include <X11/X.h> /* for inputstr.h */ 38#include <X11/Xproto.h> /* Request macro */ 39#include "inputstr.h" /* DeviceIntPtr */ 40#include "windowstr.h" /* window structure */ 41#include "scrnintstr.h" /* screen structure */ 42#include <X11/extensions/XI.h> 43#include <X11/extensions/XI2proto.h> 44#include "extnsionst.h" 45#include "exevents.h" 46#include "exglobals.h" 47 48#include "xisetclientpointer.h" 49 50int _X_COLD 51SProcXISetClientPointer(ClientPtr client) 52{ 53 REQUEST(xXISetClientPointerReq); 54 REQUEST_SIZE_MATCH(xXISetClientPointerReq); 55 56 swaps(&stuff->length); 57 swapl(&stuff->win); 58 swaps(&stuff->deviceid); 59 return (ProcXISetClientPointer(client)); 60} 61 62int 63ProcXISetClientPointer(ClientPtr client) 64{ 65 DeviceIntPtr pDev; 66 ClientPtr targetClient; 67 int rc; 68 69 REQUEST(xXISetClientPointerReq); 70 REQUEST_SIZE_MATCH(xXISetClientPointerReq); 71 72 rc = dixLookupDevice(&pDev, stuff->deviceid, client, DixManageAccess); 73 if (rc != Success) { 74 client->errorValue = stuff->deviceid; 75 return rc; 76 } 77 78 if (!IsMaster(pDev)) { 79 client->errorValue = stuff->deviceid; 80 return BadDevice; 81 } 82 83 pDev = GetMaster(pDev, MASTER_POINTER); 84 85 if (stuff->win != None) { 86 rc = dixLookupClient(&targetClient, stuff->win, client, 87 DixManageAccess); 88 89 if (rc != Success) 90 return BadWindow; 91 92 } 93 else 94 targetClient = client; 95 96 rc = SetClientPointer(targetClient, pDev); 97 if (rc != Success) { 98 client->errorValue = stuff->deviceid; 99 return rc; 100 } 101 102 return Success; 103} 104