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