xichangecursor.c (3352B)
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 change a given device pointer's cursor. 29 * 30 */ 31 32 #ifdef HAVE_DIX_CONFIG_H 33 #include <dix-config.h> 34 #endif 35 36 #include <X11/X.h> /* for inputstr.h */ 37 #include <X11/Xproto.h> /* Request macro */ 38 #include "inputstr.h" /* DeviceIntPtr */ 39 #include "windowstr.h" /* window structure */ 40 #include "scrnintstr.h" /* screen structure */ 41 #include <X11/extensions/XI.h> 42 #include <X11/extensions/XI2proto.h> 43 #include "extnsionst.h" 44 #include "exevents.h" 45 #include "exglobals.h" 46 #include "input.h" 47 48 #include "xichangecursor.h" 49 50 /*********************************************************************** 51 * 52 * This procedure allows a client to set one pointer's cursor. 53 * 54 */ 55 56 int _X_COLD 57 SProcXIChangeCursor(ClientPtr client) 58 { 59 REQUEST(xXIChangeCursorReq); 60 REQUEST_SIZE_MATCH(xXIChangeCursorReq); 61 swaps(&stuff->length); 62 swapl(&stuff->win); 63 swapl(&stuff->cursor); 64 swaps(&stuff->deviceid); 65 return (ProcXIChangeCursor(client)); 66 } 67 68 int 69 ProcXIChangeCursor(ClientPtr client) 70 { 71 int rc; 72 WindowPtr pWin = NULL; 73 DeviceIntPtr pDev = NULL; 74 CursorPtr pCursor = NULL; 75 76 REQUEST(xXIChangeCursorReq); 77 REQUEST_SIZE_MATCH(xXIChangeCursorReq); 78 79 rc = dixLookupDevice(&pDev, stuff->deviceid, client, DixSetAttrAccess); 80 if (rc != Success) 81 return rc; 82 83 if (!IsMaster(pDev) || !IsPointerDevice(pDev)) 84 return BadDevice; 85 86 if (stuff->win != None) { 87 rc = dixLookupWindow(&pWin, stuff->win, client, DixSetAttrAccess); 88 if (rc != Success) 89 return rc; 90 } 91 92 if (stuff->cursor == None) { 93 if (pWin == pWin->drawable.pScreen->root) 94 pCursor = rootCursor; 95 else 96 pCursor = (CursorPtr) None; 97 } 98 else { 99 rc = dixLookupResourceByType((void **) &pCursor, stuff->cursor, 100 RT_CURSOR, client, DixUseAccess); 101 if (rc != Success) 102 return rc; 103 } 104 105 ChangeWindowDeviceCursor(pWin, pDev, pCursor); 106 107 return Success; 108 }