glx: Add screen DestroyWindow wrapper to destroy the GLX drawable.
Fixes crashes exitting MacSlow's rgba-glx demo.
This commit is contained in:
parent
f04fe06ae2
commit
120286aef5
|
@ -212,6 +212,7 @@ glxCloseScreen (int index, ScreenPtr pScreen)
|
||||||
__GLXscreen *pGlxScreen = glxGetScreen(pScreen);
|
__GLXscreen *pGlxScreen = glxGetScreen(pScreen);
|
||||||
|
|
||||||
pScreen->CloseScreen = pGlxScreen->CloseScreen;
|
pScreen->CloseScreen = pGlxScreen->CloseScreen;
|
||||||
|
pScreen->DestroyWindow = pGlxScreen->DestroyWindow;
|
||||||
|
|
||||||
pGlxScreen->destroy(pGlxScreen);
|
pGlxScreen->destroy(pGlxScreen);
|
||||||
|
|
||||||
|
@ -395,6 +396,31 @@ pickFBConfig(__GLXscreen *pGlxScreen, VisualPtr visual)
|
||||||
return best;
|
return best;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static Bool
|
||||||
|
glxDestroyWindow(WindowPtr pWin)
|
||||||
|
{
|
||||||
|
ScreenPtr pScreen = pWin->drawable.pScreen;
|
||||||
|
__GLXscreen *pGlxScreen = glxGetScreen(pScreen);
|
||||||
|
Bool retval = TRUE;
|
||||||
|
|
||||||
|
FreeResource(pWin->drawable.id, FALSE);
|
||||||
|
|
||||||
|
/* call lower wrapped functions */
|
||||||
|
if (pGlxScreen->DestroyWindow) {
|
||||||
|
/* unwrap */
|
||||||
|
pScreen->DestroyWindow = pGlxScreen->DestroyWindow;
|
||||||
|
|
||||||
|
/* call lower layers */
|
||||||
|
retval = (*pScreen->DestroyWindow)(pWin);
|
||||||
|
|
||||||
|
/* rewrap */
|
||||||
|
pGlxScreen->DestroyWindow = pScreen->DestroyWindow;
|
||||||
|
pScreen->DestroyWindow = glxDestroyWindow;
|
||||||
|
}
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
void __glXScreenInit(__GLXscreen *pGlxScreen, ScreenPtr pScreen)
|
void __glXScreenInit(__GLXscreen *pGlxScreen, ScreenPtr pScreen)
|
||||||
{
|
{
|
||||||
__GLXconfig *m;
|
__GLXconfig *m;
|
||||||
|
@ -409,6 +435,8 @@ void __glXScreenInit(__GLXscreen *pGlxScreen, ScreenPtr pScreen)
|
||||||
|
|
||||||
pGlxScreen->CloseScreen = pScreen->CloseScreen;
|
pGlxScreen->CloseScreen = pScreen->CloseScreen;
|
||||||
pScreen->CloseScreen = glxCloseScreen;
|
pScreen->CloseScreen = glxCloseScreen;
|
||||||
|
pGlxScreen->DestroyWindow = pScreen->DestroyWindow;
|
||||||
|
pScreen->DestroyWindow = glxDestroyWindow;
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
for (m = pGlxScreen->fbconfigs; m != NULL; m = m->next) {
|
for (m = pGlxScreen->fbconfigs; m != NULL; m = m->next) {
|
||||||
|
|
|
@ -162,6 +162,7 @@ struct __GLXscreen {
|
||||||
char *GLXextensions;
|
char *GLXextensions;
|
||||||
|
|
||||||
Bool (*CloseScreen)(int index, ScreenPtr pScreen);
|
Bool (*CloseScreen)(int index, ScreenPtr pScreen);
|
||||||
|
Bool (*DestroyWindow)(WindowPtr pWindow);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user