[PATCH xserver] composite: Inhibit window background paint with manual subwindow redirection

ville.syrjala at nokia.com ville.syrjala at nokia.com
Fri May 6 08:19:34 PDT 2011


From: Ville Syrjälä <ville.syrjala at nokia.com>

The composite extension spec says that window background painting
should be inhibited when the subwindow redirection mode is set to
manual.

This eliminates the ugly flashing effect when compiz unredirects a
fullscreen window.

Signed-off-by: Ville Syrjälä <ville.syrjala at nokia.com>
---
 composite/compalloc.c |    2 ++
 include/windowstr.h   |    1 +
 mi/miexpose.c         |    4 ++++
 3 files changed, 7 insertions(+), 0 deletions(-)

diff --git a/composite/compalloc.c b/composite/compalloc.c
index 5c27631..60244d1 100644
--- a/composite/compalloc.c
+++ b/composite/compalloc.c
@@ -434,6 +434,7 @@ compRedirectSubwindows (ClientPtr pClient, WindowPtr pWin, int update)
 	 * critical output
 	 */
 	DamageExtSetCritical (pClient, TRUE);
+	pWin->inhibitBGPaint = TRUE;
     }
     return Success;
 }
@@ -466,6 +467,7 @@ compFreeClientSubwindows (WindowPtr pWin, XID id)
 		 */
 		DamageExtSetCritical (pClient, FALSE);
 		csw->update = CompositeRedirectAutomatic;
+		pWin->inhibitBGPaint = FALSE;
 		if (pWin->mapped)
 		    (*pWin->drawable.pScreen->ClearToBackground)(pWin, 0, 0, 0, 0, TRUE);
 	    }
diff --git a/include/windowstr.h b/include/windowstr.h
index 4a7a0f4..222de31 100644
--- a/include/windowstr.h
+++ b/include/windowstr.h
@@ -169,6 +169,7 @@ typedef struct _Window {
 #endif
 #ifdef COMPOSITE
     unsigned		damagedDescendants:1;	/* some descendants are damaged */
+    unsigned		inhibitBGPaint:1;	/* paint the background? */
 #endif
 } WindowRec;
 
diff --git a/mi/miexpose.c b/mi/miexpose.c
index 94258b8..0f1ebe5 100644
--- a/mi/miexpose.c
+++ b/mi/miexpose.c
@@ -575,6 +575,10 @@ miPaintWindow(WindowPtr pWin, RegionPtr prgn, int what)
 	tile_x_off = pWin->drawable.x - draw_x_off;
 	tile_y_off = pWin->drawable.y - draw_y_off;
 	fill = pWin->background;
+#ifdef COMPOSITE
+	if (pWin->inhibitBGPaint)
+	    return;
+#endif
 	switch (pWin->backgroundState) {
 	case None:
 	    return;
-- 
1.7.3.4



More information about the xorg-devel mailing list