On 21/05/14 15:23, Adam Jackson wrote:
This has to run at initial CreateWindow time, at CreateScreenResources
the root window doesn't actually exist yet.

Tested-by: Michael Thayer <[email protected]>
Signed-off-by: Adam Jackson <[email protected]>

I'm not an expert in that area of the code, but I did also go over the actual content of the patch. So:

Reviewed-by: Michael Thayer <[email protected]>

---
  hw/xfree86/shadowfb/shadow.c | 26 +++++++++++++++-----------
  1 file changed, 15 insertions(+), 11 deletions(-)

diff --git a/hw/xfree86/shadowfb/shadow.c b/hw/xfree86/shadowfb/shadow.c
index 10f72cc..d2481ed 100644
--- a/hw/xfree86/shadowfb/shadow.c
+++ b/hw/xfree86/shadowfb/shadow.c
@@ -29,14 +29,14 @@
  #include "picturestr.h"

  static Bool ShadowCloseScreen(ScreenPtr pScreen);
-static Bool ShadowCreateScreenResources(ScreenPtr pScreen);
+static Bool ShadowCreateRootWindow(WindowPtr pWin);

  typedef struct {
      ScrnInfoPtr pScrn;
      RefreshAreaFuncPtr preRefresh;
      RefreshAreaFuncPtr postRefresh;
      CloseScreenProcPtr CloseScreen;
-    CreateScreenResourcesProcPtr CreateScreenResources;
+    CreateWindowProcPtr CreateWindow;
  } ShadowScreenRec, *ShadowScreenPtr;

  static DevPrivateKeyRec ShadowScreenKeyRec;
@@ -71,10 +71,10 @@ ShadowFBInit2(ScreenPtr pScreen,
      pPriv->postRefresh = postRefreshArea;

      pPriv->CloseScreen = pScreen->CloseScreen;
-    pPriv->CreateScreenResources = pScreen->CreateScreenResources;
+    pPriv->CreateWindow = pScreen->CreateWindow;

      pScreen->CloseScreen = ShadowCloseScreen;
-    pScreen->CreateScreenResources = ShadowCreateScreenResources;
+    pScreen->CreateWindow = ShadowCreateRootWindow;

      return TRUE;
  }
@@ -117,16 +117,21 @@ shadowfbReportPost(DamagePtr damage, RegionPtr reg, void 
*closure)
  }

  static Bool
-ShadowCreateScreenResources(ScreenPtr pScreen)
+ShadowCreateRootWindow(WindowPtr pWin)
  {
      Bool ret;
-    WindowPtr pWin = pScreen->root;
+    ScreenPtr pScreen = pWin->drawable.pScreen;
      ShadowScreenPtr pPriv = shadowfbGetScreenPrivate(pScreen);

-    pScreen->CreateScreenResources = pPriv->CreateScreenResources;
-    ret = pScreen->CreateScreenResources(pScreen);
-    pPriv->CreateScreenResources = pScreen->CreateScreenResources;
-    pScreen->CreateScreenResources = ShadowCreateScreenResources;
+    /* paranoia */
+    if (pWin != pScreen->root)
+        ErrorF("ShadowCreateRootWindow called unexpectedly\n");
+
+    /* call down, but don't hook ourselves back in; we know the first time
+     * we're called it's for the root window.
+     */
+    pScreen->CreateWindow = pPriv->CreateWindow;
+    ret = pScreen->CreateWindow(pWin);

      /* this might look like it leaks, but the damage code reaps listeners
       * when their drawable disappears.
@@ -159,7 +164,6 @@ ShadowCloseScreen(ScreenPtr pScreen)
      ShadowScreenPtr pPriv = shadowfbGetScreenPrivate(pScreen);

      pScreen->CloseScreen = pPriv->CloseScreen;
-    pScreen->CreateScreenResources = pPriv->CreateScreenResources;

      free(pPriv);




--
ORACLE Deutschland B.V. & Co. KG   Michael Thayer
Werkstrasse 24                     VirtualBox engineering
71384 Weinstadt, Germany           mailto:[email protected]

Hauptverwaltung: Riesstr. 25, D-80992 München
Registergericht: Amtsgericht München, HRA 95603
Geschäftsführer: Jürgen Kunz

Komplementärin: ORACLE Deutschland Verwaltung B.V.
Hertogswetering 163/167, 3543 AS Utrecht, Niederlande
Handelsregister der Handelskammer Midden-Niederlande, Nr. 30143697
Geschäftsführer: Alexander van der Ven, Astrid Kepper, Val Maher
_______________________________________________
[email protected]: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to