From 183c6d06455114c61f6db57ec0a084caf11ece3a Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Sat, 14 Aug 2004 19:51:11 +0000 Subject: [PATCH] Wrap CopyWindow in cw, which fixes scrolling in many apps. --- miext/cw/cw.c | 43 +++++++++++++++++++++++++++++++++++++++++++ miext/cw/cw.h | 1 + 2 files changed, 44 insertions(+) diff --git a/miext/cw/cw.c b/miext/cw/cw.c index 7ab0aee24..f3a9934ca 100644 --- a/miext/cw/cw.c +++ b/miext/cw/cw.c @@ -653,6 +653,47 @@ cwPaintWindowBorder(WindowPtr pWin, RegionPtr pRegion, int what) SCREEN_EPILOGUE(pScreen, PaintWindowBorder, cwPaintWindowBorder); } +static void +cwCopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc) +{ + ScreenPtr pScreen = pWin->drawable.pScreen; + + SCREEN_PROLOGUE(pScreen, CopyWindow); + + if (!cwDrawableIsRedirWindow((DrawablePtr)pWin)) { + (*pScreen->CopyWindow)(pWin, ptOldOrg, prgnSrc); + } else { + GCPtr pGC; + BoxPtr pBox; + int nbox, i, x_off, y_off; + int dx, dy; + DrawablePtr pBackingDrawable; + + pBackingDrawable = cwGetBackingDrawable((DrawablePtr)pWin, &x_off, + &y_off); + + pGC = GetScratchGC(pBackingDrawable->depth, pScreen); + ValidateGC(pBackingDrawable, pGC); + + pBox = REGION_RECTS(prgnSrc); + nbox = REGION_NUM_RECTS(prgnSrc); + + dx = ptOldOrg.x - pWin->drawable.x; + dy = ptOldOrg.y - pWin->drawable.y; + + for (i = 0; i < nbox; i++, pBox++) { + (*pGC->ops->CopyArea)(pBackingDrawable, pBackingDrawable, pGC, + pBox->x1 + x_off, pBox->y1 + y_off, + pBox->x2 - pBox->x1, pBox->y2 - pBox->y1, + pBox->x1 + x_off + dx, pBox->y1 + y_off + dy); + } + + FreeScratchGC(pGC); + } + + SCREEN_EPILOGUE(pScreen, CopyWindow, cwCopyWindow); +} + /* Screen initialization/teardown */ void miInitializeCompositeWrapper(ScreenPtr pScreen) @@ -688,6 +729,7 @@ miInitializeCompositeWrapper(ScreenPtr pScreen) SCREEN_EPILOGUE(pScreen, CreateGC, cwCreateGC); SCREEN_EPILOGUE(pScreen, PaintWindowBackground, cwPaintWindowBackground); SCREEN_EPILOGUE(pScreen, PaintWindowBorder, cwPaintWindowBorder); + SCREEN_EPILOGUE(pScreen, CopyWindow, cwCopyWindow); #ifdef RENDER if (GetPictureScreen (pScreen)) @@ -711,6 +753,7 @@ cwCloseScreen (int i, ScreenPtr pScreen) pScreen->CreateGC = pScreenPriv->CreateGC; pScreen->PaintWindowBackground = pScreenPriv->PaintWindowBackground; pScreen->PaintWindowBorder = pScreenPriv->PaintWindowBorder; + pScreen->CopyWindow = pScreenPriv->CopyWindow; #ifdef RENDER if (ps) diff --git a/miext/cw/cw.h b/miext/cw/cw.h index 037237005..2ff2e6576 100644 --- a/miext/cw/cw.h +++ b/miext/cw/cw.h @@ -62,6 +62,7 @@ typedef struct { PaintWindowBackgroundProcPtr PaintWindowBackground; PaintWindowBorderProcPtr PaintWindowBorder; + CopyWindowProcPtr CopyWindow; #ifdef RENDER DestroyPictureProcPtr DestroyPicture;