Blob Blame Raw
From a3e15680da24cb8259f6a83dee0c930dab024290 Mon Sep 17 00:00:00 2001
From: Kristian <krh@redhat.com>
Date: Fri, 15 Aug 2008 15:15:14 +1000
Subject: [PATCH] Add nr for background=none root

---
 dix/globals.c                |    1 +
 dix/window.c                 |   22 ++++++++++++----------
 hw/xfree86/common/xf86Init.c |   11 +++++++++++
 hw/xfree86/common/xf86str.h  |    5 ++++-
 include/opaque.h             |    1 +
 os/utils.c                   |    3 +++
 6 files changed, 32 insertions(+), 11 deletions(-)

diff --git a/dix/globals.c b/dix/globals.c
index 7f95eab..db34786 100644
--- a/dix/globals.c
+++ b/dix/globals.c
@@ -143,6 +143,7 @@ Bool loadableFonts = FALSE;
 CursorPtr rootCursor;
 Bool blackRoot=FALSE;
 Bool whiteRoot=FALSE;
+Bool bgNoneRoot=FALSE;
 #ifdef XPRINT
 ClientPtr requestingClient;	/* XXX this should be obsolete now, remove? */
 #endif
diff --git a/dix/window.c b/dix/window.c
index 834c26b..6663a1e 100644
--- a/dix/window.c
+++ b/dix/window.c
@@ -471,23 +471,25 @@ InitRootWindow(WindowPtr pWin)
     pWin->cursorIsNone = FALSE;
     pWin->optional->cursor = rootCursor;
     rootCursor->refcnt++;
+    pWin->backingStore = defaultBackingStore;
+    pWin->forcedBS = (defaultBackingStore != NotUseful);
 
-    if (!blackRoot && !whiteRoot) {
-        MakeRootTile(pWin);
-        backFlag |= CWBackPixmap;
+    if (bgNoneRoot) {
+	/* nothing, handled in xf86CreateRootWindow */
     }
-    else {
+    else if (blackRoot || whiteRoot) {
         if (blackRoot)
             pWin->background.pixel = pScreen->blackPixel;
         else
             pWin->background.pixel = pScreen->whitePixel;
         backFlag |= CWBackPixel;
-    } 
-
-    pWin->backingStore = defaultBackingStore;
-    pWin->forcedBS = (defaultBackingStore != NotUseful);
-    /* We SHOULD check for an error value here XXX */
-    (*pScreen->ChangeWindowAttributes)(pWin, backFlag);
+	pScreen->ChangeWindowAttributes(pWin, backFlag);
+    }
+    else {
+        MakeRootTile(pWin);
+        backFlag |= CWBackPixmap;
+	pScreen->ChangeWindowAttributes(pWin, backFlag);
+    }
 
     MapWindow(pWin, serverClient);
 }
diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c
index eb4ebfa..2c18da4 100644
--- a/hw/xfree86/common/xf86Init.c
+++ b/hw/xfree86/common/xf86Init.c
@@ -83,6 +83,7 @@
 #ifdef RENDER
 #include "picturestr.h"
 #endif
+#include "xace.h"
 
 #include "globals.h"
 
@@ -137,6 +138,7 @@ xf86CreateRootWindow(WindowPtr pWin)
   int ret = TRUE;
   int err = Success;
   ScreenPtr pScreen = pWin->drawable.pScreen;
+  ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
   RootWinPropPtr pProp;
   CreateWindowProcPtr CreateWindow = (CreateWindowProcPtr)
       dixLookupPrivate(&pScreen->devPrivates, xf86CreateRootWindowKey);
@@ -190,6 +192,15 @@ xf86CreateRootWindow(WindowPtr pWin)
     }
   }
 
+  if (bgNoneRoot && pScrn->canDoBGNoneRoot) {
+      pWin->backgroundState = XaceBackgroundNoneState(pWin);
+      pWin->background.pixel = pScreen->whitePixel;
+      pScreen->ChangeWindowAttributes(pWin, CWBackPixmap | CWBorderPixel | CWCursor | CWBackingStore);
+  } else {
+      pWin->background.pixel = pScreen->blackPixel;
+      pScreen->ChangeWindowAttributes(pWin, CWBackPixel | CWBorderPixel | CWCursor | CWBackingStore);
+  }
+
 #ifdef DEBUG
   ErrorF("xf86CreateRootWindow() returns %d\n", ret);
 #endif
diff --git a/hw/xfree86/common/xf86str.h b/hw/xfree86/common/xf86str.h
index fc94284..56c5507 100644
--- a/hw/xfree86/common/xf86str.h
+++ b/hw/xfree86/common/xf86str.h
@@ -538,7 +538,7 @@ typedef struct _confdrirec {
 } confDRIRec, *confDRIPtr;
 
 /* These values should be adjusted when new fields are added to ScrnInfoRec */
-#define NUM_RESERVED_INTS		16
+#define NUM_RESERVED_INTS		15
 #define NUM_RESERVED_POINTERS		15
 #define NUM_RESERVED_FUNCS		11
 
@@ -977,6 +977,9 @@ typedef struct _ScrnInfoRec {
     ClockRangesPtr	clockRanges;
     int			adjustFlags;
 
+    /* -nr support */
+    int			canDoBGNoneRoot;
+
     /*
      * These can be used when the minor ABI version is incremented.
      * The NUM_* parameters must be reduced appropriately to keep the
diff --git a/include/opaque.h b/include/opaque.h
index 3d19d27..cf5d135 100644
--- a/include/opaque.h
+++ b/include/opaque.h
@@ -74,6 +74,7 @@ extern Bool defeatAccessControl;
 extern long maxBigRequestSize;
 extern Bool blackRoot;
 extern Bool whiteRoot;
+extern Bool bgNoneRoot;
 
 extern Bool CoreDump;
 
diff --git a/os/utils.c b/os/utils.c
index f58c763..72a03c8 100644
--- a/os/utils.c
+++ b/os/utils.c
@@ -615,6 +615,7 @@ void UseMsg(void)
 #endif
     ErrorF("-nolisten string       don't listen on protocol\n");
     ErrorF("-noreset               don't reset after last client exists\n");
+    ErrorF("-nr                    create root window with no background\n");
     ErrorF("-reset                 reset after last client exists\n");
     ErrorF("-p #                   screen-saver pattern duration (minutes)\n");
     ErrorF("-pn                    accept failure to listen on all ports\n");
@@ -986,6 +987,8 @@ ProcessCommandLine(int argc, char *argv[])
 	    defaultBackingStore = WhenMapped;
         else if ( strcmp( argv[i], "-wr") == 0)
             whiteRoot = TRUE;
+        else if ( strcmp( argv[i], "-nr") == 0)
+            bgNoneRoot = TRUE;
         else if ( strcmp( argv[i], "-maxbigreqsize") == 0) {
              if(++i < argc) {
                  long reqSizeArg = atol(argv[i]);
-- 
1.6.0.1