diff options
Diffstat (limited to 'composite')
-rw-r--r-- | composite/compalloc.c | 13 | ||||
-rw-r--r-- | composite/compinit.c | 4 | ||||
-rw-r--r-- | composite/compint.h | 5 | ||||
-rw-r--r-- | composite/compwindow.c | 22 |
4 files changed, 31 insertions, 13 deletions
diff --git a/composite/compalloc.c b/composite/compalloc.c index b2e3f7165..e4064f6b1 100644 --- a/composite/compalloc.c +++ b/composite/compalloc.c @@ -47,11 +47,11 @@ #include "compint.h" -void +static void compScreenUpdate (ScreenPtr pScreen) { compCheckTree (pScreen); - compWindowUpdate (pScreen->root); + compPaintChildrenToWindow (pScreen->root); } static void @@ -84,6 +84,15 @@ compReportDamage (DamagePtr pDamage, RegionPtr pRegion, void *closure) pScreen->BlockHandler = compBlockHandler; } cw->damaged = TRUE; + + /* Mark the ancestors */ + pWin = pWin->parent; + while (pWin) { + if (pWin->damagedDescendants) + break; + pWin->damagedDescendants = TRUE; + pWin = pWin->parent; + } } static void diff --git a/composite/compinit.c b/composite/compinit.c index 74689be1f..90ee66c88 100644 --- a/composite/compinit.c +++ b/composite/compinit.c @@ -145,7 +145,7 @@ compGetImage (DrawablePtr pDrawable, pScreen->GetImage = cs->GetImage; if (pDrawable->type == DRAWABLE_WINDOW) - compScreenUpdate (pScreen); + compPaintChildrenToWindow ((WindowPtr) pDrawable); (*pScreen->GetImage) (pDrawable, sx, sy, w, h, format, planemask, pdstLine); cs->GetImage = pScreen->GetImage; pScreen->GetImage = compGetImage; @@ -161,7 +161,7 @@ static void compSourceValidate(DrawablePtr pDrawable, pScreen->SourceValidate = cs->SourceValidate; if (pDrawable->type == DRAWABLE_WINDOW && subWindowMode == IncludeInferiors) - compScreenUpdate (pScreen); + compPaintChildrenToWindow ((WindowPtr) pDrawable); if (pScreen->SourceValidate) (*pScreen->SourceValidate) (pDrawable, x, y, width, height, subWindowMode); diff --git a/composite/compint.h b/composite/compint.h index 681f651e9..57e0b5dea 100644 --- a/composite/compint.h +++ b/composite/compint.h @@ -315,10 +315,7 @@ void compCopyWindow (WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc); void -compWindowUpdate (WindowPtr pWin); - -void -compScreenUpdate (ScreenPtr pScreen); +compPaintChildrenToWindow (WindowPtr pWin); WindowPtr CompositeRealChildHead (WindowPtr pWin); diff --git a/composite/compwindow.c b/composite/compwindow.c index 22d237481..2440f1897 100644 --- a/composite/compwindow.c +++ b/composite/compwindow.c @@ -720,13 +720,11 @@ compWindowUpdateAutomatic (WindowPtr pWin) DamageEmpty (cw->damage); } -void -compWindowUpdate (WindowPtr pWin) +static void +compPaintWindowToParent (WindowPtr pWin) { - WindowPtr pChild; + compPaintChildrenToWindow (pWin); - for (pChild = pWin->lastChild; pChild; pChild = pChild->prevSib) - compWindowUpdate (pChild); if (pWin->redirectDraw != RedirectDrawNone) { CompWindowPtr cw = GetCompWindow(pWin); @@ -739,6 +737,20 @@ compWindowUpdate (WindowPtr pWin) } } +void +compPaintChildrenToWindow (WindowPtr pWin) +{ + WindowPtr pChild; + + if (!pWin->damagedDescendants) + return; + + for (pChild = pWin->lastChild; pChild; pChild = pChild->prevSib) + compPaintWindowToParent (pChild); + + pWin->damagedDescendants = FALSE; +} + WindowPtr CompositeRealChildHead (WindowPtr pWin) { |