--- paint.c 2007-04-05 01:11:50.000000000 +0300 +++ paint.c-new 2007-04-05 02:04:23.000000000 +0300 @@ -157,7 +157,9 @@ static Region tmpRegion = NULL; CompWindow *w; CompCursor *c; - int count, windowMask, backgroundMask; + int count, windowMask, backgroundMask, occluionMask; + Bool btf = (mask & PAINT_SCREEN_ORDER_FRONT_TO_BACK_MASK) && + !(mask & PAINT_SCREEN_ORDER_BACK_TO_FRONT_MASK); // Do FTB drawing only if FTB flag is set and BTF flag isn't if (!tmpRegion) { @@ -179,10 +181,29 @@ count = 0; } + if (ftb) + { + windowMask |= PAINT_WINDOW_FRONT_TO_BACK_MASK; + occluionMask = PAINT_WINDOW_OCCLUSION_DETECTION_MASK | + PAINT_WINDOW_FRONT_TO_BACK_MASK; + } + else + { + windowMask |= PAINT_WINDOW_BACK_TO_FRONT_MASK; + occluionMask = PAINT_WINDOW_OCCLUSION_DETECTION_MASK | + PAINT_WINDOW_BACK_TO_FRONT_MASK; + } + + XSubtractRegion (region, &emptyRegion, tmpRegion); /* detect occlusions */ - for (w = screen->reverseWindows; w; w = w->prev) + if (ftb) + w = screen->windows; + else + w = screen->reverseWindows; + + while (w) { if (w->destroyed) continue; @@ -197,7 +218,7 @@ XSubtractRegion (tmpRegion, &emptyRegion, w->clip); if ((*screen->paintWindow) (w, &w->paint, transform, tmpRegion, - PAINT_WINDOW_OCCLUSION_DETECTION_MASK)) + occluionMask)) { /* unredirect top most fullscreen windows. */ if (count == 0 && @@ -212,12 +233,22 @@ } count++; + + if (ftb) + w = w->next; + else + w = w->prev; } (*screen->paintBackground) (screen, tmpRegion, backgroundMask); /* paint all windows from bottom to top */ - for (w = screen->windows; w; w = w->next) + if (ftb) + w = screen->windows; + else + w = screen->reverseWindows; + + while (w) { if (w->destroyed) continue; @@ -229,11 +260,26 @@ } (*screen->paintWindow) (w, &w->paint, transform, w->clip, windowMask); + + if (ftb) + w = w->next; + else + w = w->prev; } - /* paint cursors */ - for (c = screen->cursors; c; c = c->next) - (*screen->paintCursor) (c, transform, tmpRegion, 0); + if (!(mask & PAINT_SCREEN_ORDER_FRONT_TO_BACK_MASK) || + !(mask & PAINT_SCREEN_ORDER_BACK_TO_FRONT_MASK)) + { + /* paint cursors */ + for (c = screen->cursors; c; c = c->next) + (*screen->paintCursor) (c, transform, tmpRegion, 0); + } + else + { + /* paint the screen in Front-To-Back mode (by removing the BTF mask, so only FTB mask stays) */ + paintScreenRegion (screen, *transform, region, output, + mask & (~PAINT_SCREEN_ORDER_BACK_TO_FRONT_MASK)) + } }