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