composite/compinit.c | 8 ++++---- composite/compint.h | 3 +++ composite/compwindow.c | 28 ++++++++++++++++++++++++++++ damageext/damageext.c | 12 ++++++++++++ damageext/damageextint.h | 1 + miext/damage/damage.c | 26 ++++++++++++++++++++++++++ miext/damage/damagestr.h | 2 ++ 7 files changed, 76 insertions(+), 4 deletions(-) Index: composite/compinit.c =================================================================== RCS file: /cvs/xorg/xserver/xorg/composite/compinit.c,v retrieving revision 1.9 diff -u -d -p -r1.9 compinit.c --- composite/compinit.c 3 Jul 2005 07:37:34 -0000 1.9 +++ composite/compinit.c 12 Jan 2006 23:18:31 -0000 @@ -28,10 +28,10 @@ #include "compint.h" -int CompScreenPrivateIndex; -int CompWindowPrivateIndex; -int CompSubwindowsPrivateIndex; -int CompGeneration; +int CompScreenPrivateIndex = -1; +int CompWindowPrivateIndex = -1; +int CompSubwindowsPrivateIndex = -1; +int CompGeneration = -1; static Bool compCloseScreen (int index, ScreenPtr pScreen) Index: composite/compint.h =================================================================== RCS file: /cvs/xorg/xserver/xorg/composite/compint.h,v retrieving revision 1.8 diff -u -d -p -r1.8 compint.h --- composite/compint.h 3 Jul 2005 08:53:37 -0000 1.8 +++ composite/compint.h 12 Jan 2006 23:18:31 -0000 @@ -257,4 +257,7 @@ compCopyWindow (WindowPtr pWin, DDXPoint void compWindowUpdate (WindowPtr pWin); +int +compRedirectMode(WindowPtr pWin); + #endif /* _COMPINT_H_ */ Index: composite/compwindow.c =================================================================== RCS file: /cvs/xorg/xserver/xorg/composite/compwindow.c,v retrieving revision 1.11 diff -u -d -p -r1.11 compwindow.c --- composite/compwindow.c 3 Jul 2005 07:37:34 -0000 1.11 +++ composite/compwindow.c 12 Jan 2006 23:18:31 -0000 @@ -296,6 +296,34 @@ compImplicitRedirect (WindowPtr pWin, Wi return FALSE; } +/* + * We're lazy about creating window privates, since redirecting a window + * implicitly redirects its children. So we have to walk up towards the + * root to find out how we're being redirected. + */ +int +compRedirectMode(WindowPtr pWin) +{ + CompWindowPtr cw = NULL; + + if (CompWindowPrivateIndex == -1) { + return -1; + } + + for (; pWin; pWin = pWin->parent) { + if (pWin->parent == pWin || pWin->parent == NULL) + break; /* failure */ + if ((cw = GetCompWindow(pWin))) + break; /* success */ + } + + if (!cw) { + return -1; + } + + return cw->update; +} + void compMoveWindow (WindowPtr pWin, int x, int y, WindowPtr pSib, VTKind kind) { Index: damageext/damageext.c =================================================================== RCS file: /cvs/xorg/xserver/xorg/damageext/damageext.c,v retrieving revision 1.6 diff -u -d -p -r1.6 damageext.c --- damageext/damageext.c 3 Jul 2005 07:37:35 -0000 1.6 +++ damageext/damageext.c 12 Jan 2006 23:18:31 -0000 @@ -95,6 +95,18 @@ static void DamageExtReport (DamagePtr pDamage, RegionPtr pRegion, void *closure) { DamageExtPtr pDamageExt = closure; + WindowPtr pWin = NULL; + +#ifdef COMPOSITE + /* skip reporting damage on manually-redirected windows in XMoveWindow */ + if (pDamageExt->pDrawable->type == DRAWABLE_WINDOW) { + pWin = (WindowPtr)pDamageExt->pDrawable; + if (damageInMoveWindow(pWin) && + compRedirectMode(pWin) == CompositeRedirectManual) { + return; + } + } +#endif switch (pDamageExt->level) { case DamageReportRawRegion: Index: damageext/damageextint.h =================================================================== RCS file: /cvs/xorg/xserver/xorg/damageext/damageextint.h,v retrieving revision 1.6 diff -u -d -p -r1.6 damageextint.h --- damageext/damageextint.h 3 Jul 2005 08:53:38 -0000 1.6 +++ damageext/damageextint.h 12 Jan 2006 23:18:31 -0000 @@ -43,6 +43,7 @@ #include "damageext.h" #include "damage.h" #include "xfixes.h" +#include "compint.h" extern unsigned char DamageReqCode; extern int DamageEventBase; Index: miext/damage/damage.c =================================================================== RCS file: /cvs/xorg/xserver/xorg/miext/damage/damage.c,v retrieving revision 1.19 diff -u -d -p -r1.19 damage.c --- miext/damage/damage.c 6 Oct 2005 21:55:41 -0000 1.19 +++ miext/damage/damage.c 12 Jan 2006 23:18:31 -0000 @@ -1571,6 +1571,30 @@ damageDestroyPixmap (PixmapPtr pPixmap) return TRUE; } +Bool +damageInMoveWindow(WindowPtr pWin) +{ + ScreenPtr pScreen = pWin->drawable.pScreen; + damageScrPriv(pScreen); + + return pScrPriv->in_move_window; +} + +static void +damageMoveWindow(WindowPtr pWin, int x, int y, WindowPtr pSib, VTKind kind) +{ + ScreenPtr pScreen = pWin->drawable.pScreen; + damageScrPriv(pScreen); + + pScrPriv->in_move_window = TRUE; + + unwrap(pScrPriv, pScreen, MoveWindow); + pScreen->MoveWindow(pWin, x, y, pSib, kind); + wrap(pScrPriv, pScreen, MoveWindow, damageMoveWindow); + + pScrPriv->in_move_window = FALSE; +} + static void damagePaintWindow(WindowPtr pWindow, RegionPtr prgn, @@ -1721,6 +1745,7 @@ damageCloseScreen (int i, ScreenPtr pScr unwrap (pScrPriv, pScreen, PaintWindowBackground); unwrap (pScrPriv, pScreen, PaintWindowBorder); unwrap (pScrPriv, pScreen, CopyWindow); + unwrap (pScrPriv, pScreen, MoveWindow); unwrap (pScrPriv, pScreen, CloseScreen); unwrap (pScrPriv, pScreen, BackingStoreFuncs.RestoreAreas); xfree (pScrPriv); @@ -1791,6 +1816,7 @@ DamageSetup (ScreenPtr pScreen) wrap (pScrPriv, pScreen, DestroyWindow, damageDestroyWindow); wrap (pScrPriv, pScreen, SetWindowPixmap, damageSetWindowPixmap); wrap (pScrPriv, pScreen, CopyWindow, damageCopyWindow); + wrap (pScrPriv, pScreen, MoveWindow, damageMoveWindow); wrap (pScrPriv, pScreen, CloseScreen, damageCloseScreen); wrap (pScrPriv, pScreen, BackingStoreFuncs.RestoreAreas, damageRestoreAreas); Index: miext/damage/damagestr.h =================================================================== RCS file: /cvs/xorg/xserver/xorg/miext/damage/damagestr.h,v retrieving revision 1.6 diff -u -d -p -r1.6 damagestr.h --- miext/damage/damagestr.h 3 Jul 2005 07:02:01 -0000 1.6 +++ miext/damage/damagestr.h 12 Jan 2006 23:18:31 -0000 @@ -61,6 +61,7 @@ typedef struct _damageScrPriv { PaintWindowBackgroundProcPtr PaintWindowBackground; PaintWindowBorderProcPtr PaintWindowBorder; CopyWindowProcPtr CopyWindow; + MoveWindowProcPtr MoveWindow; CloseScreenProcPtr CloseScreen; CreateGCProcPtr CreateGC; DestroyPixmapProcPtr DestroyPixmap; @@ -71,6 +72,7 @@ typedef struct _damageScrPriv { GlyphsProcPtr Glyphs; #endif BSFuncRec BackingStoreFuncs; + Bool in_move_window; } DamageScrPrivRec, *DamageScrPrivPtr; typedef struct _damageGCPriv {