void __glutDestroyWindow(GLUTwindow * window, GLUTwindow * initialWindow) { GLUTwindow **prev, *cur, *parent, *siblings; /* Recursively destroy any children. */ cur = window->children; while (cur) { siblings = cur->siblings; __glutDestroyWindow(cur, initialWindow); cur = siblings; } /* Remove from parent's children list (only necessary for non-initial windows and subwindows!). */ parent = window->parent; if (parent && parent == initialWindow->parent) { prev = &parent->children; cur = parent->children; while (cur) { if (cur == window) { *prev = cur->siblings; break; } prev = &(cur->siblings); cur = cur->siblings; } } /* Unbind if bound to this window. */ if (window == __glutCurrentWindow) { glXMakeCurrent(__glutDisplay, None, NULL); __glutCurrentWindow = NULL; } /* Begin tearing down window itself. */ if (window->overlay) { __glutFreeOverlayFunc(window->overlay); } XDestroyWindow(__glutDisplay, window->win); glXDestroyContext(__glutDisplay, window->ctx); if (window->colormap) { /* Only color index windows have colormap data structure. */ __glutFreeColormap(window->colormap); } /* NULLing the __glutWindowList helps detect is a window instance has been destroyed, given a window number. */ __glutWindowList[window->num] = NULL; /* Cleanup data structures that might contain window. */ cleanWindowWorkList(window); cleanStaleWindowList(window); /* Remove window from the "get window cache" if it is there. */ if (__glutWindowCache == window) __glutWindowCache = NULL; if (window->visAlloced) { /* Only free XVisualInfo* gotten from glXChooseVisual. */ XFree(window->vis); } free(window); }
void __glutDestroyWindow(GLUTwindow * window, GLUTwindow * initialWindow) { GLUTwindow **prev, *cur, *parent, *siblings; /* Recursively destroy any children. */ cur = window->children; while (cur) { siblings = cur->siblings; __glutDestroyWindow(cur, initialWindow); cur = siblings; } /* Remove from parent's children list (only necessary for non-initial windows and subwindows!). */ parent = window->parent; if (parent && parent == initialWindow->parent) { prev = &parent->children; cur = parent->children; while (cur) { if (cur == window) { *prev = cur->siblings; break; } prev = &(cur->siblings); cur = cur->siblings; } } /* Unbind if bound to this window. */ if (window == __glutCurrentWindow) { UNMAKE_CURRENT(); __glutCurrentWindow = NULL; } /* Invalidate glutExtensionSupported string cache if needed. */ __glutInvalidateExtensionStringCacheIfNeeded(window->ctx); /* Begin tearing down window itself. */ if (window->overlay) { __glutInvalidateExtensionStringCacheIfNeeded(window->overlay->ctx); __glutFreeOverlayFunc(window->overlay); } XDestroyWindow(__glutDisplay, window->win); glXDestroyContext(__glutDisplay, window->ctx); if (window->colormap) { /* Only color index windows have colormap data structure. */ __glutFreeColormap(window->colormap); } /* NULLing the __glutWindowList helps detect is a window instance has been destroyed, given a window number. */ __glutWindowList[window->num] = NULL; /* Cleanup data structures that might contain window. */ cleanWindowWorkList(window); #if !defined(_WIN32) cleanStaleWindowList(window); #endif /* Remove window from the "get window cache" if it is there. */ if (__glutWindowCache == window) { __glutWindowCache = NULL; } if (window->visAlloced) { /* Only free XVisualInfo* gotten from glXChooseVisual. */ XFree(window->vis); } if (window == __glutGameModeWindow) { /* Destroying the game mode window should implicitly have GLUT leave game mode. */ __glutCloseDownGameMode(); } free(window); }