Use a flags table for setMode now, implement resizable and borderless windows, and add resize event

Example setMode invocation: love.graphics.setMode(800, 600, {fullscreen = false, vsync = true, borderless = true})
t.screen.resizable and t.screen.borderless are available in love.conf
And love.resize(w, h) gets called if it exists on a resize event.
NOTE: love.handlers.resize(w, h) does the required setMode, but that does mean a visual reload

--HG--
branch : minor
This commit is contained in:
Bart van Strien
2012-07-23 11:53:13 +02:00
parent 787bb868a1
commit bddee1753b
9 changed files with 185 additions and 48 deletions
+11 -2
View File
@@ -33,6 +33,15 @@ namespace love
namespace window
{
struct WindowFlags
{
bool fullscreen; // = false
bool vsync; // = true
int fsaa; // = 0
bool resizable; // = false
bool borderless; // = false
}; // WindowFlags
class Window : public Module
{
public:
@@ -44,8 +53,8 @@ public:
virtual ~Window();
virtual bool setWindow(int width = 800, int height = 600, bool fullscreen = false, bool vsync = true, int fsaa = 0) = 0;
virtual void getWindow(int &width, int &height, bool &fullscreen, bool &vsync, int &fsaa) = 0;
virtual bool setWindow(int width, int height, WindowFlags *flags = 0) = 0;
virtual void getWindow(int &width, int &height, WindowFlags &flags) = 0;
virtual bool checkWindowSize(int width, int height, bool fullscreen) = 0;
virtual WindowSize **getFullscreenSizes(int &n) = 0;
+36 -10
View File
@@ -60,8 +60,23 @@ Window::_currentMode::_currentMode()
{
}
bool Window::setWindow(int width, int height, bool fullscreen, bool vsync, int fsaa)
bool Window::setWindow(int width, int height, WindowFlags *flags)
{
bool fullscreen = false;
bool vsync = true;
int fsaa = 0;
bool resizable = false;
bool borderless = false;
if (flags)
{
fullscreen = flags->fullscreen;
vsync = flags->vsync;
fsaa = flags->fsaa;
resizable = flags->resizable;
borderless = flags->borderless;
}
bool mouseVisible = getMouseVisible();
// We need to restart the subsystem for two reasons:
@@ -104,23 +119,30 @@ bool Window::setWindow(int width, int height, bool fullscreen, bool vsync, int f
SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, fsaa);
}
// Fullscreen?
Uint32 sdlflags = fullscreen ? (SDL_OPENGL | SDL_FULLSCREEN) : SDL_OPENGL;
Uint32 sdlflags = SDL_OPENGL;
// Flags
if (fullscreen)
sdlflags |= SDL_FULLSCREEN;
if (resizable)
sdlflags |= SDL_RESIZABLE;
if (borderless)
sdlflags |= SDL_NOFRAME;
// Have SDL set the video mode.
if (SDL_SetVideoMode(width, height, 32, sdlflags) == 0)
SDL_Surface *surface;
if ((surface = SDL_SetVideoMode(width, height, 32, sdlflags)) == 0)
{
bool failed = true;
if (fsaa > 0)
{
// FSAA might have failed, disable it and try again
SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 0);
failed = SDL_SetVideoMode(width, height, 32, sdlflags) == 0;
failed = (surface = SDL_SetVideoMode(width, height, 32, sdlflags)) == 0;
if (failed)
{
// There might be no FSAA at all
SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 0);
failed = SDL_SetVideoMode(width, height, 32, sdlflags) == 0;
failed = (surface = SDL_SetVideoMode(width, height, 32, sdlflags)) == 0;
}
}
if (failed)
@@ -165,17 +187,21 @@ bool Window::setWindow(int width, int height, bool fullscreen, bool vsync, int f
currentMode.fsaa = fsaa;
currentMode.fullscreen = fullscreen;
currentMode.vsync = (real_vsync != 0);
currentMode.resizable = ((surface->flags & SDL_RESIZABLE) != 0);
currentMode.borderless = ((surface->flags & SDL_NOFRAME) != 0);
return true;
}
void Window::getWindow(int &width, int &height, bool &fullscreen, bool &vsync, int &fsaa)
void Window::getWindow(int &width, int &height, WindowFlags &flags)
{
width = currentMode.width;
height = currentMode.height;
fullscreen = currentMode.fullscreen;
vsync = currentMode.vsync;
fsaa = currentMode.fsaa;
flags.fullscreen = currentMode.fullscreen;
flags.vsync = currentMode.vsync;
flags.fsaa = currentMode.fsaa;
flags.resizable = currentMode.resizable;
flags.borderless = currentMode.borderless;
}
bool Window::checkWindowSize(int width, int height, bool fullscreen)
+4 -2
View File
@@ -37,8 +37,8 @@ public:
Window();
~Window();
bool setWindow(int width = 800, int height = 600, bool fullscreen = false, bool vsync = true, int fsaa = 0);
void getWindow(int &width, int &height, bool &fullscreen, bool &vsync, int &fsaa);
bool setWindow(int width, int height, WindowFlags *flags = 0);
void getWindow(int &width, int &height, WindowFlags &flags);
bool checkWindowSize(int width, int height, bool fullscreen);
WindowSize **getFullscreenSizes(int &n);
@@ -72,6 +72,8 @@ private:
bool fullscreen;
bool vsync;
int fsaa;
bool resizable;
bool borderless;
} currentMode;
bool created;
bool mouseVisible;