A window's DrawableRec's x and y fields contain the offsets to be
applied to protocol-visible window-relative coordinates in order to make
those coordinates screen-relative instead. When Xinerama is active,
coordinates relative to the root window need to be adjusted for each
screen by the position of that screen in the logical root coordinate
space, so (-pScreen->x) and (-pScreen->y) are the natural values for
the root drawable's x and y offsets.

Other windows still have root-relative drawable coordinates, as if the
root window's coordinates were (0,0). See CreateWindow.

This eliminates special cases throughout the Xinerama layer that needed
to adjust coordinates as specified by clients if they were used relative
to a root window.

Signed-off-by: Jamey Sharp <[email protected]>
---
I'm not proposing this for 1.9--in fact I've only compile-tested it and
it's probably wrong somehow. But I'd like to get feedback on whether a
patch like this one is a good idea and what it breaks.

If this approach is good, I have or can write patches to move ValidateGC
and DestroyGC from GCFuncs to ScreenRec, and eliminate the other five
GCFuncs. The patches I have along those lines so far kill 730 lines of
code, on top of the 800 removed here, and promise more to come.

This change also makes my experimental xinerama-rework branch more
feasible. That branch already kills 1,000 lines of code, and should be
able to kill more if this patch works--I got stuck trying to deal with
root-window offsets, and this patch sidesteps that problem entirely.

I think I'm getting toward being able to kill off the Xinerama layer
entirely, without losing its functionality, while making hotplug screens
feasible. If I figure out what I mean by that, I'll let you know. :-)

 dix/window.c          |   14 +-
 Xext/panoramiX.c      |  243 +++---------------------------
 Xext/panoramiXprocs.c |  409 +++----------------------------------------------
 Xext/shm.c            |   38 ++---
 Xext/xvdisp.c         |   56 +-------
 Xi/xiquerypointer.c   |    4 +-
 render/render.c       |  188 +----------------------
 7 files changed, 77 insertions(+), 875 deletions(-)

diff --git a/dix/window.c b/dix/window.c
index 4a47dd5..6d89bae 100644
--- a/dix/window.c
+++ b/dix/window.c
@@ -405,7 +405,8 @@ CreateRootWindow(ScreenPtr pScreen)
     pWin->origin.x = pWin->origin.y = 0;
     pWin->drawable.height = pScreen->height;
     pWin->drawable.width = pScreen->width;
-    pWin->drawable.x = pWin->drawable.y = 0;
+    pWin->drawable.x = -pScreen->x;
+    pWin->drawable.y = -pScreen->y;
 
     box.x1 = 0;
     box.y1 = 0;
@@ -685,12 +686,15 @@ CreateWindow(Window wid, WindowPtr pParent, int x, int y, 
unsigned w,
     if (pWin->borderIsPixel == FALSE)
        pWin->border.pixmap->refcnt++;
                
-    pWin->origin.x = x + (int)bw;
-    pWin->origin.y = y + (int)bw;
     pWin->drawable.width = w;
     pWin->drawable.height = h;
-    pWin->drawable.x = pParent->drawable.x + x + (int)bw;
-    pWin->drawable.y = pParent->drawable.y + y + (int)bw;
+    pWin->drawable.x = pWin->origin.x = x + (int)bw;
+    pWin->drawable.y = pWin->origin.y = y + (int)bw;
+    if (pParent->parent)
+    {
+       pWin->drawable.x += pParent->drawable.x;
+       pWin->drawable.y += pParent->drawable.y;
+    }
 
        /* set up clip list correctly for unobscured WindowPtr */
     RegionNull(&pWin->clipList);
diff --git a/Xext/panoramiX.c b/Xext/panoramiX.c
index b73c53f..ed7c291 100644
--- a/Xext/panoramiX.c
+++ b/Xext/panoramiX.c
@@ -103,45 +103,13 @@ static void PanoramiXResetProc(ExtensionEntry*);
 
 int (* SavedProcVector[256]) (ClientPtr client) = { NULL, };
 
-static DevPrivateKeyRec PanoramiXGCKeyRec;
-#define PanoramiXGCKey (&PanoramiXGCKeyRec)
 static DevPrivateKeyRec PanoramiXScreenKeyRec;
 #define PanoramiXScreenKey (&PanoramiXScreenKeyRec)
 
 typedef struct {
-  DDXPointRec clipOrg;
-  DDXPointRec patOrg;
-  GCFuncs *wrapFuncs;
-} PanoramiXGCRec, *PanoramiXGCPtr;
-
-typedef struct {
-  CreateGCProcPtr      CreateGC;
   CloseScreenProcPtr   CloseScreen;
 } PanoramiXScreenRec, *PanoramiXScreenPtr;
 
-static void XineramaValidateGC(GCPtr, unsigned long, DrawablePtr);
-static void XineramaChangeGC(GCPtr, unsigned long);
-static void XineramaCopyGC(GCPtr, unsigned long, GCPtr);
-static void XineramaDestroyGC(GCPtr);
-static void XineramaChangeClip(GCPtr, int, pointer, int);
-static void XineramaDestroyClip(GCPtr);
-static void XineramaCopyClip(GCPtr, GCPtr);
-
-static GCFuncs XineramaGCFuncs = {
-    XineramaValidateGC, XineramaChangeGC, XineramaCopyGC, XineramaDestroyGC,
-    XineramaChangeClip, XineramaDestroyClip, XineramaCopyClip
-};
-
-#define Xinerama_GC_FUNC_PROLOGUE(pGC)\
-    PanoramiXGCPtr  pGCPriv = (PanoramiXGCPtr) \
-       dixLookupPrivate(&(pGC)->devPrivates, PanoramiXGCKey); \
-    (pGC)->funcs = pGCPriv->wrapFuncs;
-
-#define Xinerama_GC_FUNC_EPILOGUE(pGC)\
-    pGCPriv->wrapFuncs = (pGC)->funcs;\
-    (pGC)->funcs = &XineramaGCFuncs;
-
-
 static Bool
 XineramaCloseScreen (int i, ScreenPtr pScreen)
 {
@@ -149,7 +117,6 @@ XineramaCloseScreen (int i, ScreenPtr pScreen)
        dixLookupPrivate(&pScreen->devPrivates, PanoramiXScreenKey);
 
     pScreen->CloseScreen = pScreenPriv->CloseScreen;
-    pScreen->CreateGC = pScreenPriv->CreateGC;
 
     if (pScreen->myNum == 0)
        RegionUninit(&PanoramiXScreenRegion);
@@ -159,168 +126,6 @@ XineramaCloseScreen (int i, ScreenPtr pScreen)
     return (*pScreen->CloseScreen) (i, pScreen);
 }
 
-static Bool
-XineramaCreateGC(GCPtr pGC)
-{
-    ScreenPtr pScreen = pGC->pScreen;
-    PanoramiXScreenPtr pScreenPriv = (PanoramiXScreenPtr)
-       dixLookupPrivate(&pScreen->devPrivates, PanoramiXScreenKey);
-    Bool ret;
-
-    pScreen->CreateGC = pScreenPriv->CreateGC;
-    if((ret = (*pScreen->CreateGC)(pGC))) {
-       PanoramiXGCPtr pGCPriv = (PanoramiXGCPtr)
-           dixLookupPrivate(&pGC->devPrivates, PanoramiXGCKey);
-
-       pGCPriv->wrapFuncs = pGC->funcs;
-        pGC->funcs = &XineramaGCFuncs;
-
-       pGCPriv->clipOrg.x = pGC->clipOrg.x; 
-       pGCPriv->clipOrg.y = pGC->clipOrg.y;
-       pGCPriv->patOrg.x = pGC->patOrg.x;
-       pGCPriv->patOrg.y = pGC->patOrg.y;
-    }
-    pScreen->CreateGC = XineramaCreateGC;
-
-    return ret;
-}
-
-static void
-XineramaValidateGC(
-   GCPtr         pGC,
-   unsigned long changes,
-   DrawablePtr   pDraw 
-){
-    Xinerama_GC_FUNC_PROLOGUE (pGC);
-
-    if((pDraw->type == DRAWABLE_WINDOW) && !(((WindowPtr)pDraw)->parent)) {
-       /* the root window */
-       int x_off = pGC->pScreen->x;
-       int y_off = pGC->pScreen->y;
-       int new_val;
-
-       new_val = pGCPriv->clipOrg.x - x_off;
-       if(pGC->clipOrg.x != new_val) {
-           pGC->clipOrg.x = new_val;
-           changes |= GCClipXOrigin;
-       }
-       new_val = pGCPriv->clipOrg.y - y_off;
-       if(pGC->clipOrg.y != new_val) {
-           pGC->clipOrg.y = new_val;
-           changes |= GCClipYOrigin;
-       }
-       new_val = pGCPriv->patOrg.x - x_off;
-       if(pGC->patOrg.x != new_val) {
-           pGC->patOrg.x = new_val;
-           changes |= GCTileStipXOrigin;
-       }
-       new_val = pGCPriv->patOrg.y - y_off;
-       if(pGC->patOrg.y != new_val) {
-           pGC->patOrg.y = new_val;
-           changes |= GCTileStipYOrigin;
-       }
-    } else {
-       if(pGC->clipOrg.x != pGCPriv->clipOrg.x) {
-           pGC->clipOrg.x = pGCPriv->clipOrg.x;
-           changes |= GCClipXOrigin;
-       }
-       if(pGC->clipOrg.y != pGCPriv->clipOrg.y) {
-           pGC->clipOrg.y = pGCPriv->clipOrg.y;
-           changes |= GCClipYOrigin;
-       }
-       if(pGC->patOrg.x != pGCPriv->patOrg.x) {
-           pGC->patOrg.x = pGCPriv->patOrg.x;
-           changes |= GCTileStipXOrigin;
-       }
-       if(pGC->patOrg.y != pGCPriv->patOrg.y) {
-           pGC->patOrg.y = pGCPriv->patOrg.y;
-           changes |= GCTileStipYOrigin;
-       }
-    }
-  
-    (*pGC->funcs->ValidateGC)(pGC, changes, pDraw);
-    Xinerama_GC_FUNC_EPILOGUE (pGC);
-}
-
-static void
-XineramaDestroyGC(GCPtr pGC)
-{
-    Xinerama_GC_FUNC_PROLOGUE (pGC);
-    (*pGC->funcs->DestroyGC)(pGC);
-    Xinerama_GC_FUNC_EPILOGUE (pGC);
-}
-
-static void
-XineramaChangeGC (
-    GCPtr          pGC,
-    unsigned long   mask
-){
-    Xinerama_GC_FUNC_PROLOGUE (pGC);
-
-    if(mask & GCTileStipXOrigin)
-       pGCPriv->patOrg.x = pGC->patOrg.x;
-    if(mask & GCTileStipYOrigin)
-       pGCPriv->patOrg.y = pGC->patOrg.y;
-    if(mask & GCClipXOrigin)
-       pGCPriv->clipOrg.x = pGC->clipOrg.x; 
-    if(mask & GCClipYOrigin)
-       pGCPriv->clipOrg.y = pGC->clipOrg.y;
-
-    (*pGC->funcs->ChangeGC) (pGC, mask);
-    Xinerama_GC_FUNC_EPILOGUE (pGC);
-}
-
-static void
-XineramaCopyGC (
-    GCPtr          pGCSrc, 
-    unsigned long   mask,
-    GCPtr          pGCDst
-){
-    PanoramiXGCPtr pSrcPriv = (PanoramiXGCPtr)
-       dixLookupPrivate(&pGCSrc->devPrivates, PanoramiXGCKey);
-    Xinerama_GC_FUNC_PROLOGUE (pGCDst);
-
-    if(mask & GCTileStipXOrigin)
-        pGCPriv->patOrg.x = pSrcPriv->patOrg.x;
-    if(mask & GCTileStipYOrigin)
-        pGCPriv->patOrg.y = pSrcPriv->patOrg.y;
-    if(mask & GCClipXOrigin)
-        pGCPriv->clipOrg.x = pSrcPriv->clipOrg.x;
-    if(mask & GCClipYOrigin)
-        pGCPriv->clipOrg.y = pSrcPriv->clipOrg.y;
-
-    (*pGCDst->funcs->CopyGC) (pGCSrc, mask, pGCDst);
-    Xinerama_GC_FUNC_EPILOGUE (pGCDst);
-}
-
-static void
-XineramaChangeClip (
-    GCPtr   pGC,
-    int                type,
-    pointer    pvalue,
-    int                nrects 
-){
-    Xinerama_GC_FUNC_PROLOGUE (pGC);
-    (*pGC->funcs->ChangeClip) (pGC, type, pvalue, nrects);
-    Xinerama_GC_FUNC_EPILOGUE (pGC);
-}
-
-static void
-XineramaCopyClip(GCPtr pgcDst, GCPtr pgcSrc)
-{
-    Xinerama_GC_FUNC_PROLOGUE (pgcDst);
-    (* pgcDst->funcs->CopyClip)(pgcDst, pgcSrc);
-    Xinerama_GC_FUNC_EPILOGUE (pgcDst);
-}
-
-static void
-XineramaDestroyClip(GCPtr pGC)
-{
-    Xinerama_GC_FUNC_PROLOGUE (pGC);
-    (* pGC->funcs->DestroyClip)(pGC);
-    Xinerama_GC_FUNC_EPILOGUE (pGC);
-}
-
 int
 XineramaDeleteResource(pointer data, XID id)
 {
@@ -448,11 +253,6 @@ void PanoramiXExtensionInit(int argc, char *argv[])
        return;
     }
 
-    if (!dixRegisterPrivateKey(&PanoramiXGCKeyRec, PRIVATE_GC, 
sizeof(PanoramiXGCRec))) {
-       noPanoramiXExtension = TRUE;
-       return;
-    }
-
     PanoramiXNumScreens = screenInfo.numScreens;
     if (PanoramiXNumScreens == 1) {            /* Only 1 screen        */
        noPanoramiXExtension = TRUE;
@@ -482,10 +282,8 @@ void PanoramiXExtensionInit(int argc, char *argv[])
                return;
           }
        
-          pScreenPriv->CreateGC = pScreen->CreateGC;
           pScreenPriv->CloseScreen = pScreen->CloseScreen;
        
-          pScreen->CreateGC = XineramaCreateGC;
           pScreen->CloseScreen = XineramaCloseScreen;
        }
 
