panoramiXprocs.c revision 6747b715
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#include <X11/Xproto.h> 3605b261ecSmrg#include "windowstr.h" 3705b261ecSmrg#include "dixfontstr.h" 3805b261ecSmrg#include "gcstruct.h" 3905b261ecSmrg#include "colormapst.h" 4005b261ecSmrg#include "scrnintstr.h" 4105b261ecSmrg#include "opaque.h" 4205b261ecSmrg#include "inputstr.h" 4305b261ecSmrg#include "migc.h" 4405b261ecSmrg#include "misc.h" 4505b261ecSmrg#include "dixstruct.h" 4605b261ecSmrg#include "panoramiX.h" 4705b261ecSmrg#include "panoramiXsrv.h" 4805b261ecSmrg#include "resource.h" 4905b261ecSmrg#include "panoramiXh.h" 5005b261ecSmrg 5105b261ecSmrg#define XINERAMA_IMAGE_BUFSIZE (256*1024) 5205b261ecSmrg#define INPUTONLY_LEGAL_MASK (CWWinGravity | CWEventMask | \ 5305b261ecSmrg CWDontPropagate | CWOverrideRedirect | CWCursor ) 5405b261ecSmrg 5505b261ecSmrgint PanoramiXCreateWindow(ClientPtr client) 5605b261ecSmrg{ 5705b261ecSmrg PanoramiXRes *parent, *newWin; 5805b261ecSmrg PanoramiXRes *backPix = NULL; 5905b261ecSmrg PanoramiXRes *bordPix = NULL; 6005b261ecSmrg PanoramiXRes *cmap = NULL; 6105b261ecSmrg REQUEST(xCreateWindowReq); 6205b261ecSmrg int pback_offset = 0, pbord_offset = 0, cmap_offset = 0; 636747b715Smrg int result, len, j; 6405b261ecSmrg int orig_x, orig_y; 6505b261ecSmrg XID orig_visual, tmp; 6605b261ecSmrg Bool parentIsRoot; 6705b261ecSmrg 6805b261ecSmrg REQUEST_AT_LEAST_SIZE(xCreateWindowReq); 6905b261ecSmrg 706747b715Smrg len = client->req_len - bytes_to_int32(sizeof(xCreateWindowReq)); 7105b261ecSmrg if (Ones(stuff->mask) != len) 7205b261ecSmrg return BadLength; 7305b261ecSmrg 746747b715Smrg result = dixLookupResourceByType((pointer *)&parent, stuff->parent, 756747b715Smrg XRT_WINDOW, client, DixWriteAccess); 766747b715Smrg if (result != Success) 776747b715Smrg return result; 7805b261ecSmrg 7905b261ecSmrg if(stuff->class == CopyFromParent) 8005b261ecSmrg stuff->class = parent->u.win.class; 8105b261ecSmrg 8205b261ecSmrg if((stuff->class == InputOnly) && (stuff->mask & (~INPUTONLY_LEGAL_MASK))) 8305b261ecSmrg return BadMatch; 8405b261ecSmrg 8505b261ecSmrg if ((Mask)stuff->mask & CWBackPixmap) { 8605b261ecSmrg pback_offset = Ones((Mask)stuff->mask & (CWBackPixmap - 1)); 8705b261ecSmrg tmp = *((CARD32 *) &stuff[1] + pback_offset); 8805b261ecSmrg if ((tmp != None) && (tmp != ParentRelative)) { 896747b715Smrg result = dixLookupResourceByType((pointer *)&backPix, tmp, 906747b715Smrg XRT_PIXMAP, client, DixReadAccess); 916747b715Smrg if (result != Success) 926747b715Smrg return result; 9305b261ecSmrg } 9405b261ecSmrg } 9505b261ecSmrg if ((Mask)stuff->mask & CWBorderPixmap) { 9605b261ecSmrg pbord_offset = Ones((Mask)stuff->mask & (CWBorderPixmap - 1)); 9705b261ecSmrg tmp = *((CARD32 *) &stuff[1] + pbord_offset); 9805b261ecSmrg if (tmp != CopyFromParent) { 996747b715Smrg result = dixLookupResourceByType((pointer *)&bordPix, tmp, 1006747b715Smrg XRT_PIXMAP, client, DixReadAccess); 1016747b715Smrg if (result != Success) 1026747b715Smrg return result; 10305b261ecSmrg } 10405b261ecSmrg } 10505b261ecSmrg if ((Mask)stuff->mask & CWColormap) { 10605b261ecSmrg cmap_offset = Ones((Mask)stuff->mask & (CWColormap - 1)); 10705b261ecSmrg tmp = *((CARD32 *) &stuff[1] + cmap_offset); 10805b261ecSmrg if ((tmp != CopyFromParent) && (tmp != None)) { 1096747b715Smrg result = dixLookupResourceByType((pointer *)&cmap, tmp, 1106747b715Smrg XRT_COLORMAP, client, DixReadAccess); 1116747b715Smrg if (result != Success) 1126747b715Smrg return result; 11305b261ecSmrg } 11405b261ecSmrg } 11505b261ecSmrg 1166747b715Smrg if(!(newWin = malloc(sizeof(PanoramiXRes)))) 11705b261ecSmrg return BadAlloc; 11805b261ecSmrg 11905b261ecSmrg newWin->type = XRT_WINDOW; 12005b261ecSmrg newWin->u.win.visibility = VisibilityNotViewable; 12105b261ecSmrg newWin->u.win.class = stuff->class; 12205b261ecSmrg newWin->u.win.root = FALSE; 12305b261ecSmrg newWin->info[0].id = stuff->wid; 12405b261ecSmrg for(j = 1; j < PanoramiXNumScreens; j++) 12505b261ecSmrg newWin->info[j].id = FakeClientID(client->index); 12605b261ecSmrg 12705b261ecSmrg if (stuff->class == InputOnly) 12805b261ecSmrg stuff->visual = CopyFromParent; 12905b261ecSmrg orig_visual = stuff->visual; 13005b261ecSmrg orig_x = stuff->x; 13105b261ecSmrg orig_y = stuff->y; 1326747b715Smrg parentIsRoot = (stuff->parent == screenInfo.screens[0]->root->drawable.id) || 1336747b715Smrg (stuff->parent == screenInfo.screens[0]->screensaver.wid); 13405b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 13505b261ecSmrg stuff->wid = newWin->info[j].id; 13605b261ecSmrg stuff->parent = parent->info[j].id; 13705b261ecSmrg if (parentIsRoot) { 1386747b715Smrg stuff->x = orig_x - screenInfo.screens[j]->x; 1396747b715Smrg stuff->y = orig_y - screenInfo.screens[j]->y; 14005b261ecSmrg } 14105b261ecSmrg if (backPix) 14205b261ecSmrg *((CARD32 *) &stuff[1] + pback_offset) = backPix->info[j].id; 14305b261ecSmrg if (bordPix) 14405b261ecSmrg *((CARD32 *) &stuff[1] + pbord_offset) = bordPix->info[j].id; 14505b261ecSmrg if (cmap) 14605b261ecSmrg *((CARD32 *) &stuff[1] + cmap_offset) = cmap->info[j].id; 14705b261ecSmrg if ( orig_visual != CopyFromParent ) 1484642e01fSmrg stuff->visual = PanoramiXTranslateVisualID(j, orig_visual); 14905b261ecSmrg result = (*SavedProcVector[X_CreateWindow])(client); 15005b261ecSmrg if(result != Success) break; 15105b261ecSmrg } 15205b261ecSmrg 15305b261ecSmrg if (result == Success) 15405b261ecSmrg AddResource(newWin->info[0].id, XRT_WINDOW, newWin); 15505b261ecSmrg else 1566747b715Smrg free(newWin); 15705b261ecSmrg 1586747b715Smrg return result; 15905b261ecSmrg} 16005b261ecSmrg 16105b261ecSmrg 16205b261ecSmrgint PanoramiXChangeWindowAttributes(ClientPtr client) 16305b261ecSmrg{ 16405b261ecSmrg PanoramiXRes *win; 16505b261ecSmrg PanoramiXRes *backPix = NULL; 16605b261ecSmrg PanoramiXRes *bordPix = NULL; 16705b261ecSmrg PanoramiXRes *cmap = NULL; 16805b261ecSmrg REQUEST(xChangeWindowAttributesReq); 16905b261ecSmrg int pback_offset = 0, pbord_offset = 0, cmap_offset = 0; 1706747b715Smrg int result, len, j; 17105b261ecSmrg XID tmp; 17205b261ecSmrg 17305b261ecSmrg REQUEST_AT_LEAST_SIZE(xChangeWindowAttributesReq); 17405b261ecSmrg 1756747b715Smrg len = client->req_len - bytes_to_int32(sizeof(xChangeWindowAttributesReq)); 17605b261ecSmrg if (Ones(stuff->valueMask) != len) 17705b261ecSmrg return BadLength; 17805b261ecSmrg 1796747b715Smrg result = dixLookupResourceByType((pointer *)&win, stuff->window, 1806747b715Smrg XRT_WINDOW, client, DixWriteAccess); 1816747b715Smrg if (result != Success) 1826747b715Smrg return result; 18305b261ecSmrg 18405b261ecSmrg if((win->u.win.class == InputOnly) && 18505b261ecSmrg (stuff->valueMask & (~INPUTONLY_LEGAL_MASK))) 18605b261ecSmrg return BadMatch; 18705b261ecSmrg 18805b261ecSmrg if ((Mask)stuff->valueMask & CWBackPixmap) { 18905b261ecSmrg pback_offset = Ones((Mask)stuff->valueMask & (CWBackPixmap - 1)); 19005b261ecSmrg tmp = *((CARD32 *) &stuff[1] + pback_offset); 19105b261ecSmrg if ((tmp != None) && (tmp != ParentRelative)) { 1926747b715Smrg result = dixLookupResourceByType((pointer *)&backPix, tmp, 1936747b715Smrg XRT_PIXMAP, client, DixReadAccess); 1946747b715Smrg if (result != Success) 1956747b715Smrg return result; 19605b261ecSmrg } 19705b261ecSmrg } 19805b261ecSmrg if ((Mask)stuff->valueMask & CWBorderPixmap) { 19905b261ecSmrg pbord_offset = Ones((Mask)stuff->valueMask & (CWBorderPixmap - 1)); 20005b261ecSmrg tmp = *((CARD32 *) &stuff[1] + pbord_offset); 20105b261ecSmrg if (tmp != CopyFromParent) { 2026747b715Smrg result = dixLookupResourceByType((pointer *)&bordPix, tmp, 2036747b715Smrg XRT_PIXMAP, client, DixReadAccess); 2046747b715Smrg if (result != Success) 2056747b715Smrg return result; 20605b261ecSmrg } 20705b261ecSmrg } 20805b261ecSmrg if ((Mask)stuff->valueMask & CWColormap) { 20905b261ecSmrg cmap_offset = Ones((Mask)stuff->valueMask & (CWColormap - 1)); 21005b261ecSmrg tmp = *((CARD32 *) &stuff[1] + cmap_offset); 21105b261ecSmrg if ((tmp != CopyFromParent) && (tmp != None)) { 2126747b715Smrg result = dixLookupResourceByType((pointer *)&cmap, tmp, 2136747b715Smrg XRT_COLORMAP, client, DixReadAccess); 2146747b715Smrg if (result != Success) 2156747b715Smrg return result; 21605b261ecSmrg } 21705b261ecSmrg } 21805b261ecSmrg 21905b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 22005b261ecSmrg stuff->window = win->info[j].id; 22105b261ecSmrg if (backPix) 22205b261ecSmrg *((CARD32 *) &stuff[1] + pback_offset) = backPix->info[j].id; 22305b261ecSmrg if (bordPix) 22405b261ecSmrg *((CARD32 *) &stuff[1] + pbord_offset) = bordPix->info[j].id; 22505b261ecSmrg if (cmap) 22605b261ecSmrg *((CARD32 *) &stuff[1] + cmap_offset) = cmap->info[j].id; 22705b261ecSmrg result = (*SavedProcVector[X_ChangeWindowAttributes])(client); 22805b261ecSmrg } 22905b261ecSmrg 2306747b715Smrg return result; 23105b261ecSmrg} 23205b261ecSmrg 23305b261ecSmrg 23405b261ecSmrgint PanoramiXDestroyWindow(ClientPtr client) 23505b261ecSmrg{ 23605b261ecSmrg PanoramiXRes *win; 2376747b715Smrg int result, j; 23805b261ecSmrg REQUEST(xResourceReq); 23905b261ecSmrg 24005b261ecSmrg REQUEST_SIZE_MATCH(xResourceReq); 24105b261ecSmrg 2426747b715Smrg result = dixLookupResourceByType((pointer *)&win, stuff->id, XRT_WINDOW, 2436747b715Smrg client, DixDestroyAccess); 2446747b715Smrg if (result != Success) 2456747b715Smrg return result; 24605b261ecSmrg 24705b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 24805b261ecSmrg stuff->id = win->info[j].id; 24905b261ecSmrg result = (*SavedProcVector[X_DestroyWindow])(client); 25005b261ecSmrg if(result != Success) break; 25105b261ecSmrg } 25205b261ecSmrg 25305b261ecSmrg /* Since ProcDestroyWindow is using FreeResource, it will free 25405b261ecSmrg our resource for us on the last pass through the loop above */ 25505b261ecSmrg 2566747b715Smrg return result; 25705b261ecSmrg} 25805b261ecSmrg 25905b261ecSmrg 26005b261ecSmrgint PanoramiXDestroySubwindows(ClientPtr client) 26105b261ecSmrg{ 26205b261ecSmrg PanoramiXRes *win; 2636747b715Smrg int result, j; 26405b261ecSmrg REQUEST(xResourceReq); 26505b261ecSmrg 26605b261ecSmrg REQUEST_SIZE_MATCH(xResourceReq); 26705b261ecSmrg 2686747b715Smrg result = dixLookupResourceByType((pointer *)&win, stuff->id, XRT_WINDOW, 2696747b715Smrg client, DixDestroyAccess); 2706747b715Smrg if (result != Success) 2716747b715Smrg return result; 27205b261ecSmrg 27305b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 27405b261ecSmrg stuff->id = win->info[j].id; 27505b261ecSmrg result = (*SavedProcVector[X_DestroySubwindows])(client); 27605b261ecSmrg if(result != Success) break; 27705b261ecSmrg } 27805b261ecSmrg 27905b261ecSmrg /* DestroySubwindows is using FreeResource which will free 28005b261ecSmrg our resources for us on the last pass through the loop above */ 28105b261ecSmrg 2826747b715Smrg return result; 28305b261ecSmrg} 28405b261ecSmrg 28505b261ecSmrg 28605b261ecSmrgint PanoramiXChangeSaveSet(ClientPtr client) 28705b261ecSmrg{ 28805b261ecSmrg PanoramiXRes *win; 2896747b715Smrg int result, j; 29005b261ecSmrg REQUEST(xChangeSaveSetReq); 29105b261ecSmrg 29205b261ecSmrg REQUEST_SIZE_MATCH(xChangeSaveSetReq); 29305b261ecSmrg 2946747b715Smrg result = dixLookupResourceByType((pointer *)&win, stuff->window, 2956747b715Smrg XRT_WINDOW, client, DixReadAccess); 2966747b715Smrg if (result != Success) 2976747b715Smrg return result; 29805b261ecSmrg 29905b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 30005b261ecSmrg stuff->window = win->info[j].id; 30105b261ecSmrg result = (*SavedProcVector[X_ChangeSaveSet])(client); 30205b261ecSmrg if(result != Success) break; 30305b261ecSmrg } 30405b261ecSmrg 3056747b715Smrg return result; 30605b261ecSmrg} 30705b261ecSmrg 30805b261ecSmrg 30905b261ecSmrgint PanoramiXReparentWindow(ClientPtr client) 31005b261ecSmrg{ 31105b261ecSmrg PanoramiXRes *win, *parent; 3126747b715Smrg int result, j; 31305b261ecSmrg int x, y; 31405b261ecSmrg Bool parentIsRoot; 31505b261ecSmrg REQUEST(xReparentWindowReq); 31605b261ecSmrg 31705b261ecSmrg REQUEST_SIZE_MATCH(xReparentWindowReq); 31805b261ecSmrg 3196747b715Smrg result = dixLookupResourceByType((pointer *)&win, stuff->window, 3206747b715Smrg XRT_WINDOW, client, DixWriteAccess); 3216747b715Smrg if (result != Success) 3226747b715Smrg return result; 32305b261ecSmrg 3246747b715Smrg result = dixLookupResourceByType((pointer *)&parent, stuff->parent, 3256747b715Smrg XRT_WINDOW, client, DixWriteAccess); 3266747b715Smrg if (result != Success) 3276747b715Smrg return result; 32805b261ecSmrg 32905b261ecSmrg x = stuff->x; 33005b261ecSmrg y = stuff->y; 3316747b715Smrg parentIsRoot = (stuff->parent == screenInfo.screens[0]->root->drawable.id) || 3326747b715Smrg (stuff->parent == screenInfo.screens[0]->screensaver.wid); 33305b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 33405b261ecSmrg stuff->window = win->info[j].id; 33505b261ecSmrg stuff->parent = parent->info[j].id; 33605b261ecSmrg if(parentIsRoot) { 3376747b715Smrg stuff->x = x - screenInfo.screens[j]->x; 3386747b715Smrg stuff->y = y - screenInfo.screens[j]->y; 33905b261ecSmrg } 34005b261ecSmrg result = (*SavedProcVector[X_ReparentWindow])(client); 34105b261ecSmrg if(result != Success) break; 34205b261ecSmrg } 34305b261ecSmrg 3446747b715Smrg return result; 34505b261ecSmrg} 34605b261ecSmrg 34705b261ecSmrg 34805b261ecSmrgint PanoramiXMapWindow(ClientPtr client) 34905b261ecSmrg{ 35005b261ecSmrg PanoramiXRes *win; 3516747b715Smrg int result, j; 35205b261ecSmrg REQUEST(xResourceReq); 35305b261ecSmrg 35405b261ecSmrg REQUEST_SIZE_MATCH(xResourceReq); 35505b261ecSmrg 3566747b715Smrg result = dixLookupResourceByType((pointer *)&win, stuff->id, 3576747b715Smrg XRT_WINDOW, client, DixReadAccess); 3586747b715Smrg if (result != Success) 3596747b715Smrg return result; 36005b261ecSmrg 36105b261ecSmrg FOR_NSCREENS_FORWARD(j) { 36205b261ecSmrg stuff->id = win->info[j].id; 36305b261ecSmrg result = (*SavedProcVector[X_MapWindow])(client); 36405b261ecSmrg if(result != Success) break; 36505b261ecSmrg } 36605b261ecSmrg 3676747b715Smrg return result; 36805b261ecSmrg} 36905b261ecSmrg 37005b261ecSmrg 37105b261ecSmrgint PanoramiXMapSubwindows(ClientPtr client) 37205b261ecSmrg{ 37305b261ecSmrg PanoramiXRes *win; 3746747b715Smrg int result, j; 37505b261ecSmrg REQUEST(xResourceReq); 37605b261ecSmrg 37705b261ecSmrg REQUEST_SIZE_MATCH(xResourceReq); 37805b261ecSmrg 3796747b715Smrg result = dixLookupResourceByType((pointer *)&win, stuff->id, 3806747b715Smrg XRT_WINDOW, client, DixReadAccess); 3816747b715Smrg if (result != Success) 3826747b715Smrg return result; 38305b261ecSmrg 38405b261ecSmrg FOR_NSCREENS_FORWARD(j) { 38505b261ecSmrg stuff->id = win->info[j].id; 38605b261ecSmrg result = (*SavedProcVector[X_MapSubwindows])(client); 38705b261ecSmrg if(result != Success) break; 38805b261ecSmrg } 38905b261ecSmrg 3906747b715Smrg return result; 39105b261ecSmrg} 39205b261ecSmrg 39305b261ecSmrg 39405b261ecSmrgint PanoramiXUnmapWindow(ClientPtr client) 39505b261ecSmrg{ 39605b261ecSmrg PanoramiXRes *win; 3976747b715Smrg int result, j; 39805b261ecSmrg REQUEST(xResourceReq); 39905b261ecSmrg 40005b261ecSmrg REQUEST_SIZE_MATCH(xResourceReq); 40105b261ecSmrg 4026747b715Smrg result = dixLookupResourceByType((pointer *)&win, stuff->id, 4036747b715Smrg XRT_WINDOW, client, DixReadAccess); 4046747b715Smrg if (result != Success) 4056747b715Smrg return result; 40605b261ecSmrg 40705b261ecSmrg FOR_NSCREENS_FORWARD(j) { 40805b261ecSmrg stuff->id = win->info[j].id; 40905b261ecSmrg result = (*SavedProcVector[X_UnmapWindow])(client); 41005b261ecSmrg if(result != Success) break; 41105b261ecSmrg } 41205b261ecSmrg 4136747b715Smrg return result; 41405b261ecSmrg} 41505b261ecSmrg 41605b261ecSmrg 41705b261ecSmrgint PanoramiXUnmapSubwindows(ClientPtr client) 41805b261ecSmrg{ 41905b261ecSmrg PanoramiXRes *win; 4206747b715Smrg int result, j; 42105b261ecSmrg REQUEST(xResourceReq); 42205b261ecSmrg 42305b261ecSmrg REQUEST_SIZE_MATCH(xResourceReq); 42405b261ecSmrg 4256747b715Smrg result = dixLookupResourceByType((pointer *)&win, stuff->id, 4266747b715Smrg XRT_WINDOW, client, DixReadAccess); 4276747b715Smrg if (result != Success) 4286747b715Smrg return result; 42905b261ecSmrg 43005b261ecSmrg FOR_NSCREENS_FORWARD(j) { 43105b261ecSmrg stuff->id = win->info[j].id; 43205b261ecSmrg result = (*SavedProcVector[X_UnmapSubwindows])(client); 43305b261ecSmrg if(result != Success) break; 43405b261ecSmrg } 43505b261ecSmrg 4366747b715Smrg return result; 43705b261ecSmrg} 43805b261ecSmrg 43905b261ecSmrg 44005b261ecSmrgint PanoramiXConfigureWindow(ClientPtr client) 44105b261ecSmrg{ 44205b261ecSmrg PanoramiXRes *win; 44305b261ecSmrg PanoramiXRes *sib = NULL; 44405b261ecSmrg WindowPtr pWin; 4456747b715Smrg int result, j, len, sib_offset = 0, x = 0, y = 0; 44605b261ecSmrg int x_offset = -1; 44705b261ecSmrg int y_offset = -1; 44805b261ecSmrg REQUEST(xConfigureWindowReq); 44905b261ecSmrg 45005b261ecSmrg REQUEST_AT_LEAST_SIZE(xConfigureWindowReq); 45105b261ecSmrg 4526747b715Smrg len = client->req_len - bytes_to_int32(sizeof(xConfigureWindowReq)); 45305b261ecSmrg if (Ones(stuff->mask) != len) 45405b261ecSmrg return BadLength; 45505b261ecSmrg 45605b261ecSmrg /* because we need the parent */ 4576747b715Smrg result = dixLookupResourceByType((pointer *)&pWin, stuff->window, 4586747b715Smrg RT_WINDOW, client, DixWriteAccess); 4596747b715Smrg if (result != Success) 4606747b715Smrg return result; 46105b261ecSmrg 4626747b715Smrg result = dixLookupResourceByType((pointer *)&win, stuff->window, 4636747b715Smrg XRT_WINDOW, client, DixWriteAccess); 4646747b715Smrg if (result != Success) 4656747b715Smrg return result; 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))) { 4716747b715Smrg result = dixLookupResourceByType((pointer *)&sib, tmp, XRT_WINDOW, 4726747b715Smrg client, DixReadAccess); 4736747b715Smrg if (result != Success) 4746747b715Smrg return result; 47505b261ecSmrg } 47605b261ecSmrg } 47705b261ecSmrg 4786747b715Smrg if(pWin->parent && ((pWin->parent == screenInfo.screens[0]->root) || 4796747b715Smrg (pWin->parent->drawable.id == screenInfo.screens[0]->screensaver.wid))) 48005b261ecSmrg { 48105b261ecSmrg if ((Mask)stuff->mask & CWX) { 48205b261ecSmrg x_offset = 0; 48305b261ecSmrg x = *((CARD32 *)&stuff[1]); 48405b261ecSmrg } 48505b261ecSmrg if ((Mask)stuff->mask & CWY) { 48605b261ecSmrg y_offset = (x_offset == -1) ? 0 : 1; 48705b261ecSmrg y = *((CARD32 *) &stuff[1] + y_offset); 48805b261ecSmrg } 48905b261ecSmrg } 49005b261ecSmrg 49105b261ecSmrg /* have to go forward or you get expose events before 49205b261ecSmrg ConfigureNotify events */ 49305b261ecSmrg FOR_NSCREENS_FORWARD(j) { 49405b261ecSmrg stuff->window = win->info[j].id; 49505b261ecSmrg if(sib) 49605b261ecSmrg *((CARD32 *) &stuff[1] + sib_offset) = sib->info[j].id; 49705b261ecSmrg if(x_offset >= 0) 4986747b715Smrg *((CARD32 *) &stuff[1] + x_offset) = x - screenInfo.screens[j]->x; 49905b261ecSmrg if(y_offset >= 0) 5006747b715Smrg *((CARD32 *) &stuff[1] + y_offset) = y - screenInfo.screens[j]->y; 50105b261ecSmrg result = (*SavedProcVector[X_ConfigureWindow])(client); 50205b261ecSmrg if(result != Success) break; 50305b261ecSmrg } 50405b261ecSmrg 5056747b715Smrg return result; 50605b261ecSmrg} 50705b261ecSmrg 50805b261ecSmrg 50905b261ecSmrgint PanoramiXCirculateWindow(ClientPtr client) 51005b261ecSmrg{ 51105b261ecSmrg PanoramiXRes *win; 5126747b715Smrg int result, j; 51305b261ecSmrg REQUEST(xCirculateWindowReq); 51405b261ecSmrg 51505b261ecSmrg REQUEST_SIZE_MATCH(xCirculateWindowReq); 51605b261ecSmrg 5176747b715Smrg result = dixLookupResourceByType((pointer *)&win, stuff->window, 5186747b715Smrg XRT_WINDOW, client, DixWriteAccess); 5196747b715Smrg if (result != Success) 5206747b715Smrg return result; 52105b261ecSmrg 52205b261ecSmrg FOR_NSCREENS_FORWARD(j) { 52305b261ecSmrg stuff->window = win->info[j].id; 52405b261ecSmrg result = (*SavedProcVector[X_CirculateWindow])(client); 52505b261ecSmrg if(result != Success) break; 52605b261ecSmrg } 52705b261ecSmrg 5286747b715Smrg return result; 52905b261ecSmrg} 53005b261ecSmrg 53105b261ecSmrg 53205b261ecSmrgint PanoramiXGetGeometry(ClientPtr client) 53305b261ecSmrg{ 53405b261ecSmrg xGetGeometryReply rep; 53505b261ecSmrg DrawablePtr pDraw; 53605b261ecSmrg int rc; 53705b261ecSmrg REQUEST(xResourceReq); 53805b261ecSmrg 53905b261ecSmrg REQUEST_SIZE_MATCH(xResourceReq); 5404642e01fSmrg rc = dixLookupDrawable(&pDraw, stuff->id, client, M_ANY, DixGetAttrAccess); 54105b261ecSmrg if (rc != Success) 54205b261ecSmrg return rc; 54305b261ecSmrg 54405b261ecSmrg rep.type = X_Reply; 54505b261ecSmrg rep.length = 0; 54605b261ecSmrg rep.sequenceNumber = client->sequence; 5476747b715Smrg rep.root = screenInfo.screens[0]->root->drawable.id; 54805b261ecSmrg rep.depth = pDraw->depth; 54905b261ecSmrg rep.width = pDraw->width; 55005b261ecSmrg rep.height = pDraw->height; 55105b261ecSmrg rep.x = rep.y = rep.borderWidth = 0; 55205b261ecSmrg 55305b261ecSmrg if (stuff->id == rep.root) { 55405b261ecSmrg xWindowRoot *root = (xWindowRoot *) 55505b261ecSmrg (ConnectionInfo + connBlockScreenStart); 55605b261ecSmrg 55705b261ecSmrg rep.width = root->pixWidth; 55805b261ecSmrg rep.height = root->pixHeight; 55905b261ecSmrg } else 5606747b715Smrg if (WindowDrawable(pDraw->type)) 56105b261ecSmrg { 56205b261ecSmrg WindowPtr pWin = (WindowPtr)pDraw; 56305b261ecSmrg rep.x = pWin->origin.x - wBorderWidth (pWin); 56405b261ecSmrg rep.y = pWin->origin.y - wBorderWidth (pWin); 5656747b715Smrg if((pWin->parent == screenInfo.screens[0]->root) || 5666747b715Smrg (pWin->parent->drawable.id == screenInfo.screens[0]->screensaver.wid)) 56705b261ecSmrg { 5686747b715Smrg rep.x += screenInfo.screens[0]->x; 5696747b715Smrg rep.y += screenInfo.screens[0]->y; 57005b261ecSmrg } 57105b261ecSmrg rep.borderWidth = pWin->borderWidth; 57205b261ecSmrg } 57305b261ecSmrg 57405b261ecSmrg WriteReplyToClient(client, sizeof(xGetGeometryReply), &rep); 5756747b715Smrg return Success; 57605b261ecSmrg} 57705b261ecSmrg 57805b261ecSmrgint PanoramiXTranslateCoords(ClientPtr client) 57905b261ecSmrg{ 58005b261ecSmrg INT16 x, y; 58105b261ecSmrg REQUEST(xTranslateCoordsReq); 58205b261ecSmrg int rc; 58305b261ecSmrg WindowPtr pWin, pDst; 58405b261ecSmrg xTranslateCoordsReply rep; 58505b261ecSmrg 58605b261ecSmrg REQUEST_SIZE_MATCH(xTranslateCoordsReq); 58705b261ecSmrg rc = dixLookupWindow(&pWin, stuff->srcWid, client, DixReadAccess); 58805b261ecSmrg if (rc != Success) 58905b261ecSmrg return rc; 59005b261ecSmrg rc = dixLookupWindow(&pDst, stuff->dstWid, client, DixReadAccess); 59105b261ecSmrg if (rc != Success) 59205b261ecSmrg return rc; 59305b261ecSmrg rep.type = X_Reply; 59405b261ecSmrg rep.length = 0; 59505b261ecSmrg rep.sequenceNumber = client->sequence; 59605b261ecSmrg rep.sameScreen = xTrue; 59705b261ecSmrg rep.child = None; 59805b261ecSmrg 5996747b715Smrg if((pWin == screenInfo.screens[0]->root) || 6006747b715Smrg (pWin->drawable.id == screenInfo.screens[0]->screensaver.wid)) 60105b261ecSmrg { 6026747b715Smrg x = stuff->srcX - screenInfo.screens[0]->x; 6036747b715Smrg y = stuff->srcY - screenInfo.screens[0]->y; 60405b261ecSmrg } else { 60505b261ecSmrg x = pWin->drawable.x + stuff->srcX; 60605b261ecSmrg y = pWin->drawable.y + stuff->srcY; 60705b261ecSmrg } 60805b261ecSmrg pWin = pDst->firstChild; 60905b261ecSmrg while (pWin) { 61005b261ecSmrg BoxRec box; 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 /* When a window is shaped, a further check 61905b261ecSmrg * is made to see if the point is inside 62005b261ecSmrg * borderSize 62105b261ecSmrg */ 62205b261ecSmrg && (!wBoundingShape(pWin) || 6236747b715Smrg RegionContainsPoint(wBoundingShape(pWin), 62405b261ecSmrg x - pWin->drawable.x, 62505b261ecSmrg y - pWin->drawable.y, &box)) 62605b261ecSmrg ) 62705b261ecSmrg { 62805b261ecSmrg rep.child = pWin->drawable.id; 62905b261ecSmrg pWin = (WindowPtr) NULL; 63005b261ecSmrg } 63105b261ecSmrg else 63205b261ecSmrg pWin = pWin->nextSib; 63305b261ecSmrg } 63405b261ecSmrg rep.dstX = x - pDst->drawable.x; 63505b261ecSmrg rep.dstY = y - pDst->drawable.y; 6366747b715Smrg if((pDst == screenInfo.screens[0]->root) || 6376747b715Smrg (pWin->drawable.id == screenInfo.screens[0]->screensaver.wid)) 63805b261ecSmrg { 6396747b715Smrg rep.dstX += screenInfo.screens[0]->x; 6406747b715Smrg rep.dstY += screenInfo.screens[0]->y; 64105b261ecSmrg } 64205b261ecSmrg 64305b261ecSmrg WriteReplyToClient(client, sizeof(xTranslateCoordsReply), &rep); 6446747b715Smrg return Success; 64505b261ecSmrg} 64605b261ecSmrg 64705b261ecSmrgint PanoramiXCreatePixmap(ClientPtr client) 64805b261ecSmrg{ 64905b261ecSmrg PanoramiXRes *refDraw, *newPix; 6506747b715Smrg int result, j; 65105b261ecSmrg REQUEST(xCreatePixmapReq); 65205b261ecSmrg 65305b261ecSmrg REQUEST_SIZE_MATCH(xCreatePixmapReq); 65405b261ecSmrg client->errorValue = stuff->pid; 65505b261ecSmrg 6566747b715Smrg result = dixLookupResourceByClass((pointer *)&refDraw, stuff->drawable, 6576747b715Smrg XRC_DRAWABLE, client, DixReadAccess); 6586747b715Smrg if (result != Success) 6596747b715Smrg return (result == BadValue) ? BadDrawable : result; 66005b261ecSmrg 6616747b715Smrg if(!(newPix = malloc(sizeof(PanoramiXRes)))) 66205b261ecSmrg return BadAlloc; 66305b261ecSmrg 66405b261ecSmrg newPix->type = XRT_PIXMAP; 66505b261ecSmrg newPix->u.pix.shared = FALSE; 66605b261ecSmrg newPix->info[0].id = stuff->pid; 66705b261ecSmrg for(j = 1; j < PanoramiXNumScreens; j++) 66805b261ecSmrg newPix->info[j].id = FakeClientID(client->index); 66905b261ecSmrg 67005b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 67105b261ecSmrg stuff->pid = newPix->info[j].id; 67205b261ecSmrg stuff->drawable = refDraw->info[j].id; 67305b261ecSmrg result = (*SavedProcVector[X_CreatePixmap])(client); 67405b261ecSmrg if(result != Success) break; 67505b261ecSmrg } 67605b261ecSmrg 67705b261ecSmrg if (result == Success) 67805b261ecSmrg AddResource(newPix->info[0].id, XRT_PIXMAP, newPix); 67905b261ecSmrg else 6806747b715Smrg free(newPix); 68105b261ecSmrg 6826747b715Smrg return result; 68305b261ecSmrg} 68405b261ecSmrg 68505b261ecSmrg 68605b261ecSmrgint PanoramiXFreePixmap(ClientPtr client) 68705b261ecSmrg{ 68805b261ecSmrg PanoramiXRes *pix; 6896747b715Smrg int result, j; 69005b261ecSmrg REQUEST(xResourceReq); 69105b261ecSmrg 69205b261ecSmrg REQUEST_SIZE_MATCH(xResourceReq); 69305b261ecSmrg 69405b261ecSmrg client->errorValue = stuff->id; 69505b261ecSmrg 6966747b715Smrg result = dixLookupResourceByType((pointer *)&pix, stuff->id, XRT_PIXMAP, 6976747b715Smrg client, DixDestroyAccess); 6986747b715Smrg if (result != Success) 6996747b715Smrg return result; 70005b261ecSmrg 70105b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 70205b261ecSmrg stuff->id = pix->info[j].id; 70305b261ecSmrg result = (*SavedProcVector[X_FreePixmap])(client); 70405b261ecSmrg if(result != Success) break; 70505b261ecSmrg } 70605b261ecSmrg 70705b261ecSmrg /* Since ProcFreePixmap is using FreeResource, it will free 70805b261ecSmrg our resource for us on the last pass through the loop above */ 70905b261ecSmrg 7106747b715Smrg return result; 71105b261ecSmrg} 71205b261ecSmrg 71305b261ecSmrg 71405b261ecSmrgint PanoramiXCreateGC(ClientPtr client) 71505b261ecSmrg{ 71605b261ecSmrg PanoramiXRes *refDraw; 71705b261ecSmrg PanoramiXRes *newGC; 71805b261ecSmrg PanoramiXRes *stip = NULL; 71905b261ecSmrg PanoramiXRes *tile = NULL; 72005b261ecSmrg PanoramiXRes *clip = NULL; 72105b261ecSmrg REQUEST(xCreateGCReq); 72205b261ecSmrg int tile_offset = 0, stip_offset = 0, clip_offset = 0; 7236747b715Smrg int result, len, j; 72405b261ecSmrg XID tmp; 72505b261ecSmrg 72605b261ecSmrg REQUEST_AT_LEAST_SIZE(xCreateGCReq); 72705b261ecSmrg 72805b261ecSmrg client->errorValue = stuff->gc; 7296747b715Smrg len = client->req_len - bytes_to_int32(sizeof(xCreateGCReq)); 73005b261ecSmrg if (Ones(stuff->mask) != len) 73105b261ecSmrg return BadLength; 73205b261ecSmrg 7336747b715Smrg result = dixLookupResourceByClass((pointer *)&refDraw, stuff->drawable, 7346747b715Smrg XRC_DRAWABLE, client, DixReadAccess); 7356747b715Smrg if (result != Success) 7366747b715Smrg return (result == BadValue) ? BadDrawable : result; 73705b261ecSmrg 73805b261ecSmrg if ((Mask)stuff->mask & GCTile) { 73905b261ecSmrg tile_offset = Ones((Mask)stuff->mask & (GCTile - 1)); 74005b261ecSmrg if ((tmp = *((CARD32 *) &stuff[1] + tile_offset))) { 7416747b715Smrg result = dixLookupResourceByType((pointer *)&tile, tmp, XRT_PIXMAP, 7426747b715Smrg client, DixReadAccess); 7436747b715Smrg if (result != Success) 7446747b715Smrg return result; 74505b261ecSmrg } 74605b261ecSmrg } 74705b261ecSmrg if ((Mask)stuff->mask & GCStipple) { 74805b261ecSmrg stip_offset = Ones((Mask)stuff->mask & (GCStipple - 1)); 74905b261ecSmrg if ((tmp = *((CARD32 *) &stuff[1] + stip_offset))) { 7506747b715Smrg result = dixLookupResourceByType((pointer *)&stip, tmp, XRT_PIXMAP, 7516747b715Smrg client, DixReadAccess); 7526747b715Smrg if (result != Success) 7536747b715Smrg return result; 75405b261ecSmrg } 75505b261ecSmrg } 75605b261ecSmrg if ((Mask)stuff->mask & GCClipMask) { 75705b261ecSmrg clip_offset = Ones((Mask)stuff->mask & (GCClipMask - 1)); 75805b261ecSmrg if ((tmp = *((CARD32 *) &stuff[1] + clip_offset))) { 7596747b715Smrg result = dixLookupResourceByType((pointer *)&clip, tmp, XRT_PIXMAP, 7606747b715Smrg client, DixReadAccess); 7616747b715Smrg if (result != Success) 7626747b715Smrg return result; 76305b261ecSmrg } 76405b261ecSmrg } 76505b261ecSmrg 7666747b715Smrg if(!(newGC = malloc(sizeof(PanoramiXRes)))) 76705b261ecSmrg return BadAlloc; 76805b261ecSmrg 76905b261ecSmrg newGC->type = XRT_GC; 77005b261ecSmrg newGC->info[0].id = stuff->gc; 77105b261ecSmrg for(j = 1; j < PanoramiXNumScreens; j++) 77205b261ecSmrg newGC->info[j].id = FakeClientID(client->index); 77305b261ecSmrg 77405b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 77505b261ecSmrg stuff->gc = newGC->info[j].id; 77605b261ecSmrg stuff->drawable = refDraw->info[j].id; 77705b261ecSmrg if (tile) 77805b261ecSmrg *((CARD32 *) &stuff[1] + tile_offset) = tile->info[j].id; 77905b261ecSmrg if (stip) 78005b261ecSmrg *((CARD32 *) &stuff[1] + stip_offset) = stip->info[j].id; 78105b261ecSmrg if (clip) 78205b261ecSmrg *((CARD32 *) &stuff[1] + clip_offset) = clip->info[j].id; 78305b261ecSmrg result = (*SavedProcVector[X_CreateGC])(client); 78405b261ecSmrg if(result != Success) break; 78505b261ecSmrg } 78605b261ecSmrg 78705b261ecSmrg if (result == Success) 78805b261ecSmrg AddResource(newGC->info[0].id, XRT_GC, newGC); 78905b261ecSmrg else 7906747b715Smrg free(newGC); 79105b261ecSmrg 7926747b715Smrg return result; 79305b261ecSmrg} 79405b261ecSmrg 79505b261ecSmrgint PanoramiXChangeGC(ClientPtr client) 79605b261ecSmrg{ 79705b261ecSmrg PanoramiXRes *gc; 79805b261ecSmrg PanoramiXRes *stip = NULL; 79905b261ecSmrg PanoramiXRes *tile = NULL; 80005b261ecSmrg PanoramiXRes *clip = NULL; 80105b261ecSmrg REQUEST(xChangeGCReq); 80205b261ecSmrg int tile_offset = 0, stip_offset = 0, clip_offset = 0; 8036747b715Smrg int result, len, j; 80405b261ecSmrg XID tmp; 80505b261ecSmrg 80605b261ecSmrg REQUEST_AT_LEAST_SIZE(xChangeGCReq); 80705b261ecSmrg 8086747b715Smrg len = client->req_len - bytes_to_int32(sizeof(xChangeGCReq)); 80905b261ecSmrg if (Ones(stuff->mask) != len) 81005b261ecSmrg return BadLength; 81105b261ecSmrg 8126747b715Smrg result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC, 8136747b715Smrg client, DixReadAccess); 8146747b715Smrg if (result != Success) 8156747b715Smrg return result; 81605b261ecSmrg 81705b261ecSmrg if ((Mask)stuff->mask & GCTile) { 81805b261ecSmrg tile_offset = Ones((Mask)stuff->mask & (GCTile - 1)); 81905b261ecSmrg if ((tmp = *((CARD32 *) &stuff[1] + tile_offset))) { 8206747b715Smrg result = dixLookupResourceByType((pointer *)&tile, tmp, XRT_PIXMAP, 8216747b715Smrg client, DixReadAccess); 8226747b715Smrg if (result != Success) 8236747b715Smrg return result; 82405b261ecSmrg } 82505b261ecSmrg } 82605b261ecSmrg if ((Mask)stuff->mask & GCStipple) { 82705b261ecSmrg stip_offset = Ones((Mask)stuff->mask & (GCStipple - 1)); 82805b261ecSmrg if ((tmp = *((CARD32 *) &stuff[1] + stip_offset))) { 8296747b715Smrg result = dixLookupResourceByType((pointer *)&stip, tmp, XRT_PIXMAP, 8306747b715Smrg client, DixReadAccess); 8316747b715Smrg if (result != Success) 8326747b715Smrg return result; 83305b261ecSmrg } 83405b261ecSmrg } 83505b261ecSmrg if ((Mask)stuff->mask & GCClipMask) { 83605b261ecSmrg clip_offset = Ones((Mask)stuff->mask & (GCClipMask - 1)); 83705b261ecSmrg if ((tmp = *((CARD32 *) &stuff[1] + clip_offset))) { 8386747b715Smrg result = dixLookupResourceByType((pointer *)&clip, tmp, XRT_PIXMAP, 8396747b715Smrg client, DixReadAccess); 8406747b715Smrg if (result != Success) 8416747b715Smrg return result; 84205b261ecSmrg } 84305b261ecSmrg } 84405b261ecSmrg 84505b261ecSmrg 84605b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 84705b261ecSmrg stuff->gc = gc->info[j].id; 84805b261ecSmrg if (tile) 84905b261ecSmrg *((CARD32 *) &stuff[1] + tile_offset) = tile->info[j].id; 85005b261ecSmrg if (stip) 85105b261ecSmrg *((CARD32 *) &stuff[1] + stip_offset) = stip->info[j].id; 85205b261ecSmrg if (clip) 85305b261ecSmrg *((CARD32 *) &stuff[1] + clip_offset) = clip->info[j].id; 85405b261ecSmrg result = (*SavedProcVector[X_ChangeGC])(client); 85505b261ecSmrg if(result != Success) break; 85605b261ecSmrg } 85705b261ecSmrg 8586747b715Smrg return result; 85905b261ecSmrg} 86005b261ecSmrg 86105b261ecSmrg 86205b261ecSmrgint PanoramiXCopyGC(ClientPtr client) 86305b261ecSmrg{ 86405b261ecSmrg PanoramiXRes *srcGC, *dstGC; 8656747b715Smrg int result, j; 86605b261ecSmrg REQUEST(xCopyGCReq); 86705b261ecSmrg 86805b261ecSmrg REQUEST_SIZE_MATCH(xCopyGCReq); 86905b261ecSmrg 8706747b715Smrg result = dixLookupResourceByType((pointer *)&srcGC, stuff->srcGC, XRT_GC, 8716747b715Smrg client, DixReadAccess); 8726747b715Smrg if (result != Success) 8736747b715Smrg return result; 87405b261ecSmrg 8756747b715Smrg result = dixLookupResourceByType((pointer *)&dstGC, stuff->dstGC, XRT_GC, 8766747b715Smrg client, DixWriteAccess); 8776747b715Smrg if (result != Success) 8786747b715Smrg return result; 87905b261ecSmrg 88005b261ecSmrg FOR_NSCREENS(j) { 88105b261ecSmrg stuff->srcGC = srcGC->info[j].id; 88205b261ecSmrg stuff->dstGC = dstGC->info[j].id; 88305b261ecSmrg result = (*SavedProcVector[X_CopyGC])(client); 88405b261ecSmrg if(result != Success) break; 88505b261ecSmrg } 88605b261ecSmrg 8876747b715Smrg return result; 88805b261ecSmrg} 88905b261ecSmrg 89005b261ecSmrg 89105b261ecSmrgint PanoramiXSetDashes(ClientPtr client) 89205b261ecSmrg{ 89305b261ecSmrg PanoramiXRes *gc; 8946747b715Smrg int result, j; 89505b261ecSmrg REQUEST(xSetDashesReq); 89605b261ecSmrg 89705b261ecSmrg REQUEST_FIXED_SIZE(xSetDashesReq, stuff->nDashes); 89805b261ecSmrg 8996747b715Smrg result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC, 9006747b715Smrg client, DixWriteAccess); 9016747b715Smrg if (result != Success) 9026747b715Smrg return result; 90305b261ecSmrg 90405b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 90505b261ecSmrg stuff->gc = gc->info[j].id; 90605b261ecSmrg result = (*SavedProcVector[X_SetDashes])(client); 90705b261ecSmrg if(result != Success) break; 90805b261ecSmrg } 90905b261ecSmrg 9106747b715Smrg return result; 91105b261ecSmrg} 91205b261ecSmrg 91305b261ecSmrg 91405b261ecSmrgint PanoramiXSetClipRectangles(ClientPtr client) 91505b261ecSmrg{ 91605b261ecSmrg PanoramiXRes *gc; 9176747b715Smrg int result, j; 91805b261ecSmrg REQUEST(xSetClipRectanglesReq); 91905b261ecSmrg 92005b261ecSmrg REQUEST_AT_LEAST_SIZE(xSetClipRectanglesReq); 92105b261ecSmrg 9226747b715Smrg result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC, 9236747b715Smrg client, DixWriteAccess); 9246747b715Smrg if (result != Success) 9256747b715Smrg return result; 92605b261ecSmrg 92705b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 92805b261ecSmrg stuff->gc = gc->info[j].id; 92905b261ecSmrg result = (*SavedProcVector[X_SetClipRectangles])(client); 93005b261ecSmrg if(result != Success) break; 93105b261ecSmrg } 93205b261ecSmrg 9336747b715Smrg return result; 93405b261ecSmrg} 93505b261ecSmrg 93605b261ecSmrg 93705b261ecSmrgint PanoramiXFreeGC(ClientPtr client) 93805b261ecSmrg{ 93905b261ecSmrg PanoramiXRes *gc; 9406747b715Smrg int result, j; 94105b261ecSmrg REQUEST(xResourceReq); 94205b261ecSmrg 94305b261ecSmrg REQUEST_SIZE_MATCH(xResourceReq); 94405b261ecSmrg 9456747b715Smrg result = dixLookupResourceByType((pointer *)&gc, stuff->id, XRT_GC, 9466747b715Smrg client, DixDestroyAccess); 9476747b715Smrg if (result != Success) 9486747b715Smrg return result; 94905b261ecSmrg 95005b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 95105b261ecSmrg stuff->id = gc->info[j].id; 95205b261ecSmrg result = (*SavedProcVector[X_FreeGC])(client); 95305b261ecSmrg if(result != Success) break; 95405b261ecSmrg } 95505b261ecSmrg 95605b261ecSmrg /* Since ProcFreeGC is using FreeResource, it will free 95705b261ecSmrg our resource for us on the last pass through the loop above */ 95805b261ecSmrg 9596747b715Smrg return result; 96005b261ecSmrg} 96105b261ecSmrg 96205b261ecSmrg 96305b261ecSmrgint PanoramiXClearToBackground(ClientPtr client) 96405b261ecSmrg{ 96505b261ecSmrg PanoramiXRes *win; 9666747b715Smrg int result, j, x, y; 96705b261ecSmrg Bool isRoot; 96805b261ecSmrg REQUEST(xClearAreaReq); 96905b261ecSmrg 97005b261ecSmrg REQUEST_SIZE_MATCH(xClearAreaReq); 97105b261ecSmrg 9726747b715Smrg result = dixLookupResourceByType((pointer *)&win, stuff->window, 9736747b715Smrg XRT_WINDOW, client, DixWriteAccess); 9746747b715Smrg if (result != Success) 9756747b715Smrg return result; 97605b261ecSmrg 97705b261ecSmrg x = stuff->x; 97805b261ecSmrg y = stuff->y; 97905b261ecSmrg isRoot = win->u.win.root; 98005b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 98105b261ecSmrg stuff->window = win->info[j].id; 98205b261ecSmrg if(isRoot) { 9836747b715Smrg stuff->x = x - screenInfo.screens[j]->x; 9846747b715Smrg stuff->y = y - screenInfo.screens[j]->y; 98505b261ecSmrg } 98605b261ecSmrg result = (*SavedProcVector[X_ClearArea])(client); 98705b261ecSmrg if(result != Success) break; 98805b261ecSmrg } 98905b261ecSmrg 9906747b715Smrg return result; 99105b261ecSmrg} 99205b261ecSmrg 99305b261ecSmrg 99405b261ecSmrg/* 99505b261ecSmrg For Window to Pixmap copies you're screwed since each screen's 99605b261ecSmrg pixmap will look like what it sees on its screen. Unless the 99705b261ecSmrg screens overlap and the window lies on each, the two copies 99805b261ecSmrg will be out of sync. To remedy this we do a GetImage and PutImage 99905b261ecSmrg in place of the copy. Doing this as a single Image isn't quite 100005b261ecSmrg correct since it will include the obscured areas but we will 100105b261ecSmrg have to fix this later. (MArk). 100205b261ecSmrg*/ 100305b261ecSmrg 100405b261ecSmrgint PanoramiXCopyArea(ClientPtr client) 100505b261ecSmrg{ 10066747b715Smrg int j, result, srcx, srcy, dstx, dsty; 100705b261ecSmrg PanoramiXRes *gc, *src, *dst; 100805b261ecSmrg Bool srcIsRoot = FALSE; 100905b261ecSmrg Bool dstIsRoot = FALSE; 101005b261ecSmrg Bool srcShared, dstShared; 101105b261ecSmrg REQUEST(xCopyAreaReq); 101205b261ecSmrg 101305b261ecSmrg REQUEST_SIZE_MATCH(xCopyAreaReq); 101405b261ecSmrg 10156747b715Smrg result = dixLookupResourceByClass((pointer *)&src, stuff->srcDrawable, 10166747b715Smrg XRC_DRAWABLE, client, DixReadAccess); 10176747b715Smrg if (result != Success) 10186747b715Smrg return (result == BadValue) ? BadDrawable : result; 101905b261ecSmrg 102005b261ecSmrg srcShared = IS_SHARED_PIXMAP(src); 102105b261ecSmrg 10226747b715Smrg result = dixLookupResourceByClass((pointer *)&dst, stuff->dstDrawable, 10236747b715Smrg XRC_DRAWABLE, client, DixWriteAccess); 10246747b715Smrg if (result != Success) 10256747b715Smrg return (result == BadValue) ? BadDrawable : result; 102605b261ecSmrg 102705b261ecSmrg dstShared = IS_SHARED_PIXMAP(dst); 102805b261ecSmrg 102905b261ecSmrg if(dstShared && srcShared) 103005b261ecSmrg return (* SavedProcVector[X_CopyArea])(client); 103105b261ecSmrg 10326747b715Smrg result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC, 10336747b715Smrg client, DixReadAccess); 10346747b715Smrg if (result != Success) 10356747b715Smrg return result; 103605b261ecSmrg 103705b261ecSmrg if((dst->type == XRT_WINDOW) && dst->u.win.root) 103805b261ecSmrg dstIsRoot = TRUE; 103905b261ecSmrg if((src->type == XRT_WINDOW) && src->u.win.root) 104005b261ecSmrg srcIsRoot = TRUE; 104105b261ecSmrg 104205b261ecSmrg srcx = stuff->srcX; srcy = stuff->srcY; 104305b261ecSmrg dstx = stuff->dstX; dsty = stuff->dstY; 104405b261ecSmrg if((dst->type == XRT_PIXMAP) && (src->type == XRT_WINDOW)) { 104505b261ecSmrg DrawablePtr drawables[MAXSCREENS]; 104605b261ecSmrg DrawablePtr pDst; 104705b261ecSmrg GCPtr pGC; 104805b261ecSmrg char *data; 104905b261ecSmrg int pitch, rc; 105005b261ecSmrg 105105b261ecSmrg FOR_NSCREENS(j) { 105205b261ecSmrg rc = dixLookupDrawable(drawables+j, src->info[j].id, client, 0, 10534642e01fSmrg DixGetAttrAccess); 105405b261ecSmrg if (rc != Success) 105505b261ecSmrg return rc; 105605b261ecSmrg } 105705b261ecSmrg 105805b261ecSmrg pitch = PixmapBytePad(stuff->width, drawables[0]->depth); 10596747b715Smrg if(!(data = calloc(1, stuff->height * pitch))) 106005b261ecSmrg return BadAlloc; 106105b261ecSmrg 106205b261ecSmrg XineramaGetImageData(drawables, srcx, srcy, 106305b261ecSmrg stuff->width, stuff->height, ZPixmap, ~0, data, pitch, 106405b261ecSmrg srcIsRoot); 106505b261ecSmrg 106605b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 106705b261ecSmrg stuff->gc = gc->info[j].id; 10684642e01fSmrg VALIDATE_DRAWABLE_AND_GC(dst->info[j].id, pDst, DixWriteAccess); 106905b261ecSmrg if(drawables[0]->depth != pDst->depth) { 107005b261ecSmrg client->errorValue = stuff->dstDrawable; 10716747b715Smrg free(data); 10726747b715Smrg return BadMatch; 107305b261ecSmrg } 107405b261ecSmrg 107505b261ecSmrg (*pGC->ops->PutImage) (pDst, pGC, pDst->depth, dstx, dsty, 107605b261ecSmrg stuff->width, stuff->height, 107705b261ecSmrg 0, ZPixmap, data); 107805b261ecSmrg 107905b261ecSmrg if(dstShared) break; 108005b261ecSmrg } 108105b261ecSmrg 10826747b715Smrg free(data); 108305b261ecSmrg } else { 108405b261ecSmrg DrawablePtr pDst = NULL, pSrc = NULL; 108505b261ecSmrg GCPtr pGC = NULL; 10866747b715Smrg RegionRec totalReg; 108705b261ecSmrg int rc; 108805b261ecSmrg 10896747b715Smrg RegionNull(&totalReg); 109005b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 10916747b715Smrg RegionPtr pRgn; 109205b261ecSmrg stuff->dstDrawable = dst->info[j].id; 109305b261ecSmrg stuff->srcDrawable = src->info[j].id; 109405b261ecSmrg stuff->gc = gc->info[j].id; 109505b261ecSmrg if (srcIsRoot) { 10966747b715Smrg stuff->srcX = srcx - screenInfo.screens[j]->x; 10976747b715Smrg stuff->srcY = srcy - screenInfo.screens[j]->y; 109805b261ecSmrg } 109905b261ecSmrg if (dstIsRoot) { 11006747b715Smrg stuff->dstX = dstx - screenInfo.screens[j]->x; 11016747b715Smrg stuff->dstY = dsty - screenInfo.screens[j]->y; 110205b261ecSmrg } 110305b261ecSmrg 11044642e01fSmrg VALIDATE_DRAWABLE_AND_GC(stuff->dstDrawable, pDst, DixWriteAccess); 11054642e01fSmrg 110605b261ecSmrg if (stuff->dstDrawable != stuff->srcDrawable) { 110705b261ecSmrg rc = dixLookupDrawable(&pSrc, stuff->srcDrawable, client, 0, 110805b261ecSmrg DixReadAccess); 110905b261ecSmrg if (rc != Success) 111005b261ecSmrg return rc; 111105b261ecSmrg 111205b261ecSmrg if ((pDst->pScreen != pSrc->pScreen) || 111305b261ecSmrg (pDst->depth != pSrc->depth)) { 111405b261ecSmrg client->errorValue = stuff->dstDrawable; 11156747b715Smrg return BadMatch; 111605b261ecSmrg } 111705b261ecSmrg } else 111805b261ecSmrg pSrc = pDst; 111905b261ecSmrg 11206747b715Smrg pRgn = (*pGC->ops->CopyArea)(pSrc, pDst, pGC, 112105b261ecSmrg stuff->srcX, stuff->srcY, 112205b261ecSmrg stuff->width, stuff->height, 112305b261ecSmrg stuff->dstX, stuff->dstY); 11246747b715Smrg if(pGC->graphicsExposures && pRgn) { 11256747b715Smrg if(srcIsRoot) { 11266747b715Smrg RegionTranslate(pRgn, 11276747b715Smrg screenInfo.screens[j]->x, screenInfo.screens[j]->y); 11286747b715Smrg } 11296747b715Smrg RegionAppend(&totalReg, pRgn); 11306747b715Smrg RegionDestroy(pRgn); 11316747b715Smrg } 113205b261ecSmrg 11336747b715Smrg if(dstShared) 113405b261ecSmrg break; 113505b261ecSmrg } 113605b261ecSmrg 113705b261ecSmrg if(pGC->graphicsExposures) { 113805b261ecSmrg Bool overlap; 11396747b715Smrg RegionValidate(&totalReg, &overlap); 11406747b715Smrg (*pDst->pScreen->SendGraphicsExpose)( 114105b261ecSmrg client, &totalReg, stuff->dstDrawable, X_CopyArea, 0); 11426747b715Smrg RegionUninit(&totalReg); 114305b261ecSmrg } 114405b261ecSmrg } 114505b261ecSmrg 11466747b715Smrg return Success; 114705b261ecSmrg} 114805b261ecSmrg 114905b261ecSmrg 115005b261ecSmrgint PanoramiXCopyPlane(ClientPtr client) 115105b261ecSmrg{ 115205b261ecSmrg int j, srcx, srcy, dstx, dsty, rc; 115305b261ecSmrg PanoramiXRes *gc, *src, *dst; 115405b261ecSmrg Bool srcIsRoot = FALSE; 115505b261ecSmrg Bool dstIsRoot = FALSE; 115605b261ecSmrg Bool srcShared, dstShared; 115705b261ecSmrg DrawablePtr psrcDraw, pdstDraw = NULL; 115805b261ecSmrg GCPtr pGC = NULL; 11596747b715Smrg RegionRec totalReg; 116005b261ecSmrg REQUEST(xCopyPlaneReq); 116105b261ecSmrg 116205b261ecSmrg REQUEST_SIZE_MATCH(xCopyPlaneReq); 116305b261ecSmrg 11646747b715Smrg rc = dixLookupResourceByClass((pointer *)&src, stuff->srcDrawable, 11656747b715Smrg XRC_DRAWABLE, client, DixReadAccess); 11666747b715Smrg if (rc != Success) 11676747b715Smrg return (rc == BadValue) ? BadDrawable : rc; 116805b261ecSmrg 116905b261ecSmrg srcShared = IS_SHARED_PIXMAP(src); 117005b261ecSmrg 11716747b715Smrg rc = dixLookupResourceByClass((pointer *)&dst, stuff->dstDrawable, 11726747b715Smrg XRC_DRAWABLE, client, DixWriteAccess); 11736747b715Smrg if (rc != Success) 11746747b715Smrg return (rc == BadValue) ? BadDrawable : rc; 117505b261ecSmrg 117605b261ecSmrg dstShared = IS_SHARED_PIXMAP(dst); 117705b261ecSmrg 117805b261ecSmrg if(dstShared && srcShared) 117905b261ecSmrg return (* SavedProcVector[X_CopyPlane])(client); 118005b261ecSmrg 11816747b715Smrg rc = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC, 11826747b715Smrg client, DixReadAccess); 11836747b715Smrg if (rc != Success) 11846747b715Smrg return rc; 118505b261ecSmrg 118605b261ecSmrg if((dst->type == XRT_WINDOW) && dst->u.win.root) 118705b261ecSmrg dstIsRoot = TRUE; 118805b261ecSmrg if((src->type == XRT_WINDOW) && src->u.win.root) 118905b261ecSmrg srcIsRoot = TRUE; 119005b261ecSmrg 119105b261ecSmrg srcx = stuff->srcX; srcy = stuff->srcY; 119205b261ecSmrg dstx = stuff->dstX; dsty = stuff->dstY; 119305b261ecSmrg 11946747b715Smrg RegionNull(&totalReg); 119505b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 11966747b715Smrg RegionPtr pRgn; 119705b261ecSmrg stuff->dstDrawable = dst->info[j].id; 119805b261ecSmrg stuff->srcDrawable = src->info[j].id; 119905b261ecSmrg stuff->gc = gc->info[j].id; 120005b261ecSmrg if (srcIsRoot) { 12016747b715Smrg stuff->srcX = srcx - screenInfo.screens[j]->x; 12026747b715Smrg stuff->srcY = srcy - screenInfo.screens[j]->y; 120305b261ecSmrg } 120405b261ecSmrg if (dstIsRoot) { 12056747b715Smrg stuff->dstX = dstx - screenInfo.screens[j]->x; 12066747b715Smrg stuff->dstY = dsty - screenInfo.screens[j]->y; 120705b261ecSmrg } 120805b261ecSmrg 12094642e01fSmrg VALIDATE_DRAWABLE_AND_GC(stuff->dstDrawable, pdstDraw, DixWriteAccess); 121005b261ecSmrg if (stuff->dstDrawable != stuff->srcDrawable) { 121105b261ecSmrg rc = dixLookupDrawable(&psrcDraw, stuff->srcDrawable, client, 0, 121205b261ecSmrg DixReadAccess); 121305b261ecSmrg if (rc != Success) 121405b261ecSmrg return rc; 121505b261ecSmrg 121605b261ecSmrg if (pdstDraw->pScreen != psrcDraw->pScreen) { 121705b261ecSmrg client->errorValue = stuff->dstDrawable; 12186747b715Smrg return BadMatch; 121905b261ecSmrg } 122005b261ecSmrg } else 122105b261ecSmrg psrcDraw = pdstDraw; 122205b261ecSmrg 122305b261ecSmrg if(stuff->bitPlane == 0 || (stuff->bitPlane & (stuff->bitPlane - 1)) || 122405b261ecSmrg (stuff->bitPlane > (1L << (psrcDraw->depth - 1)))) { 122505b261ecSmrg client->errorValue = stuff->bitPlane; 12266747b715Smrg return BadValue; 122705b261ecSmrg } 122805b261ecSmrg 12296747b715Smrg pRgn = (*pGC->ops->CopyPlane)(psrcDraw, pdstDraw, pGC, 123005b261ecSmrg stuff->srcX, stuff->srcY, 123105b261ecSmrg stuff->width, stuff->height, 123205b261ecSmrg stuff->dstX, stuff->dstY, stuff->bitPlane); 12336747b715Smrg if(pGC->graphicsExposures && pRgn) { 12346747b715Smrg RegionAppend(&totalReg, pRgn); 12356747b715Smrg RegionDestroy(pRgn); 12366747b715Smrg } 123705b261ecSmrg 12386747b715Smrg if(dstShared) 123905b261ecSmrg break; 124005b261ecSmrg } 124105b261ecSmrg 124205b261ecSmrg if(pGC->graphicsExposures) { 124305b261ecSmrg Bool overlap; 12446747b715Smrg RegionValidate(&totalReg, &overlap); 12456747b715Smrg (*pdstDraw->pScreen->SendGraphicsExpose)( 124605b261ecSmrg client, &totalReg, stuff->dstDrawable, X_CopyPlane, 0); 12476747b715Smrg RegionUninit(&totalReg); 124805b261ecSmrg } 124905b261ecSmrg 12506747b715Smrg return Success; 125105b261ecSmrg} 125205b261ecSmrg 125305b261ecSmrg 125405b261ecSmrgint PanoramiXPolyPoint(ClientPtr client) 125505b261ecSmrg{ 125605b261ecSmrg PanoramiXRes *gc, *draw; 12576747b715Smrg int result, npoint, j; 125805b261ecSmrg xPoint *origPts; 125905b261ecSmrg Bool isRoot; 126005b261ecSmrg REQUEST(xPolyPointReq); 126105b261ecSmrg 126205b261ecSmrg REQUEST_AT_LEAST_SIZE(xPolyPointReq); 126305b261ecSmrg 12646747b715Smrg result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable, 12656747b715Smrg XRC_DRAWABLE, client, DixWriteAccess); 12666747b715Smrg if (result != Success) 12676747b715Smrg return (result == BadValue) ? BadDrawable : result; 126805b261ecSmrg 126905b261ecSmrg if(IS_SHARED_PIXMAP(draw)) 127005b261ecSmrg return (*SavedProcVector[X_PolyPoint])(client); 127105b261ecSmrg 12726747b715Smrg result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC, 12736747b715Smrg client, DixReadAccess); 12746747b715Smrg if (result != Success) 12756747b715Smrg return result; 127605b261ecSmrg 127705b261ecSmrg isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root; 12786747b715Smrg npoint = bytes_to_int32((client->req_len << 2) - sizeof(xPolyPointReq)); 127905b261ecSmrg if (npoint > 0) { 12806747b715Smrg origPts = malloc(npoint * sizeof(xPoint)); 128105b261ecSmrg memcpy((char *) origPts, (char *) &stuff[1], npoint * sizeof(xPoint)); 128205b261ecSmrg FOR_NSCREENS_FORWARD(j){ 128305b261ecSmrg 128405b261ecSmrg if(j) memcpy(&stuff[1], origPts, npoint * sizeof(xPoint)); 128505b261ecSmrg 128605b261ecSmrg if (isRoot) { 12876747b715Smrg int x_off = screenInfo.screens[j]->x; 12886747b715Smrg int y_off = screenInfo.screens[j]->y; 128905b261ecSmrg 129005b261ecSmrg if(x_off || y_off) { 129105b261ecSmrg xPoint *pnts = (xPoint*)&stuff[1]; 129205b261ecSmrg int i = (stuff->coordMode==CoordModePrevious) ? 1 : npoint; 129305b261ecSmrg 129405b261ecSmrg while(i--) { 129505b261ecSmrg pnts->x -= x_off; 129605b261ecSmrg pnts->y -= y_off; 129705b261ecSmrg pnts++; 129805b261ecSmrg } 129905b261ecSmrg } 130005b261ecSmrg } 130105b261ecSmrg 130205b261ecSmrg stuff->drawable = draw->info[j].id; 130305b261ecSmrg stuff->gc = gc->info[j].id; 130405b261ecSmrg result = (* SavedProcVector[X_PolyPoint])(client); 130505b261ecSmrg if(result != Success) break; 130605b261ecSmrg } 13076747b715Smrg free(origPts); 13086747b715Smrg return result; 130905b261ecSmrg } else 13106747b715Smrg return Success; 131105b261ecSmrg} 131205b261ecSmrg 131305b261ecSmrg 131405b261ecSmrgint PanoramiXPolyLine(ClientPtr client) 131505b261ecSmrg{ 131605b261ecSmrg PanoramiXRes *gc, *draw; 13176747b715Smrg int result, npoint, j; 131805b261ecSmrg xPoint *origPts; 131905b261ecSmrg Bool isRoot; 132005b261ecSmrg REQUEST(xPolyLineReq); 132105b261ecSmrg 132205b261ecSmrg REQUEST_AT_LEAST_SIZE(xPolyLineReq); 132305b261ecSmrg 13246747b715Smrg result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable, 13256747b715Smrg XRC_DRAWABLE, client, DixWriteAccess); 13266747b715Smrg if (result != Success) 13276747b715Smrg return (result == BadValue) ? BadDrawable : result; 132805b261ecSmrg 132905b261ecSmrg if(IS_SHARED_PIXMAP(draw)) 133005b261ecSmrg return (*SavedProcVector[X_PolyLine])(client); 133105b261ecSmrg 13326747b715Smrg result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC, 13336747b715Smrg client, DixReadAccess); 13346747b715Smrg if (result != Success) 13356747b715Smrg return result; 133605b261ecSmrg 133705b261ecSmrg isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root; 13386747b715Smrg npoint = bytes_to_int32((client->req_len << 2) - sizeof(xPolyLineReq)); 133905b261ecSmrg if (npoint > 0){ 13406747b715Smrg origPts = malloc(npoint * sizeof(xPoint)); 134105b261ecSmrg memcpy((char *) origPts, (char *) &stuff[1], npoint * sizeof(xPoint)); 134205b261ecSmrg FOR_NSCREENS_FORWARD(j){ 134305b261ecSmrg 134405b261ecSmrg if(j) memcpy(&stuff[1], origPts, npoint * sizeof(xPoint)); 134505b261ecSmrg 134605b261ecSmrg if (isRoot) { 13476747b715Smrg int x_off = screenInfo.screens[j]->x; 13486747b715Smrg int y_off = screenInfo.screens[j]->y; 134905b261ecSmrg 135005b261ecSmrg if(x_off || y_off) { 135105b261ecSmrg xPoint *pnts = (xPoint*)&stuff[1]; 135205b261ecSmrg int i = (stuff->coordMode==CoordModePrevious) ? 1 : npoint; 135305b261ecSmrg 135405b261ecSmrg while(i--) { 135505b261ecSmrg pnts->x -= x_off; 135605b261ecSmrg pnts->y -= y_off; 135705b261ecSmrg pnts++; 135805b261ecSmrg } 135905b261ecSmrg } 136005b261ecSmrg } 136105b261ecSmrg 136205b261ecSmrg stuff->drawable = draw->info[j].id; 136305b261ecSmrg stuff->gc = gc->info[j].id; 136405b261ecSmrg result = (* SavedProcVector[X_PolyLine])(client); 136505b261ecSmrg if(result != Success) break; 136605b261ecSmrg } 13676747b715Smrg free(origPts); 13686747b715Smrg return result; 136905b261ecSmrg } else 13706747b715Smrg return Success; 137105b261ecSmrg} 137205b261ecSmrg 137305b261ecSmrg 137405b261ecSmrgint PanoramiXPolySegment(ClientPtr client) 137505b261ecSmrg{ 13766747b715Smrg int result, nsegs, i, j; 137705b261ecSmrg PanoramiXRes *gc, *draw; 137805b261ecSmrg xSegment *origSegs; 137905b261ecSmrg Bool isRoot; 138005b261ecSmrg REQUEST(xPolySegmentReq); 138105b261ecSmrg 138205b261ecSmrg REQUEST_AT_LEAST_SIZE(xPolySegmentReq); 138305b261ecSmrg 13846747b715Smrg result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable, 13856747b715Smrg XRC_DRAWABLE, client, DixWriteAccess); 13866747b715Smrg if (result != Success) 13876747b715Smrg return (result == BadValue) ? BadDrawable : result; 138805b261ecSmrg 138905b261ecSmrg if(IS_SHARED_PIXMAP(draw)) 139005b261ecSmrg return (*SavedProcVector[X_PolySegment])(client); 139105b261ecSmrg 13926747b715Smrg result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC, 13936747b715Smrg client, DixReadAccess); 13946747b715Smrg if (result != Success) 13956747b715Smrg return result; 139605b261ecSmrg 139705b261ecSmrg isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root; 139805b261ecSmrg 139905b261ecSmrg nsegs = (client->req_len << 2) - sizeof(xPolySegmentReq); 140005b261ecSmrg if(nsegs & 4) return BadLength; 140105b261ecSmrg nsegs >>= 3; 140205b261ecSmrg if (nsegs > 0) { 14036747b715Smrg origSegs = malloc(nsegs * sizeof(xSegment)); 140405b261ecSmrg memcpy((char *) origSegs, (char *) &stuff[1], nsegs * sizeof(xSegment)); 140505b261ecSmrg FOR_NSCREENS_FORWARD(j){ 140605b261ecSmrg 140705b261ecSmrg if(j) memcpy(&stuff[1], origSegs, nsegs * sizeof(xSegment)); 140805b261ecSmrg 140905b261ecSmrg if (isRoot) { 14106747b715Smrg int x_off = screenInfo.screens[j]->x; 14116747b715Smrg int y_off = screenInfo.screens[j]->y; 141205b261ecSmrg 141305b261ecSmrg if(x_off || y_off) { 141405b261ecSmrg xSegment *segs = (xSegment*)&stuff[1]; 141505b261ecSmrg 141605b261ecSmrg for (i = nsegs; i--; segs++) { 141705b261ecSmrg segs->x1 -= x_off; 141805b261ecSmrg segs->x2 -= x_off; 141905b261ecSmrg segs->y1 -= y_off; 142005b261ecSmrg segs->y2 -= y_off; 142105b261ecSmrg } 142205b261ecSmrg } 142305b261ecSmrg } 142405b261ecSmrg 142505b261ecSmrg stuff->drawable = draw->info[j].id; 142605b261ecSmrg stuff->gc = gc->info[j].id; 142705b261ecSmrg result = (* SavedProcVector[X_PolySegment])(client); 142805b261ecSmrg if(result != Success) break; 142905b261ecSmrg } 14306747b715Smrg free(origSegs); 14316747b715Smrg return result; 143205b261ecSmrg } else 14336747b715Smrg return Success; 143405b261ecSmrg} 143505b261ecSmrg 143605b261ecSmrg 143705b261ecSmrgint PanoramiXPolyRectangle(ClientPtr client) 143805b261ecSmrg{ 14396747b715Smrg int result, nrects, i, j; 144005b261ecSmrg PanoramiXRes *gc, *draw; 144105b261ecSmrg Bool isRoot; 144205b261ecSmrg xRectangle *origRecs; 144305b261ecSmrg REQUEST(xPolyRectangleReq); 144405b261ecSmrg 144505b261ecSmrg REQUEST_AT_LEAST_SIZE(xPolyRectangleReq); 144605b261ecSmrg 14476747b715Smrg result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable, 14486747b715Smrg XRC_DRAWABLE, client, DixWriteAccess); 14496747b715Smrg if (result != Success) 14506747b715Smrg return (result == BadValue) ? BadDrawable : result; 145105b261ecSmrg 145205b261ecSmrg if(IS_SHARED_PIXMAP(draw)) 145305b261ecSmrg return (*SavedProcVector[X_PolyRectangle])(client); 145405b261ecSmrg 14556747b715Smrg result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC, 14566747b715Smrg client, DixReadAccess); 14576747b715Smrg if (result != Success) 14586747b715Smrg return result; 145905b261ecSmrg 146005b261ecSmrg isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root; 146105b261ecSmrg 146205b261ecSmrg nrects = (client->req_len << 2) - sizeof(xPolyRectangleReq); 146305b261ecSmrg if(nrects & 4) return BadLength; 146405b261ecSmrg nrects >>= 3; 146505b261ecSmrg if (nrects > 0){ 14666747b715Smrg origRecs = malloc(nrects * sizeof(xRectangle)); 146705b261ecSmrg memcpy((char *)origRecs,(char *)&stuff[1],nrects * sizeof(xRectangle)); 146805b261ecSmrg FOR_NSCREENS_FORWARD(j){ 146905b261ecSmrg 147005b261ecSmrg if(j) memcpy(&stuff[1], origRecs, nrects * sizeof(xRectangle)); 147105b261ecSmrg 147205b261ecSmrg if (isRoot) { 14736747b715Smrg int x_off = screenInfo.screens[j]->x; 14746747b715Smrg int y_off = screenInfo.screens[j]->y; 147505b261ecSmrg 147605b261ecSmrg 147705b261ecSmrg if(x_off || y_off) { 147805b261ecSmrg xRectangle *rects = (xRectangle *) &stuff[1]; 147905b261ecSmrg 148005b261ecSmrg for (i = nrects; i--; rects++) { 148105b261ecSmrg rects->x -= x_off; 148205b261ecSmrg rects->y -= y_off; 148305b261ecSmrg } 148405b261ecSmrg } 148505b261ecSmrg } 148605b261ecSmrg 148705b261ecSmrg stuff->drawable = draw->info[j].id; 148805b261ecSmrg stuff->gc = gc->info[j].id; 148905b261ecSmrg result = (* SavedProcVector[X_PolyRectangle])(client); 149005b261ecSmrg if(result != Success) break; 149105b261ecSmrg } 14926747b715Smrg free(origRecs); 14936747b715Smrg return result; 149405b261ecSmrg } else 14956747b715Smrg return Success; 149605b261ecSmrg} 149705b261ecSmrg 149805b261ecSmrg 149905b261ecSmrgint PanoramiXPolyArc(ClientPtr client) 150005b261ecSmrg{ 15016747b715Smrg int result, narcs, i, j; 150205b261ecSmrg PanoramiXRes *gc, *draw; 150305b261ecSmrg Bool isRoot; 150405b261ecSmrg xArc *origArcs; 150505b261ecSmrg REQUEST(xPolyArcReq); 150605b261ecSmrg 150705b261ecSmrg REQUEST_AT_LEAST_SIZE(xPolyArcReq); 150805b261ecSmrg 15096747b715Smrg result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable, 15106747b715Smrg XRC_DRAWABLE, client, DixWriteAccess); 15116747b715Smrg if (result != Success) 15126747b715Smrg return (result == BadValue) ? BadDrawable : result; 151305b261ecSmrg 151405b261ecSmrg if(IS_SHARED_PIXMAP(draw)) 151505b261ecSmrg return (*SavedProcVector[X_PolyArc])(client); 151605b261ecSmrg 15176747b715Smrg result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC, 15186747b715Smrg client, DixReadAccess); 15196747b715Smrg if (result != Success) 15206747b715Smrg return result; 152105b261ecSmrg 152205b261ecSmrg isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root; 152305b261ecSmrg 152405b261ecSmrg narcs = (client->req_len << 2) - sizeof(xPolyArcReq); 152505b261ecSmrg if(narcs % sizeof(xArc)) return BadLength; 152605b261ecSmrg narcs /= sizeof(xArc); 152705b261ecSmrg if (narcs > 0){ 15286747b715Smrg origArcs = malloc(narcs * sizeof(xArc)); 152905b261ecSmrg memcpy((char *) origArcs, (char *) &stuff[1], narcs * sizeof(xArc)); 153005b261ecSmrg FOR_NSCREENS_FORWARD(j){ 153105b261ecSmrg 153205b261ecSmrg if(j) memcpy(&stuff[1], origArcs, narcs * sizeof(xArc)); 153305b261ecSmrg 153405b261ecSmrg if (isRoot) { 15356747b715Smrg int x_off = screenInfo.screens[j]->x; 15366747b715Smrg int y_off = screenInfo.screens[j]->y; 153705b261ecSmrg 153805b261ecSmrg if(x_off || y_off) { 153905b261ecSmrg xArc *arcs = (xArc *) &stuff[1]; 154005b261ecSmrg 154105b261ecSmrg for (i = narcs; i--; arcs++) { 154205b261ecSmrg arcs->x -= x_off; 154305b261ecSmrg arcs->y -= y_off; 154405b261ecSmrg } 154505b261ecSmrg } 154605b261ecSmrg } 154705b261ecSmrg stuff->drawable = draw->info[j].id; 154805b261ecSmrg stuff->gc = gc->info[j].id; 154905b261ecSmrg result = (* SavedProcVector[X_PolyArc])(client); 155005b261ecSmrg if(result != Success) break; 155105b261ecSmrg } 15526747b715Smrg free(origArcs); 15536747b715Smrg return result; 155405b261ecSmrg } else 15556747b715Smrg return Success; 155605b261ecSmrg} 155705b261ecSmrg 155805b261ecSmrg 155905b261ecSmrgint PanoramiXFillPoly(ClientPtr client) 156005b261ecSmrg{ 15616747b715Smrg int result, count, j; 156205b261ecSmrg PanoramiXRes *gc, *draw; 156305b261ecSmrg Bool isRoot; 156405b261ecSmrg DDXPointPtr locPts; 156505b261ecSmrg REQUEST(xFillPolyReq); 156605b261ecSmrg 156705b261ecSmrg REQUEST_AT_LEAST_SIZE(xFillPolyReq); 156805b261ecSmrg 15696747b715Smrg result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable, 15706747b715Smrg XRC_DRAWABLE, client, DixWriteAccess); 15716747b715Smrg if (result != Success) 15726747b715Smrg return (result == BadValue) ? BadDrawable : result; 157305b261ecSmrg 157405b261ecSmrg if(IS_SHARED_PIXMAP(draw)) 157505b261ecSmrg return (*SavedProcVector[X_FillPoly])(client); 157605b261ecSmrg 15776747b715Smrg result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC, 15786747b715Smrg client, DixReadAccess); 15796747b715Smrg if (result != Success) 15806747b715Smrg return result; 158105b261ecSmrg 158205b261ecSmrg isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root; 158305b261ecSmrg 15846747b715Smrg count = bytes_to_int32((client->req_len << 2) - sizeof(xFillPolyReq)); 158505b261ecSmrg if (count > 0){ 15866747b715Smrg locPts = malloc(count * sizeof(DDXPointRec)); 158705b261ecSmrg memcpy((char *)locPts, (char *)&stuff[1], count * sizeof(DDXPointRec)); 158805b261ecSmrg FOR_NSCREENS_FORWARD(j){ 158905b261ecSmrg 159005b261ecSmrg if(j) memcpy(&stuff[1], locPts, count * sizeof(DDXPointRec)); 159105b261ecSmrg 159205b261ecSmrg if (isRoot) { 15936747b715Smrg int x_off = screenInfo.screens[j]->x; 15946747b715Smrg int y_off = screenInfo.screens[j]->y; 159505b261ecSmrg 159605b261ecSmrg if(x_off || y_off) { 159705b261ecSmrg DDXPointPtr pnts = (DDXPointPtr)&stuff[1]; 159805b261ecSmrg int i = (stuff->coordMode==CoordModePrevious) ? 1 : count; 159905b261ecSmrg 160005b261ecSmrg while(i--) { 160105b261ecSmrg pnts->x -= x_off; 160205b261ecSmrg pnts->y -= y_off; 160305b261ecSmrg pnts++; 160405b261ecSmrg } 160505b261ecSmrg } 160605b261ecSmrg } 160705b261ecSmrg 160805b261ecSmrg stuff->drawable = draw->info[j].id; 160905b261ecSmrg stuff->gc = gc->info[j].id; 161005b261ecSmrg result = (* SavedProcVector[X_FillPoly])(client); 161105b261ecSmrg if(result != Success) break; 161205b261ecSmrg } 16136747b715Smrg free(locPts); 16146747b715Smrg return result; 161505b261ecSmrg } else 16166747b715Smrg return Success; 161705b261ecSmrg} 161805b261ecSmrg 161905b261ecSmrg 162005b261ecSmrgint PanoramiXPolyFillRectangle(ClientPtr client) 162105b261ecSmrg{ 16226747b715Smrg int result, things, i, j; 162305b261ecSmrg PanoramiXRes *gc, *draw; 162405b261ecSmrg Bool isRoot; 162505b261ecSmrg xRectangle *origRects; 162605b261ecSmrg REQUEST(xPolyFillRectangleReq); 162705b261ecSmrg 162805b261ecSmrg REQUEST_AT_LEAST_SIZE(xPolyFillRectangleReq); 162905b261ecSmrg 16306747b715Smrg result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable, 16316747b715Smrg XRC_DRAWABLE, client, DixWriteAccess); 16326747b715Smrg if (result != Success) 16336747b715Smrg return (result == BadValue) ? BadDrawable : result; 163405b261ecSmrg 163505b261ecSmrg if(IS_SHARED_PIXMAP(draw)) 163605b261ecSmrg return (*SavedProcVector[X_PolyFillRectangle])(client); 163705b261ecSmrg 16386747b715Smrg result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC, 16396747b715Smrg client, DixReadAccess); 16406747b715Smrg if (result != Success) 16416747b715Smrg return result; 164205b261ecSmrg 164305b261ecSmrg isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root; 164405b261ecSmrg 164505b261ecSmrg things = (client->req_len << 2) - sizeof(xPolyFillRectangleReq); 164605b261ecSmrg if(things & 4) return BadLength; 164705b261ecSmrg things >>= 3; 164805b261ecSmrg if (things > 0){ 16496747b715Smrg origRects = malloc(things * sizeof(xRectangle)); 165005b261ecSmrg memcpy((char*)origRects,(char*)&stuff[1], things * sizeof(xRectangle)); 165105b261ecSmrg FOR_NSCREENS_FORWARD(j){ 165205b261ecSmrg 165305b261ecSmrg if(j) memcpy(&stuff[1], origRects, things * sizeof(xRectangle)); 165405b261ecSmrg 165505b261ecSmrg if (isRoot) { 16566747b715Smrg int x_off = screenInfo.screens[j]->x; 16576747b715Smrg int y_off = screenInfo.screens[j]->y; 165805b261ecSmrg 165905b261ecSmrg if(x_off || y_off) { 166005b261ecSmrg xRectangle *rects = (xRectangle *) &stuff[1]; 166105b261ecSmrg 166205b261ecSmrg for (i = things; i--; rects++) { 166305b261ecSmrg rects->x -= x_off; 166405b261ecSmrg rects->y -= y_off; 166505b261ecSmrg } 166605b261ecSmrg } 166705b261ecSmrg } 166805b261ecSmrg 166905b261ecSmrg stuff->drawable = draw->info[j].id; 167005b261ecSmrg stuff->gc = gc->info[j].id; 167105b261ecSmrg result = (* SavedProcVector[X_PolyFillRectangle])(client); 167205b261ecSmrg if(result != Success) break; 167305b261ecSmrg } 16746747b715Smrg free(origRects); 16756747b715Smrg return result; 167605b261ecSmrg } else 16776747b715Smrg return Success; 167805b261ecSmrg} 167905b261ecSmrg 168005b261ecSmrg 168105b261ecSmrgint PanoramiXPolyFillArc(ClientPtr client) 168205b261ecSmrg{ 168305b261ecSmrg PanoramiXRes *gc, *draw; 168405b261ecSmrg Bool isRoot; 16856747b715Smrg int result, narcs, i, j; 168605b261ecSmrg xArc *origArcs; 168705b261ecSmrg REQUEST(xPolyFillArcReq); 168805b261ecSmrg 168905b261ecSmrg REQUEST_AT_LEAST_SIZE(xPolyFillArcReq); 169005b261ecSmrg 16916747b715Smrg result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable, 16926747b715Smrg XRC_DRAWABLE, client, DixWriteAccess); 16936747b715Smrg if (result != Success) 16946747b715Smrg return (result == BadValue) ? BadDrawable : result; 169505b261ecSmrg 169605b261ecSmrg if(IS_SHARED_PIXMAP(draw)) 169705b261ecSmrg return (*SavedProcVector[X_PolyFillArc])(client); 169805b261ecSmrg 16996747b715Smrg result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC, 17006747b715Smrg client, DixReadAccess); 17016747b715Smrg if (result != Success) 17026747b715Smrg return result; 170305b261ecSmrg 170405b261ecSmrg isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root; 170505b261ecSmrg 170605b261ecSmrg narcs = (client->req_len << 2) - sizeof(xPolyFillArcReq); 17076747b715Smrg if (narcs % sizeof(xArc)) return BadLength; 170805b261ecSmrg narcs /= sizeof(xArc); 170905b261ecSmrg if (narcs > 0) { 17106747b715Smrg origArcs = malloc(narcs * sizeof(xArc)); 171105b261ecSmrg memcpy((char *) origArcs, (char *)&stuff[1], narcs * sizeof(xArc)); 171205b261ecSmrg FOR_NSCREENS_FORWARD(j){ 171305b261ecSmrg 171405b261ecSmrg if(j) memcpy(&stuff[1], origArcs, narcs * sizeof(xArc)); 171505b261ecSmrg 171605b261ecSmrg if (isRoot) { 17176747b715Smrg int x_off = screenInfo.screens[j]->x; 17186747b715Smrg int y_off = screenInfo.screens[j]->y; 171905b261ecSmrg 172005b261ecSmrg if(x_off || y_off) { 172105b261ecSmrg xArc *arcs = (xArc *) &stuff[1]; 172205b261ecSmrg 172305b261ecSmrg for (i = narcs; i--; arcs++) { 172405b261ecSmrg arcs->x -= x_off; 172505b261ecSmrg arcs->y -= y_off; 172605b261ecSmrg } 172705b261ecSmrg } 172805b261ecSmrg } 172905b261ecSmrg 173005b261ecSmrg stuff->drawable = draw->info[j].id; 173105b261ecSmrg stuff->gc = gc->info[j].id; 173205b261ecSmrg result = (* SavedProcVector[X_PolyFillArc])(client); 173305b261ecSmrg if(result != Success) break; 173405b261ecSmrg } 17356747b715Smrg free(origArcs); 17366747b715Smrg return result; 173705b261ecSmrg } else 17386747b715Smrg return Success; 173905b261ecSmrg} 174005b261ecSmrg 174105b261ecSmrg 174205b261ecSmrgint PanoramiXPutImage(ClientPtr client) 174305b261ecSmrg{ 174405b261ecSmrg PanoramiXRes *gc, *draw; 174505b261ecSmrg Bool isRoot; 17466747b715Smrg int j, result, orig_x, orig_y; 174705b261ecSmrg REQUEST(xPutImageReq); 174805b261ecSmrg 174905b261ecSmrg REQUEST_AT_LEAST_SIZE(xPutImageReq); 175005b261ecSmrg 17516747b715Smrg result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable, 17526747b715Smrg XRC_DRAWABLE, client, DixWriteAccess); 17536747b715Smrg if (result != Success) 17546747b715Smrg return (result == BadValue) ? BadDrawable : result; 175505b261ecSmrg 175605b261ecSmrg if(IS_SHARED_PIXMAP(draw)) 175705b261ecSmrg return (*SavedProcVector[X_PutImage])(client); 175805b261ecSmrg 17596747b715Smrg result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC, 17606747b715Smrg client, DixReadAccess); 17616747b715Smrg if (result != Success) 17626747b715Smrg return result; 176305b261ecSmrg 176405b261ecSmrg isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root; 176505b261ecSmrg 176605b261ecSmrg orig_x = stuff->dstX; 176705b261ecSmrg orig_y = stuff->dstY; 176805b261ecSmrg FOR_NSCREENS_BACKWARD(j){ 176905b261ecSmrg if (isRoot) { 17706747b715Smrg stuff->dstX = orig_x - screenInfo.screens[j]->x; 17716747b715Smrg stuff->dstY = orig_y - screenInfo.screens[j]->y; 177205b261ecSmrg } 177305b261ecSmrg stuff->drawable = draw->info[j].id; 177405b261ecSmrg stuff->gc = gc->info[j].id; 177505b261ecSmrg result = (* SavedProcVector[X_PutImage])(client); 177605b261ecSmrg if(result != Success) break; 177705b261ecSmrg } 17786747b715Smrg return result; 177905b261ecSmrg} 178005b261ecSmrg 178105b261ecSmrg 178205b261ecSmrgint PanoramiXGetImage(ClientPtr client) 178305b261ecSmrg{ 178405b261ecSmrg DrawablePtr drawables[MAXSCREENS]; 178505b261ecSmrg DrawablePtr pDraw; 178605b261ecSmrg PanoramiXRes *draw; 178705b261ecSmrg xGetImageReply xgi; 178805b261ecSmrg Bool isRoot; 178905b261ecSmrg char *pBuf; 179005b261ecSmrg int i, x, y, w, h, format, rc; 179105b261ecSmrg Mask plane = 0, planemask; 179205b261ecSmrg int linesDone, nlines, linesPerBuf; 179305b261ecSmrg long widthBytesLine, length; 179405b261ecSmrg 179505b261ecSmrg REQUEST(xGetImageReq); 179605b261ecSmrg 179705b261ecSmrg REQUEST_SIZE_MATCH(xGetImageReq); 179805b261ecSmrg 179905b261ecSmrg if ((stuff->format != XYPixmap) && (stuff->format != ZPixmap)) { 180005b261ecSmrg client->errorValue = stuff->format; 18016747b715Smrg return BadValue; 180205b261ecSmrg } 180305b261ecSmrg 18046747b715Smrg rc = dixLookupResourceByClass((pointer *)&draw, stuff->drawable, 18056747b715Smrg XRC_DRAWABLE, client, DixWriteAccess); 18066747b715Smrg if (rc != Success) 18076747b715Smrg return (rc == BadValue) ? BadDrawable : rc; 180805b261ecSmrg 180905b261ecSmrg if(draw->type == XRT_PIXMAP) 181005b261ecSmrg return (*SavedProcVector[X_GetImage])(client); 181105b261ecSmrg 181205b261ecSmrg rc = dixLookupDrawable(&pDraw, stuff->drawable, client, 0, 18134642e01fSmrg DixReadAccess); 181405b261ecSmrg if (rc != Success) 181505b261ecSmrg return rc; 181605b261ecSmrg 181705b261ecSmrg if(!((WindowPtr)pDraw)->realized) 18186747b715Smrg return BadMatch; 181905b261ecSmrg 182005b261ecSmrg x = stuff->x; 182105b261ecSmrg y = stuff->y; 182205b261ecSmrg w = stuff->width; 182305b261ecSmrg h = stuff->height; 182405b261ecSmrg format = stuff->format; 182505b261ecSmrg planemask = stuff->planeMask; 182605b261ecSmrg 182705b261ecSmrg isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root; 182805b261ecSmrg 182905b261ecSmrg if(isRoot) { 183005b261ecSmrg if( /* check for being onscreen */ 183105b261ecSmrg x < 0 || x + w > PanoramiXPixWidth || 183205b261ecSmrg y < 0 || y + h > PanoramiXPixHeight ) 18336747b715Smrg return BadMatch; 183405b261ecSmrg } else { 183505b261ecSmrg if( /* check for being onscreen */ 18366747b715Smrg screenInfo.screens[0]->x + pDraw->x + x < 0 || 18376747b715Smrg screenInfo.screens[0]->x + pDraw->x + x + w > PanoramiXPixWidth || 18386747b715Smrg screenInfo.screens[0]->y + pDraw->y + y < 0 || 18396747b715Smrg screenInfo.screens[0]->y + pDraw->y + y + h > PanoramiXPixHeight || 184005b261ecSmrg /* check for being inside of border */ 184105b261ecSmrg x < - wBorderWidth((WindowPtr)pDraw) || 184205b261ecSmrg x + w > wBorderWidth((WindowPtr)pDraw) + (int)pDraw->width || 184305b261ecSmrg y < -wBorderWidth((WindowPtr)pDraw) || 184405b261ecSmrg y + h > wBorderWidth ((WindowPtr)pDraw) + (int)pDraw->height) 18456747b715Smrg return BadMatch; 184605b261ecSmrg } 184705b261ecSmrg 184805b261ecSmrg drawables[0] = pDraw; 184905b261ecSmrg for(i = 1; i < PanoramiXNumScreens; i++) { 185005b261ecSmrg rc = dixLookupDrawable(drawables+i, draw->info[i].id, client, 0, 18514642e01fSmrg DixGetAttrAccess); 185205b261ecSmrg if (rc != Success) 185305b261ecSmrg return rc; 185405b261ecSmrg } 185505b261ecSmrg 185605b261ecSmrg xgi.visual = wVisual (((WindowPtr) pDraw)); 185705b261ecSmrg xgi.type = X_Reply; 185805b261ecSmrg xgi.sequenceNumber = client->sequence; 185905b261ecSmrg xgi.depth = pDraw->depth; 186005b261ecSmrg if(format == ZPixmap) { 186105b261ecSmrg widthBytesLine = PixmapBytePad(w, pDraw->depth); 186205b261ecSmrg length = widthBytesLine * h; 186305b261ecSmrg 186405b261ecSmrg 186505b261ecSmrg } else { 186605b261ecSmrg widthBytesLine = BitmapBytePad(w); 186705b261ecSmrg plane = ((Mask)1) << (pDraw->depth - 1); 186805b261ecSmrg /* only planes asked for */ 186905b261ecSmrg length = widthBytesLine * h * 187005b261ecSmrg Ones(planemask & (plane | (plane - 1))); 187105b261ecSmrg 187205b261ecSmrg } 187305b261ecSmrg 18746747b715Smrg xgi.length = bytes_to_int32(length); 187505b261ecSmrg 187605b261ecSmrg if (widthBytesLine == 0 || h == 0) 187705b261ecSmrg linesPerBuf = 0; 187805b261ecSmrg else if (widthBytesLine >= XINERAMA_IMAGE_BUFSIZE) 187905b261ecSmrg linesPerBuf = 1; 188005b261ecSmrg else { 188105b261ecSmrg linesPerBuf = XINERAMA_IMAGE_BUFSIZE / widthBytesLine; 188205b261ecSmrg if (linesPerBuf > h) 188305b261ecSmrg linesPerBuf = h; 188405b261ecSmrg } 188505b261ecSmrg length = linesPerBuf * widthBytesLine; 18866747b715Smrg if(!(pBuf = malloc(length))) 18876747b715Smrg return BadAlloc; 188805b261ecSmrg 188905b261ecSmrg WriteReplyToClient(client, sizeof (xGetImageReply), &xgi); 189005b261ecSmrg 189105b261ecSmrg if (linesPerBuf == 0) { 189205b261ecSmrg /* nothing to do */ 189305b261ecSmrg } 189405b261ecSmrg else if (format == ZPixmap) { 189505b261ecSmrg linesDone = 0; 189605b261ecSmrg while (h - linesDone > 0) { 189705b261ecSmrg nlines = min(linesPerBuf, h - linesDone); 189805b261ecSmrg 189905b261ecSmrg if(pDraw->depth == 1) 19006747b715Smrg memset(pBuf, 0, nlines * widthBytesLine); 190105b261ecSmrg 190205b261ecSmrg XineramaGetImageData(drawables, x, y + linesDone, w, nlines, 190305b261ecSmrg format, planemask, pBuf, widthBytesLine, isRoot); 190405b261ecSmrg 190505b261ecSmrg (void)WriteToClient(client, 190605b261ecSmrg (int)(nlines * widthBytesLine), 190705b261ecSmrg pBuf); 190805b261ecSmrg linesDone += nlines; 190905b261ecSmrg } 191005b261ecSmrg } else { /* XYPixmap */ 191105b261ecSmrg for (; plane; plane >>= 1) { 191205b261ecSmrg if (planemask & plane) { 191305b261ecSmrg linesDone = 0; 191405b261ecSmrg while (h - linesDone > 0) { 191505b261ecSmrg nlines = min(linesPerBuf, h - linesDone); 191605b261ecSmrg 19176747b715Smrg memset(pBuf, 0, nlines * widthBytesLine); 191805b261ecSmrg 191905b261ecSmrg XineramaGetImageData(drawables, x, y + linesDone, w, 192005b261ecSmrg nlines, format, plane, pBuf, 192105b261ecSmrg widthBytesLine, isRoot); 192205b261ecSmrg 192305b261ecSmrg (void)WriteToClient(client, 192405b261ecSmrg (int)(nlines * widthBytesLine), 192505b261ecSmrg pBuf); 192605b261ecSmrg 192705b261ecSmrg linesDone += nlines; 192805b261ecSmrg } 192905b261ecSmrg } 193005b261ecSmrg } 193105b261ecSmrg } 19326747b715Smrg free(pBuf); 19336747b715Smrg return Success; 193405b261ecSmrg} 193505b261ecSmrg 193605b261ecSmrg 193705b261ecSmrg/* The text stuff should be rewritten so that duplication happens 193805b261ecSmrg at the GlyphBlt level. That is, loading the font and getting 193905b261ecSmrg the glyphs should only happen once */ 194005b261ecSmrg 194105b261ecSmrgint 194205b261ecSmrgPanoramiXPolyText8(ClientPtr client) 194305b261ecSmrg{ 194405b261ecSmrg PanoramiXRes *gc, *draw; 194505b261ecSmrg Bool isRoot; 19466747b715Smrg int result, j; 194705b261ecSmrg int orig_x, orig_y; 194805b261ecSmrg REQUEST(xPolyTextReq); 194905b261ecSmrg 195005b261ecSmrg REQUEST_AT_LEAST_SIZE(xPolyTextReq); 195105b261ecSmrg 19526747b715Smrg result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable, 19536747b715Smrg XRC_DRAWABLE, client, DixWriteAccess); 19546747b715Smrg if (result != Success) 19556747b715Smrg return (result == BadValue) ? BadDrawable : result; 195605b261ecSmrg 195705b261ecSmrg if(IS_SHARED_PIXMAP(draw)) 195805b261ecSmrg return (*SavedProcVector[X_PolyText8])(client); 195905b261ecSmrg 19606747b715Smrg result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC, 19616747b715Smrg client, DixReadAccess); 19626747b715Smrg if (result != Success) 19636747b715Smrg return result; 196405b261ecSmrg 196505b261ecSmrg isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root; 196605b261ecSmrg 196705b261ecSmrg orig_x = stuff->x; 196805b261ecSmrg orig_y = stuff->y; 196905b261ecSmrg FOR_NSCREENS_BACKWARD(j){ 197005b261ecSmrg stuff->drawable = draw->info[j].id; 197105b261ecSmrg stuff->gc = gc->info[j].id; 197205b261ecSmrg if (isRoot) { 19736747b715Smrg stuff->x = orig_x - screenInfo.screens[j]->x; 19746747b715Smrg stuff->y = orig_y - screenInfo.screens[j]->y; 197505b261ecSmrg } 197605b261ecSmrg result = (*SavedProcVector[X_PolyText8])(client); 197705b261ecSmrg if(result != Success) break; 197805b261ecSmrg } 19796747b715Smrg return result; 198005b261ecSmrg} 198105b261ecSmrg 198205b261ecSmrgint 198305b261ecSmrgPanoramiXPolyText16(ClientPtr client) 198405b261ecSmrg{ 198505b261ecSmrg PanoramiXRes *gc, *draw; 198605b261ecSmrg Bool isRoot; 19876747b715Smrg int result, j; 198805b261ecSmrg int orig_x, orig_y; 198905b261ecSmrg REQUEST(xPolyTextReq); 199005b261ecSmrg 199105b261ecSmrg REQUEST_AT_LEAST_SIZE(xPolyTextReq); 199205b261ecSmrg 19936747b715Smrg result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable, 19946747b715Smrg XRC_DRAWABLE, client, DixWriteAccess); 19956747b715Smrg if (result != Success) 19966747b715Smrg return (result == BadValue) ? BadDrawable : result; 199705b261ecSmrg 199805b261ecSmrg if(IS_SHARED_PIXMAP(draw)) 199905b261ecSmrg return (*SavedProcVector[X_PolyText16])(client); 200005b261ecSmrg 20016747b715Smrg result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC, 20026747b715Smrg client, DixReadAccess); 20036747b715Smrg if (result != Success) 20046747b715Smrg return result; 200505b261ecSmrg 200605b261ecSmrg isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root; 200705b261ecSmrg 200805b261ecSmrg orig_x = stuff->x; 200905b261ecSmrg orig_y = stuff->y; 201005b261ecSmrg FOR_NSCREENS_BACKWARD(j){ 201105b261ecSmrg stuff->drawable = draw->info[j].id; 201205b261ecSmrg stuff->gc = gc->info[j].id; 201305b261ecSmrg if (isRoot) { 20146747b715Smrg stuff->x = orig_x - screenInfo.screens[j]->x; 20156747b715Smrg stuff->y = orig_y - screenInfo.screens[j]->y; 201605b261ecSmrg } 201705b261ecSmrg result = (*SavedProcVector[X_PolyText16])(client); 201805b261ecSmrg if(result != Success) break; 201905b261ecSmrg } 20206747b715Smrg return result; 202105b261ecSmrg} 202205b261ecSmrg 202305b261ecSmrg 202405b261ecSmrgint PanoramiXImageText8(ClientPtr client) 202505b261ecSmrg{ 20266747b715Smrg int result, j; 202705b261ecSmrg PanoramiXRes *gc, *draw; 202805b261ecSmrg Bool isRoot; 202905b261ecSmrg int orig_x, orig_y; 203005b261ecSmrg REQUEST(xImageTextReq); 203105b261ecSmrg 203205b261ecSmrg REQUEST_FIXED_SIZE(xImageTextReq, stuff->nChars); 203305b261ecSmrg 20346747b715Smrg result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable, 20356747b715Smrg XRC_DRAWABLE, client, DixWriteAccess); 20366747b715Smrg if (result != Success) 20376747b715Smrg return (result == BadValue) ? BadDrawable : result; 203805b261ecSmrg 203905b261ecSmrg if(IS_SHARED_PIXMAP(draw)) 204005b261ecSmrg return (*SavedProcVector[X_ImageText8])(client); 204105b261ecSmrg 20426747b715Smrg result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC, 20436747b715Smrg client, DixReadAccess); 20446747b715Smrg if (result != Success) 20456747b715Smrg return result; 204605b261ecSmrg 204705b261ecSmrg isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root; 204805b261ecSmrg 204905b261ecSmrg orig_x = stuff->x; 205005b261ecSmrg orig_y = stuff->y; 205105b261ecSmrg FOR_NSCREENS_BACKWARD(j){ 205205b261ecSmrg stuff->drawable = draw->info[j].id; 205305b261ecSmrg stuff->gc = gc->info[j].id; 205405b261ecSmrg if (isRoot) { 20556747b715Smrg stuff->x = orig_x - screenInfo.screens[j]->x; 20566747b715Smrg stuff->y = orig_y - screenInfo.screens[j]->y; 205705b261ecSmrg } 205805b261ecSmrg result = (*SavedProcVector[X_ImageText8])(client); 205905b261ecSmrg if(result != Success) break; 206005b261ecSmrg } 20616747b715Smrg return result; 206205b261ecSmrg} 206305b261ecSmrg 206405b261ecSmrg 206505b261ecSmrgint PanoramiXImageText16(ClientPtr client) 206605b261ecSmrg{ 20676747b715Smrg int result, j; 206805b261ecSmrg PanoramiXRes *gc, *draw; 206905b261ecSmrg Bool isRoot; 207005b261ecSmrg int orig_x, orig_y; 207105b261ecSmrg REQUEST(xImageTextReq); 207205b261ecSmrg 207305b261ecSmrg REQUEST_FIXED_SIZE(xImageTextReq, stuff->nChars << 1); 207405b261ecSmrg 20756747b715Smrg result = dixLookupResourceByClass((pointer *)&draw, stuff->drawable, 20766747b715Smrg XRC_DRAWABLE, client, DixWriteAccess); 20776747b715Smrg if (result != Success) 20786747b715Smrg return (result == BadValue) ? BadDrawable : result; 207905b261ecSmrg 208005b261ecSmrg if(IS_SHARED_PIXMAP(draw)) 208105b261ecSmrg return (*SavedProcVector[X_ImageText16])(client); 208205b261ecSmrg 20836747b715Smrg result = dixLookupResourceByType((pointer *)&gc, stuff->gc, XRT_GC, 20846747b715Smrg client, DixReadAccess); 20856747b715Smrg if (result != Success) 20866747b715Smrg return result; 208705b261ecSmrg 208805b261ecSmrg isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root; 208905b261ecSmrg 209005b261ecSmrg orig_x = stuff->x; 209105b261ecSmrg orig_y = stuff->y; 209205b261ecSmrg FOR_NSCREENS_BACKWARD(j){ 209305b261ecSmrg stuff->drawable = draw->info[j].id; 209405b261ecSmrg stuff->gc = gc->info[j].id; 209505b261ecSmrg if (isRoot) { 20966747b715Smrg stuff->x = orig_x - screenInfo.screens[j]->x; 20976747b715Smrg stuff->y = orig_y - screenInfo.screens[j]->y; 209805b261ecSmrg } 209905b261ecSmrg result = (*SavedProcVector[X_ImageText16])(client); 210005b261ecSmrg if(result != Success) break; 210105b261ecSmrg } 21026747b715Smrg return result; 210305b261ecSmrg} 210405b261ecSmrg 210505b261ecSmrg 210605b261ecSmrg 210705b261ecSmrgint PanoramiXCreateColormap(ClientPtr client) 210805b261ecSmrg{ 210905b261ecSmrg PanoramiXRes *win, *newCmap; 21106747b715Smrg int result, j, orig_visual; 211105b261ecSmrg REQUEST(xCreateColormapReq); 211205b261ecSmrg 211305b261ecSmrg REQUEST_SIZE_MATCH(xCreateColormapReq); 211405b261ecSmrg 21156747b715Smrg result = dixLookupResourceByType((pointer *)&win, stuff->window, 21166747b715Smrg XRT_WINDOW, client, DixReadAccess); 21176747b715Smrg if (result != Success) 21186747b715Smrg return result; 211905b261ecSmrg 21206747b715Smrg if(!(newCmap = malloc(sizeof(PanoramiXRes)))) 212105b261ecSmrg return BadAlloc; 212205b261ecSmrg 212305b261ecSmrg newCmap->type = XRT_COLORMAP; 212405b261ecSmrg newCmap->info[0].id = stuff->mid; 212505b261ecSmrg for(j = 1; j < PanoramiXNumScreens; j++) 212605b261ecSmrg newCmap->info[j].id = FakeClientID(client->index); 212705b261ecSmrg 212805b261ecSmrg orig_visual = stuff->visual; 212905b261ecSmrg FOR_NSCREENS_BACKWARD(j){ 213005b261ecSmrg stuff->mid = newCmap->info[j].id; 213105b261ecSmrg stuff->window = win->info[j].id; 21324642e01fSmrg stuff->visual = PanoramiXTranslateVisualID(j, orig_visual); 213305b261ecSmrg result = (* SavedProcVector[X_CreateColormap])(client); 213405b261ecSmrg if(result != Success) break; 213505b261ecSmrg } 213605b261ecSmrg 213705b261ecSmrg if (result == Success) 213805b261ecSmrg AddResource(newCmap->info[0].id, XRT_COLORMAP, newCmap); 213905b261ecSmrg else 21406747b715Smrg free(newCmap); 214105b261ecSmrg 21426747b715Smrg return result; 214305b261ecSmrg} 214405b261ecSmrg 214505b261ecSmrg 214605b261ecSmrgint PanoramiXFreeColormap(ClientPtr client) 214705b261ecSmrg{ 214805b261ecSmrg PanoramiXRes *cmap; 21496747b715Smrg int result, j; 215005b261ecSmrg REQUEST(xResourceReq); 215105b261ecSmrg 215205b261ecSmrg REQUEST_SIZE_MATCH(xResourceReq); 215305b261ecSmrg 215405b261ecSmrg client->errorValue = stuff->id; 215505b261ecSmrg 21566747b715Smrg result = dixLookupResourceByType((pointer *)&cmap, stuff->id, XRT_COLORMAP, 21576747b715Smrg client, DixDestroyAccess); 21586747b715Smrg if (result != Success) 21596747b715Smrg return result; 216005b261ecSmrg 216105b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 216205b261ecSmrg stuff->id = cmap->info[j].id; 216305b261ecSmrg result = (* SavedProcVector[X_FreeColormap])(client); 216405b261ecSmrg if(result != Success) break; 216505b261ecSmrg } 216605b261ecSmrg 216705b261ecSmrg /* Since ProcFreeColormap is using FreeResource, it will free 216805b261ecSmrg our resource for us on the last pass through the loop above */ 216905b261ecSmrg 21706747b715Smrg return result; 217105b261ecSmrg} 217205b261ecSmrg 217305b261ecSmrg 217405b261ecSmrgint 217505b261ecSmrgPanoramiXCopyColormapAndFree(ClientPtr client) 217605b261ecSmrg{ 217705b261ecSmrg PanoramiXRes *cmap, *newCmap; 21786747b715Smrg int result, j; 217905b261ecSmrg REQUEST(xCopyColormapAndFreeReq); 218005b261ecSmrg 218105b261ecSmrg REQUEST_SIZE_MATCH(xCopyColormapAndFreeReq); 218205b261ecSmrg 218305b261ecSmrg client->errorValue = stuff->srcCmap; 218405b261ecSmrg 21856747b715Smrg result = dixLookupResourceByType((pointer *)&cmap, stuff->srcCmap, 21866747b715Smrg XRT_COLORMAP, client, 21876747b715Smrg DixReadAccess | DixWriteAccess); 21886747b715Smrg if (result != Success) 21896747b715Smrg return result; 219005b261ecSmrg 21916747b715Smrg if(!(newCmap = malloc(sizeof(PanoramiXRes)))) 219205b261ecSmrg return BadAlloc; 219305b261ecSmrg 219405b261ecSmrg newCmap->type = XRT_COLORMAP; 219505b261ecSmrg newCmap->info[0].id = stuff->mid; 219605b261ecSmrg for(j = 1; j < PanoramiXNumScreens; j++) 219705b261ecSmrg newCmap->info[j].id = FakeClientID(client->index); 219805b261ecSmrg 219905b261ecSmrg FOR_NSCREENS_BACKWARD(j){ 220005b261ecSmrg stuff->srcCmap = cmap->info[j].id; 220105b261ecSmrg stuff->mid = newCmap->info[j].id; 220205b261ecSmrg result = (* SavedProcVector[X_CopyColormapAndFree])(client); 220305b261ecSmrg if(result != Success) break; 220405b261ecSmrg } 220505b261ecSmrg 220605b261ecSmrg if (result == Success) 220705b261ecSmrg AddResource(newCmap->info[0].id, XRT_COLORMAP, newCmap); 220805b261ecSmrg else 22096747b715Smrg free(newCmap); 221005b261ecSmrg 22116747b715Smrg return result; 221205b261ecSmrg} 221305b261ecSmrg 221405b261ecSmrg 221505b261ecSmrgint PanoramiXInstallColormap(ClientPtr client) 221605b261ecSmrg{ 221705b261ecSmrg REQUEST(xResourceReq); 22186747b715Smrg int result, j; 221905b261ecSmrg PanoramiXRes *cmap; 222005b261ecSmrg 222105b261ecSmrg REQUEST_SIZE_MATCH(xResourceReq); 222205b261ecSmrg 222305b261ecSmrg client->errorValue = stuff->id; 222405b261ecSmrg 22256747b715Smrg result = dixLookupResourceByType((pointer *)&cmap, stuff->id, XRT_COLORMAP, 22266747b715Smrg client, DixReadAccess); 22276747b715Smrg if (result != Success) 22286747b715Smrg return result; 222905b261ecSmrg 223005b261ecSmrg FOR_NSCREENS_BACKWARD(j){ 223105b261ecSmrg stuff->id = cmap->info[j].id; 223205b261ecSmrg result = (* SavedProcVector[X_InstallColormap])(client); 223305b261ecSmrg if(result != Success) break; 223405b261ecSmrg } 22356747b715Smrg return result; 223605b261ecSmrg} 223705b261ecSmrg 223805b261ecSmrg 223905b261ecSmrgint PanoramiXUninstallColormap(ClientPtr client) 224005b261ecSmrg{ 224105b261ecSmrg REQUEST(xResourceReq); 22426747b715Smrg int result, j; 224305b261ecSmrg PanoramiXRes *cmap; 224405b261ecSmrg 224505b261ecSmrg REQUEST_SIZE_MATCH(xResourceReq); 224605b261ecSmrg 224705b261ecSmrg client->errorValue = stuff->id; 224805b261ecSmrg 22496747b715Smrg result = dixLookupResourceByType((pointer *)&cmap, stuff->id, XRT_COLORMAP, 22506747b715Smrg client, DixReadAccess); 22516747b715Smrg if (result != Success) 22526747b715Smrg return result; 225305b261ecSmrg 225405b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 225505b261ecSmrg stuff->id = cmap->info[j].id; 225605b261ecSmrg result = (* SavedProcVector[X_UninstallColormap])(client); 225705b261ecSmrg if(result != Success) break; 225805b261ecSmrg } 22596747b715Smrg return result; 226005b261ecSmrg} 226105b261ecSmrg 226205b261ecSmrg 226305b261ecSmrgint PanoramiXAllocColor(ClientPtr client) 226405b261ecSmrg{ 22656747b715Smrg int result, j; 226605b261ecSmrg PanoramiXRes *cmap; 226705b261ecSmrg REQUEST(xAllocColorReq); 226805b261ecSmrg 226905b261ecSmrg REQUEST_SIZE_MATCH(xAllocColorReq); 227005b261ecSmrg 227105b261ecSmrg client->errorValue = stuff->cmap; 227205b261ecSmrg 22736747b715Smrg result = dixLookupResourceByType((pointer *)&cmap, stuff->cmap, 22746747b715Smrg XRT_COLORMAP, client, DixWriteAccess); 22756747b715Smrg if (result != Success) 22766747b715Smrg return result; 227705b261ecSmrg 227805b261ecSmrg FOR_NSCREENS_BACKWARD(j){ 227905b261ecSmrg stuff->cmap = cmap->info[j].id; 228005b261ecSmrg result = (* SavedProcVector[X_AllocColor])(client); 228105b261ecSmrg if(result != Success) break; 228205b261ecSmrg } 22836747b715Smrg return result; 228405b261ecSmrg} 228505b261ecSmrg 228605b261ecSmrg 228705b261ecSmrgint PanoramiXAllocNamedColor(ClientPtr client) 228805b261ecSmrg{ 22896747b715Smrg int result, j; 229005b261ecSmrg PanoramiXRes *cmap; 229105b261ecSmrg REQUEST(xAllocNamedColorReq); 229205b261ecSmrg 229305b261ecSmrg REQUEST_FIXED_SIZE(xAllocNamedColorReq, stuff->nbytes); 229405b261ecSmrg 229505b261ecSmrg client->errorValue = stuff->cmap; 229605b261ecSmrg 22976747b715Smrg result = dixLookupResourceByType((pointer *)&cmap, stuff->cmap, 22986747b715Smrg XRT_COLORMAP, client, DixWriteAccess); 22996747b715Smrg if (result != Success) 23006747b715Smrg return result; 230105b261ecSmrg 230205b261ecSmrg FOR_NSCREENS_BACKWARD(j){ 230305b261ecSmrg stuff->cmap = cmap->info[j].id; 230405b261ecSmrg result = (* SavedProcVector[X_AllocNamedColor])(client); 230505b261ecSmrg if(result != Success) break; 230605b261ecSmrg } 23076747b715Smrg return result; 230805b261ecSmrg} 230905b261ecSmrg 231005b261ecSmrg 231105b261ecSmrgint PanoramiXAllocColorCells(ClientPtr client) 231205b261ecSmrg{ 23136747b715Smrg int result, j; 231405b261ecSmrg PanoramiXRes *cmap; 231505b261ecSmrg REQUEST(xAllocColorCellsReq); 231605b261ecSmrg 231705b261ecSmrg REQUEST_SIZE_MATCH(xAllocColorCellsReq); 231805b261ecSmrg 231905b261ecSmrg client->errorValue = stuff->cmap; 232005b261ecSmrg 23216747b715Smrg result = dixLookupResourceByType((pointer *)&cmap, stuff->cmap, 23226747b715Smrg XRT_COLORMAP, client, DixWriteAccess); 23236747b715Smrg if (result != Success) 23246747b715Smrg return result; 232505b261ecSmrg 232605b261ecSmrg FOR_NSCREENS_BACKWARD(j){ 232705b261ecSmrg stuff->cmap = cmap->info[j].id; 232805b261ecSmrg result = (* SavedProcVector[X_AllocColorCells])(client); 232905b261ecSmrg if(result != Success) break; 233005b261ecSmrg } 23316747b715Smrg return result; 233205b261ecSmrg} 233305b261ecSmrg 233405b261ecSmrg 233505b261ecSmrgint PanoramiXAllocColorPlanes(ClientPtr client) 233605b261ecSmrg{ 23376747b715Smrg int result, j; 233805b261ecSmrg PanoramiXRes *cmap; 233905b261ecSmrg REQUEST(xAllocColorPlanesReq); 234005b261ecSmrg 234105b261ecSmrg REQUEST_SIZE_MATCH(xAllocColorPlanesReq); 234205b261ecSmrg 234305b261ecSmrg client->errorValue = stuff->cmap; 234405b261ecSmrg 23456747b715Smrg result = dixLookupResourceByType((pointer *)&cmap, stuff->cmap, 23466747b715Smrg XRT_COLORMAP, client, DixWriteAccess); 23476747b715Smrg if (result != Success) 23486747b715Smrg return result; 234905b261ecSmrg 235005b261ecSmrg FOR_NSCREENS_BACKWARD(j){ 235105b261ecSmrg stuff->cmap = cmap->info[j].id; 235205b261ecSmrg result = (* SavedProcVector[X_AllocColorPlanes])(client); 235305b261ecSmrg if(result != Success) break; 235405b261ecSmrg } 23556747b715Smrg return result; 235605b261ecSmrg} 235705b261ecSmrg 235805b261ecSmrg 235905b261ecSmrg 236005b261ecSmrgint PanoramiXFreeColors(ClientPtr client) 236105b261ecSmrg{ 23626747b715Smrg int result, j; 236305b261ecSmrg PanoramiXRes *cmap; 236405b261ecSmrg REQUEST(xFreeColorsReq); 236505b261ecSmrg 236605b261ecSmrg REQUEST_AT_LEAST_SIZE(xFreeColorsReq); 236705b261ecSmrg 236805b261ecSmrg client->errorValue = stuff->cmap; 236905b261ecSmrg 23706747b715Smrg result = dixLookupResourceByType((pointer *)&cmap, stuff->cmap, 23716747b715Smrg XRT_COLORMAP, client, DixWriteAccess); 23726747b715Smrg if (result != Success) 23736747b715Smrg return result; 237405b261ecSmrg 237505b261ecSmrg FOR_NSCREENS_BACKWARD(j) { 237605b261ecSmrg stuff->cmap = cmap->info[j].id; 237705b261ecSmrg result = (* SavedProcVector[X_FreeColors])(client); 237805b261ecSmrg } 23796747b715Smrg return result; 238005b261ecSmrg} 238105b261ecSmrg 238205b261ecSmrg 238305b261ecSmrgint PanoramiXStoreColors(ClientPtr client) 238405b261ecSmrg{ 23856747b715Smrg int result, j; 238605b261ecSmrg PanoramiXRes *cmap; 238705b261ecSmrg REQUEST(xStoreColorsReq); 238805b261ecSmrg 238905b261ecSmrg REQUEST_AT_LEAST_SIZE(xStoreColorsReq); 239005b261ecSmrg 239105b261ecSmrg client->errorValue = stuff->cmap; 239205b261ecSmrg 23936747b715Smrg result = dixLookupResourceByType((pointer *)&cmap, stuff->cmap, 23946747b715Smrg XRT_COLORMAP, client, DixWriteAccess); 23956747b715Smrg if (result != Success) 23966747b715Smrg return result; 239705b261ecSmrg 239805b261ecSmrg FOR_NSCREENS_BACKWARD(j){ 239905b261ecSmrg stuff->cmap = cmap->info[j].id; 240005b261ecSmrg result = (* SavedProcVector[X_StoreColors])(client); 240105b261ecSmrg if(result != Success) break; 240205b261ecSmrg } 24036747b715Smrg return result; 240405b261ecSmrg} 240505b261ecSmrg 240605b261ecSmrg 240705b261ecSmrgint PanoramiXStoreNamedColor(ClientPtr client) 240805b261ecSmrg{ 24096747b715Smrg int result, j; 241005b261ecSmrg PanoramiXRes *cmap; 241105b261ecSmrg REQUEST(xStoreNamedColorReq); 241205b261ecSmrg 241305b261ecSmrg REQUEST_FIXED_SIZE(xStoreNamedColorReq, stuff->nbytes); 241405b261ecSmrg 241505b261ecSmrg client->errorValue = stuff->cmap; 241605b261ecSmrg 24176747b715Smrg result = dixLookupResourceByType((pointer *)&cmap, stuff->cmap, 24186747b715Smrg XRT_COLORMAP, client, DixWriteAccess); 24196747b715Smrg if (result != Success) 24206747b715Smrg return result; 242105b261ecSmrg 242205b261ecSmrg FOR_NSCREENS_BACKWARD(j){ 242305b261ecSmrg stuff->cmap = cmap->info[j].id; 242405b261ecSmrg result = (* SavedProcVector[X_StoreNamedColor])(client); 242505b261ecSmrg if(result != Success) break; 242605b261ecSmrg } 24276747b715Smrg return result; 242805b261ecSmrg} 2429