diff --git a/composite/compalloc.c b/composite/compalloc.c index 433dc820a..3e2f14fb0 100644 --- a/composite/compalloc.c +++ b/composite/compalloc.c @@ -47,24 +47,18 @@ #include "compint.h" -static void -compScreenUpdate(ScreenPtr pScreen) -{ - compCheckTree(pScreen); - compPaintChildrenToWindow(pScreen->root); -} - -static void -compBlockHandler(ScreenPtr pScreen, void *pTimeout) +static Bool +compScreenUpdate(ClientPtr pClient, void *closure) { + ScreenPtr pScreen = closure; CompScreenPtr cs = GetCompScreen(pScreen); - pScreen->BlockHandler = cs->BlockHandler; - compScreenUpdate(pScreen); - (*pScreen->BlockHandler) (pScreen, pTimeout); + compCheckTree(pScreen); + compPaintChildrenToWindow(pScreen->root); - /* Next damage will restore the block handler */ - cs->BlockHandler = NULL; + /* Next damage will restore the worker */ + cs->pendingScreenUpdate = FALSE; + return TRUE; } void @@ -87,9 +81,9 @@ compReportDamage(DamagePtr pDamage, RegionPtr pRegion, void *closure) CompScreenPtr cs = GetCompScreen(pScreen); CompWindowPtr cw = GetCompWindow(pWin); - if (!cs->BlockHandler) { - cs->BlockHandler = pScreen->BlockHandler; - pScreen->BlockHandler = compBlockHandler; + if (!cs->pendingScreenUpdate) { + QueueWorkProc(compScreenUpdate, serverClient, pScreen); + cs->pendingScreenUpdate = TRUE; } cw->damaged = TRUE; diff --git a/composite/compinit.c b/composite/compinit.c index 2590aa46d..6ea33ea4e 100644 --- a/composite/compinit.c +++ b/composite/compinit.c @@ -387,6 +387,8 @@ compScreenInit(ScreenPtr pScreen) cs->pOverlayWin = NULL; cs->pOverlayClients = NULL; + cs->pendingScreenUpdate = FALSE; + cs->numAlternateVisuals = 0; cs->alternateVisuals = NULL; cs->numImplicitRedirectExceptions = 0; @@ -442,8 +444,6 @@ compScreenInit(ScreenPtr pScreen) cs->ChangeWindowAttributes = pScreen->ChangeWindowAttributes; pScreen->ChangeWindowAttributes = compChangeWindowAttributes; - cs->BlockHandler = NULL; - cs->CloseScreen = pScreen->CloseScreen; pScreen->CloseScreen = compCloseScreen; diff --git a/composite/compint.h b/composite/compint.h index 89f6507b9..d501bad65 100644 --- a/composite/compint.h +++ b/composite/compint.h @@ -156,7 +156,8 @@ typedef struct _CompScreen { */ ChangeWindowAttributesProcPtr ChangeWindowAttributes; - ScreenBlockHandlerProcPtr BlockHandler; + Bool pendingScreenUpdate; + CloseScreenProcPtr CloseScreen; int numAlternateVisuals; VisualID *alternateVisuals;