summaryrefslogtreecommitdiff
path: root/composite
diff options
context:
space:
mode:
Diffstat (limited to 'composite')
-rw-r--r--composite/compalloc.c28
-rw-r--r--composite/compinit.c4
-rw-r--r--composite/compint.h3
3 files changed, 15 insertions, 20 deletions
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;