Melchior FRANZ:
Make SDL window resizable; This exposes the same problem that many GLUT users have: resizing up may cause a temporary switch to software rendering if the card is low on memory. Resizing down again switches back to HW rendering. (KSFO is texture intensive, but there are no problems in LOWL, and elsewhere.) Less and less users will have the problem as cards become better, and it's no reason not to allow resizing altogether.
This commit is contained in:
parent
28fe28ec4f
commit
d28e99d913
1 changed files with 13 additions and 4 deletions
|
@ -15,6 +15,7 @@
|
||||||
|
|
||||||
static fgIdleHandler IdleHandler = 0;
|
static fgIdleHandler IdleHandler = 0;
|
||||||
static fgDrawHandler DrawHandler = 0;
|
static fgDrawHandler DrawHandler = 0;
|
||||||
|
static fgWindowResizeHandler WindowResizeHandler = 0;
|
||||||
static fgKeyHandler KeyHandler = 0;
|
static fgKeyHandler KeyHandler = 0;
|
||||||
static fgMouseClickHandler MouseClickHandler = 0;
|
static fgMouseClickHandler MouseClickHandler = 0;
|
||||||
static fgMouseMotionHandler MouseMotionHandler = 0;
|
static fgMouseMotionHandler MouseMotionHandler = 0;
|
||||||
|
@ -24,6 +25,7 @@ static int CurrentMouseX = 0;
|
||||||
static int CurrentMouseY = 0;
|
static int CurrentMouseY = 0;
|
||||||
static int CurrentMouseCursor = MOUSE_CURSOR_POINTER;
|
static int CurrentMouseCursor = MOUSE_CURSOR_POINTER;
|
||||||
static bool NeedRedraw = false;
|
static bool NeedRedraw = false;
|
||||||
|
static int VidMask = SDL_OPENGL|SDL_RESIZABLE;
|
||||||
|
|
||||||
void fgRegisterIdleHandler(fgIdleHandler func)
|
void fgRegisterIdleHandler(fgIdleHandler func)
|
||||||
{
|
{
|
||||||
|
@ -38,7 +40,7 @@ void fgRegisterDrawHandler(fgDrawHandler func)
|
||||||
|
|
||||||
void fgRegisterWindowResizeHandler(fgWindowResizeHandler func)
|
void fgRegisterWindowResizeHandler(fgWindowResizeHandler func)
|
||||||
{
|
{
|
||||||
// Noop. SDL does not support window resize.
|
WindowResizeHandler = func;
|
||||||
}
|
}
|
||||||
|
|
||||||
void fgRegisterKeyHandler(fgKeyHandler func)
|
void fgRegisterKeyHandler(fgKeyHandler func)
|
||||||
|
@ -84,11 +86,10 @@ void fgOSOpenWindow(int w, int h, int bpp,
|
||||||
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, zbits);
|
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, zbits);
|
||||||
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
|
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
|
||||||
|
|
||||||
int vidmask = SDL_OPENGL;
|
|
||||||
if(fullscreen) {
|
if(fullscreen) {
|
||||||
vidmask |= SDL_FULLSCREEN;
|
VidMask |= SDL_FULLSCREEN;
|
||||||
}
|
}
|
||||||
if (SDL_SetVideoMode(w, h, 16, vidmask) == 0)
|
if (SDL_SetVideoMode(w, h, 16, VidMask) == 0)
|
||||||
throw sg_throwable(string("Failed to set SDL video mode: ")
|
throw sg_throwable(string("Failed to set SDL video mode: ")
|
||||||
+ SDL_GetError());
|
+ SDL_GetError());
|
||||||
|
|
||||||
|
@ -214,6 +215,14 @@ void fgOSMainLoop()
|
||||||
if(MouseMotionHandler)
|
if(MouseMotionHandler)
|
||||||
(*MouseMotionHandler)(e.motion.x, e.motion.y);
|
(*MouseMotionHandler)(e.motion.x, e.motion.y);
|
||||||
break;
|
break;
|
||||||
|
case SDL_VIDEORESIZE:
|
||||||
|
if (SDL_SetVideoMode(e.resize.w, e.resize.h, 16, VidMask) == 0)
|
||||||
|
throw sg_throwable(string("Failed to set SDL video mode: ")
|
||||||
|
+ SDL_GetError());
|
||||||
|
|
||||||
|
if (WindowResizeHandler)
|
||||||
|
(*WindowResizeHandler)(e.resize.w, e.resize.h);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(IdleHandler) (*IdleHandler)();
|
if(IdleHandler) (*IdleHandler)();
|
||||||
|
|
Loading…
Reference in a new issue