88 lines
3.0 KiB
Diff
88 lines
3.0 KiB
Diff
From a02af447e0e845979a313bb248cf3506d4926a38 Mon Sep 17 00:00:00 2001
|
|
From: Adam Jackson <ajax@redhat.com>
|
|
Date: Mon, 19 May 2014 16:16:43 -0400
|
|
Subject: [PATCH] shadowfb: Fix initialization
|
|
|
|
This has to run at initial CreateWindow time, at CreateScreenResources
|
|
the root window doesn't actually exist yet.
|
|
|
|
Tested-by: Michael Thayer <michael.thayer@oracle.com>
|
|
Signed-off-by: Adam Jackson <ajax@redhat.com>
|
|
---
|
|
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);
|
|
|
|
--
|
|
1.9.0
|
|
|