diff --git a/composite/compalloc.c b/composite/compalloc.c index 05ffc7e85..433dc820a 100644 --- a/composite/compalloc.c +++ b/composite/compalloc.c @@ -67,6 +67,18 @@ compBlockHandler(ScreenPtr pScreen, void *pTimeout) cs->BlockHandler = NULL; } +void +compMarkAncestors(WindowPtr pWin) +{ + pWin = pWin->parent; + while (pWin) { + if (pWin->damagedDescendants) + return; + pWin->damagedDescendants = TRUE; + pWin = pWin->parent; + } +} + static void compReportDamage(DamagePtr pDamage, RegionPtr pRegion, void *closure) { @@ -81,14 +93,7 @@ compReportDamage(DamagePtr pDamage, RegionPtr pRegion, void *closure) } cw->damaged = TRUE; - /* Mark the ancestors */ - pWin = pWin->parent; - while (pWin) { - if (pWin->damagedDescendants) - break; - pWin->damagedDescendants = TRUE; - pWin = pWin->parent; - } + compMarkAncestors(pWin); } static void diff --git a/composite/compint.h b/composite/compint.h index f05c2d8a5..89f6507b9 100644 --- a/composite/compint.h +++ b/composite/compint.h @@ -236,6 +236,8 @@ Bool compReallocPixmap(WindowPtr pWin, int x, int y, unsigned int w, unsigned int h, int bw); +void compMarkAncestors(WindowPtr pWin); + /* * compinit.c */ diff --git a/composite/compwindow.c b/composite/compwindow.c index f88238146..e74ce661a 100644 --- a/composite/compwindow.c +++ b/composite/compwindow.c @@ -432,6 +432,7 @@ compReparentWindow(WindowPtr pWin, WindowPtr pPriorParent) { ScreenPtr pScreen = pWin->drawable.pScreen; CompScreenPtr cs = GetCompScreen(pScreen); + CompWindowPtr cw = GetCompWindow(pWin); pScreen->ReparentWindow = cs->ReparentWindow; /* @@ -469,6 +470,10 @@ compReparentWindow(WindowPtr pWin, WindowPtr pPriorParent) (*pScreen->ReparentWindow) (pWin, pPriorParent); cs->ReparentWindow = pScreen->ReparentWindow; pScreen->ReparentWindow = compReparentWindow; + + if (pWin->damagedDescendants || (cw && cw->damaged)) + compMarkAncestors(pWin); + compCheckTree(pWin->drawable.pScreen); }