# HG changeset patch # User Ryan C. Gordon # Date 1205359308 0 # Node ID 73e7e7f5b5a1b8586a6957eb1a72917d4136b707 # Parent 4433ef2a18023b9145deecbcde43d908bceb6e0c Don't recreate the GL content in windib target if SDL_SetVideoMode() is being called in response to a window resize event...prevents loss of GL state and objects. diff -r 4433ef2a1802 -r 73e7e7f5b5a1 src/video/windib/SDL_dibvideo.c --- a/src/video/windib/SDL_dibvideo.c Fri Feb 29 14:01:45 2008 +0000 +++ b/src/video/windib/SDL_dibvideo.c Wed Mar 12 22:01:48 2008 +0000 @@ -512,6 +512,36 @@ int x, y; Uint32 Rmask, Gmask, Bmask; + /* + * Special case for OpenGL windows...since the app needs to call + * SDL_SetVideoMode() in response to resize events to continue to + * function, but WGL handles the GL context details behind the scenes, + * there's no sense in tearing the context down just to rebuild it + * to what it already was...tearing it down sacrifices your GL state + * and uploaded textures. So if we're requesting the same video mode + * attributes and the width/height matches the physical window, just + * return immediately. + */ + if ( (SDL_Window != NULL) && + (current != NULL) && + (current->flags == flags) && + (current->format->BitsPerPixel == bpp) && + ((flags & SDL_FULLSCREEN) == 0) ) { /* probably not safe for fs */ + int curwidth, curheight; + RECT size; + + /* Get the current position of our window */ + GetClientRect(SDL_Window, &size); + + curwidth = (size.right - size.left); + curheight = (size.bottom - size.top); + if ((width == curwidth) && (height == curheight)) { + current->w = width; + current->h = height; + return current; /* we're already good to go. */ + } + } + prev_flags = current->flags; /* Clean up any GL context that may be hanging around */