summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Bragg <robert@linux.intel.com>2012-01-12 18:16:08 +0000
committerChristopher James Halse Rogers <christopher.halse.rogers@canonical.com>2012-06-13 15:26:19 +1000
commitca2e429c09464a3937830ddaa4993fa919b28480 (patch)
treedd3f70b8c354e232d26d5034e94517bd507bbffb
parent882cab9a80d3ee5391ccee0637531a24ded5367c (diff)
dbe: Cleanup in CloseScreen hook not ext CloseDown
Instead of registering an extension CloseDownProc when adding the dbe extension this patch hooks into pScreen->CloseScreen so that the chain of pScreen->DestroyWindow hooks remains valid until all windows have been destroyed. Previously it was possible for DbeResetProc to be called before the root window had been destroyed and the unwrapping of pScreen->DestroyWindow would clobber the chain of callbacks. This is needed for xwayland to be able to know when the root window is destroyed so it can unredirect root sub-windows.
-rw-r--r--dbe/dbe.c43
-rw-r--r--dbe/dbestruct.h1
2 files changed, 23 insertions, 21 deletions
diff --git a/dbe/dbe.c b/dbe/dbe.c
index ca7f3e278..ed21dbd07 100644
--- a/dbe/dbe.c
+++ b/dbe/dbe.c
@@ -291,8 +291,8 @@ ProcDbeAllocateBackBufferName(ClientPtr client)
/* malloc/realloc a new array and initialize all elements to 0. */
pDbeWindowPriv->IDs = (XID *) realloc(pIDs,
- (pDbeWindowPriv->
- maxAvailableIDs +
+ (pDbeWindowPriv->maxAvailableIDs
+ +
DBE_INCR_MAX_IDS) *
sizeof(XID));
if (!pDbeWindowPriv->IDs) {
@@ -467,7 +467,7 @@ ProcDbeSwapBuffers(ClientPtr client)
return BadAlloc;
/* Get to the swap info appended to the end of the request. */
- dbeSwapInfo = (xDbeSwapInfo *) &stuff[1];
+ dbeSwapInfo = (xDbeSwapInfo *) & stuff[1];
/* Allocate array to record swap information. */
swapInfo = (DbeSwapInfoPtr) malloc(nStuff * sizeof(DbeSwapInfoRec));
@@ -1297,7 +1297,7 @@ DbeWindowPrivDelete(pointer pDbeWinPriv, XID id)
/******************************************************************************
*
- * DBE DIX Procedure: DbeResetProc
+ * DBE DIX Procedure: DbeCloseScreen
*
* Description:
*
@@ -1306,28 +1306,26 @@ DbeWindowPrivDelete(pointer pDbeWinPriv, XID id)
* other tasks related to shutting down the extension.
*
*****************************************************************************/
-static void
-DbeResetProc(ExtensionEntry * extEntry)
+static Bool
+DbeCloseScreen(int i, ScreenPtr pScreen)
{
- int i;
- ScreenPtr pScreen;
- DbeScreenPrivPtr pDbeScreenPriv;
+ DbeScreenPrivPtr pDbeScreenPriv = DBE_SCREEN_PRIV(pScreen);
- for (i = 0; i < screenInfo.numScreens; i++) {
- pScreen = screenInfo.screens[i];
- pDbeScreenPriv = DBE_SCREEN_PRIV(pScreen);
+ if (pDbeScreenPriv) {
+ /* Unwrap DestroyWindow, which was wrapped in DbeExtensionInit(). */
+ pScreen->DestroyWindow = pDbeScreenPriv->DestroyWindow;
- if (pDbeScreenPriv) {
- /* Unwrap DestroyWindow, which was wrapped in DbeExtensionInit(). */
- pScreen->DestroyWindow = pDbeScreenPriv->DestroyWindow;
+ /* Unwrap CloseScreen, which was wrapped in DbeExtensionInit(). */
+ pScreen->CloseScreen = pDbeScreenPriv->CloseScreen;
- if (pDbeScreenPriv->ResetProc)
- (*pDbeScreenPriv->ResetProc) (pScreen);
+ if (pDbeScreenPriv->ResetProc)
+ (*pDbeScreenPriv->ResetProc) (pScreen);
- free(pDbeScreenPriv);
- }
+ free(pDbeScreenPriv);
}
-} /* DbeResetProc() */
+
+ return (*pScreen->CloseScreen) (i, pScreen);
+} /* DbeCloseScreen */
/******************************************************************************
*
@@ -1497,6 +1495,9 @@ DbeExtensionInit(void)
pDbeScreenPriv->DestroyWindow = pScreen->DestroyWindow;
pScreen->DestroyWindow = DbeDestroyWindow;
+
+ pDbeScreenPriv->CloseScreen = pScreen->CloseScreen;
+ pScreen->CloseScreen = DbeCloseScreen;
}
else {
/* DDX initialization failed. Stub the screen. */
@@ -1524,7 +1525,7 @@ DbeExtensionInit(void)
/* Now add the extension. */
extEntry = AddExtension(DBE_PROTOCOL_NAME, DbeNumberEvents,
DbeNumberErrors, ProcDbeDispatch, SProcDbeDispatch,
- DbeResetProc, StandardMinorOpcode);
+ NULL, StandardMinorOpcode);
dbeErrorBase = extEntry->errorBase;
SetResourceTypeErrorValue(dbeWindowPrivResType,
diff --git a/dbe/dbestruct.h b/dbe/dbestruct.h
index 9ea9eb695..7a102b0a7 100644
--- a/dbe/dbestruct.h
+++ b/dbe/dbestruct.h
@@ -164,6 +164,7 @@ typedef struct _DbeScreenPrivRec {
*/
PositionWindowProcPtr PositionWindow;
DestroyWindowProcPtr DestroyWindow;
+ CloseScreenProcPtr CloseScreen;
/* Per-screen DIX routines */
Bool (*SetupBackgroundPainter) (WindowPtr /*pWin */ ,