summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Bragg <robert@linux.intel.com>2012-01-12 18:16:08 +0000
committerKristian Høgsberg <krh@bitplanet.net>2012-03-27 09:32:00 -0400
commit395fb7c0a297fd51dc00c36523980e2d76577360 (patch)
tree590aeda7601d3406adfcbd9595b8df73079e5807
parent55bd4ee65ac315db298bf10deae4e73f0e256ed3 (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.c40
-rw-r--r--dbe/dbestruct.h1
2 files changed, 21 insertions, 20 deletions
diff --git a/dbe/dbe.c b/dbe/dbe.c
index a46867676..6ca7c1044 100644
--- a/dbe/dbe.c
+++ b/dbe/dbe.c
@@ -1390,7 +1390,7 @@ DbeWindowPrivDelete(pointer pDbeWinPriv, XID id)
/******************************************************************************
*
- * DBE DIX Procedure: DbeResetProc
+ * DBE DIX Procedure: DbeCloseScreen
*
* Description:
*
@@ -1399,30 +1399,27 @@ 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;
-
- for (i = 0; i < screenInfo.numScreens; i++)
+ DbeScreenPrivPtr pDbeScreenPriv = DBE_SCREEN_PRIV(pScreen);
+
+ if (pDbeScreenPriv)
{
- pScreen = screenInfo.screens[i];
- pDbeScreenPriv = DBE_SCREEN_PRIV(pScreen);
+ /* 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 */
/******************************************************************************
@@ -1600,6 +1597,9 @@ DbeExtensionInit(void)
pDbeScreenPriv->DestroyWindow = pScreen->DestroyWindow;
pScreen->DestroyWindow = DbeDestroyWindow;
+
+ pDbeScreenPriv->CloseScreen = pScreen->CloseScreen;
+ pScreen->CloseScreen = DbeCloseScreen;
}
else
{
@@ -1632,7 +1632,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, dbeErrorBase + DbeBadBuffer);
diff --git a/dbe/dbestruct.h b/dbe/dbestruct.h
index 9c383cef8..f64e8d8cd 100644
--- a/dbe/dbestruct.h
+++ b/dbe/dbestruct.h
@@ -173,6 +173,7 @@ typedef struct _DbeScreenPrivRec
*/
PositionWindowProcPtr PositionWindow;
DestroyWindowProcPtr DestroyWindow;
+ CloseScreenProcPtr CloseScreen;
/* Per-screen DIX routines */
Bool (*SetupBackgroundPainter)(