Switch automatic composite update to WorkQueue
It is currently (ab)using the screen BlockHandler callback to do this. But this can cause problems with other extension as their block handlers might have executed before Composite's. And the operations Composite does might result in them wanting to change timeouts. Practically this caused problems for TigerVNC's VNC extension which failed to send out updates for Composite's screen updates. (cherry picked from commit 1bd5d0a53c5ff4169c5a6704c1c4b276f998b938)
This commit is contained in:
		
				
					committed by
					
						
						Olivier Fourdan
					
				
			
			
				
	
			
			
			
						parent
						
							a41b6ef224
						
					
				
				
					commit
					b1215fb075
				
			@@ -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;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -156,7 +156,8 @@ typedef struct _CompScreen {
 | 
			
		||||
     */
 | 
			
		||||
    ChangeWindowAttributesProcPtr ChangeWindowAttributes;
 | 
			
		||||
 | 
			
		||||
    ScreenBlockHandlerProcPtr BlockHandler;
 | 
			
		||||
    Bool pendingScreenUpdate;
 | 
			
		||||
 | 
			
		||||
    CloseScreenProcPtr CloseScreen;
 | 
			
		||||
    int numAlternateVisuals;
 | 
			
		||||
    VisualID *alternateVisuals;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user