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 -#define CORE_ABIVERSION 20080310 +#define CORE_ABIVERSION 20080311 #include #include @@ -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