panoramiXprocs.c revision 35c4bbdf
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{
105335c4bbdfSmrg    int j, result, srcx, srcy, dstx, dsty;
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;
109435c4bbdfSmrg    if ((dst->type == XRT_PIXMAP) && (src->type == XRT_WINDOW)) {
109535c4bbdfSmrg        DrawablePtr drawables[MAXSCREENS];
109635c4bbdfSmrg        DrawablePtr pDst;
109735c4bbdfSmrg        GCPtr pGC;
109805b261ecSmrg        char *data;
109935c4bbdfSmrg        int pitch, rc;
110035c4bbdfSmrg
110135c4bbdfSmrg        FOR_NSCREENS(j) {
110235c4bbdfSmrg            rc = dixLookupDrawable(drawables + j, src->info[j].id, client, 0,
110335c4bbdfSmrg                                   DixGetAttrAccess);
110435c4bbdfSmrg            if (rc != Success)
110535c4bbdfSmrg                return rc;
110635c4bbdfSmrg        }
110735c4bbdfSmrg
110835c4bbdfSmrg        pitch = PixmapBytePad(stuff->width, drawables[0]->depth);
110935c4bbdfSmrg        if (!(data = calloc(stuff->height, pitch)))
111035c4bbdfSmrg            return BadAlloc;
111135c4bbdfSmrg
111235c4bbdfSmrg        XineramaGetImageData(drawables, srcx, srcy,
111335c4bbdfSmrg                             stuff->width, stuff->height, ZPixmap, ~0, data,
111435c4bbdfSmrg                             pitch, srcIsRoot);
111535c4bbdfSmrg
111635c4bbdfSmrg        FOR_NSCREENS_BACKWARD(j) {
111735c4bbdfSmrg            stuff->gc = gc->info[j].id;
111835c4bbdfSmrg            VALIDATE_DRAWABLE_AND_GC(dst->info[j].id, pDst, DixWriteAccess);
111935c4bbdfSmrg            if (drawables[0]->depth != pDst->depth) {
112035c4bbdfSmrg                client->errorValue = stuff->dstDrawable;
112135c4bbdfSmrg                free(data);
112235c4bbdfSmrg                return BadMatch;
112335c4bbdfSmrg            }
112435c4bbdfSmrg
112535c4bbdfSmrg            (*pGC->ops->PutImage) (pDst, pGC, pDst->depth, dstx, dsty,
112635c4bbdfSmrg                                   stuff->width, stuff->height,
112735c4bbdfSmrg                                   0, ZPixmap, data);
112835c4bbdfSmrg
112935c4bbdfSmrg            if (dstShared)
113035c4bbdfSmrg                break;
113135c4bbdfSmrg        }
113235c4bbdfSmrg
113335c4bbdfSmrg        free(data);
113435c4bbdfSmrg    }
113535c4bbdfSmrg    else {
113635c4bbdfSmrg        DrawablePtr pDst = NULL, pSrc = NULL;
113735c4bbdfSmrg        GCPtr pGC = NULL;
113835c4bbdfSmrg        RegionRec totalReg;
113935c4bbdfSmrg        int rc;
114035c4bbdfSmrg
114135c4bbdfSmrg        RegionNull(&totalReg);
114235c4bbdfSmrg        FOR_NSCREENS_BACKWARD(j) {
114335c4bbdfSmrg            RegionPtr pRgn;
114435c4bbdfSmrg
114535c4bbdfSmrg            stuff->dstDrawable = dst->info[j].id;
114635c4bbdfSmrg            stuff->srcDrawable = src->info[j].id;
114735c4bbdfSmrg            stuff->gc = gc->info[j].id;
114835c4bbdfSmrg            if (srcIsRoot) {
114935c4bbdfSmrg                stuff->srcX = srcx - screenInfo.screens[j]->x;
115035c4bbdfSmrg                stuff->srcY = srcy - screenInfo.screens[j]->y;
115135c4bbdfSmrg            }
115235c4bbdfSmrg            if (dstIsRoot) {
115335c4bbdfSmrg                stuff->dstX = dstx - screenInfo.screens[j]->x;
115435c4bbdfSmrg                stuff->dstY = dsty - screenInfo.screens[j]->y;
115535c4bbdfSmrg            }
115635c4bbdfSmrg
115735c4bbdfSmrg            VALIDATE_DRAWABLE_AND_GC(stuff->dstDrawable, pDst, DixWriteAccess);
115835c4bbdfSmrg
115935c4bbdfSmrg            if (stuff->dstDrawable != stuff->srcDrawable) {
116035c4bbdfSmrg                rc = dixLookupDrawable(&pSrc, stuff->srcDrawable, client, 0,
116135c4bbdfSmrg                                       DixReadAccess);
116235c4bbdfSmrg                if (rc != Success)
116335c4bbdfSmrg                    return rc;
116435c4bbdfSmrg
116535c4bbdfSmrg                if ((pDst->pScreen != pSrc->pScreen) ||
116635c4bbdfSmrg                    (pDst->depth != pSrc->depth)) {
116735c4bbdfSmrg                    client->errorValue = stuff->dstDrawable;
116835c4bbdfSmrg                    return BadMatch;
116935c4bbdfSmrg                }
117035c4bbdfSmrg            }
117135c4bbdfSmrg            else
117235c4bbdfSmrg                pSrc = pDst;
117335c4bbdfSmrg
117435c4bbdfSmrg            pRgn = (*pGC->ops->CopyArea) (pSrc, pDst, pGC,
117535c4bbdfSmrg                                          stuff->srcX, stuff->srcY,
117635c4bbdfSmrg                                          stuff->width, stuff->height,
117735c4bbdfSmrg                                          stuff->dstX, stuff->dstY);
117835c4bbdfSmrg            if (pGC->graphicsExposures && pRgn) {
117935c4bbdfSmrg                if (srcIsRoot) {
118035c4bbdfSmrg                    RegionTranslate(pRgn,
118135c4bbdfSmrg                                    screenInfo.screens[j]->x,
118235c4bbdfSmrg                                    screenInfo.screens[j]->y);
118335c4bbdfSmrg                }
118435c4bbdfSmrg                RegionAppend(&totalReg, pRgn);
118535c4bbdfSmrg                RegionDestroy(pRgn);
118635c4bbdfSmrg            }
118735c4bbdfSmrg
118835c4bbdfSmrg            if (dstShared)
118935c4bbdfSmrg                break;
119035c4bbdfSmrg        }
119135c4bbdfSmrg
119235c4bbdfSmrg        if (pGC->graphicsExposures) {
119335c4bbdfSmrg            Bool overlap;
119435c4bbdfSmrg
119535c4bbdfSmrg            RegionValidate(&totalReg, &overlap);
119635c4bbdfSmrg            SendGraphicsExpose(client, &totalReg, stuff->dstDrawable,
119735c4bbdfSmrg                               X_CopyArea, 0);
119835c4bbdfSmrg            RegionUninit(&totalReg);
119935c4bbdfSmrg        }
120005b261ecSmrg    }
120105b261ecSmrg
12026747b715Smrg    return Success;
120305b261ecSmrg}
120405b261ecSmrg
120535c4bbdfSmrgint
120635c4bbdfSmrgPanoramiXCopyPlane(ClientPtr client)
120705b261ecSmrg{
120835c4bbdfSmrg    int j, srcx, srcy, dstx, dsty, rc;
120935c4bbdfSmrg    PanoramiXRes *gc, *src, *dst;
121035c4bbdfSmrg    Bool srcIsRoot = FALSE;
121135c4bbdfSmrg    Bool dstIsRoot = FALSE;
121235c4bbdfSmrg    Bool srcShared, dstShared;
121335c4bbdfSmrg    DrawablePtr psrcDraw, pdstDraw = NULL;
121435c4bbdfSmrg    GCPtr pGC = NULL;
121535c4bbdfSmrg    RegionRec totalReg;
121635c4bbdfSmrg
121705b261ecSmrg    REQUEST(xCopyPlaneReq);
121805b261ecSmrg
121905b261ecSmrg    REQUEST_SIZE_MATCH(xCopyPlaneReq);
122005b261ecSmrg
122135c4bbdfSmrg    rc = dixLookupResourceByClass((void **) &src, stuff->srcDrawable,
122235c4bbdfSmrg                                  XRC_DRAWABLE, client, DixReadAccess);
12236747b715Smrg    if (rc != Success)
122435c4bbdfSmrg        return (rc == BadValue) ? BadDrawable : rc;
122505b261ecSmrg
122605b261ecSmrg    srcShared = IS_SHARED_PIXMAP(src);
122705b261ecSmrg
122835c4bbdfSmrg    rc = dixLookupResourceByClass((void **) &dst, stuff->dstDrawable,
122935c4bbdfSmrg                                  XRC_DRAWABLE, client, DixWriteAccess);
12306747b715Smrg    if (rc != Success)
123135c4bbdfSmrg        return (rc == BadValue) ? BadDrawable : rc;
123205b261ecSmrg
123305b261ecSmrg    dstShared = IS_SHARED_PIXMAP(dst);
123405b261ecSmrg
123535c4bbdfSmrg    if (dstShared && srcShared)
123635c4bbdfSmrg        return (*SavedProcVector[X_CopyPlane]) (client);
123705b261ecSmrg
123835c4bbdfSmrg    rc = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC,
123935c4bbdfSmrg                                 client, DixReadAccess);
12406747b715Smrg    if (rc != Success)
124135c4bbdfSmrg        return rc;
124235c4bbdfSmrg
124335c4bbdfSmrg    if ((dst->type == XRT_WINDOW) && dst->u.win.root)
124435c4bbdfSmrg        dstIsRoot = TRUE;
124535c4bbdfSmrg    if ((src->type == XRT_WINDOW) && src->u.win.root)
124635c4bbdfSmrg        srcIsRoot = TRUE;
124705b261ecSmrg
124835c4bbdfSmrg    srcx = stuff->srcX;
124935c4bbdfSmrg    srcy = stuff->srcY;
125035c4bbdfSmrg    dstx = stuff->dstX;
125135c4bbdfSmrg    dsty = stuff->dstY;
125205b261ecSmrg
12536747b715Smrg    RegionNull(&totalReg);
125405b261ecSmrg    FOR_NSCREENS_BACKWARD(j) {
125535c4bbdfSmrg        RegionPtr pRgn;
125635c4bbdfSmrg
125735c4bbdfSmrg        stuff->dstDrawable = dst->info[j].id;
125835c4bbdfSmrg        stuff->srcDrawable = src->info[j].id;
125935c4bbdfSmrg        stuff->gc = gc->info[j].id;
126035c4bbdfSmrg        if (srcIsRoot) {
126135c4bbdfSmrg            stuff->srcX = srcx - screenInfo.screens[j]->x;
126235c4bbdfSmrg            stuff->srcY = srcy - screenInfo.screens[j]->y;
126335c4bbdfSmrg        }
126435c4bbdfSmrg        if (dstIsRoot) {
126535c4bbdfSmrg            stuff->dstX = dstx - screenInfo.screens[j]->x;
126635c4bbdfSmrg            stuff->dstY = dsty - screenInfo.screens[j]->y;
126735c4bbdfSmrg        }
126835c4bbdfSmrg
126935c4bbdfSmrg        VALIDATE_DRAWABLE_AND_GC(stuff->dstDrawable, pdstDraw, DixWriteAccess);
127035c4bbdfSmrg        if (stuff->dstDrawable != stuff->srcDrawable) {
127135c4bbdfSmrg            rc = dixLookupDrawable(&psrcDraw, stuff->srcDrawable, client, 0,
127235c4bbdfSmrg                                   DixReadAccess);
127335c4bbdfSmrg            if (rc != Success)
127435c4bbdfSmrg                return rc;
127505b261ecSmrg
127605b261ecSmrg            if (pdstDraw->pScreen != psrcDraw->pScreen) {
127735c4bbdfSmrg                client->errorValue = stuff->dstDrawable;
127835c4bbdfSmrg                return BadMatch;
127935c4bbdfSmrg            }
128035c4bbdfSmrg        }
128135c4bbdfSmrg        else
128235c4bbdfSmrg            psrcDraw = pdstDraw;
128335c4bbdfSmrg
128435c4bbdfSmrg        if (stuff->bitPlane == 0 || (stuff->bitPlane & (stuff->bitPlane - 1)) ||
128535c4bbdfSmrg            (stuff->bitPlane > (1L << (psrcDraw->depth - 1)))) {
128635c4bbdfSmrg            client->errorValue = stuff->bitPlane;
128735c4bbdfSmrg            return BadValue;
128835c4bbdfSmrg        }
128935c4bbdfSmrg
129035c4bbdfSmrg        pRgn = (*pGC->ops->CopyPlane) (psrcDraw, pdstDraw, pGC,
129135c4bbdfSmrg                                       stuff->srcX, stuff->srcY,
129235c4bbdfSmrg                                       stuff->width, stuff->height,
129335c4bbdfSmrg                                       stuff->dstX, stuff->dstY,
129435c4bbdfSmrg                                       stuff->bitPlane);
129535c4bbdfSmrg        if (pGC->graphicsExposures && pRgn) {
129635c4bbdfSmrg            RegionAppend(&totalReg, pRgn);
129735c4bbdfSmrg            RegionDestroy(pRgn);
129835c4bbdfSmrg        }
129935c4bbdfSmrg
130035c4bbdfSmrg        if (dstShared)
130135c4bbdfSmrg            break;
130235c4bbdfSmrg    }
130335c4bbdfSmrg
130435c4bbdfSmrg    if (pGC->graphicsExposures) {
130535c4bbdfSmrg        Bool overlap;
130635c4bbdfSmrg
130735c4bbdfSmrg        RegionValidate(&totalReg, &overlap);
130835c4bbdfSmrg        SendGraphicsExpose(client, &totalReg, stuff->dstDrawable,
130935c4bbdfSmrg                           X_CopyPlane, 0);
131035c4bbdfSmrg        RegionUninit(&totalReg);
131105b261ecSmrg    }
131205b261ecSmrg
13136747b715Smrg    return Success;
131405b261ecSmrg}
131505b261ecSmrg
131635c4bbdfSmrgint
131735c4bbdfSmrgPanoramiXPolyPoint(ClientPtr client)
131805b261ecSmrg{
131905b261ecSmrg    PanoramiXRes *gc, *draw;
132035c4bbdfSmrg    int result, npoint, j;
132135c4bbdfSmrg    xPoint *origPts;
132235c4bbdfSmrg    Bool isRoot;
132335c4bbdfSmrg
132405b261ecSmrg    REQUEST(xPolyPointReq);
132505b261ecSmrg
132605b261ecSmrg    REQUEST_AT_LEAST_SIZE(xPolyPointReq);
132705b261ecSmrg
132835c4bbdfSmrg    result = dixLookupResourceByClass((void **) &draw, stuff->drawable,
132935c4bbdfSmrg                                      XRC_DRAWABLE, client, DixWriteAccess);
13306747b715Smrg    if (result != Success)
133135c4bbdfSmrg        return (result == BadValue) ? BadDrawable : result;
133205b261ecSmrg
133335c4bbdfSmrg    if (IS_SHARED_PIXMAP(draw))
133435c4bbdfSmrg        return (*SavedProcVector[X_PolyPoint]) (client);
133505b261ecSmrg
133635c4bbdfSmrg    result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC,
133735c4bbdfSmrg                                     client, DixReadAccess);
13386747b715Smrg    if (result != Success)
133935c4bbdfSmrg        return result;
134005b261ecSmrg
134105b261ecSmrg    isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
13426747b715Smrg    npoint = bytes_to_int32((client->req_len << 2) - sizeof(xPolyPointReq));
134305b261ecSmrg    if (npoint > 0) {
134435c4bbdfSmrg        origPts = xallocarray(npoint, sizeof(xPoint));
134505b261ecSmrg        memcpy((char *) origPts, (char *) &stuff[1], npoint * sizeof(xPoint));
134635c4bbdfSmrg        FOR_NSCREENS_FORWARD(j) {
134705b261ecSmrg
134835c4bbdfSmrg            if (j)
134935c4bbdfSmrg                memcpy(&stuff[1], origPts, npoint * sizeof(xPoint));
135005b261ecSmrg
135105b261ecSmrg            if (isRoot) {
13526747b715Smrg                int x_off = screenInfo.screens[j]->x;
13536747b715Smrg                int y_off = screenInfo.screens[j]->y;
135405b261ecSmrg
135535c4bbdfSmrg                if (x_off || y_off) {
135635c4bbdfSmrg                    xPoint *pnts = (xPoint *) &stuff[1];
135735c4bbdfSmrg                    int i =
135835c4bbdfSmrg                        (stuff->coordMode == CoordModePrevious) ? 1 : npoint;
135905b261ecSmrg
136035c4bbdfSmrg                    while (i--) {
136135c4bbdfSmrg                        pnts->x -= x_off;
136235c4bbdfSmrg                        pnts->y -= y_off;
136335c4bbdfSmrg                        pnts++;
136405b261ecSmrg                    }
136535c4bbdfSmrg                }
136605b261ecSmrg            }
136705b261ecSmrg
136835c4bbdfSmrg            stuff->drawable = draw->info[j].id;
136935c4bbdfSmrg            stuff->gc = gc->info[j].id;
137035c4bbdfSmrg            result = (*SavedProcVector[X_PolyPoint]) (client);
137135c4bbdfSmrg            if (result != Success)
137235c4bbdfSmrg                break;
137305b261ecSmrg        }
13746747b715Smrg        free(origPts);
13756747b715Smrg        return result;
137635c4bbdfSmrg    }
137735c4bbdfSmrg    else
137835c4bbdfSmrg        return Success;
137905b261ecSmrg}
138005b261ecSmrg
138135c4bbdfSmrgint
138235c4bbdfSmrgPanoramiXPolyLine(ClientPtr client)
138305b261ecSmrg{
138405b261ecSmrg    PanoramiXRes *gc, *draw;
138535c4bbdfSmrg    int result, npoint, j;
138635c4bbdfSmrg    xPoint *origPts;
138735c4bbdfSmrg    Bool isRoot;
138835c4bbdfSmrg
138905b261ecSmrg    REQUEST(xPolyLineReq);
139005b261ecSmrg
139105b261ecSmrg    REQUEST_AT_LEAST_SIZE(xPolyLineReq);
139205b261ecSmrg
139335c4bbdfSmrg    result = dixLookupResourceByClass((void **) &draw, stuff->drawable,
139435c4bbdfSmrg                                      XRC_DRAWABLE, client, DixWriteAccess);
13956747b715Smrg    if (result != Success)
139635c4bbdfSmrg        return (result == BadValue) ? BadDrawable : result;
139705b261ecSmrg
139835c4bbdfSmrg    if (IS_SHARED_PIXMAP(draw))
139935c4bbdfSmrg        return (*SavedProcVector[X_PolyLine]) (client);
140005b261ecSmrg
140135c4bbdfSmrg    result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC,
140235c4bbdfSmrg                                     client, DixReadAccess);
14036747b715Smrg    if (result != Success)
140435c4bbdfSmrg        return result;
140505b261ecSmrg
140635c4bbdfSmrg    isRoot = IS_ROOT_DRAWABLE(draw);
14076747b715Smrg    npoint = bytes_to_int32((client->req_len << 2) - sizeof(xPolyLineReq));
140835c4bbdfSmrg    if (npoint > 0) {
140935c4bbdfSmrg        origPts = xallocarray(npoint, sizeof(xPoint));
141005b261ecSmrg        memcpy((char *) origPts, (char *) &stuff[1], npoint * sizeof(xPoint));
141135c4bbdfSmrg        FOR_NSCREENS_FORWARD(j) {
141205b261ecSmrg
141335c4bbdfSmrg            if (j)
141435c4bbdfSmrg                memcpy(&stuff[1], origPts, npoint * sizeof(xPoint));
141505b261ecSmrg
141605b261ecSmrg            if (isRoot) {
14176747b715Smrg                int x_off = screenInfo.screens[j]->x;
14186747b715Smrg                int y_off = screenInfo.screens[j]->y;
141905b261ecSmrg
142035c4bbdfSmrg                if (x_off || y_off) {
142135c4bbdfSmrg                    xPoint *pnts = (xPoint *) &stuff[1];
142235c4bbdfSmrg                    int i =
142335c4bbdfSmrg                        (stuff->coordMode == CoordModePrevious) ? 1 : npoint;
142405b261ecSmrg
142535c4bbdfSmrg                    while (i--) {
142635c4bbdfSmrg                        pnts->x -= x_off;
142735c4bbdfSmrg                        pnts->y -= y_off;
142835c4bbdfSmrg                        pnts++;
142935c4bbdfSmrg                    }
143035c4bbdfSmrg                }
143105b261ecSmrg            }
143205b261ecSmrg
143335c4bbdfSmrg            stuff->drawable = draw->info[j].id;
143435c4bbdfSmrg            stuff->gc = gc->info[j].id;
143535c4bbdfSmrg            result = (*SavedProcVector[X_PolyLine]) (client);
143635c4bbdfSmrg            if (result != Success)
143735c4bbdfSmrg                break;
143805b261ecSmrg        }
14396747b715Smrg        free(origPts);
14406747b715Smrg        return result;
144135c4bbdfSmrg    }
144235c4bbdfSmrg    else
144335c4bbdfSmrg        return Success;
144405b261ecSmrg}
144505b261ecSmrg
144635c4bbdfSmrgint
144735c4bbdfSmrgPanoramiXPolySegment(ClientPtr client)
144805b261ecSmrg{
144935c4bbdfSmrg    int result, nsegs, i, j;
145005b261ecSmrg    PanoramiXRes *gc, *draw;
145135c4bbdfSmrg    xSegment *origSegs;
145235c4bbdfSmrg    Bool isRoot;
145335c4bbdfSmrg
145405b261ecSmrg    REQUEST(xPolySegmentReq);
145505b261ecSmrg
145605b261ecSmrg    REQUEST_AT_LEAST_SIZE(xPolySegmentReq);
145705b261ecSmrg
145835c4bbdfSmrg    result = dixLookupResourceByClass((void **) &draw, stuff->drawable,
145935c4bbdfSmrg                                      XRC_DRAWABLE, client, DixWriteAccess);
14606747b715Smrg    if (result != Success)
146135c4bbdfSmrg        return (result == BadValue) ? BadDrawable : result;
146205b261ecSmrg
146335c4bbdfSmrg    if (IS_SHARED_PIXMAP(draw))
146435c4bbdfSmrg        return (*SavedProcVector[X_PolySegment]) (client);
146505b261ecSmrg
146635c4bbdfSmrg    result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC,
146735c4bbdfSmrg                                     client, DixReadAccess);
14686747b715Smrg    if (result != Success)
146935c4bbdfSmrg        return result;
147005b261ecSmrg
147135c4bbdfSmrg    isRoot = IS_ROOT_DRAWABLE(draw);
147205b261ecSmrg
147305b261ecSmrg    nsegs = (client->req_len << 2) - sizeof(xPolySegmentReq);
147435c4bbdfSmrg    if (nsegs & 4)
147535c4bbdfSmrg        return BadLength;
147605b261ecSmrg    nsegs >>= 3;
147705b261ecSmrg    if (nsegs > 0) {
147835c4bbdfSmrg        origSegs = xallocarray(nsegs, sizeof(xSegment));
147905b261ecSmrg        memcpy((char *) origSegs, (char *) &stuff[1], nsegs * sizeof(xSegment));
148035c4bbdfSmrg        FOR_NSCREENS_FORWARD(j) {
148105b261ecSmrg
148235c4bbdfSmrg            if (j)
148335c4bbdfSmrg                memcpy(&stuff[1], origSegs, nsegs * sizeof(xSegment));
148405b261ecSmrg
148505b261ecSmrg            if (isRoot) {
14866747b715Smrg                int x_off = screenInfo.screens[j]->x;
14876747b715Smrg                int y_off = screenInfo.screens[j]->y;
148805b261ecSmrg
148935c4bbdfSmrg                if (x_off || y_off) {
149035c4bbdfSmrg                    xSegment *segs = (xSegment *) &stuff[1];
149105b261ecSmrg
149235c4bbdfSmrg                    for (i = nsegs; i--; segs++) {
149335c4bbdfSmrg                        segs->x1 -= x_off;
149435c4bbdfSmrg                        segs->x2 -= x_off;
149535c4bbdfSmrg                        segs->y1 -= y_off;
149635c4bbdfSmrg                        segs->y2 -= y_off;
149735c4bbdfSmrg                    }
149835c4bbdfSmrg                }
149905b261ecSmrg            }
150005b261ecSmrg
150135c4bbdfSmrg            stuff->drawable = draw->info[j].id;
150235c4bbdfSmrg            stuff->gc = gc->info[j].id;
150335c4bbdfSmrg            result = (*SavedProcVector[X_PolySegment]) (client);
150435c4bbdfSmrg            if (result != Success)
150535c4bbdfSmrg                break;
150635c4bbdfSmrg        }
150735c4bbdfSmrg        free(origSegs);
150835c4bbdfSmrg        return result;
150935c4bbdfSmrg    }
151035c4bbdfSmrg    else
151135c4bbdfSmrg        return Success;
151205b261ecSmrg}
151305b261ecSmrg
151435c4bbdfSmrgint
151535c4bbdfSmrgPanoramiXPolyRectangle(ClientPtr client)
151605b261ecSmrg{
151735c4bbdfSmrg    int result, nrects, i, j;
151805b261ecSmrg    PanoramiXRes *gc, *draw;
151935c4bbdfSmrg    Bool isRoot;
152035c4bbdfSmrg    xRectangle *origRecs;
152135c4bbdfSmrg
152205b261ecSmrg    REQUEST(xPolyRectangleReq);
152305b261ecSmrg
152405b261ecSmrg    REQUEST_AT_LEAST_SIZE(xPolyRectangleReq);
152505b261ecSmrg
152635c4bbdfSmrg    result = dixLookupResourceByClass((void **) &draw, stuff->drawable,
152735c4bbdfSmrg                                      XRC_DRAWABLE, client, DixWriteAccess);
15286747b715Smrg    if (result != Success)
152935c4bbdfSmrg        return (result == BadValue) ? BadDrawable : result;
153005b261ecSmrg
153135c4bbdfSmrg    if (IS_SHARED_PIXMAP(draw))
153235c4bbdfSmrg        return (*SavedProcVector[X_PolyRectangle]) (client);
153305b261ecSmrg
153435c4bbdfSmrg    result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC,
153535c4bbdfSmrg                                     client, DixReadAccess);
15366747b715Smrg    if (result != Success)
153735c4bbdfSmrg        return result;
153805b261ecSmrg
153935c4bbdfSmrg    isRoot = IS_ROOT_DRAWABLE(draw);
154005b261ecSmrg
154105b261ecSmrg    nrects = (client->req_len << 2) - sizeof(xPolyRectangleReq);
154235c4bbdfSmrg    if (nrects & 4)
154335c4bbdfSmrg        return BadLength;
154405b261ecSmrg    nrects >>= 3;
154535c4bbdfSmrg    if (nrects > 0) {
154635c4bbdfSmrg        origRecs = xallocarray(nrects, sizeof(xRectangle));
154735c4bbdfSmrg        memcpy((char *) origRecs, (char *) &stuff[1],
154835c4bbdfSmrg               nrects * sizeof(xRectangle));
154935c4bbdfSmrg        FOR_NSCREENS_FORWARD(j) {
155035c4bbdfSmrg
155135c4bbdfSmrg            if (j)
155235c4bbdfSmrg                memcpy(&stuff[1], origRecs, nrects * sizeof(xRectangle));
155305b261ecSmrg
155435c4bbdfSmrg            if (isRoot) {
155535c4bbdfSmrg                int x_off = screenInfo.screens[j]->x;
155635c4bbdfSmrg                int y_off = screenInfo.screens[j]->y;
155705b261ecSmrg
155835c4bbdfSmrg                if (x_off || y_off) {
155935c4bbdfSmrg                    xRectangle *rects = (xRectangle *) &stuff[1];
156035c4bbdfSmrg
156135c4bbdfSmrg                    for (i = nrects; i--; rects++) {
156235c4bbdfSmrg                        rects->x -= x_off;
156335c4bbdfSmrg                        rects->y -= y_off;
156435c4bbdfSmrg                    }
156535c4bbdfSmrg                }
156635c4bbdfSmrg            }
156735c4bbdfSmrg
156835c4bbdfSmrg            stuff->drawable = draw->info[j].id;
156935c4bbdfSmrg            stuff->gc = gc->info[j].id;
157035c4bbdfSmrg            result = (*SavedProcVector[X_PolyRectangle]) (client);
157135c4bbdfSmrg            if (result != Success)
157235c4bbdfSmrg                break;
157335c4bbdfSmrg        }
157435c4bbdfSmrg        free(origRecs);
157535c4bbdfSmrg        return result;
157635c4bbdfSmrg    }
157735c4bbdfSmrg    else
157835c4bbdfSmrg        return Success;
157935c4bbdfSmrg}
158035c4bbdfSmrg
158135c4bbdfSmrgint
158235c4bbdfSmrgPanoramiXPolyArc(ClientPtr client)
158305b261ecSmrg{
158435c4bbdfSmrg    int result, narcs, i, j;
158505b261ecSmrg    PanoramiXRes *gc, *draw;
158635c4bbdfSmrg    Bool isRoot;
158735c4bbdfSmrg    xArc *origArcs;
158835c4bbdfSmrg
158905b261ecSmrg    REQUEST(xPolyArcReq);
159005b261ecSmrg
159105b261ecSmrg    REQUEST_AT_LEAST_SIZE(xPolyArcReq);
159205b261ecSmrg
159335c4bbdfSmrg    result = dixLookupResourceByClass((void **) &draw, stuff->drawable,
159435c4bbdfSmrg                                      XRC_DRAWABLE, client, DixWriteAccess);
15956747b715Smrg    if (result != Success)
159635c4bbdfSmrg        return (result == BadValue) ? BadDrawable : result;
159705b261ecSmrg
159835c4bbdfSmrg    if (IS_SHARED_PIXMAP(draw))
159935c4bbdfSmrg        return (*SavedProcVector[X_PolyArc]) (client);
160005b261ecSmrg
160135c4bbdfSmrg    result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC,
160235c4bbdfSmrg                                     client, DixReadAccess);
16036747b715Smrg    if (result != Success)
160435c4bbdfSmrg        return result;
160505b261ecSmrg
160635c4bbdfSmrg    isRoot = IS_ROOT_DRAWABLE(draw);
160705b261ecSmrg
160805b261ecSmrg    narcs = (client->req_len << 2) - sizeof(xPolyArcReq);
160935c4bbdfSmrg    if (narcs % sizeof(xArc))
161035c4bbdfSmrg        return BadLength;
161105b261ecSmrg    narcs /= sizeof(xArc);
161235c4bbdfSmrg    if (narcs > 0) {
161335c4bbdfSmrg        origArcs = xallocarray(narcs, sizeof(xArc));
161435c4bbdfSmrg        memcpy((char *) origArcs, (char *) &stuff[1], narcs * sizeof(xArc));
161535c4bbdfSmrg        FOR_NSCREENS_FORWARD(j) {
161635c4bbdfSmrg
161735c4bbdfSmrg            if (j)
161835c4bbdfSmrg                memcpy(&stuff[1], origArcs, narcs * sizeof(xArc));
161935c4bbdfSmrg
162035c4bbdfSmrg            if (isRoot) {
162135c4bbdfSmrg                int x_off = screenInfo.screens[j]->x;
162235c4bbdfSmrg                int y_off = screenInfo.screens[j]->y;
162335c4bbdfSmrg
162435c4bbdfSmrg                if (x_off || y_off) {
162535c4bbdfSmrg                    xArc *arcs = (xArc *) &stuff[1];
162635c4bbdfSmrg
162735c4bbdfSmrg                    for (i = narcs; i--; arcs++) {
162835c4bbdfSmrg                        arcs->x -= x_off;
162935c4bbdfSmrg                        arcs->y -= y_off;
163035c4bbdfSmrg                    }
163135c4bbdfSmrg                }
163205b261ecSmrg            }
163335c4bbdfSmrg            stuff->drawable = draw->info[j].id;
163435c4bbdfSmrg            stuff->gc = gc->info[j].id;
163535c4bbdfSmrg            result = (*SavedProcVector[X_PolyArc]) (client);
163635c4bbdfSmrg            if (result != Success)
163735c4bbdfSmrg                break;
163805b261ecSmrg        }
163935c4bbdfSmrg        free(origArcs);
164035c4bbdfSmrg        return result;
164135c4bbdfSmrg    }
164235c4bbdfSmrg    else
164335c4bbdfSmrg        return Success;
164405b261ecSmrg}
164505b261ecSmrg
164635c4bbdfSmrgint
164735c4bbdfSmrgPanoramiXFillPoly(ClientPtr client)
164805b261ecSmrg{
164935c4bbdfSmrg    int result, count, j;
165005b261ecSmrg    PanoramiXRes *gc, *draw;
165135c4bbdfSmrg    Bool isRoot;
165235c4bbdfSmrg    DDXPointPtr locPts;
165335c4bbdfSmrg
165405b261ecSmrg    REQUEST(xFillPolyReq);
165505b261ecSmrg
165605b261ecSmrg    REQUEST_AT_LEAST_SIZE(xFillPolyReq);
165705b261ecSmrg
165835c4bbdfSmrg    result = dixLookupResourceByClass((void **) &draw, stuff->drawable,
165935c4bbdfSmrg                                      XRC_DRAWABLE, client, DixWriteAccess);
16606747b715Smrg    if (result != Success)
166135c4bbdfSmrg        return (result == BadValue) ? BadDrawable : result;
166205b261ecSmrg
166335c4bbdfSmrg    if (IS_SHARED_PIXMAP(draw))
166435c4bbdfSmrg        return (*SavedProcVector[X_FillPoly]) (client);
166505b261ecSmrg
166635c4bbdfSmrg    result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC,
166735c4bbdfSmrg                                     client, DixReadAccess);
16686747b715Smrg    if (result != Success)
166935c4bbdfSmrg        return result;
167005b261ecSmrg
167135c4bbdfSmrg    isRoot = IS_ROOT_DRAWABLE(draw);
167205b261ecSmrg
16736747b715Smrg    count = bytes_to_int32((client->req_len << 2) - sizeof(xFillPolyReq));
167435c4bbdfSmrg    if (count > 0) {
167535c4bbdfSmrg        locPts = xallocarray(count, sizeof(DDXPointRec));
167635c4bbdfSmrg        memcpy((char *) locPts, (char *) &stuff[1],
167735c4bbdfSmrg               count * sizeof(DDXPointRec));
167835c4bbdfSmrg        FOR_NSCREENS_FORWARD(j) {
167935c4bbdfSmrg
168035c4bbdfSmrg            if (j)
168135c4bbdfSmrg                memcpy(&stuff[1], locPts, count * sizeof(DDXPointRec));
168235c4bbdfSmrg
168335c4bbdfSmrg            if (isRoot) {
168435c4bbdfSmrg                int x_off = screenInfo.screens[j]->x;
168535c4bbdfSmrg                int y_off = screenInfo.screens[j]->y;
168605b261ecSmrg
168735c4bbdfSmrg                if (x_off || y_off) {
168835c4bbdfSmrg                    DDXPointPtr pnts = (DDXPointPtr) &stuff[1];
168935c4bbdfSmrg                    int i = (stuff->coordMode == CoordModePrevious) ? 1 : count;
169035c4bbdfSmrg
169135c4bbdfSmrg                    while (i--) {
169235c4bbdfSmrg                        pnts->x -= x_off;
169335c4bbdfSmrg                        pnts->y -= y_off;
169435c4bbdfSmrg                        pnts++;
169535c4bbdfSmrg                    }
169635c4bbdfSmrg                }
169735c4bbdfSmrg            }
169835c4bbdfSmrg
169935c4bbdfSmrg            stuff->drawable = draw->info[j].id;
170035c4bbdfSmrg            stuff->gc = gc->info[j].id;
170135c4bbdfSmrg            result = (*SavedProcVector[X_FillPoly]) (client);
170235c4bbdfSmrg            if (result != Success)
170335c4bbdfSmrg                break;
170435c4bbdfSmrg        }
170535c4bbdfSmrg        free(locPts);
170635c4bbdfSmrg        return result;
170735c4bbdfSmrg    }
170835c4bbdfSmrg    else
170935c4bbdfSmrg        return Success;
171035c4bbdfSmrg}
171105b261ecSmrg
171235c4bbdfSmrgint
171335c4bbdfSmrgPanoramiXPolyFillRectangle(ClientPtr client)
171405b261ecSmrg{
171535c4bbdfSmrg    int result, things, i, j;
171605b261ecSmrg    PanoramiXRes *gc, *draw;
171735c4bbdfSmrg    Bool isRoot;
171835c4bbdfSmrg    xRectangle *origRects;
171935c4bbdfSmrg
172005b261ecSmrg    REQUEST(xPolyFillRectangleReq);
172105b261ecSmrg
172205b261ecSmrg    REQUEST_AT_LEAST_SIZE(xPolyFillRectangleReq);
172305b261ecSmrg
172435c4bbdfSmrg    result = dixLookupResourceByClass((void **) &draw, stuff->drawable,
172535c4bbdfSmrg                                      XRC_DRAWABLE, client, DixWriteAccess);
17266747b715Smrg    if (result != Success)
172735c4bbdfSmrg        return (result == BadValue) ? BadDrawable : result;
172805b261ecSmrg
172935c4bbdfSmrg    if (IS_SHARED_PIXMAP(draw))
173035c4bbdfSmrg        return (*SavedProcVector[X_PolyFillRectangle]) (client);
173105b261ecSmrg
173235c4bbdfSmrg    result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC,
173335c4bbdfSmrg                                     client, DixReadAccess);
17346747b715Smrg    if (result != Success)
173535c4bbdfSmrg        return result;
173605b261ecSmrg
173735c4bbdfSmrg    isRoot = IS_ROOT_DRAWABLE(draw);
173805b261ecSmrg
173905b261ecSmrg    things = (client->req_len << 2) - sizeof(xPolyFillRectangleReq);
174035c4bbdfSmrg    if (things & 4)
174135c4bbdfSmrg        return BadLength;
174205b261ecSmrg    things >>= 3;
174335c4bbdfSmrg    if (things > 0) {
174435c4bbdfSmrg        origRects = xallocarray(things, sizeof(xRectangle));
174535c4bbdfSmrg        memcpy((char *) origRects, (char *) &stuff[1],
174635c4bbdfSmrg               things * sizeof(xRectangle));
174735c4bbdfSmrg        FOR_NSCREENS_FORWARD(j) {
174835c4bbdfSmrg
174935c4bbdfSmrg            if (j)
175035c4bbdfSmrg                memcpy(&stuff[1], origRects, things * sizeof(xRectangle));
175105b261ecSmrg
175235c4bbdfSmrg            if (isRoot) {
175335c4bbdfSmrg                int x_off = screenInfo.screens[j]->x;
175435c4bbdfSmrg                int y_off = screenInfo.screens[j]->y;
175535c4bbdfSmrg
175635c4bbdfSmrg                if (x_off || y_off) {
175735c4bbdfSmrg                    xRectangle *rects = (xRectangle *) &stuff[1];
175835c4bbdfSmrg
175935c4bbdfSmrg                    for (i = things; i--; rects++) {
176035c4bbdfSmrg                        rects->x -= x_off;
176135c4bbdfSmrg                        rects->y -= y_off;
176235c4bbdfSmrg                    }
176335c4bbdfSmrg                }
176435c4bbdfSmrg            }
176505b261ecSmrg
176635c4bbdfSmrg            stuff->drawable = draw->info[j].id;
176735c4bbdfSmrg            stuff->gc = gc->info[j].id;
176835c4bbdfSmrg            result = (*SavedProcVector[X_PolyFillRectangle]) (client);
176935c4bbdfSmrg            if (result != Success)
177035c4bbdfSmrg                break;
177135c4bbdfSmrg        }
177235c4bbdfSmrg        free(origRects);
177335c4bbdfSmrg        return result;
177435c4bbdfSmrg    }
177535c4bbdfSmrg    else
177635c4bbdfSmrg        return Success;
177735c4bbdfSmrg}
177835c4bbdfSmrg
177935c4bbdfSmrgint
178035c4bbdfSmrgPanoramiXPolyFillArc(ClientPtr client)
178105b261ecSmrg{
178205b261ecSmrg    PanoramiXRes *gc, *draw;
178335c4bbdfSmrg    Bool isRoot;
178435c4bbdfSmrg    int result, narcs, i, j;
178535c4bbdfSmrg    xArc *origArcs;
178635c4bbdfSmrg
178705b261ecSmrg    REQUEST(xPolyFillArcReq);
178805b261ecSmrg
178905b261ecSmrg    REQUEST_AT_LEAST_SIZE(xPolyFillArcReq);
179005b261ecSmrg
179135c4bbdfSmrg    result = dixLookupResourceByClass((void **) &draw, stuff->drawable,
179235c4bbdfSmrg                                      XRC_DRAWABLE, client, DixWriteAccess);
17936747b715Smrg    if (result != Success)
179435c4bbdfSmrg        return (result == BadValue) ? BadDrawable : result;
179505b261ecSmrg
179635c4bbdfSmrg    if (IS_SHARED_PIXMAP(draw))
179735c4bbdfSmrg        return (*SavedProcVector[X_PolyFillArc]) (client);
179805b261ecSmrg
179935c4bbdfSmrg    result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC,
180035c4bbdfSmrg                                     client, DixReadAccess);
18016747b715Smrg    if (result != Success)
180235c4bbdfSmrg        return result;
180305b261ecSmrg
180435c4bbdfSmrg    isRoot = IS_ROOT_DRAWABLE(draw);
180505b261ecSmrg
180605b261ecSmrg    narcs = (client->req_len << 2) - sizeof(xPolyFillArcReq);
180735c4bbdfSmrg    if (narcs % sizeof(xArc))
180835c4bbdfSmrg        return BadLength;
180905b261ecSmrg    narcs /= sizeof(xArc);
181005b261ecSmrg    if (narcs > 0) {
181135c4bbdfSmrg        origArcs = xallocarray(narcs, sizeof(xArc));
181235c4bbdfSmrg        memcpy((char *) origArcs, (char *) &stuff[1], narcs * sizeof(xArc));
181335c4bbdfSmrg        FOR_NSCREENS_FORWARD(j) {
181435c4bbdfSmrg
181535c4bbdfSmrg            if (j)
181635c4bbdfSmrg                memcpy(&stuff[1], origArcs, narcs * sizeof(xArc));
181735c4bbdfSmrg
181835c4bbdfSmrg            if (isRoot) {
181935c4bbdfSmrg                int x_off = screenInfo.screens[j]->x;
182035c4bbdfSmrg                int y_off = screenInfo.screens[j]->y;
182105b261ecSmrg
182235c4bbdfSmrg                if (x_off || y_off) {
182335c4bbdfSmrg                    xArc *arcs = (xArc *) &stuff[1];
182435c4bbdfSmrg
182535c4bbdfSmrg                    for (i = narcs; i--; arcs++) {
182635c4bbdfSmrg                        arcs->x -= x_off;
182735c4bbdfSmrg                        arcs->y -= y_off;
182835c4bbdfSmrg                    }
182935c4bbdfSmrg                }
183035c4bbdfSmrg            }
183105b261ecSmrg
183235c4bbdfSmrg            stuff->drawable = draw->info[j].id;
183335c4bbdfSmrg            stuff->gc = gc->info[j].id;
183435c4bbdfSmrg            result = (*SavedProcVector[X_PolyFillArc]) (client);
183535c4bbdfSmrg            if (result != Success)
183635c4bbdfSmrg                break;
183735c4bbdfSmrg        }
183835c4bbdfSmrg        free(origArcs);
183935c4bbdfSmrg        return result;
184035c4bbdfSmrg    }
184135c4bbdfSmrg    else
184235c4bbdfSmrg        return Success;
184335c4bbdfSmrg}
184435c4bbdfSmrg
184535c4bbdfSmrgint
184635c4bbdfSmrgPanoramiXPutImage(ClientPtr client)
184705b261ecSmrg{
184805b261ecSmrg    PanoramiXRes *gc, *draw;
184935c4bbdfSmrg    Bool isRoot;
185035c4bbdfSmrg    int j, result, orig_x, orig_y;
185135c4bbdfSmrg
185205b261ecSmrg    REQUEST(xPutImageReq);
185305b261ecSmrg
185405b261ecSmrg    REQUEST_AT_LEAST_SIZE(xPutImageReq);
185505b261ecSmrg
185635c4bbdfSmrg    result = dixLookupResourceByClass((void **) &draw, stuff->drawable,
185735c4bbdfSmrg                                      XRC_DRAWABLE, client, DixWriteAccess);
18586747b715Smrg    if (result != Success)
185935c4bbdfSmrg        return (result == BadValue) ? BadDrawable : result;
186005b261ecSmrg
186135c4bbdfSmrg    if (IS_SHARED_PIXMAP(draw))
186235c4bbdfSmrg        return (*SavedProcVector[X_PutImage]) (client);
186305b261ecSmrg
186435c4bbdfSmrg    result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC,
186535c4bbdfSmrg                                     client, DixReadAccess);
18666747b715Smrg    if (result != Success)
186735c4bbdfSmrg        return result;
186805b261ecSmrg
186935c4bbdfSmrg    isRoot = IS_ROOT_DRAWABLE(draw);
187005b261ecSmrg
187105b261ecSmrg    orig_x = stuff->dstX;
187205b261ecSmrg    orig_y = stuff->dstY;
187335c4bbdfSmrg    FOR_NSCREENS_BACKWARD(j) {
187435c4bbdfSmrg        if (isRoot) {
187535c4bbdfSmrg            stuff->dstX = orig_x - screenInfo.screens[j]->x;
187635c4bbdfSmrg            stuff->dstY = orig_y - screenInfo.screens[j]->y;
187735c4bbdfSmrg        }
187835c4bbdfSmrg        stuff->drawable = draw->info[j].id;
187935c4bbdfSmrg        stuff->gc = gc->info[j].id;
188035c4bbdfSmrg        result = (*SavedProcVector[X_PutImage]) (client);
188135c4bbdfSmrg        if (result != Success)
188235c4bbdfSmrg            break;
188305b261ecSmrg    }
18846747b715Smrg    return result;
188505b261ecSmrg}
188605b261ecSmrg
188735c4bbdfSmrgint
188835c4bbdfSmrgPanoramiXGetImage(ClientPtr client)
188905b261ecSmrg{
189035c4bbdfSmrg    DrawablePtr drawables[MAXSCREENS];
189135c4bbdfSmrg    DrawablePtr pDraw;
189235c4bbdfSmrg    PanoramiXRes *draw;
189335c4bbdfSmrg    xGetImageReply xgi;
189435c4bbdfSmrg    Bool isRoot;
189535c4bbdfSmrg    char *pBuf;
189635c4bbdfSmrg    int i, x, y, w, h, format, rc;
189735c4bbdfSmrg    Mask plane = 0, planemask;
189835c4bbdfSmrg    int linesDone, nlines, linesPerBuf;
189935c4bbdfSmrg    long widthBytesLine, length;
190005b261ecSmrg
190105b261ecSmrg    REQUEST(xGetImageReq);
190205b261ecSmrg
190305b261ecSmrg    REQUEST_SIZE_MATCH(xGetImageReq);
190405b261ecSmrg
190505b261ecSmrg    if ((stuff->format != XYPixmap) && (stuff->format != ZPixmap)) {
190635c4bbdfSmrg        client->errorValue = stuff->format;
19076747b715Smrg        return BadValue;
190805b261ecSmrg    }
190905b261ecSmrg
191035c4bbdfSmrg    rc = dixLookupResourceByClass((void **) &draw, stuff->drawable,
191135c4bbdfSmrg                                  XRC_DRAWABLE, client, DixReadAccess);
19126747b715Smrg    if (rc != Success)
191335c4bbdfSmrg        return (rc == BadValue) ? BadDrawable : rc;
191405b261ecSmrg
191535c4bbdfSmrg    if (draw->type == XRT_PIXMAP)
191635c4bbdfSmrg        return (*SavedProcVector[X_GetImage]) (client);
191705b261ecSmrg
191835c4bbdfSmrg    rc = dixLookupDrawable(&pDraw, stuff->drawable, client, 0, DixReadAccess);
191905b261ecSmrg    if (rc != Success)
192035c4bbdfSmrg        return rc;
192105b261ecSmrg
192235c4bbdfSmrg    if (!((WindowPtr) pDraw)->realized)
192335c4bbdfSmrg        return BadMatch;
192405b261ecSmrg
192505b261ecSmrg    x = stuff->x;
192605b261ecSmrg    y = stuff->y;
192705b261ecSmrg    w = stuff->width;
192805b261ecSmrg    h = stuff->height;
192905b261ecSmrg    format = stuff->format;
193005b261ecSmrg    planemask = stuff->planeMask;
193105b261ecSmrg
193235c4bbdfSmrg    isRoot = IS_ROOT_DRAWABLE(draw);
193305b261ecSmrg
193435c4bbdfSmrg    if (isRoot) {
193535c4bbdfSmrg        /* check for being onscreen */
193635c4bbdfSmrg        if (x < 0 || x + w > PanoramiXPixWidth ||
193735c4bbdfSmrg            y < 0 || y + h > PanoramiXPixHeight)
193835c4bbdfSmrg            return BadMatch;
193935c4bbdfSmrg    }
194035c4bbdfSmrg    else {
194135c4bbdfSmrg        /* check for being onscreen and inside of border */
194235c4bbdfSmrg        if (screenInfo.screens[0]->x + pDraw->x + x < 0 ||
194335c4bbdfSmrg            screenInfo.screens[0]->x + pDraw->x + x + w > PanoramiXPixWidth ||
194435c4bbdfSmrg            screenInfo.screens[0]->y + pDraw->y + y < 0 ||
194535c4bbdfSmrg            screenInfo.screens[0]->y + pDraw->y + y + h > PanoramiXPixHeight ||
194635c4bbdfSmrg            x < -wBorderWidth((WindowPtr) pDraw) ||
194735c4bbdfSmrg            x + w > wBorderWidth((WindowPtr) pDraw) + (int) pDraw->width ||
194835c4bbdfSmrg            y < -wBorderWidth((WindowPtr) pDraw) ||
194935c4bbdfSmrg            y + h > wBorderWidth((WindowPtr) pDraw) + (int) pDraw->height)
195035c4bbdfSmrg            return BadMatch;
195105b261ecSmrg    }
195205b261ecSmrg
195305b261ecSmrg    drawables[0] = pDraw;
195435c4bbdfSmrg    FOR_NSCREENS_FORWARD_SKIP(i) {
195535c4bbdfSmrg        rc = dixLookupDrawable(drawables + i, draw->info[i].id, client, 0,
195635c4bbdfSmrg                               DixGetAttrAccess);
195735c4bbdfSmrg        if (rc != Success)
195835c4bbdfSmrg            return rc;
195905b261ecSmrg    }
196005b261ecSmrg
196135c4bbdfSmrg    xgi = (xGetImageReply) {
196235c4bbdfSmrg        .type = X_Reply,
196335c4bbdfSmrg        .sequenceNumber = client->sequence,
196435c4bbdfSmrg        .visual = wVisual(((WindowPtr) pDraw)),
196535c4bbdfSmrg        .depth = pDraw->depth
196635c4bbdfSmrg    };
196735c4bbdfSmrg    if (format == ZPixmap) {
196835c4bbdfSmrg        widthBytesLine = PixmapBytePad(w, pDraw->depth);
196935c4bbdfSmrg        length = widthBytesLine * h;
197005b261ecSmrg
197135c4bbdfSmrg    }
197235c4bbdfSmrg    else {
197335c4bbdfSmrg        widthBytesLine = BitmapBytePad(w);
197435c4bbdfSmrg        plane = ((Mask) 1) << (pDraw->depth - 1);
197535c4bbdfSmrg        /* only planes asked for */
197635c4bbdfSmrg        length = widthBytesLine * h * Ones(planemask & (plane | (plane - 1)));
197705b261ecSmrg
197805b261ecSmrg    }
197905b261ecSmrg
19806747b715Smrg    xgi.length = bytes_to_int32(length);
198105b261ecSmrg
198205b261ecSmrg    if (widthBytesLine == 0 || h == 0)
198335c4bbdfSmrg        linesPerBuf = 0;
198405b261ecSmrg    else if (widthBytesLine >= XINERAMA_IMAGE_BUFSIZE)
198535c4bbdfSmrg        linesPerBuf = 1;
198605b261ecSmrg    else {
198735c4bbdfSmrg        linesPerBuf = XINERAMA_IMAGE_BUFSIZE / widthBytesLine;
198835c4bbdfSmrg        if (linesPerBuf > h)
198935c4bbdfSmrg            linesPerBuf = h;
199005b261ecSmrg    }
199135c4bbdfSmrg    if (!(pBuf = xallocarray(linesPerBuf, widthBytesLine)))
199235c4bbdfSmrg        return BadAlloc;
199305b261ecSmrg
199435c4bbdfSmrg    WriteReplyToClient(client, sizeof(xGetImageReply), &xgi);
199505b261ecSmrg
199605b261ecSmrg    if (linesPerBuf == 0) {
199735c4bbdfSmrg        /* nothing to do */
199805b261ecSmrg    }
199905b261ecSmrg    else if (format == ZPixmap) {
200005b261ecSmrg        linesDone = 0;
200105b261ecSmrg        while (h - linesDone > 0) {
200235c4bbdfSmrg            nlines = min(linesPerBuf, h - linesDone);
200305b261ecSmrg
200435c4bbdfSmrg            if (pDraw->depth == 1)
200535c4bbdfSmrg                memset(pBuf, 0, nlines * widthBytesLine);
200605b261ecSmrg
200735c4bbdfSmrg            XineramaGetImageData(drawables, x, y + linesDone, w, nlines,
200835c4bbdfSmrg                                 format, planemask, pBuf, widthBytesLine,
200935c4bbdfSmrg                                 isRoot);
201005b261ecSmrg
201135c4bbdfSmrg            WriteToClient(client, (int) (nlines * widthBytesLine), pBuf);
201235c4bbdfSmrg            linesDone += nlines;
201305b261ecSmrg        }
201435c4bbdfSmrg    }
201535c4bbdfSmrg    else {                      /* XYPixmap */
201605b261ecSmrg        for (; plane; plane >>= 1) {
201735c4bbdfSmrg            if (planemask & plane) {
201835c4bbdfSmrg                linesDone = 0;
201935c4bbdfSmrg                while (h - linesDone > 0) {
202035c4bbdfSmrg                    nlines = min(linesPerBuf, h - linesDone);
202105b261ecSmrg
202235c4bbdfSmrg                    memset(pBuf, 0, nlines * widthBytesLine);
202305b261ecSmrg
202435c4bbdfSmrg                    XineramaGetImageData(drawables, x, y + linesDone, w,
202535c4bbdfSmrg                                         nlines, format, plane, pBuf,
202635c4bbdfSmrg                                         widthBytesLine, isRoot);
202705b261ecSmrg
202835c4bbdfSmrg                    WriteToClient(client, (int)(nlines * widthBytesLine), pBuf);
202905b261ecSmrg
203035c4bbdfSmrg                    linesDone += nlines;
203135c4bbdfSmrg                }
203205b261ecSmrg            }
203335c4bbdfSmrg        }
203405b261ecSmrg    }
20356747b715Smrg    free(pBuf);
20366747b715Smrg    return Success;
203705b261ecSmrg}
203805b261ecSmrg
203905b261ecSmrg/* The text stuff should be rewritten so that duplication happens
204005b261ecSmrg   at the GlyphBlt level.  That is, loading the font and getting
204105b261ecSmrg   the glyphs should only happen once */
204205b261ecSmrg
204335c4bbdfSmrgint
204405b261ecSmrgPanoramiXPolyText8(ClientPtr client)
204505b261ecSmrg{
204605b261ecSmrg    PanoramiXRes *gc, *draw;
204735c4bbdfSmrg    Bool isRoot;
204835c4bbdfSmrg    int result, j;
204935c4bbdfSmrg    int orig_x, orig_y;
205035c4bbdfSmrg
205105b261ecSmrg    REQUEST(xPolyTextReq);
205205b261ecSmrg
205305b261ecSmrg    REQUEST_AT_LEAST_SIZE(xPolyTextReq);
205405b261ecSmrg
205535c4bbdfSmrg    result = dixLookupResourceByClass((void **) &draw, stuff->drawable,
205635c4bbdfSmrg                                      XRC_DRAWABLE, client, DixWriteAccess);
20576747b715Smrg    if (result != Success)
205835c4bbdfSmrg        return (result == BadValue) ? BadDrawable : result;
205905b261ecSmrg
206035c4bbdfSmrg    if (IS_SHARED_PIXMAP(draw))
206135c4bbdfSmrg        return (*SavedProcVector[X_PolyText8]) (client);
206205b261ecSmrg
206335c4bbdfSmrg    result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC,
206435c4bbdfSmrg                                     client, DixReadAccess);
20656747b715Smrg    if (result != Success)
206635c4bbdfSmrg        return result;
206705b261ecSmrg
206835c4bbdfSmrg    isRoot = IS_ROOT_DRAWABLE(draw);
206905b261ecSmrg
207005b261ecSmrg    orig_x = stuff->x;
207105b261ecSmrg    orig_y = stuff->y;
207235c4bbdfSmrg    FOR_NSCREENS_BACKWARD(j) {
207335c4bbdfSmrg        stuff->drawable = draw->info[j].id;
207435c4bbdfSmrg        stuff->gc = gc->info[j].id;
207535c4bbdfSmrg        if (isRoot) {
207635c4bbdfSmrg            stuff->x = orig_x - screenInfo.screens[j]->x;
207735c4bbdfSmrg            stuff->y = orig_y - screenInfo.screens[j]->y;
207835c4bbdfSmrg        }
207935c4bbdfSmrg        result = (*SavedProcVector[X_PolyText8]) (client);
208035c4bbdfSmrg        if (result != Success)
208135c4bbdfSmrg            break;
208205b261ecSmrg    }
20836747b715Smrg    return result;
208405b261ecSmrg}
208505b261ecSmrg
208635c4bbdfSmrgint
208705b261ecSmrgPanoramiXPolyText16(ClientPtr client)
208805b261ecSmrg{
208905b261ecSmrg    PanoramiXRes *gc, *draw;
209035c4bbdfSmrg    Bool isRoot;
209135c4bbdfSmrg    int result, j;
209235c4bbdfSmrg    int orig_x, orig_y;
209335c4bbdfSmrg
209405b261ecSmrg    REQUEST(xPolyTextReq);
209505b261ecSmrg
209605b261ecSmrg    REQUEST_AT_LEAST_SIZE(xPolyTextReq);
209705b261ecSmrg
209835c4bbdfSmrg    result = dixLookupResourceByClass((void **) &draw, stuff->drawable,
209935c4bbdfSmrg                                      XRC_DRAWABLE, client, DixWriteAccess);
21006747b715Smrg    if (result != Success)
210135c4bbdfSmrg        return (result == BadValue) ? BadDrawable : result;
210205b261ecSmrg
210335c4bbdfSmrg    if (IS_SHARED_PIXMAP(draw))
210435c4bbdfSmrg        return (*SavedProcVector[X_PolyText16]) (client);
210505b261ecSmrg
210635c4bbdfSmrg    result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC,
210735c4bbdfSmrg                                     client, DixReadAccess);
21086747b715Smrg    if (result != Success)
210935c4bbdfSmrg        return result;
211005b261ecSmrg
211135c4bbdfSmrg    isRoot = IS_ROOT_DRAWABLE(draw);
211205b261ecSmrg
211305b261ecSmrg    orig_x = stuff->x;
211405b261ecSmrg    orig_y = stuff->y;
211535c4bbdfSmrg    FOR_NSCREENS_BACKWARD(j) {
211635c4bbdfSmrg        stuff->drawable = draw->info[j].id;
211735c4bbdfSmrg        stuff->gc = gc->info[j].id;
211835c4bbdfSmrg        if (isRoot) {
211935c4bbdfSmrg            stuff->x = orig_x - screenInfo.screens[j]->x;
212035c4bbdfSmrg            stuff->y = orig_y - screenInfo.screens[j]->y;
212135c4bbdfSmrg        }
212235c4bbdfSmrg        result = (*SavedProcVector[X_PolyText16]) (client);
212335c4bbdfSmrg        if (result != Success)
212435c4bbdfSmrg            break;
212505b261ecSmrg    }
21266747b715Smrg    return result;
212705b261ecSmrg}
212805b261ecSmrg
212935c4bbdfSmrgint
213035c4bbdfSmrgPanoramiXImageText8(ClientPtr client)
213105b261ecSmrg{
213235c4bbdfSmrg    int result, j;
213305b261ecSmrg    PanoramiXRes *gc, *draw;
213435c4bbdfSmrg    Bool isRoot;
213535c4bbdfSmrg    int orig_x, orig_y;
213635c4bbdfSmrg
213705b261ecSmrg    REQUEST(xImageTextReq);
213805b261ecSmrg
213905b261ecSmrg    REQUEST_FIXED_SIZE(xImageTextReq, stuff->nChars);
214005b261ecSmrg
214135c4bbdfSmrg    result = dixLookupResourceByClass((void **) &draw, stuff->drawable,
214235c4bbdfSmrg                                      XRC_DRAWABLE, client, DixWriteAccess);
21436747b715Smrg    if (result != Success)
214435c4bbdfSmrg        return (result == BadValue) ? BadDrawable : result;
214505b261ecSmrg
214635c4bbdfSmrg    if (IS_SHARED_PIXMAP(draw))
214735c4bbdfSmrg        return (*SavedProcVector[X_ImageText8]) (client);
214805b261ecSmrg
214935c4bbdfSmrg    result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC,
215035c4bbdfSmrg                                     client, DixReadAccess);
21516747b715Smrg    if (result != Success)
215235c4bbdfSmrg        return result;
215305b261ecSmrg
215435c4bbdfSmrg    isRoot = IS_ROOT_DRAWABLE(draw);
215505b261ecSmrg
215605b261ecSmrg    orig_x = stuff->x;
215705b261ecSmrg    orig_y = stuff->y;
215835c4bbdfSmrg    FOR_NSCREENS_BACKWARD(j) {
215935c4bbdfSmrg        stuff->drawable = draw->info[j].id;
216035c4bbdfSmrg        stuff->gc = gc->info[j].id;
216135c4bbdfSmrg        if (isRoot) {
216235c4bbdfSmrg            stuff->x = orig_x - screenInfo.screens[j]->x;
216335c4bbdfSmrg            stuff->y = orig_y - screenInfo.screens[j]->y;
216435c4bbdfSmrg        }
216535c4bbdfSmrg        result = (*SavedProcVector[X_ImageText8]) (client);
216635c4bbdfSmrg        if (result != Success)
216735c4bbdfSmrg            break;
216805b261ecSmrg    }
21696747b715Smrg    return result;
217005b261ecSmrg}
217105b261ecSmrg
217235c4bbdfSmrgint
217335c4bbdfSmrgPanoramiXImageText16(ClientPtr client)
217405b261ecSmrg{
217535c4bbdfSmrg    int result, j;
217605b261ecSmrg    PanoramiXRes *gc, *draw;
217735c4bbdfSmrg    Bool isRoot;
217835c4bbdfSmrg    int orig_x, orig_y;
217935c4bbdfSmrg
218005b261ecSmrg    REQUEST(xImageTextReq);
218105b261ecSmrg
218205b261ecSmrg    REQUEST_FIXED_SIZE(xImageTextReq, stuff->nChars << 1);
218305b261ecSmrg
218435c4bbdfSmrg    result = dixLookupResourceByClass((void **) &draw, stuff->drawable,
218535c4bbdfSmrg                                      XRC_DRAWABLE, client, DixWriteAccess);
21866747b715Smrg    if (result != Success)
218735c4bbdfSmrg        return (result == BadValue) ? BadDrawable : result;
218805b261ecSmrg
218935c4bbdfSmrg    if (IS_SHARED_PIXMAP(draw))
219035c4bbdfSmrg        return (*SavedProcVector[X_ImageText16]) (client);
219105b261ecSmrg
219235c4bbdfSmrg    result = dixLookupResourceByType((void **) &gc, stuff->gc, XRT_GC,
219335c4bbdfSmrg                                     client, DixReadAccess);
21946747b715Smrg    if (result != Success)
219535c4bbdfSmrg        return result;
219605b261ecSmrg
219735c4bbdfSmrg    isRoot = IS_ROOT_DRAWABLE(draw);
219805b261ecSmrg
219905b261ecSmrg    orig_x = stuff->x;
220005b261ecSmrg    orig_y = stuff->y;
220135c4bbdfSmrg    FOR_NSCREENS_BACKWARD(j) {
220235c4bbdfSmrg        stuff->drawable = draw->info[j].id;
220335c4bbdfSmrg        stuff->gc = gc->info[j].id;
220435c4bbdfSmrg        if (isRoot) {
220535c4bbdfSmrg            stuff->x = orig_x - screenInfo.screens[j]->x;
220635c4bbdfSmrg            stuff->y = orig_y - screenInfo.screens[j]->y;
220735c4bbdfSmrg        }
220835c4bbdfSmrg        result = (*SavedProcVector[X_ImageText16]) (client);
220935c4bbdfSmrg        if (result != Success)
221035c4bbdfSmrg            break;
221105b261ecSmrg    }
22126747b715Smrg    return result;
221305b261ecSmrg}
221405b261ecSmrg
221535c4bbdfSmrgint
221635c4bbdfSmrgPanoramiXCreateColormap(ClientPtr client)
221705b261ecSmrg{
221835c4bbdfSmrg    PanoramiXRes *win, *newCmap;
221935c4bbdfSmrg    int result, j, orig_visual;
222035c4bbdfSmrg
222105b261ecSmrg    REQUEST(xCreateColormapReq);
222205b261ecSmrg
222305b261ecSmrg    REQUEST_SIZE_MATCH(xCreateColormapReq);
222405b261ecSmrg
222535c4bbdfSmrg    result = dixLookupResourceByType((void **) &win, stuff->window,
222635c4bbdfSmrg                                     XRT_WINDOW, client, DixReadAccess);
22276747b715Smrg    if (result != Success)
222835c4bbdfSmrg        return result;
222905b261ecSmrg
223035c4bbdfSmrg    if (!(newCmap = malloc(sizeof(PanoramiXRes))))
223105b261ecSmrg        return BadAlloc;
223205b261ecSmrg
223305b261ecSmrg    newCmap->type = XRT_COLORMAP;
223435c4bbdfSmrg    panoramix_setup_ids(newCmap, client, stuff->mid);
223505b261ecSmrg
223605b261ecSmrg    orig_visual = stuff->visual;
223735c4bbdfSmrg    FOR_NSCREENS_BACKWARD(j) {
223835c4bbdfSmrg        stuff->mid = newCmap->info[j].id;
223935c4bbdfSmrg        stuff->window = win->info[j].id;
224035c4bbdfSmrg        stuff->visual = PanoramiXTranslateVisualID(j, orig_visual);
224135c4bbdfSmrg        result = (*SavedProcVector[X_CreateColormap]) (client);
224235c4bbdfSmrg        if (result != Success)
224335c4bbdfSmrg            break;
224435c4bbdfSmrg    }
224535c4bbdfSmrg
224605b261ecSmrg    if (result == Success)
224705b261ecSmrg        AddResource(newCmap->info[0].id, XRT_COLORMAP, newCmap);
224835c4bbdfSmrg    else
22496747b715Smrg        free(newCmap);
225005b261ecSmrg
22516747b715Smrg    return result;
225205b261ecSmrg}
225305b261ecSmrg
225435c4bbdfSmrgint
225535c4bbdfSmrgPanoramiXFreeColormap(ClientPtr client)
225605b261ecSmrg{
225705b261ecSmrg    PanoramiXRes *cmap;
225835c4bbdfSmrg    int result, j;
225935c4bbdfSmrg
226005b261ecSmrg    REQUEST(xResourceReq);
226105b261ecSmrg
226205b261ecSmrg    REQUEST_SIZE_MATCH(xResourceReq);
226305b261ecSmrg
226405b261ecSmrg    client->errorValue = stuff->id;
226505b261ecSmrg
226635c4bbdfSmrg    result = dixLookupResourceByType((void **) &cmap, stuff->id, XRT_COLORMAP,
226735c4bbdfSmrg                                     client, DixDestroyAccess);
22686747b715Smrg    if (result != Success)
22696747b715Smrg        return result;
227005b261ecSmrg
227105b261ecSmrg    FOR_NSCREENS_BACKWARD(j) {
227205b261ecSmrg        stuff->id = cmap->info[j].id;
227335c4bbdfSmrg        result = (*SavedProcVector[X_FreeColormap]) (client);
227435c4bbdfSmrg        if (result != Success)
227535c4bbdfSmrg            break;
227605b261ecSmrg    }
227705b261ecSmrg
227805b261ecSmrg    /* Since ProcFreeColormap is using FreeResource, it will free
227935c4bbdfSmrg       our resource for us on the last pass through the loop above */
228005b261ecSmrg
22816747b715Smrg    return result;
228205b261ecSmrg}
228305b261ecSmrg
228405b261ecSmrgint
228505b261ecSmrgPanoramiXCopyColormapAndFree(ClientPtr client)
228605b261ecSmrg{
228705b261ecSmrg    PanoramiXRes *cmap, *newCmap;
228835c4bbdfSmrg    int result, j;
228935c4bbdfSmrg
229005b261ecSmrg    REQUEST(xCopyColormapAndFreeReq);
229105b261ecSmrg
229205b261ecSmrg    REQUEST_SIZE_MATCH(xCopyColormapAndFreeReq);
229305b261ecSmrg
229405b261ecSmrg    client->errorValue = stuff->srcCmap;
229505b261ecSmrg
229635c4bbdfSmrg    result = dixLookupResourceByType((void **) &cmap, stuff->srcCmap,
229735c4bbdfSmrg                                     XRT_COLORMAP, client,
229835c4bbdfSmrg                                     DixReadAccess | DixWriteAccess);
22996747b715Smrg    if (result != Success)
23006747b715Smrg        return result;
230105b261ecSmrg
230235c4bbdfSmrg    if (!(newCmap = malloc(sizeof(PanoramiXRes))))
230305b261ecSmrg        return BadAlloc;
230405b261ecSmrg
230505b261ecSmrg    newCmap->type = XRT_COLORMAP;
230635c4bbdfSmrg    panoramix_setup_ids(newCmap, client, stuff->mid);
230705b261ecSmrg
230835c4bbdfSmrg    FOR_NSCREENS_BACKWARD(j) {
230905b261ecSmrg        stuff->srcCmap = cmap->info[j].id;
231035c4bbdfSmrg        stuff->mid = newCmap->info[j].id;
231135c4bbdfSmrg        result = (*SavedProcVector[X_CopyColormapAndFree]) (client);
231235c4bbdfSmrg        if (result != Success)
231335c4bbdfSmrg            break;
231405b261ecSmrg    }
231505b261ecSmrg
231605b261ecSmrg    if (result == Success)
231705b261ecSmrg        AddResource(newCmap->info[0].id, XRT_COLORMAP, newCmap);
231835c4bbdfSmrg    else
23196747b715Smrg        free(newCmap);
232005b261ecSmrg
23216747b715Smrg    return result;
232205b261ecSmrg}
232305b261ecSmrg
232435c4bbdfSmrgint
232535c4bbdfSmrgPanoramiXInstallColormap(ClientPtr client)
232605b261ecSmrg{
232705b261ecSmrg    REQUEST(xResourceReq);
232835c4bbdfSmrg    int result, j;
232905b261ecSmrg    PanoramiXRes *cmap;
233005b261ecSmrg
233105b261ecSmrg    REQUEST_SIZE_MATCH(xResourceReq);
233205b261ecSmrg
233305b261ecSmrg    client->errorValue = stuff->id;
233405b261ecSmrg
233535c4bbdfSmrg    result = dixLookupResourceByType((void **) &cmap, stuff->id, XRT_COLORMAP,
233635c4bbdfSmrg                                     client, DixReadAccess);
23376747b715Smrg    if (result != Success)
23386747b715Smrg        return result;
233905b261ecSmrg
234035c4bbdfSmrg    FOR_NSCREENS_BACKWARD(j) {
234135c4bbdfSmrg        stuff->id = cmap->info[j].id;
234235c4bbdfSmrg        result = (*SavedProcVector[X_InstallColormap]) (client);
234335c4bbdfSmrg        if (result != Success)
234435c4bbdfSmrg            break;
234505b261ecSmrg    }
23466747b715Smrg    return result;
234705b261ecSmrg}
234805b261ecSmrg
234935c4bbdfSmrgint
235035c4bbdfSmrgPanoramiXUninstallColormap(ClientPtr client)
235105b261ecSmrg{
235205b261ecSmrg    REQUEST(xResourceReq);
235335c4bbdfSmrg    int result, j;
235405b261ecSmrg    PanoramiXRes *cmap;
235505b261ecSmrg
235605b261ecSmrg    REQUEST_SIZE_MATCH(xResourceReq);
235735c4bbdfSmrg
235805b261ecSmrg    client->errorValue = stuff->id;
235905b261ecSmrg
236035c4bbdfSmrg    result = dixLookupResourceByType((void **) &cmap, stuff->id, XRT_COLORMAP,
236135c4bbdfSmrg                                     client, DixReadAccess);
23626747b715Smrg    if (result != Success)
23636747b715Smrg        return result;
236405b261ecSmrg
236505b261ecSmrg    FOR_NSCREENS_BACKWARD(j) {
236635c4bbdfSmrg        stuff->id = cmap->info[j].id;
236735c4bbdfSmrg        result = (*SavedProcVector[X_UninstallColormap]) (client);
236835c4bbdfSmrg        if (result != Success)
236935c4bbdfSmrg            break;
237005b261ecSmrg    }
23716747b715Smrg    return result;
237205b261ecSmrg}
237305b261ecSmrg
237435c4bbdfSmrgint
237535c4bbdfSmrgPanoramiXAllocColor(ClientPtr client)
237605b261ecSmrg{
237735c4bbdfSmrg    int result, j;
237805b261ecSmrg    PanoramiXRes *cmap;
237935c4bbdfSmrg
238005b261ecSmrg    REQUEST(xAllocColorReq);
238105b261ecSmrg
238205b261ecSmrg    REQUEST_SIZE_MATCH(xAllocColorReq);
238305b261ecSmrg
238405b261ecSmrg    client->errorValue = stuff->cmap;
238505b261ecSmrg
238635c4bbdfSmrg    result = dixLookupResourceByType((void **) &cmap, stuff->cmap,
238735c4bbdfSmrg                                     XRT_COLORMAP, client, DixWriteAccess);
23886747b715Smrg    if (result != Success)
23896747b715Smrg        return result;
239005b261ecSmrg
239135c4bbdfSmrg    FOR_NSCREENS_BACKWARD(j) {
239235c4bbdfSmrg        stuff->cmap = cmap->info[j].id;
239335c4bbdfSmrg        result = (*SavedProcVector[X_AllocColor]) (client);
239435c4bbdfSmrg        if (result != Success)
239535c4bbdfSmrg            break;
239605b261ecSmrg    }
23976747b715Smrg    return result;
239805b261ecSmrg}
239905b261ecSmrg
240035c4bbdfSmrgint
240135c4bbdfSmrgPanoramiXAllocNamedColor(ClientPtr client)
240205b261ecSmrg{
240335c4bbdfSmrg    int result, j;
240435c4bbdfSmrg    PanoramiXRes *cmap;
240535c4bbdfSmrg
240605b261ecSmrg    REQUEST(xAllocNamedColorReq);
240705b261ecSmrg
240805b261ecSmrg    REQUEST_FIXED_SIZE(xAllocNamedColorReq, stuff->nbytes);
240905b261ecSmrg
241005b261ecSmrg    client->errorValue = stuff->cmap;
241105b261ecSmrg
241235c4bbdfSmrg    result = dixLookupResourceByType((void **) &cmap, stuff->cmap,
241335c4bbdfSmrg                                     XRT_COLORMAP, client, DixWriteAccess);
24146747b715Smrg    if (result != Success)
24156747b715Smrg        return result;
241605b261ecSmrg
241735c4bbdfSmrg    FOR_NSCREENS_BACKWARD(j) {
241805b261ecSmrg        stuff->cmap = cmap->info[j].id;
241935c4bbdfSmrg        result = (*SavedProcVector[X_AllocNamedColor]) (client);
242035c4bbdfSmrg        if (result != Success)
242135c4bbdfSmrg            break;
242205b261ecSmrg    }
24236747b715Smrg    return result;
242405b261ecSmrg}
242505b261ecSmrg
242635c4bbdfSmrgint
242735c4bbdfSmrgPanoramiXAllocColorCells(ClientPtr client)
242805b261ecSmrg{
242935c4bbdfSmrg    int result, j;
243035c4bbdfSmrg    PanoramiXRes *cmap;
243135c4bbdfSmrg
243205b261ecSmrg    REQUEST(xAllocColorCellsReq);
243305b261ecSmrg
243405b261ecSmrg    REQUEST_SIZE_MATCH(xAllocColorCellsReq);
243505b261ecSmrg
243605b261ecSmrg    client->errorValue = stuff->cmap;
243705b261ecSmrg
243835c4bbdfSmrg    result = dixLookupResourceByType((void **) &cmap, stuff->cmap,
243935c4bbdfSmrg                                     XRT_COLORMAP, client, DixWriteAccess);
24406747b715Smrg    if (result != Success)
24416747b715Smrg        return result;
244235c4bbdfSmrg
244335c4bbdfSmrg    FOR_NSCREENS_BACKWARD(j) {
244435c4bbdfSmrg        stuff->cmap = cmap->info[j].id;
244535c4bbdfSmrg        result = (*SavedProcVector[X_AllocColorCells]) (client);
244635c4bbdfSmrg        if (result != Success)
244735c4bbdfSmrg            break;
244805b261ecSmrg    }
24496747b715Smrg    return result;
245005b261ecSmrg}
245105b261ecSmrg
245235c4bbdfSmrgint
245335c4bbdfSmrgPanoramiXAllocColorPlanes(ClientPtr client)
245405b261ecSmrg{
245535c4bbdfSmrg    int result, j;
245635c4bbdfSmrg    PanoramiXRes *cmap;
245735c4bbdfSmrg
245805b261ecSmrg    REQUEST(xAllocColorPlanesReq);
245905b261ecSmrg
246005b261ecSmrg    REQUEST_SIZE_MATCH(xAllocColorPlanesReq);
246105b261ecSmrg
246205b261ecSmrg    client->errorValue = stuff->cmap;
246305b261ecSmrg
246435c4bbdfSmrg    result = dixLookupResourceByType((void **) &cmap, stuff->cmap,
246535c4bbdfSmrg                                     XRT_COLORMAP, client, DixWriteAccess);
24666747b715Smrg    if (result != Success)
24676747b715Smrg        return result;
246835c4bbdfSmrg
246935c4bbdfSmrg    FOR_NSCREENS_BACKWARD(j) {
247035c4bbdfSmrg        stuff->cmap = cmap->info[j].id;
247135c4bbdfSmrg        result = (*SavedProcVector[X_AllocColorPlanes]) (client);
247235c4bbdfSmrg        if (result != Success)
247335c4bbdfSmrg            break;
247405b261ecSmrg    }
24756747b715Smrg    return result;
247605b261ecSmrg}
247705b261ecSmrg
247835c4bbdfSmrgint
247935c4bbdfSmrgPanoramiXFreeColors(ClientPtr client)
248005b261ecSmrg{
248135c4bbdfSmrg    int result, j;
248235c4bbdfSmrg    PanoramiXRes *cmap;
248335c4bbdfSmrg
248405b261ecSmrg    REQUEST(xFreeColorsReq);
248505b261ecSmrg
248605b261ecSmrg    REQUEST_AT_LEAST_SIZE(xFreeColorsReq);
248705b261ecSmrg
248805b261ecSmrg    client->errorValue = stuff->cmap;
248905b261ecSmrg
249035c4bbdfSmrg    result = dixLookupResourceByType((void **) &cmap, stuff->cmap,
249135c4bbdfSmrg                                     XRT_COLORMAP, client, DixWriteAccess);
24926747b715Smrg    if (result != Success)
24936747b715Smrg        return result;
249405b261ecSmrg
249505b261ecSmrg    FOR_NSCREENS_BACKWARD(j) {
249605b261ecSmrg        stuff->cmap = cmap->info[j].id;
249735c4bbdfSmrg        result = (*SavedProcVector[X_FreeColors]) (client);
249805b261ecSmrg    }
24996747b715Smrg    return result;
250005b261ecSmrg}
250105b261ecSmrg
250235c4bbdfSmrgint
250335c4bbdfSmrgPanoramiXStoreColors(ClientPtr client)
250405b261ecSmrg{
250535c4bbdfSmrg    int result, j;
250635c4bbdfSmrg    PanoramiXRes *cmap;
250735c4bbdfSmrg
250805b261ecSmrg    REQUEST(xStoreColorsReq);
250905b261ecSmrg
251005b261ecSmrg    REQUEST_AT_LEAST_SIZE(xStoreColorsReq);
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;
251805b261ecSmrg
251935c4bbdfSmrg    FOR_NSCREENS_BACKWARD(j) {
252035c4bbdfSmrg        stuff->cmap = cmap->info[j].id;
252135c4bbdfSmrg        result = (*SavedProcVector[X_StoreColors]) (client);
252235c4bbdfSmrg        if (result != Success)
252335c4bbdfSmrg            break;
252405b261ecSmrg    }
25256747b715Smrg    return result;
252605b261ecSmrg}
252705b261ecSmrg
252835c4bbdfSmrgint
252935c4bbdfSmrgPanoramiXStoreNamedColor(ClientPtr client)
253005b261ecSmrg{
253135c4bbdfSmrg    int result, j;
253235c4bbdfSmrg    PanoramiXRes *cmap;
253335c4bbdfSmrg
253405b261ecSmrg    REQUEST(xStoreNamedColorReq);
253505b261ecSmrg
253605b261ecSmrg    REQUEST_FIXED_SIZE(xStoreNamedColorReq, stuff->nbytes);
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
254535c4bbdfSmrg    FOR_NSCREENS_BACKWARD(j) {
254635c4bbdfSmrg        stuff->cmap = cmap->info[j].id;
254735c4bbdfSmrg        result = (*SavedProcVector[X_StoreNamedColor]) (client);
254835c4bbdfSmrg        if (result != Success)
254935c4bbdfSmrg            break;
255005b261ecSmrg    }
25516747b715Smrg    return result;
255205b261ecSmrg}
2553