panoramiXprocs.c revision 1b5d61b8
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#ifdef HAVE_DIX_CONFIG_H
2905b261ecSmrg#include <dix-config.h>
3005b261ecSmrg#endif
3105b261ecSmrg
3205b261ecSmrg#include <stdio.h>
3305b261ecSmrg#include <X11/X.h>
3405b261ecSmrg#include <X11/Xproto.h>
3505b261ecSmrg#include "windowstr.h"
3605b261ecSmrg#include "dixfontstr.h"
3705b261ecSmrg#include "gcstruct.h"
3805b261ecSmrg#include "colormapst.h"
3905b261ecSmrg#include "scrnintstr.h"
4005b261ecSmrg#include "opaque.h"
4105b261ecSmrg#include "inputstr.h"
4205b261ecSmrg#include "migc.h"
4305b261ecSmrg#include "misc.h"
4405b261ecSmrg#include "dixstruct.h"
4505b261ecSmrg#include "panoramiX.h"
4605b261ecSmrg#include "panoramiXsrv.h"
4705b261ecSmrg#include "resource.h"
4805b261ecSmrg#include "panoramiXh.h"
4905b261ecSmrg
5005b261ecSmrg#define XINERAMA_IMAGE_BUFSIZE (256*1024)
5105b261ecSmrg#define INPUTONLY_LEGAL_MASK (CWWinGravity | CWEventMask | \
5205b261ecSmrg                              CWDontPropagate | CWOverrideRedirect | CWCursor )
5305b261ecSmrg
5435c4bbdfSmrgint
5535c4bbdfSmrgPanoramiXCreateWindow(ClientPtr client)
5605b261ecSmrg{
5705b261ecSmrg    PanoramiXRes *parent, *newWin;
5805b261ecSmrg    PanoramiXRes *backPix = NULL;
5905b261ecSmrg    PanoramiXRes *bordPix = NULL;
6035c4bbdfSmrg    PanoramiXRes *cmap = NULL;
6135c4bbdfSmrg
6205b261ecSmrg    REQUEST(xCreateWindowReq);
6305b261ecSmrg    int pback_offset = 0, pbord_offset = 0, cmap_offset = 0;
646747b715Smrg    int result, len, j;
6505b261ecSmrg    int orig_x, orig_y;
6605b261ecSmrg    XID orig_visual, tmp;
6705b261ecSmrg    Bool parentIsRoot;
6805b261ecSmrg
6905b261ecSmrg    REQUEST_AT_LEAST_SIZE(xCreateWindowReq);
7035c4bbdfSmrg
716747b715Smrg    len = client->req_len - bytes_to_int32(sizeof(xCreateWindowReq));
7205b261ecSmrg    if (Ones(stuff->mask) != len)
7305b261ecSmrg        return BadLength;
7405b261ecSmrg
7535c4bbdfSmrg    result = dixLookupResourceByType((void **) &parent, stuff->parent,
7635c4bbdfSmrg                                     XRT_WINDOW, client, DixWriteAccess);
776747b715Smrg    if (result != Success)
786747b715Smrg        return result;
7905b261ecSmrg
8035c4bbdfSmrg    if (stuff->class == CopyFromParent)
8135c4bbdfSmrg        stuff->class = parent->u.win.class;
8205b261ecSmrg
8335c4bbdfSmrg    if ((stuff->class == InputOnly) && (stuff->mask & (~INPUTONLY_LEGAL_MASK)))
8405b261ecSmrg        return BadMatch;
8505b261ecSmrg
8635c4bbdfSmrg    if ((Mask) stuff->mask & CWBackPixmap) {
8735c4bbdfSmrg        pback_offset = Ones((Mask) stuff->mask & (CWBackPixmap - 1));
8835c4bbdfSmrg        tmp = *((CARD32 *) &stuff[1] + pback_offset);
8935c4bbdfSmrg        if ((tmp != None) && (tmp != ParentRelative)) {
9035c4bbdfSmrg            result = dixLookupResourceByType((void **) &backPix, tmp,
9135c4bbdfSmrg                                             XRT_PIXMAP, client, DixReadAccess);
9235c4bbdfSmrg            if (result != Success)
9335c4bbdfSmrg                return result;
9435c4bbdfSmrg        }
9535c4bbdfSmrg    }
9635c4bbdfSmrg    if ((Mask) stuff->mask & CWBorderPixmap) {
9735c4bbdfSmrg        pbord_offset = Ones((Mask) stuff->mask & (CWBorderPixmap - 1));
9835c4bbdfSmrg        tmp = *((CARD32 *) &stuff[1] + pbord_offset);
9935c4bbdfSmrg        if (tmp != CopyFromParent) {
10035c4bbdfSmrg            result = dixLookupResourceByType((void **) &bordPix, tmp,
10135c4bbdfSmrg                                             XRT_PIXMAP, client, DixReadAccess);
10235c4bbdfSmrg            if (result != Success)
10335c4bbdfSmrg                return result;
10435c4bbdfSmrg        }
10535c4bbdfSmrg    }
10635c4bbdfSmrg    if ((Mask) stuff->mask & CWColormap) {
10735c4bbdfSmrg        cmap_offset = Ones((Mask) stuff->mask & (CWColormap - 1));
10835c4bbdfSmrg        tmp = *((CARD32 *) &stuff[1] + cmap_offset);
10935c4bbdfSmrg        if (tmp != CopyFromParent) {
11035c4bbdfSmrg            result = dixLookupResourceByType((void **) &cmap, tmp,
11135c4bbdfSmrg                                             XRT_COLORMAP, client,
11235c4bbdfSmrg                                             DixReadAccess);
11335c4bbdfSmrg            if (result != Success)
11435c4bbdfSmrg                return result;
11535c4bbdfSmrg        }
11635c4bbdfSmrg    }
11735c4bbdfSmrg
11835c4bbdfSmrg    if (!(newWin = malloc(sizeof(PanoramiXRes))))
11905b261ecSmrg        return BadAlloc;
12005b261ecSmrg
12105b261ecSmrg    newWin->type = XRT_WINDOW;
12205b261ecSmrg    newWin->u.win.visibility = VisibilityNotViewable;
12305b261ecSmrg    newWin->u.win.class = stuff->class;
12405b261ecSmrg    newWin->u.win.root = FALSE;
12535c4bbdfSmrg    panoramix_setup_ids(newWin, client, stuff->wid);
12605b261ecSmrg
12705b261ecSmrg    if (stuff->class == InputOnly)
12835c4bbdfSmrg        stuff->visual = CopyFromParent;
12905b261ecSmrg    orig_visual = stuff->visual;
13005b261ecSmrg    orig_x = stuff->x;
13105b261ecSmrg    orig_y = stuff->y;
13235c4bbdfSmrg    parentIsRoot = (stuff->parent == screenInfo.screens[0]->root->drawable.id)
13335c4bbdfSmrg        || (stuff->parent == screenInfo.screens[0]->screensaver.wid);
13405b261ecSmrg    FOR_NSCREENS_BACKWARD(j) {
13505b261ecSmrg        stuff->wid = newWin->info[j].id;
13605b261ecSmrg        stuff->parent = parent->info[j].id;
13735c4bbdfSmrg        if (parentIsRoot) {
13835c4bbdfSmrg            stuff->x = orig_x - screenInfo.screens[j]->x;
13935c4bbdfSmrg            stuff->y = orig_y - screenInfo.screens[j]->y;
14035c4bbdfSmrg        }
14135c4bbdfSmrg        if (backPix)
14235c4bbdfSmrg            *((CARD32 *) &stuff[1] + pback_offset) = backPix->info[j].id;
14335c4bbdfSmrg        if (bordPix)
14435c4bbdfSmrg            *((CARD32 *) &stuff[1] + pbord_offset) = bordPix->info[j].id;
14535c4bbdfSmrg        if (cmap)
14635c4bbdfSmrg            *((CARD32 *) &stuff[1] + cmap_offset) = cmap->info[j].id;
14735c4bbdfSmrg        if (orig_visual != CopyFromParent)
14835c4bbdfSmrg            stuff->visual = PanoramiXTranslateVisualID(j, orig_visual);
14935c4bbdfSmrg        result = (*SavedProcVector[X_CreateWindow]) (client);
15035c4bbdfSmrg        if (result != Success)
15135c4bbdfSmrg            break;
15205b261ecSmrg    }
15305b261ecSmrg
15405b261ecSmrg    if (result == Success)
15505b261ecSmrg        AddResource(newWin->info[0].id, XRT_WINDOW, newWin);
15635c4bbdfSmrg    else
1576747b715Smrg        free(newWin);
15805b261ecSmrg
1596747b715Smrg    return result;
16005b261ecSmrg}
16105b261ecSmrg
16235c4bbdfSmrgint
16335c4bbdfSmrgPanoramiXChangeWindowAttributes(ClientPtr client)
16405b261ecSmrg{
16505b261ecSmrg    PanoramiXRes *win;
16605b261ecSmrg    PanoramiXRes *backPix = NULL;
16705b261ecSmrg    PanoramiXRes *bordPix = NULL;
16835c4bbdfSmrg    PanoramiXRes *cmap = NULL;
16935c4bbdfSmrg
17005b261ecSmrg    REQUEST(xChangeWindowAttributesReq);
17105b261ecSmrg    int pback_offset = 0, pbord_offset = 0, cmap_offset = 0;
1726747b715Smrg    int result, len, j;
17305b261ecSmrg    XID tmp;
17405b261ecSmrg
17505b261ecSmrg    REQUEST_AT_LEAST_SIZE(xChangeWindowAttributesReq);
17635c4bbdfSmrg
1776747b715Smrg    len = client->req_len - bytes_to_int32(sizeof(xChangeWindowAttributesReq));
17805b261ecSmrg    if (Ones(stuff->valueMask) != len)
17905b261ecSmrg        return BadLength;
18005b261ecSmrg
18135c4bbdfSmrg    result = dixLookupResourceByType((void **) &win, stuff->window,
18235c4bbdfSmrg                                     XRT_WINDOW, client, DixWriteAccess);
1836747b715Smrg    if (result != Success)
1846747b715Smrg        return result;
18505b261ecSmrg
18635c4bbdfSmrg    if ((win->u.win.class == InputOnly) &&
18735c4bbdfSmrg        (stuff->valueMask & (~INPUTONLY_LEGAL_MASK)))
18805b261ecSmrg        return BadMatch;
18905b261ecSmrg
19035c4bbdfSmrg    if ((Mask) stuff->valueMask & CWBackPixmap) {
19135c4bbdfSmrg        pback_offset = Ones((Mask) stuff->valueMask & (CWBackPixmap - 1));
19235c4bbdfSmrg        tmp = *((CARD32 *) &stuff[1] + pback_offset);
19335c4bbdfSmrg        if ((tmp != None) && (tmp != ParentRelative)) {
19435c4bbdfSmrg            result = dixLookupResourceByType((void **) &backPix, tmp,
19535c4bbdfSmrg                                             XRT_PIXMAP, client, DixReadAccess);
19635c4bbdfSmrg            if (result != Success)
19735c4bbdfSmrg                return result;
19835c4bbdfSmrg        }
19935c4bbdfSmrg    }
20035c4bbdfSmrg    if ((Mask) stuff->valueMask & CWBorderPixmap) {
20135c4bbdfSmrg        pbord_offset = Ones((Mask) stuff->valueMask & (CWBorderPixmap - 1));
20235c4bbdfSmrg        tmp = *((CARD32 *) &stuff[1] + pbord_offset);
20335c4bbdfSmrg        if (tmp != CopyFromParent) {
20435c4bbdfSmrg            result = dixLookupResourceByType((void **) &bordPix, tmp,
20535c4bbdfSmrg                                             XRT_PIXMAP, client, DixReadAccess);
20635c4bbdfSmrg            if (result != Success)
20735c4bbdfSmrg                return result;
20835c4bbdfSmrg        }
20935c4bbdfSmrg    }
21035c4bbdfSmrg    if ((Mask) stuff->valueMask & CWColormap) {
21135c4bbdfSmrg        cmap_offset = Ones((Mask) stuff->valueMask & (CWColormap - 1));
21235c4bbdfSmrg        tmp = *((CARD32 *) &stuff[1] + cmap_offset);
21335c4bbdfSmrg        if (tmp != CopyFromParent) {
21435c4bbdfSmrg            result = dixLookupResourceByType((void **) &cmap, tmp,
21535c4bbdfSmrg                                             XRT_COLORMAP, client,
21635c4bbdfSmrg                                             DixReadAccess);
21735c4bbdfSmrg            if (result != Success)
21835c4bbdfSmrg                return result;
21935c4bbdfSmrg        }
22005b261ecSmrg    }
22105b261ecSmrg
22205b261ecSmrg    FOR_NSCREENS_BACKWARD(j) {
22305b261ecSmrg        stuff->window = win->info[j].id;
22435c4bbdfSmrg        if (backPix)
22535c4bbdfSmrg            *((CARD32 *) &stuff[1] + pback_offset) = backPix->info[j].id;
22635c4bbdfSmrg        if (bordPix)
22735c4bbdfSmrg            *((CARD32 *) &stuff[1] + pbord_offset) = bordPix->info[j].id;
22835c4bbdfSmrg        if (cmap)
22935c4bbdfSmrg            *((CARD32 *) &stuff[1] + cmap_offset) = cmap->info[j].id;
23035c4bbdfSmrg        result = (*SavedProcVector[X_ChangeWindowAttributes]) (client);
23105b261ecSmrg    }
23205b261ecSmrg
2336747b715Smrg    return result;
23405b261ecSmrg}
23505b261ecSmrg
23635c4bbdfSmrgint
23735c4bbdfSmrgPanoramiXDestroyWindow(ClientPtr client)
23805b261ecSmrg{
23905b261ecSmrg    PanoramiXRes *win;
24035c4bbdfSmrg    int result, j;
24135c4bbdfSmrg
24205b261ecSmrg    REQUEST(xResourceReq);
24305b261ecSmrg
24405b261ecSmrg    REQUEST_SIZE_MATCH(xResourceReq);
24505b261ecSmrg
24635c4bbdfSmrg    result = dixLookupResourceByType((void **) &win, stuff->id, XRT_WINDOW,
24735c4bbdfSmrg                                     client, DixDestroyAccess);
2486747b715Smrg    if (result != Success)
24935c4bbdfSmrg        return result;
25005b261ecSmrg
25105b261ecSmrg    FOR_NSCREENS_BACKWARD(j) {
25235c4bbdfSmrg        stuff->id = win->info[j].id;
25335c4bbdfSmrg        result = (*SavedProcVector[X_DestroyWindow]) (client);
25435c4bbdfSmrg        if (result != Success)
25535c4bbdfSmrg            break;
25605b261ecSmrg    }
25705b261ecSmrg
25805b261ecSmrg    /* Since ProcDestroyWindow is using FreeResource, it will free
25935c4bbdfSmrg       our resource for us on the last pass through the loop above */
26035c4bbdfSmrg
2616747b715Smrg    return result;
26205b261ecSmrg}
26305b261ecSmrg
26435c4bbdfSmrgint
26535c4bbdfSmrgPanoramiXDestroySubwindows(ClientPtr client)
26605b261ecSmrg{
26705b261ecSmrg    PanoramiXRes *win;
26835c4bbdfSmrg    int result, j;
26935c4bbdfSmrg
27005b261ecSmrg    REQUEST(xResourceReq);
27105b261ecSmrg
27205b261ecSmrg    REQUEST_SIZE_MATCH(xResourceReq);
27305b261ecSmrg
27435c4bbdfSmrg    result = dixLookupResourceByType((void **) &win, stuff->id, XRT_WINDOW,
27535c4bbdfSmrg                                     client, DixDestroyAccess);
2766747b715Smrg    if (result != Success)
27735c4bbdfSmrg        return result;
27805b261ecSmrg
27905b261ecSmrg    FOR_NSCREENS_BACKWARD(j) {
28035c4bbdfSmrg        stuff->id = win->info[j].id;
28135c4bbdfSmrg        result = (*SavedProcVector[X_DestroySubwindows]) (client);
28235c4bbdfSmrg        if (result != Success)
28335c4bbdfSmrg            break;
28405b261ecSmrg    }
28505b261ecSmrg
28605b261ecSmrg    /* DestroySubwindows is using FreeResource which will free
28735c4bbdfSmrg       our resources for us on the last pass through the loop above */
28805b261ecSmrg
2896747b715Smrg    return result;
29005b261ecSmrg}
29105b261ecSmrg
29235c4bbdfSmrgint
29335c4bbdfSmrgPanoramiXChangeSaveSet(ClientPtr client)
29405b261ecSmrg{
29505b261ecSmrg    PanoramiXRes *win;
29635c4bbdfSmrg    int result, j;
29735c4bbdfSmrg
29805b261ecSmrg    REQUEST(xChangeSaveSetReq);
29905b261ecSmrg
30005b261ecSmrg    REQUEST_SIZE_MATCH(xChangeSaveSetReq);
30105b261ecSmrg
30235c4bbdfSmrg    result = dixLookupResourceByType((void **) &win, stuff->window,
30335c4bbdfSmrg                                     XRT_WINDOW, client, DixReadAccess);
3046747b715Smrg    if (result != Success)
30535c4bbdfSmrg        return result;
30605b261ecSmrg
30705b261ecSmrg    FOR_NSCREENS_BACKWARD(j) {
30835c4bbdfSmrg        stuff->window = win->info[j].id;
30935c4bbdfSmrg        result = (*SavedProcVector[X_ChangeSaveSet]) (client);
31035c4bbdfSmrg        if (result != Success)
31135c4bbdfSmrg            break;
31205b261ecSmrg    }
31305b261ecSmrg
3146747b715Smrg    return result;
31505b261ecSmrg}
31605b261ecSmrg
31735c4bbdfSmrgint
31835c4bbdfSmrgPanoramiXReparentWindow(ClientPtr client)
31905b261ecSmrg{
32005b261ecSmrg    PanoramiXRes *win, *parent;
32135c4bbdfSmrg    int result, j;
32235c4bbdfSmrg    int x, y;
32335c4bbdfSmrg    Bool parentIsRoot;
32435c4bbdfSmrg
32505b261ecSmrg    REQUEST(xReparentWindowReq);
32605b261ecSmrg
32705b261ecSmrg    REQUEST_SIZE_MATCH(xReparentWindowReq);
32805b261ecSmrg
32935c4bbdfSmrg    result = dixLookupResourceByType((void **) &win, stuff->window,
33035c4bbdfSmrg                                     XRT_WINDOW, client, DixWriteAccess);
3316747b715Smrg    if (result != Success)
33235c4bbdfSmrg        return result;
33305b261ecSmrg
33435c4bbdfSmrg    result = dixLookupResourceByType((void **) &parent, stuff->parent,
33535c4bbdfSmrg                                     XRT_WINDOW, client, DixWriteAccess);
3366747b715Smrg    if (result != Success)
33735c4bbdfSmrg        return result;
33805b261ecSmrg
33905b261ecSmrg    x = stuff->x;
34005b261ecSmrg    y = stuff->y;
34135c4bbdfSmrg    parentIsRoot = (stuff->parent == screenInfo.screens[0]->root->drawable.id)
34235c4bbdfSmrg        || (stuff->parent == screenInfo.screens[0]->screensaver.wid);
34305b261ecSmrg    FOR_NSCREENS_BACKWARD(j) {
34435c4bbdfSmrg        stuff->window = win->info[j].id;
34535c4bbdfSmrg        stuff->parent = parent->info[j].id;
34635c4bbdfSmrg        if (parentIsRoot) {
34735c4bbdfSmrg            stuff->x = x - screenInfo.screens[j]->x;
34835c4bbdfSmrg            stuff->y = y - screenInfo.screens[j]->y;
34935c4bbdfSmrg        }
35035c4bbdfSmrg        result = (*SavedProcVector[X_ReparentWindow]) (client);
35135c4bbdfSmrg        if (result != Success)
35235c4bbdfSmrg            break;
35305b261ecSmrg    }
35405b261ecSmrg
3556747b715Smrg    return result;
35605b261ecSmrg}
35705b261ecSmrg
35835c4bbdfSmrgint
35935c4bbdfSmrgPanoramiXMapWindow(ClientPtr client)
36005b261ecSmrg{
36105b261ecSmrg    PanoramiXRes *win;
36235c4bbdfSmrg    int result, j;
36335c4bbdfSmrg
36405b261ecSmrg    REQUEST(xResourceReq);
36505b261ecSmrg
36605b261ecSmrg    REQUEST_SIZE_MATCH(xResourceReq);
36705b261ecSmrg
36835c4bbdfSmrg    result = dixLookupResourceByType((void **) &win, stuff->id,
36935c4bbdfSmrg                                     XRT_WINDOW, client, DixReadAccess);
3706747b715Smrg    if (result != Success)
37135c4bbdfSmrg        return result;
37205b261ecSmrg
37305b261ecSmrg    FOR_NSCREENS_FORWARD(j) {
37435c4bbdfSmrg        stuff->id = win->info[j].id;
37535c4bbdfSmrg        result = (*SavedProcVector[X_MapWindow]) (client);
37635c4bbdfSmrg        if (result != Success)
37735c4bbdfSmrg            break;
37805b261ecSmrg    }
37905b261ecSmrg
3806747b715Smrg    return result;
38105b261ecSmrg}
38205b261ecSmrg
38335c4bbdfSmrgint
38435c4bbdfSmrgPanoramiXMapSubwindows(ClientPtr client)
38505b261ecSmrg{
38605b261ecSmrg    PanoramiXRes *win;
38735c4bbdfSmrg    int result, j;
38835c4bbdfSmrg
38905b261ecSmrg    REQUEST(xResourceReq);
39005b261ecSmrg
39105b261ecSmrg    REQUEST_SIZE_MATCH(xResourceReq);
39205b261ecSmrg
39335c4bbdfSmrg    result = dixLookupResourceByType((void **) &win, stuff->id,
39435c4bbdfSmrg                                     XRT_WINDOW, client, DixReadAccess);
3956747b715Smrg    if (result != Success)
39635c4bbdfSmrg        return result;
39705b261ecSmrg
39805b261ecSmrg    FOR_NSCREENS_FORWARD(j) {
39935c4bbdfSmrg        stuff->id = win->info[j].id;
40035c4bbdfSmrg        result = (*SavedProcVector[X_MapSubwindows]) (client);
40135c4bbdfSmrg        if (result != Success)
40235c4bbdfSmrg            break;
40305b261ecSmrg    }
40405b261ecSmrg
4056747b715Smrg    return result;
40605b261ecSmrg}
40705b261ecSmrg
40835c4bbdfSmrgint
40935c4bbdfSmrgPanoramiXUnmapWindow(ClientPtr client)
41005b261ecSmrg{
41105b261ecSmrg    PanoramiXRes *win;
41235c4bbdfSmrg    int result, j;
41335c4bbdfSmrg
41405b261ecSmrg    REQUEST(xResourceReq);
41505b261ecSmrg
41605b261ecSmrg    REQUEST_SIZE_MATCH(xResourceReq);
41705b261ecSmrg
41835c4bbdfSmrg    result = dixLookupResourceByType((void **) &win, stuff->id,
41935c4bbdfSmrg                                     XRT_WINDOW, client, DixReadAccess);
4206747b715Smrg    if (result != Success)
42135c4bbdfSmrg        return result;
42205b261ecSmrg
42305b261ecSmrg    FOR_NSCREENS_FORWARD(j) {
42435c4bbdfSmrg        stuff->id = win->info[j].id;
42535c4bbdfSmrg        result = (*SavedProcVector[X_UnmapWindow]) (client);
42635c4bbdfSmrg        if (result != Success)
42735c4bbdfSmrg            break;
42805b261ecSmrg    }
42905b261ecSmrg
4306747b715Smrg    return result;
43105b261ecSmrg}
43205b261ecSmrg
43335c4bbdfSmrgint
43435c4bbdfSmrgPanoramiXUnmapSubwindows(ClientPtr client)
43505b261ecSmrg{
43605b261ecSmrg    PanoramiXRes *win;
43735c4bbdfSmrg    int result, j;
43835c4bbdfSmrg
43905b261ecSmrg    REQUEST(xResourceReq);
44005b261ecSmrg
44105b261ecSmrg    REQUEST_SIZE_MATCH(xResourceReq);
44205b261ecSmrg
44335c4bbdfSmrg    result = dixLookupResourceByType((void **) &win, stuff->id,
44435c4bbdfSmrg                                     XRT_WINDOW, client, DixReadAccess);
4456747b715Smrg    if (result != Success)
44635c4bbdfSmrg        return result;
44705b261ecSmrg
44805b261ecSmrg    FOR_NSCREENS_FORWARD(j) {
44935c4bbdfSmrg        stuff->id = win->info[j].id;
45035c4bbdfSmrg        result = (*SavedProcVector[X_UnmapSubwindows]) (client);
45135c4bbdfSmrg        if (result != Success)
45235c4bbdfSmrg            break;
45305b261ecSmrg    }
45405b261ecSmrg
4556747b715Smrg    return result;
45605b261ecSmrg}
45705b261ecSmrg
45835c4bbdfSmrgint
45935c4bbdfSmrgPanoramiXConfigureWindow(ClientPtr client)
46005b261ecSmrg{
46105b261ecSmrg    PanoramiXRes *win;
46205b261ecSmrg    PanoramiXRes *sib = NULL;
46335c4bbdfSmrg    WindowPtr pWin;
46435c4bbdfSmrg    int result, j, len, sib_offset = 0, x = 0, y = 0;
46535c4bbdfSmrg    int x_offset = -1;
46635c4bbdfSmrg    int y_offset = -1;
46735c4bbdfSmrg
46805b261ecSmrg    REQUEST(xConfigureWindowReq);
46905b261ecSmrg
47005b261ecSmrg    REQUEST_AT_LEAST_SIZE(xConfigureWindowReq);
47105b261ecSmrg
4726747b715Smrg    len = client->req_len - bytes_to_int32(sizeof(xConfigureWindowReq));
47305b261ecSmrg    if (Ones(stuff->mask) != len)
47405b261ecSmrg        return BadLength;
47505b261ecSmrg
47605b261ecSmrg    /* because we need the parent */
47735c4bbdfSmrg    result = dixLookupResourceByType((void **) &pWin, stuff->window,
47835c4bbdfSmrg                                     RT_WINDOW, client, DixWriteAccess);
47935c4bbdfSmrg    if (result != Success)
48035c4bbdfSmrg        return result;
48135c4bbdfSmrg
48235c4bbdfSmrg    result = dixLookupResourceByType((void **) &win, stuff->window,
48335c4bbdfSmrg                                     XRT_WINDOW, client, DixWriteAccess);
48435c4bbdfSmrg    if (result != Success)
48535c4bbdfSmrg        return result;
48635c4bbdfSmrg
48735c4bbdfSmrg    if ((Mask) stuff->mask & CWSibling) {
48835c4bbdfSmrg        XID tmp;
48935c4bbdfSmrg
49035c4bbdfSmrg        sib_offset = Ones((Mask) stuff->mask & (CWSibling - 1));
49135c4bbdfSmrg        if ((tmp = *((CARD32 *) &stuff[1] + sib_offset))) {
49235c4bbdfSmrg            result = dixLookupResourceByType((void **) &sib, tmp, XRT_WINDOW,
49335c4bbdfSmrg                                             client, DixReadAccess);
49435c4bbdfSmrg            if (result != Success)
49535c4bbdfSmrg                return result;
49635c4bbdfSmrg        }
49735c4bbdfSmrg    }
49835c4bbdfSmrg
49935c4bbdfSmrg    if (pWin->parent && ((pWin->parent == screenInfo.screens[0]->root) ||
50035c4bbdfSmrg                         (pWin->parent->drawable.id ==
50135c4bbdfSmrg                          screenInfo.screens[0]->screensaver.wid))) {
50235c4bbdfSmrg        if ((Mask) stuff->mask & CWX) {
50335c4bbdfSmrg            x_offset = 0;
50435c4bbdfSmrg            x = *((CARD32 *) &stuff[1]);
50535c4bbdfSmrg        }
50635c4bbdfSmrg        if ((Mask) stuff->mask & CWY) {
50735c4bbdfSmrg            y_offset = (x_offset == -1) ? 0 : 1;
50835c4bbdfSmrg            y = *((CARD32 *) &stuff[1] + y_offset);
50935c4bbdfSmrg        }
51035c4bbdfSmrg    }
51135c4bbdfSmrg
51235c4bbdfSmrg    /* have to go forward or you get expose events before
51335c4bbdfSmrg       ConfigureNotify events */
51405b261ecSmrg    FOR_NSCREENS_FORWARD(j) {
51535c4bbdfSmrg        stuff->window = win->info[j].id;
51635c4bbdfSmrg        if (sib)
51735c4bbdfSmrg            *((CARD32 *) &stuff[1] + sib_offset) = sib->info[j].id;
51835c4bbdfSmrg        if (x_offset >= 0)
51935c4bbdfSmrg            *((CARD32 *) &stuff[1] + x_offset) = x - screenInfo.screens[j]->x;
52035c4bbdfSmrg        if (y_offset >= 0)
52135c4bbdfSmrg            *((CARD32 *) &stuff[1] + y_offset) = y - screenInfo.screens[j]->y;
52235c4bbdfSmrg        result = (*SavedProcVector[X_ConfigureWindow]) (client);
52335c4bbdfSmrg        if (result != Success)
52435c4bbdfSmrg            break;
52505b261ecSmrg    }
52605b261ecSmrg
5276747b715Smrg    return result;
52805b261ecSmrg}
52905b261ecSmrg
53035c4bbdfSmrgint
53135c4bbdfSmrgPanoramiXCirculateWindow(ClientPtr client)
53205b261ecSmrg{
53305b261ecSmrg    PanoramiXRes *win;
53435c4bbdfSmrg    int result, j;
53535c4bbdfSmrg
53605b261ecSmrg    REQUEST(xCirculateWindowReq);
53705b261ecSmrg
53805b261ecSmrg    REQUEST_SIZE_MATCH(xCirculateWindowReq);
53905b261ecSmrg
54035c4bbdfSmrg    result = dixLookupResourceByType((void **) &win, stuff->window,
54135c4bbdfSmrg                                     XRT_WINDOW, client, DixWriteAccess);
5426747b715Smrg    if (result != Success)
54335c4bbdfSmrg        return result;
54405b261ecSmrg
54505b261ecSmrg    FOR_NSCREENS_FORWARD(j) {
54635c4bbdfSmrg        stuff->window = win->info[j].id;
54735c4bbdfSmrg        result = (*SavedProcVector[X_CirculateWindow]) (client);
54835c4bbdfSmrg        if (result != Success)
54935c4bbdfSmrg            break;
55005b261ecSmrg    }
55105b261ecSmrg
5526747b715Smrg    return result;
55305b261ecSmrg}
55405b261ecSmrg
55535c4bbdfSmrgint
55635c4bbdfSmrgPanoramiXGetGeometry(ClientPtr client)
55705b261ecSmrg{
55835c4bbdfSmrg    xGetGeometryReply rep;
55905b261ecSmrg    DrawablePtr pDraw;
56005b261ecSmrg    int rc;
56135c4bbdfSmrg
56205b261ecSmrg    REQUEST(xResourceReq);
56305b261ecSmrg
56405b261ecSmrg    REQUEST_SIZE_MATCH(xResourceReq);
5654642e01fSmrg    rc = dixLookupDrawable(&pDraw, stuff->id, client, M_ANY, DixGetAttrAccess);
56605b261ecSmrg    if (rc != Success)
56735c4bbdfSmrg        return rc;
56805b261ecSmrg
56935c4bbdfSmrg    rep = (xGetGeometryReply) {
57035c4bbdfSmrg        .type = X_Reply,
57135c4bbdfSmrg        .sequenceNumber = client->sequence,
57235c4bbdfSmrg        .length = 0,
57335c4bbdfSmrg        .root = screenInfo.screens[0]->root->drawable.id,
57435c4bbdfSmrg        .depth = pDraw->depth,
57535c4bbdfSmrg        .width = pDraw->width,
57635c4bbdfSmrg        .height = pDraw->height,
57735c4bbdfSmrg        .x = 0,
57835c4bbdfSmrg        .y = 0,
57935c4bbdfSmrg        .borderWidth = 0
58035c4bbdfSmrg    };
58105b261ecSmrg
58205b261ecSmrg    if (stuff->id == rep.root) {
58335c4bbdfSmrg        xWindowRoot *root = (xWindowRoot *)
58435c4bbdfSmrg            (ConnectionInfo + connBlockScreenStart);
58535c4bbdfSmrg
58635c4bbdfSmrg        rep.width = root->pixWidth;
58735c4bbdfSmrg        rep.height = root->pixHeight;
58835c4bbdfSmrg    }
58935c4bbdfSmrg    else if (WindowDrawable(pDraw->type)) {
59035c4bbdfSmrg        WindowPtr pWin = (WindowPtr) pDraw;
59135c4bbdfSmrg
59235c4bbdfSmrg        rep.x = pWin->origin.x - wBorderWidth(pWin);
59335c4bbdfSmrg        rep.y = pWin->origin.y - wBorderWidth(pWin);
59435c4bbdfSmrg        if ((pWin->parent == screenInfo.screens[0]->root) ||
59535c4bbdfSmrg            (pWin->parent->drawable.id ==
59635c4bbdfSmrg             screenInfo.screens[0]->screensaver.wid)) {
59735c4bbdfSmrg            rep.x += screenInfo.screens[0]->x;
59835c4bbdfSmrg            rep.y += screenInfo.screens[0]->y;
59935c4bbdfSmrg        }
60035c4bbdfSmrg        rep.borderWidth = pWin->borderWidth;
60105b261ecSmrg    }
60205b261ecSmrg
60305b261ecSmrg    WriteReplyToClient(client, sizeof(xGetGeometryReply), &rep);
6046747b715Smrg    return Success;
60505b261ecSmrg}
60605b261ecSmrg
60735c4bbdfSmrgint
60835c4bbdfSmrgPanoramiXTranslateCoords(ClientPtr client)
60905b261ecSmrg{
61005b261ecSmrg    INT16 x, y;
61135c4bbdfSmrg
61205b261ecSmrg    REQUEST(xTranslateCoordsReq);
61305b261ecSmrg    int rc;
61405b261ecSmrg    WindowPtr pWin, pDst;
61505b261ecSmrg    xTranslateCoordsReply rep;
61605b261ecSmrg
61705b261ecSmrg    REQUEST_SIZE_MATCH(xTranslateCoordsReq);
61805b261ecSmrg    rc = dixLookupWindow(&pWin, stuff->srcWid, client, DixReadAccess);
61905b261ecSmrg    if (rc != Success)
62005b261ecSmrg        return rc;
62105b261ecSmrg    rc = dixLookupWindow(&pDst, stuff->dstWid, client, DixReadAccess);
62205b261ecSmrg    if (rc != Success)
62305b261ecSmrg        return rc;
62435c4bbdfSmrg    rep = (xTranslateCoordsReply) {
62535c4bbdfSmrg        .type = X_Reply,
62635c4bbdfSmrg        .sequenceNumber = client->sequence,
62735c4bbdfSmrg        .length = 0,
62835c4bbdfSmrg        .sameScreen = xTrue,
62935c4bbdfSmrg        .child = None
63035c4bbdfSmrg    };
63135c4bbdfSmrg
63235c4bbdfSmrg    if ((pWin == screenInfo.screens[0]->root) ||
63335c4bbdfSmrg        (pWin->drawable.id == screenInfo.screens[0]->screensaver.wid)) {
63435c4bbdfSmrg        x = stuff->srcX - screenInfo.screens[0]->x;
63535c4bbdfSmrg        y = stuff->srcY - screenInfo.screens[0]->y;
63635c4bbdfSmrg    }
63735c4bbdfSmrg    else {
63835c4bbdfSmrg        x = pWin->drawable.x + stuff->srcX;
63935c4bbdfSmrg        y = pWin->drawable.y + stuff->srcY;
64005b261ecSmrg    }
64105b261ecSmrg    pWin = pDst->firstChild;
64205b261ecSmrg    while (pWin) {
64335c4bbdfSmrg        BoxRec box;
64435c4bbdfSmrg
64535c4bbdfSmrg        if ((pWin->mapped) &&
64635c4bbdfSmrg            (x >= pWin->drawable.x - wBorderWidth(pWin)) &&
64735c4bbdfSmrg            (x < pWin->drawable.x + (int) pWin->drawable.width +
64835c4bbdfSmrg             wBorderWidth(pWin)) &&
64935c4bbdfSmrg            (y >= pWin->drawable.y - wBorderWidth(pWin)) &&
65035c4bbdfSmrg            (y < pWin->drawable.y + (int) pWin->drawable.height +
65135c4bbdfSmrg             wBorderWidth(pWin))
65235c4bbdfSmrg            /* When a window is shaped, a further check
65335c4bbdfSmrg             * is made to see if the point is inside
65435c4bbdfSmrg             * borderSize
65535c4bbdfSmrg             */
65635c4bbdfSmrg            && (!wBoundingShape(pWin) ||
65735c4bbdfSmrg                RegionContainsPoint(wBoundingShape(pWin),
65835c4bbdfSmrg                                    x - pWin->drawable.x,
65935c4bbdfSmrg                                    y - pWin->drawable.y, &box))
66035c4bbdfSmrg            ) {
66135c4bbdfSmrg            rep.child = pWin->drawable.id;
66235c4bbdfSmrg            pWin = (WindowPtr) NULL;
66335c4bbdfSmrg        }
66435c4bbdfSmrg        else
66535c4bbdfSmrg            pWin = pWin->nextSib;
66605b261ecSmrg    }
66705b261ecSmrg    rep.dstX = x - pDst->drawable.x;
66805b261ecSmrg    rep.dstY = y - pDst->drawable.y;
66935c4bbdfSmrg    if ((pDst == screenInfo.screens[0]->root) ||
67035c4bbdfSmrg        (pDst->drawable.id == screenInfo.screens[0]->screensaver.wid)) {
67135c4bbdfSmrg        rep.dstX += screenInfo.screens[0]->x;
67235c4bbdfSmrg        rep.dstY += screenInfo.screens[0]->y;
67305b261ecSmrg    }
67405b261ecSmrg
67505b261ecSmrg    WriteReplyToClient(client, sizeof(xTranslateCoordsReply), &rep);
6766747b715Smrg    return Success;
67705b261ecSmrg}
67805b261ecSmrg
67935c4bbdfSmrgint
68035c4bbdfSmrgPanoramiXCreatePixmap(ClientPtr client)
68105b261ecSmrg{
68205b261ecSmrg    PanoramiXRes *refDraw, *newPix;
6836747b715Smrg    int result, j;
68435c4bbdfSmrg
68505b261ecSmrg    REQUEST(xCreatePixmapReq);
68605b261ecSmrg
68705b261ecSmrg    REQUEST_SIZE_MATCH(xCreatePixmapReq);
68805b261ecSmrg    client->errorValue = stuff->pid;
68905b261ecSmrg
69035c4bbdfSmrg    result = dixLookupResourceByClass((void **) &refDraw, stuff->drawable,
69135c4bbdfSmrg                                      XRC_DRAWABLE, client, DixReadAccess);
6926747b715Smrg    if (result != Success)
69335c4bbdfSmrg        return (result == BadValue) ? BadDrawable : result;
69405b261ecSmrg
69535c4bbdfSmrg    if (!(newPix = malloc(sizeof(PanoramiXRes))))
69635c4bbdfSmrg        return BadAlloc;
69705b261ecSmrg
69805b261ecSmrg    newPix->type = XRT_PIXMAP;
69905b261ecSmrg    newPix->u.pix.shared = FALSE;
70035c4bbdfSmrg    panoramix_setup_ids(newPix, client, stuff->pid);
70135c4bbdfSmrg
70205b261ecSmrg    FOR_NSCREENS_BACKWARD(j) {
70335c4bbdfSmrg        stuff->pid = newPix->info[j].id;
70435c4bbdfSmrg        stuff->drawable = refDraw->info[j].id;
70535c4bbdfSmrg        result = (*SavedProcVector[X_CreatePixmap]) (client);
70635c4bbdfSmrg        if (result != Success)
70735c4bbdfSmrg            break;
70805b261ecSmrg    }
70905b261ecSmrg
71005b261ecSmrg    if (result == Success)
71135c4bbdfSmrg        AddResource(newPix->info[0].id, XRT_PIXMAP, newPix);
71235c4bbdfSmrg    else
71335c4bbdfSmrg        free(newPix);
71405b261ecSmrg
7156747b715Smrg    return result;
71605b261ecSmrg}
71705b261ecSmrg
71835c4bbdfSmrgint
71935c4bbdfSmrgPanoramiXFreePixmap(ClientPtr client)
72005b261ecSmrg{
72105b261ecSmrg    PanoramiXRes *pix;
72235c4bbdfSmrg    int result, j;
72335c4bbdfSmrg
72405b261ecSmrg    REQUEST(xResourceReq);
72505b261ecSmrg
72605b261ecSmrg    REQUEST_SIZE_MATCH(xResourceReq);
72705b261ecSmrg
72805b261ecSmrg    client->errorValue = stuff->id;
72905b261ecSmrg
73035c4bbdfSmrg    result = dixLookupResourceByType((void **) &pix, stuff->id, XRT_PIXMAP,
73135c4bbdfSmrg                                     client, DixDestroyAccess);
7326747b715Smrg    if (result != Success)
73335c4bbdfSmrg        return result;
73405b261ecSmrg
73505b261ecSmrg    FOR_NSCREENS_BACKWARD(j) {
73635c4bbdfSmrg        stuff->id = pix->info[j].id;
73735c4bbdfSmrg        result = (*SavedProcVector[X_FreePixmap]) (client);
73835c4bbdfSmrg        if (result != Success)
73935c4bbdfSmrg            break;
74005b261ecSmrg    }
74105b261ecSmrg
74205b261ecSmrg    /* Since ProcFreePixmap is using FreeResource, it will free
74335c4bbdfSmrg       our resource for us on the last pass through the loop above */
74435c4bbdfSmrg
7456747b715Smrg    return result;
74605b261ecSmrg}
74705b261ecSmrg
74835c4bbdfSmrgint
74935c4bbdfSmrgPanoramiXCreateGC(ClientPtr client)
75005b261ecSmrg{
75105b261ecSmrg    PanoramiXRes *refDraw;
75205b261ecSmrg    PanoramiXRes *newGC;
75305b261ecSmrg    PanoramiXRes *stip = NULL;
75405b261ecSmrg    PanoramiXRes *tile = NULL;
75505b261ecSmrg    PanoramiXRes *clip = NULL;
75635c4bbdfSmrg
75705b261ecSmrg    REQUEST(xCreateGCReq);
75805b261ecSmrg    int tile_offset = 0, stip_offset = 0, clip_offset = 0;
7596747b715Smrg    int result, len, j;
76005b261ecSmrg    XID tmp;
76105b261ecSmrg
76205b261ecSmrg    REQUEST_AT_LEAST_SIZE(xCreateGCReq);
76335c4bbdfSmrg
76405b261ecSmrg    client->errorValue = stuff->gc;
7656747b715Smrg    len = client->req_len - bytes_to_int32(sizeof(xCreateGCReq));
76605b261ecSmrg    if (Ones(stuff->mask) != len)
76705b261ecSmrg        return BadLength;
76805b261ecSmrg
76935c4bbdfSmrg    result = dixLookupResourceByClass((void **) &refDraw, stuff->drawable,
77035c4bbdfSmrg                                      XRC_DRAWABLE, client, DixReadAccess);
77135c4bbdfSmrg    if (result != Success)
77235c4bbdfSmrg        return (result == BadValue) ? BadDrawable : result;
77335c4bbdfSmrg
77435c4bbdfSmrg    if ((Mask) stuff->mask & GCTile) {
77535c4bbdfSmrg        tile_offset = Ones((Mask) stuff->mask & (GCTile - 1));
77635c4bbdfSmrg        if ((tmp = *((CARD32 *) &stuff[1] + tile_offset))) {
77735c4bbdfSmrg            result = dixLookupResourceByType((void **) &tile, tmp, XRT_PIXMAP,
77835c4bbdfSmrg                                             client, DixReadAccess);
77935c4bbdfSmrg            if (result != Success)
78035c4bbdfSmrg                return result;
78135c4bbdfSmrg        }
78235c4bbdfSmrg    }
78335c4bbdfSmrg    if ((Mask) stuff->mask & GCStipple) {
78435c4bbdfSmrg        stip_offset = Ones((Mask) stuff->mask & (GCStipple - 1));
78535c4bbdfSmrg        if ((tmp = *((CARD32 *) &stuff[1] + stip_offset))) {
78635c4bbdfSmrg            result = dixLookupResourceByType((void **) &stip, tmp, XRT_PIXMAP,
78735c4bbdfSmrg                                             client, DixReadAccess);
78835c4bbdfSmrg            if (result != Success)
78935c4bbdfSmrg                return result;
79035c4bbdfSmrg        }
79135c4bbdfSmrg    }
79235c4bbdfSmrg    if ((Mask) stuff->mask & GCClipMask) {
79335c4bbdfSmrg        clip_offset = Ones((Mask) stuff->mask & (GCClipMask - 1));
79435c4bbdfSmrg        if ((tmp = *((CARD32 *) &stuff[1] + clip_offset))) {
79535c4bbdfSmrg            result = dixLookupResourceByType((void **) &clip, tmp, XRT_PIXMAP,
79635c4bbdfSmrg                                             client, DixReadAccess);
79735c4bbdfSmrg            if (result != Success)
79835c4bbdfSmrg                return result;
79935c4bbdfSmrg        }
80035c4bbdfSmrg    }
80135c4bbdfSmrg
80235c4bbdfSmrg    if (!(newGC = malloc(sizeof(PanoramiXRes))))
80305b261ecSmrg        return BadAlloc;
80405b261ecSmrg
80505b261ecSmrg    newGC->type = XRT_GC;
80635c4bbdfSmrg    panoramix_setup_ids(newGC, client, stuff->gc);
80705b261ecSmrg
80805b261ecSmrg    FOR_NSCREENS_BACKWARD(j) {
80905b261ecSmrg        stuff->gc = newGC->info[j].id;
81005b261ecSmrg        stuff->drawable = refDraw->info[j].id;
81135c4bbdfSmrg        if (tile)
81235c4bbdfSmrg            *((CARD32 *) &stuff[1] + tile_offset) = tile->info[j].id;
81335c4bbdfSmrg        if (stip)
81435c4bbdfSmrg            *((CARD32 *) &stuff[1] + stip_offset) = stip->info[j].id;
81535c4bbdfSmrg        if (clip)
81635c4bbdfSmrg            *((CARD32 *) &stuff[1] + clip_offset) = clip->info[j].id;
81735c4bbdfSmrg        result = (*SavedProcVector[X_CreateGC]) (client);
81835c4bbdfSmrg        if (result != Success)
81935c4bbdfSmrg            break;
82005b261ecSmrg    }
82105b261ecSmrg
82205b261ecSmrg    if (result == Success)
82305b261ecSmrg        AddResource(newGC->info[0].id, XRT_GC, newGC);
82435c4bbdfSmrg    else
8256747b715Smrg        free(newGC);
82605b261ecSmrg
8276747b715Smrg    return result;
82805b261ecSmrg}
82905b261ecSmrg
83035c4bbdfSmrgint
83135c4bbdfSmrgPanoramiXChangeGC(ClientPtr client)
83205b261ecSmrg{
83305b261ecSmrg    PanoramiXRes *gc;
83405b261ecSmrg    PanoramiXRes *stip = NULL;
83505b261ecSmrg    PanoramiXRes *tile = NULL;
83605b261ecSmrg    PanoramiXRes *clip = NULL;
83735c4bbdfSmrg
83805b261ecSmrg    REQUEST(xChangeGCReq);
83905b261ecSmrg    int tile_offset = 0, stip_offset = 0, clip_offset = 0;
8406747b715Smrg    int result, len, j;
84105b261ecSmrg    XID tmp;
84205b261ecSmrg
84305b261ecSmrg    REQUEST_AT_LEAST_SIZE(xChangeGCReq);
84435c4bbdfSmrg
8456747b715Smrg    len = client->req_len - bytes_to_int32(sizeof(xChangeGCReq));
84605b261ecSmrg    if (Ones(stuff->mask) != len)
84705b261ecSmrg        return BadLength;
84805b261ecSmrg
84935c4bbdfSmrg    result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC,
85035c4bbdfSmrg                                     client, DixReadAccess);
8516747b715Smrg    if (result != Success)
85235c4bbdfSmrg        return result;
85305b261ecSmrg
85435c4bbdfSmrg    if ((Mask) stuff->mask & GCTile) {
85535c4bbdfSmrg        tile_offset = Ones((Mask) stuff->mask & (GCTile - 1));
85635c4bbdfSmrg        if ((tmp = *((CARD32 *) &stuff[1] + tile_offset))) {
85735c4bbdfSmrg            result = dixLookupResourceByType((void **) &tile, tmp, XRT_PIXMAP,
85835c4bbdfSmrg                                             client, DixReadAccess);
85935c4bbdfSmrg            if (result != Success)
86035c4bbdfSmrg                return result;
86135c4bbdfSmrg        }
86205b261ecSmrg    }
86335c4bbdfSmrg    if ((Mask) stuff->mask & GCStipple) {
86435c4bbdfSmrg        stip_offset = Ones((Mask) stuff->mask & (GCStipple - 1));
86535c4bbdfSmrg        if ((tmp = *((CARD32 *) &stuff[1] + stip_offset))) {
86635c4bbdfSmrg            result = dixLookupResourceByType((void **) &stip, tmp, XRT_PIXMAP,
86735c4bbdfSmrg                                             client, DixReadAccess);
86835c4bbdfSmrg            if (result != Success)
86935c4bbdfSmrg                return result;
87035c4bbdfSmrg        }
87105b261ecSmrg    }
87235c4bbdfSmrg    if ((Mask) stuff->mask & GCClipMask) {
87335c4bbdfSmrg        clip_offset = Ones((Mask) stuff->mask & (GCClipMask - 1));
87435c4bbdfSmrg        if ((tmp = *((CARD32 *) &stuff[1] + clip_offset))) {
87535c4bbdfSmrg            result = dixLookupResourceByType((void **) &clip, tmp, XRT_PIXMAP,
87635c4bbdfSmrg                                             client, DixReadAccess);
87735c4bbdfSmrg            if (result != Success)
87835c4bbdfSmrg                return result;
87935c4bbdfSmrg        }
88005b261ecSmrg    }
88105b261ecSmrg
88205b261ecSmrg    FOR_NSCREENS_BACKWARD(j) {
88305b261ecSmrg        stuff->gc = gc->info[j].id;
88435c4bbdfSmrg        if (tile)
88535c4bbdfSmrg            *((CARD32 *) &stuff[1] + tile_offset) = tile->info[j].id;
88635c4bbdfSmrg        if (stip)
88735c4bbdfSmrg            *((CARD32 *) &stuff[1] + stip_offset) = stip->info[j].id;
88835c4bbdfSmrg        if (clip)
88935c4bbdfSmrg            *((CARD32 *) &stuff[1] + clip_offset) = clip->info[j].id;
89035c4bbdfSmrg        result = (*SavedProcVector[X_ChangeGC]) (client);
89135c4bbdfSmrg        if (result != Success)
89235c4bbdfSmrg            break;
89305b261ecSmrg    }
89405b261ecSmrg
8956747b715Smrg    return result;
89605b261ecSmrg}
89705b261ecSmrg
89835c4bbdfSmrgint
89935c4bbdfSmrgPanoramiXCopyGC(ClientPtr client)
90005b261ecSmrg{
90105b261ecSmrg    PanoramiXRes *srcGC, *dstGC;
90235c4bbdfSmrg    int result, j;
90335c4bbdfSmrg
90405b261ecSmrg    REQUEST(xCopyGCReq);
90505b261ecSmrg
90605b261ecSmrg    REQUEST_SIZE_MATCH(xCopyGCReq);
90705b261ecSmrg
90835c4bbdfSmrg    result = dixLookupResourceByType((void **) &srcGC, stuff->srcGC, XRT_GC,
90935c4bbdfSmrg                                     client, DixReadAccess);
9106747b715Smrg    if (result != Success)
91135c4bbdfSmrg        return result;
91205b261ecSmrg
91335c4bbdfSmrg    result = dixLookupResourceByType((void **) &dstGC, stuff->dstGC, XRT_GC,
91435c4bbdfSmrg                                     client, DixWriteAccess);
9156747b715Smrg    if (result != Success)
91635c4bbdfSmrg        return result;
91705b261ecSmrg
91805b261ecSmrg    FOR_NSCREENS(j) {
91935c4bbdfSmrg        stuff->srcGC = srcGC->info[j].id;
92035c4bbdfSmrg        stuff->dstGC = dstGC->info[j].id;
92135c4bbdfSmrg        result = (*SavedProcVector[X_CopyGC]) (client);
92235c4bbdfSmrg        if (result != Success)
92335c4bbdfSmrg            break;
92405b261ecSmrg    }
92505b261ecSmrg
9266747b715Smrg    return result;
92705b261ecSmrg}
92805b261ecSmrg
92935c4bbdfSmrgint
93035c4bbdfSmrgPanoramiXSetDashes(ClientPtr client)
93105b261ecSmrg{
93205b261ecSmrg    PanoramiXRes *gc;
93335c4bbdfSmrg    int result, j;
93435c4bbdfSmrg
93505b261ecSmrg    REQUEST(xSetDashesReq);
93605b261ecSmrg
93705b261ecSmrg    REQUEST_FIXED_SIZE(xSetDashesReq, stuff->nDashes);
93805b261ecSmrg
93935c4bbdfSmrg    result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC,
94035c4bbdfSmrg                                     client, DixWriteAccess);
9416747b715Smrg    if (result != Success)
94235c4bbdfSmrg        return result;
94305b261ecSmrg
94405b261ecSmrg    FOR_NSCREENS_BACKWARD(j) {
94535c4bbdfSmrg        stuff->gc = gc->info[j].id;
94635c4bbdfSmrg        result = (*SavedProcVector[X_SetDashes]) (client);
94735c4bbdfSmrg        if (result != Success)
94835c4bbdfSmrg            break;
94905b261ecSmrg    }
95005b261ecSmrg
9516747b715Smrg    return result;
95205b261ecSmrg}
95305b261ecSmrg
95435c4bbdfSmrgint
95535c4bbdfSmrgPanoramiXSetClipRectangles(ClientPtr client)
95605b261ecSmrg{
95705b261ecSmrg    PanoramiXRes *gc;
95835c4bbdfSmrg    int result, j;
95935c4bbdfSmrg
96005b261ecSmrg    REQUEST(xSetClipRectanglesReq);
96105b261ecSmrg
96205b261ecSmrg    REQUEST_AT_LEAST_SIZE(xSetClipRectanglesReq);
96305b261ecSmrg
96435c4bbdfSmrg    result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC,
96535c4bbdfSmrg                                     client, DixWriteAccess);
9666747b715Smrg    if (result != Success)
96735c4bbdfSmrg        return result;
96805b261ecSmrg
96905b261ecSmrg    FOR_NSCREENS_BACKWARD(j) {
97035c4bbdfSmrg        stuff->gc = gc->info[j].id;
97135c4bbdfSmrg        result = (*SavedProcVector[X_SetClipRectangles]) (client);
97235c4bbdfSmrg        if (result != Success)
97335c4bbdfSmrg            break;
97405b261ecSmrg    }
97505b261ecSmrg
9766747b715Smrg    return result;
97705b261ecSmrg}
97805b261ecSmrg
97935c4bbdfSmrgint
98035c4bbdfSmrgPanoramiXFreeGC(ClientPtr client)
98105b261ecSmrg{
98205b261ecSmrg    PanoramiXRes *gc;
98335c4bbdfSmrg    int result, j;
98435c4bbdfSmrg
98505b261ecSmrg    REQUEST(xResourceReq);
98605b261ecSmrg
98705b261ecSmrg    REQUEST_SIZE_MATCH(xResourceReq);
98805b261ecSmrg
98935c4bbdfSmrg    result = dixLookupResourceByType((void **) &gc, stuff->id, XRT_GC,
99035c4bbdfSmrg                                     client, DixDestroyAccess);
9916747b715Smrg    if (result != Success)
99235c4bbdfSmrg        return result;
99305b261ecSmrg
99405b261ecSmrg    FOR_NSCREENS_BACKWARD(j) {
99535c4bbdfSmrg        stuff->id = gc->info[j].id;
99635c4bbdfSmrg        result = (*SavedProcVector[X_FreeGC]) (client);
99735c4bbdfSmrg        if (result != Success)
99835c4bbdfSmrg            break;
99905b261ecSmrg    }
100005b261ecSmrg
100105b261ecSmrg    /* Since ProcFreeGC is using FreeResource, it will free
100235c4bbdfSmrg       our resource for us on the last pass through the loop above */
100335c4bbdfSmrg
10046747b715Smrg    return result;
100505b261ecSmrg}
100605b261ecSmrg
100735c4bbdfSmrgint
100835c4bbdfSmrgPanoramiXClearToBackground(ClientPtr client)
100905b261ecSmrg{
101005b261ecSmrg    PanoramiXRes *win;
101135c4bbdfSmrg    int result, j, x, y;
101235c4bbdfSmrg    Bool isRoot;
101335c4bbdfSmrg
101405b261ecSmrg    REQUEST(xClearAreaReq);
101505b261ecSmrg
101605b261ecSmrg    REQUEST_SIZE_MATCH(xClearAreaReq);
101705b261ecSmrg
101835c4bbdfSmrg    result = dixLookupResourceByType((void **) &win, stuff->window,
101935c4bbdfSmrg                                     XRT_WINDOW, client, DixWriteAccess);
10206747b715Smrg    if (result != Success)
102135c4bbdfSmrg        return result;
102205b261ecSmrg
102305b261ecSmrg    x = stuff->x;
102405b261ecSmrg    y = stuff->y;
102505b261ecSmrg    isRoot = win->u.win.root;
102605b261ecSmrg    FOR_NSCREENS_BACKWARD(j) {
102735c4bbdfSmrg        stuff->window = win->info[j].id;
102835c4bbdfSmrg        if (isRoot) {
102935c4bbdfSmrg            stuff->x = x - screenInfo.screens[j]->x;
103035c4bbdfSmrg            stuff->y = y - screenInfo.screens[j]->y;
103135c4bbdfSmrg        }
103235c4bbdfSmrg        result = (*SavedProcVector[X_ClearArea]) (client);
103335c4bbdfSmrg        if (result != Success)
103435c4bbdfSmrg            break;
103535c4bbdfSmrg    }
103635c4bbdfSmrg
10376747b715Smrg    return result;
103805b261ecSmrg}
103905b261ecSmrg
104035c4bbdfSmrg/*
104105b261ecSmrg    For Window to Pixmap copies you're screwed since each screen's
104205b261ecSmrg    pixmap will look like what it sees on its screen.  Unless the
104305b261ecSmrg    screens overlap and the window lies on each, the two copies
104405b261ecSmrg    will be out of sync.  To remedy this we do a GetImage and PutImage
104505b261ecSmrg    in place of the copy.  Doing this as a single Image isn't quite
104605b261ecSmrg    correct since it will include the obscured areas but we will
104705b261ecSmrg    have to fix this later. (MArk).
104805b261ecSmrg*/
104905b261ecSmrg
105035c4bbdfSmrgint
105135c4bbdfSmrgPanoramiXCopyArea(ClientPtr client)
105205b261ecSmrg{
10531b5d61b8Smrg    int j, result, srcx, srcy, dstx, dsty, width, height;
105435c4bbdfSmrg    PanoramiXRes *gc, *src, *dst;
105535c4bbdfSmrg    Bool srcIsRoot = FALSE;
105635c4bbdfSmrg    Bool dstIsRoot = FALSE;
105735c4bbdfSmrg    Bool srcShared, dstShared;
105835c4bbdfSmrg
105905b261ecSmrg    REQUEST(xCopyAreaReq);
106005b261ecSmrg
106105b261ecSmrg    REQUEST_SIZE_MATCH(xCopyAreaReq);
106205b261ecSmrg
106335c4bbdfSmrg    result = dixLookupResourceByClass((void **) &src, stuff->srcDrawable,
106435c4bbdfSmrg                                      XRC_DRAWABLE, client, DixReadAccess);
10656747b715Smrg    if (result != Success)
106635c4bbdfSmrg        return (result == BadValue) ? BadDrawable : result;
106705b261ecSmrg
106805b261ecSmrg    srcShared = IS_SHARED_PIXMAP(src);
106905b261ecSmrg
107035c4bbdfSmrg    result = dixLookupResourceByClass((void **) &dst, stuff->dstDrawable,
107135c4bbdfSmrg                                      XRC_DRAWABLE, client, DixWriteAccess);
10726747b715Smrg    if (result != Success)
107335c4bbdfSmrg        return (result == BadValue) ? BadDrawable : result;
107405b261ecSmrg
107505b261ecSmrg    dstShared = IS_SHARED_PIXMAP(dst);
107605b261ecSmrg
107735c4bbdfSmrg    if (dstShared && srcShared)
107835c4bbdfSmrg        return (*SavedProcVector[X_CopyArea]) (client);
107905b261ecSmrg
108035c4bbdfSmrg    result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC,
108135c4bbdfSmrg                                     client, DixReadAccess);
10826747b715Smrg    if (result != Success)
108335c4bbdfSmrg        return result;
108405b261ecSmrg
108535c4bbdfSmrg    if ((dst->type == XRT_WINDOW) && dst->u.win.root)
108635c4bbdfSmrg        dstIsRoot = TRUE;
108735c4bbdfSmrg    if ((src->type == XRT_WINDOW) && src->u.win.root)
108835c4bbdfSmrg        srcIsRoot = TRUE;
108935c4bbdfSmrg
109035c4bbdfSmrg    srcx = stuff->srcX;
109135c4bbdfSmrg    srcy = stuff->srcY;
109235c4bbdfSmrg    dstx = stuff->dstX;
109335c4bbdfSmrg    dsty = stuff->dstY;
10941b5d61b8Smrg    width = stuff->width;
10951b5d61b8Smrg    height = stuff->height;
109635c4bbdfSmrg    if ((dst->type == XRT_PIXMAP) && (src->type == XRT_WINDOW)) {
109735c4bbdfSmrg        DrawablePtr drawables[MAXSCREENS];
109835c4bbdfSmrg        DrawablePtr pDst;
109935c4bbdfSmrg        GCPtr pGC;
110005b261ecSmrg        char *data;
110135c4bbdfSmrg        int pitch, rc;
110235c4bbdfSmrg
110335c4bbdfSmrg        FOR_NSCREENS(j) {
110435c4bbdfSmrg            rc = dixLookupDrawable(drawables + j, src->info[j].id, client, 0,
110535c4bbdfSmrg                                   DixGetAttrAccess);
110635c4bbdfSmrg            if (rc != Success)
110735c4bbdfSmrg                return rc;
110835c4bbdfSmrg        }
110935c4bbdfSmrg
11101b5d61b8Smrg        pitch = PixmapBytePad(width, drawables[0]->depth);
11111b5d61b8Smrg        if (!(data = calloc(height, pitch)))
111235c4bbdfSmrg            return BadAlloc;
111335c4bbdfSmrg
11141b5d61b8Smrg        XineramaGetImageData(drawables, srcx, srcy, width, height, ZPixmap, ~0,
11151b5d61b8Smrg                             data, pitch, srcIsRoot);
111635c4bbdfSmrg
111735c4bbdfSmrg        FOR_NSCREENS_BACKWARD(j) {
111835c4bbdfSmrg            stuff->gc = gc->info[j].id;
111935c4bbdfSmrg            VALIDATE_DRAWABLE_AND_GC(dst->info[j].id, pDst, DixWriteAccess);
112035c4bbdfSmrg            if (drawables[0]->depth != pDst->depth) {
112135c4bbdfSmrg                client->errorValue = stuff->dstDrawable;
112235c4bbdfSmrg                free(data);
112335c4bbdfSmrg                return BadMatch;
112435c4bbdfSmrg            }
112535c4bbdfSmrg
112635c4bbdfSmrg            (*pGC->ops->PutImage) (pDst, pGC, pDst->depth, dstx, dsty,
11271b5d61b8Smrg                                   width, height, 0, ZPixmap, data);
112835c4bbdfSmrg            if (dstShared)
112935c4bbdfSmrg                break;
113035c4bbdfSmrg        }
113135c4bbdfSmrg        free(data);
11321b5d61b8Smrg
11331b5d61b8Smrg        if (pGC->graphicsExposures) {
11341b5d61b8Smrg            RegionRec rgn;
11351b5d61b8Smrg            int dx, dy;
11361b5d61b8Smrg            BoxRec sourceBox;
11371b5d61b8Smrg
11381b5d61b8Smrg            dx = drawables[0]->x;
11391b5d61b8Smrg            dy = drawables[0]->y;
11401b5d61b8Smrg            if (srcIsRoot) {
11411b5d61b8Smrg                dx += screenInfo.screens[0]->x;
11421b5d61b8Smrg                dy += screenInfo.screens[0]->y;
11431b5d61b8Smrg            }
11441b5d61b8Smrg
11451b5d61b8Smrg            sourceBox.x1 = min(srcx + dx, 0);
11461b5d61b8Smrg            sourceBox.y1 = min(srcy + dy, 0);
11471b5d61b8Smrg            sourceBox.x2 = max(sourceBox.x1 + width, 32767);
11481b5d61b8Smrg            sourceBox.y2 = max(sourceBox.y1 + height, 32767);
11491b5d61b8Smrg
11501b5d61b8Smrg            RegionInit(&rgn, &sourceBox, 1);
11511b5d61b8Smrg
11521b5d61b8Smrg            /* subtract the (screen-space) clips of the source drawables */
11531b5d61b8Smrg            FOR_NSCREENS(j) {
11541b5d61b8Smrg                ScreenPtr screen = screenInfo.screens[j];
11551b5d61b8Smrg                RegionPtr sd;
11561b5d61b8Smrg
11571b5d61b8Smrg                if (pGC->subWindowMode == IncludeInferiors)
11581b5d61b8Smrg                    sd = NotClippedByChildren((WindowPtr)drawables[j]);
11591b5d61b8Smrg                else
11601b5d61b8Smrg                    sd = &((WindowPtr)drawables[j])->clipList;
11611b5d61b8Smrg
11621b5d61b8Smrg                if (srcIsRoot)
11631b5d61b8Smrg                    RegionTranslate(&rgn, -screen->x, -screen->y);
11641b5d61b8Smrg
11651b5d61b8Smrg                RegionSubtract(&rgn, &rgn, sd);
11661b5d61b8Smrg
11671b5d61b8Smrg                if (srcIsRoot)
11681b5d61b8Smrg                    RegionTranslate(&rgn, screen->x, screen->y);
11691b5d61b8Smrg
11701b5d61b8Smrg                if (pGC->subWindowMode == IncludeInferiors)
11711b5d61b8Smrg                    RegionDestroy(sd);
11721b5d61b8Smrg            }
11731b5d61b8Smrg
11741b5d61b8Smrg            /* -dx/-dy to get back to dest-relative, plus request offsets */
11751b5d61b8Smrg            RegionTranslate(&rgn, -dx + dstx, -dy + dsty);
11761b5d61b8Smrg
11771b5d61b8Smrg            /* intersect with gc clip; just one screen is fine because pixmap */
11781b5d61b8Smrg            RegionIntersect(&rgn, &rgn, pGC->pCompositeClip);
11791b5d61b8Smrg
11801b5d61b8Smrg            /* and expose */
11811b5d61b8Smrg            SendGraphicsExpose(client, &rgn, dst->info[0].id, X_CopyArea, 0);
11821b5d61b8Smrg            RegionUninit(&rgn);
11831b5d61b8Smrg        }
118435c4bbdfSmrg    }
118535c4bbdfSmrg    else {
118635c4bbdfSmrg        DrawablePtr pDst = NULL, pSrc = NULL;
118735c4bbdfSmrg        GCPtr pGC = NULL;
118835c4bbdfSmrg        RegionRec totalReg;
118935c4bbdfSmrg        int rc;
119035c4bbdfSmrg
119135c4bbdfSmrg        RegionNull(&totalReg);
119235c4bbdfSmrg        FOR_NSCREENS_BACKWARD(j) {
119335c4bbdfSmrg            RegionPtr pRgn;
119435c4bbdfSmrg
119535c4bbdfSmrg            stuff->dstDrawable = dst->info[j].id;
119635c4bbdfSmrg            stuff->srcDrawable = src->info[j].id;
119735c4bbdfSmrg            stuff->gc = gc->info[j].id;
119835c4bbdfSmrg            if (srcIsRoot) {
119935c4bbdfSmrg                stuff->srcX = srcx - screenInfo.screens[j]->x;
120035c4bbdfSmrg                stuff->srcY = srcy - screenInfo.screens[j]->y;
120135c4bbdfSmrg            }
120235c4bbdfSmrg            if (dstIsRoot) {
120335c4bbdfSmrg                stuff->dstX = dstx - screenInfo.screens[j]->x;
120435c4bbdfSmrg                stuff->dstY = dsty - screenInfo.screens[j]->y;
120535c4bbdfSmrg            }
120635c4bbdfSmrg
120735c4bbdfSmrg            VALIDATE_DRAWABLE_AND_GC(stuff->dstDrawable, pDst, DixWriteAccess);
120835c4bbdfSmrg
120935c4bbdfSmrg            if (stuff->dstDrawable != stuff->srcDrawable) {
121035c4bbdfSmrg                rc = dixLookupDrawable(&pSrc, stuff->srcDrawable, client, 0,
121135c4bbdfSmrg                                       DixReadAccess);
121235c4bbdfSmrg                if (rc != Success)
121335c4bbdfSmrg                    return rc;
121435c4bbdfSmrg
121535c4bbdfSmrg                if ((pDst->pScreen != pSrc->pScreen) ||
121635c4bbdfSmrg                    (pDst->depth != pSrc->depth)) {
121735c4bbdfSmrg                    client->errorValue = stuff->dstDrawable;
121835c4bbdfSmrg                    return BadMatch;
121935c4bbdfSmrg                }
122035c4bbdfSmrg            }
122135c4bbdfSmrg            else
122235c4bbdfSmrg                pSrc = pDst;
122335c4bbdfSmrg
122435c4bbdfSmrg            pRgn = (*pGC->ops->CopyArea) (pSrc, pDst, pGC,
122535c4bbdfSmrg                                          stuff->srcX, stuff->srcY,
122635c4bbdfSmrg                                          stuff->width, stuff->height,
122735c4bbdfSmrg                                          stuff->dstX, stuff->dstY);
122835c4bbdfSmrg            if (pGC->graphicsExposures && pRgn) {
122935c4bbdfSmrg                if (srcIsRoot) {
123035c4bbdfSmrg                    RegionTranslate(pRgn,
123135c4bbdfSmrg                                    screenInfo.screens[j]->x,
123235c4bbdfSmrg                                    screenInfo.screens[j]->y);
123335c4bbdfSmrg                }
123435c4bbdfSmrg                RegionAppend(&totalReg, pRgn);
123535c4bbdfSmrg                RegionDestroy(pRgn);
123635c4bbdfSmrg            }
123735c4bbdfSmrg
123835c4bbdfSmrg            if (dstShared)
123935c4bbdfSmrg                break;
124035c4bbdfSmrg        }
124135c4bbdfSmrg
124235c4bbdfSmrg        if (pGC->graphicsExposures) {
124335c4bbdfSmrg            Bool overlap;
124435c4bbdfSmrg
124535c4bbdfSmrg            RegionValidate(&totalReg, &overlap);
124635c4bbdfSmrg            SendGraphicsExpose(client, &totalReg, stuff->dstDrawable,
124735c4bbdfSmrg                               X_CopyArea, 0);
124835c4bbdfSmrg            RegionUninit(&totalReg);
124935c4bbdfSmrg        }
125005b261ecSmrg    }
125105b261ecSmrg
12526747b715Smrg    return Success;
125305b261ecSmrg}
125405b261ecSmrg
125535c4bbdfSmrgint
125635c4bbdfSmrgPanoramiXCopyPlane(ClientPtr client)
125705b261ecSmrg{
125835c4bbdfSmrg    int j, srcx, srcy, dstx, dsty, rc;
125935c4bbdfSmrg    PanoramiXRes *gc, *src, *dst;
126035c4bbdfSmrg    Bool srcIsRoot = FALSE;
126135c4bbdfSmrg    Bool dstIsRoot = FALSE;
126235c4bbdfSmrg    Bool srcShared, dstShared;
126335c4bbdfSmrg    DrawablePtr psrcDraw, pdstDraw = NULL;
126435c4bbdfSmrg    GCPtr pGC = NULL;
126535c4bbdfSmrg    RegionRec totalReg;
126635c4bbdfSmrg
126705b261ecSmrg    REQUEST(xCopyPlaneReq);
126805b261ecSmrg
126905b261ecSmrg    REQUEST_SIZE_MATCH(xCopyPlaneReq);
127005b261ecSmrg
127135c4bbdfSmrg    rc = dixLookupResourceByClass((void **) &src, stuff->srcDrawable,
127235c4bbdfSmrg                                  XRC_DRAWABLE, client, DixReadAccess);
12736747b715Smrg    if (rc != Success)
127435c4bbdfSmrg        return (rc == BadValue) ? BadDrawable : rc;
127505b261ecSmrg
127605b261ecSmrg    srcShared = IS_SHARED_PIXMAP(src);
127705b261ecSmrg
127835c4bbdfSmrg    rc = dixLookupResourceByClass((void **) &dst, stuff->dstDrawable,
127935c4bbdfSmrg                                  XRC_DRAWABLE, client, DixWriteAccess);
12806747b715Smrg    if (rc != Success)
128135c4bbdfSmrg        return (rc == BadValue) ? BadDrawable : rc;
128205b261ecSmrg
128305b261ecSmrg    dstShared = IS_SHARED_PIXMAP(dst);
128405b261ecSmrg
128535c4bbdfSmrg    if (dstShared && srcShared)
128635c4bbdfSmrg        return (*SavedProcVector[X_CopyPlane]) (client);
128705b261ecSmrg
128835c4bbdfSmrg    rc = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC,
128935c4bbdfSmrg                                 client, DixReadAccess);
12906747b715Smrg    if (rc != Success)
129135c4bbdfSmrg        return rc;
129235c4bbdfSmrg
129335c4bbdfSmrg    if ((dst->type == XRT_WINDOW) && dst->u.win.root)
129435c4bbdfSmrg        dstIsRoot = TRUE;
129535c4bbdfSmrg    if ((src->type == XRT_WINDOW) && src->u.win.root)
129635c4bbdfSmrg        srcIsRoot = TRUE;
129705b261ecSmrg
129835c4bbdfSmrg    srcx = stuff->srcX;
129935c4bbdfSmrg    srcy = stuff->srcY;
130035c4bbdfSmrg    dstx = stuff->dstX;
130135c4bbdfSmrg    dsty = stuff->dstY;
130205b261ecSmrg
13036747b715Smrg    RegionNull(&totalReg);
130405b261ecSmrg    FOR_NSCREENS_BACKWARD(j) {
130535c4bbdfSmrg        RegionPtr pRgn;
130635c4bbdfSmrg
130735c4bbdfSmrg        stuff->dstDrawable = dst->info[j].id;
130835c4bbdfSmrg        stuff->srcDrawable = src->info[j].id;
130935c4bbdfSmrg        stuff->gc = gc->info[j].id;
131035c4bbdfSmrg        if (srcIsRoot) {
131135c4bbdfSmrg            stuff->srcX = srcx - screenInfo.screens[j]->x;
131235c4bbdfSmrg            stuff->srcY = srcy - screenInfo.screens[j]->y;
131335c4bbdfSmrg        }
131435c4bbdfSmrg        if (dstIsRoot) {
131535c4bbdfSmrg            stuff->dstX = dstx - screenInfo.screens[j]->x;
131635c4bbdfSmrg            stuff->dstY = dsty - screenInfo.screens[j]->y;
131735c4bbdfSmrg        }
131835c4bbdfSmrg
131935c4bbdfSmrg        VALIDATE_DRAWABLE_AND_GC(stuff->dstDrawable, pdstDraw, DixWriteAccess);
132035c4bbdfSmrg        if (stuff->dstDrawable != stuff->srcDrawable) {
132135c4bbdfSmrg            rc = dixLookupDrawable(&psrcDraw, stuff->srcDrawable, client, 0,
132235c4bbdfSmrg                                   DixReadAccess);
132335c4bbdfSmrg            if (rc != Success)
132435c4bbdfSmrg                return rc;
132505b261ecSmrg
132605b261ecSmrg            if (pdstDraw->pScreen != psrcDraw->pScreen) {
132735c4bbdfSmrg                client->errorValue = stuff->dstDrawable;
132835c4bbdfSmrg                return BadMatch;
132935c4bbdfSmrg            }
133035c4bbdfSmrg        }
133135c4bbdfSmrg        else
133235c4bbdfSmrg            psrcDraw = pdstDraw;
133335c4bbdfSmrg
133435c4bbdfSmrg        if (stuff->bitPlane == 0 || (stuff->bitPlane & (stuff->bitPlane - 1)) ||
133535c4bbdfSmrg            (stuff->bitPlane > (1L << (psrcDraw->depth - 1)))) {
133635c4bbdfSmrg            client->errorValue = stuff->bitPlane;
133735c4bbdfSmrg            return BadValue;
133835c4bbdfSmrg        }
133935c4bbdfSmrg
134035c4bbdfSmrg        pRgn = (*pGC->ops->CopyPlane) (psrcDraw, pdstDraw, pGC,
134135c4bbdfSmrg                                       stuff->srcX, stuff->srcY,
134235c4bbdfSmrg                                       stuff->width, stuff->height,
134335c4bbdfSmrg                                       stuff->dstX, stuff->dstY,
134435c4bbdfSmrg                                       stuff->bitPlane);
134535c4bbdfSmrg        if (pGC->graphicsExposures && pRgn) {
134635c4bbdfSmrg            RegionAppend(&totalReg, pRgn);
134735c4bbdfSmrg            RegionDestroy(pRgn);
134835c4bbdfSmrg        }
134935c4bbdfSmrg
135035c4bbdfSmrg        if (dstShared)
135135c4bbdfSmrg            break;
135235c4bbdfSmrg    }
135335c4bbdfSmrg
135435c4bbdfSmrg    if (pGC->graphicsExposures) {
135535c4bbdfSmrg        Bool overlap;
135635c4bbdfSmrg
135735c4bbdfSmrg        RegionValidate(&totalReg, &overlap);
135835c4bbdfSmrg        SendGraphicsExpose(client, &totalReg, stuff->dstDrawable,
135935c4bbdfSmrg                           X_CopyPlane, 0);
136035c4bbdfSmrg        RegionUninit(&totalReg);
136105b261ecSmrg    }
136205b261ecSmrg
13636747b715Smrg    return Success;
136405b261ecSmrg}
136505b261ecSmrg
136635c4bbdfSmrgint
136735c4bbdfSmrgPanoramiXPolyPoint(ClientPtr client)
136805b261ecSmrg{
136905b261ecSmrg    PanoramiXRes *gc, *draw;
137035c4bbdfSmrg    int result, npoint, j;
137135c4bbdfSmrg    xPoint *origPts;
137235c4bbdfSmrg    Bool isRoot;
137335c4bbdfSmrg
137405b261ecSmrg    REQUEST(xPolyPointReq);
137505b261ecSmrg
137605b261ecSmrg    REQUEST_AT_LEAST_SIZE(xPolyPointReq);
137705b261ecSmrg
137835c4bbdfSmrg    result = dixLookupResourceByClass((void **) &draw, stuff->drawable,
137935c4bbdfSmrg                                      XRC_DRAWABLE, client, DixWriteAccess);
13806747b715Smrg    if (result != Success)
138135c4bbdfSmrg        return (result == BadValue) ? BadDrawable : result;
138205b261ecSmrg
138335c4bbdfSmrg    if (IS_SHARED_PIXMAP(draw))
138435c4bbdfSmrg        return (*SavedProcVector[X_PolyPoint]) (client);
138505b261ecSmrg
138635c4bbdfSmrg    result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC,
138735c4bbdfSmrg                                     client, DixReadAccess);
13886747b715Smrg    if (result != Success)
138935c4bbdfSmrg        return result;
139005b261ecSmrg
139105b261ecSmrg    isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
13926747b715Smrg    npoint = bytes_to_int32((client->req_len << 2) - sizeof(xPolyPointReq));
139305b261ecSmrg    if (npoint > 0) {
139435c4bbdfSmrg        origPts = xallocarray(npoint, sizeof(xPoint));
139505b261ecSmrg        memcpy((char *) origPts, (char *) &stuff[1], npoint * sizeof(xPoint));
139635c4bbdfSmrg        FOR_NSCREENS_FORWARD(j) {
139705b261ecSmrg
139835c4bbdfSmrg            if (j)
139935c4bbdfSmrg                memcpy(&stuff[1], origPts, npoint * sizeof(xPoint));
140005b261ecSmrg
140105b261ecSmrg            if (isRoot) {
14026747b715Smrg                int x_off = screenInfo.screens[j]->x;
14036747b715Smrg                int y_off = screenInfo.screens[j]->y;
140405b261ecSmrg
140535c4bbdfSmrg                if (x_off || y_off) {
140635c4bbdfSmrg                    xPoint *pnts = (xPoint *) &stuff[1];
140735c4bbdfSmrg                    int i =
140835c4bbdfSmrg                        (stuff->coordMode == CoordModePrevious) ? 1 : npoint;
140905b261ecSmrg
141035c4bbdfSmrg                    while (i--) {
141135c4bbdfSmrg                        pnts->x -= x_off;
141235c4bbdfSmrg                        pnts->y -= y_off;
141335c4bbdfSmrg                        pnts++;
141405b261ecSmrg                    }
141535c4bbdfSmrg                }
141605b261ecSmrg            }
141705b261ecSmrg
141835c4bbdfSmrg            stuff->drawable = draw->info[j].id;
141935c4bbdfSmrg            stuff->gc = gc->info[j].id;
142035c4bbdfSmrg            result = (*SavedProcVector[X_PolyPoint]) (client);
142135c4bbdfSmrg            if (result != Success)
142235c4bbdfSmrg                break;
142305b261ecSmrg        }
14246747b715Smrg        free(origPts);
14256747b715Smrg        return result;
142635c4bbdfSmrg    }
142735c4bbdfSmrg    else
142835c4bbdfSmrg        return Success;
142905b261ecSmrg}
143005b261ecSmrg
143135c4bbdfSmrgint
143235c4bbdfSmrgPanoramiXPolyLine(ClientPtr client)
143305b261ecSmrg{
143405b261ecSmrg    PanoramiXRes *gc, *draw;
143535c4bbdfSmrg    int result, npoint, j;
143635c4bbdfSmrg    xPoint *origPts;
143735c4bbdfSmrg    Bool isRoot;
143835c4bbdfSmrg
143905b261ecSmrg    REQUEST(xPolyLineReq);
144005b261ecSmrg
144105b261ecSmrg    REQUEST_AT_LEAST_SIZE(xPolyLineReq);
144205b261ecSmrg
144335c4bbdfSmrg    result = dixLookupResourceByClass((void **) &draw, stuff->drawable,
144435c4bbdfSmrg                                      XRC_DRAWABLE, client, DixWriteAccess);
14456747b715Smrg    if (result != Success)
144635c4bbdfSmrg        return (result == BadValue) ? BadDrawable : result;
144705b261ecSmrg
144835c4bbdfSmrg    if (IS_SHARED_PIXMAP(draw))
144935c4bbdfSmrg        return (*SavedProcVector[X_PolyLine]) (client);
145005b261ecSmrg
145135c4bbdfSmrg    result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC,
145235c4bbdfSmrg                                     client, DixReadAccess);
14536747b715Smrg    if (result != Success)
145435c4bbdfSmrg        return result;
145505b261ecSmrg
145635c4bbdfSmrg    isRoot = IS_ROOT_DRAWABLE(draw);
14576747b715Smrg    npoint = bytes_to_int32((client->req_len << 2) - sizeof(xPolyLineReq));
145835c4bbdfSmrg    if (npoint > 0) {
145935c4bbdfSmrg        origPts = xallocarray(npoint, sizeof(xPoint));
146005b261ecSmrg        memcpy((char *) origPts, (char *) &stuff[1], npoint * sizeof(xPoint));
146135c4bbdfSmrg        FOR_NSCREENS_FORWARD(j) {
146205b261ecSmrg
146335c4bbdfSmrg            if (j)
146435c4bbdfSmrg                memcpy(&stuff[1], origPts, npoint * sizeof(xPoint));
146505b261ecSmrg
146605b261ecSmrg            if (isRoot) {
14676747b715Smrg                int x_off = screenInfo.screens[j]->x;
14686747b715Smrg                int y_off = screenInfo.screens[j]->y;
146905b261ecSmrg
147035c4bbdfSmrg                if (x_off || y_off) {
147135c4bbdfSmrg                    xPoint *pnts = (xPoint *) &stuff[1];
147235c4bbdfSmrg                    int i =
147335c4bbdfSmrg                        (stuff->coordMode == CoordModePrevious) ? 1 : npoint;
147405b261ecSmrg
147535c4bbdfSmrg                    while (i--) {
147635c4bbdfSmrg                        pnts->x -= x_off;
147735c4bbdfSmrg                        pnts->y -= y_off;
147835c4bbdfSmrg                        pnts++;
147935c4bbdfSmrg                    }
148035c4bbdfSmrg                }
148105b261ecSmrg            }
148205b261ecSmrg
148335c4bbdfSmrg            stuff->drawable = draw->info[j].id;
148435c4bbdfSmrg            stuff->gc = gc->info[j].id;
148535c4bbdfSmrg            result = (*SavedProcVector[X_PolyLine]) (client);
148635c4bbdfSmrg            if (result != Success)
148735c4bbdfSmrg                break;
148805b261ecSmrg        }
14896747b715Smrg        free(origPts);
14906747b715Smrg        return result;
149135c4bbdfSmrg    }
149235c4bbdfSmrg    else
149335c4bbdfSmrg        return Success;
149405b261ecSmrg}
149505b261ecSmrg
149635c4bbdfSmrgint
149735c4bbdfSmrgPanoramiXPolySegment(ClientPtr client)
149805b261ecSmrg{
149935c4bbdfSmrg    int result, nsegs, i, j;
150005b261ecSmrg    PanoramiXRes *gc, *draw;
150135c4bbdfSmrg    xSegment *origSegs;
150235c4bbdfSmrg    Bool isRoot;
150335c4bbdfSmrg
150405b261ecSmrg    REQUEST(xPolySegmentReq);
150505b261ecSmrg
150605b261ecSmrg    REQUEST_AT_LEAST_SIZE(xPolySegmentReq);
150705b261ecSmrg
150835c4bbdfSmrg    result = dixLookupResourceByClass((void **) &draw, stuff->drawable,
150935c4bbdfSmrg                                      XRC_DRAWABLE, client, DixWriteAccess);
15106747b715Smrg    if (result != Success)
151135c4bbdfSmrg        return (result == BadValue) ? BadDrawable : result;
151205b261ecSmrg
151335c4bbdfSmrg    if (IS_SHARED_PIXMAP(draw))
151435c4bbdfSmrg        return (*SavedProcVector[X_PolySegment]) (client);
151505b261ecSmrg
151635c4bbdfSmrg    result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC,
151735c4bbdfSmrg                                     client, DixReadAccess);
15186747b715Smrg    if (result != Success)
151935c4bbdfSmrg        return result;
152005b261ecSmrg
152135c4bbdfSmrg    isRoot = IS_ROOT_DRAWABLE(draw);
152205b261ecSmrg
152305b261ecSmrg    nsegs = (client->req_len << 2) - sizeof(xPolySegmentReq);
152435c4bbdfSmrg    if (nsegs & 4)
152535c4bbdfSmrg        return BadLength;
152605b261ecSmrg    nsegs >>= 3;
152705b261ecSmrg    if (nsegs > 0) {
152835c4bbdfSmrg        origSegs = xallocarray(nsegs, sizeof(xSegment));
152905b261ecSmrg        memcpy((char *) origSegs, (char *) &stuff[1], nsegs * sizeof(xSegment));
153035c4bbdfSmrg        FOR_NSCREENS_FORWARD(j) {
153105b261ecSmrg
153235c4bbdfSmrg            if (j)
153335c4bbdfSmrg                memcpy(&stuff[1], origSegs, nsegs * sizeof(xSegment));
153405b261ecSmrg
153505b261ecSmrg            if (isRoot) {
15366747b715Smrg                int x_off = screenInfo.screens[j]->x;
15376747b715Smrg                int y_off = screenInfo.screens[j]->y;
153805b261ecSmrg
153935c4bbdfSmrg                if (x_off || y_off) {
154035c4bbdfSmrg                    xSegment *segs = (xSegment *) &stuff[1];
154105b261ecSmrg
154235c4bbdfSmrg                    for (i = nsegs; i--; segs++) {
154335c4bbdfSmrg                        segs->x1 -= x_off;
154435c4bbdfSmrg                        segs->x2 -= x_off;
154535c4bbdfSmrg                        segs->y1 -= y_off;
154635c4bbdfSmrg                        segs->y2 -= y_off;
154735c4bbdfSmrg                    }
154835c4bbdfSmrg                }
154905b261ecSmrg            }
155005b261ecSmrg
155135c4bbdfSmrg            stuff->drawable = draw->info[j].id;
155235c4bbdfSmrg            stuff->gc = gc->info[j].id;
155335c4bbdfSmrg            result = (*SavedProcVector[X_PolySegment]) (client);
155435c4bbdfSmrg            if (result != Success)
155535c4bbdfSmrg                break;
155635c4bbdfSmrg        }
155735c4bbdfSmrg        free(origSegs);
155835c4bbdfSmrg        return result;
155935c4bbdfSmrg    }
156035c4bbdfSmrg    else
156135c4bbdfSmrg        return Success;
156205b261ecSmrg}
156305b261ecSmrg
156435c4bbdfSmrgint
156535c4bbdfSmrgPanoramiXPolyRectangle(ClientPtr client)
156605b261ecSmrg{
156735c4bbdfSmrg    int result, nrects, i, j;
156805b261ecSmrg    PanoramiXRes *gc, *draw;
156935c4bbdfSmrg    Bool isRoot;
157035c4bbdfSmrg    xRectangle *origRecs;
157135c4bbdfSmrg
157205b261ecSmrg    REQUEST(xPolyRectangleReq);
157305b261ecSmrg
157405b261ecSmrg    REQUEST_AT_LEAST_SIZE(xPolyRectangleReq);
157505b261ecSmrg
157635c4bbdfSmrg    result = dixLookupResourceByClass((void **) &draw, stuff->drawable,
157735c4bbdfSmrg                                      XRC_DRAWABLE, client, DixWriteAccess);
15786747b715Smrg    if (result != Success)
157935c4bbdfSmrg        return (result == BadValue) ? BadDrawable : result;
158005b261ecSmrg
158135c4bbdfSmrg    if (IS_SHARED_PIXMAP(draw))
158235c4bbdfSmrg        return (*SavedProcVector[X_PolyRectangle]) (client);
158305b261ecSmrg
158435c4bbdfSmrg    result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC,
158535c4bbdfSmrg                                     client, DixReadAccess);
15866747b715Smrg    if (result != Success)
158735c4bbdfSmrg        return result;
158805b261ecSmrg
158935c4bbdfSmrg    isRoot = IS_ROOT_DRAWABLE(draw);
159005b261ecSmrg
159105b261ecSmrg    nrects = (client->req_len << 2) - sizeof(xPolyRectangleReq);
159235c4bbdfSmrg    if (nrects & 4)
159335c4bbdfSmrg        return BadLength;
159405b261ecSmrg    nrects >>= 3;
159535c4bbdfSmrg    if (nrects > 0) {
159635c4bbdfSmrg        origRecs = xallocarray(nrects, sizeof(xRectangle));
159735c4bbdfSmrg        memcpy((char *) origRecs, (char *) &stuff[1],
159835c4bbdfSmrg               nrects * sizeof(xRectangle));
159935c4bbdfSmrg        FOR_NSCREENS_FORWARD(j) {
160035c4bbdfSmrg
160135c4bbdfSmrg            if (j)
160235c4bbdfSmrg                memcpy(&stuff[1], origRecs, nrects * sizeof(xRectangle));
160305b261ecSmrg
160435c4bbdfSmrg            if (isRoot) {
160535c4bbdfSmrg                int x_off = screenInfo.screens[j]->x;
160635c4bbdfSmrg                int y_off = screenInfo.screens[j]->y;
160705b261ecSmrg
160835c4bbdfSmrg                if (x_off || y_off) {
160935c4bbdfSmrg                    xRectangle *rects = (xRectangle *) &stuff[1];
161035c4bbdfSmrg
161135c4bbdfSmrg                    for (i = nrects; i--; rects++) {
161235c4bbdfSmrg                        rects->x -= x_off;
161335c4bbdfSmrg                        rects->y -= y_off;
161435c4bbdfSmrg                    }
161535c4bbdfSmrg                }
161635c4bbdfSmrg            }
161735c4bbdfSmrg
161835c4bbdfSmrg            stuff->drawable = draw->info[j].id;
161935c4bbdfSmrg            stuff->gc = gc->info[j].id;
162035c4bbdfSmrg            result = (*SavedProcVector[X_PolyRectangle]) (client);
162135c4bbdfSmrg            if (result != Success)
162235c4bbdfSmrg                break;
162335c4bbdfSmrg        }
162435c4bbdfSmrg        free(origRecs);
162535c4bbdfSmrg        return result;
162635c4bbdfSmrg    }
162735c4bbdfSmrg    else
162835c4bbdfSmrg        return Success;
162935c4bbdfSmrg}
163035c4bbdfSmrg
163135c4bbdfSmrgint
163235c4bbdfSmrgPanoramiXPolyArc(ClientPtr client)
163305b261ecSmrg{
163435c4bbdfSmrg    int result, narcs, i, j;
163505b261ecSmrg    PanoramiXRes *gc, *draw;
163635c4bbdfSmrg    Bool isRoot;
163735c4bbdfSmrg    xArc *origArcs;
163835c4bbdfSmrg
163905b261ecSmrg    REQUEST(xPolyArcReq);
164005b261ecSmrg
164105b261ecSmrg    REQUEST_AT_LEAST_SIZE(xPolyArcReq);
164205b261ecSmrg
164335c4bbdfSmrg    result = dixLookupResourceByClass((void **) &draw, stuff->drawable,
164435c4bbdfSmrg                                      XRC_DRAWABLE, client, DixWriteAccess);
16456747b715Smrg    if (result != Success)
164635c4bbdfSmrg        return (result == BadValue) ? BadDrawable : result;
164705b261ecSmrg
164835c4bbdfSmrg    if (IS_SHARED_PIXMAP(draw))
164935c4bbdfSmrg        return (*SavedProcVector[X_PolyArc]) (client);
165005b261ecSmrg
165135c4bbdfSmrg    result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC,
165235c4bbdfSmrg                                     client, DixReadAccess);
16536747b715Smrg    if (result != Success)
165435c4bbdfSmrg        return result;
165505b261ecSmrg
165635c4bbdfSmrg    isRoot = IS_ROOT_DRAWABLE(draw);
165705b261ecSmrg
165805b261ecSmrg    narcs = (client->req_len << 2) - sizeof(xPolyArcReq);
165935c4bbdfSmrg    if (narcs % sizeof(xArc))
166035c4bbdfSmrg        return BadLength;
166105b261ecSmrg    narcs /= sizeof(xArc);
166235c4bbdfSmrg    if (narcs > 0) {
166335c4bbdfSmrg        origArcs = xallocarray(narcs, sizeof(xArc));
166435c4bbdfSmrg        memcpy((char *) origArcs, (char *) &stuff[1], narcs * sizeof(xArc));
166535c4bbdfSmrg        FOR_NSCREENS_FORWARD(j) {
166635c4bbdfSmrg
166735c4bbdfSmrg            if (j)
166835c4bbdfSmrg                memcpy(&stuff[1], origArcs, narcs * sizeof(xArc));
166935c4bbdfSmrg
167035c4bbdfSmrg            if (isRoot) {
167135c4bbdfSmrg                int x_off = screenInfo.screens[j]->x;
167235c4bbdfSmrg                int y_off = screenInfo.screens[j]->y;
167335c4bbdfSmrg
167435c4bbdfSmrg                if (x_off || y_off) {
167535c4bbdfSmrg                    xArc *arcs = (xArc *) &stuff[1];
167635c4bbdfSmrg
167735c4bbdfSmrg                    for (i = narcs; i--; arcs++) {
167835c4bbdfSmrg                        arcs->x -= x_off;
167935c4bbdfSmrg                        arcs->y -= y_off;
168035c4bbdfSmrg                    }
168135c4bbdfSmrg                }
168205b261ecSmrg            }
168335c4bbdfSmrg            stuff->drawable = draw->info[j].id;
168435c4bbdfSmrg            stuff->gc = gc->info[j].id;
168535c4bbdfSmrg            result = (*SavedProcVector[X_PolyArc]) (client);
168635c4bbdfSmrg            if (result != Success)
168735c4bbdfSmrg                break;
168805b261ecSmrg        }
168935c4bbdfSmrg        free(origArcs);
169035c4bbdfSmrg        return result;
169135c4bbdfSmrg    }
169235c4bbdfSmrg    else
169335c4bbdfSmrg        return Success;
169405b261ecSmrg}
169505b261ecSmrg
169635c4bbdfSmrgint
169735c4bbdfSmrgPanoramiXFillPoly(ClientPtr client)
169805b261ecSmrg{
169935c4bbdfSmrg    int result, count, j;
170005b261ecSmrg    PanoramiXRes *gc, *draw;
170135c4bbdfSmrg    Bool isRoot;
170235c4bbdfSmrg    DDXPointPtr locPts;
170335c4bbdfSmrg
170405b261ecSmrg    REQUEST(xFillPolyReq);
170505b261ecSmrg
170605b261ecSmrg    REQUEST_AT_LEAST_SIZE(xFillPolyReq);
170705b261ecSmrg
170835c4bbdfSmrg    result = dixLookupResourceByClass((void **) &draw, stuff->drawable,
170935c4bbdfSmrg                                      XRC_DRAWABLE, client, DixWriteAccess);
17106747b715Smrg    if (result != Success)
171135c4bbdfSmrg        return (result == BadValue) ? BadDrawable : result;
171205b261ecSmrg
171335c4bbdfSmrg    if (IS_SHARED_PIXMAP(draw))
171435c4bbdfSmrg        return (*SavedProcVector[X_FillPoly]) (client);
171505b261ecSmrg
171635c4bbdfSmrg    result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC,
171735c4bbdfSmrg                                     client, DixReadAccess);
17186747b715Smrg    if (result != Success)
171935c4bbdfSmrg        return result;
172005b261ecSmrg
172135c4bbdfSmrg    isRoot = IS_ROOT_DRAWABLE(draw);
172205b261ecSmrg
17236747b715Smrg    count = bytes_to_int32((client->req_len << 2) - sizeof(xFillPolyReq));
172435c4bbdfSmrg    if (count > 0) {
172535c4bbdfSmrg        locPts = xallocarray(count, sizeof(DDXPointRec));
172635c4bbdfSmrg        memcpy((char *) locPts, (char *) &stuff[1],
172735c4bbdfSmrg               count * sizeof(DDXPointRec));
172835c4bbdfSmrg        FOR_NSCREENS_FORWARD(j) {
172935c4bbdfSmrg
173035c4bbdfSmrg            if (j)
173135c4bbdfSmrg                memcpy(&stuff[1], locPts, count * sizeof(DDXPointRec));
173235c4bbdfSmrg
173335c4bbdfSmrg            if (isRoot) {
173435c4bbdfSmrg                int x_off = screenInfo.screens[j]->x;
173535c4bbdfSmrg                int y_off = screenInfo.screens[j]->y;
173605b261ecSmrg
173735c4bbdfSmrg                if (x_off || y_off) {
173835c4bbdfSmrg                    DDXPointPtr pnts = (DDXPointPtr) &stuff[1];
173935c4bbdfSmrg                    int i = (stuff->coordMode == CoordModePrevious) ? 1 : count;
174035c4bbdfSmrg
174135c4bbdfSmrg                    while (i--) {
174235c4bbdfSmrg                        pnts->x -= x_off;
174335c4bbdfSmrg                        pnts->y -= y_off;
174435c4bbdfSmrg                        pnts++;
174535c4bbdfSmrg                    }
174635c4bbdfSmrg                }
174735c4bbdfSmrg            }
174835c4bbdfSmrg
174935c4bbdfSmrg            stuff->drawable = draw->info[j].id;
175035c4bbdfSmrg            stuff->gc = gc->info[j].id;
175135c4bbdfSmrg            result = (*SavedProcVector[X_FillPoly]) (client);
175235c4bbdfSmrg            if (result != Success)
175335c4bbdfSmrg                break;
175435c4bbdfSmrg        }
175535c4bbdfSmrg        free(locPts);
175635c4bbdfSmrg        return result;
175735c4bbdfSmrg    }
175835c4bbdfSmrg    else
175935c4bbdfSmrg        return Success;
176035c4bbdfSmrg}
176105b261ecSmrg
176235c4bbdfSmrgint
176335c4bbdfSmrgPanoramiXPolyFillRectangle(ClientPtr client)
176405b261ecSmrg{
176535c4bbdfSmrg    int result, things, i, j;
176605b261ecSmrg    PanoramiXRes *gc, *draw;
176735c4bbdfSmrg    Bool isRoot;
176835c4bbdfSmrg    xRectangle *origRects;
176935c4bbdfSmrg
177005b261ecSmrg    REQUEST(xPolyFillRectangleReq);
177105b261ecSmrg
177205b261ecSmrg    REQUEST_AT_LEAST_SIZE(xPolyFillRectangleReq);
177305b261ecSmrg
177435c4bbdfSmrg    result = dixLookupResourceByClass((void **) &draw, stuff->drawable,
177535c4bbdfSmrg                                      XRC_DRAWABLE, client, DixWriteAccess);
17766747b715Smrg    if (result != Success)
177735c4bbdfSmrg        return (result == BadValue) ? BadDrawable : result;
177805b261ecSmrg
177935c4bbdfSmrg    if (IS_SHARED_PIXMAP(draw))
178035c4bbdfSmrg        return (*SavedProcVector[X_PolyFillRectangle]) (client);
178105b261ecSmrg
178235c4bbdfSmrg    result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC,
178335c4bbdfSmrg                                     client, DixReadAccess);
17846747b715Smrg    if (result != Success)
178535c4bbdfSmrg        return result;
178605b261ecSmrg
178735c4bbdfSmrg    isRoot = IS_ROOT_DRAWABLE(draw);
178805b261ecSmrg
178905b261ecSmrg    things = (client->req_len << 2) - sizeof(xPolyFillRectangleReq);
179035c4bbdfSmrg    if (things & 4)
179135c4bbdfSmrg        return BadLength;
179205b261ecSmrg    things >>= 3;
179335c4bbdfSmrg    if (things > 0) {
179435c4bbdfSmrg        origRects = xallocarray(things, sizeof(xRectangle));
179535c4bbdfSmrg        memcpy((char *) origRects, (char *) &stuff[1],
179635c4bbdfSmrg               things * sizeof(xRectangle));
179735c4bbdfSmrg        FOR_NSCREENS_FORWARD(j) {
179835c4bbdfSmrg
179935c4bbdfSmrg            if (j)
180035c4bbdfSmrg                memcpy(&stuff[1], origRects, things * sizeof(xRectangle));
180105b261ecSmrg
180235c4bbdfSmrg            if (isRoot) {
180335c4bbdfSmrg                int x_off = screenInfo.screens[j]->x;
180435c4bbdfSmrg                int y_off = screenInfo.screens[j]->y;
180535c4bbdfSmrg
180635c4bbdfSmrg                if (x_off || y_off) {
180735c4bbdfSmrg                    xRectangle *rects = (xRectangle *) &stuff[1];
180835c4bbdfSmrg
180935c4bbdfSmrg                    for (i = things; i--; rects++) {
181035c4bbdfSmrg                        rects->x -= x_off;
181135c4bbdfSmrg                        rects->y -= y_off;
181235c4bbdfSmrg                    }
181335c4bbdfSmrg                }
181435c4bbdfSmrg            }
181505b261ecSmrg
181635c4bbdfSmrg            stuff->drawable = draw->info[j].id;
181735c4bbdfSmrg            stuff->gc = gc->info[j].id;
181835c4bbdfSmrg            result = (*SavedProcVector[X_PolyFillRectangle]) (client);
181935c4bbdfSmrg            if (result != Success)
182035c4bbdfSmrg                break;
182135c4bbdfSmrg        }
182235c4bbdfSmrg        free(origRects);
182335c4bbdfSmrg        return result;
182435c4bbdfSmrg    }
182535c4bbdfSmrg    else
182635c4bbdfSmrg        return Success;
182735c4bbdfSmrg}
182835c4bbdfSmrg
182935c4bbdfSmrgint
183035c4bbdfSmrgPanoramiXPolyFillArc(ClientPtr client)
183105b261ecSmrg{
183205b261ecSmrg    PanoramiXRes *gc, *draw;
183335c4bbdfSmrg    Bool isRoot;
183435c4bbdfSmrg    int result, narcs, i, j;
183535c4bbdfSmrg    xArc *origArcs;
183635c4bbdfSmrg
183705b261ecSmrg    REQUEST(xPolyFillArcReq);
183805b261ecSmrg
183905b261ecSmrg    REQUEST_AT_LEAST_SIZE(xPolyFillArcReq);
184005b261ecSmrg
184135c4bbdfSmrg    result = dixLookupResourceByClass((void **) &draw, stuff->drawable,
184235c4bbdfSmrg                                      XRC_DRAWABLE, client, DixWriteAccess);
18436747b715Smrg    if (result != Success)
184435c4bbdfSmrg        return (result == BadValue) ? BadDrawable : result;
184505b261ecSmrg
184635c4bbdfSmrg    if (IS_SHARED_PIXMAP(draw))
184735c4bbdfSmrg        return (*SavedProcVector[X_PolyFillArc]) (client);
184805b261ecSmrg
184935c4bbdfSmrg    result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC,
185035c4bbdfSmrg                                     client, DixReadAccess);
18516747b715Smrg    if (result != Success)
185235c4bbdfSmrg        return result;
185305b261ecSmrg
185435c4bbdfSmrg    isRoot = IS_ROOT_DRAWABLE(draw);
185505b261ecSmrg
185605b261ecSmrg    narcs = (client->req_len << 2) - sizeof(xPolyFillArcReq);
185735c4bbdfSmrg    if (narcs % sizeof(xArc))
185835c4bbdfSmrg        return BadLength;
185905b261ecSmrg    narcs /= sizeof(xArc);
186005b261ecSmrg    if (narcs > 0) {
186135c4bbdfSmrg        origArcs = xallocarray(narcs, sizeof(xArc));
186235c4bbdfSmrg        memcpy((char *) origArcs, (char *) &stuff[1], narcs * sizeof(xArc));
186335c4bbdfSmrg        FOR_NSCREENS_FORWARD(j) {
186435c4bbdfSmrg
186535c4bbdfSmrg            if (j)
186635c4bbdfSmrg                memcpy(&stuff[1], origArcs, narcs * sizeof(xArc));
186735c4bbdfSmrg
186835c4bbdfSmrg            if (isRoot) {
186935c4bbdfSmrg                int x_off = screenInfo.screens[j]->x;
187035c4bbdfSmrg                int y_off = screenInfo.screens[j]->y;
187105b261ecSmrg
187235c4bbdfSmrg                if (x_off || y_off) {
187335c4bbdfSmrg                    xArc *arcs = (xArc *) &stuff[1];
187435c4bbdfSmrg
187535c4bbdfSmrg                    for (i = narcs; i--; arcs++) {
187635c4bbdfSmrg                        arcs->x -= x_off;
187735c4bbdfSmrg                        arcs->y -= y_off;
187835c4bbdfSmrg                    }
187935c4bbdfSmrg                }
188035c4bbdfSmrg            }
188105b261ecSmrg
188235c4bbdfSmrg            stuff->drawable = draw->info[j].id;
188335c4bbdfSmrg            stuff->gc = gc->info[j].id;
188435c4bbdfSmrg            result = (*SavedProcVector[X_PolyFillArc]) (client);
188535c4bbdfSmrg            if (result != Success)
188635c4bbdfSmrg                break;
188735c4bbdfSmrg        }
188835c4bbdfSmrg        free(origArcs);
188935c4bbdfSmrg        return result;
189035c4bbdfSmrg    }
189135c4bbdfSmrg    else
189235c4bbdfSmrg        return Success;
189335c4bbdfSmrg}
189435c4bbdfSmrg
189535c4bbdfSmrgint
189635c4bbdfSmrgPanoramiXPutImage(ClientPtr client)
189705b261ecSmrg{
189805b261ecSmrg    PanoramiXRes *gc, *draw;
189935c4bbdfSmrg    Bool isRoot;
190035c4bbdfSmrg    int j, result, orig_x, orig_y;
190135c4bbdfSmrg
190205b261ecSmrg    REQUEST(xPutImageReq);
190305b261ecSmrg
190405b261ecSmrg    REQUEST_AT_LEAST_SIZE(xPutImageReq);
190505b261ecSmrg
190635c4bbdfSmrg    result = dixLookupResourceByClass((void **) &draw, stuff->drawable,
190735c4bbdfSmrg                                      XRC_DRAWABLE, client, DixWriteAccess);
19086747b715Smrg    if (result != Success)
190935c4bbdfSmrg        return (result == BadValue) ? BadDrawable : result;
191005b261ecSmrg
191135c4bbdfSmrg    if (IS_SHARED_PIXMAP(draw))
191235c4bbdfSmrg        return (*SavedProcVector[X_PutImage]) (client);
191305b261ecSmrg
191435c4bbdfSmrg    result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC,
191535c4bbdfSmrg                                     client, DixReadAccess);
19166747b715Smrg    if (result != Success)
191735c4bbdfSmrg        return result;
191805b261ecSmrg
191935c4bbdfSmrg    isRoot = IS_ROOT_DRAWABLE(draw);
192005b261ecSmrg
192105b261ecSmrg    orig_x = stuff->dstX;
192205b261ecSmrg    orig_y = stuff->dstY;
192335c4bbdfSmrg    FOR_NSCREENS_BACKWARD(j) {
192435c4bbdfSmrg        if (isRoot) {
192535c4bbdfSmrg            stuff->dstX = orig_x - screenInfo.screens[j]->x;
192635c4bbdfSmrg            stuff->dstY = orig_y - screenInfo.screens[j]->y;
192735c4bbdfSmrg        }
192835c4bbdfSmrg        stuff->drawable = draw->info[j].id;
192935c4bbdfSmrg        stuff->gc = gc->info[j].id;
193035c4bbdfSmrg        result = (*SavedProcVector[X_PutImage]) (client);
193135c4bbdfSmrg        if (result != Success)
193235c4bbdfSmrg            break;
193305b261ecSmrg    }
19346747b715Smrg    return result;
193505b261ecSmrg}
193605b261ecSmrg
193735c4bbdfSmrgint
193835c4bbdfSmrgPanoramiXGetImage(ClientPtr client)
193905b261ecSmrg{
194035c4bbdfSmrg    DrawablePtr drawables[MAXSCREENS];
194135c4bbdfSmrg    DrawablePtr pDraw;
194235c4bbdfSmrg    PanoramiXRes *draw;
194335c4bbdfSmrg    xGetImageReply xgi;
194435c4bbdfSmrg    Bool isRoot;
194535c4bbdfSmrg    char *pBuf;
194635c4bbdfSmrg    int i, x, y, w, h, format, rc;
194735c4bbdfSmrg    Mask plane = 0, planemask;
194835c4bbdfSmrg    int linesDone, nlines, linesPerBuf;
194935c4bbdfSmrg    long widthBytesLine, length;
195005b261ecSmrg
195105b261ecSmrg    REQUEST(xGetImageReq);
195205b261ecSmrg
195305b261ecSmrg    REQUEST_SIZE_MATCH(xGetImageReq);
195405b261ecSmrg
195505b261ecSmrg    if ((stuff->format != XYPixmap) && (stuff->format != ZPixmap)) {
195635c4bbdfSmrg        client->errorValue = stuff->format;
19576747b715Smrg        return BadValue;
195805b261ecSmrg    }
195905b261ecSmrg
196035c4bbdfSmrg    rc = dixLookupResourceByClass((void **) &draw, stuff->drawable,
196135c4bbdfSmrg                                  XRC_DRAWABLE, client, DixReadAccess);
19626747b715Smrg    if (rc != Success)
196335c4bbdfSmrg        return (rc == BadValue) ? BadDrawable : rc;
196405b261ecSmrg
196535c4bbdfSmrg    if (draw->type == XRT_PIXMAP)
196635c4bbdfSmrg        return (*SavedProcVector[X_GetImage]) (client);
196705b261ecSmrg
196835c4bbdfSmrg    rc = dixLookupDrawable(&pDraw, stuff->drawable, client, 0, DixReadAccess);
196905b261ecSmrg    if (rc != Success)
197035c4bbdfSmrg        return rc;
197105b261ecSmrg
197235c4bbdfSmrg    if (!((WindowPtr) pDraw)->realized)
197335c4bbdfSmrg        return BadMatch;
197405b261ecSmrg
197505b261ecSmrg    x = stuff->x;
197605b261ecSmrg    y = stuff->y;
197705b261ecSmrg    w = stuff->width;
197805b261ecSmrg    h = stuff->height;
197905b261ecSmrg    format = stuff->format;
198005b261ecSmrg    planemask = stuff->planeMask;
198105b261ecSmrg
198235c4bbdfSmrg    isRoot = IS_ROOT_DRAWABLE(draw);
198305b261ecSmrg
198435c4bbdfSmrg    if (isRoot) {
198535c4bbdfSmrg        /* check for being onscreen */
198635c4bbdfSmrg        if (x < 0 || x + w > PanoramiXPixWidth ||
198735c4bbdfSmrg            y < 0 || y + h > PanoramiXPixHeight)
198835c4bbdfSmrg            return BadMatch;
198935c4bbdfSmrg    }
199035c4bbdfSmrg    else {
199135c4bbdfSmrg        /* check for being onscreen and inside of border */
199235c4bbdfSmrg        if (screenInfo.screens[0]->x + pDraw->x + x < 0 ||
199335c4bbdfSmrg            screenInfo.screens[0]->x + pDraw->x + x + w > PanoramiXPixWidth ||
199435c4bbdfSmrg            screenInfo.screens[0]->y + pDraw->y + y < 0 ||
199535c4bbdfSmrg            screenInfo.screens[0]->y + pDraw->y + y + h > PanoramiXPixHeight ||
199635c4bbdfSmrg            x < -wBorderWidth((WindowPtr) pDraw) ||
199735c4bbdfSmrg            x + w > wBorderWidth((WindowPtr) pDraw) + (int) pDraw->width ||
199835c4bbdfSmrg            y < -wBorderWidth((WindowPtr) pDraw) ||
199935c4bbdfSmrg            y + h > wBorderWidth((WindowPtr) pDraw) + (int) pDraw->height)
200035c4bbdfSmrg            return BadMatch;
200105b261ecSmrg    }
200205b261ecSmrg
200305b261ecSmrg    drawables[0] = pDraw;
200435c4bbdfSmrg    FOR_NSCREENS_FORWARD_SKIP(i) {
200535c4bbdfSmrg        rc = dixLookupDrawable(drawables + i, draw->info[i].id, client, 0,
200635c4bbdfSmrg                               DixGetAttrAccess);
200735c4bbdfSmrg        if (rc != Success)
200835c4bbdfSmrg            return rc;
200905b261ecSmrg    }
201005b261ecSmrg
201135c4bbdfSmrg    xgi = (xGetImageReply) {
201235c4bbdfSmrg        .type = X_Reply,
201335c4bbdfSmrg        .sequenceNumber = client->sequence,
201435c4bbdfSmrg        .visual = wVisual(((WindowPtr) pDraw)),
201535c4bbdfSmrg        .depth = pDraw->depth
201635c4bbdfSmrg    };
201735c4bbdfSmrg    if (format == ZPixmap) {
201835c4bbdfSmrg        widthBytesLine = PixmapBytePad(w, pDraw->depth);
201935c4bbdfSmrg        length = widthBytesLine * h;
202005b261ecSmrg
202135c4bbdfSmrg    }
202235c4bbdfSmrg    else {
202335c4bbdfSmrg        widthBytesLine = BitmapBytePad(w);
202435c4bbdfSmrg        plane = ((Mask) 1) << (pDraw->depth - 1);
202535c4bbdfSmrg        /* only planes asked for */
202635c4bbdfSmrg        length = widthBytesLine * h * Ones(planemask & (plane | (plane - 1)));
202705b261ecSmrg
202805b261ecSmrg    }
202905b261ecSmrg
20306747b715Smrg    xgi.length = bytes_to_int32(length);
203105b261ecSmrg
203205b261ecSmrg    if (widthBytesLine == 0 || h == 0)
203335c4bbdfSmrg        linesPerBuf = 0;
203405b261ecSmrg    else if (widthBytesLine >= XINERAMA_IMAGE_BUFSIZE)
203535c4bbdfSmrg        linesPerBuf = 1;
203605b261ecSmrg    else {
203735c4bbdfSmrg        linesPerBuf = XINERAMA_IMAGE_BUFSIZE / widthBytesLine;
203835c4bbdfSmrg        if (linesPerBuf > h)
203935c4bbdfSmrg            linesPerBuf = h;
204005b261ecSmrg    }
204135c4bbdfSmrg    if (!(pBuf = xallocarray(linesPerBuf, widthBytesLine)))
204235c4bbdfSmrg        return BadAlloc;
204305b261ecSmrg
204435c4bbdfSmrg    WriteReplyToClient(client, sizeof(xGetImageReply), &xgi);
204505b261ecSmrg
204605b261ecSmrg    if (linesPerBuf == 0) {
204735c4bbdfSmrg        /* nothing to do */
204805b261ecSmrg    }
204905b261ecSmrg    else if (format == ZPixmap) {
205005b261ecSmrg        linesDone = 0;
205105b261ecSmrg        while (h - linesDone > 0) {
205235c4bbdfSmrg            nlines = min(linesPerBuf, h - linesDone);
205305b261ecSmrg
205435c4bbdfSmrg            if (pDraw->depth == 1)
205535c4bbdfSmrg                memset(pBuf, 0, nlines * widthBytesLine);
205605b261ecSmrg
205735c4bbdfSmrg            XineramaGetImageData(drawables, x, y + linesDone, w, nlines,
205835c4bbdfSmrg                                 format, planemask, pBuf, widthBytesLine,
205935c4bbdfSmrg                                 isRoot);
206005b261ecSmrg
206135c4bbdfSmrg            WriteToClient(client, (int) (nlines * widthBytesLine), pBuf);
206235c4bbdfSmrg            linesDone += nlines;
206305b261ecSmrg        }
206435c4bbdfSmrg    }
206535c4bbdfSmrg    else {                      /* XYPixmap */
206605b261ecSmrg        for (; plane; plane >>= 1) {
206735c4bbdfSmrg            if (planemask & plane) {
206835c4bbdfSmrg                linesDone = 0;
206935c4bbdfSmrg                while (h - linesDone > 0) {
207035c4bbdfSmrg                    nlines = min(linesPerBuf, h - linesDone);
207105b261ecSmrg
207235c4bbdfSmrg                    memset(pBuf, 0, nlines * widthBytesLine);
207305b261ecSmrg
207435c4bbdfSmrg                    XineramaGetImageData(drawables, x, y + linesDone, w,
207535c4bbdfSmrg                                         nlines, format, plane, pBuf,
207635c4bbdfSmrg                                         widthBytesLine, isRoot);
207705b261ecSmrg
207835c4bbdfSmrg                    WriteToClient(client, (int)(nlines * widthBytesLine), pBuf);
207905b261ecSmrg
208035c4bbdfSmrg                    linesDone += nlines;
208135c4bbdfSmrg                }
208205b261ecSmrg            }
208335c4bbdfSmrg        }
208405b261ecSmrg    }
20856747b715Smrg    free(pBuf);
20866747b715Smrg    return Success;
208705b261ecSmrg}
208805b261ecSmrg
208905b261ecSmrg/* The text stuff should be rewritten so that duplication happens
209005b261ecSmrg   at the GlyphBlt level.  That is, loading the font and getting
209105b261ecSmrg   the glyphs should only happen once */
209205b261ecSmrg
209335c4bbdfSmrgint
209405b261ecSmrgPanoramiXPolyText8(ClientPtr client)
209505b261ecSmrg{
209605b261ecSmrg    PanoramiXRes *gc, *draw;
209735c4bbdfSmrg    Bool isRoot;
209835c4bbdfSmrg    int result, j;
209935c4bbdfSmrg    int orig_x, orig_y;
210035c4bbdfSmrg
210105b261ecSmrg    REQUEST(xPolyTextReq);
210205b261ecSmrg
210305b261ecSmrg    REQUEST_AT_LEAST_SIZE(xPolyTextReq);
210405b261ecSmrg
210535c4bbdfSmrg    result = dixLookupResourceByClass((void **) &draw, stuff->drawable,
210635c4bbdfSmrg                                      XRC_DRAWABLE, client, DixWriteAccess);
21076747b715Smrg    if (result != Success)
210835c4bbdfSmrg        return (result == BadValue) ? BadDrawable : result;
210905b261ecSmrg
211035c4bbdfSmrg    if (IS_SHARED_PIXMAP(draw))
211135c4bbdfSmrg        return (*SavedProcVector[X_PolyText8]) (client);
211205b261ecSmrg
211335c4bbdfSmrg    result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC,
211435c4bbdfSmrg                                     client, DixReadAccess);
21156747b715Smrg    if (result != Success)
211635c4bbdfSmrg        return result;
211705b261ecSmrg
211835c4bbdfSmrg    isRoot = IS_ROOT_DRAWABLE(draw);
211905b261ecSmrg
212005b261ecSmrg    orig_x = stuff->x;
212105b261ecSmrg    orig_y = stuff->y;
212235c4bbdfSmrg    FOR_NSCREENS_BACKWARD(j) {
212335c4bbdfSmrg        stuff->drawable = draw->info[j].id;
212435c4bbdfSmrg        stuff->gc = gc->info[j].id;
212535c4bbdfSmrg        if (isRoot) {
212635c4bbdfSmrg            stuff->x = orig_x - screenInfo.screens[j]->x;
212735c4bbdfSmrg            stuff->y = orig_y - screenInfo.screens[j]->y;
212835c4bbdfSmrg        }
212935c4bbdfSmrg        result = (*SavedProcVector[X_PolyText8]) (client);
213035c4bbdfSmrg        if (result != Success)
213135c4bbdfSmrg            break;
213205b261ecSmrg    }
21336747b715Smrg    return result;
213405b261ecSmrg}
213505b261ecSmrg
213635c4bbdfSmrgint
213705b261ecSmrgPanoramiXPolyText16(ClientPtr client)
213805b261ecSmrg{
213905b261ecSmrg    PanoramiXRes *gc, *draw;
214035c4bbdfSmrg    Bool isRoot;
214135c4bbdfSmrg    int result, j;
214235c4bbdfSmrg    int orig_x, orig_y;
214335c4bbdfSmrg
214405b261ecSmrg    REQUEST(xPolyTextReq);
214505b261ecSmrg
214605b261ecSmrg    REQUEST_AT_LEAST_SIZE(xPolyTextReq);
214705b261ecSmrg
214835c4bbdfSmrg    result = dixLookupResourceByClass((void **) &draw, stuff->drawable,
214935c4bbdfSmrg                                      XRC_DRAWABLE, client, DixWriteAccess);
21506747b715Smrg    if (result != Success)
215135c4bbdfSmrg        return (result == BadValue) ? BadDrawable : result;
215205b261ecSmrg
215335c4bbdfSmrg    if (IS_SHARED_PIXMAP(draw))
215435c4bbdfSmrg        return (*SavedProcVector[X_PolyText16]) (client);
215505b261ecSmrg
215635c4bbdfSmrg    result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC,
215735c4bbdfSmrg                                     client, DixReadAccess);
21586747b715Smrg    if (result != Success)
215935c4bbdfSmrg        return result;
216005b261ecSmrg
216135c4bbdfSmrg    isRoot = IS_ROOT_DRAWABLE(draw);
216205b261ecSmrg
216305b261ecSmrg    orig_x = stuff->x;
216405b261ecSmrg    orig_y = stuff->y;
216535c4bbdfSmrg    FOR_NSCREENS_BACKWARD(j) {
216635c4bbdfSmrg        stuff->drawable = draw->info[j].id;
216735c4bbdfSmrg        stuff->gc = gc->info[j].id;
216835c4bbdfSmrg        if (isRoot) {
216935c4bbdfSmrg            stuff->x = orig_x - screenInfo.screens[j]->x;
217035c4bbdfSmrg            stuff->y = orig_y - screenInfo.screens[j]->y;
217135c4bbdfSmrg        }
217235c4bbdfSmrg        result = (*SavedProcVector[X_PolyText16]) (client);
217335c4bbdfSmrg        if (result != Success)
217435c4bbdfSmrg            break;
217505b261ecSmrg    }
21766747b715Smrg    return result;
217705b261ecSmrg}
217805b261ecSmrg
217935c4bbdfSmrgint
218035c4bbdfSmrgPanoramiXImageText8(ClientPtr client)
218105b261ecSmrg{
218235c4bbdfSmrg    int result, j;
218305b261ecSmrg    PanoramiXRes *gc, *draw;
218435c4bbdfSmrg    Bool isRoot;
218535c4bbdfSmrg    int orig_x, orig_y;
218635c4bbdfSmrg
218705b261ecSmrg    REQUEST(xImageTextReq);
218805b261ecSmrg
218905b261ecSmrg    REQUEST_FIXED_SIZE(xImageTextReq, stuff->nChars);
219005b261ecSmrg
219135c4bbdfSmrg    result = dixLookupResourceByClass((void **) &draw, stuff->drawable,
219235c4bbdfSmrg                                      XRC_DRAWABLE, client, DixWriteAccess);
21936747b715Smrg    if (result != Success)
219435c4bbdfSmrg        return (result == BadValue) ? BadDrawable : result;
219505b261ecSmrg
219635c4bbdfSmrg    if (IS_SHARED_PIXMAP(draw))
219735c4bbdfSmrg        return (*SavedProcVector[X_ImageText8]) (client);
219805b261ecSmrg
219935c4bbdfSmrg    result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC,
220035c4bbdfSmrg                                     client, DixReadAccess);
22016747b715Smrg    if (result != Success)
220235c4bbdfSmrg        return result;
220305b261ecSmrg
220435c4bbdfSmrg    isRoot = IS_ROOT_DRAWABLE(draw);
220505b261ecSmrg
220605b261ecSmrg    orig_x = stuff->x;
220705b261ecSmrg    orig_y = stuff->y;
220835c4bbdfSmrg    FOR_NSCREENS_BACKWARD(j) {
220935c4bbdfSmrg        stuff->drawable = draw->info[j].id;
221035c4bbdfSmrg        stuff->gc = gc->info[j].id;
221135c4bbdfSmrg        if (isRoot) {
221235c4bbdfSmrg            stuff->x = orig_x - screenInfo.screens[j]->x;
221335c4bbdfSmrg            stuff->y = orig_y - screenInfo.screens[j]->y;
221435c4bbdfSmrg        }
221535c4bbdfSmrg        result = (*SavedProcVector[X_ImageText8]) (client);
221635c4bbdfSmrg        if (result != Success)
221735c4bbdfSmrg            break;
221805b261ecSmrg    }
22196747b715Smrg    return result;
222005b261ecSmrg}
222105b261ecSmrg
222235c4bbdfSmrgint
222335c4bbdfSmrgPanoramiXImageText16(ClientPtr client)
222405b261ecSmrg{
222535c4bbdfSmrg    int result, j;
222605b261ecSmrg    PanoramiXRes *gc, *draw;
222735c4bbdfSmrg    Bool isRoot;
222835c4bbdfSmrg    int orig_x, orig_y;
222935c4bbdfSmrg
223005b261ecSmrg    REQUEST(xImageTextReq);
223105b261ecSmrg
223205b261ecSmrg    REQUEST_FIXED_SIZE(xImageTextReq, stuff->nChars << 1);
223305b261ecSmrg
223435c4bbdfSmrg    result = dixLookupResourceByClass((void **) &draw, stuff->drawable,
223535c4bbdfSmrg                                      XRC_DRAWABLE, client, DixWriteAccess);
22366747b715Smrg    if (result != Success)
223735c4bbdfSmrg        return (result == BadValue) ? BadDrawable : result;
223805b261ecSmrg
223935c4bbdfSmrg    if (IS_SHARED_PIXMAP(draw))
224035c4bbdfSmrg        return (*SavedProcVector[X_ImageText16]) (client);
224105b261ecSmrg
224235c4bbdfSmrg    result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC,
224335c4bbdfSmrg                                     client, DixReadAccess);
22446747b715Smrg    if (result != Success)
224535c4bbdfSmrg        return result;
224605b261ecSmrg
224735c4bbdfSmrg    isRoot = IS_ROOT_DRAWABLE(draw);
224805b261ecSmrg
224905b261ecSmrg    orig_x = stuff->x;
225005b261ecSmrg    orig_y = stuff->y;
225135c4bbdfSmrg    FOR_NSCREENS_BACKWARD(j) {
225235c4bbdfSmrg        stuff->drawable = draw->info[j].id;
225335c4bbdfSmrg        stuff->gc = gc->info[j].id;
225435c4bbdfSmrg        if (isRoot) {
225535c4bbdfSmrg            stuff->x = orig_x - screenInfo.screens[j]->x;
225635c4bbdfSmrg            stuff->y = orig_y - screenInfo.screens[j]->y;
225735c4bbdfSmrg        }
225835c4bbdfSmrg        result = (*SavedProcVector[X_ImageText16]) (client);
225935c4bbdfSmrg        if (result != Success)
226035c4bbdfSmrg            break;
226105b261ecSmrg    }
22626747b715Smrg    return result;
226305b261ecSmrg}
226405b261ecSmrg
226535c4bbdfSmrgint
226635c4bbdfSmrgPanoramiXCreateColormap(ClientPtr client)
226705b261ecSmrg{
226835c4bbdfSmrg    PanoramiXRes *win, *newCmap;
226935c4bbdfSmrg    int result, j, orig_visual;
227035c4bbdfSmrg
227105b261ecSmrg    REQUEST(xCreateColormapReq);
227205b261ecSmrg
227305b261ecSmrg    REQUEST_SIZE_MATCH(xCreateColormapReq);
227405b261ecSmrg
227535c4bbdfSmrg    result = dixLookupResourceByType((void **) &win, stuff->window,
227635c4bbdfSmrg                                     XRT_WINDOW, client, DixReadAccess);
22776747b715Smrg    if (result != Success)
227835c4bbdfSmrg        return result;
227905b261ecSmrg
228035c4bbdfSmrg    if (!(newCmap = malloc(sizeof(PanoramiXRes))))
228105b261ecSmrg        return BadAlloc;
228205b261ecSmrg
228305b261ecSmrg    newCmap->type = XRT_COLORMAP;
228435c4bbdfSmrg    panoramix_setup_ids(newCmap, client, stuff->mid);
228505b261ecSmrg
228605b261ecSmrg    orig_visual = stuff->visual;
228735c4bbdfSmrg    FOR_NSCREENS_BACKWARD(j) {
228835c4bbdfSmrg        stuff->mid = newCmap->info[j].id;
228935c4bbdfSmrg        stuff->window = win->info[j].id;
229035c4bbdfSmrg        stuff->visual = PanoramiXTranslateVisualID(j, orig_visual);
229135c4bbdfSmrg        result = (*SavedProcVector[X_CreateColormap]) (client);
229235c4bbdfSmrg        if (result != Success)
229335c4bbdfSmrg            break;
229435c4bbdfSmrg    }
229535c4bbdfSmrg
229605b261ecSmrg    if (result == Success)
229705b261ecSmrg        AddResource(newCmap->info[0].id, XRT_COLORMAP, newCmap);
229835c4bbdfSmrg    else
22996747b715Smrg        free(newCmap);
230005b261ecSmrg
23016747b715Smrg    return result;
230205b261ecSmrg}
230305b261ecSmrg
230435c4bbdfSmrgint
230535c4bbdfSmrgPanoramiXFreeColormap(ClientPtr client)
230605b261ecSmrg{
230705b261ecSmrg    PanoramiXRes *cmap;
230835c4bbdfSmrg    int result, j;
230935c4bbdfSmrg
231005b261ecSmrg    REQUEST(xResourceReq);
231105b261ecSmrg
231205b261ecSmrg    REQUEST_SIZE_MATCH(xResourceReq);
231305b261ecSmrg
231405b261ecSmrg    client->errorValue = stuff->id;
231505b261ecSmrg
231635c4bbdfSmrg    result = dixLookupResourceByType((void **) &cmap, stuff->id, XRT_COLORMAP,
231735c4bbdfSmrg                                     client, DixDestroyAccess);
23186747b715Smrg    if (result != Success)
23196747b715Smrg        return result;
232005b261ecSmrg
232105b261ecSmrg    FOR_NSCREENS_BACKWARD(j) {
232205b261ecSmrg        stuff->id = cmap->info[j].id;
232335c4bbdfSmrg        result = (*SavedProcVector[X_FreeColormap]) (client);
232435c4bbdfSmrg        if (result != Success)
232535c4bbdfSmrg            break;
232605b261ecSmrg    }
232705b261ecSmrg
232805b261ecSmrg    /* Since ProcFreeColormap is using FreeResource, it will free
232935c4bbdfSmrg       our resource for us on the last pass through the loop above */
233005b261ecSmrg
23316747b715Smrg    return result;
233205b261ecSmrg}
233305b261ecSmrg
233405b261ecSmrgint
233505b261ecSmrgPanoramiXCopyColormapAndFree(ClientPtr client)
233605b261ecSmrg{
233705b261ecSmrg    PanoramiXRes *cmap, *newCmap;
233835c4bbdfSmrg    int result, j;
233935c4bbdfSmrg
234005b261ecSmrg    REQUEST(xCopyColormapAndFreeReq);
234105b261ecSmrg
234205b261ecSmrg    REQUEST_SIZE_MATCH(xCopyColormapAndFreeReq);
234305b261ecSmrg
234405b261ecSmrg    client->errorValue = stuff->srcCmap;
234505b261ecSmrg
234635c4bbdfSmrg    result = dixLookupResourceByType((void **) &cmap, stuff->srcCmap,
234735c4bbdfSmrg                                     XRT_COLORMAP, client,
234835c4bbdfSmrg                                     DixReadAccess | DixWriteAccess);
23496747b715Smrg    if (result != Success)
23506747b715Smrg        return result;
235105b261ecSmrg
235235c4bbdfSmrg    if (!(newCmap = malloc(sizeof(PanoramiXRes))))
235305b261ecSmrg        return BadAlloc;
235405b261ecSmrg
235505b261ecSmrg    newCmap->type = XRT_COLORMAP;
235635c4bbdfSmrg    panoramix_setup_ids(newCmap, client, stuff->mid);
235705b261ecSmrg
235835c4bbdfSmrg    FOR_NSCREENS_BACKWARD(j) {
235905b261ecSmrg        stuff->srcCmap = cmap->info[j].id;
236035c4bbdfSmrg        stuff->mid = newCmap->info[j].id;
236135c4bbdfSmrg        result = (*SavedProcVector[X_CopyColormapAndFree]) (client);
236235c4bbdfSmrg        if (result != Success)
236335c4bbdfSmrg            break;
236405b261ecSmrg    }
236505b261ecSmrg
236605b261ecSmrg    if (result == Success)
236705b261ecSmrg        AddResource(newCmap->info[0].id, XRT_COLORMAP, newCmap);
236835c4bbdfSmrg    else
23696747b715Smrg        free(newCmap);
237005b261ecSmrg
23716747b715Smrg    return result;
237205b261ecSmrg}
237305b261ecSmrg
237435c4bbdfSmrgint
237535c4bbdfSmrgPanoramiXInstallColormap(ClientPtr client)
237605b261ecSmrg{
237705b261ecSmrg    REQUEST(xResourceReq);
237835c4bbdfSmrg    int result, j;
237905b261ecSmrg    PanoramiXRes *cmap;
238005b261ecSmrg
238105b261ecSmrg    REQUEST_SIZE_MATCH(xResourceReq);
238205b261ecSmrg
238305b261ecSmrg    client->errorValue = stuff->id;
238405b261ecSmrg
238535c4bbdfSmrg    result = dixLookupResourceByType((void **) &cmap, stuff->id, XRT_COLORMAP,
238635c4bbdfSmrg                                     client, DixReadAccess);
23876747b715Smrg    if (result != Success)
23886747b715Smrg        return result;
238905b261ecSmrg
239035c4bbdfSmrg    FOR_NSCREENS_BACKWARD(j) {
239135c4bbdfSmrg        stuff->id = cmap->info[j].id;
239235c4bbdfSmrg        result = (*SavedProcVector[X_InstallColormap]) (client);
239335c4bbdfSmrg        if (result != Success)
239435c4bbdfSmrg            break;
239505b261ecSmrg    }
23966747b715Smrg    return result;
239705b261ecSmrg}
239805b261ecSmrg
239935c4bbdfSmrgint
240035c4bbdfSmrgPanoramiXUninstallColormap(ClientPtr client)
240105b261ecSmrg{
240205b261ecSmrg    REQUEST(xResourceReq);
240335c4bbdfSmrg    int result, j;
240405b261ecSmrg    PanoramiXRes *cmap;
240505b261ecSmrg
240605b261ecSmrg    REQUEST_SIZE_MATCH(xResourceReq);
240735c4bbdfSmrg
240805b261ecSmrg    client->errorValue = stuff->id;
240905b261ecSmrg
241035c4bbdfSmrg    result = dixLookupResourceByType((void **) &cmap, stuff->id, XRT_COLORMAP,
241135c4bbdfSmrg                                     client, DixReadAccess);
24126747b715Smrg    if (result != Success)
24136747b715Smrg        return result;
241405b261ecSmrg
241505b261ecSmrg    FOR_NSCREENS_BACKWARD(j) {
241635c4bbdfSmrg        stuff->id = cmap->info[j].id;
241735c4bbdfSmrg        result = (*SavedProcVector[X_UninstallColormap]) (client);
241835c4bbdfSmrg        if (result != Success)
241935c4bbdfSmrg            break;
242005b261ecSmrg    }
24216747b715Smrg    return result;
242205b261ecSmrg}
242305b261ecSmrg
242435c4bbdfSmrgint
242535c4bbdfSmrgPanoramiXAllocColor(ClientPtr client)
242605b261ecSmrg{
242735c4bbdfSmrg    int result, j;
242805b261ecSmrg    PanoramiXRes *cmap;
242935c4bbdfSmrg
243005b261ecSmrg    REQUEST(xAllocColorReq);
243105b261ecSmrg
243205b261ecSmrg    REQUEST_SIZE_MATCH(xAllocColorReq);
243305b261ecSmrg
243405b261ecSmrg    client->errorValue = stuff->cmap;
243505b261ecSmrg
243635c4bbdfSmrg    result = dixLookupResourceByType((void **) &cmap, stuff->cmap,
243735c4bbdfSmrg                                     XRT_COLORMAP, client, DixWriteAccess);
24386747b715Smrg    if (result != Success)
24396747b715Smrg        return result;
244005b261ecSmrg
244135c4bbdfSmrg    FOR_NSCREENS_BACKWARD(j) {
244235c4bbdfSmrg        stuff->cmap = cmap->info[j].id;
244335c4bbdfSmrg        result = (*SavedProcVector[X_AllocColor]) (client);
244435c4bbdfSmrg        if (result != Success)
244535c4bbdfSmrg            break;
244605b261ecSmrg    }
24476747b715Smrg    return result;
244805b261ecSmrg}
244905b261ecSmrg
245035c4bbdfSmrgint
245135c4bbdfSmrgPanoramiXAllocNamedColor(ClientPtr client)
245205b261ecSmrg{
245335c4bbdfSmrg    int result, j;
245435c4bbdfSmrg    PanoramiXRes *cmap;
245535c4bbdfSmrg
245605b261ecSmrg    REQUEST(xAllocNamedColorReq);
245705b261ecSmrg
245805b261ecSmrg    REQUEST_FIXED_SIZE(xAllocNamedColorReq, stuff->nbytes);
245905b261ecSmrg
246005b261ecSmrg    client->errorValue = stuff->cmap;
246105b261ecSmrg
246235c4bbdfSmrg    result = dixLookupResourceByType((void **) &cmap, stuff->cmap,
246335c4bbdfSmrg                                     XRT_COLORMAP, client, DixWriteAccess);
24646747b715Smrg    if (result != Success)
24656747b715Smrg        return result;
246605b261ecSmrg
246735c4bbdfSmrg    FOR_NSCREENS_BACKWARD(j) {
246805b261ecSmrg        stuff->cmap = cmap->info[j].id;
246935c4bbdfSmrg        result = (*SavedProcVector[X_AllocNamedColor]) (client);
247035c4bbdfSmrg        if (result != Success)
247135c4bbdfSmrg            break;
247205b261ecSmrg    }
24736747b715Smrg    return result;
247405b261ecSmrg}
247505b261ecSmrg
247635c4bbdfSmrgint
247735c4bbdfSmrgPanoramiXAllocColorCells(ClientPtr client)
247805b261ecSmrg{
247935c4bbdfSmrg    int result, j;
248035c4bbdfSmrg    PanoramiXRes *cmap;
248135c4bbdfSmrg
248205b261ecSmrg    REQUEST(xAllocColorCellsReq);
248305b261ecSmrg
248405b261ecSmrg    REQUEST_SIZE_MATCH(xAllocColorCellsReq);
248505b261ecSmrg
248605b261ecSmrg    client->errorValue = stuff->cmap;
248705b261ecSmrg
248835c4bbdfSmrg    result = dixLookupResourceByType((void **) &cmap, stuff->cmap,
248935c4bbdfSmrg                                     XRT_COLORMAP, client, DixWriteAccess);
24906747b715Smrg    if (result != Success)
24916747b715Smrg        return result;
249235c4bbdfSmrg
249335c4bbdfSmrg    FOR_NSCREENS_BACKWARD(j) {
249435c4bbdfSmrg        stuff->cmap = cmap->info[j].id;
249535c4bbdfSmrg        result = (*SavedProcVector[X_AllocColorCells]) (client);
249635c4bbdfSmrg        if (result != Success)
249735c4bbdfSmrg            break;
249805b261ecSmrg    }
24996747b715Smrg    return result;
250005b261ecSmrg}
250105b261ecSmrg
250235c4bbdfSmrgint
250335c4bbdfSmrgPanoramiXAllocColorPlanes(ClientPtr client)
250405b261ecSmrg{
250535c4bbdfSmrg    int result, j;
250635c4bbdfSmrg    PanoramiXRes *cmap;
250735c4bbdfSmrg
250805b261ecSmrg    REQUEST(xAllocColorPlanesReq);
250905b261ecSmrg
251005b261ecSmrg    REQUEST_SIZE_MATCH(xAllocColorPlanesReq);
251105b261ecSmrg
251205b261ecSmrg    client->errorValue = stuff->cmap;
251305b261ecSmrg
251435c4bbdfSmrg    result = dixLookupResourceByType((void **) &cmap, stuff->cmap,
251535c4bbdfSmrg                                     XRT_COLORMAP, client, DixWriteAccess);
25166747b715Smrg    if (result != Success)
25176747b715Smrg        return result;
251835c4bbdfSmrg
251935c4bbdfSmrg    FOR_NSCREENS_BACKWARD(j) {
252035c4bbdfSmrg        stuff->cmap = cmap->info[j].id;
252135c4bbdfSmrg        result = (*SavedProcVector[X_AllocColorPlanes]) (client);
252235c4bbdfSmrg        if (result != Success)
252335c4bbdfSmrg            break;
252405b261ecSmrg    }
25256747b715Smrg    return result;
252605b261ecSmrg}
252705b261ecSmrg
252835c4bbdfSmrgint
252935c4bbdfSmrgPanoramiXFreeColors(ClientPtr client)
253005b261ecSmrg{
253135c4bbdfSmrg    int result, j;
253235c4bbdfSmrg    PanoramiXRes *cmap;
253335c4bbdfSmrg
253405b261ecSmrg    REQUEST(xFreeColorsReq);
253505b261ecSmrg
253605b261ecSmrg    REQUEST_AT_LEAST_SIZE(xFreeColorsReq);
253705b261ecSmrg
253805b261ecSmrg    client->errorValue = stuff->cmap;
253905b261ecSmrg
254035c4bbdfSmrg    result = dixLookupResourceByType((void **) &cmap, stuff->cmap,
254135c4bbdfSmrg                                     XRT_COLORMAP, client, DixWriteAccess);
25426747b715Smrg    if (result != Success)
25436747b715Smrg        return result;
254405b261ecSmrg
254505b261ecSmrg    FOR_NSCREENS_BACKWARD(j) {
254605b261ecSmrg        stuff->cmap = cmap->info[j].id;
254735c4bbdfSmrg        result = (*SavedProcVector[X_FreeColors]) (client);
254805b261ecSmrg    }
25496747b715Smrg    return result;
255005b261ecSmrg}
255105b261ecSmrg
255235c4bbdfSmrgint
255335c4bbdfSmrgPanoramiXStoreColors(ClientPtr client)
255405b261ecSmrg{
255535c4bbdfSmrg    int result, j;
255635c4bbdfSmrg    PanoramiXRes *cmap;
255735c4bbdfSmrg
255805b261ecSmrg    REQUEST(xStoreColorsReq);
255905b261ecSmrg
256005b261ecSmrg    REQUEST_AT_LEAST_SIZE(xStoreColorsReq);
256105b261ecSmrg
256205b261ecSmrg    client->errorValue = stuff->cmap;
256305b261ecSmrg
256435c4bbdfSmrg    result = dixLookupResourceByType((void **) &cmap, stuff->cmap,
256535c4bbdfSmrg                                     XRT_COLORMAP, client, DixWriteAccess);
25666747b715Smrg    if (result != Success)
25676747b715Smrg        return result;
256805b261ecSmrg
256935c4bbdfSmrg    FOR_NSCREENS_BACKWARD(j) {
257035c4bbdfSmrg        stuff->cmap = cmap->info[j].id;
257135c4bbdfSmrg        result = (*SavedProcVector[X_StoreColors]) (client);
257235c4bbdfSmrg        if (result != Success)
257335c4bbdfSmrg            break;
257405b261ecSmrg    }
25756747b715Smrg    return result;
257605b261ecSmrg}
257705b261ecSmrg
257835c4bbdfSmrgint
257935c4bbdfSmrgPanoramiXStoreNamedColor(ClientPtr client)
258005b261ecSmrg{
258135c4bbdfSmrg    int result, j;
258235c4bbdfSmrg    PanoramiXRes *cmap;
258335c4bbdfSmrg
258405b261ecSmrg    REQUEST(xStoreNamedColorReq);
258505b261ecSmrg
258605b261ecSmrg    REQUEST_FIXED_SIZE(xStoreNamedColorReq, stuff->nbytes);
258705b261ecSmrg
258805b261ecSmrg    client->errorValue = stuff->cmap;
258905b261ecSmrg
259035c4bbdfSmrg    result = dixLookupResourceByType((void **) &cmap, stuff->cmap,
259135c4bbdfSmrg                                     XRT_COLORMAP, client, DixWriteAccess);
25926747b715Smrg    if (result != Success)
25936747b715Smrg        return result;
259405b261ecSmrg
259535c4bbdfSmrg    FOR_NSCREENS_BACKWARD(j) {
259635c4bbdfSmrg        stuff->cmap = cmap->info[j].id;
259735c4bbdfSmrg        result = (*SavedProcVector[X_StoreNamedColor]) (client);
259835c4bbdfSmrg        if (result != Success)
259935c4bbdfSmrg            break;
260005b261ecSmrg    }
26016747b715Smrg    return result;
260205b261ecSmrg}
2603