Index: compiz-0.7.8/src/event.c =================================================================== --- compiz-0.7.8.orig/src/event.c 2008-10-13 12:34:37.000000000 -0700 +++ compiz-0.7.8/src/event.c 2008-10-13 12:38:20.000000000 -0700 @@ -2269,32 +2269,50 @@ if (w) { + XserverRegion parts = XFixesCreateRegion(de->display, NULL, 0); + XRectangle *rects; + int nRects; + w->texture->oldMipmaps = TRUE; + // Get the damage region + XDamageSubtract(de->display, de->damage, None, parts); + rects = XFixesFetchRegion(de->display, parts, &nRects); + XFixesDestroyRegion(de->display, parts); + if (w->syncWait) { - if (w->nDamage == w->sizeDamage) + int i; + + if (w->nDamage + nRects - 1 >= w->sizeDamage) { w->damageRects = realloc (w->damageRects, - (w->sizeDamage + 1) * + (w->sizeDamage + nRects) * sizeof (XRectangle)); - w->sizeDamage += 1; + w->sizeDamage += nRects; } - w->damageRects[w->nDamage].x = de->area.x; - w->damageRects[w->nDamage].y = de->area.y; - w->damageRects[w->nDamage].width = de->area.width; - w->damageRects[w->nDamage].height = de->area.height; - w->nDamage++; + for (i = 0; i < nRects; i++) + { + w->damageRects[w->nDamage] = rects[i]; + w->nDamage++; + } } else { - handleWindowDamageRect (w, - de->area.x, - de->area.y, - de->area.width, - de->area.height); + int i; + + for (i = 0; i < nRects; i++) + { + handleWindowDamageRect (w, + rects[i].x, + rects[i].y, + rects[i].width, + rects[i].height); + } } + + XFree(rects); } } else if (d->shapeExtension && Index: compiz-0.7.8/src/window.c =================================================================== --- compiz-0.7.8.orig/src/window.c 2008-10-13 12:34:37.000000000 -0700 +++ compiz-0.7.8/src/window.c 2008-10-13 12:38:28.000000000 -0700 @@ -2105,7 +2105,7 @@ XUnionRegion (&rect, w->region, w->region); w->damage = XDamageCreate (d->display, id, - XDamageReportRawRectangles); + XDamageReportNonEmpty); /* need to check for DisplayModal state on all windows */ w->state = getWindowState (d, w->id);