diff --git a/dbe/dbe.c b/dbe/dbe.c index 240448ff2..d252229fc 100644 --- a/dbe/dbe.c +++ b/dbe/dbe.c @@ -1203,7 +1203,7 @@ DbeWindowPrivDelete(void *pDbeWinPriv, XID id) /****************************************************************************** * - * DBE DIX Procedure: DbeResetProc + * DBE DIX Procedure: DbeCloseScreen * * Description: * @@ -1212,25 +1212,24 @@ DbeWindowPrivDelete(void *pDbeWinPriv, XID id) * other tasks related to shutting down the extension. * *****************************************************************************/ -static void -DbeResetProc(ExtensionEntry * extEntry) +static Bool +DbeCloseScreen(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; - pScreen->PositionWindow = pDbeScreenPriv->PositionWindow; - free(pDbeScreenPriv); - } + if (pDbeScreenPriv) { + /* Unwrap DestroyWindow, which was wrapped in DbeExtensionInit(). */ + pScreen->DestroyWindow = pDbeScreenPriv->DestroyWindow; + pScreen->PositionWindow = pDbeScreenPriv->PositionWindow; + pScreen->CloseScreen = pDbeScreenPriv->CloseScreen; + free(pDbeScreenPriv); + dixSetPrivate(&pScreen->devPrivates, dbeScreenPrivKey, NULL); + return pScreen->CloseScreen(pScreen); } -} /* DbeResetProc() */ + + /* CloseScreen was wrapped, but there is no nested function to call */ + return FALSE; +} /* DbeCloseScreen() */ /****************************************************************************** * @@ -1400,6 +1399,10 @@ DbeExtensionInit(void) pDbeScreenPriv->DestroyWindow = pScreen->DestroyWindow; pScreen->DestroyWindow = DbeDestroyWindow; + + /* Wrap CloseScreen, to clean up */ + pDbeScreenPriv->CloseScreen = pScreen->CloseScreen; + pScreen->CloseScreen = DbeCloseScreen; } else { /* DDX initialization failed. Stub the screen. */ @@ -1427,7 +1430,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 ef08118c0..bd8357a71 100644 --- a/dbe/dbestruct.h +++ b/dbe/dbestruct.h @@ -175,6 +175,7 @@ typedef struct _DbeScreenPrivRec { */ PositionWindowProcPtr PositionWindow; DestroyWindowProcPtr DestroyWindow; + CloseScreenProcPtr CloseScreen; /* Per-screen DIX routines */ Bool (*SetupBackgroundPainter) (WindowPtr /*pWin */ ,