Signed-off-by: Adam Jackson
---
mi/mivaltree.c | 108 ++---
1 file changed, 58 insertions(+), 50 deletions(-)
diff --git a/mi/mivaltree.c b/mi/mivaltree.c
index ea6889fdc0..f47cfa4571 100644
--- a/mi/mivaltree.c
+++ b/mi/mivaltree.c
@@ -164,14 +164,16 @@ miShapedWindowIn(RegionPtr universe, RegionPtr bounding,
/*
* Manual redirected windows are treated as transparent; they do not obscure
- * siblings or parent windows
+ * siblings or parent windows. Likewise windows that are paintable but not
+ * mapped.
*/
-#ifdef COMPOSITE
-#define TreatAsTransparent(w) ((w)->redirectDraw == RedirectDrawManual)
-#else
-#define TreatAsTransparent(w) FALSE
-#endif
+static Bool
+TreatAsTransparent(WindowPtr w)
+{
+return (w->redirectDraw == RedirectDrawManual) ||
+(w->paintable && !w->mapped);
+}
#define HasParentRelativeBorder(w) (!(w)->borderIsPixel && \
HasBorder(w) && \
@@ -181,7 +183,7 @@ miShapedWindowIn(RegionPtr universe, RegionPtr bounding,
*---
* miComputeClips --
* Recompute the clipList, borderClip, exposed and borderExposed
- * regions for pParent and its children. Only viewable windows are
+ * regions for pParent and its children. Only paintable windows are
* taken into account.
*
* Results:
@@ -240,37 +242,45 @@ miComputeClips(WindowPtr pParent,
}
#endif
-oldVis = pParent->visibility;
-switch (RegionContainsRect(universe, )) {
-case rgnIN:
-newVis = VisibilityUnobscured;
-break;
-case rgnPART:
-newVis = VisibilityPartiallyObscured;
-{
-RegionPtr pBounding;
+oldVis = newVis = pParent->visibility;
+if (pParent->realized) {
+switch (RegionContainsRect(universe, )) {
+case rgnIN:
+newVis = VisibilityUnobscured;
+break;
+case rgnPART:
+newVis = VisibilityPartiallyObscured;
+{
+RegionPtr pBounding;
-if ((pBounding = wBoundingShape(pParent))) {
-switch (miShapedWindowIn(universe, pBounding,
- ,
- pParent->drawable.x,
- pParent->drawable.y)) {
-case rgnIN:
-newVis = VisibilityUnobscured;
-break;
-case rgnOUT:
-newVis = VisibilityFullyObscured;
-break;
+if ((pBounding = wBoundingShape(pParent))) {
+switch (miShapedWindowIn(universe, pBounding,
+ ,
+ pParent->drawable.x,
+ pParent->drawable.y)) {
+case rgnIN:
+newVis = VisibilityUnobscured;
+break;
+case rgnOUT:
+newVis = VisibilityFullyObscured;
+break;
+}
}
}
+break;
+default:
+newVis = VisibilityFullyObscured;
+break;
}
-break;
-default:
+}
+else if (pParent->paintable)
newVis = VisibilityFullyObscured;
-break;
+else {
+newVis = VisibilityNotViewable;
}
pParent->visibility = newVis;
-if (oldVis != newVis &&
+if (pParent->realized &&
+oldVis != newVis &&
((pParent->
eventMask | wOtherEventMasks(pParent)) & VisibilityChangeMask))
SendVisibilityNotify(pParent);
@@ -293,14 +303,13 @@ miComputeClips(WindowPtr pParent,
(oldVis == VisibilityUnobscured))) {
pChild = pParent;
while (1) {
-if (pChild->viewable) {
+if (pChild->paintable) {
if (pChild->visibility != VisibilityFullyObscured) {
RegionTranslate(>borderClip, dx, dy);
RegionTranslate(>clipList, dx, dy);
pChild->drawable.serialNumber = NEXT_SERIAL_NUMBER;
if (pScreen->ClipNotify)
(*pScreen->ClipNotify) (pChild, dx, dy);
-
}
if (pChild->valdata) {
RegionNull(>valdata->after.borderExposed);
@@ -399,22 +408,22 @@ miComputeClips(WindowPtr pParent,
((pChild->drawable.y == pParent->lastChild->drawable.y) &&
(pChild->drawable.x < pParent->lastChild->drawable.x))) {
for (; pChild; pChild = pChild->nextSib) {
-if (pChild->viewable && !TreatAsTransparent(pChild))
+if (pChild->paintable && !TreatAsTransparent(pChild))