[PATCH resend] CreateRootWindow: Set root windows' drawable.x/y to -pScreen->x/y.

Jamey Sharp jamey at minilop.net
Wed Sep 21 14:41:45 PDT 2011


It isn't based on master, that's true. You can pull it from:

git://anongit.freedesktop.org/~jamey/xserver review-pending

As I mentioned, this version of the patch is based on my other two
GC/clipping cleanups. It could be rebased on master, but I don't want
to... :-)

Jamey

On Wed, Sep 21, 2011 at 01:36:00PM -0700, Jeremy Huddleston wrote:
> I'd like to test this on XQuartz as we have a "funky" use of Xinerama, but this doesn't seem to apply to current master.
> 
> Applying: CreateRootWindow: Set root windows' drawable.x/y to -pScreen->x/y.
> error: patch failed: Xext/panoramiX.c:109
> error: Xext/panoramiX.c: patch does not apply
> Patch failed at 0001 CreateRootWindow: Set root windows' drawable.x/y to -pScreen->x/y.
> When you have resolved this problem run "git am --resolved".
> If you would prefer to skip this patch, instead run "git am --skip".
> To restore the original branch and stop patching run "git am --abort".
> 
> 
> ---
> 
> $ cat Xext/panoramiX.c.rej 
> ***************
> *** 109,149 ****
>   
>   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 GCFuncs XineramaGCFuncs = {
> -     XineramaValidateGC, XineramaChangeGC, XineramaCopyGC, XineramaDestroyGC,
> - };
> - 
> - #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)
>   {
> --- 109,121 ----
>   
>   int (* SavedProcVector[256]) (ClientPtr client) = { NULL, };
>   
>   static DevPrivateKeyRec PanoramiXScreenKeyRec;
>   #define PanoramiXScreenKey (&PanoramiXScreenKeyRec)
>   
>   typedef struct {
>     CloseScreenProcPtr	CloseScreen;
>   } PanoramiXScreenRec, *PanoramiXScreenPtr;
>   
>   static Bool
>   XineramaCloseScreen (int i, ScreenPtr pScreen)
>   {
> ***************
> *** 165,304 ****
>       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);
> - }
> - 
>   int
>   XineramaDeleteResource(pointer data, XID id)
>   {
> --- 136,141 ----
>       return (*pScreen->CloseScreen) (i, pScreen);
>   }
>   
>   int
>   XineramaDeleteResource(pointer data, XID id)
>   {
> 
> 
> On Sep 18, 2011, at 19:36, Jamey Sharp wrote:
> 
> > 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.
> > 
> > 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.
> > 
> > While this deletes Xinerama-layer code that modified request buffers
> > (aside from XID rewrites), some GC ops implementations also modify the
> > request buffer. (miPolyFill is an example.) Since Xinerama submits the
> > same request buffer once for each screen, it needs to undo the changes
> > made by these ops, even though it doesn't make its own modifications any
> > more. So I've preserved all Xinerama code that unconditionally saved and
> > restored parts of the request buffer. If the save/restore code was
> > conditional on whether the drawable was a root window, then it was safe
> > to delete.
> > 
> > Signed-off-by: Jamey Sharp <jamey at minilop.net>
> > ---
> > I tested this patch when I originally posted it last year using a pair
> > of xf86-video-dummy screens and x11vnc. After rebasing, I've re-tested
> > using two xf86-video-nested screens. It works great and deletes a bunch
> > of code. I'd really appreciate review. If you can test in a multi-head
> > setup and offer a Tested-by, that will probably make Keith happier...
> > 
> > Note that this is based on some other patches I have out for review
> > right now:
> > 
> >        xnest: Delete unused nClipRects GC-private field. (reviewed)
> >        Quit wrapping ChangeClip, CopyClip, and DestroyClip in GCFuncs.
> >        Make GC clientClip always be a region.
> > 
> > It can be rebased without those, but since they touch the same code some
> > simple merge conflicts come up.
> > 
> > Besides rebasing, there's one change since the last version: now I only
> > set the root windows' origins if Xinerama is active. For some reason we
> > allow screen origins to be set even without Xinerama, though they aren't
> > meaningful then.
> > 
> > Xext/panoramiX.c      |  181 +-------------------------
> > Xext/panoramiX.h      |    1 -
> > Xext/panoramiXprocs.c |  354 ++++---------------------------------------------
> > Xext/panoramiXsrv.h   |    3 +-
> > Xext/shm.c            |   38 ++----
> > Xext/xvdisp.c         |   28 ----
> > Xi/xiquerypointer.c   |    5 -
> > dix/window.c          |    6 +
> > render/render.c       |  134 -------------------
> > 9 files changed, 47 insertions(+), 703 deletions(-)
> > 
> > diff --git a/Xext/panoramiX.c b/Xext/panoramiX.c
> > index 23a6d05..3138d40 100644
> > --- a/Xext/panoramiX.c
> > +++ b/Xext/panoramiX.c
> > @@ -109,41 +109,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 GCFuncs XineramaGCFuncs = {
> > -    XineramaValidateGC, XineramaChangeGC, XineramaCopyGC, XineramaDestroyGC,
> > -};
> > -
> > -#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)
> > {
> > @@ -151,7 +123,6 @@ XineramaCloseScreen (int i, ScreenPtr pScreen)
> > 	dixLookupPrivate(&pScreen->devPrivates, PanoramiXScreenKey);
> > 
> >     pScreen->CloseScreen = pScreenPriv->CloseScreen;
> > -    pScreen->CreateGC = pScreenPriv->CreateGC;
> > 
> >     if (pScreen->myNum == 0)
> > 	RegionUninit(&PanoramiXScreenRegion);
> > @@ -161,140 +132,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);
> > -}
> > -
> > int
> > XineramaDeleteResource(pointer data, XID id)
> > {
> > @@ -422,11 +259,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;
> > @@ -456,10 +288,8 @@ void PanoramiXExtensionInit(int argc, char *argv[])
> > 		return;
> > 	   }
> > 	
> > -	   pScreenPriv->CreateGC = pScreen->CreateGC;
> > 	   pScreenPriv->CloseScreen = pScreen->CloseScreen;
> > 	
> > -	   pScreen->CreateGC = XineramaCreateGC;
> > 	   pScreen->CloseScreen = XineramaCloseScreen;
> > 	}
> > 
> > @@ -1121,8 +951,7 @@ XineramaGetImageData(
> >     unsigned int format,
> >     unsigned long planemask,
> >     char *data,
> > -    int pitch,
> > -    Bool isRoot
> > +    int pitch
> > ){
> >     RegionRec SrcRegion, ScreenRegion, GrabRegion;
> >     BoxRec SrcBox, *pbox;
> > @@ -1133,12 +962,8 @@ XineramaGetImageData(
> >     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;
> > 
> > diff --git a/Xext/panoramiX.h b/Xext/panoramiX.h
> > index 71651e5..fcfac0e 100644
> > --- a/Xext/panoramiX.h
> > +++ b/Xext/panoramiX.h
> > @@ -76,5 +76,4 @@ typedef struct {
> > 
> > #define IS_SHARED_PIXMAP(r) (((r)->type == XRT_PIXMAP) && (r)->u.pix.shared)
> > 
> > -#define IS_ROOT_DRAWABLE(d) (((d)->type == XRT_WINDOW) && (d)->u.win.root)
> > #endif /* _PANORAMIX_H_ */
> > diff --git a/Xext/panoramiXprocs.c b/Xext/panoramiXprocs.c
> > index 9ea4611..9bd63f6 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);
> > 
> > @@ -125,17 +123,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)
> > @@ -308,8 +298,6 @@ int PanoramiXReparentWindow(ClientPtr client)
> > {
> >     PanoramiXRes *win, *parent;
> >     int         result, j;
> > -    int		x, y;
> > -    Bool	parentIsRoot;
> >     REQUEST(xReparentWindowReq);
> > 
> >     REQUEST_SIZE_MATCH(xReparentWindowReq);
> > @@ -324,17 +312,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;
> >     }
> > @@ -439,10 +419,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);
> > @@ -451,12 +428,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)
> > @@ -473,29 +444,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;
> >     }
> > @@ -594,15 +548,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;
> > @@ -631,12 +578,6 @@ int PanoramiXTranslateCoords(ClientPtr client)
> >     }
> >     rep.dstX = x - pDst->drawable.x;
> >     rep.dstY = y - pDst->drawable.y;
> > -    if((pDst == screenInfo.screens[0]->root) ||
> > -       (pDst->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;
> > @@ -957,8 +898,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);
> > @@ -968,15 +908,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;
> >     }
> > @@ -997,10 +930,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);
> > 
> > @@ -1028,13 +959,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;
> > @@ -1053,9 +977,8 @@ int PanoramiXCopyArea(ClientPtr client)
> > 	if(!(data = calloc(1, stuff->height * pitch)))
> > 	    return BadAlloc;
> > 
> > -	XineramaGetImageData(drawables, srcx, srcy, 
> > -		stuff->width, stuff->height, ZPixmap, ~0, data, pitch, 
> > -		srcIsRoot);
> > +	XineramaGetImageData(drawables, stuff->srcX, stuff->srcY,
> > +		stuff->width, stuff->height, ZPixmap, ~0, data, pitch);
> > 
> > 	FOR_NSCREENS_BACKWARD(j) {
> > 	    stuff->gc = gc->info[j].id;
> > @@ -1066,7 +989,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);
> > 
> > @@ -1086,14 +1009,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);
> > 
> > @@ -1116,10 +1031,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);
> > 	    }
> > @@ -1143,10 +1054,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;
> > @@ -1177,28 +1086,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) {
> > @@ -1250,7 +1143,6 @@ int PanoramiXPolyPoint(ClientPtr client)
> >     PanoramiXRes *gc, *draw;
> >     int 	  result, npoint, j;
> >     xPoint 	  *origPts;
> > -    Bool	  isRoot;
> >     REQUEST(xPolyPointReq);
> > 
> >     REQUEST_AT_LEAST_SIZE(xPolyPointReq);
> > @@ -1268,7 +1160,6 @@ 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));
> > @@ -1277,22 +1168,6 @@ int PanoramiXPolyPoint(ClientPtr client)
> > 
> >             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);
> > @@ -1310,7 +1185,6 @@ int PanoramiXPolyLine(ClientPtr client)
> >     PanoramiXRes *gc, *draw;
> >     int 	  result, npoint, j;
> >     xPoint 	  *origPts;
> > -    Bool	  isRoot;
> >     REQUEST(xPolyLineReq);
> > 
> >     REQUEST_AT_LEAST_SIZE(xPolyLineReq);
> > @@ -1328,7 +1202,6 @@ int PanoramiXPolyLine(ClientPtr client)
> >     if (result != Success)
> > 	return result;
> > 
> > -    isRoot = IS_ROOT_DRAWABLE(draw);
> >     npoint = bytes_to_int32((client->req_len << 2) - sizeof(xPolyLineReq));
> >     if (npoint > 0){
> >         origPts = malloc(npoint * sizeof(xPoint));
> > @@ -1337,22 +1210,6 @@ int PanoramiXPolyLine(ClientPtr client)
> > 
> >             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);
> > @@ -1367,10 +1224,9 @@ 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);
> > @@ -1388,8 +1244,6 @@ int PanoramiXPolySegment(ClientPtr client)
> >     if (result != Success)
> > 	return result;
> > 
> > -    isRoot = IS_ROOT_DRAWABLE(draw);
> > -
> >     nsegs = (client->req_len << 2) - sizeof(xPolySegmentReq);
> >     if(nsegs & 4) return BadLength;
> >     nsegs >>= 3;
> > @@ -1400,22 +1254,6 @@ int PanoramiXPolySegment(ClientPtr client)
> > 
> >             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);
> > @@ -1430,9 +1268,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);
> > 
> > @@ -1451,8 +1288,6 @@ int PanoramiXPolyRectangle(ClientPtr client)
> >     if (result != Success)
> > 	return result;
> > 
> > -    isRoot = IS_ROOT_DRAWABLE(draw);
> > -
> >     nrects = (client->req_len << 2) - sizeof(xPolyRectangleReq);
> >     if(nrects & 4) return BadLength;
> >     nrects >>= 3;
> > @@ -1463,21 +1298,6 @@ int PanoramiXPolyRectangle(ClientPtr client)
> > 
> >             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);
> > @@ -1492,9 +1312,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);
> > 
> > @@ -1513,8 +1332,6 @@ int PanoramiXPolyArc(ClientPtr client)
> >     if (result != Success)
> > 	return result;
> > 
> > -    isRoot = IS_ROOT_DRAWABLE(draw);
> > -
> >     narcs = (client->req_len << 2) - sizeof(xPolyArcReq);
> >     if(narcs % sizeof(xArc)) return BadLength;
> >     narcs /= sizeof(xArc);
> > @@ -1525,19 +1342,6 @@ int PanoramiXPolyArc(ClientPtr client)
> > 
> >             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);
> > @@ -1554,7 +1358,6 @@ int PanoramiXFillPoly(ClientPtr client)
> > {
> >     int 	  result, count, j;
> >     PanoramiXRes *gc, *draw;
> > -    Bool	  isRoot;
> >     DDXPointPtr	  locPts;
> >     REQUEST(xFillPolyReq);
> > 
> > @@ -1573,8 +1376,6 @@ int PanoramiXFillPoly(ClientPtr client)
> >     if (result != Success)
> > 	return result;
> > 
> > -    isRoot = IS_ROOT_DRAWABLE(draw);
> > -
> >     count = bytes_to_int32((client->req_len << 2) - sizeof(xFillPolyReq));
> >     if (count > 0){
> > 	locPts = malloc(count * sizeof(DDXPointRec));
> > @@ -1583,22 +1384,6 @@ int PanoramiXFillPoly(ClientPtr client)
> > 
> > 	    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);
> > @@ -1613,9 +1398,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);
> > 
> > @@ -1634,8 +1418,6 @@ int PanoramiXPolyFillRectangle(ClientPtr client)
> >     if (result != Success)
> > 	return result;
> > 
> > -    isRoot = IS_ROOT_DRAWABLE(draw);
> > -
> >     things = (client->req_len << 2) - sizeof(xPolyFillRectangleReq);
> >     if(things & 4) return BadLength;
> >     things >>= 3;
> > @@ -1646,20 +1428,6 @@ int PanoramiXPolyFillRectangle(ClientPtr client)
> > 
> > 	    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);
> > @@ -1675,8 +1443,7 @@ int PanoramiXPolyFillRectangle(ClientPtr client)
> > int PanoramiXPolyFillArc(ClientPtr client)
> > {
> >     PanoramiXRes *gc, *draw;
> > -    Bool	  isRoot;
> > -    int 	  result, narcs, i, j;
> > +    int 	  result, narcs, j;
> >     xArc	  *origArcs;
> >     REQUEST(xPolyFillArcReq);
> > 
> > @@ -1695,8 +1462,6 @@ int PanoramiXPolyFillArc(ClientPtr client)
> >     if (result != Success)
> > 	return result;
> > 
> > -    isRoot = IS_ROOT_DRAWABLE(draw);
> > -
> >     narcs = (client->req_len << 2) - sizeof(xPolyFillArcReq);
> >     if (narcs % sizeof(xArc)) return BadLength;
> >     narcs /= sizeof(xArc);
> > @@ -1707,20 +1472,6 @@ int PanoramiXPolyFillArc(ClientPtr client)
> > 
> > 	    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);
> > @@ -1736,8 +1487,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);
> > @@ -1755,15 +1505,7 @@ int PanoramiXPutImage(ClientPtr client)
> >     if (result != Success)
> > 	return result;
> > 
> > -    isRoot = IS_ROOT_DRAWABLE(draw);
> > -
> > -    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);
> > @@ -1779,7 +1521,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;
> > @@ -1818,20 +1559,15 @@ int PanoramiXGetImage(ClientPtr client)
> >     format = stuff->format;
> >     planemask = stuff->planeMask;
> > 
> > -    isRoot = IS_ROOT_DRAWABLE(draw);
> > +    /* 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) ||
> > @@ -1894,7 +1630,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);
> > 
> > 		(void)WriteToClient(client,
> > 				    (int)(nlines * widthBytesLine),
> > @@ -1912,7 +1648,7 @@ int PanoramiXGetImage(ClientPtr client)
> > 
> > 		    XineramaGetImageData(drawables, x, y + linesDone, w, 
> > 					nlines, format, plane, pBuf,
> > -					widthBytesLine, isRoot);
> > +					widthBytesLine);
> > 
> > 		    (void)WriteToClient(client,
> > 				    (int)(nlines * widthBytesLine),
> > @@ -1936,9 +1672,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);
> > @@ -1956,17 +1690,9 @@ PanoramiXPolyText8(ClientPtr client)
> >     if (result != Success)
> > 	return result;
> > 
> > -    isRoot = IS_ROOT_DRAWABLE(draw);
> > -
> > -    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;
> >     }
> > @@ -1977,9 +1703,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);
> > @@ -1997,17 +1721,9 @@ PanoramiXPolyText16(ClientPtr client)
> >     if (result != Success)
> > 	return result;
> > 
> > -    isRoot = IS_ROOT_DRAWABLE(draw);
> > -
> > -    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;
> >     }
> > @@ -2019,8 +1735,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);
> > @@ -2038,17 +1752,9 @@ int PanoramiXImageText8(ClientPtr client)
> >     if (result != Success)
> > 	return result;
> > 
> > -    isRoot = IS_ROOT_DRAWABLE(draw);
> > -
> > -    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;
> >     }
> > @@ -2060,8 +1766,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);
> > @@ -2079,17 +1783,9 @@ int PanoramiXImageText16(ClientPtr client)
> >     if (result != Success)
> > 	return result;
> > 
> > -    isRoot = IS_ROOT_DRAWABLE(draw);
> > -
> > -    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/panoramiXsrv.h b/Xext/panoramiXsrv.h
> > index 39d4952..b673052 100644
> > --- a/Xext/panoramiXsrv.h
> > +++ b/Xext/panoramiXsrv.h
> > @@ -47,8 +47,7 @@ extern _X_EXPORT void XineramaGetImageData(
> >     unsigned int format,
> >     unsigned long planemask,
> >     char *data,
> > -    int pitch,
> > -    Bool isRoot
> > +    int pitch
> > );
> > 
> > static inline void panoramix_setup_ids(PanoramiXRes *resource, 
> > diff --git a/Xext/shm.c b/Xext/shm.c
> > index 4141a8f..7fccb23 100644
> > --- a/Xext/shm.c
> > +++ b/Xext/shm.c
> > @@ -741,9 +741,9 @@ ProcShmGetImage(ClientPtr client)
> > 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);
> > @@ -758,20 +758,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;
> >     }
> > @@ -789,7 +781,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);
> > 
> > @@ -822,20 +813,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) ||
> > @@ -881,7 +867,7 @@ ProcPanoramiXShmGetImage(ClientPtr client)
> >     else if (format == ZPixmap) {
> > 	    XineramaGetImageData(drawables, x, y, w, h, format, planemask,
> > 					shmdesc->addr + stuff->offset,
> > -					widthBytesLine, isRoot);
> > +					widthBytesLine);
> >     } else {
> > 
> > 	length = stuff->offset;
> > @@ -889,7 +875,7 @@ ProcPanoramiXShmGetImage(ClientPtr client)
> > 	    if (planemask & plane) {
> > 		XineramaGetImageData(drawables, x, y, w, h, 
> > 				     format, plane, shmdesc->addr + length,
> > -				     widthBytesLine, isRoot);
> > +				     widthBytesLine);
> > 		length += lenPer;
> > 	    }
> > 	}
> > diff --git a/Xext/xvdisp.c b/Xext/xvdisp.c
> > index b968431..0fc78db 100644
> > --- a/Xext/xvdisp.c
> > +++ b/Xext/xvdisp.c
> > @@ -1657,7 +1657,6 @@ XineramaXvShmPutImage(ClientPtr client)
> >     REQUEST(xvShmPutImageReq);
> >     PanoramiXRes *draw, *gc, *port;
> >     Bool send_event = stuff->send_event;
> > -    Bool isRoot;
> >     int result, i, x, y;
> > 
> >     REQUEST_SIZE_MATCH(xvShmPutImageReq);
> > @@ -1677,8 +1676,6 @@ 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;
> > 
> > @@ -1689,10 +1686,6 @@ XineramaXvShmPutImage(ClientPtr client)
> > 	   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,7 +1702,6 @@ XineramaXvPutImage(ClientPtr client)
> > {
> >     REQUEST(xvPutImageReq);
> >     PanoramiXRes *draw, *gc, *port;
> > -    Bool isRoot;
> >     int result, i, x, y;
> > 
> >     REQUEST_AT_LEAST_SIZE(xvPutImageReq);
> > @@ -1729,8 +1721,6 @@ 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;
> > 
> > @@ -1741,10 +1731,6 @@ XineramaXvPutImage(ClientPtr client)
> > 	   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,7 +1743,6 @@ XineramaXvPutVideo(ClientPtr client)
> > {
> >     REQUEST(xvPutImageReq);
> >     PanoramiXRes *draw, *gc, *port;
> > -    Bool isRoot;
> >     int result, i, x, y;
> > 
> >     REQUEST_AT_LEAST_SIZE(xvPutVideoReq);
> > @@ -1777,8 +1762,6 @@ 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;
> > 
> > @@ -1789,10 +1772,6 @@ XineramaXvPutVideo(ClientPtr client)
> >            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,7 +1784,6 @@ XineramaXvPutStill(ClientPtr client)
> > {
> >     REQUEST(xvPutImageReq);
> >     PanoramiXRes *draw, *gc, *port;
> > -    Bool isRoot;
> >     int result, i, x, y;
> > 
> >     REQUEST_AT_LEAST_SIZE(xvPutImageReq);
> > @@ -1825,8 +1803,6 @@ 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;
> > 
> > @@ -1837,10 +1813,6 @@ XineramaXvPutStill(ClientPtr client)
> >            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 5131799..8edbfcf 100644
> > --- a/Xi/xiquerypointer.c
> > +++ b/Xi/xiquerypointer.c
> > @@ -184,11 +184,6 @@ ProcXIQueryPointer(ClientPtr client)
> >     if(!noPanoramiXExtension) {
> >         rep.root_x += FP1616(screenInfo.screens[0]->x, 0);
> >         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);
> > -        }
> >     }
> > #endif
> > 
> > diff --git a/dix/window.c b/dix/window.c
> > index 1953f02..ed928eb 100644
> > --- a/dix/window.c
> > +++ b/dix/window.c
> > @@ -508,6 +508,12 @@ CreateRootWindow(ScreenPtr pScreen)
> >     pWin->drawable.height = pScreen->height;
> >     pWin->drawable.width = pScreen->width;
> >     pWin->drawable.x = pWin->drawable.y = 0;
> > +#ifdef PANORAMIX
> > +    if(!noPanoramiXExtension) {
> > +	pWin->drawable.x = -pScreen->x;
> > +	pWin->drawable.y = -pScreen->y;
> > +    }
> > +#endif
> > 
> >     box.x1 = 0;
> >     box.y1 = 0;
> > diff --git a/render/render.c b/render/render.c
> > index ebb1d63..d672cb7 100644
> > --- a/render/render.c
> > +++ b/render/render.c
> > @@ -2831,7 +2831,6 @@ PanoramiXRenderComposite (ClientPtr client)
> > {
> >     PanoramiXRes	*src, *msk, *dst;
> >     int			result = Success, j;
> > -    xRenderCompositeReq	orig;
> >     REQUEST(xRenderCompositeReq);
> > 
> >     REQUEST_SIZE_MATCH(xRenderCompositeReq);
> > @@ -2840,30 +2839,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;
> >     }
> > @@ -2877,8 +2857,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);
> > @@ -2887,23 +2865,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;
> > 	}
> > @@ -2930,23 +2894,6 @@ PanoramiXRenderFillRectangles (ClientPtr client)
> > 	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;
> > @@ -2979,29 +2926,6 @@ PanoramiXRenderTrapezoids(ClientPtr client)
> > 
> > 	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;
> > @@ -3039,25 +2963,6 @@ PanoramiXRenderTriangles(ClientPtr client)
> > 
> > 	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;
> > @@ -3095,21 +3000,6 @@ PanoramiXRenderTriStrip(ClientPtr client)
> > 
> > 	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;
> > @@ -3147,21 +3037,6 @@ PanoramiXRenderTriFan(ClientPtr client)
> > 
> > 	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;
> > @@ -3185,7 +3060,6 @@ PanoramiXRenderAddTraps (ClientPtr client)
> >     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);
> > @@ -3194,17 +3068,9 @@ PanoramiXRenderAddTraps (ClientPtr client)
> > 	(extra = (char *) malloc(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;
> > 	}
> > -- 
> > 1.7.5.4
> > 
> > _______________________________________________
> > xorg-devel at lists.x.org: X.Org development
> > Archives: http://lists.x.org/archives/xorg-devel
> > Info: http://lists.x.org/mailman/listinfo/xorg-devel
> > 
> 
> ---
> Jeremy Huddleston
> 
> Rebuild Sudan
>  - Board of Directors
>  - http://www.rebuildsudan.org
> 
> Berkeley Foundation for Opportunities in Information Technology
>  - Advisory Board
>  - http://www.bfoit.org
> 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://lists.x.org/archives/xorg-devel/attachments/20110921/ca26ba1c/attachment-0001.pgp>


More information about the xorg-devel mailing list