@@ -1142,19 +940,15 @@ XineramaGetImageData(
 ){
     RegionRec SrcRegion, ScreenRegion, GrabRegion;
     BoxRec SrcBox, *pbox;
-    int x, y, w, h, i, j, nbox, size, sizeNeeded, ScratchPitch, inOut, depth;
+    int xoff, yoff, w, h, i, nbox, size, sizeNeeded, ScratchPitch, inOut, 
depth;
     DrawablePtr pDraw = pDrawables[0];
     char *ScratchMem = NULL;
 
     size = 0;
 
     /* find box in logical screen space */
-    SrcBox.x1 = left;
-    SrcBox.y1 = top;
-    if(!isRoot) {
-       SrcBox.x1 += pDraw->x + screenInfo.screens[0]->x;
-       SrcBox.y1 += pDraw->y + screenInfo.screens[0]->y;
-    }
+    SrcBox.x1 = left + pDraw->x + screenInfo.screens[0]->x;
+    SrcBox.y1 = top + pDraw->y + screenInfo.screens[0]->y;
     SrcBox.x2 = SrcBox.x1 + width;
     SrcBox.y2 = SrcBox.y1 + height;
     
@@ -1180,10 +974,15 @@ XineramaGetImageData(
            RegionIntersect(&GrabRegion, &SrcRegion, &ScreenRegion);
        RegionUninit(&ScreenRegion);
 
+       xoff = screenInfo.screens[i]->x;
+       yoff = screenInfo.screens[i]->y;
+       if(!isRoot) {
+           xoff += pDraw->x;
+           yoff += pDraw->y;
+       }
+
        if(inOut == rgnIN) {       
-           (*pScreen->GetImage)(pDraw,
-                       SrcBox.x1 - pDraw->x - screenInfo.screens[i]->x,
-                       SrcBox.y1 - pDraw->y - screenInfo.screens[i]->y,
+           (*pScreen->GetImage)(pDraw, SrcBox.x1 - xoff, SrcBox.y1 - yoff,
                        width, height, format, planemask, data);
            break;
        } else if (inOut == rgnOUT)
@@ -1211,19 +1010,15 @@ XineramaGetImageData(
                    }   
                }
 
-               x = pbox->x1 - pDraw->x - screenInfo.screens[i]->x;
-               y = pbox->y1 - pDraw->y - screenInfo.screens[i]->y;
-
-               (*pScreen->GetImage)(pDraw, x, y, w, h,
-                                       format, planemask, ScratchMem);
+               (*pScreen->GetImage)(pDraw, pbox->x1 - xoff, pbox->y1 - yoff,
+                                    w, h, format, planemask, ScratchMem);
                
                /* copy the memory over */
 
                if(depth == 1) {
-                  int k, shift, leftover, index, index2;
-               
-                  x = pbox->x1 - SrcBox.x1;
-                  y = pbox->y1 - SrcBox.y1;
+                  int j, k, shift, leftover, index, index2;
+                  int x = pbox->x1 - SrcBox.x1;
+                  int y = pbox->y1 - SrcBox.y1;
                   shift = x & 7;
                   x >>= 3;
                   leftover = w & 7;
@@ -1256,9 +1051,9 @@ XineramaGetImageData(
                        }
                    }
                } else {
-                   j = BitsPerPixel(depth) >> 3;
-                   x = (pbox->x1 - SrcBox.x1) * j;
-                   y = pbox->y1 - SrcBox.y1;
+                   int j = BitsPerPixel(depth) >> 3;
+                   int x = (pbox->x1 - SrcBox.x1) * j;
+                   int y = pbox->y1 - SrcBox.y1;
                    w *= j;
 
                    for(j = 0; j < h; j++) {
diff --git a/Xext/panoramiXprocs.c b/Xext/panoramiXprocs.c
index b744e4d..617f109 100644
--- a/Xext/panoramiXprocs.c
+++ b/Xext/panoramiXprocs.c
@@ -61,9 +61,7 @@ int PanoramiXCreateWindow(ClientPtr client)
     REQUEST(xCreateWindowReq);
     int pback_offset = 0, pbord_offset = 0, cmap_offset = 0;
     int result, len, j;
-    int orig_x, orig_y;
     XID orig_visual, tmp;
-    Bool parentIsRoot;
 
     REQUEST_AT_LEAST_SIZE(xCreateWindowReq);
     
@@ -127,17 +125,9 @@ int PanoramiXCreateWindow(ClientPtr client)
     if (stuff->class == InputOnly)
        stuff->visual = CopyFromParent;
     orig_visual = stuff->visual;
-    orig_x = stuff->x;
-    orig_y = stuff->y;
-    parentIsRoot = (stuff->parent == screenInfo.screens[0]->root->drawable.id) 
||
-                   (stuff->parent == screenInfo.screens[0]->screensaver.wid);
     FOR_NSCREENS_BACKWARD(j) {
         stuff->wid = newWin->info[j].id;
         stuff->parent = parent->info[j].id;
-       if (parentIsRoot) {
-           stuff->x = orig_x - screenInfo.screens[j]->x;
-           stuff->y = orig_y - screenInfo.screens[j]->y;
-       }
        if (backPix)
            *((CARD32 *) &stuff[1] + pback_offset) = backPix->info[j].id;
        if (bordPix)
@@ -310,8 +300,6 @@ int PanoramiXReparentWindow(ClientPtr client)
 {
     PanoramiXRes *win, *parent;
     int         result, j;
-    int                x, y;
-    Bool       parentIsRoot;
     REQUEST(xReparentWindowReq);
 
     REQUEST_SIZE_MATCH(xReparentWindowReq);
@@ -326,17 +314,9 @@ int PanoramiXReparentWindow(ClientPtr client)
     if (result != Success)
        return result;
 
-    x = stuff->x;
-    y = stuff->y;
-    parentIsRoot = (stuff->parent == screenInfo.screens[0]->root->drawable.id) 
||
-                   (stuff->parent == screenInfo.screens[0]->screensaver.wid);
     FOR_NSCREENS_BACKWARD(j) {
        stuff->window = win->info[j].id;
        stuff->parent = parent->info[j].id;
-       if(parentIsRoot) {
-           stuff->x = x - screenInfo.screens[j]->x;
-           stuff->y = y - screenInfo.screens[j]->y;
-       }
        result = (*SavedProcVector[X_ReparentWindow])(client);
         if(result != Success) break;
     }
@@ -441,10 +421,7 @@ int PanoramiXConfigureWindow(ClientPtr client)
 {
     PanoramiXRes *win;
     PanoramiXRes *sib = NULL;
-    WindowPtr   pWin;
-    int         result, j, len, sib_offset = 0, x = 0, y = 0;
-    int                x_offset = -1;
-    int                y_offset = -1;
+    int         result, j, len, sib_offset = 0;
     REQUEST(xConfigureWindowReq);
 
     REQUEST_AT_LEAST_SIZE(xConfigureWindowReq);
@@ -453,12 +430,6 @@ int PanoramiXConfigureWindow(ClientPtr client)
     if (Ones(stuff->mask) != len)
         return BadLength;
 
-    /* because we need the parent */
-    result = dixLookupResourceByType((pointer *)&pWin, stuff->window,
-                                    RT_WINDOW, client, DixWriteAccess);
-    if (result != Success)
-       return result;
-
     result = dixLookupResourceByType((pointer *)&win, stuff->window,
                                     XRT_WINDOW, client, DixWriteAccess);
     if (result != Success)
@@ -475,29 +446,12 @@ int PanoramiXConfigureWindow(ClientPtr client)
        }
     }
 
-    if(pWin->parent && ((pWin->parent == screenInfo.screens[0]->root) ||
-                        (pWin->parent->drawable.id == 
screenInfo.screens[0]->screensaver.wid)))
-    {
-       if ((Mask)stuff->mask & CWX) {
-           x_offset = 0;
-           x = *((CARD32 *)&stuff[1]);
-       }
-       if ((Mask)stuff->mask & CWY) {
-           y_offset = (x_offset == -1) ? 0 : 1;
-           y = *((CARD32 *) &stuff[1] + y_offset);
-       }
-    }
-
     /* have to go forward or you get expose events before 
        ConfigureNotify events */
     FOR_NSCREENS_FORWARD(j) {
        stuff->window = win->info[j].id;
        if(sib)
            *((CARD32 *) &stuff[1] + sib_offset) = sib->info[j].id;
-       if(x_offset >= 0)
-           *((CARD32 *) &stuff[1] + x_offset) = x - screenInfo.screens[j]->x;
-       if(y_offset >= 0)
-           *((CARD32 *) &stuff[1] + y_offset) = y - screenInfo.screens[j]->y;
        result = (*SavedProcVector[X_ConfigureWindow])(client);
         if(result != Success) break;
     }
@@ -596,15 +550,8 @@ int PanoramiXTranslateCoords(ClientPtr client)
     rep.sameScreen = xTrue;
     rep.child = None;
 
-    if((pWin == screenInfo.screens[0]->root) ||
-       (pWin->drawable.id == screenInfo.screens[0]->screensaver.wid))
-    { 
-       x = stuff->srcX - screenInfo.screens[0]->x;
-       y = stuff->srcY - screenInfo.screens[0]->y;
-    } else {
-       x = pWin->drawable.x + stuff->srcX;
-       y = pWin->drawable.y + stuff->srcY;
-    }
+    x = pWin->drawable.x + stuff->srcX;
+    y = pWin->drawable.y + stuff->srcY;
     pWin = pDst->firstChild;
     while (pWin) {
            BoxRec  box;
@@ -633,12 +580,6 @@ int PanoramiXTranslateCoords(ClientPtr client)
     }
     rep.dstX = x - pDst->drawable.x;
     rep.dstY = y - pDst->drawable.y;
-    if((pDst == screenInfo.screens[0]->root) ||
-       (pWin->drawable.id == screenInfo.screens[0]->screensaver.wid))
-    {
-       rep.dstX += screenInfo.screens[0]->x;
-       rep.dstY += screenInfo.screens[0]->y;
-    }
 
     WriteReplyToClient(client, sizeof(xTranslateCoordsReply), &rep);
     return Success;
@@ -963,8 +904,7 @@ int PanoramiXFreeGC(ClientPtr client)
 int PanoramiXClearToBackground(ClientPtr client)
 {
     PanoramiXRes *win;
-    int         result, j, x, y;
-    Bool       isRoot;
+    int         result, j;
     REQUEST(xClearAreaReq);
 
     REQUEST_SIZE_MATCH(xClearAreaReq);
@@ -974,15 +914,8 @@ int PanoramiXClearToBackground(ClientPtr client)
     if (result != Success)
        return result;
 
-    x = stuff->x;
-    y = stuff->y;
-    isRoot = win->u.win.root;
     FOR_NSCREENS_BACKWARD(j) {
        stuff->window = win->info[j].id;
-       if(isRoot) {
-           stuff->x = x - screenInfo.screens[j]->x;
-           stuff->y = y - screenInfo.screens[j]->y;
-       }
        result = (*SavedProcVector[X_ClearArea])(client);
        if(result != Success) break;
     }
@@ -1003,10 +936,8 @@ int PanoramiXClearToBackground(ClientPtr client)
 
 int PanoramiXCopyArea(ClientPtr client)
 {
-    int                        j, result, srcx, srcy, dstx, dsty;
+    int                        j, result;
     PanoramiXRes       *gc, *src, *dst;
-    Bool               srcIsRoot = FALSE;
-    Bool               dstIsRoot = FALSE;
     Bool               srcShared, dstShared;
     REQUEST(xCopyAreaReq);
 
@@ -1034,13 +965,6 @@ int PanoramiXCopyArea(ClientPtr client)
     if (result != Success)
        return result;
 
-    if((dst->type == XRT_WINDOW) && dst->u.win.root)
-       dstIsRoot = TRUE;
-    if((src->type == XRT_WINDOW) && src->u.win.root)
-       srcIsRoot = TRUE;
-
-    srcx = stuff->srcX; srcy = stuff->srcY;
-    dstx = stuff->dstX; dsty = stuff->dstY;
     if((dst->type == XRT_PIXMAP) && (src->type == XRT_WINDOW)) {
        DrawablePtr drawables[MAXSCREENS];
        DrawablePtr pDst;
@@ -1059,9 +983,9 @@ int PanoramiXCopyArea(ClientPtr client)
        if(!(data = calloc(1, stuff->height * pitch)))
            return BadAlloc;
 
-       XineramaGetImageData(drawables, srcx, srcy, 
+       XineramaGetImageData(drawables, stuff->srcX, stuff->srcY,
                stuff->width, stuff->height, ZPixmap, ~0, data, pitch, 
-               srcIsRoot);
+               src->u.win.root);
 
        FOR_NSCREENS_BACKWARD(j) {
            stuff->gc = gc->info[j].id;
@@ -1072,7 +996,7 @@ int PanoramiXCopyArea(ClientPtr client)
                return BadMatch;
            }
 
-           (*pGC->ops->PutImage) (pDst, pGC, pDst->depth, dstx, dsty, 
+           (*pGC->ops->PutImage) (pDst, pGC, pDst->depth, stuff->dstX, 
stuff->dstY,
                                   stuff->width, stuff->height, 
                                   0, ZPixmap, data);
 
@@ -1092,14 +1016,6 @@ int PanoramiXCopyArea(ClientPtr client)
            stuff->dstDrawable = dst->info[j].id;
            stuff->srcDrawable = src->info[j].id;
            stuff->gc          = gc->info[j].id;
-           if (srcIsRoot) {    
-               stuff->srcX = srcx - screenInfo.screens[j]->x;
-               stuff->srcY = srcy - screenInfo.screens[j]->y;
-           }
-           if (dstIsRoot) {    
-               stuff->dstX = dstx - screenInfo.screens[j]->x;
-               stuff->dstY = dsty - screenInfo.screens[j]->y;
-           }
 
            VALIDATE_DRAWABLE_AND_GC(stuff->dstDrawable, pDst, DixWriteAccess);
 
@@ -1122,10 +1038,6 @@ int PanoramiXCopyArea(ClientPtr client)
                                stuff->width, stuff->height, 
                                stuff->dstX, stuff->dstY);
            if(pGC->graphicsExposures && pRgn) {
-              if(srcIsRoot) {
-                  RegionTranslate(pRgn,
-                           screenInfo.screens[j]->x, screenInfo.screens[j]->y);
-              }
               RegionAppend(&totalReg, pRgn);
               RegionDestroy(pRgn);
            }
@@ -1149,10 +1061,8 @@ int PanoramiXCopyArea(ClientPtr client)
 
 int PanoramiXCopyPlane(ClientPtr client)
 {
-    int                        j, srcx, srcy, dstx, dsty, rc;
+    int                        j, rc;
     PanoramiXRes       *gc, *src, *dst;
-    Bool               srcIsRoot = FALSE;
-    Bool               dstIsRoot = FALSE;
     Bool               srcShared, dstShared;
     DrawablePtr        psrcDraw, pdstDraw = NULL;
     GCPtr              pGC = NULL;
@@ -1183,28 +1093,12 @@ int PanoramiXCopyPlane(ClientPtr client)
     if (rc != Success)
        return rc;
 
-    if((dst->type == XRT_WINDOW) && dst->u.win.root)
-       dstIsRoot = TRUE;
-    if((src->type == XRT_WINDOW) && src->u.win.root)
-       srcIsRoot = TRUE;
-
-    srcx = stuff->srcX; srcy = stuff->srcY;
-    dstx = stuff->dstX; dsty = stuff->dstY;
- 
     RegionNull(&totalReg);
     FOR_NSCREENS_BACKWARD(j) {
        RegionPtr pRgn;
        stuff->dstDrawable = dst->info[j].id;
        stuff->srcDrawable = src->info[j].id;
        stuff->gc          = gc->info[j].id;
-       if (srcIsRoot) {        
-           stuff->srcX = srcx - screenInfo.screens[j]->x;
-           stuff->srcY = srcy - screenInfo.screens[j]->y;
-       }
-       if (dstIsRoot) {        
-           stuff->dstX = dstx - screenInfo.screens[j]->x;
-           stuff->dstY = dsty - screenInfo.screens[j]->y;
-       }
 
        VALIDATE_DRAWABLE_AND_GC(stuff->dstDrawable, pdstDraw, DixWriteAccess);
        if (stuff->dstDrawable != stuff->srcDrawable) {
@@ -1255,8 +1149,6 @@ int PanoramiXPolyPoint(ClientPtr client)
 {
     PanoramiXRes *gc, *draw;
     int          result, npoint, j;
-    xPoint       *origPts;
-    Bool         isRoot;
     REQUEST(xPolyPointReq);
 
     REQUEST_AT_LEAST_SIZE(xPolyPointReq);
@@ -1274,37 +1166,14 @@ int PanoramiXPolyPoint(ClientPtr client)
     if (result != Success)
        return result;
 
-    isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
     npoint = bytes_to_int32((client->req_len << 2) - sizeof(xPolyPointReq));
     if (npoint > 0) {
-        origPts = malloc(npoint * sizeof(xPoint));
-        memcpy((char *) origPts, (char *) &stuff[1], npoint * sizeof(xPoint));
         FOR_NSCREENS_FORWARD(j){
-
-            if(j) memcpy(&stuff[1], origPts, npoint * sizeof(xPoint));
-
-            if (isRoot) {
-                int x_off = screenInfo.screens[j]->x;
-                int y_off = screenInfo.screens[j]->y;
-
-               if(x_off || y_off) {
-                    xPoint *pnts = (xPoint*)&stuff[1];
-                   int i = (stuff->coordMode==CoordModePrevious) ? 1 : npoint;
-
-                   while(i--) {
-                       pnts->x -= x_off;
-                       pnts->y -= y_off;
-                       pnts++;
-                    }
-               }
-            }
-
            stuff->drawable = draw->info[j].id;
            stuff->gc = gc->info[j].id;
            result = (* SavedProcVector[X_PolyPoint])(client);
            if(result != Success) break;
         }
-        free(origPts);
         return result;
     } else
        return Success;
@@ -1315,8 +1184,6 @@ int PanoramiXPolyLine(ClientPtr client)
 {
     PanoramiXRes *gc, *draw;
     int          result, npoint, j;
-    xPoint       *origPts;
-    Bool         isRoot;
     REQUEST(xPolyLineReq);
 
     REQUEST_AT_LEAST_SIZE(xPolyLineReq);
@@ -1334,37 +1201,14 @@ int PanoramiXPolyLine(ClientPtr client)
     if (result != Success)
        return result;
 
-    isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
     npoint = bytes_to_int32((client->req_len << 2) - sizeof(xPolyLineReq));
     if (npoint > 0){
-        origPts = malloc(npoint * sizeof(xPoint));
-        memcpy((char *) origPts, (char *) &stuff[1], npoint * sizeof(xPoint));
         FOR_NSCREENS_FORWARD(j){
-
-            if(j) memcpy(&stuff[1], origPts, npoint * sizeof(xPoint));
-
-            if (isRoot) {
-                int x_off = screenInfo.screens[j]->x;
-                int y_off = screenInfo.screens[j]->y;
-
-               if(x_off || y_off) {
-                   xPoint *pnts = (xPoint*)&stuff[1];
-                   int i = (stuff->coordMode==CoordModePrevious) ? 1 : npoint;
-
-                   while(i--) {
-                       pnts->x -= x_off;
-                       pnts->y -= y_off;
-                       pnts++;
-                   }
-               }
-            }
-
            stuff->drawable = draw->info[j].id;
            stuff->gc = gc->info[j].id;
            result = (* SavedProcVector[X_PolyLine])(client);
            if(result != Success) break;
         }
-        free(origPts);
         return result;
    } else
        return Success;
@@ -1373,10 +1217,8 @@ int PanoramiXPolyLine(ClientPtr client)
 
 int PanoramiXPolySegment(ClientPtr client)
 {
-    int                  result, nsegs, i, j;
+    int                  result, nsegs, j;
     PanoramiXRes *gc, *draw;
-    xSegment     *origSegs;
-    Bool         isRoot;
     REQUEST(xPolySegmentReq);
 
     REQUEST_AT_LEAST_SIZE(xPolySegmentReq);
@@ -1394,40 +1236,16 @@ int PanoramiXPolySegment(ClientPtr client)
     if (result != Success)
        return result;
 
-    isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
-
     nsegs = (client->req_len << 2) - sizeof(xPolySegmentReq);
     if(nsegs & 4) return BadLength;
     nsegs >>= 3;
     if (nsegs > 0) {
-       origSegs = malloc(nsegs * sizeof(xSegment));
-        memcpy((char *) origSegs, (char *) &stuff[1], nsegs * 
sizeof(xSegment));
         FOR_NSCREENS_FORWARD(j){
-
-            if(j) memcpy(&stuff[1], origSegs, nsegs * sizeof(xSegment));
-
-            if (isRoot) {
-                int x_off = screenInfo.screens[j]->x;
-                int y_off = screenInfo.screens[j]->y;
-
-               if(x_off || y_off) {
-                   xSegment *segs = (xSegment*)&stuff[1];
-
-                   for (i = nsegs; i--; segs++) {
-                       segs->x1 -= x_off;
-                       segs->x2 -= x_off;
-                       segs->y1 -= y_off;
-                       segs->y2 -= y_off;
-                   }
-               }
-            }
-
            stuff->drawable = draw->info[j].id;
            stuff->gc = gc->info[j].id;
            result = (* SavedProcVector[X_PolySegment])(client);
            if(result != Success) break;
        }
-       free(origSegs);
        return result;
     } else
          return Success;
@@ -1436,10 +1254,8 @@ int PanoramiXPolySegment(ClientPtr client)
 
 int PanoramiXPolyRectangle(ClientPtr client)
 {
-    int          result, nrects, i, j;
+    int          result, nrects, j;
     PanoramiXRes *gc, *draw;
-    Bool         isRoot;
-    xRectangle           *origRecs;
     REQUEST(xPolyRectangleReq);
 
     REQUEST_AT_LEAST_SIZE(xPolyRectangleReq);
@@ -1457,39 +1273,16 @@ int PanoramiXPolyRectangle(ClientPtr client)
     if (result != Success)
        return result;
 
-    isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
-
     nrects = (client->req_len << 2) - sizeof(xPolyRectangleReq);
     if(nrects & 4) return BadLength;
     nrects >>= 3;
     if (nrects > 0){
-       origRecs = malloc(nrects * sizeof(xRectangle));
-       memcpy((char *)origRecs,(char *)&stuff[1],nrects * sizeof(xRectangle));
         FOR_NSCREENS_FORWARD(j){
-
-            if(j) memcpy(&stuff[1], origRecs, nrects * sizeof(xRectangle));
-
-           if (isRoot) {
-               int x_off = screenInfo.screens[j]->x;
-               int y_off = screenInfo.screens[j]->y;
-
-
-               if(x_off || y_off) {
-                   xRectangle *rects = (xRectangle *) &stuff[1];
-
-                   for (i = nrects; i--; rects++) {
-                       rects->x -= x_off;
-                       rects->y -= y_off;
-                   }
-               }
-           } 
-
            stuff->drawable = draw->info[j].id;
            stuff->gc = gc->info[j].id;
            result = (* SavedProcVector[X_PolyRectangle])(client);
            if(result != Success) break;
        }
-       free(origRecs);
        return result;
     } else
        return Success;
@@ -1498,10 +1291,8 @@ int PanoramiXPolyRectangle(ClientPtr client)
 
 int PanoramiXPolyArc(ClientPtr client)
 {
-    int          result, narcs, i, j;
+    int          result, narcs, j;
     PanoramiXRes *gc, *draw;
-    Bool         isRoot;
-    xArc         *origArcs;
     REQUEST(xPolyArcReq);
 
     REQUEST_AT_LEAST_SIZE(xPolyArcReq);
@@ -1519,37 +1310,16 @@ int PanoramiXPolyArc(ClientPtr client)
     if (result != Success)
        return result;
 
-    isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
-
     narcs = (client->req_len << 2) - sizeof(xPolyArcReq);
     if(narcs % sizeof(xArc)) return BadLength;
     narcs /= sizeof(xArc);
     if (narcs > 0){
-       origArcs = malloc(narcs * sizeof(xArc));
-       memcpy((char *) origArcs, (char *) &stuff[1], narcs * sizeof(xArc));
         FOR_NSCREENS_FORWARD(j){
-
-            if(j) memcpy(&stuff[1], origArcs, narcs * sizeof(xArc));
-
-           if (isRoot) {
-               int x_off = screenInfo.screens[j]->x;
-               int y_off = screenInfo.screens[j]->y;
-       
-               if(x_off || y_off) {
-                   xArc *arcs = (xArc *) &stuff[1];
-
-                   for (i = narcs; i--; arcs++) {
-                       arcs->x -= x_off;
-                       arcs->y -= y_off;
-                   }
-               }
-            }
            stuff->drawable = draw->info[j].id;
            stuff->gc = gc->info[j].id;
            result = (* SavedProcVector[X_PolyArc])(client);
            if(result != Success) break;
         }
-       free(origArcs);
        return result;
     } else
        return Success;
@@ -1560,8 +1330,6 @@ int PanoramiXFillPoly(ClientPtr client)
 {
     int          result, count, j;
     PanoramiXRes *gc, *draw;
-    Bool         isRoot;
-    DDXPointPtr          locPts;
     REQUEST(xFillPolyReq);
 
     REQUEST_AT_LEAST_SIZE(xFillPolyReq);
@@ -1579,38 +1347,14 @@ int PanoramiXFillPoly(ClientPtr client)
     if (result != Success)
        return result;
 
-    isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
-
     count = bytes_to_int32((client->req_len << 2) - sizeof(xFillPolyReq));
     if (count > 0){
-       locPts = malloc(count * sizeof(DDXPointRec));
-       memcpy((char *)locPts, (char *)&stuff[1], count * sizeof(DDXPointRec));
         FOR_NSCREENS_FORWARD(j){
-
-           if(j) memcpy(&stuff[1], locPts, count * sizeof(DDXPointRec));
-
-           if (isRoot) {
-               int x_off = screenInfo.screens[j]->x;
-               int y_off = screenInfo.screens[j]->y;
-
-               if(x_off || y_off) {
-                   DDXPointPtr pnts = (DDXPointPtr)&stuff[1];
-                   int i = (stuff->coordMode==CoordModePrevious) ? 1 : count;
-
-                   while(i--) {
-                       pnts->x -= x_off;
-                       pnts->y -= y_off;
-                       pnts++;
-                   }
-               }
-           }
-
            stuff->drawable = draw->info[j].id;
            stuff->gc = gc->info[j].id;
            result = (* SavedProcVector[X_FillPoly])(client);
            if(result != Success) break;
        }
-       free(locPts);
        return result;
     } else
        return Success;
@@ -1619,10 +1363,8 @@ int PanoramiXFillPoly(ClientPtr client)
 
 int PanoramiXPolyFillRectangle(ClientPtr client)
 {
-    int          result, things, i, j;
+    int          result, things, j;
     PanoramiXRes *gc, *draw;
-    Bool         isRoot;
-    xRectangle   *origRects;
     REQUEST(xPolyFillRectangleReq);
 
     REQUEST_AT_LEAST_SIZE(xPolyFillRectangleReq);
@@ -1640,38 +1382,16 @@ int PanoramiXPolyFillRectangle(ClientPtr client)
     if (result != Success)
        return result;
 
-    isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
-
     things = (client->req_len << 2) - sizeof(xPolyFillRectangleReq);
     if(things & 4) return BadLength;
     things >>= 3;
     if (things > 0){
-       origRects = malloc(things * sizeof(xRectangle));
-       memcpy((char*)origRects,(char*)&stuff[1], things * sizeof(xRectangle));
         FOR_NSCREENS_FORWARD(j){
-
-           if(j) memcpy(&stuff[1], origRects, things * sizeof(xRectangle));
-
-           if (isRoot) {
-               int x_off = screenInfo.screens[j]->x;
-               int y_off = screenInfo.screens[j]->y;
-
-               if(x_off || y_off) {
-                   xRectangle *rects = (xRectangle *) &stuff[1];
-
-                   for (i = things; i--; rects++) {
-                       rects->x -= x_off;
-                       rects->y -= y_off;
-                   }
-               }
-           }
-
            stuff->drawable = draw->info[j].id;
            stuff->gc = gc->info[j].id;
            result = (* SavedProcVector[X_PolyFillRectangle])(client);
            if(result != Success) break;
        }
-       free(origRects);
        return result;
     } else
        return Success;
@@ -1681,9 +1401,7 @@ int PanoramiXPolyFillRectangle(ClientPtr client)
 int PanoramiXPolyFillArc(ClientPtr client)
 {
     PanoramiXRes *gc, *draw;
-    Bool         isRoot;
-    int          result, narcs, i, j;
-    xArc         *origArcs;
+    int          result, narcs, j;
     REQUEST(xPolyFillArcReq);
 
     REQUEST_AT_LEAST_SIZE(xPolyFillArcReq);
@@ -1701,38 +1419,16 @@ int PanoramiXPolyFillArc(ClientPtr client)
     if (result != Success)
        return result;
 
-    isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
-
     narcs = (client->req_len << 2) - sizeof(xPolyFillArcReq);
     if (narcs % sizeof(xArc)) return BadLength;
     narcs /= sizeof(xArc);
     if (narcs > 0) {
-       origArcs = malloc(narcs * sizeof(xArc));
-       memcpy((char *) origArcs, (char *)&stuff[1], narcs * sizeof(xArc));
         FOR_NSCREENS_FORWARD(j){
-
-           if(j) memcpy(&stuff[1], origArcs, narcs * sizeof(xArc));
-
-           if (isRoot) {
-               int x_off = screenInfo.screens[j]->x;
-               int y_off = screenInfo.screens[j]->y;
-
-               if(x_off || y_off) {
-                   xArc *arcs = (xArc *) &stuff[1];
-
-                   for (i = narcs; i--; arcs++) {
-                       arcs->x -= x_off;
-                       arcs->y -= y_off;
-                   }
-               }
-           }
-
            stuff->drawable = draw->info[j].id;
            stuff->gc = gc->info[j].id;
            result = (* SavedProcVector[X_PolyFillArc])(client);
            if(result != Success) break;
        }
-       free(origArcs);
        return result;
     } else
        return Success;
@@ -1742,8 +1438,7 @@ int PanoramiXPolyFillArc(ClientPtr client)
 int PanoramiXPutImage(ClientPtr client)
 {
     PanoramiXRes *gc, *draw;
-    Bool         isRoot;
-    int                  j, result, orig_x, orig_y;
+    int                  j, result;
     REQUEST(xPutImageReq);
 
     REQUEST_AT_LEAST_SIZE(xPutImageReq);
@@ -1761,15 +1456,7 @@ int PanoramiXPutImage(ClientPtr client)
     if (result != Success)
        return result;
 
-    isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
-
-    orig_x = stuff->dstX;
-    orig_y = stuff->dstY;
     FOR_NSCREENS_BACKWARD(j){
-       if (isRoot) {
-         stuff->dstX = orig_x - screenInfo.screens[j]->x;
-         stuff->dstY = orig_y - screenInfo.screens[j]->y;
-       }
        stuff->drawable = draw->info[j].id;
        stuff->gc = gc->info[j].id;
        result = (* SavedProcVector[X_PutImage])(client);
@@ -1785,7 +1472,6 @@ int PanoramiXGetImage(ClientPtr client)
     DrawablePtr        pDraw;
     PanoramiXRes       *draw;
     xGetImageReply     xgi;
-    Bool               isRoot;
     char               *pBuf;
     int                i, x, y, w, h, format, rc;
     Mask               plane = 0, planemask;
@@ -1824,20 +1510,15 @@ int PanoramiXGetImage(ClientPtr client)
     format = stuff->format;
     planemask = stuff->planeMask;
 
-    isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
+    /* check for being onscreen */
+    if(screenInfo.screens[0]->x + pDraw->x + x < 0 ||
+       screenInfo.screens[0]->x + pDraw->x + x + w > PanoramiXPixWidth ||
+       screenInfo.screens[0]->y + pDraw->y + y < 0 ||
+       screenInfo.screens[0]->y + pDraw->y + y + h > PanoramiXPixHeight)
+       return BadMatch;
 
-    if(isRoot) {
-      if( /* check for being onscreen */
-       x < 0 || x + w > PanoramiXPixWidth ||
-       y < 0 || y + h > PanoramiXPixHeight )
-           return BadMatch;
-    } else {
-      if( /* check for being onscreen */
-       screenInfo.screens[0]->x + pDraw->x + x < 0 ||
-       screenInfo.screens[0]->x + pDraw->x + x + w > PanoramiXPixWidth ||
-       screenInfo.screens[0]->y + pDraw->y + y < 0 ||
-       screenInfo.screens[0]->y + pDraw->y + y + h > PanoramiXPixHeight ||
-        /* check for being inside of border */
+    if(!draw->u.win.root) {
+      if( /* check for being inside of border */
                x < - wBorderWidth((WindowPtr)pDraw) ||
        x + w > wBorderWidth((WindowPtr)pDraw) + (int)pDraw->width ||
        y < -wBorderWidth((WindowPtr)pDraw) ||
@@ -1900,7 +1581,7 @@ int PanoramiXGetImage(ClientPtr client)
                memset(pBuf, 0, nlines * widthBytesLine);
 
            XineramaGetImageData(drawables, x, y + linesDone, w, nlines,
-                       format, planemask, pBuf, widthBytesLine, isRoot);
+                       format, planemask, pBuf, widthBytesLine, 
draw->u.win.root);
 
                (void)WriteToClient(client,
                                    (int)(nlines * widthBytesLine),
@@ -1918,7 +1599,7 @@ int PanoramiXGetImage(ClientPtr client)
 
                    XineramaGetImageData(drawables, x, y + linesDone, w, 
                                        nlines, format, plane, pBuf,
-                                       widthBytesLine, isRoot);
+                                       widthBytesLine, draw->u.win.root);
 
                    (void)WriteToClient(client,
                                    (int)(nlines * widthBytesLine),
@@ -1942,9 +1623,7 @@ int
 PanoramiXPolyText8(ClientPtr client)
 {
     PanoramiXRes *gc, *draw;
-    Bool         isRoot;
     int          result, j;
-    int                  orig_x, orig_y;
     REQUEST(xPolyTextReq);
 
     REQUEST_AT_LEAST_SIZE(xPolyTextReq);
@@ -1962,17 +1641,9 @@ PanoramiXPolyText8(ClientPtr client)
     if (result != Success)
        return result;
 
-    isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
-
-    orig_x = stuff->x;
-    orig_y = stuff->y;
     FOR_NSCREENS_BACKWARD(j){
        stuff->drawable = draw->info[j].id;
        stuff->gc = gc->info[j].id;
-       if (isRoot) {
-           stuff->x = orig_x - screenInfo.screens[j]->x;
-           stuff->y = orig_y - screenInfo.screens[j]->y;
-       }
        result = (*SavedProcVector[X_PolyText8])(client);
        if(result != Success) break;
     }
@@ -1983,9 +1654,7 @@ int
 PanoramiXPolyText16(ClientPtr client)
 {
     PanoramiXRes *gc, *draw;
-    Bool         isRoot;
     int          result, j;
-    int                  orig_x, orig_y;
     REQUEST(xPolyTextReq);
 
     REQUEST_AT_LEAST_SIZE(xPolyTextReq);
@@ -2003,17 +1672,9 @@ PanoramiXPolyText16(ClientPtr client)
     if (result != Success)
        return result;
 
-    isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
-
-    orig_x = stuff->x;
-    orig_y = stuff->y;
     FOR_NSCREENS_BACKWARD(j){
        stuff->drawable = draw->info[j].id;
        stuff->gc = gc->info[j].id;
-       if (isRoot) {
-           stuff->x = orig_x - screenInfo.screens[j]->x;
-           stuff->y = orig_y - screenInfo.screens[j]->y;
-       }
        result = (*SavedProcVector[X_PolyText16])(client);
        if(result != Success) break;
     }
@@ -2025,8 +1686,6 @@ int PanoramiXImageText8(ClientPtr client)
 {
     int          result, j;
     PanoramiXRes *gc, *draw;
-    Bool         isRoot;
-    int                  orig_x, orig_y;
     REQUEST(xImageTextReq);
 
     REQUEST_FIXED_SIZE(xImageTextReq, stuff->nChars);
@@ -2044,17 +1703,9 @@ int PanoramiXImageText8(ClientPtr client)
     if (result != Success)
        return result;
 
-    isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
-
-    orig_x = stuff->x;
-    orig_y = stuff->y;
     FOR_NSCREENS_BACKWARD(j){
        stuff->drawable = draw->info[j].id;
        stuff->gc = gc->info[j].id;
-       if (isRoot) {
-           stuff->x = orig_x - screenInfo.screens[j]->x;
-           stuff->y = orig_y - screenInfo.screens[j]->y;
-       }
        result = (*SavedProcVector[X_ImageText8])(client);
        if(result != Success) break;
     }
@@ -2066,8 +1717,6 @@ int PanoramiXImageText16(ClientPtr client)
 {
     int          result, j;
     PanoramiXRes *gc, *draw;
-    Bool         isRoot;
-    int                  orig_x, orig_y;
     REQUEST(xImageTextReq);
 
     REQUEST_FIXED_SIZE(xImageTextReq, stuff->nChars << 1);
@@ -2085,17 +1734,9 @@ int PanoramiXImageText16(ClientPtr client)
     if (result != Success)
        return result;
 
-    isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
-
-    orig_x = stuff->x;
-    orig_y = stuff->y;
     FOR_NSCREENS_BACKWARD(j){
        stuff->drawable = draw->info[j].id;
        stuff->gc = gc->info[j].id;
-       if (isRoot) {
-           stuff->x = orig_x - screenInfo.screens[j]->x;
-           stuff->y = orig_y - screenInfo.screens[j]->y;
-       }
        result = (*SavedProcVector[X_ImageText16])(client);
        if(result != Success) break;
     }
diff --git a/Xext/shm.c b/Xext/shm.c
index 3230d83..e8d00ff 100644
--- a/Xext/shm.c
+++ b/Xext/shm.c
@@ -585,9 +585,9 @@ doShmPutImage(DrawablePtr dst, GCPtr pGC,
 static int 
 ProcPanoramiXShmPutImage(ClientPtr client)
 {
-    int                         j, result, orig_x, orig_y;
+    int                         j, result;
     PanoramiXRes       *draw, *gc;
-    Bool                sendEvent, isRoot;
+    Bool                sendEvent;
 
     REQUEST(xShmPutImageReq);
     REQUEST_SIZE_MATCH(xShmPutImageReq);
@@ -602,20 +602,12 @@ ProcPanoramiXShmPutImage(ClientPtr client)
     if (result != Success)
         return result;
 
-    isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
-
-    orig_x = stuff->dstX;
-    orig_y = stuff->dstY;
     sendEvent = stuff->sendEvent;
     stuff->sendEvent = 0;
     FOR_NSCREENS(j) {
        if(!j) stuff->sendEvent = sendEvent;
        stuff->drawable = draw->info[j].id;
        stuff->gc = gc->info[j].id;
-       if (isRoot) {
-           stuff->dstX = orig_x - screenInfo.screens[j]->x;
-           stuff->dstY = orig_y - screenInfo.screens[j]->y;
-       }
        result = ProcShmPutImage(client);
        if(result != Success) break;
     }
@@ -633,7 +625,6 @@ ProcPanoramiXShmGetImage(ClientPtr client)
     int                i, x, y, w, h, format, rc;
     Mask               plane = 0, planemask;
     long               lenPer = 0, length, widthBytesLine;
-    Bool               isRoot;
 
     REQUEST(xShmGetImageReq);
 
@@ -666,20 +657,15 @@ ProcPanoramiXShmGetImage(ClientPtr client)
     format = stuff->format;
     planemask = stuff->planeMask;
 
-    isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
+    /* check for being onscreen */
+    if(screenInfo.screens[0]->x + pDraw->x + x < 0 ||
+       screenInfo.screens[0]->x + pDraw->x + x + w > PanoramiXPixWidth ||
+       screenInfo.screens[0]->y + pDraw->y + y < 0 ||
+       screenInfo.screens[0]->y + pDraw->y + y + h > PanoramiXPixHeight)
+       return BadMatch;
 
-    if(isRoot) {
-      if( /* check for being onscreen */
-       x < 0 || x + w > PanoramiXPixWidth ||
-       y < 0 || y + h > PanoramiXPixHeight )
-           return BadMatch;
-    } else {
-      if( /* check for being onscreen */
-       screenInfo.screens[0]->x + pDraw->x + x < 0 ||
-       screenInfo.screens[0]->x + pDraw->x + x + w > PanoramiXPixWidth ||
-       screenInfo.screens[0]->y + pDraw->y + y < 0 ||
-       screenInfo.screens[0]->y + pDraw->y + y + h > PanoramiXPixHeight ||
-        /* check for being inside of border */
+    if(!draw->u.win.root) {
+      if( /* check for being inside of border */
                x < - wBorderWidth((WindowPtr)pDraw) ||
        x + w > wBorderWidth((WindowPtr)pDraw) + (int)pDraw->width ||
        y < -wBorderWidth((WindowPtr)pDraw) ||
@@ -725,7 +711,7 @@ ProcPanoramiXShmGetImage(ClientPtr client)
     else if (format == ZPixmap) {
            XineramaGetImageData(drawables, x, y, w, h, format, planemask,
                                        shmdesc->addr + stuff->offset,
-                                       widthBytesLine, isRoot);
+                                       widthBytesLine, draw->u.win.root);
     } else {
 
        length = stuff->offset;
@@ -733,7 +719,7 @@ ProcPanoramiXShmGetImage(ClientPtr client)
            if (planemask & plane) {
                XineramaGetImageData(drawables, x, y, w, h, 
                                     format, plane, shmdesc->addr + length,
-                                    widthBytesLine, isRoot);
+                                    widthBytesLine, draw->u.win.root);
                length += lenPer;
            }
        }
diff --git a/Xext/xvdisp.c b/Xext/xvdisp.c
index deddebd..2008975 100644
--- a/Xext/xvdisp.c
+++ b/Xext/xvdisp.c
@@ -1657,8 +1657,7 @@ XineramaXvShmPutImage(ClientPtr client)
     REQUEST(xvShmPutImageReq);
     PanoramiXRes *draw, *gc, *port;
     Bool send_event = stuff->send_event;
-    Bool isRoot;
-    int result, i, x, y;
+    int result, i;
 
     REQUEST_SIZE_MATCH(xvShmPutImageReq);
 
@@ -1677,22 +1676,11 @@ XineramaXvShmPutImage(ClientPtr client)
     if (result != Success)
        return result;
  
-    isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
-
-    x = stuff->drw_x;
-    y = stuff->drw_y;
-
     FOR_NSCREENS_BACKWARD(i) {
        if(port->info[i].id) {
           stuff->drawable = draw->info[i].id;
           stuff->port = port->info[i].id;
           stuff->gc = gc->info[i].id;
-          stuff->drw_x = x;
-          stuff->drw_y = y;
-          if(isRoot) {
-               stuff->drw_x -= screenInfo.screens[i]->x;
-               stuff->drw_y -= screenInfo.screens[i]->y;
-          }
           stuff->send_event = (send_event && !i) ? 1 : 0;
 
           result = ProcXvShmPutImage(client);
@@ -1709,8 +1697,7 @@ XineramaXvPutImage(ClientPtr client)
 {
     REQUEST(xvPutImageReq);
     PanoramiXRes *draw, *gc, *port;
-    Bool isRoot;
-    int result, i, x, y;
+    int result, i;
 
     REQUEST_AT_LEAST_SIZE(xvPutImageReq);
 
@@ -1729,22 +1716,11 @@ XineramaXvPutImage(ClientPtr client)
     if (result != Success)
        return result;
  
-    isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
-
-    x = stuff->drw_x;
-    y = stuff->drw_y;
-
     FOR_NSCREENS_BACKWARD(i) {
        if(port->info[i].id) {
           stuff->drawable = draw->info[i].id;
           stuff->port = port->info[i].id;
           stuff->gc = gc->info[i].id;
-          stuff->drw_x = x;
-          stuff->drw_y = y;
-          if(isRoot) {
-               stuff->drw_x -= screenInfo.screens[i]->x;
-               stuff->drw_y -= screenInfo.screens[i]->y;
-          }
 
           result = ProcXvPutImage(client);
        }
@@ -1757,8 +1733,7 @@ XineramaXvPutVideo(ClientPtr client)
 {
     REQUEST(xvPutImageReq);
     PanoramiXRes *draw, *gc, *port;
-    Bool isRoot;
-    int result, i, x, y;
+    int result, i;
 
     REQUEST_AT_LEAST_SIZE(xvPutVideoReq);
 
@@ -1777,22 +1752,11 @@ XineramaXvPutVideo(ClientPtr client)
     if (result != Success)
        return result;
 
-    isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
-
-    x = stuff->drw_x;
-    y = stuff->drw_y;
-
     FOR_NSCREENS_BACKWARD(i) {
         if(port->info[i].id) {
            stuff->drawable = draw->info[i].id;
            stuff->port = port->info[i].id;
            stuff->gc = gc->info[i].id;
-           stuff->drw_x = x;
-           stuff->drw_y = y;
-           if(isRoot) {
-                stuff->drw_x -= screenInfo.screens[i]->x;
-                stuff->drw_y -= screenInfo.screens[i]->y;
-           }
 
            result = ProcXvPutVideo(client);
         }
@@ -1805,8 +1769,7 @@ XineramaXvPutStill(ClientPtr client)
 {
     REQUEST(xvPutImageReq);
     PanoramiXRes *draw, *gc, *port;
-    Bool isRoot;
-    int result, i, x, y;
+    int result, i;
 
     REQUEST_AT_LEAST_SIZE(xvPutImageReq);
 
@@ -1825,22 +1788,11 @@ XineramaXvPutStill(ClientPtr client)
     if (result != Success)
        return result;
 
-    isRoot = (draw->type == XRT_WINDOW) && draw->u.win.root;
-
-    x = stuff->drw_x;
-    y = stuff->drw_y;
-
     FOR_NSCREENS_BACKWARD(i) {
         if(port->info[i].id) {
            stuff->drawable = draw->info[i].id;
            stuff->port = port->info[i].id;
            stuff->gc = gc->info[i].id;
-           stuff->drw_x = x;
-           stuff->drw_y = y;
-           if(isRoot) {
-                stuff->drw_x -= screenInfo.screens[i]->x;
-                stuff->drw_y -= screenInfo.screens[i]->y;
-           }
 
            result = ProcXvPutStill(client);
         }
diff --git a/Xi/xiquerypointer.c b/Xi/xiquerypointer.c
index b521c48..c1fc66a 100644
--- a/Xi/xiquerypointer.c
+++ b/Xi/xiquerypointer.c
@@ -186,8 +186,8 @@ ProcXIQueryPointer(ClientPtr client)
         rep.root_y += FP1616(screenInfo.screens[0]->y, 0);
         if (stuff->win == rep.root)
         {
-            rep.win_x += FP1616(screenInfo.screens[0]->x, 0);
-            rep.win_y += FP1616(screenInfo.screens[0]->y, 0);
+            rep.win_x = FP1616(screenInfo.screens[0]->x, 0);
+            rep.win_y = FP1616(screenInfo.screens[0]->y, 0);
         }
     }
 #endif
diff --git a/render/render.c b/render/render.c
index ef233e4..aa27f06 100644
--- a/render/render.c
+++ b/render/render.c
@@ -2817,7 +2817,6 @@ PanoramiXRenderComposite (ClientPtr client)
 {
     PanoramiXRes       *src, *msk, *dst;
     int                        result = Success, j;
-    xRenderCompositeReq        orig;
     REQUEST(xRenderCompositeReq);
 
     REQUEST_SIZE_MATCH(xRenderCompositeReq);
@@ -2826,30 +2825,11 @@ PanoramiXRenderComposite (ClientPtr client)
     VERIFY_XIN_ALPHA (msk, stuff->mask, client, DixReadAccess);
     VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess);
     
-    orig = *stuff;
-    
     FOR_NSCREENS_FORWARD(j) {
        stuff->src = src->info[j].id;
-       if (src->u.pict.root)
-       {
-           stuff->xSrc = orig.xSrc - screenInfo.screens[j]->x;
-           stuff->ySrc = orig.ySrc - screenInfo.screens[j]->y;
-       }
        stuff->dst = dst->info[j].id;
-       if (dst->u.pict.root)
-       {
-           stuff->xDst = orig.xDst - screenInfo.screens[j]->x;
-           stuff->yDst = orig.yDst - screenInfo.screens[j]->y;
-       }
        if (msk)
-       {
            stuff->mask = msk->info[j].id;
-           if (msk->u.pict.root)
-           {
-               stuff->xMask = orig.xMask - screenInfo.screens[j]->x;
-               stuff->yMask = orig.yMask - screenInfo.screens[j]->y;
-           }
-       }
        result = (*PanoramiXSaveRenderVector[X_RenderComposite]) (client);
        if(result != Success) break;
     }
@@ -2863,8 +2843,6 @@ PanoramiXRenderCompositeGlyphs (ClientPtr client)
     PanoramiXRes    *src, *dst;
     int                    result = Success, j;
     REQUEST(xRenderCompositeGlyphsReq);
-    xGlyphElt      origElt, *elt;
-    INT16          xSrc, ySrc;
 
     REQUEST_AT_LEAST_SIZE(xRenderCompositeGlyphsReq);
     VERIFY_XIN_PICTURE (src, stuff->src, client, DixReadAccess);
@@ -2873,23 +2851,9 @@ PanoramiXRenderCompositeGlyphs (ClientPtr client)
     if (client->req_len << 2 >= (sizeof (xRenderCompositeGlyphsReq) +
                                 sizeof (xGlyphElt)))
     {
-       elt = (xGlyphElt *) (stuff + 1);
-       origElt = *elt;
-       xSrc = stuff->xSrc;
-       ySrc = stuff->ySrc;
        FOR_NSCREENS_FORWARD(j) {
            stuff->src = src->info[j].id;
-           if (src->u.pict.root)
-           {
-               stuff->xSrc = xSrc - screenInfo.screens[j]->x;
-               stuff->ySrc = ySrc - screenInfo.screens[j]->y;
-           }
            stuff->dst = dst->info[j].id;
-           if (dst->u.pict.root)
-           {
-               elt->deltax = origElt.deltax - screenInfo.screens[j]->x;
-               elt->deltay = origElt.deltay - screenInfo.screens[j]->y;
-           }
            result = (*PanoramiXSaveRenderVector[stuff->renderReqType]) 
(client);
            if(result != Success) break;
        }
@@ -2904,40 +2868,18 @@ PanoramiXRenderFillRectangles (ClientPtr client)
     PanoramiXRes    *dst;
     int                    result = Success, j;
     REQUEST(xRenderFillRectanglesReq);
-    char           *extra;
     int                    extra_len;
 
     REQUEST_AT_LEAST_SIZE (xRenderFillRectanglesReq);
     VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess);
     extra_len = (client->req_len << 2) - sizeof (xRenderFillRectanglesReq);
-    if (extra_len &&
-       (extra = (char *) malloc(extra_len)))
+    if (extra_len)
     {
-       memcpy (extra, stuff + 1, extra_len);
        FOR_NSCREENS_FORWARD(j) {
-           if (j) memcpy (stuff + 1, extra, extra_len);
-           if (dst->u.pict.root)
-           {
-               int x_off = screenInfo.screens[j]->x;
-               int y_off = screenInfo.screens[j]->y;
-
-               if(x_off || y_off) {
-                   xRectangle  *rects = (xRectangle *) (stuff + 1);
-                   int         i = extra_len / sizeof (xRectangle);
-
-                   while (i--)
-                   {
-                       rects->x -= x_off;
-                       rects->y -= y_off;
-                       rects++;
-                   }
-               }
-           }
            stuff->dst = dst->info[j].id;
            result = (*PanoramiXSaveRenderVector[X_RenderFillRectangles]) 
(client);
            if(result != Success) break;
        }
-       free(extra);
     }
 
     return result;
@@ -2949,7 +2891,6 @@ PanoramiXRenderTrapezoids(ClientPtr client)
     PanoramiXRes        *src, *dst;
     int                 result = Success, j;
     REQUEST(xRenderTrapezoidsReq);
-    char               *extra;
     int                        extra_len;
     
     REQUEST_AT_LEAST_SIZE (xRenderTrapezoidsReq);
@@ -2959,36 +2900,8 @@ PanoramiXRenderTrapezoids(ClientPtr client)
 
     extra_len = (client->req_len << 2) - sizeof (xRenderTrapezoidsReq);
 
-    if (extra_len &&
-       (extra = (char *) malloc(extra_len))) {
-       memcpy (extra, stuff + 1, extra_len);
-
+    if (extra_len) {
        FOR_NSCREENS_FORWARD(j) {
-           if (j) memcpy (stuff + 1, extra, extra_len);
-           if (dst->u.pict.root) {
-               int x_off = screenInfo.screens[j]->x;
-               int y_off = screenInfo.screens[j]->y;
-
-               if(x_off || y_off) {
-                    xTrapezoid  *trap = (xTrapezoid *) (stuff + 1);
-                   int         i = extra_len / sizeof (xTrapezoid);
-
-                   while (i--) {
-                       trap->top -= y_off;
-                       trap->bottom -= y_off;
-                       trap->left.p1.x -= x_off;
-                       trap->left.p1.y -= y_off;
-                       trap->left.p2.x -= x_off;
-                       trap->left.p2.y -= y_off;
-                       trap->right.p1.x -= x_off;
-                       trap->right.p1.y -= y_off;
-                       trap->right.p2.x -= x_off;
-                       trap->right.p2.y -= y_off;
-                       trap++;
-                   }
-               }
-           }
-           
             stuff->src = src->info[j].id;
             stuff->dst = dst->info[j].id;
            result =
@@ -2996,8 +2909,6 @@ PanoramiXRenderTrapezoids(ClientPtr client)
 
            if(result != Success) break;
        }
-       
-        free(extra);
     }
 
     return result;
@@ -3009,7 +2920,6 @@ PanoramiXRenderTriangles(ClientPtr client)
     PanoramiXRes        *src, *dst;
     int                 result = Success, j;
     REQUEST(xRenderTrianglesReq);
-    char               *extra;
     int                        extra_len;
     
     REQUEST_AT_LEAST_SIZE (xRenderTrianglesReq);
@@ -3019,32 +2929,8 @@ PanoramiXRenderTriangles(ClientPtr client)
 
     extra_len = (client->req_len << 2) - sizeof (xRenderTrianglesReq);
 
-    if (extra_len &&
-       (extra = (char *) malloc(extra_len))) {
-       memcpy (extra, stuff + 1, extra_len);
-
+    if (extra_len) {
        FOR_NSCREENS_FORWARD(j) {
-           if (j) memcpy (stuff + 1, extra, extra_len);
-           if (dst->u.pict.root) {
-               int x_off = screenInfo.screens[j]->x;
-               int y_off = screenInfo.screens[j]->y;
-
-               if(x_off || y_off) {
-                    xTriangle  *tri = (xTriangle *) (stuff + 1);
-                   int         i = extra_len / sizeof (xTriangle);
-
-                   while (i--) {
-                       tri->p1.x -= x_off;
-                       tri->p1.y -= y_off;
-                       tri->p2.x -= x_off;
-                       tri->p2.y -= y_off;
-                       tri->p3.x -= x_off;
-                       tri->p3.y -= y_off;
-                       tri++;
-                   }
-               }
-           }
-           
             stuff->src = src->info[j].id;
             stuff->dst = dst->info[j].id;
            result =
@@ -3052,8 +2938,6 @@ PanoramiXRenderTriangles(ClientPtr client)
 
            if(result != Success) break;
        }
-       
-        free(extra);
     }
 
     return result;
@@ -3065,7 +2949,6 @@ PanoramiXRenderTriStrip(ClientPtr client)
     PanoramiXRes        *src, *dst;
     int                 result = Success, j;
     REQUEST(xRenderTriStripReq);
-    char               *extra;
     int                        extra_len;
     
     REQUEST_AT_LEAST_SIZE (xRenderTriStripReq);
@@ -3075,28 +2958,8 @@ PanoramiXRenderTriStrip(ClientPtr client)
 
     extra_len = (client->req_len << 2) - sizeof (xRenderTriStripReq);
 
-    if (extra_len &&
-       (extra = (char *) malloc(extra_len))) {
-       memcpy (extra, stuff + 1, extra_len);
-
+    if (extra_len) {
        FOR_NSCREENS_FORWARD(j) {
-           if (j) memcpy (stuff + 1, extra, extra_len);
-           if (dst->u.pict.root) {
-               int x_off = screenInfo.screens[j]->x;
-               int y_off = screenInfo.screens[j]->y;
-
-               if(x_off || y_off) {
-                    xPointFixed  *fixed = (xPointFixed *) (stuff + 1);
-                   int         i = extra_len / sizeof (xPointFixed);
-
-                   while (i--) {
-                       fixed->x -= x_off;
-                       fixed->y -= y_off;
-                       fixed++;
-                   }
-               }
-           }
-           
             stuff->src = src->info[j].id;
             stuff->dst = dst->info[j].id;
            result =
@@ -3104,8 +2967,6 @@ PanoramiXRenderTriStrip(ClientPtr client)
 
            if(result != Success) break;
        }
-       
-        free(extra);
     }
 
     return result;
@@ -3117,7 +2978,6 @@ PanoramiXRenderTriFan(ClientPtr client)
     PanoramiXRes        *src, *dst;
     int                 result = Success, j;
     REQUEST(xRenderTriFanReq);
-    char               *extra;
     int                        extra_len;
     
     REQUEST_AT_LEAST_SIZE (xRenderTriFanReq);
@@ -3127,28 +2987,8 @@ PanoramiXRenderTriFan(ClientPtr client)
 
     extra_len = (client->req_len << 2) - sizeof (xRenderTriFanReq);
 
-    if (extra_len &&
-       (extra = (char *) malloc(extra_len))) {
-       memcpy (extra, stuff + 1, extra_len);
-
+    if (extra_len) {
        FOR_NSCREENS_FORWARD(j) {
-           if (j) memcpy (stuff + 1, extra, extra_len);
-           if (dst->u.pict.root) {
-               int x_off = screenInfo.screens[j]->x;
-               int y_off = screenInfo.screens[j]->y;
-
-               if(x_off || y_off) {
-                    xPointFixed  *fixed = (xPointFixed *) (stuff + 1);
-                   int         i = extra_len / sizeof (xPointFixed);
-
-                   while (i--) {
-                       fixed->x -= x_off;
-                       fixed->y -= y_off;
-                       fixed++;
-                   }
-               }
-           }
-           
             stuff->src = src->info[j].id;
             stuff->dst = dst->info[j].id;
            result =
@@ -3156,8 +2996,6 @@ PanoramiXRenderTriFan(ClientPtr client)
 
            if(result != Success) break;
        }
-       
-        free(extra);
     }
 
     return result;
@@ -3169,32 +3007,18 @@ PanoramiXRenderAddTraps (ClientPtr client)
     PanoramiXRes    *picture;
     int                    result = Success, j;
     REQUEST(xRenderAddTrapsReq);
-    char           *extra;
     int                    extra_len;
-    INT16          x_off, y_off;
 
     REQUEST_AT_LEAST_SIZE (xRenderAddTrapsReq);
     VERIFY_XIN_PICTURE (picture, stuff->picture, client, DixWriteAccess);
     extra_len = (client->req_len << 2) - sizeof (xRenderAddTrapsReq);
-    if (extra_len &&
-       (extra = (char *) malloc(extra_len)))
+    if (extra_len)
     {
-       memcpy (extra, stuff + 1, extra_len);
-       x_off = stuff->xOff;
-       y_off = stuff->yOff;
        FOR_NSCREENS_FORWARD(j) {
-           if (j) memcpy (stuff + 1, extra, extra_len);
            stuff->picture = picture->info[j].id;
-           
-           if (picture->u.pict.root)
-           {
-               stuff->xOff = x_off + screenInfo.screens[j]->x;
-               stuff->yOff = y_off + screenInfo.screens[j]->y;
-           }
            result = (*PanoramiXSaveRenderVector[X_RenderAddTraps]) (client);
            if(result != Success) break;
        }
-       free(extra);
     }
 
     return result;
-- 
1.7.0

_______________________________________________
[email protected]: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to