summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Harris <pharris@opentext.com>2017-12-14 12:21:19 -0500
committerAdam Jackson <ajax@redhat.com>2018-02-12 14:50:02 -0500
commit5c456b6e2a9a579e67ba577f9147642406f2ce99 (patch)
tree875a54d24db17841c4eeb24050931f22bfb1d2c8
parentdf319f889ddc952dd065bbb3252d045b90baaf8e (diff)
composite: Propagate damagedDescendants when reparented
If a window that is fully covered by an automatic-redirected descendant (even implicitly, eg. via BackingStores) is reparented, the automatic updates could be broken if the new parent is not marked as having damaged descendants. Fix this issue by propagating the damagedDescendants flag whenever a window is reparented. Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Peter Harris <pharris@opentext.com> (cherry picked from commit d5c23b29487d5ff440abf5ed0beb22c00f21e387)
-rw-r--r--composite/compalloc.c21
-rw-r--r--composite/compint.h2
-rw-r--r--composite/compwindow.c5
3 files changed, 20 insertions, 8 deletions
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);
}