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