[RFC][PATCH] dix/mi/composite: Suppress ClipNotify during window redirection UnmapWindow

ville.syrjala at nokia.com ville.syrjala at nokia.com
Mon Dec 13 09:15:15 PST 2010


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

When window redirection is changed, UnmapWindow() is called internally,
which leads to windows temporarily getting unrealized. When a window is
unrealized, ClipNotify() is called with an empty clip. In the case of
Xv this leads to video overlays blinking off and on in a very annoying
fashion. Suppress these ClipNotify() calls around the UnmapWindow()
calls made from the composite code.

Signed-off-by: Ville Syrjälä <ville.syrjala at nokia.com>
---
I'm not 100% sure about the safety of this patch, hence to RFC. However
it seems to me that all other windows whose clipping may be affected
should get a ClipNotify via ValidateTree. And the redirected window
itself will get a ClipNotity again when it gets remapped.

 composite/compalloc.c |    6 ++++++
 dix/window.c          |   24 ++++++++++++++++++++++++
 include/window.h      |    4 ++++
 mi/mioverlay.c        |    3 ++-
 mi/miwindow.c         |    3 ++-
 5 files changed, 38 insertions(+), 2 deletions(-)

diff --git a/composite/compalloc.c b/composite/compalloc.c
index 246e4c5..0ae8c3b 100644
--- a/composite/compalloc.c
+++ b/composite/compalloc.c
@@ -130,7 +130,9 @@ compRedirectWindow (ClientPtr pClient, WindowPtr pWin, int update)
 	if (wasMapped)
 	{
 	    DisableMapUnmapEvents (pWin);
+	    DisableUnrealizeClipNotify ();
 	    UnmapWindow (pWin, FALSE);
+	    EnableUnrealizeClipNotify ();
 	    EnableMapUnmapEvents (pWin);
 	}
 
@@ -159,7 +161,9 @@ compRedirectWindow (ClientPtr pClient, WindowPtr pWin, int update)
 	if (pWin->mapped) 
 	{
 	    DisableMapUnmapEvents (pWin);
+	    DisableUnrealizeClipNotify ();
 	    UnmapWindow (pWin, FALSE);
+	    EnableUnrealizeClipNotify ();
 	    EnableMapUnmapEvents (pWin);
 	}
 	if (cw->damageRegistered)
@@ -217,7 +221,9 @@ compFreeClientWindow (WindowPtr pWin, XID id)
 	if (wasMapped)
 	{
 	    DisableMapUnmapEvents (pWin);
+	    DisableUnrealizeClipNotify ();
 	    UnmapWindow (pWin, FALSE);
+	    EnableUnrealizeClipNotify ();
 	    EnableMapUnmapEvents (pWin);
 	}
     
diff --git a/dix/window.c b/dix/window.c
index 0362dce..26e9c5f 100644
--- a/dix/window.c
+++ b/dix/window.c
@@ -2575,6 +2575,30 @@ MapUnmapEventsEnabled(WindowPtr pWin)
     return pWin != windowDisableMapUnmapEvents;
 }
 
+static Bool disableUnrealizeClipNotify;
+
+void
+DisableUnrealizeClipNotify(void)
+{
+    assert (!disableUnrealizeClipNotify);
+
+    disableUnrealizeClipNotify = TRUE;
+}
+
+void
+EnableUnrealizeClipNotify(void)
+{
+    assert (disableUnrealizeClipNotify);
+
+    disableUnrealizeClipNotify = FALSE;
+}
+
+Bool
+UnrealizeClipNotifyEnabled(void)
+{
+    return !disableUnrealizeClipNotify;
+}
+
 /*****
  * MapWindow
  *    If some other client has selected SubStructureReDirect on the parent
diff --git a/include/window.h b/include/window.h
index 6fb2f8c..221d9f3 100644
--- a/include/window.h
+++ b/include/window.h
@@ -266,4 +266,8 @@ extern _X_EXPORT void DisableMapUnmapEvents(
 extern _X_EXPORT void EnableMapUnmapEvents(
     WindowPtr /* pWin */ );
 
+extern void DisableUnrealizeClipNotify(void);
+extern void EnableUnrealizeClipNotify(void);
+extern Bool UnrealizeClipNotifyEnabled(void);
+
 #endif /* WINDOW_H */
diff --git a/mi/mioverlay.c b/mi/mioverlay.c
index 766c5e7..61a1bed 100644
--- a/mi/mioverlay.c
+++ b/mi/mioverlay.c
@@ -711,7 +711,8 @@ miOverlayMarkUnrealizedWindow(
 	miOverlayTreePtr pTree;
 
         RegionEmpty(&pChild->clipList);
-        if (pChild->drawable.pScreen->ClipNotify)
+        if (pChild->drawable.pScreen->ClipNotify &&
+	    UnrealizeClipNotifyEnabled())
             (* pChild->drawable.pScreen->ClipNotify)(pChild, 0, 0);
         RegionEmpty(&pChild->borderClip);
 	if((pTree = MIOVERLAY_GET_WINDOW_TREE(pChild))) {
diff --git a/mi/miwindow.c b/mi/miwindow.c
index 25dd1c0..ad15e65 100644
--- a/mi/miwindow.c
+++ b/mi/miwindow.c
@@ -805,7 +805,8 @@ miMarkUnrealizedWindow(WindowPtr pChild, WindowPtr pWin, Bool fromConfigure)
     if ((pChild != pWin) || fromConfigure)
     {
 	RegionEmpty(&pChild->clipList);
-	if (pChild->drawable.pScreen->ClipNotify)
+	if (pChild->drawable.pScreen->ClipNotify &&
+	    UnrealizeClipNotifyEnabled())
 	    (* pChild->drawable.pScreen->ClipNotify)(pChild, 0, 0);
 	RegionEmpty(&pChild->borderClip);
     }
-- 
1.7.2.2



More information about the xorg-devel mailing list