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