[PATCH 1/3] InitRootWindow: Use ChangeWindowAttributes instead of duplicating it.

walter harms wharms at bfs.de
Sun Nov 20 06:14:00 PST 2011



Am 20.11.2011 12:48, schrieb Jamey Sharp:
> The protocol requires ChangeWindowAttributes to be able to set the root
> window's background and cursor to their defaults. So let's just use that
> when InitRootWindow needs to set up the defaults in the first place.
> 
> This guarantees that using ChangeWindowAttributes to reset the root
> window really does restore the startup state, which wasn't quite true
> before:
> 
> - If both party_like_its_1989 and bgNoneRoot were set, then the root
>   background was initially the root weave, but ChangeWindowAttributes
>   would reset it to background None.
> 
> - InitRootWindow checked whether the screen supported background None,
>   while ChangeWindowAttributes unconditionally trusted bgNoneRoot.
> 
> Signed-off-by: Jamey Sharp <jamey at minilop.net>
> ---
>  dix/window.c |   44 +++++++++-----------------------------------
>  1 files changed, 9 insertions(+), 35 deletions(-)
> 
> diff --git a/dix/window.c b/dix/window.c
> index 1953f02..44bfa18 100644
> --- a/dix/window.c
> +++ b/dix/window.c
> @@ -551,38 +551,13 @@ void
>  InitRootWindow(WindowPtr pWin)
>  {
>      ScreenPtr pScreen = pWin->drawable.pScreen;
> -    int backFlag = CWBorderPixel | CWCursor | CWBackingStore;
> +    int mask = CWBackPixmap | CWBackingStore | CWCursor;
> +    XID attrs[] = { None, defaultBackingStore, None };
>  
>      if (!(*pScreen->CreateWindow)(pWin))
>  	return; /* XXX */
>      (*pScreen->PositionWindow)(pWin, 0, 0);
> -
> -    pWin->cursorIsNone = FALSE;
> -    pWin->optional->cursor = rootCursor;
> -    rootCursor->refcnt++;
> -
> -
> -    if (party_like_its_1989) {
> -        MakeRootTile(pWin);
> -        backFlag |= CWBackPixmap;
> -    } else if (pScreen->canDoBGNoneRoot && bgNoneRoot) {
> -        pWin->backgroundState = XaceBackgroundNoneState(pWin);
> -        pWin->background.pixel = pScreen->whitePixel;
> -        backFlag |= CWBackPixmap;
> -    } else {
> -        pWin->backgroundState = BackgroundPixel;
> -	if (whiteRoot)
> -            pWin->background.pixel = pScreen->whitePixel;
> -        else
> -            pWin->background.pixel = pScreen->blackPixel;
> -        backFlag |= CWBackPixel;
> -    } 
> -
> -    pWin->backingStore = defaultBackingStore;
> -    pWin->forcedBS = (defaultBackingStore != NotUseful);
> -    /* We SHOULD check for an error value here XXX */
> -    (*pScreen->ChangeWindowAttributes)(pWin, backFlag);
> -
> +    ChangeWindowAttributes(pWin, mask, attrs, serverClient);
>      MapWindow(pWin, serverClient);
>  }
>  


maybe you can use ResetRootWindow() from patch 3 here ?



> @@ -1062,14 +1037,13 @@ SetRootWindowBackground(WindowPtr pWin, ScreenPtr pScreen, Mask *index2)
>  {
>      /* following the protocol: "Changing the background of a root window to
>       * None or ParentRelative restores the default background pixmap" */
> -    if (bgNoneRoot) {
> +    if (party_like_its_1989)
> +	MakeRootTile(pWin);
> +    else if (pScreen->canDoBGNoneRoot && bgNoneRoot) {
>  	pWin->backgroundState = XaceBackgroundNoneState(pWin);
>  	pWin->background.pixel = pScreen->whitePixel;
> -    }
> -    else if (party_like_its_1989)
> -	MakeRootTile(pWin);
> -    else {
> -        pWin->backgroundState = BackgroundPixel;
> +    } else {
> +	pWin->backgroundState = BackgroundPixel;
>  	if (whiteRoot)
>  	    pWin->background.pixel = pScreen->whitePixel;
>  	else
> @@ -1278,7 +1252,7 @@ ChangeWindowAttributes(WindowPtr pWin, Mask vmask, XID *vlist, ClientPtr client)
>  		goto PatchUp;
>  	    }
>  	    pWin->backingStore = val;
> -	    pWin->forcedBS = FALSE;
> +	    pWin->forcedBS = (client == serverClient && pWin->backingStore != NotUseful);
>  	    break;
>  	  case CWBackingPlanes:
>  	    if (pWin->optional || ((CARD32)*pVlist != (CARD32)~0L)) {


More information about the xorg-devel mailing list