aboutsummaryrefslogblamecommitdiffstats
path: root/src/menu/application.cpp
blob: d36e10b3c6b829da663c6568f129adcd39d667c8 (plain) (tree)










































































































































                                                                         
/*
 * UltraStar Deluxe - Karaoke Game
 *
 * UltraStar Deluxe is the legal property of its developers, whose names
 * are too numerous to list here. Please refer to the COPYRIGHT
 * file distributed with this source distribution.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; see the file COPYING. If not, write to
 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 * Boston, MA 02110-1301, USA.
 *
 * $URL$
 * $Id$
 */

#include "application.hpp"
#include <exception>

namespace usdx
{
	log4cxx::LoggerPtr Application::log =
		log4cxx::Logger::getLogger("usdx.menu.application");

	Application* Application::instance = NULL;

	Application::Application(Control* parent)
		: DrawableControl(parent), display(NULL), frame(NULL),
		  running(false), display_width(800), display_height(600)
	{
		SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO);

		fps_manager = new FPSmanager();
	}

	Application::~Application()
	{
		if (fps_manager) {
			delete fps_manager;
			fps_manager = NULL;
		}

		SDL_Quit();
	}

	Application* Application::get_instance(void)
	{
		if (! instance) {
			instance = new Application(NULL);
		}

		return instance;
	}

	void Application::draw(SDL_Surface* screen) const
	{
		if (frame) {
			frame->repaint(screen);
		}
	}

	const Frame *Application::get_current_frame(void) const
	{
		return frame;
	}

	void Application::set_current_frame(Frame* new_frame)
	{
		frame = new_frame;
		repaint(display);
	}

	void Application::main_loop(SDL_Surface* display)
	{
		SDL_Event event;

		running = true;
		while (running) {
			// repaint everything
			repaint(display);
			SDL_Flip(display);

			LOG4CXX_ERROR(log, L"repaint");

			// poll current events
			while (SDL_PollEvent(&event)) {
				switch (event.type) {
				case SDL_QUIT:
					running = false;
					return;
				}
			}

			// limit frames
			SDL_framerateDelay(fps_manager);
		}
	}

	void Application::run(void)
	{
		if (! display) {
			display = SDL_SetVideoMode(display_width,
						   display_height,
						   24,
						   SDL_SWSURFACE |
						   SDL_DOUBLEBUF);
		}

		if (! display) {
			LOG4CXX_ERROR(log, L"SDL_SetVideoMode failed.");
			throw new std::exception();
		}

		SDL_initFramerate(fps_manager);
		SDL_setFramerate(fps_manager, 50);

		main_loop(display);
	}

	const int Application::get_display_width(void) const
	{
		return display_width;
	}

	const int Application::get_display_height(void) const
	{
		return display_height;
	}
};