All pastes #938957 Raw Edit

Miscellany

public text v1 · immutable
·published 2008-03-11 23:21 UTC
rendered paste body
diff --git a/include/compiz-core.h b/include/compiz-core.h
index 7f317eb..c8082bb 100644
--- a/include/compiz-core.h
+++ b/include/compiz-core.h
@@ -28,7 +28,7 @@
 
 #include <compiz-plugin.h>
 
-#define CORE_ABIVERSION 20080310
+#define CORE_ABIVERSION 20080311
 
 #include <stdio.h>
 #include <sys/time.h>
@@ -2274,6 +2274,9 @@ showOutputWindow (CompScreen *s);
 void
 hideOutputWindow (CompScreen *s);
 
+void
+updateOutputWindow (CompScreen *s);
+
 Bool
 addScreen (CompDisplay *display,
 	   int	       screenNum,
@@ -2582,6 +2585,7 @@ struct _CompWindow {
     Bool	      redirected;
     Bool	      managed;
     Bool	      bindFailed;
+    Bool	      overlayWindow;
     int		      destroyRefCnt;
     int		      unmapRefCnt;
 
diff --git a/src/display.c b/src/display.c
diff --git a/src/paint.c b/src/paint.c
index 1c3d2e2..f14ca98 100644
--- a/src/paint.c
+++ b/src/paint.c
@@ -161,7 +161,7 @@ paintOutputRegion (CompScreen	       *screen,
     static Region tmpRegion = NULL;
     CompWindow    *w;
     CompCursor	  *c;
-    int		  count, windowMask, backgroundMask, odMask;
+    int		  count, windowMask, backgroundMask, odMask, i;
     CompWindow	  *fullscreenWindow = NULL;
     CompWalker    walk;
     Bool          status;
@@ -246,19 +246,30 @@ paintOutputRegion (CompScreen	       *screen,
 		XSubtractRegion (tmpRegion, w->region, tmpRegion);
 
 	    /* unredirect top most fullscreen windows. */
-	    if (count == 0					      &&
-		!REGION_NOT_EMPTY (tmpRegion)			      &&
-		screen->opt[COMP_SCREEN_OPTION_UNREDIRECT_FS].value.b &&
-		XEqualRegion (w->region, &screen->region))
+	    if (count == 0 &&
+		screen->opt[COMP_SCREEN_OPTION_UNREDIRECT_FS].value.b)
 	    {
-		unredirectWindow (w);
-		fullscreenWindow = w;
+		if (XEqualRegion (w->region, &screen->region) &&
+		    !REGION_NOT_EMPTY (tmpRegion))
+		{
+		    fullscreenWindow = w;
+		}
+		else
+		{
+		    for (i = 0; i < screen->nOutputDev; i++)
+			if (XEqualRegion (w->region,
+					  &screen->outputDev[i].region))
+			    fullscreenWindow = w;
+		}
 	    }
 	}
 
 	count++;
     }
 
+    if (fullscreenWindow)
+	unredirectWindow (fullscreenWindow);
+
     (*screen->paintBackground) (screen, tmpRegion, backgroundMask);
 
     /* paint all windows from bottom to top */
diff --git a/src/screen.c b/src/screen.c
index 1a91539..4c2c8b9 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -1347,6 +1347,50 @@ hideOutputWindow (CompScreen *s)
 
 }
 
+void
+updateOutputWindow (CompScreen *s)
+{
+
+#ifdef USE_COW
+    if (useCow)
+    {
+	Display       *dpy = s->display->display;
+	XserverRegion region;
+	static Region tmpRegion = NULL;
+	CompWindow    *w;
+
+	if (!tmpRegion)
+	{
+	    tmpRegion = XCreateRegion ();
+	    if (!tmpRegion)
+		return;
+	}
+
+	XSubtractRegion (&s->region, &emptyRegion, tmpRegion);
+
+	for (w = s->reverseWindows; w; w = w->prev)
+	    if (w->overlayWindow)
+	    {
+		XSubtractRegion (tmpRegion, w->region, tmpRegion);
+	    }
+	
+	XShapeCombineRegion (dpy, s->output, ShapeBounding,
+			     0, 0, tmpRegion, ShapeSet);
+
+
+	region = XFixesCreateRegion (dpy, NULL, 0);
+
+	XFixesSetWindowShapeRegion (dpy,
+				    s->output,
+				    ShapeInput,
+				    0, 0, region);
+
+	XFixesDestroyRegion (dpy, region);
+    }
+#endif
+
+}
+
 static void
 makeOutputWindow (CompScreen *s)
 {
diff --git a/src/window.c b/src/window.c
index 1b5a021..8f79c83 100644
--- a/src/window.c
+++ b/src/window.c
@@ -2001,6 +2001,8 @@ addWindow (CompScreen *screen,
     w->closeRequests	    = 0;
     w->lastCloseRequestTime = 0;
 
+    w->overlayWindow = FALSE;
+
     if (screen->windowPrivateLen)
     {
 	privates = malloc (screen->windowPrivateLen * sizeof (CompPrivate));
@@ -4785,11 +4787,12 @@ unredirectWindow (CompWindow *w)
     XCompositeUnredirectWindow (w->screen->display->display, w->id,
 				CompositeRedirectManual);
 
-    w->redirected = FALSE;
+    w->redirected   = FALSE;
+    w->overlayWindow = TRUE;
     w->screen->overlayWindowCount++;
 
     if (w->screen->overlayWindowCount > 0)
-	hideOutputWindow (w->screen);
+	updateOutputWindow (w->screen);
 }
 
 void
@@ -4802,10 +4805,17 @@ redirectWindow (CompWindow *w)
 			      CompositeRedirectManual);
 
     w->redirected = TRUE;
-    w->screen->overlayWindowCount--;
+
+    if (w->overlayWindow)
+    {
+	w->screen->overlayWindowCount--;
+	w->overlayWindow = FALSE;
+    }
 
     if (w->screen->overlayWindowCount < 1)
 	showOutputWindow (w->screen);
+    else
+	updateOutputWindow (w->screen);
 }
 
 void