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 <ja...@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);
 }
 
@@ -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)) {
-- 
1.7.5.4

_______________________________________________
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to