panoramiXprocs.c revision 4642e01f
105b261ecSmrg/***************************************************************** 205b261ecSmrgCopyright (c) 1991, 1997 Digital Equipment Corporation, Maynard, Massachusetts. 305b261ecSmrgPermission is hereby granted, free of charge, to any person obtaining a copy 405b261ecSmrgof this software and associated documentation files (the "Software"), to deal 505b261ecSmrgin the Software without restriction, including without limitation the rights 605b261ecSmrgto use, copy, modify, merge, publish, distribute, sublicense, and/or sell 705b261ecSmrgcopies of the Software. 805b261ecSmrg 905b261ecSmrgThe above copyright notice and this permission notice shall be included in 1005b261ecSmrgall copies or substantial portions of the Software. 1105b261ecSmrg 1205b261ecSmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1305b261ecSmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1405b261ecSmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 1505b261ecSmrgDIGITAL EQUIPMENT CORPORATION BE LIABLE FOR ANY CLAIM, DAMAGES, INCLUDING, 1605b261ecSmrgBUT NOT LIMITED TO CONSEQUENTIAL OR INCIDENTAL DAMAGES, OR OTHER LIABILITY, 1705b261ecSmrgWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR 1805b261ecSmrgIN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 1905b261ecSmrg 2005b261ecSmrgExcept as contained in this notice, the name of Digital Equipment Corporation 2105b261ecSmrgshall not be used in advertising or otherwise to promote the sale, use or other 2205b261ecSmrgdealings in this Software without prior written authorization from Digital 2305b261ecSmrgEquipment Corporation. 2405b261ecSmrg******************************************************************/ 2505b261ecSmrg 2605b261ecSmrg/* Massively rewritten by Mark Vojkovich <markv@valinux.com> */ 2705b261ecSmrg 2805b261ecSmrg 2905b261ecSmrg#ifdef HAVE_DIX_CONFIG_H 3005b261ecSmrg#include <dix-config.h> 3105b261ecSmrg#endif 3205b261ecSmrg 3305b261ecSmrg#include <stdio.h> 3405b261ecSmrg#include <X11/X.h> 3505b261ecSmrg#define NEED_REPLIES 3605b261ecSmrg#define NEED_EVENTS 3705b261ecSmrg#include <X11/Xproto.h> 3805b261ecSmrg#include "windowstr.h" 3905b261ecSmrg#include "dixfontstr.h" 4005b261ecSmrg#include "gcstruct.h" 4105b261ecSmrg#include "colormapst.h" 4205b261ecSmrg#include "scrnintstr.h" 4305b261ecSmrg#include "opaque.h" 4405b261ecSmrg#include "inputstr.h" 4505b261ecSmrg#include "migc.h" 4605b261ecSmrg#include "misc.h" 4705b261ecSmrg#include "dixstruct.h" 4805b261ecSmrg#include "panoramiX.h" 4905b261ecSmrg#include "panoramiXsrv.h" 5005b261ecSmrg#include "resource.h" 5105b261ecSmrg#include "panoramiXh.h" 5205b261ecSmrg 5305b261ecSmrg#define XINERAMA_IMAGE_BUFSIZE (256*1024) 5405b261ecSmrg#define INPUTONLY_LEGAL_MASK (CWWinGravity | CWEventMask | \ 5505b261ecSmrg CWDontPropagate | CWOverrideRedirect | CWCursor ) 5605b261ecSmrg 5705b261ecSmrg/* Various of the DIX function interfaces were not designed to allow 5805b261ecSmrg * the client->errorValue to be set on BadValue and other errors. 5905b261ecSmrg * Rather than changing interfaces and breaking untold code we introduce 6005b261ecSmrg * a new global that dispatch can use. 6105b261ecSmrg */ 6205b261ecSmrgextern XID clientErrorValue; /* XXX this is a kludge */ 6305b261ecSmrg 6405b261ecSmrgint PanoramiXCreateWindow(ClientPtr client) 6505b261ecSmrg{ 6605b261ecSmrg PanoramiXRes *parent, *newWin; 6705b261ecSmrg PanoramiXRes *backPix = NULL; 6805b261ecSmrg PanoramiXRes *bordPix = NULL; 6905b261ecSmrg PanoramiXRes *cmap = NULL; 7005b261ecSmrg REQUEST(xCreateWindowReq); 7105b261ecSmrg int pback_offset = 0, pbord_offset = 0, cmap_offset = 0; 7205b261ecSmrg int result = 0, len, j; 7305b261ecSmrg int orig_x, orig_y; 7405b261ecSmrg XID orig_visual, tmp; 7505b261ecSmrg Bool parentIsRoot; 7605b261ecSmrg 7705b261ecSmrg REQUEST_AT_LEAST_SIZE(xCreateWindowReq); 7805b261ecSmrg 7905b261ecSmrg len = client->req_len - (sizeof(xCreateWindowReq) >> 2); 8005b261ecSmrg if (Ones(stuff->mask) != len) 8105b261ecSmrg return BadLength; 8205b261ecSmrg 8305b261ecSmrg if (!(parent = (PanoramiXRes *)SecurityLookupIDByType( 8405b261ecSmrg client, stuff->parent, XRT_WINDOW, DixWriteAccess))) 8505b261ecSmrg return BadWindow; 8605b261ecSmrg 8705b261ecSmrg if(stuff->class == CopyFromParent) 8805b261ecSmrg stuff->class = parent->u.win.class; 8905b261ecSmrg 9005b261ecSmrg if((stuff->class == InputOnly) && (stuff->mask & (~INPUTONLY_LEGAL_MASK))) 9105b261ecSmrg return BadMatch; 9205b261ecSmrg 9305b261ecSmrg if ((Mask)stuff->mask & CWBackPixmap) { 9405b261ecSmrg pback_offset = Ones((Mask)stuff->mask & (CWBackPixmap - 1)); 9505b261ecSmrg tmp = *((CARD32 *) &stuff[1] + pback_offset); 9605b261ecSmrg if ((tmp != None) && (tmp != ParentRelative)) { 9705b261ecSmrg if(!(backPix = (PanoramiXRes*) SecurityLookupIDByType( 9805b261ecSmrg client, tmp, XRT_PIXMAP, DixReadAccess))) 9905b261ecSmrg return BadPixmap; 10005b261ecSmrg } 10105b261ecSmrg } 10205b261ecSmrg if ((Mask)stuff->mask & CWBorderPixmap) { 10305b261ecSmrg pbord_offset = Ones((Mask)stuff->mask & (CWBorderPixmap - 1)); 10405b261ecSmrg tmp = *((CARD32 *) &stuff[1] + pbord_offset); 10505b261ecSmrg if (tmp != CopyFromParent) { 10605b261ecSmrg if(!(bordPix = (PanoramiXRes*) SecurityLookupIDByType( 10705b261ecSmrg client, tmp, XRT_PIXMAP, DixReadAccess))) 10805b261ecSmrg return BadPixmap; 10905b261ecSmrg } 11005b261ecSmrg } 11105b261ecSmrg if ((Mask)stuff->mask & CWColormap) { 11205b261ecSmrg cmap_offset = Ones((Mask)stuff->mask & (CWColormap - 1)); 11305b261ecSmrg tmp = *((CARD32 *) &stuff[1] + cmap_offset); 11405b261ecSmrg if ((tmp != CopyFromParent) && (tmp != None)) { 11505b261ecSmrg if(!(cmap = (PanoramiXRes*) SecurityLookupIDByType( 11605b261ecSmrg client, tmp, XRT_COLORMAP, DixReadAccess))) 11705b261ecSmrg return BadColor; 11805b261ecSmrg } 11905b261ecSmrg } 12005b261ecSmrg 12105b261ecSmrg if(!(newWin = (PanoramiXRes *) xalloc(sizeof(PanoramiXRes)))) 12205b261ecSmrg return BadAlloc; 12305b261ecSmrg 12405b261ecSmrg newWin->type = XRT_WINDOW; 12505b261ecSmrg newWin->u.win.visibility = VisibilityNotViewable; 12605b261ecSmrg newWin->u.win.class = stuff->class; 12705b261ecSmrg newWin->u.win.root = FALSE; 12805b261ecSmrg newWin->info[0].id = stuff->wid; 12905b261ecSmrg for(j = 1; j < PanoramiXNumScreens; j++) 13005b261ecSmrg newWin->info[j].id = FakeClientID(client->index); 13105b261ecSmrg 13205b261ecSmrg if (stuff->class == InputOnly) 13305b261ecSmrg stuff->visual = CopyFromParent; 13405b261ecSmrg orig_visual = stuff->visual; 13505b261ecSmrg orig_x = stuff->x; 13605b261ecSmrg orig_y = stuff->y; 13705b261ecSmrg parentIsRoot = (stuff->parent == WindowTable[0]->drawable.id) || 13805b261ecSmrg (stuff->parent == savedScreenInfo[0].wid); 13905b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 14005b261ecSmrg stuff->wid = newWin->info[j].id; 14105b261ecSmrg stuff->parent = parent->info[j].id; 14205b261ecSmrg if (parentIsRoot) { 14305b261ecSmrg stuff->x = orig_x - panoramiXdataPtr[j].x; 14405b261ecSmrg stuff->y = orig_y - panoramiXdataPtr[j].y; 14505b261ecSmrg } 14605b261ecSmrg if (backPix) 14705b261ecSmrg *((CARD32 *) &stuff[1] + pback_offset) = backPix->info[j].id; 14805b261ecSmrg if (bordPix) 14905b261ecSmrg *((CARD32 *) &stuff[1] + pbord_offset) = bordPix->info[j].id; 15005b261ecSmrg if (cmap) 15105b261ecSmrg *((CARD32 *) &stuff[1] + cmap_offset) = cmap->info[j].id; 15205b261ecSmrg if ( orig_visual != CopyFromParent ) 1534642e01fSmrg stuff->visual = PanoramiXTranslateVisualID(j, orig_visual); 15405b261ecSmrg result = (*SavedProcVector[X_CreateWindow])(client); 15505b261ecSmrg if(result != Success) break; 15605b261ecSmrg } 15705b261ecSmrg 15805b261ecSmrg if (result == Success) 15905b261ecSmrg AddResource(newWin->info[0].id, XRT_WINDOW, newWin); 16005b261ecSmrg else 16105b261ecSmrg xfree(newWin); 16205b261ecSmrg 16305b261ecSmrg return (result); 16405b261ecSmrg} 16505b261ecSmrg 16605b261ecSmrg 16705b261ecSmrgint PanoramiXChangeWindowAttributes(ClientPtr client) 16805b261ecSmrg{ 16905b261ecSmrg PanoramiXRes *win; 17005b261ecSmrg PanoramiXRes *backPix = NULL; 17105b261ecSmrg PanoramiXRes *bordPix = NULL; 17205b261ecSmrg PanoramiXRes *cmap = NULL; 17305b261ecSmrg REQUEST(xChangeWindowAttributesReq); 17405b261ecSmrg int pback_offset = 0, pbord_offset = 0, cmap_offset = 0; 17505b261ecSmrg int result = 0, len, j; 17605b261ecSmrg XID tmp; 17705b261ecSmrg 17805b261ecSmrg REQUEST_AT_LEAST_SIZE(xChangeWindowAttributesReq); 17905b261ecSmrg 18005b261ecSmrg len = client->req_len - (sizeof(xChangeWindowAttributesReq) >> 2); 18105b261ecSmrg if (Ones(stuff->valueMask) != len) 18205b261ecSmrg return BadLength; 18305b261ecSmrg 18405b261ecSmrg if (!(win = (PanoramiXRes *)SecurityLookupIDByType( 18505b261ecSmrg client, stuff->window, XRT_WINDOW, DixWriteAccess))) 18605b261ecSmrg return BadWindow; 18705b261ecSmrg 18805b261ecSmrg if((win->u.win.class == InputOnly) && 18905b261ecSmrg (stuff->valueMask & (~INPUTONLY_LEGAL_MASK))) 19005b261ecSmrg return BadMatch; 19105b261ecSmrg 19205b261ecSmrg if ((Mask)stuff->valueMask & CWBackPixmap) { 19305b261ecSmrg pback_offset = Ones((Mask)stuff->valueMask & (CWBackPixmap - 1)); 19405b261ecSmrg tmp = *((CARD32 *) &stuff[1] + pback_offset); 19505b261ecSmrg if ((tmp != None) && (tmp != ParentRelative)) { 19605b261ecSmrg if(!(backPix = (PanoramiXRes*) SecurityLookupIDByType( 19705b261ecSmrg client, tmp, XRT_PIXMAP, DixReadAccess))) 19805b261ecSmrg return BadPixmap; 19905b261ecSmrg } 20005b261ecSmrg } 20105b261ecSmrg if ((Mask)stuff->valueMask & CWBorderPixmap) { 20205b261ecSmrg pbord_offset = Ones((Mask)stuff->valueMask & (CWBorderPixmap - 1)); 20305b261ecSmrg tmp = *((CARD32 *) &stuff[1] + pbord_offset); 20405b261ecSmrg if (tmp != CopyFromParent) { 20505b261ecSmrg if(!(bordPix = (PanoramiXRes*) SecurityLookupIDByType( 20605b261ecSmrg client, tmp, XRT_PIXMAP, DixReadAccess))) 20705b261ecSmrg return BadPixmap; 20805b261ecSmrg } 20905b261ecSmrg } 21005b261ecSmrg if ((Mask)stuff->valueMask & CWColormap) { 21105b261ecSmrg cmap_offset = Ones((Mask)stuff->valueMask & (CWColormap - 1)); 21205b261ecSmrg tmp = *((CARD32 *) &stuff[1] + cmap_offset); 21305b261ecSmrg if ((tmp != CopyFromParent) && (tmp != None)) { 21405b261ecSmrg if(!(cmap = (PanoramiXRes*) SecurityLookupIDByType( 21505b261ecSmrg client, tmp, XRT_COLORMAP, DixReadAccess))) 21605b261ecSmrg return BadColor; 21705b261ecSmrg } 21805b261ecSmrg } 21905b261ecSmrg 22005b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 22105b261ecSmrg stuff->window = win->info[j].id; 22205b261ecSmrg if (backPix) 22305b261ecSmrg *((CARD32 *) &stuff[1] + pback_offset) = backPix->info[j].id; 22405b261ecSmrg if (bordPix) 22505b261ecSmrg *((CARD32 *) &stuff[1] + pbord_offset) = bordPix->info[j].id; 22605b261ecSmrg if (cmap) 22705b261ecSmrg *((CARD32 *) &stuff[1] + cmap_offset) = cmap->info[j].id; 22805b261ecSmrg result = (*SavedProcVector[X_ChangeWindowAttributes])(client); 22905b261ecSmrg } 23005b261ecSmrg 23105b261ecSmrg return (result); 23205b261ecSmrg} 23305b261ecSmrg 23405b261ecSmrg 23505b261ecSmrgint PanoramiXDestroyWindow(ClientPtr client) 23605b261ecSmrg{ 23705b261ecSmrg PanoramiXRes *win; 23805b261ecSmrg int result = 0, j; 23905b261ecSmrg REQUEST(xResourceReq); 24005b261ecSmrg 24105b261ecSmrg REQUEST_SIZE_MATCH(xResourceReq); 24205b261ecSmrg 24305b261ecSmrg if(!(win = (PanoramiXRes *)SecurityLookupIDByType( 24405b261ecSmrg client, stuff->id, XRT_WINDOW, DixDestroyAccess))) 24505b261ecSmrg return BadWindow; 24605b261ecSmrg 24705b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 24805b261ecSmrg stuff->id = win->info[j].id; 24905b261ecSmrg result = (*SavedProcVector[X_DestroyWindow])(client); 25005b261ecSmrg if(result != Success) break; 25105b261ecSmrg } 25205b261ecSmrg 25305b261ecSmrg /* Since ProcDestroyWindow is using FreeResource, it will free 25405b261ecSmrg our resource for us on the last pass through the loop above */ 25505b261ecSmrg 25605b261ecSmrg return (result); 25705b261ecSmrg} 25805b261ecSmrg 25905b261ecSmrg 26005b261ecSmrgint PanoramiXDestroySubwindows(ClientPtr client) 26105b261ecSmrg{ 26205b261ecSmrg PanoramiXRes *win; 26305b261ecSmrg int result = 0, j; 26405b261ecSmrg REQUEST(xResourceReq); 26505b261ecSmrg 26605b261ecSmrg REQUEST_SIZE_MATCH(xResourceReq); 26705b261ecSmrg 26805b261ecSmrg if(!(win = (PanoramiXRes *)SecurityLookupIDByType( 26905b261ecSmrg client, stuff->id, XRT_WINDOW, DixDestroyAccess))) 27005b261ecSmrg return BadWindow; 27105b261ecSmrg 27205b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 27305b261ecSmrg stuff->id = win->info[j].id; 27405b261ecSmrg result = (*SavedProcVector[X_DestroySubwindows])(client); 27505b261ecSmrg if(result != Success) break; 27605b261ecSmrg } 27705b261ecSmrg 27805b261ecSmrg /* DestroySubwindows is using FreeResource which will free 27905b261ecSmrg our resources for us on the last pass through the loop above */ 28005b261ecSmrg 28105b261ecSmrg return (result); 28205b261ecSmrg} 28305b261ecSmrg 28405b261ecSmrg 28505b261ecSmrgint PanoramiXChangeSaveSet(ClientPtr client) 28605b261ecSmrg{ 28705b261ecSmrg PanoramiXRes *win; 28805b261ecSmrg int result = 0, j; 28905b261ecSmrg REQUEST(xChangeSaveSetReq); 29005b261ecSmrg 29105b261ecSmrg REQUEST_SIZE_MATCH(xChangeSaveSetReq); 29205b261ecSmrg 29305b261ecSmrg if(!(win = (PanoramiXRes *)SecurityLookupIDByType( 29405b261ecSmrg client, stuff->window, XRT_WINDOW, DixReadAccess))) 29505b261ecSmrg return BadWindow; 29605b261ecSmrg 29705b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 29805b261ecSmrg stuff->window = win->info[j].id; 29905b261ecSmrg result = (*SavedProcVector[X_ChangeSaveSet])(client); 30005b261ecSmrg if(result != Success) break; 30105b261ecSmrg } 30205b261ecSmrg 30305b261ecSmrg return (result); 30405b261ecSmrg} 30505b261ecSmrg 30605b261ecSmrg 30705b261ecSmrgint PanoramiXReparentWindow(ClientPtr client) 30805b261ecSmrg{ 30905b261ecSmrg PanoramiXRes *win, *parent; 31005b261ecSmrg int result = 0, j; 31105b261ecSmrg int x, y; 31205b261ecSmrg Bool parentIsRoot; 31305b261ecSmrg REQUEST(xReparentWindowReq); 31405b261ecSmrg 31505b261ecSmrg REQUEST_SIZE_MATCH(xReparentWindowReq); 31605b261ecSmrg 31705b261ecSmrg if(!(win = (PanoramiXRes *)SecurityLookupIDByType( 31805b261ecSmrg client, stuff->window, XRT_WINDOW, DixWriteAccess))) 31905b261ecSmrg return BadWindow; 32005b261ecSmrg 32105b261ecSmrg if(!(parent = (PanoramiXRes *)SecurityLookupIDByType( 32205b261ecSmrg client, stuff->parent, XRT_WINDOW, DixWriteAccess))) 32305b261ecSmrg return BadWindow; 32405b261ecSmrg 32505b261ecSmrg x = stuff->x; 32605b261ecSmrg y = stuff->y; 32705b261ecSmrg parentIsRoot = (stuff->parent == WindowTable[0]->drawable.id) || 32805b261ecSmrg (stuff->parent == savedScreenInfo[0].wid); 32905b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 33005b261ecSmrg stuff->window = win->info[j].id; 33105b261ecSmrg stuff->parent = parent->info[j].id; 33205b261ecSmrg if(parentIsRoot) { 33305b261ecSmrg stuff->x = x - panoramiXdataPtr[j].x; 33405b261ecSmrg stuff->y = y - panoramiXdataPtr[j].y; 33505b261ecSmrg } 33605b261ecSmrg result = (*SavedProcVector[X_ReparentWindow])(client); 33705b261ecSmrg if(result != Success) break; 33805b261ecSmrg } 33905b261ecSmrg 34005b261ecSmrg return (result); 34105b261ecSmrg} 34205b261ecSmrg 34305b261ecSmrg 34405b261ecSmrgint PanoramiXMapWindow(ClientPtr client) 34505b261ecSmrg{ 34605b261ecSmrg PanoramiXRes *win; 34705b261ecSmrg int result = 0, j; 34805b261ecSmrg REQUEST(xResourceReq); 34905b261ecSmrg 35005b261ecSmrg REQUEST_SIZE_MATCH(xResourceReq); 35105b261ecSmrg 35205b261ecSmrg if(!(win = (PanoramiXRes *)SecurityLookupIDByType( 35305b261ecSmrg client, stuff->id, XRT_WINDOW, DixReadAccess))) 35405b261ecSmrg return BadWindow; 35505b261ecSmrg 35605b261ecSmrg FOR_NSCREENS_FORWARD(j) { 35705b261ecSmrg stuff->id = win->info[j].id; 35805b261ecSmrg result = (*SavedProcVector[X_MapWindow])(client); 35905b261ecSmrg if(result != Success) break; 36005b261ecSmrg } 36105b261ecSmrg 36205b261ecSmrg return (result); 36305b261ecSmrg} 36405b261ecSmrg 36505b261ecSmrg 36605b261ecSmrgint PanoramiXMapSubwindows(ClientPtr client) 36705b261ecSmrg{ 36805b261ecSmrg PanoramiXRes *win; 36905b261ecSmrg int result = 0, j; 37005b261ecSmrg REQUEST(xResourceReq); 37105b261ecSmrg 37205b261ecSmrg REQUEST_SIZE_MATCH(xResourceReq); 37305b261ecSmrg 37405b261ecSmrg if(!(win = (PanoramiXRes *)SecurityLookupIDByType( 37505b261ecSmrg client, stuff->id, XRT_WINDOW, DixReadAccess))) 37605b261ecSmrg return BadWindow; 37705b261ecSmrg 37805b261ecSmrg FOR_NSCREENS_FORWARD(j) { 37905b261ecSmrg stuff->id = win->info[j].id; 38005b261ecSmrg result = (*SavedProcVector[X_MapSubwindows])(client); 38105b261ecSmrg if(result != Success) break; 38205b261ecSmrg } 38305b261ecSmrg 38405b261ecSmrg return (result); 38505b261ecSmrg} 38605b261ecSmrg 38705b261ecSmrg 38805b261ecSmrgint PanoramiXUnmapWindow(ClientPtr client) 38905b261ecSmrg{ 39005b261ecSmrg PanoramiXRes *win; 39105b261ecSmrg int result = 0, j; 39205b261ecSmrg REQUEST(xResourceReq); 39305b261ecSmrg 39405b261ecSmrg REQUEST_SIZE_MATCH(xResourceReq); 39505b261ecSmrg 39605b261ecSmrg if(!(win = (PanoramiXRes *)SecurityLookupIDByType( 39705b261ecSmrg client, stuff->id, XRT_WINDOW, DixReadAccess))) 39805b261ecSmrg return BadWindow; 39905b261ecSmrg 40005b261ecSmrg FOR_NSCREENS_FORWARD(j) { 40105b261ecSmrg stuff->id = win->info[j].id; 40205b261ecSmrg result = (*SavedProcVector[X_UnmapWindow])(client); 40305b261ecSmrg if(result != Success) break; 40405b261ecSmrg } 40505b261ecSmrg 40605b261ecSmrg return (result); 40705b261ecSmrg} 40805b261ecSmrg 40905b261ecSmrg 41005b261ecSmrgint PanoramiXUnmapSubwindows(ClientPtr client) 41105b261ecSmrg{ 41205b261ecSmrg PanoramiXRes *win; 41305b261ecSmrg int result = 0, j; 41405b261ecSmrg REQUEST(xResourceReq); 41505b261ecSmrg 41605b261ecSmrg REQUEST_SIZE_MATCH(xResourceReq); 41705b261ecSmrg 41805b261ecSmrg if(!(win = (PanoramiXRes *)SecurityLookupIDByType( 41905b261ecSmrg client, stuff->id, XRT_WINDOW, DixReadAccess))) 42005b261ecSmrg return BadWindow; 42105b261ecSmrg 42205b261ecSmrg FOR_NSCREENS_FORWARD(j) { 42305b261ecSmrg stuff->id = win->info[j].id; 42405b261ecSmrg result = (*SavedProcVector[X_UnmapSubwindows])(client); 42505b261ecSmrg if(result != Success) break; 42605b261ecSmrg } 42705b261ecSmrg 42805b261ecSmrg return (result); 42905b261ecSmrg} 43005b261ecSmrg 43105b261ecSmrg 43205b261ecSmrgint PanoramiXConfigureWindow(ClientPtr client) 43305b261ecSmrg{ 43405b261ecSmrg PanoramiXRes *win; 43505b261ecSmrg PanoramiXRes *sib = NULL; 43605b261ecSmrg WindowPtr pWin; 43705b261ecSmrg int result = 0, j, len, sib_offset = 0, x = 0, y = 0; 43805b261ecSmrg int x_offset = -1; 43905b261ecSmrg int y_offset = -1; 44005b261ecSmrg REQUEST(xConfigureWindowReq); 44105b261ecSmrg 44205b261ecSmrg REQUEST_AT_LEAST_SIZE(xConfigureWindowReq); 44305b261ecSmrg 44405b261ecSmrg len = client->req_len - (sizeof(xConfigureWindowReq) >> 2); 44505b261ecSmrg if (Ones(stuff->mask) != len) 44605b261ecSmrg return BadLength; 44705b261ecSmrg 44805b261ecSmrg /* because we need the parent */ 44905b261ecSmrg if (!(pWin = (WindowPtr)SecurityLookupIDByType( 45005b261ecSmrg client, stuff->window, RT_WINDOW, DixWriteAccess))) 45105b261ecSmrg return BadWindow; 45205b261ecSmrg 45305b261ecSmrg if (!(win = (PanoramiXRes *)SecurityLookupIDByType( 45405b261ecSmrg client, stuff->window, XRT_WINDOW, DixWriteAccess))) 45505b261ecSmrg return BadWindow; 45605b261ecSmrg 45705b261ecSmrg if ((Mask)stuff->mask & CWSibling) { 45805b261ecSmrg XID tmp; 45905b261ecSmrg sib_offset = Ones((Mask)stuff->mask & (CWSibling - 1)); 46005b261ecSmrg if ((tmp = *((CARD32 *) &stuff[1] + sib_offset))) { 46105b261ecSmrg if(!(sib = (PanoramiXRes*) SecurityLookupIDByType( 46205b261ecSmrg client, tmp, XRT_WINDOW, DixReadAccess))) 46305b261ecSmrg return BadWindow; 46405b261ecSmrg } 46505b261ecSmrg } 46605b261ecSmrg 46705b261ecSmrg if(pWin->parent && ((pWin->parent == WindowTable[0]) || 46805b261ecSmrg (pWin->parent->drawable.id == savedScreenInfo[0].wid))) 46905b261ecSmrg { 47005b261ecSmrg if ((Mask)stuff->mask & CWX) { 47105b261ecSmrg x_offset = 0; 47205b261ecSmrg x = *((CARD32 *)&stuff[1]); 47305b261ecSmrg } 47405b261ecSmrg if ((Mask)stuff->mask & CWY) { 47505b261ecSmrg y_offset = (x_offset == -1) ? 0 : 1; 47605b261ecSmrg y = *((CARD32 *) &stuff[1] + y_offset); 47705b261ecSmrg } 47805b261ecSmrg } 47905b261ecSmrg 48005b261ecSmrg /* have to go forward or you get expose events before 48105b261ecSmrg ConfigureNotify events */ 48205b261ecSmrg FOR_NSCREENS_FORWARD(j) { 48305b261ecSmrg stuff->window = win->info[j].id; 48405b261ecSmrg if(sib) 48505b261ecSmrg *((CARD32 *) &stuff[1] + sib_offset) = sib->info[j].id; 48605b261ecSmrg if(x_offset >= 0) 48705b261ecSmrg *((CARD32 *) &stuff[1] + x_offset) = x - panoramiXdataPtr[j].x; 48805b261ecSmrg if(y_offset >= 0) 48905b261ecSmrg *((CARD32 *) &stuff[1] + y_offset) = y - panoramiXdataPtr[j].y; 49005b261ecSmrg result = (*SavedProcVector[X_ConfigureWindow])(client); 49105b261ecSmrg if(result != Success) break; 49205b261ecSmrg } 49305b261ecSmrg 49405b261ecSmrg return (result); 49505b261ecSmrg} 49605b261ecSmrg 49705b261ecSmrg 49805b261ecSmrgint PanoramiXCirculateWindow(ClientPtr client) 49905b261ecSmrg{ 50005b261ecSmrg PanoramiXRes *win; 50105b261ecSmrg int result = 0, j; 50205b261ecSmrg REQUEST(xCirculateWindowReq); 50305b261ecSmrg 50405b261ecSmrg REQUEST_SIZE_MATCH(xCirculateWindowReq); 50505b261ecSmrg 50605b261ecSmrg if(!(win = (PanoramiXRes *)SecurityLookupIDByType( 50705b261ecSmrg client, stuff->window, XRT_WINDOW, DixWriteAccess))) 50805b261ecSmrg return BadWindow; 50905b261ecSmrg 51005b261ecSmrg FOR_NSCREENS_FORWARD(j) { 51105b261ecSmrg stuff->window = win->info[j].id; 51205b261ecSmrg result = (*SavedProcVector[X_CirculateWindow])(client); 51305b261ecSmrg if(result != Success) break; 51405b261ecSmrg } 51505b261ecSmrg 51605b261ecSmrg return (result); 51705b261ecSmrg} 51805b261ecSmrg 51905b261ecSmrg 52005b261ecSmrgint PanoramiXGetGeometry(ClientPtr client) 52105b261ecSmrg{ 52205b261ecSmrg xGetGeometryReply rep; 52305b261ecSmrg DrawablePtr pDraw; 52405b261ecSmrg int rc; 52505b261ecSmrg REQUEST(xResourceReq); 52605b261ecSmrg 52705b261ecSmrg REQUEST_SIZE_MATCH(xResourceReq); 5284642e01fSmrg rc = dixLookupDrawable(&pDraw, stuff->id, client, M_ANY, DixGetAttrAccess); 52905b261ecSmrg if (rc != Success) 53005b261ecSmrg return rc; 53105b261ecSmrg 53205b261ecSmrg rep.type = X_Reply; 53305b261ecSmrg rep.length = 0; 53405b261ecSmrg rep.sequenceNumber = client->sequence; 53505b261ecSmrg rep.root = WindowTable[0]->drawable.id; 53605b261ecSmrg rep.depth = pDraw->depth; 53705b261ecSmrg rep.width = pDraw->width; 53805b261ecSmrg rep.height = pDraw->height; 53905b261ecSmrg rep.x = rep.y = rep.borderWidth = 0; 54005b261ecSmrg 54105b261ecSmrg if (stuff->id == rep.root) { 54205b261ecSmrg xWindowRoot *root = (xWindowRoot *) 54305b261ecSmrg (ConnectionInfo + connBlockScreenStart); 54405b261ecSmrg 54505b261ecSmrg rep.width = root->pixWidth; 54605b261ecSmrg rep.height = root->pixHeight; 54705b261ecSmrg } else 54805b261ecSmrg if ((pDraw->type == UNDRAWABLE_WINDOW) || (pDraw->type == DRAWABLE_WINDOW)) 54905b261ecSmrg { 55005b261ecSmrg WindowPtr pWin = (WindowPtr)pDraw; 55105b261ecSmrg rep.x = pWin->origin.x - wBorderWidth (pWin); 55205b261ecSmrg rep.y = pWin->origin.y - wBorderWidth (pWin); 55305b261ecSmrg if((pWin->parent == WindowTable[0]) || 55405b261ecSmrg (pWin->parent->drawable.id == savedScreenInfo[0].wid)) 55505b261ecSmrg { 55605b261ecSmrg rep.x += panoramiXdataPtr[0].x; 55705b261ecSmrg rep.y += panoramiXdataPtr[0].y; 55805b261ecSmrg } 55905b261ecSmrg rep.borderWidth = pWin->borderWidth; 56005b261ecSmrg } 56105b261ecSmrg 56205b261ecSmrg WriteReplyToClient(client, sizeof(xGetGeometryReply), &rep); 56305b261ecSmrg return (client->noClientException); 56405b261ecSmrg} 56505b261ecSmrg 56605b261ecSmrgint PanoramiXTranslateCoords(ClientPtr client) 56705b261ecSmrg{ 56805b261ecSmrg INT16 x, y; 56905b261ecSmrg REQUEST(xTranslateCoordsReq); 57005b261ecSmrg int rc; 57105b261ecSmrg WindowPtr pWin, pDst; 57205b261ecSmrg xTranslateCoordsReply rep; 57305b261ecSmrg 57405b261ecSmrg REQUEST_SIZE_MATCH(xTranslateCoordsReq); 57505b261ecSmrg rc = dixLookupWindow(&pWin, stuff->srcWid, client, DixReadAccess); 57605b261ecSmrg if (rc != Success) 57705b261ecSmrg return rc; 57805b261ecSmrg rc = dixLookupWindow(&pDst, stuff->dstWid, client, DixReadAccess); 57905b261ecSmrg if (rc != Success) 58005b261ecSmrg return rc; 58105b261ecSmrg rep.type = X_Reply; 58205b261ecSmrg rep.length = 0; 58305b261ecSmrg rep.sequenceNumber = client->sequence; 58405b261ecSmrg rep.sameScreen = xTrue; 58505b261ecSmrg rep.child = None; 58605b261ecSmrg 58705b261ecSmrg if((pWin == WindowTable[0]) || 58805b261ecSmrg (pWin->drawable.id == savedScreenInfo[0].wid)) 58905b261ecSmrg { 59005b261ecSmrg x = stuff->srcX - panoramiXdataPtr[0].x; 59105b261ecSmrg y = stuff->srcY - panoramiXdataPtr[0].y; 59205b261ecSmrg } else { 59305b261ecSmrg x = pWin->drawable.x + stuff->srcX; 59405b261ecSmrg y = pWin->drawable.y + stuff->srcY; 59505b261ecSmrg } 59605b261ecSmrg pWin = pDst->firstChild; 59705b261ecSmrg while (pWin) { 59805b261ecSmrg BoxRec box; 59905b261ecSmrg if ((pWin->mapped) && 60005b261ecSmrg (x >= pWin->drawable.x - wBorderWidth (pWin)) && 60105b261ecSmrg (x < pWin->drawable.x + (int)pWin->drawable.width + 60205b261ecSmrg wBorderWidth (pWin)) && 60305b261ecSmrg (y >= pWin->drawable.y - wBorderWidth (pWin)) && 60405b261ecSmrg (y < pWin->drawable.y + (int)pWin->drawable.height + 60505b261ecSmrg wBorderWidth (pWin)) 60605b261ecSmrg /* When a window is shaped, a further check 60705b261ecSmrg * is made to see if the point is inside 60805b261ecSmrg * borderSize 60905b261ecSmrg */ 61005b261ecSmrg && (!wBoundingShape(pWin) || 61105b261ecSmrg POINT_IN_REGION(pWin->drawable.pScreen, 61205b261ecSmrg wBoundingShape(pWin), 61305b261ecSmrg x - pWin->drawable.x, 61405b261ecSmrg y - pWin->drawable.y, &box)) 61505b261ecSmrg ) 61605b261ecSmrg { 61705b261ecSmrg rep.child = pWin->drawable.id; 61805b261ecSmrg pWin = (WindowPtr) NULL; 61905b261ecSmrg } 62005b261ecSmrg else 62105b261ecSmrg pWin = pWin->nextSib; 62205b261ecSmrg } 62305b261ecSmrg rep.dstX = x - pDst->drawable.x; 62405b261ecSmrg rep.dstY = y - pDst->drawable.y; 62505b261ecSmrg if((pDst == WindowTable[0]) || 62605b261ecSmrg (pDst->drawable.id == savedScreenInfo[0].wid)) 62705b261ecSmrg { 62805b261ecSmrg rep.dstX += panoramiXdataPtr[0].x; 62905b261ecSmrg rep.dstY += panoramiXdataPtr[0].y; 63005b261ecSmrg } 63105b261ecSmrg 63205b261ecSmrg WriteReplyToClient(client, sizeof(xTranslateCoordsReply), &rep); 63305b261ecSmrg return(client->noClientException); 63405b261ecSmrg} 63505b261ecSmrg 63605b261ecSmrgint PanoramiXCreatePixmap(ClientPtr client) 63705b261ecSmrg{ 63805b261ecSmrg PanoramiXRes *refDraw, *newPix; 63905b261ecSmrg int result = 0, j; 64005b261ecSmrg REQUEST(xCreatePixmapReq); 64105b261ecSmrg 64205b261ecSmrg REQUEST_SIZE_MATCH(xCreatePixmapReq); 64305b261ecSmrg client->errorValue = stuff->pid; 64405b261ecSmrg 64505b261ecSmrg if(!(refDraw = (PanoramiXRes *)SecurityLookupIDByClass( 64605b261ecSmrg client, stuff->drawable, XRC_DRAWABLE, DixReadAccess))) 64705b261ecSmrg return BadDrawable; 64805b261ecSmrg 64905b261ecSmrg if(!(newPix = (PanoramiXRes *) xalloc(sizeof(PanoramiXRes)))) 65005b261ecSmrg return BadAlloc; 65105b261ecSmrg 65205b261ecSmrg newPix->type = XRT_PIXMAP; 65305b261ecSmrg newPix->u.pix.shared = FALSE; 65405b261ecSmrg newPix->info[0].id = stuff->pid; 65505b261ecSmrg for(j = 1; j < PanoramiXNumScreens; j++) 65605b261ecSmrg newPix->info[j].id = FakeClientID(client->index); 65705b261ecSmrg 65805b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 65905b261ecSmrg stuff->pid = newPix->info[j].id; 66005b261ecSmrg stuff->drawable = refDraw->info[j].id; 66105b261ecSmrg result = (*SavedProcVector[X_CreatePixmap])(client); 66205b261ecSmrg if(result != Success) break; 66305b261ecSmrg } 66405b261ecSmrg 66505b261ecSmrg if (result == Success) 66605b261ecSmrg AddResource(newPix->info[0].id, XRT_PIXMAP, newPix); 66705b261ecSmrg else 66805b261ecSmrg xfree(newPix); 66905b261ecSmrg 67005b261ecSmrg return (result); 67105b261ecSmrg} 67205b261ecSmrg 67305b261ecSmrg 67405b261ecSmrgint PanoramiXFreePixmap(ClientPtr client) 67505b261ecSmrg{ 67605b261ecSmrg PanoramiXRes *pix; 67705b261ecSmrg int result = 0, j; 67805b261ecSmrg REQUEST(xResourceReq); 67905b261ecSmrg 68005b261ecSmrg REQUEST_SIZE_MATCH(xResourceReq); 68105b261ecSmrg 68205b261ecSmrg client->errorValue = stuff->id; 68305b261ecSmrg 68405b261ecSmrg if(!(pix = (PanoramiXRes *)SecurityLookupIDByType( 68505b261ecSmrg client, stuff->id, XRT_PIXMAP, DixDestroyAccess))) 68605b261ecSmrg return BadPixmap; 68705b261ecSmrg 68805b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 68905b261ecSmrg stuff->id = pix->info[j].id; 69005b261ecSmrg result = (*SavedProcVector[X_FreePixmap])(client); 69105b261ecSmrg if(result != Success) break; 69205b261ecSmrg } 69305b261ecSmrg 69405b261ecSmrg /* Since ProcFreePixmap is using FreeResource, it will free 69505b261ecSmrg our resource for us on the last pass through the loop above */ 69605b261ecSmrg 69705b261ecSmrg return (result); 69805b261ecSmrg} 69905b261ecSmrg 70005b261ecSmrg 70105b261ecSmrgint PanoramiXCreateGC(ClientPtr client) 70205b261ecSmrg{ 70305b261ecSmrg PanoramiXRes *refDraw; 70405b261ecSmrg PanoramiXRes *newGC; 70505b261ecSmrg PanoramiXRes *stip = NULL; 70605b261ecSmrg PanoramiXRes *tile = NULL; 70705b261ecSmrg PanoramiXRes *clip = NULL; 70805b261ecSmrg REQUEST(xCreateGCReq); 70905b261ecSmrg int tile_offset = 0, stip_offset = 0, clip_offset = 0; 71005b261ecSmrg int result = 0, len, j; 71105b261ecSmrg XID tmp; 71205b261ecSmrg 71305b261ecSmrg REQUEST_AT_LEAST_SIZE(xCreateGCReq); 71405b261ecSmrg 71505b261ecSmrg client->errorValue = stuff->gc; 71605b261ecSmrg len = client->req_len - (sizeof(xCreateGCReq) >> 2); 71705b261ecSmrg if (Ones(stuff->mask) != len) 71805b261ecSmrg return BadLength; 71905b261ecSmrg 72005b261ecSmrg if (!(refDraw = (PanoramiXRes *)SecurityLookupIDByClass( 72105b261ecSmrg client, stuff->drawable, XRC_DRAWABLE, DixReadAccess))) 72205b261ecSmrg return BadDrawable; 72305b261ecSmrg 72405b261ecSmrg if ((Mask)stuff->mask & GCTile) { 72505b261ecSmrg tile_offset = Ones((Mask)stuff->mask & (GCTile - 1)); 72605b261ecSmrg if ((tmp = *((CARD32 *) &stuff[1] + tile_offset))) { 72705b261ecSmrg if(!(tile = (PanoramiXRes*) SecurityLookupIDByType( 72805b261ecSmrg client, tmp, XRT_PIXMAP, DixReadAccess))) 72905b261ecSmrg return BadPixmap; 73005b261ecSmrg } 73105b261ecSmrg } 73205b261ecSmrg if ((Mask)stuff->mask & GCStipple) { 73305b261ecSmrg stip_offset = Ones((Mask)stuff->mask & (GCStipple - 1)); 73405b261ecSmrg if ((tmp = *((CARD32 *) &stuff[1] + stip_offset))) { 73505b261ecSmrg if(!(stip = (PanoramiXRes*) SecurityLookupIDByType( 73605b261ecSmrg client, tmp, XRT_PIXMAP, DixReadAccess))) 73705b261ecSmrg return BadPixmap; 73805b261ecSmrg } 73905b261ecSmrg } 74005b261ecSmrg if ((Mask)stuff->mask & GCClipMask) { 74105b261ecSmrg clip_offset = Ones((Mask)stuff->mask & (GCClipMask - 1)); 74205b261ecSmrg if ((tmp = *((CARD32 *) &stuff[1] + clip_offset))) { 74305b261ecSmrg if(!(clip = (PanoramiXRes*) SecurityLookupIDByType( 74405b261ecSmrg client, tmp, XRT_PIXMAP, DixReadAccess))) 74505b261ecSmrg return BadPixmap; 74605b261ecSmrg } 74705b261ecSmrg } 74805b261ecSmrg 74905b261ecSmrg if(!(newGC = (PanoramiXRes *) xalloc(sizeof(PanoramiXRes)))) 75005b261ecSmrg return BadAlloc; 75105b261ecSmrg 75205b261ecSmrg newGC->type = XRT_GC; 75305b261ecSmrg newGC->info[0].id = stuff->gc; 75405b261ecSmrg for(j = 1; j < PanoramiXNumScreens; j++) 75505b261ecSmrg newGC->info[j].id = FakeClientID(client->index); 75605b261ecSmrg 75705b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 75805b261ecSmrg stuff->gc = newGC->info[j].id; 75905b261ecSmrg stuff->drawable = refDraw->info[j].id; 76005b261ecSmrg if (tile) 76105b261ecSmrg *((CARD32 *) &stuff[1] + tile_offset) = tile->info[j].id; 76205b261ecSmrg if (stip) 76305b261ecSmrg *((CARD32 *) &stuff[1] + stip_offset) = stip->info[j].id; 76405b261ecSmrg if (clip) 76505b261ecSmrg *((CARD32 *) &stuff[1] + clip_offset) = clip->info[j].id; 76605b261ecSmrg result = (*SavedProcVector[X_CreateGC])(client); 76705b261ecSmrg if(result != Success) break; 76805b261ecSmrg } 76905b261ecSmrg 77005b261ecSmrg if (result == Success) 77105b261ecSmrg AddResource(newGC->info[0].id, XRT_GC, newGC); 77205b261ecSmrg else 77305b261ecSmrg xfree(newGC); 77405b261ecSmrg 77505b261ecSmrg return (result); 77605b261ecSmrg} 77705b261ecSmrg 77805b261ecSmrgint PanoramiXChangeGC(ClientPtr client) 77905b261ecSmrg{ 78005b261ecSmrg PanoramiXRes *gc; 78105b261ecSmrg PanoramiXRes *stip = NULL; 78205b261ecSmrg PanoramiXRes *tile = NULL; 78305b261ecSmrg PanoramiXRes *clip = NULL; 78405b261ecSmrg REQUEST(xChangeGCReq); 78505b261ecSmrg int tile_offset = 0, stip_offset = 0, clip_offset = 0; 78605b261ecSmrg int result = 0, len, j; 78705b261ecSmrg XID tmp; 78805b261ecSmrg 78905b261ecSmrg REQUEST_AT_LEAST_SIZE(xChangeGCReq); 79005b261ecSmrg 79105b261ecSmrg len = client->req_len - (sizeof(xChangeGCReq) >> 2); 79205b261ecSmrg if (Ones(stuff->mask) != len) 79305b261ecSmrg return BadLength; 79405b261ecSmrg 79505b261ecSmrg if (!(gc = (PanoramiXRes *)SecurityLookupIDByType( 79605b261ecSmrg client, stuff->gc, XRT_GC, DixReadAccess))) 79705b261ecSmrg return BadGC; 79805b261ecSmrg 79905b261ecSmrg if ((Mask)stuff->mask & GCTile) { 80005b261ecSmrg tile_offset = Ones((Mask)stuff->mask & (GCTile - 1)); 80105b261ecSmrg if ((tmp = *((CARD32 *) &stuff[1] + tile_offset))) { 80205b261ecSmrg if(!(tile = (PanoramiXRes*) SecurityLookupIDByType( 80305b261ecSmrg client, tmp, XRT_PIXMAP, DixReadAccess))) 80405b261ecSmrg return BadPixmap; 80505b261ecSmrg } 80605b261ecSmrg } 80705b261ecSmrg if ((Mask)stuff->mask & GCStipple) { 80805b261ecSmrg stip_offset = Ones((Mask)stuff->mask & (GCStipple - 1)); 80905b261ecSmrg if ((tmp = *((CARD32 *) &stuff[1] + stip_offset))) { 81005b261ecSmrg if(!(stip = (PanoramiXRes*) SecurityLookupIDByType( 81105b261ecSmrg client, tmp, XRT_PIXMAP, DixReadAccess))) 81205b261ecSmrg return BadPixmap; 81305b261ecSmrg } 81405b261ecSmrg } 81505b261ecSmrg if ((Mask)stuff->mask & GCClipMask) { 81605b261ecSmrg clip_offset = Ones((Mask)stuff->mask & (GCClipMask - 1)); 81705b261ecSmrg if ((tmp = *((CARD32 *) &stuff[1] + clip_offset))) { 81805b261ecSmrg if(!(clip = (PanoramiXRes*) SecurityLookupIDByType( 81905b261ecSmrg client, tmp, XRT_PIXMAP, DixReadAccess))) 82005b261ecSmrg return BadPixmap; 82105b261ecSmrg } 82205b261ecSmrg } 82305b261ecSmrg 82405b261ecSmrg 82505b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 82605b261ecSmrg stuff->gc = gc->info[j].id; 82705b261ecSmrg if (tile) 82805b261ecSmrg *((CARD32 *) &stuff[1] + tile_offset) = tile->info[j].id; 82905b261ecSmrg if (stip) 83005b261ecSmrg *((CARD32 *) &stuff[1] + stip_offset) = stip->info[j].id; 83105b261ecSmrg if (clip) 83205b261ecSmrg *((CARD32 *) &stuff[1] + clip_offset) = clip->info[j].id; 83305b261ecSmrg result = (*SavedProcVector[X_ChangeGC])(client); 83405b261ecSmrg if(result != Success) break; 83505b261ecSmrg } 83605b261ecSmrg 83705b261ecSmrg return (result); 83805b261ecSmrg} 83905b261ecSmrg 84005b261ecSmrg 84105b261ecSmrgint PanoramiXCopyGC(ClientPtr client) 84205b261ecSmrg{ 84305b261ecSmrg PanoramiXRes *srcGC, *dstGC; 84405b261ecSmrg int result = 0, j; 84505b261ecSmrg REQUEST(xCopyGCReq); 84605b261ecSmrg 84705b261ecSmrg REQUEST_SIZE_MATCH(xCopyGCReq); 84805b261ecSmrg 84905b261ecSmrg if(!(srcGC = (PanoramiXRes *)SecurityLookupIDByType( 85005b261ecSmrg client, stuff->srcGC, XRT_GC, DixReadAccess))) 85105b261ecSmrg return BadGC; 85205b261ecSmrg 85305b261ecSmrg if(!(dstGC = (PanoramiXRes *)SecurityLookupIDByType( 85405b261ecSmrg client, stuff->dstGC, XRT_GC, DixWriteAccess))) 85505b261ecSmrg return BadGC; 85605b261ecSmrg 85705b261ecSmrg FOR_NSCREENS(j) { 85805b261ecSmrg stuff->srcGC = srcGC->info[j].id; 85905b261ecSmrg stuff->dstGC = dstGC->info[j].id; 86005b261ecSmrg result = (*SavedProcVector[X_CopyGC])(client); 86105b261ecSmrg if(result != Success) break; 86205b261ecSmrg } 86305b261ecSmrg 86405b261ecSmrg return (result); 86505b261ecSmrg} 86605b261ecSmrg 86705b261ecSmrg 86805b261ecSmrgint PanoramiXSetDashes(ClientPtr client) 86905b261ecSmrg{ 87005b261ecSmrg PanoramiXRes *gc; 87105b261ecSmrg int result = 0, j; 87205b261ecSmrg REQUEST(xSetDashesReq); 87305b261ecSmrg 87405b261ecSmrg REQUEST_FIXED_SIZE(xSetDashesReq, stuff->nDashes); 87505b261ecSmrg 87605b261ecSmrg if(!(gc = (PanoramiXRes *)SecurityLookupIDByType( 87705b261ecSmrg client, stuff->gc, XRT_GC, DixWriteAccess))) 87805b261ecSmrg return BadGC; 87905b261ecSmrg 88005b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 88105b261ecSmrg stuff->gc = gc->info[j].id; 88205b261ecSmrg result = (*SavedProcVector[X_SetDashes])(client); 88305b261ecSmrg if(result != Success) break; 88405b261ecSmrg } 88505b261ecSmrg 88605b261ecSmrg return (result); 88705b261ecSmrg} 88805b261ecSmrg 88905b261ecSmrg 89005b261ecSmrgint PanoramiXSetClipRectangles(ClientPtr client) 89105b261ecSmrg{ 89205b261ecSmrg PanoramiXRes *gc; 89305b261ecSmrg int result = 0, j; 89405b261ecSmrg REQUEST(xSetClipRectanglesReq); 89505b261ecSmrg 89605b261ecSmrg REQUEST_AT_LEAST_SIZE(xSetClipRectanglesReq); 89705b261ecSmrg 89805b261ecSmrg if(!(gc = (PanoramiXRes *)SecurityLookupIDByType( 89905b261ecSmrg client, stuff->gc, XRT_GC, DixWriteAccess))) 90005b261ecSmrg return BadGC; 90105b261ecSmrg 90205b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 90305b261ecSmrg stuff->gc = gc->info[j].id; 90405b261ecSmrg result = (*SavedProcVector[X_SetClipRectangles])(client); 90505b261ecSmrg if(result != Success) break; 90605b261ecSmrg } 90705b261ecSmrg 90805b261ecSmrg return (result); 90905b261ecSmrg} 91005b261ecSmrg 91105b261ecSmrg 91205b261ecSmrgint PanoramiXFreeGC(ClientPtr client) 91305b261ecSmrg{ 91405b261ecSmrg PanoramiXRes *gc; 91505b261ecSmrg int result = 0, j; 91605b261ecSmrg REQUEST(xResourceReq); 91705b261ecSmrg 91805b261ecSmrg REQUEST_SIZE_MATCH(xResourceReq); 91905b261ecSmrg 92005b261ecSmrg if(!(gc = (PanoramiXRes *)SecurityLookupIDByType( 92105b261ecSmrg client, stuff->id, XRT_GC, DixDestroyAccess))) 92205b261ecSmrg return BadGC; 92305b261ecSmrg 92405b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 92505b261ecSmrg stuff->id = gc->info[j].id; 92605b261ecSmrg result = (*SavedProcVector[X_FreeGC])(client); 92705b261ecSmrg if(result != Success) break; 92805b261ecSmrg } 92905b261ecSmrg 93005b261ecSmrg /* Since ProcFreeGC is using FreeResource, it will free 93105b261ecSmrg our resource for us on the last pass through the loop above */ 93205b261ecSmrg 93305b261ecSmrg return (result); 93405b261ecSmrg} 93505b261ecSmrg 93605b261ecSmrg 93705b261ecSmrgint PanoramiXClearToBackground(ClientPtr client) 93805b261ecSmrg{ 93905b261ecSmrg PanoramiXRes *win; 94005b261ecSmrg int result = 0, j, x, y; 94105b261ecSmrg Bool isRoot; 94205b261ecSmrg REQUEST(xClearAreaReq); 94305b261ecSmrg 94405b261ecSmrg REQUEST_SIZE_MATCH(xClearAreaReq); 94505b261ecSmrg 94605b261ecSmrg if(!(win = (PanoramiXRes *)SecurityLookupIDByType( 94705b261ecSmrg client, stuff->window, XRT_WINDOW, DixWriteAccess))) 94805b261ecSmrg return BadWindow; 94905b261ecSmrg 95005b261ecSmrg x = stuff->x; 95105b261ecSmrg y = stuff->y; 95205b261ecSmrg isRoot = win->u.win.root; 95305b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 95405b261ecSmrg stuff->window = win->info[j].id; 95505b261ecSmrg if(isRoot) { 95605b261ecSmrg stuff->x = x - panoramiXdataPtr[j].x; 95705b261ecSmrg stuff->y = y - panoramiXdataPtr[j].y; 95805b261ecSmrg } 95905b261ecSmrg result = (*SavedProcVector[X_ClearArea])(client); 96005b261ecSmrg if(result != Success) break; 96105b261ecSmrg } 96205b261ecSmrg 96305b261ecSmrg return (result); 96405b261ecSmrg} 96505b261ecSmrg 96605b261ecSmrg 96705b261ecSmrg/* 96805b261ecSmrg For Window to Pixmap copies you're screwed since each screen's 96905b261ecSmrg pixmap will look like what it sees on its screen. Unless the 97005b261ecSmrg screens overlap and the window lies on each, the two copies 97105b261ecSmrg will be out of sync. To remedy this we do a GetImage and PutImage 97205b261ecSmrg in place of the copy. Doing this as a single Image isn't quite 97305b261ecSmrg correct since it will include the obscured areas but we will 97405b261ecSmrg have to fix this later. (MArk). 97505b261ecSmrg*/ 97605b261ecSmrg 97705b261ecSmrgint PanoramiXCopyArea(ClientPtr client) 97805b261ecSmrg{ 97905b261ecSmrg int j, result = 0, srcx, srcy, dstx, dsty; 98005b261ecSmrg PanoramiXRes *gc, *src, *dst; 98105b261ecSmrg Bool srcIsRoot = FALSE; 98205b261ecSmrg Bool dstIsRoot = FALSE; 98305b261ecSmrg Bool srcShared, dstShared; 98405b261ecSmrg REQUEST(xCopyAreaReq); 98505b261ecSmrg 98605b261ecSmrg REQUEST_SIZE_MATCH(xCopyAreaReq); 98705b261ecSmrg 98805b261ecSmrg if(!(src = (PanoramiXRes *)SecurityLookupIDByClass( 98905b261ecSmrg client, stuff->srcDrawable, XRC_DRAWABLE, DixReadAccess))) 99005b261ecSmrg return BadDrawable; 99105b261ecSmrg 99205b261ecSmrg srcShared = IS_SHARED_PIXMAP(src); 99305b261ecSmrg 99405b261ecSmrg if(!(dst = (PanoramiXRes *)SecurityLookupIDByClass( 99505b261ecSmrg client, stuff->dstDrawable, XRC_DRAWABLE, DixWriteAccess))) 99605b261ecSmrg return BadDrawable; 99705b261ecSmrg 99805b261ecSmrg dstShared = IS_SHARED_PIXMAP(dst); 99905b261ecSmrg 100005b261ecSmrg if(dstShared && srcShared) 100105b261ecSmrg return (* SavedProcVector[X_CopyArea])(client); 100205b261ecSmrg 100305b261ecSmrg if(!(gc = (PanoramiXRes *)SecurityLookupIDByType( 100405b261ecSmrg client, stuff->gc, XRT_GC, DixReadAccess))) 100505b261ecSmrg return BadGC; 100605b261ecSmrg 100705b261ecSmrg if((dst->type == XRT_WINDOW) && dst->u.win.root) 100805b261ecSmrg dstIsRoot = TRUE; 100905b261ecSmrg if((src->type == XRT_WINDOW) && src->u.win.root) 101005b261ecSmrg srcIsRoot = TRUE; 101105b261ecSmrg 101205b261ecSmrg srcx = stuff->srcX; srcy = stuff->srcY; 101305b261ecSmrg dstx = stuff->dstX; dsty = stuff->dstY; 101405b261ecSmrg if((dst->type == XRT_PIXMAP) && (src->type == XRT_WINDOW)) { 101505b261ecSmrg DrawablePtr drawables[MAXSCREENS]; 101605b261ecSmrg DrawablePtr pDst; 101705b261ecSmrg GCPtr pGC; 101805b261ecSmrg char *data; 101905b261ecSmrg int pitch, rc; 102005b261ecSmrg 102105b261ecSmrg FOR_NSCREENS(j) { 102205b261ecSmrg rc = dixLookupDrawable(drawables+j, src->info[j].id, client, 0, 10234642e01fSmrg DixGetAttrAccess); 102405b261ecSmrg if (rc != Success) 102505b261ecSmrg return rc; 102605b261ecSmrg } 102705b261ecSmrg 102805b261ecSmrg pitch = PixmapBytePad(stuff->width, drawables[0]->depth); 102905b261ecSmrg if(!(data = xcalloc(1, stuff->height * pitch))) 103005b261ecSmrg return BadAlloc; 103105b261ecSmrg 103205b261ecSmrg XineramaGetImageData(drawables, srcx, srcy, 103305b261ecSmrg stuff->width, stuff->height, ZPixmap, ~0, data, pitch, 103405b261ecSmrg srcIsRoot); 103505b261ecSmrg 103605b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 103705b261ecSmrg stuff->gc = gc->info[j].id; 10384642e01fSmrg VALIDATE_DRAWABLE_AND_GC(dst->info[j].id, pDst, DixWriteAccess); 103905b261ecSmrg if(drawables[0]->depth != pDst->depth) { 104005b261ecSmrg client->errorValue = stuff->dstDrawable; 104105b261ecSmrg xfree(data); 104205b261ecSmrg return (BadMatch); 104305b261ecSmrg } 104405b261ecSmrg 104505b261ecSmrg (*pGC->ops->PutImage) (pDst, pGC, pDst->depth, dstx, dsty, 104605b261ecSmrg stuff->width, stuff->height, 104705b261ecSmrg 0, ZPixmap, data); 104805b261ecSmrg 104905b261ecSmrg if(dstShared) break; 105005b261ecSmrg } 105105b261ecSmrg 105205b261ecSmrg xfree(data); 105305b261ecSmrg 105405b261ecSmrg result = Success; 105505b261ecSmrg } else { 105605b261ecSmrg DrawablePtr pDst = NULL, pSrc = NULL; 105705b261ecSmrg GCPtr pGC = NULL; 105805b261ecSmrg RegionPtr pRgn[MAXSCREENS]; 105905b261ecSmrg int rc; 106005b261ecSmrg 106105b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 106205b261ecSmrg stuff->dstDrawable = dst->info[j].id; 106305b261ecSmrg stuff->srcDrawable = src->info[j].id; 106405b261ecSmrg stuff->gc = gc->info[j].id; 106505b261ecSmrg if (srcIsRoot) { 106605b261ecSmrg stuff->srcX = srcx - panoramiXdataPtr[j].x; 106705b261ecSmrg stuff->srcY = srcy - panoramiXdataPtr[j].y; 106805b261ecSmrg } 106905b261ecSmrg if (dstIsRoot) { 107005b261ecSmrg stuff->dstX = dstx - panoramiXdataPtr[j].x; 107105b261ecSmrg stuff->dstY = dsty - panoramiXdataPtr[j].y; 107205b261ecSmrg } 107305b261ecSmrg 10744642e01fSmrg VALIDATE_DRAWABLE_AND_GC(stuff->dstDrawable, pDst, DixWriteAccess); 10754642e01fSmrg 107605b261ecSmrg if (stuff->dstDrawable != stuff->srcDrawable) { 107705b261ecSmrg rc = dixLookupDrawable(&pSrc, stuff->srcDrawable, client, 0, 107805b261ecSmrg DixReadAccess); 107905b261ecSmrg if (rc != Success) 108005b261ecSmrg return rc; 108105b261ecSmrg 108205b261ecSmrg if ((pDst->pScreen != pSrc->pScreen) || 108305b261ecSmrg (pDst->depth != pSrc->depth)) { 108405b261ecSmrg client->errorValue = stuff->dstDrawable; 108505b261ecSmrg return (BadMatch); 108605b261ecSmrg } 108705b261ecSmrg } else 108805b261ecSmrg pSrc = pDst; 108905b261ecSmrg 109005b261ecSmrg pRgn[j] = (*pGC->ops->CopyArea)(pSrc, pDst, pGC, 109105b261ecSmrg stuff->srcX, stuff->srcY, 109205b261ecSmrg stuff->width, stuff->height, 109305b261ecSmrg stuff->dstX, stuff->dstY); 109405b261ecSmrg 109505b261ecSmrg if(dstShared) { 109605b261ecSmrg while(j--) pRgn[j] = NULL; 109705b261ecSmrg break; 109805b261ecSmrg } 109905b261ecSmrg } 110005b261ecSmrg 110105b261ecSmrg if(pGC->graphicsExposures) { 110205b261ecSmrg ScreenPtr pScreen = pDst->pScreen; 110305b261ecSmrg RegionRec totalReg; 110405b261ecSmrg Bool overlap; 110505b261ecSmrg 110605b261ecSmrg REGION_NULL(pScreen, &totalReg); 110705b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 110805b261ecSmrg if(pRgn[j]) { 110905b261ecSmrg if(srcIsRoot) { 111005b261ecSmrg REGION_TRANSLATE(pScreen, pRgn[j], 111105b261ecSmrg panoramiXdataPtr[j].x, panoramiXdataPtr[j].y); 111205b261ecSmrg } 111305b261ecSmrg REGION_APPEND(pScreen, &totalReg, pRgn[j]); 111405b261ecSmrg REGION_DESTROY(pScreen, pRgn[j]); 111505b261ecSmrg } 111605b261ecSmrg } 111705b261ecSmrg REGION_VALIDATE(pScreen, &totalReg, &overlap); 111805b261ecSmrg (*pScreen->SendGraphicsExpose)( 111905b261ecSmrg client, &totalReg, stuff->dstDrawable, X_CopyArea, 0); 112005b261ecSmrg REGION_UNINIT(pScreen, &totalReg); 112105b261ecSmrg } 112205b261ecSmrg 112305b261ecSmrg result = client->noClientException; 112405b261ecSmrg } 112505b261ecSmrg 112605b261ecSmrg return (result); 112705b261ecSmrg} 112805b261ecSmrg 112905b261ecSmrg 113005b261ecSmrgint PanoramiXCopyPlane(ClientPtr client) 113105b261ecSmrg{ 113205b261ecSmrg int j, srcx, srcy, dstx, dsty, rc; 113305b261ecSmrg PanoramiXRes *gc, *src, *dst; 113405b261ecSmrg Bool srcIsRoot = FALSE; 113505b261ecSmrg Bool dstIsRoot = FALSE; 113605b261ecSmrg Bool srcShared, dstShared; 113705b261ecSmrg DrawablePtr psrcDraw, pdstDraw = NULL; 113805b261ecSmrg GCPtr pGC = NULL; 113905b261ecSmrg RegionPtr pRgn[MAXSCREENS]; 114005b261ecSmrg REQUEST(xCopyPlaneReq); 114105b261ecSmrg 114205b261ecSmrg REQUEST_SIZE_MATCH(xCopyPlaneReq); 114305b261ecSmrg 114405b261ecSmrg if(!(src = (PanoramiXRes *)SecurityLookupIDByClass( 114505b261ecSmrg client, stuff->srcDrawable, XRC_DRAWABLE, DixReadAccess))) 114605b261ecSmrg return BadDrawable; 114705b261ecSmrg 114805b261ecSmrg srcShared = IS_SHARED_PIXMAP(src); 114905b261ecSmrg 115005b261ecSmrg if(!(dst = (PanoramiXRes *)SecurityLookupIDByClass( 115105b261ecSmrg client, stuff->dstDrawable, XRC_DRAWABLE, DixWriteAccess))) 115205b261ecSmrg return BadDrawable; 115305b261ecSmrg 115405b261ecSmrg dstShared = IS_SHARED_PIXMAP(dst); 115505b261ecSmrg 115605b261ecSmrg if(dstShared && srcShared) 115705b261ecSmrg return (* SavedProcVector[X_CopyPlane])(client); 115805b261ecSmrg 115905b261ecSmrg if(!(gc = (PanoramiXRes *)SecurityLookupIDByType( 116005b261ecSmrg client, stuff->gc, XRT_GC, DixReadAccess))) 116105b261ecSmrg return BadGC; 116205b261ecSmrg 116305b261ecSmrg if((dst->type == XRT_WINDOW) && dst->u.win.root) 116405b261ecSmrg dstIsRoot = TRUE; 116505b261ecSmrg if((src->type == XRT_WINDOW) && src->u.win.root) 116605b261ecSmrg srcIsRoot = TRUE; 116705b261ecSmrg 116805b261ecSmrg srcx = stuff->srcX; srcy = stuff->srcY; 116905b261ecSmrg dstx = stuff->dstX; dsty = stuff->dstY; 117005b261ecSmrg 117105b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 117205b261ecSmrg stuff->dstDrawable = dst->info[j].id; 117305b261ecSmrg stuff->srcDrawable = src->info[j].id; 117405b261ecSmrg stuff->gc = gc->info[j].id; 117505b261ecSmrg if (srcIsRoot) { 117605b261ecSmrg stuff->srcX = srcx - panoramiXdataPtr[j].x; 117705b261ecSmrg stuff->srcY = srcy - panoramiXdataPtr[j].y; 117805b261ecSmrg } 117905b261ecSmrg if (dstIsRoot) { 118005b261ecSmrg stuff->dstX = dstx - panoramiXdataPtr[j].x; 118105b261ecSmrg stuff->dstY = dsty - panoramiXdataPtr[j].y; 118205b261ecSmrg } 118305b261ecSmrg 11844642e01fSmrg VALIDATE_DRAWABLE_AND_GC(stuff->dstDrawable, pdstDraw, DixWriteAccess); 118505b261ecSmrg if (stuff->dstDrawable != stuff->srcDrawable) { 118605b261ecSmrg rc = dixLookupDrawable(&psrcDraw, stuff->srcDrawable, client, 0, 118705b261ecSmrg DixReadAccess); 118805b261ecSmrg if (rc != Success) 118905b261ecSmrg return rc; 119005b261ecSmrg 119105b261ecSmrg if (pdstDraw->pScreen != psrcDraw->pScreen) { 119205b261ecSmrg client->errorValue = stuff->dstDrawable; 119305b261ecSmrg return (BadMatch); 119405b261ecSmrg } 119505b261ecSmrg } else 119605b261ecSmrg psrcDraw = pdstDraw; 119705b261ecSmrg 119805b261ecSmrg if(stuff->bitPlane == 0 || (stuff->bitPlane & (stuff->bitPlane - 1)) || 119905b261ecSmrg (stuff->bitPlane > (1L << (psrcDraw->depth - 1)))) { 120005b261ecSmrg client->errorValue = stuff->bitPlane; 120105b261ecSmrg return(BadValue); 120205b261ecSmrg } 120305b261ecSmrg 120405b261ecSmrg pRgn[j] = (*pGC->ops->CopyPlane)(psrcDraw, pdstDraw, pGC, 120505b261ecSmrg stuff->srcX, stuff->srcY, 120605b261ecSmrg stuff->width, stuff->height, 120705b261ecSmrg stuff->dstX, stuff->dstY, stuff->bitPlane); 120805b261ecSmrg 120905b261ecSmrg if(dstShared) { 121005b261ecSmrg while(j--) pRgn[j] = NULL; 121105b261ecSmrg break; 121205b261ecSmrg } 121305b261ecSmrg } 121405b261ecSmrg 121505b261ecSmrg if(pGC->graphicsExposures) { 121605b261ecSmrg ScreenPtr pScreen = pdstDraw->pScreen; 121705b261ecSmrg RegionRec totalReg; 121805b261ecSmrg Bool overlap; 121905b261ecSmrg 122005b261ecSmrg REGION_NULL(pScreen, &totalReg); 122105b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 122205b261ecSmrg if(pRgn[j]) { 122305b261ecSmrg REGION_APPEND(pScreen, &totalReg, pRgn[j]); 122405b261ecSmrg REGION_DESTROY(pScreen, pRgn[j]); 122505b261ecSmrg } 122605b261ecSmrg } 122705b261ecSmrg REGION_VALIDATE(pScreen, &totalReg, &overlap); 122805b261ecSmrg (*pScreen->SendGraphicsExpose)( 122905b261ecSmrg client, &totalReg, stuff->dstDrawable, X_CopyPlane, 0); 123005b261ecSmrg REGION_UNINIT(pScreen, &totalReg); 123105b261ecSmrg } 123205b261ecSmrg 123305b261ecSmrg return (client->noClientException); 123405b261ecSmrg} 123505b261ecSmrg 123605b261ecSmrg 123705b261ecSmrgint PanoramiXPolyPoint(ClientPtr client) 123805b261ecSmrg{ 123905b261ecSmrg PanoramiXRes *gc, *draw; 124005b261ecSmrg int result = 0, npoint, j; 124105b261ecSmrg xPoint *origPts; 124205b261ecSmrg Bool isRoot; 124305b261ecSmrg REQUEST(xPolyPointReq); 124405b261ecSmrg 124505b261ecSmrg REQUEST_AT_LEAST_SIZE(xPolyPointReq); 124605b261ecSmrg 124705b261ecSmrg if(!(draw = (PanoramiXRes *)SecurityLookupIDByClass( 124805b261ecSmrg client, stuff->drawable, XRC_DRAWABLE, DixWriteAccess))) 124905b261ecSmrg return BadDrawable; 125005b261ecSmrg 125105b261ecSmrg if(IS_SHARED_PIXMAP(draw)) 125205b261ecSmrg return (*SavedProcVector[X_PolyPoint])(client); 125305b261ecSmrg 125405b261ecSmrg if(!(gc = (PanoramiXRes *)SecurityLookupIDByType( 125505b261ecSmrg client, stuff->gc, XRT_GC, DixReadAccess))) 125605b261ecSmrg return BadGC; 125705b261ecSmrg 125805b261ecSmrg isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root; 125905b261ecSmrg npoint = ((client->req_len << 2) - sizeof(xPolyPointReq)) >> 2; 126005b261ecSmrg if (npoint > 0) { 12614642e01fSmrg origPts = (xPoint *) xalloc(npoint * sizeof(xPoint)); 126205b261ecSmrg memcpy((char *) origPts, (char *) &stuff[1], npoint * sizeof(xPoint)); 126305b261ecSmrg FOR_NSCREENS_FORWARD(j){ 126405b261ecSmrg 126505b261ecSmrg if(j) memcpy(&stuff[1], origPts, npoint * sizeof(xPoint)); 126605b261ecSmrg 126705b261ecSmrg if (isRoot) { 126805b261ecSmrg int x_off = panoramiXdataPtr[j].x; 126905b261ecSmrg int y_off = panoramiXdataPtr[j].y; 127005b261ecSmrg 127105b261ecSmrg if(x_off || y_off) { 127205b261ecSmrg xPoint *pnts = (xPoint*)&stuff[1]; 127305b261ecSmrg int i = (stuff->coordMode==CoordModePrevious) ? 1 : npoint; 127405b261ecSmrg 127505b261ecSmrg while(i--) { 127605b261ecSmrg pnts->x -= x_off; 127705b261ecSmrg pnts->y -= y_off; 127805b261ecSmrg pnts++; 127905b261ecSmrg } 128005b261ecSmrg } 128105b261ecSmrg } 128205b261ecSmrg 128305b261ecSmrg stuff->drawable = draw->info[j].id; 128405b261ecSmrg stuff->gc = gc->info[j].id; 128505b261ecSmrg result = (* SavedProcVector[X_PolyPoint])(client); 128605b261ecSmrg if(result != Success) break; 128705b261ecSmrg } 12884642e01fSmrg xfree(origPts); 128905b261ecSmrg return (result); 129005b261ecSmrg } else 129105b261ecSmrg return (client->noClientException); 129205b261ecSmrg} 129305b261ecSmrg 129405b261ecSmrg 129505b261ecSmrgint PanoramiXPolyLine(ClientPtr client) 129605b261ecSmrg{ 129705b261ecSmrg PanoramiXRes *gc, *draw; 129805b261ecSmrg int result = 0, npoint, j; 129905b261ecSmrg xPoint *origPts; 130005b261ecSmrg Bool isRoot; 130105b261ecSmrg REQUEST(xPolyLineReq); 130205b261ecSmrg 130305b261ecSmrg REQUEST_AT_LEAST_SIZE(xPolyLineReq); 130405b261ecSmrg 130505b261ecSmrg if(!(draw = (PanoramiXRes *)SecurityLookupIDByClass( 130605b261ecSmrg client, stuff->drawable, XRC_DRAWABLE, DixWriteAccess))) 130705b261ecSmrg return BadDrawable; 130805b261ecSmrg 130905b261ecSmrg if(IS_SHARED_PIXMAP(draw)) 131005b261ecSmrg return (*SavedProcVector[X_PolyLine])(client); 131105b261ecSmrg 131205b261ecSmrg if(!(gc = (PanoramiXRes *)SecurityLookupIDByType( 131305b261ecSmrg client, stuff->gc, XRT_GC, DixReadAccess))) 131405b261ecSmrg return BadGC; 131505b261ecSmrg 131605b261ecSmrg isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root; 131705b261ecSmrg npoint = ((client->req_len << 2) - sizeof(xPolyLineReq)) >> 2; 131805b261ecSmrg if (npoint > 0){ 13194642e01fSmrg origPts = (xPoint *) xalloc(npoint * sizeof(xPoint)); 132005b261ecSmrg memcpy((char *) origPts, (char *) &stuff[1], npoint * sizeof(xPoint)); 132105b261ecSmrg FOR_NSCREENS_FORWARD(j){ 132205b261ecSmrg 132305b261ecSmrg if(j) memcpy(&stuff[1], origPts, npoint * sizeof(xPoint)); 132405b261ecSmrg 132505b261ecSmrg if (isRoot) { 132605b261ecSmrg int x_off = panoramiXdataPtr[j].x; 132705b261ecSmrg int y_off = panoramiXdataPtr[j].y; 132805b261ecSmrg 132905b261ecSmrg if(x_off || y_off) { 133005b261ecSmrg xPoint *pnts = (xPoint*)&stuff[1]; 133105b261ecSmrg int i = (stuff->coordMode==CoordModePrevious) ? 1 : npoint; 133205b261ecSmrg 133305b261ecSmrg while(i--) { 133405b261ecSmrg pnts->x -= x_off; 133505b261ecSmrg pnts->y -= y_off; 133605b261ecSmrg pnts++; 133705b261ecSmrg } 133805b261ecSmrg } 133905b261ecSmrg } 134005b261ecSmrg 134105b261ecSmrg stuff->drawable = draw->info[j].id; 134205b261ecSmrg stuff->gc = gc->info[j].id; 134305b261ecSmrg result = (* SavedProcVector[X_PolyLine])(client); 134405b261ecSmrg if(result != Success) break; 134505b261ecSmrg } 13464642e01fSmrg xfree(origPts); 134705b261ecSmrg return (result); 134805b261ecSmrg } else 134905b261ecSmrg return (client->noClientException); 135005b261ecSmrg} 135105b261ecSmrg 135205b261ecSmrg 135305b261ecSmrgint PanoramiXPolySegment(ClientPtr client) 135405b261ecSmrg{ 135505b261ecSmrg int result = 0, nsegs, i, j; 135605b261ecSmrg PanoramiXRes *gc, *draw; 135705b261ecSmrg xSegment *origSegs; 135805b261ecSmrg Bool isRoot; 135905b261ecSmrg REQUEST(xPolySegmentReq); 136005b261ecSmrg 136105b261ecSmrg REQUEST_AT_LEAST_SIZE(xPolySegmentReq); 136205b261ecSmrg 136305b261ecSmrg if(!(draw = (PanoramiXRes *)SecurityLookupIDByClass( 136405b261ecSmrg client, stuff->drawable, XRC_DRAWABLE, DixWriteAccess))) 136505b261ecSmrg return BadDrawable; 136605b261ecSmrg 136705b261ecSmrg if(IS_SHARED_PIXMAP(draw)) 136805b261ecSmrg return (*SavedProcVector[X_PolySegment])(client); 136905b261ecSmrg 137005b261ecSmrg if(!(gc = (PanoramiXRes *)SecurityLookupIDByType( 137105b261ecSmrg client, stuff->gc, XRT_GC, DixReadAccess))) 137205b261ecSmrg return BadGC; 137305b261ecSmrg 137405b261ecSmrg isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root; 137505b261ecSmrg 137605b261ecSmrg nsegs = (client->req_len << 2) - sizeof(xPolySegmentReq); 137705b261ecSmrg if(nsegs & 4) return BadLength; 137805b261ecSmrg nsegs >>= 3; 137905b261ecSmrg if (nsegs > 0) { 13804642e01fSmrg origSegs = (xSegment *) xalloc(nsegs * sizeof(xSegment)); 138105b261ecSmrg memcpy((char *) origSegs, (char *) &stuff[1], nsegs * sizeof(xSegment)); 138205b261ecSmrg FOR_NSCREENS_FORWARD(j){ 138305b261ecSmrg 138405b261ecSmrg if(j) memcpy(&stuff[1], origSegs, nsegs * sizeof(xSegment)); 138505b261ecSmrg 138605b261ecSmrg if (isRoot) { 138705b261ecSmrg int x_off = panoramiXdataPtr[j].x; 138805b261ecSmrg int y_off = panoramiXdataPtr[j].y; 138905b261ecSmrg 139005b261ecSmrg if(x_off || y_off) { 139105b261ecSmrg xSegment *segs = (xSegment*)&stuff[1]; 139205b261ecSmrg 139305b261ecSmrg for (i = nsegs; i--; segs++) { 139405b261ecSmrg segs->x1 -= x_off; 139505b261ecSmrg segs->x2 -= x_off; 139605b261ecSmrg segs->y1 -= y_off; 139705b261ecSmrg segs->y2 -= y_off; 139805b261ecSmrg } 139905b261ecSmrg } 140005b261ecSmrg } 140105b261ecSmrg 140205b261ecSmrg stuff->drawable = draw->info[j].id; 140305b261ecSmrg stuff->gc = gc->info[j].id; 140405b261ecSmrg result = (* SavedProcVector[X_PolySegment])(client); 140505b261ecSmrg if(result != Success) break; 140605b261ecSmrg } 14074642e01fSmrg xfree(origSegs); 140805b261ecSmrg return (result); 140905b261ecSmrg } else 141005b261ecSmrg return (client->noClientException); 141105b261ecSmrg} 141205b261ecSmrg 141305b261ecSmrg 141405b261ecSmrgint PanoramiXPolyRectangle(ClientPtr client) 141505b261ecSmrg{ 141605b261ecSmrg int result = 0, nrects, i, j; 141705b261ecSmrg PanoramiXRes *gc, *draw; 141805b261ecSmrg Bool isRoot; 141905b261ecSmrg xRectangle *origRecs; 142005b261ecSmrg REQUEST(xPolyRectangleReq); 142105b261ecSmrg 142205b261ecSmrg REQUEST_AT_LEAST_SIZE(xPolyRectangleReq); 142305b261ecSmrg 142405b261ecSmrg 142505b261ecSmrg if(!(draw = (PanoramiXRes *)SecurityLookupIDByClass( 142605b261ecSmrg client, stuff->drawable, XRC_DRAWABLE, DixWriteAccess))) 142705b261ecSmrg return BadDrawable; 142805b261ecSmrg 142905b261ecSmrg if(IS_SHARED_PIXMAP(draw)) 143005b261ecSmrg return (*SavedProcVector[X_PolyRectangle])(client); 143105b261ecSmrg 143205b261ecSmrg if(!(gc = (PanoramiXRes *)SecurityLookupIDByType( 143305b261ecSmrg client, stuff->gc, XRT_GC, DixReadAccess))) 143405b261ecSmrg return BadGC; 143505b261ecSmrg 143605b261ecSmrg isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root; 143705b261ecSmrg 143805b261ecSmrg nrects = (client->req_len << 2) - sizeof(xPolyRectangleReq); 143905b261ecSmrg if(nrects & 4) return BadLength; 144005b261ecSmrg nrects >>= 3; 144105b261ecSmrg if (nrects > 0){ 14424642e01fSmrg origRecs = (xRectangle *) xalloc(nrects * sizeof(xRectangle)); 144305b261ecSmrg memcpy((char *)origRecs,(char *)&stuff[1],nrects * sizeof(xRectangle)); 144405b261ecSmrg FOR_NSCREENS_FORWARD(j){ 144505b261ecSmrg 144605b261ecSmrg if(j) memcpy(&stuff[1], origRecs, nrects * sizeof(xRectangle)); 144705b261ecSmrg 144805b261ecSmrg if (isRoot) { 144905b261ecSmrg int x_off = panoramiXdataPtr[j].x; 145005b261ecSmrg int y_off = panoramiXdataPtr[j].y; 145105b261ecSmrg 145205b261ecSmrg 145305b261ecSmrg if(x_off || y_off) { 145405b261ecSmrg xRectangle *rects = (xRectangle *) &stuff[1]; 145505b261ecSmrg 145605b261ecSmrg for (i = nrects; i--; rects++) { 145705b261ecSmrg rects->x -= x_off; 145805b261ecSmrg rects->y -= y_off; 145905b261ecSmrg } 146005b261ecSmrg } 146105b261ecSmrg } 146205b261ecSmrg 146305b261ecSmrg stuff->drawable = draw->info[j].id; 146405b261ecSmrg stuff->gc = gc->info[j].id; 146505b261ecSmrg result = (* SavedProcVector[X_PolyRectangle])(client); 146605b261ecSmrg if(result != Success) break; 146705b261ecSmrg } 14684642e01fSmrg xfree(origRecs); 146905b261ecSmrg return (result); 147005b261ecSmrg } else 147105b261ecSmrg return (client->noClientException); 147205b261ecSmrg} 147305b261ecSmrg 147405b261ecSmrg 147505b261ecSmrgint PanoramiXPolyArc(ClientPtr client) 147605b261ecSmrg{ 147705b261ecSmrg int result = 0, narcs, i, j; 147805b261ecSmrg PanoramiXRes *gc, *draw; 147905b261ecSmrg Bool isRoot; 148005b261ecSmrg xArc *origArcs; 148105b261ecSmrg REQUEST(xPolyArcReq); 148205b261ecSmrg 148305b261ecSmrg REQUEST_AT_LEAST_SIZE(xPolyArcReq); 148405b261ecSmrg 148505b261ecSmrg if(!(draw = (PanoramiXRes *)SecurityLookupIDByClass( 148605b261ecSmrg client, stuff->drawable, XRC_DRAWABLE, DixWriteAccess))) 148705b261ecSmrg return BadDrawable; 148805b261ecSmrg 148905b261ecSmrg if(IS_SHARED_PIXMAP(draw)) 149005b261ecSmrg return (*SavedProcVector[X_PolyArc])(client); 149105b261ecSmrg 149205b261ecSmrg if(!(gc = (PanoramiXRes *)SecurityLookupIDByType( 149305b261ecSmrg client, stuff->gc, XRT_GC, DixReadAccess))) 149405b261ecSmrg return BadGC; 149505b261ecSmrg 149605b261ecSmrg isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root; 149705b261ecSmrg 149805b261ecSmrg narcs = (client->req_len << 2) - sizeof(xPolyArcReq); 149905b261ecSmrg if(narcs % sizeof(xArc)) return BadLength; 150005b261ecSmrg narcs /= sizeof(xArc); 150105b261ecSmrg if (narcs > 0){ 15024642e01fSmrg origArcs = (xArc *) xalloc(narcs * sizeof(xArc)); 150305b261ecSmrg memcpy((char *) origArcs, (char *) &stuff[1], narcs * sizeof(xArc)); 150405b261ecSmrg FOR_NSCREENS_FORWARD(j){ 150505b261ecSmrg 150605b261ecSmrg if(j) memcpy(&stuff[1], origArcs, narcs * sizeof(xArc)); 150705b261ecSmrg 150805b261ecSmrg if (isRoot) { 150905b261ecSmrg int x_off = panoramiXdataPtr[j].x; 151005b261ecSmrg int y_off = panoramiXdataPtr[j].y; 151105b261ecSmrg 151205b261ecSmrg if(x_off || y_off) { 151305b261ecSmrg xArc *arcs = (xArc *) &stuff[1]; 151405b261ecSmrg 151505b261ecSmrg for (i = narcs; i--; arcs++) { 151605b261ecSmrg arcs->x -= x_off; 151705b261ecSmrg arcs->y -= y_off; 151805b261ecSmrg } 151905b261ecSmrg } 152005b261ecSmrg } 152105b261ecSmrg stuff->drawable = draw->info[j].id; 152205b261ecSmrg stuff->gc = gc->info[j].id; 152305b261ecSmrg result = (* SavedProcVector[X_PolyArc])(client); 152405b261ecSmrg if(result != Success) break; 152505b261ecSmrg } 15264642e01fSmrg xfree(origArcs); 152705b261ecSmrg return (result); 152805b261ecSmrg } else 152905b261ecSmrg return (client->noClientException); 153005b261ecSmrg} 153105b261ecSmrg 153205b261ecSmrg 153305b261ecSmrgint PanoramiXFillPoly(ClientPtr client) 153405b261ecSmrg{ 153505b261ecSmrg int result = 0, count, j; 153605b261ecSmrg PanoramiXRes *gc, *draw; 153705b261ecSmrg Bool isRoot; 153805b261ecSmrg DDXPointPtr locPts; 153905b261ecSmrg REQUEST(xFillPolyReq); 154005b261ecSmrg 154105b261ecSmrg REQUEST_AT_LEAST_SIZE(xFillPolyReq); 154205b261ecSmrg 154305b261ecSmrg if(!(draw = (PanoramiXRes *)SecurityLookupIDByClass( 154405b261ecSmrg client, stuff->drawable, XRC_DRAWABLE, DixWriteAccess))) 154505b261ecSmrg return BadDrawable; 154605b261ecSmrg 154705b261ecSmrg if(IS_SHARED_PIXMAP(draw)) 154805b261ecSmrg return (*SavedProcVector[X_FillPoly])(client); 154905b261ecSmrg 155005b261ecSmrg if(!(gc = (PanoramiXRes *)SecurityLookupIDByType( 155105b261ecSmrg client, stuff->gc, XRT_GC, DixReadAccess))) 155205b261ecSmrg return BadGC; 155305b261ecSmrg 155405b261ecSmrg isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root; 155505b261ecSmrg 155605b261ecSmrg count = ((client->req_len << 2) - sizeof(xFillPolyReq)) >> 2; 155705b261ecSmrg if (count > 0){ 15584642e01fSmrg locPts = (DDXPointPtr) xalloc(count * sizeof(DDXPointRec)); 155905b261ecSmrg memcpy((char *)locPts, (char *)&stuff[1], count * sizeof(DDXPointRec)); 156005b261ecSmrg FOR_NSCREENS_FORWARD(j){ 156105b261ecSmrg 156205b261ecSmrg if(j) memcpy(&stuff[1], locPts, count * sizeof(DDXPointRec)); 156305b261ecSmrg 156405b261ecSmrg if (isRoot) { 156505b261ecSmrg int x_off = panoramiXdataPtr[j].x; 156605b261ecSmrg int y_off = panoramiXdataPtr[j].y; 156705b261ecSmrg 156805b261ecSmrg if(x_off || y_off) { 156905b261ecSmrg DDXPointPtr pnts = (DDXPointPtr)&stuff[1]; 157005b261ecSmrg int i = (stuff->coordMode==CoordModePrevious) ? 1 : count; 157105b261ecSmrg 157205b261ecSmrg while(i--) { 157305b261ecSmrg pnts->x -= x_off; 157405b261ecSmrg pnts->y -= y_off; 157505b261ecSmrg pnts++; 157605b261ecSmrg } 157705b261ecSmrg } 157805b261ecSmrg } 157905b261ecSmrg 158005b261ecSmrg stuff->drawable = draw->info[j].id; 158105b261ecSmrg stuff->gc = gc->info[j].id; 158205b261ecSmrg result = (* SavedProcVector[X_FillPoly])(client); 158305b261ecSmrg if(result != Success) break; 158405b261ecSmrg } 15854642e01fSmrg xfree(locPts); 158605b261ecSmrg return (result); 158705b261ecSmrg } else 158805b261ecSmrg return (client->noClientException); 158905b261ecSmrg} 159005b261ecSmrg 159105b261ecSmrg 159205b261ecSmrgint PanoramiXPolyFillRectangle(ClientPtr client) 159305b261ecSmrg{ 159405b261ecSmrg int result = 0, things, i, j; 159505b261ecSmrg PanoramiXRes *gc, *draw; 159605b261ecSmrg Bool isRoot; 159705b261ecSmrg xRectangle *origRects; 159805b261ecSmrg REQUEST(xPolyFillRectangleReq); 159905b261ecSmrg 160005b261ecSmrg REQUEST_AT_LEAST_SIZE(xPolyFillRectangleReq); 160105b261ecSmrg 160205b261ecSmrg if(!(draw = (PanoramiXRes *)SecurityLookupIDByClass( 160305b261ecSmrg client, stuff->drawable, XRC_DRAWABLE, DixWriteAccess))) 160405b261ecSmrg return BadDrawable; 160505b261ecSmrg 160605b261ecSmrg if(IS_SHARED_PIXMAP(draw)) 160705b261ecSmrg return (*SavedProcVector[X_PolyFillRectangle])(client); 160805b261ecSmrg 160905b261ecSmrg if(!(gc = (PanoramiXRes *)SecurityLookupIDByType( 161005b261ecSmrg client, stuff->gc, XRT_GC, DixReadAccess))) 161105b261ecSmrg return BadGC; 161205b261ecSmrg 161305b261ecSmrg isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root; 161405b261ecSmrg 161505b261ecSmrg things = (client->req_len << 2) - sizeof(xPolyFillRectangleReq); 161605b261ecSmrg if(things & 4) return BadLength; 161705b261ecSmrg things >>= 3; 161805b261ecSmrg if (things > 0){ 16194642e01fSmrg origRects = (xRectangle *) xalloc(things * sizeof(xRectangle)); 162005b261ecSmrg memcpy((char*)origRects,(char*)&stuff[1], things * sizeof(xRectangle)); 162105b261ecSmrg FOR_NSCREENS_FORWARD(j){ 162205b261ecSmrg 162305b261ecSmrg if(j) memcpy(&stuff[1], origRects, things * sizeof(xRectangle)); 162405b261ecSmrg 162505b261ecSmrg if (isRoot) { 162605b261ecSmrg int x_off = panoramiXdataPtr[j].x; 162705b261ecSmrg int y_off = panoramiXdataPtr[j].y; 162805b261ecSmrg 162905b261ecSmrg if(x_off || y_off) { 163005b261ecSmrg xRectangle *rects = (xRectangle *) &stuff[1]; 163105b261ecSmrg 163205b261ecSmrg for (i = things; i--; rects++) { 163305b261ecSmrg rects->x -= x_off; 163405b261ecSmrg rects->y -= y_off; 163505b261ecSmrg } 163605b261ecSmrg } 163705b261ecSmrg } 163805b261ecSmrg 163905b261ecSmrg stuff->drawable = draw->info[j].id; 164005b261ecSmrg stuff->gc = gc->info[j].id; 164105b261ecSmrg result = (* SavedProcVector[X_PolyFillRectangle])(client); 164205b261ecSmrg if(result != Success) break; 164305b261ecSmrg } 16444642e01fSmrg xfree(origRects); 164505b261ecSmrg return (result); 164605b261ecSmrg } else 164705b261ecSmrg return (client->noClientException); 164805b261ecSmrg} 164905b261ecSmrg 165005b261ecSmrg 165105b261ecSmrgint PanoramiXPolyFillArc(ClientPtr client) 165205b261ecSmrg{ 165305b261ecSmrg PanoramiXRes *gc, *draw; 165405b261ecSmrg Bool isRoot; 165505b261ecSmrg int result = 0, narcs, i, j; 165605b261ecSmrg xArc *origArcs; 165705b261ecSmrg REQUEST(xPolyFillArcReq); 165805b261ecSmrg 165905b261ecSmrg REQUEST_AT_LEAST_SIZE(xPolyFillArcReq); 166005b261ecSmrg 166105b261ecSmrg if(!(draw = (PanoramiXRes *)SecurityLookupIDByClass( 166205b261ecSmrg client, stuff->drawable, XRC_DRAWABLE, DixWriteAccess))) 166305b261ecSmrg return BadDrawable; 166405b261ecSmrg 166505b261ecSmrg if(IS_SHARED_PIXMAP(draw)) 166605b261ecSmrg return (*SavedProcVector[X_PolyFillArc])(client); 166705b261ecSmrg 166805b261ecSmrg if(!(gc = (PanoramiXRes *)SecurityLookupIDByType( 166905b261ecSmrg client, stuff->gc, XRT_GC, DixReadAccess))) 167005b261ecSmrg return BadGC; 167105b261ecSmrg 167205b261ecSmrg isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root; 167305b261ecSmrg 167405b261ecSmrg narcs = (client->req_len << 2) - sizeof(xPolyFillArcReq); 167505b261ecSmrg IF_RETURN((narcs % sizeof(xArc)), BadLength); 167605b261ecSmrg narcs /= sizeof(xArc); 167705b261ecSmrg if (narcs > 0) { 16784642e01fSmrg origArcs = (xArc *) xalloc(narcs * sizeof(xArc)); 167905b261ecSmrg memcpy((char *) origArcs, (char *)&stuff[1], narcs * sizeof(xArc)); 168005b261ecSmrg FOR_NSCREENS_FORWARD(j){ 168105b261ecSmrg 168205b261ecSmrg if(j) memcpy(&stuff[1], origArcs, narcs * sizeof(xArc)); 168305b261ecSmrg 168405b261ecSmrg if (isRoot) { 168505b261ecSmrg int x_off = panoramiXdataPtr[j].x; 168605b261ecSmrg int y_off = panoramiXdataPtr[j].y; 168705b261ecSmrg 168805b261ecSmrg if(x_off || y_off) { 168905b261ecSmrg xArc *arcs = (xArc *) &stuff[1]; 169005b261ecSmrg 169105b261ecSmrg for (i = narcs; i--; arcs++) { 169205b261ecSmrg arcs->x -= x_off; 169305b261ecSmrg arcs->y -= y_off; 169405b261ecSmrg } 169505b261ecSmrg } 169605b261ecSmrg } 169705b261ecSmrg 169805b261ecSmrg stuff->drawable = draw->info[j].id; 169905b261ecSmrg stuff->gc = gc->info[j].id; 170005b261ecSmrg result = (* SavedProcVector[X_PolyFillArc])(client); 170105b261ecSmrg if(result != Success) break; 170205b261ecSmrg } 17034642e01fSmrg xfree(origArcs); 170405b261ecSmrg return (result); 170505b261ecSmrg } else 170605b261ecSmrg return (client->noClientException); 170705b261ecSmrg} 170805b261ecSmrg 170905b261ecSmrg 171005b261ecSmrgint PanoramiXPutImage(ClientPtr client) 171105b261ecSmrg{ 171205b261ecSmrg PanoramiXRes *gc, *draw; 171305b261ecSmrg Bool isRoot; 171405b261ecSmrg int j, result = 0, orig_x, orig_y; 171505b261ecSmrg REQUEST(xPutImageReq); 171605b261ecSmrg 171705b261ecSmrg REQUEST_AT_LEAST_SIZE(xPutImageReq); 171805b261ecSmrg 171905b261ecSmrg if(!(draw = (PanoramiXRes *)SecurityLookupIDByClass( 172005b261ecSmrg client, stuff->drawable, XRC_DRAWABLE, DixWriteAccess))) 172105b261ecSmrg return BadDrawable; 172205b261ecSmrg 172305b261ecSmrg if(IS_SHARED_PIXMAP(draw)) 172405b261ecSmrg return (*SavedProcVector[X_PutImage])(client); 172505b261ecSmrg 172605b261ecSmrg if(!(gc = (PanoramiXRes *)SecurityLookupIDByType( 172705b261ecSmrg client, stuff->gc, XRT_GC, DixReadAccess))) 172805b261ecSmrg return BadGC; 172905b261ecSmrg 173005b261ecSmrg isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root; 173105b261ecSmrg 173205b261ecSmrg orig_x = stuff->dstX; 173305b261ecSmrg orig_y = stuff->dstY; 173405b261ecSmrg FOR_NSCREENS_BACKWARD(j){ 173505b261ecSmrg if (isRoot) { 173605b261ecSmrg stuff->dstX = orig_x - panoramiXdataPtr[j].x; 173705b261ecSmrg stuff->dstY = orig_y - panoramiXdataPtr[j].y; 173805b261ecSmrg } 173905b261ecSmrg stuff->drawable = draw->info[j].id; 174005b261ecSmrg stuff->gc = gc->info[j].id; 174105b261ecSmrg result = (* SavedProcVector[X_PutImage])(client); 174205b261ecSmrg if(result != Success) break; 174305b261ecSmrg } 174405b261ecSmrg return (result); 174505b261ecSmrg} 174605b261ecSmrg 174705b261ecSmrg 174805b261ecSmrgint PanoramiXGetImage(ClientPtr client) 174905b261ecSmrg{ 175005b261ecSmrg DrawablePtr drawables[MAXSCREENS]; 175105b261ecSmrg DrawablePtr pDraw; 175205b261ecSmrg PanoramiXRes *draw; 175305b261ecSmrg xGetImageReply xgi; 175405b261ecSmrg Bool isRoot; 175505b261ecSmrg char *pBuf; 175605b261ecSmrg int i, x, y, w, h, format, rc; 175705b261ecSmrg Mask plane = 0, planemask; 175805b261ecSmrg int linesDone, nlines, linesPerBuf; 175905b261ecSmrg long widthBytesLine, length; 176005b261ecSmrg 176105b261ecSmrg REQUEST(xGetImageReq); 176205b261ecSmrg 176305b261ecSmrg REQUEST_SIZE_MATCH(xGetImageReq); 176405b261ecSmrg 176505b261ecSmrg if ((stuff->format != XYPixmap) && (stuff->format != ZPixmap)) { 176605b261ecSmrg client->errorValue = stuff->format; 176705b261ecSmrg return(BadValue); 176805b261ecSmrg } 176905b261ecSmrg 177005b261ecSmrg if(!(draw = (PanoramiXRes *)SecurityLookupIDByClass( 177105b261ecSmrg client, stuff->drawable, XRC_DRAWABLE, DixWriteAccess))) 177205b261ecSmrg return BadDrawable; 177305b261ecSmrg 177405b261ecSmrg if(draw->type == XRT_PIXMAP) 177505b261ecSmrg return (*SavedProcVector[X_GetImage])(client); 177605b261ecSmrg 177705b261ecSmrg rc = dixLookupDrawable(&pDraw, stuff->drawable, client, 0, 17784642e01fSmrg DixReadAccess); 177905b261ecSmrg if (rc != Success) 178005b261ecSmrg return rc; 178105b261ecSmrg 178205b261ecSmrg if(!((WindowPtr)pDraw)->realized) 178305b261ecSmrg return(BadMatch); 178405b261ecSmrg 178505b261ecSmrg x = stuff->x; 178605b261ecSmrg y = stuff->y; 178705b261ecSmrg w = stuff->width; 178805b261ecSmrg h = stuff->height; 178905b261ecSmrg format = stuff->format; 179005b261ecSmrg planemask = stuff->planeMask; 179105b261ecSmrg 179205b261ecSmrg isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root; 179305b261ecSmrg 179405b261ecSmrg if(isRoot) { 179505b261ecSmrg if( /* check for being onscreen */ 179605b261ecSmrg x < 0 || x + w > PanoramiXPixWidth || 179705b261ecSmrg y < 0 || y + h > PanoramiXPixHeight ) 179805b261ecSmrg return(BadMatch); 179905b261ecSmrg } else { 180005b261ecSmrg if( /* check for being onscreen */ 180105b261ecSmrg panoramiXdataPtr[0].x + pDraw->x + x < 0 || 180205b261ecSmrg panoramiXdataPtr[0].x + pDraw->x + x + w > PanoramiXPixWidth || 180305b261ecSmrg panoramiXdataPtr[0].y + pDraw->y + y < 0 || 180405b261ecSmrg panoramiXdataPtr[0].y + pDraw->y + y + h > PanoramiXPixHeight || 180505b261ecSmrg /* check for being inside of border */ 180605b261ecSmrg x < - wBorderWidth((WindowPtr)pDraw) || 180705b261ecSmrg x + w > wBorderWidth((WindowPtr)pDraw) + (int)pDraw->width || 180805b261ecSmrg y < -wBorderWidth((WindowPtr)pDraw) || 180905b261ecSmrg y + h > wBorderWidth ((WindowPtr)pDraw) + (int)pDraw->height) 181005b261ecSmrg return(BadMatch); 181105b261ecSmrg } 181205b261ecSmrg 181305b261ecSmrg drawables[0] = pDraw; 181405b261ecSmrg for(i = 1; i < PanoramiXNumScreens; i++) { 181505b261ecSmrg rc = dixLookupDrawable(drawables+i, draw->info[i].id, client, 0, 18164642e01fSmrg DixGetAttrAccess); 181705b261ecSmrg if (rc != Success) 181805b261ecSmrg return rc; 181905b261ecSmrg } 182005b261ecSmrg 182105b261ecSmrg xgi.visual = wVisual (((WindowPtr) pDraw)); 182205b261ecSmrg xgi.type = X_Reply; 182305b261ecSmrg xgi.sequenceNumber = client->sequence; 182405b261ecSmrg xgi.depth = pDraw->depth; 182505b261ecSmrg if(format == ZPixmap) { 182605b261ecSmrg widthBytesLine = PixmapBytePad(w, pDraw->depth); 182705b261ecSmrg length = widthBytesLine * h; 182805b261ecSmrg 182905b261ecSmrg 183005b261ecSmrg } else { 183105b261ecSmrg widthBytesLine = BitmapBytePad(w); 183205b261ecSmrg plane = ((Mask)1) << (pDraw->depth - 1); 183305b261ecSmrg /* only planes asked for */ 183405b261ecSmrg length = widthBytesLine * h * 183505b261ecSmrg Ones(planemask & (plane | (plane - 1))); 183605b261ecSmrg 183705b261ecSmrg } 183805b261ecSmrg 183905b261ecSmrg xgi.length = (length + 3) >> 2; 184005b261ecSmrg 184105b261ecSmrg if (widthBytesLine == 0 || h == 0) 184205b261ecSmrg linesPerBuf = 0; 184305b261ecSmrg else if (widthBytesLine >= XINERAMA_IMAGE_BUFSIZE) 184405b261ecSmrg linesPerBuf = 1; 184505b261ecSmrg else { 184605b261ecSmrg linesPerBuf = XINERAMA_IMAGE_BUFSIZE / widthBytesLine; 184705b261ecSmrg if (linesPerBuf > h) 184805b261ecSmrg linesPerBuf = h; 184905b261ecSmrg } 185005b261ecSmrg length = linesPerBuf * widthBytesLine; 185105b261ecSmrg if(!(pBuf = xalloc(length))) 185205b261ecSmrg return (BadAlloc); 185305b261ecSmrg 185405b261ecSmrg WriteReplyToClient(client, sizeof (xGetImageReply), &xgi); 185505b261ecSmrg 185605b261ecSmrg if (linesPerBuf == 0) { 185705b261ecSmrg /* nothing to do */ 185805b261ecSmrg } 185905b261ecSmrg else if (format == ZPixmap) { 186005b261ecSmrg linesDone = 0; 186105b261ecSmrg while (h - linesDone > 0) { 186205b261ecSmrg nlines = min(linesPerBuf, h - linesDone); 186305b261ecSmrg 186405b261ecSmrg if(pDraw->depth == 1) 186505b261ecSmrg bzero(pBuf, nlines * widthBytesLine); 186605b261ecSmrg 186705b261ecSmrg XineramaGetImageData(drawables, x, y + linesDone, w, nlines, 186805b261ecSmrg format, planemask, pBuf, widthBytesLine, isRoot); 186905b261ecSmrg 187005b261ecSmrg (void)WriteToClient(client, 187105b261ecSmrg (int)(nlines * widthBytesLine), 187205b261ecSmrg pBuf); 187305b261ecSmrg linesDone += nlines; 187405b261ecSmrg } 187505b261ecSmrg } else { /* XYPixmap */ 187605b261ecSmrg for (; plane; plane >>= 1) { 187705b261ecSmrg if (planemask & plane) { 187805b261ecSmrg linesDone = 0; 187905b261ecSmrg while (h - linesDone > 0) { 188005b261ecSmrg nlines = min(linesPerBuf, h - linesDone); 188105b261ecSmrg 188205b261ecSmrg bzero(pBuf, nlines * widthBytesLine); 188305b261ecSmrg 188405b261ecSmrg XineramaGetImageData(drawables, x, y + linesDone, w, 188505b261ecSmrg nlines, format, plane, pBuf, 188605b261ecSmrg widthBytesLine, isRoot); 188705b261ecSmrg 188805b261ecSmrg (void)WriteToClient(client, 188905b261ecSmrg (int)(nlines * widthBytesLine), 189005b261ecSmrg pBuf); 189105b261ecSmrg 189205b261ecSmrg linesDone += nlines; 189305b261ecSmrg } 189405b261ecSmrg } 189505b261ecSmrg } 189605b261ecSmrg } 189705b261ecSmrg xfree(pBuf); 189805b261ecSmrg return (client->noClientException); 189905b261ecSmrg} 190005b261ecSmrg 190105b261ecSmrg 190205b261ecSmrg/* The text stuff should be rewritten so that duplication happens 190305b261ecSmrg at the GlyphBlt level. That is, loading the font and getting 190405b261ecSmrg the glyphs should only happen once */ 190505b261ecSmrg 190605b261ecSmrgint 190705b261ecSmrgPanoramiXPolyText8(ClientPtr client) 190805b261ecSmrg{ 190905b261ecSmrg PanoramiXRes *gc, *draw; 191005b261ecSmrg Bool isRoot; 191105b261ecSmrg int result = 0, j; 191205b261ecSmrg int orig_x, orig_y; 191305b261ecSmrg REQUEST(xPolyTextReq); 191405b261ecSmrg 191505b261ecSmrg REQUEST_AT_LEAST_SIZE(xPolyTextReq); 191605b261ecSmrg 191705b261ecSmrg if(!(draw = (PanoramiXRes *)SecurityLookupIDByClass( 191805b261ecSmrg client, stuff->drawable, XRC_DRAWABLE, DixWriteAccess))) 191905b261ecSmrg return BadDrawable; 192005b261ecSmrg 192105b261ecSmrg if(IS_SHARED_PIXMAP(draw)) 192205b261ecSmrg return (*SavedProcVector[X_PolyText8])(client); 192305b261ecSmrg 192405b261ecSmrg if(!(gc = (PanoramiXRes *)SecurityLookupIDByType( 192505b261ecSmrg client, stuff->gc, XRT_GC, DixReadAccess))) 192605b261ecSmrg return BadGC; 192705b261ecSmrg 192805b261ecSmrg isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root; 192905b261ecSmrg 193005b261ecSmrg orig_x = stuff->x; 193105b261ecSmrg orig_y = stuff->y; 193205b261ecSmrg FOR_NSCREENS_BACKWARD(j){ 193305b261ecSmrg stuff->drawable = draw->info[j].id; 193405b261ecSmrg stuff->gc = gc->info[j].id; 193505b261ecSmrg if (isRoot) { 193605b261ecSmrg stuff->x = orig_x - panoramiXdataPtr[j].x; 193705b261ecSmrg stuff->y = orig_y - panoramiXdataPtr[j].y; 193805b261ecSmrg } 193905b261ecSmrg result = (*SavedProcVector[X_PolyText8])(client); 194005b261ecSmrg if(result != Success) break; 194105b261ecSmrg } 194205b261ecSmrg return (result); 194305b261ecSmrg} 194405b261ecSmrg 194505b261ecSmrgint 194605b261ecSmrgPanoramiXPolyText16(ClientPtr client) 194705b261ecSmrg{ 194805b261ecSmrg PanoramiXRes *gc, *draw; 194905b261ecSmrg Bool isRoot; 195005b261ecSmrg int result = 0, j; 195105b261ecSmrg int orig_x, orig_y; 195205b261ecSmrg REQUEST(xPolyTextReq); 195305b261ecSmrg 195405b261ecSmrg REQUEST_AT_LEAST_SIZE(xPolyTextReq); 195505b261ecSmrg 195605b261ecSmrg if(!(draw = (PanoramiXRes *)SecurityLookupIDByClass( 195705b261ecSmrg client, stuff->drawable, XRC_DRAWABLE, DixWriteAccess))) 195805b261ecSmrg return BadDrawable; 195905b261ecSmrg 196005b261ecSmrg if(IS_SHARED_PIXMAP(draw)) 196105b261ecSmrg return (*SavedProcVector[X_PolyText16])(client); 196205b261ecSmrg 196305b261ecSmrg if(!(gc = (PanoramiXRes *)SecurityLookupIDByType( 196405b261ecSmrg client, stuff->gc, XRT_GC, DixReadAccess))) 196505b261ecSmrg return BadGC; 196605b261ecSmrg 196705b261ecSmrg isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root; 196805b261ecSmrg 196905b261ecSmrg orig_x = stuff->x; 197005b261ecSmrg orig_y = stuff->y; 197105b261ecSmrg FOR_NSCREENS_BACKWARD(j){ 197205b261ecSmrg stuff->drawable = draw->info[j].id; 197305b261ecSmrg stuff->gc = gc->info[j].id; 197405b261ecSmrg if (isRoot) { 197505b261ecSmrg stuff->x = orig_x - panoramiXdataPtr[j].x; 197605b261ecSmrg stuff->y = orig_y - panoramiXdataPtr[j].y; 197705b261ecSmrg } 197805b261ecSmrg result = (*SavedProcVector[X_PolyText16])(client); 197905b261ecSmrg if(result != Success) break; 198005b261ecSmrg } 198105b261ecSmrg return (result); 198205b261ecSmrg} 198305b261ecSmrg 198405b261ecSmrg 198505b261ecSmrgint PanoramiXImageText8(ClientPtr client) 198605b261ecSmrg{ 198705b261ecSmrg int result = 0, j; 198805b261ecSmrg PanoramiXRes *gc, *draw; 198905b261ecSmrg Bool isRoot; 199005b261ecSmrg int orig_x, orig_y; 199105b261ecSmrg REQUEST(xImageTextReq); 199205b261ecSmrg 199305b261ecSmrg REQUEST_FIXED_SIZE(xImageTextReq, stuff->nChars); 199405b261ecSmrg 199505b261ecSmrg if(!(draw = (PanoramiXRes *)SecurityLookupIDByClass( 199605b261ecSmrg client, stuff->drawable, XRC_DRAWABLE, DixWriteAccess))) 199705b261ecSmrg return BadDrawable; 199805b261ecSmrg 199905b261ecSmrg if(IS_SHARED_PIXMAP(draw)) 200005b261ecSmrg return (*SavedProcVector[X_ImageText8])(client); 200105b261ecSmrg 200205b261ecSmrg if(!(gc = (PanoramiXRes *)SecurityLookupIDByType( 200305b261ecSmrg client, stuff->gc, XRT_GC, DixReadAccess))) 200405b261ecSmrg return BadGC; 200505b261ecSmrg 200605b261ecSmrg isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root; 200705b261ecSmrg 200805b261ecSmrg orig_x = stuff->x; 200905b261ecSmrg orig_y = stuff->y; 201005b261ecSmrg FOR_NSCREENS_BACKWARD(j){ 201105b261ecSmrg stuff->drawable = draw->info[j].id; 201205b261ecSmrg stuff->gc = gc->info[j].id; 201305b261ecSmrg if (isRoot) { 201405b261ecSmrg stuff->x = orig_x - panoramiXdataPtr[j].x; 201505b261ecSmrg stuff->y = orig_y - panoramiXdataPtr[j].y; 201605b261ecSmrg } 201705b261ecSmrg result = (*SavedProcVector[X_ImageText8])(client); 201805b261ecSmrg if(result != Success) break; 201905b261ecSmrg } 202005b261ecSmrg return (result); 202105b261ecSmrg} 202205b261ecSmrg 202305b261ecSmrg 202405b261ecSmrgint PanoramiXImageText16(ClientPtr client) 202505b261ecSmrg{ 202605b261ecSmrg int result = 0, j; 202705b261ecSmrg PanoramiXRes *gc, *draw; 202805b261ecSmrg Bool isRoot; 202905b261ecSmrg int orig_x, orig_y; 203005b261ecSmrg REQUEST(xImageTextReq); 203105b261ecSmrg 203205b261ecSmrg REQUEST_FIXED_SIZE(xImageTextReq, stuff->nChars << 1); 203305b261ecSmrg 203405b261ecSmrg if(!(draw = (PanoramiXRes *)SecurityLookupIDByClass( 203505b261ecSmrg client, stuff->drawable, XRC_DRAWABLE, DixWriteAccess))) 203605b261ecSmrg return BadDrawable; 203705b261ecSmrg 203805b261ecSmrg if(IS_SHARED_PIXMAP(draw)) 203905b261ecSmrg return (*SavedProcVector[X_ImageText16])(client); 204005b261ecSmrg 204105b261ecSmrg if(!(gc = (PanoramiXRes *)SecurityLookupIDByType( 204205b261ecSmrg client, stuff->gc, XRT_GC, DixReadAccess))) 204305b261ecSmrg return BadGC; 204405b261ecSmrg 204505b261ecSmrg isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root; 204605b261ecSmrg 204705b261ecSmrg orig_x = stuff->x; 204805b261ecSmrg orig_y = stuff->y; 204905b261ecSmrg FOR_NSCREENS_BACKWARD(j){ 205005b261ecSmrg stuff->drawable = draw->info[j].id; 205105b261ecSmrg stuff->gc = gc->info[j].id; 205205b261ecSmrg if (isRoot) { 205305b261ecSmrg stuff->x = orig_x - panoramiXdataPtr[j].x; 205405b261ecSmrg stuff->y = orig_y - panoramiXdataPtr[j].y; 205505b261ecSmrg } 205605b261ecSmrg result = (*SavedProcVector[X_ImageText16])(client); 205705b261ecSmrg if(result != Success) break; 205805b261ecSmrg } 205905b261ecSmrg return (result); 206005b261ecSmrg} 206105b261ecSmrg 206205b261ecSmrg 206305b261ecSmrg 206405b261ecSmrgint PanoramiXCreateColormap(ClientPtr client) 206505b261ecSmrg{ 206605b261ecSmrg PanoramiXRes *win, *newCmap; 206705b261ecSmrg int result = 0, j, orig_visual; 206805b261ecSmrg REQUEST(xCreateColormapReq); 206905b261ecSmrg 207005b261ecSmrg REQUEST_SIZE_MATCH(xCreateColormapReq); 207105b261ecSmrg 207205b261ecSmrg if(!(win = (PanoramiXRes *)SecurityLookupIDByType( 207305b261ecSmrg client, stuff->window, XRT_WINDOW, DixReadAccess))) 207405b261ecSmrg return BadWindow; 207505b261ecSmrg 207605b261ecSmrg if(!(newCmap = (PanoramiXRes *) xalloc(sizeof(PanoramiXRes)))) 207705b261ecSmrg return BadAlloc; 207805b261ecSmrg 207905b261ecSmrg newCmap->type = XRT_COLORMAP; 208005b261ecSmrg newCmap->info[0].id = stuff->mid; 208105b261ecSmrg for(j = 1; j < PanoramiXNumScreens; j++) 208205b261ecSmrg newCmap->info[j].id = FakeClientID(client->index); 208305b261ecSmrg 208405b261ecSmrg orig_visual = stuff->visual; 208505b261ecSmrg FOR_NSCREENS_BACKWARD(j){ 208605b261ecSmrg stuff->mid = newCmap->info[j].id; 208705b261ecSmrg stuff->window = win->info[j].id; 20884642e01fSmrg stuff->visual = PanoramiXTranslateVisualID(j, orig_visual); 208905b261ecSmrg result = (* SavedProcVector[X_CreateColormap])(client); 209005b261ecSmrg if(result != Success) break; 209105b261ecSmrg } 209205b261ecSmrg 209305b261ecSmrg if (result == Success) 209405b261ecSmrg AddResource(newCmap->info[0].id, XRT_COLORMAP, newCmap); 209505b261ecSmrg else 209605b261ecSmrg xfree(newCmap); 209705b261ecSmrg 209805b261ecSmrg return (result); 209905b261ecSmrg} 210005b261ecSmrg 210105b261ecSmrg 210205b261ecSmrgint PanoramiXFreeColormap(ClientPtr client) 210305b261ecSmrg{ 210405b261ecSmrg PanoramiXRes *cmap; 210505b261ecSmrg int result = 0, j; 210605b261ecSmrg REQUEST(xResourceReq); 210705b261ecSmrg 210805b261ecSmrg REQUEST_SIZE_MATCH(xResourceReq); 210905b261ecSmrg 211005b261ecSmrg client->errorValue = stuff->id; 211105b261ecSmrg 211205b261ecSmrg if(!(cmap = (PanoramiXRes *)SecurityLookupIDByType( 211305b261ecSmrg client, stuff->id, XRT_COLORMAP, DixDestroyAccess))) 211405b261ecSmrg return BadColor; 211505b261ecSmrg 211605b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 211705b261ecSmrg stuff->id = cmap->info[j].id; 211805b261ecSmrg result = (* SavedProcVector[X_FreeColormap])(client); 211905b261ecSmrg if(result != Success) break; 212005b261ecSmrg } 212105b261ecSmrg 212205b261ecSmrg /* Since ProcFreeColormap is using FreeResource, it will free 212305b261ecSmrg our resource for us on the last pass through the loop above */ 212405b261ecSmrg 212505b261ecSmrg return (result); 212605b261ecSmrg} 212705b261ecSmrg 212805b261ecSmrg 212905b261ecSmrgint 213005b261ecSmrgPanoramiXCopyColormapAndFree(ClientPtr client) 213105b261ecSmrg{ 213205b261ecSmrg PanoramiXRes *cmap, *newCmap; 213305b261ecSmrg int result = 0, j; 213405b261ecSmrg REQUEST(xCopyColormapAndFreeReq); 213505b261ecSmrg 213605b261ecSmrg REQUEST_SIZE_MATCH(xCopyColormapAndFreeReq); 213705b261ecSmrg 213805b261ecSmrg client->errorValue = stuff->srcCmap; 213905b261ecSmrg 214005b261ecSmrg if(!(cmap = (PanoramiXRes *)SecurityLookupIDByType( 214105b261ecSmrg client, stuff->srcCmap, XRT_COLORMAP, 214205b261ecSmrg DixReadAccess | DixWriteAccess))) 214305b261ecSmrg return BadColor; 214405b261ecSmrg 214505b261ecSmrg if(!(newCmap = (PanoramiXRes *) xalloc(sizeof(PanoramiXRes)))) 214605b261ecSmrg return BadAlloc; 214705b261ecSmrg 214805b261ecSmrg newCmap->type = XRT_COLORMAP; 214905b261ecSmrg newCmap->info[0].id = stuff->mid; 215005b261ecSmrg for(j = 1; j < PanoramiXNumScreens; j++) 215105b261ecSmrg newCmap->info[j].id = FakeClientID(client->index); 215205b261ecSmrg 215305b261ecSmrg FOR_NSCREENS_BACKWARD(j){ 215405b261ecSmrg stuff->srcCmap = cmap->info[j].id; 215505b261ecSmrg stuff->mid = newCmap->info[j].id; 215605b261ecSmrg result = (* SavedProcVector[X_CopyColormapAndFree])(client); 215705b261ecSmrg if(result != Success) break; 215805b261ecSmrg } 215905b261ecSmrg 216005b261ecSmrg if (result == Success) 216105b261ecSmrg AddResource(newCmap->info[0].id, XRT_COLORMAP, newCmap); 216205b261ecSmrg else 216305b261ecSmrg xfree(newCmap); 216405b261ecSmrg 216505b261ecSmrg return (result); 216605b261ecSmrg} 216705b261ecSmrg 216805b261ecSmrg 216905b261ecSmrgint PanoramiXInstallColormap(ClientPtr client) 217005b261ecSmrg{ 217105b261ecSmrg REQUEST(xResourceReq); 217205b261ecSmrg int result = 0, j; 217305b261ecSmrg PanoramiXRes *cmap; 217405b261ecSmrg 217505b261ecSmrg REQUEST_SIZE_MATCH(xResourceReq); 217605b261ecSmrg 217705b261ecSmrg client->errorValue = stuff->id; 217805b261ecSmrg 217905b261ecSmrg if(!(cmap = (PanoramiXRes *)SecurityLookupIDByType( 218005b261ecSmrg client, stuff->id, XRT_COLORMAP, DixReadAccess))) 218105b261ecSmrg return BadColor; 218205b261ecSmrg 218305b261ecSmrg FOR_NSCREENS_BACKWARD(j){ 218405b261ecSmrg stuff->id = cmap->info[j].id; 218505b261ecSmrg result = (* SavedProcVector[X_InstallColormap])(client); 218605b261ecSmrg if(result != Success) break; 218705b261ecSmrg } 218805b261ecSmrg return (result); 218905b261ecSmrg} 219005b261ecSmrg 219105b261ecSmrg 219205b261ecSmrgint PanoramiXUninstallColormap(ClientPtr client) 219305b261ecSmrg{ 219405b261ecSmrg REQUEST(xResourceReq); 219505b261ecSmrg int result = 0, j; 219605b261ecSmrg PanoramiXRes *cmap; 219705b261ecSmrg 219805b261ecSmrg REQUEST_SIZE_MATCH(xResourceReq); 219905b261ecSmrg 220005b261ecSmrg client->errorValue = stuff->id; 220105b261ecSmrg 220205b261ecSmrg if(!(cmap = (PanoramiXRes *)SecurityLookupIDByType( 220305b261ecSmrg client, stuff->id, XRT_COLORMAP, DixReadAccess))) 220405b261ecSmrg return BadColor; 220505b261ecSmrg 220605b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 220705b261ecSmrg stuff->id = cmap->info[j].id; 220805b261ecSmrg result = (* SavedProcVector[X_UninstallColormap])(client); 220905b261ecSmrg if(result != Success) break; 221005b261ecSmrg } 221105b261ecSmrg return (result); 221205b261ecSmrg} 221305b261ecSmrg 221405b261ecSmrg 221505b261ecSmrgint PanoramiXAllocColor(ClientPtr client) 221605b261ecSmrg{ 221705b261ecSmrg int result = 0, j; 221805b261ecSmrg PanoramiXRes *cmap; 221905b261ecSmrg REQUEST(xAllocColorReq); 222005b261ecSmrg 222105b261ecSmrg REQUEST_SIZE_MATCH(xAllocColorReq); 222205b261ecSmrg 222305b261ecSmrg client->errorValue = stuff->cmap; 222405b261ecSmrg 222505b261ecSmrg if(!(cmap = (PanoramiXRes *)SecurityLookupIDByType( 222605b261ecSmrg client, stuff->cmap, XRT_COLORMAP, DixWriteAccess))) 222705b261ecSmrg return BadColor; 222805b261ecSmrg 222905b261ecSmrg FOR_NSCREENS_BACKWARD(j){ 223005b261ecSmrg stuff->cmap = cmap->info[j].id; 223105b261ecSmrg result = (* SavedProcVector[X_AllocColor])(client); 223205b261ecSmrg if(result != Success) break; 223305b261ecSmrg } 223405b261ecSmrg return (result); 223505b261ecSmrg} 223605b261ecSmrg 223705b261ecSmrg 223805b261ecSmrgint PanoramiXAllocNamedColor(ClientPtr client) 223905b261ecSmrg{ 224005b261ecSmrg int result = 0, j; 224105b261ecSmrg PanoramiXRes *cmap; 224205b261ecSmrg REQUEST(xAllocNamedColorReq); 224305b261ecSmrg 224405b261ecSmrg REQUEST_FIXED_SIZE(xAllocNamedColorReq, stuff->nbytes); 224505b261ecSmrg 224605b261ecSmrg client->errorValue = stuff->cmap; 224705b261ecSmrg 224805b261ecSmrg if(!(cmap = (PanoramiXRes *)SecurityLookupIDByType( 224905b261ecSmrg client, stuff->cmap, XRT_COLORMAP, DixWriteAccess))) 225005b261ecSmrg return BadColor; 225105b261ecSmrg 225205b261ecSmrg FOR_NSCREENS_BACKWARD(j){ 225305b261ecSmrg stuff->cmap = cmap->info[j].id; 225405b261ecSmrg result = (* SavedProcVector[X_AllocNamedColor])(client); 225505b261ecSmrg if(result != Success) break; 225605b261ecSmrg } 225705b261ecSmrg return (result); 225805b261ecSmrg} 225905b261ecSmrg 226005b261ecSmrg 226105b261ecSmrgint PanoramiXAllocColorCells(ClientPtr client) 226205b261ecSmrg{ 226305b261ecSmrg int result = 0, j; 226405b261ecSmrg PanoramiXRes *cmap; 226505b261ecSmrg REQUEST(xAllocColorCellsReq); 226605b261ecSmrg 226705b261ecSmrg REQUEST_SIZE_MATCH(xAllocColorCellsReq); 226805b261ecSmrg 226905b261ecSmrg client->errorValue = stuff->cmap; 227005b261ecSmrg 227105b261ecSmrg if(!(cmap = (PanoramiXRes *)SecurityLookupIDByType( 227205b261ecSmrg client, stuff->cmap, XRT_COLORMAP, DixWriteAccess))) 227305b261ecSmrg return BadColor; 227405b261ecSmrg 227505b261ecSmrg FOR_NSCREENS_BACKWARD(j){ 227605b261ecSmrg stuff->cmap = cmap->info[j].id; 227705b261ecSmrg result = (* SavedProcVector[X_AllocColorCells])(client); 227805b261ecSmrg if(result != Success) break; 227905b261ecSmrg } 228005b261ecSmrg return (result); 228105b261ecSmrg} 228205b261ecSmrg 228305b261ecSmrg 228405b261ecSmrgint PanoramiXAllocColorPlanes(ClientPtr client) 228505b261ecSmrg{ 228605b261ecSmrg int result = 0, j; 228705b261ecSmrg PanoramiXRes *cmap; 228805b261ecSmrg REQUEST(xAllocColorPlanesReq); 228905b261ecSmrg 229005b261ecSmrg REQUEST_SIZE_MATCH(xAllocColorPlanesReq); 229105b261ecSmrg 229205b261ecSmrg client->errorValue = stuff->cmap; 229305b261ecSmrg 229405b261ecSmrg if(!(cmap = (PanoramiXRes *)SecurityLookupIDByType( 229505b261ecSmrg client, stuff->cmap, XRT_COLORMAP, DixWriteAccess))) 229605b261ecSmrg return BadColor; 229705b261ecSmrg 229805b261ecSmrg FOR_NSCREENS_BACKWARD(j){ 229905b261ecSmrg stuff->cmap = cmap->info[j].id; 230005b261ecSmrg result = (* SavedProcVector[X_AllocColorPlanes])(client); 230105b261ecSmrg if(result != Success) break; 230205b261ecSmrg } 230305b261ecSmrg return (result); 230405b261ecSmrg} 230505b261ecSmrg 230605b261ecSmrg 230705b261ecSmrg 230805b261ecSmrgint PanoramiXFreeColors(ClientPtr client) 230905b261ecSmrg{ 231005b261ecSmrg int result = 0, j; 231105b261ecSmrg PanoramiXRes *cmap; 231205b261ecSmrg REQUEST(xFreeColorsReq); 231305b261ecSmrg 231405b261ecSmrg REQUEST_AT_LEAST_SIZE(xFreeColorsReq); 231505b261ecSmrg 231605b261ecSmrg client->errorValue = stuff->cmap; 231705b261ecSmrg 231805b261ecSmrg if(!(cmap = (PanoramiXRes *)SecurityLookupIDByType( 231905b261ecSmrg client, stuff->cmap, XRT_COLORMAP, DixWriteAccess))) 232005b261ecSmrg return BadColor; 232105b261ecSmrg 232205b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 232305b261ecSmrg stuff->cmap = cmap->info[j].id; 232405b261ecSmrg result = (* SavedProcVector[X_FreeColors])(client); 232505b261ecSmrg } 232605b261ecSmrg return (result); 232705b261ecSmrg} 232805b261ecSmrg 232905b261ecSmrg 233005b261ecSmrgint PanoramiXStoreColors(ClientPtr client) 233105b261ecSmrg{ 233205b261ecSmrg int result = 0, j; 233305b261ecSmrg PanoramiXRes *cmap; 233405b261ecSmrg REQUEST(xStoreColorsReq); 233505b261ecSmrg 233605b261ecSmrg REQUEST_AT_LEAST_SIZE(xStoreColorsReq); 233705b261ecSmrg 233805b261ecSmrg client->errorValue = stuff->cmap; 233905b261ecSmrg 234005b261ecSmrg if(!(cmap = (PanoramiXRes *)SecurityLookupIDByType( 234105b261ecSmrg client, stuff->cmap, XRT_COLORMAP, DixWriteAccess))) 234205b261ecSmrg return BadColor; 234305b261ecSmrg 234405b261ecSmrg FOR_NSCREENS_BACKWARD(j){ 234505b261ecSmrg stuff->cmap = cmap->info[j].id; 234605b261ecSmrg result = (* SavedProcVector[X_StoreColors])(client); 234705b261ecSmrg if(result != Success) break; 234805b261ecSmrg } 234905b261ecSmrg return (result); 235005b261ecSmrg} 235105b261ecSmrg 235205b261ecSmrg 235305b261ecSmrgint PanoramiXStoreNamedColor(ClientPtr client) 235405b261ecSmrg{ 235505b261ecSmrg int result = 0, j; 235605b261ecSmrg PanoramiXRes *cmap; 235705b261ecSmrg REQUEST(xStoreNamedColorReq); 235805b261ecSmrg 235905b261ecSmrg REQUEST_FIXED_SIZE(xStoreNamedColorReq, stuff->nbytes); 236005b261ecSmrg 236105b261ecSmrg client->errorValue = stuff->cmap; 236205b261ecSmrg 236305b261ecSmrg if(!(cmap = (PanoramiXRes *)SecurityLookupIDByType( 236405b261ecSmrg client, stuff->cmap, XRT_COLORMAP, DixWriteAccess))) 236505b261ecSmrg return BadColor; 236605b261ecSmrg 236705b261ecSmrg FOR_NSCREENS_BACKWARD(j){ 236805b261ecSmrg stuff->cmap = cmap->info[j].id; 236905b261ecSmrg result = (* SavedProcVector[X_StoreNamedColor])(client); 237005b261ecSmrg if(result != Success) break; 237105b261ecSmrg } 237205b261ecSmrg return (result); 237305b261ecSmrg} 2374