#include "SDLWindow.h"

void SDLWindow::SwapBuffers() {
	SDL_GL_SwapBuffers();
}

void SDLWindow::SetWindowText(const char *text) {
	SDL_WM_SetCaption(text, NULL);
}

bool SDLWindow::PeekMessages() {
	// TODO implement
	return false;
}

void SDLWindow::Update() {

	SDL_Surface *surface = SDL_GetVideoSurface();
	if (!surface) {
		PanicAlert("Can't get surface to update");
		return;
	}

	//SetSize(surface->w, surface->h);
	updateDim();

}

bool SDLWindow::MakeCurrent() {
	/* Note: The reason for having the call to SDL_SetVideoMode in here instead
	of in OpenGL_Create() is that "make current" is part of the video
	mode setting and is not available as a separate call in SDL. We
	have to do "make current" here because this method runs in the CPU
	thread while OpenGL_Create() runs in a diferent thread and "make
	current" has to be done in the same thread that will be making
	calls to OpenGL. */

	// Fetch video info.
	const SDL_VideoInfo *videoInfo = SDL_GetVideoInfo();
	if (!videoInfo) {
		PanicAlert("Couldn't get video info");
		SDL_Quit();
		return false;
	}
	// Compute video mode flags.
	const int videoFlags = SDL_OPENGL
		| ( videoInfo->hw_available ? SDL_HWSURFACE : SDL_SWSURFACE )
		| ( g_Config.bFullscreen ? SDL_FULLSCREEN : 0);
	// Set vide mode.
	// TODO: Can we use this field or is a separate field needed?
	SDL_Surface *screen = SDL_SetVideoMode(GetXwin(), GetYwin(), 
		0, videoFlags);
	if (!screen) {
		PanicAlert("Couldn't set video mode");
		SDL_Quit();
		return false;
	}

	return true;
}

SDLWindow::~SDLWindow() {
	SDL_Quit();
}

SDLWindow::SDLWindow() : GLWindow() {

	//init sdl video
	if (SDL_Init(SDL_INIT_VIDEO) < 0) {
		PanicAlert("Failed to init SDL: %s", SDL_GetError());
		SDL_Quit();
		//return NULL;
	}

	// Setup ogl to use double buffering
	SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
}