rendered paste bodydiff --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