/*  $Id: display_window_sdl.h,v 1.12 2004/03/10 22:30:13 mbn Exp $
**
**  ClanLib Game SDK
**  Copyright (C) 2003  The ClanLib Team
**  For a total list of contributers see the file CREDITS.
**
**  This library is free software; you can redistribute it and/or
**  modify it under the terms of the GNU Lesser General Public
**  License as published by the Free Software Foundation; either
**  version 2.1 of the License, or (at your option) any later version.
**
**  This library 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
**  Lesser General Public License for more details.
**
**  You should have received a copy of the GNU Lesser General Public
**  License along with this library; if not, write to the Free Software
**  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
*/

#ifndef header_display_window_sdl
#define header_display_window_sdl

#if _MSC_VER > 1000
#pragma once
#endif

#include <map>
#include <stack>

#include "API/Core/System/keep_alive.h"

#include "API/Display/graphic_context.h"
#include "API/Display/pixel_buffer.h"
#include "API/Display/input_device.h"
#include "API/Display/input_context.h"
#include "API/Display/display_window_description.h"

#include "Display/display_window_generic.h"

#include <SDL/SDL.h>

#ifdef WIN32
#include <windows.h>
#else
#include <X11/Xlib.h>
#endif

class CL_DisplayWindow_SDL : public CL_DisplayWindow_Generic, CL_KeepAlive
{
//! Construction:
public:
	CL_DisplayWindow_SDL();

	virtual ~CL_DisplayWindow_SDL();

//! Attributes:
public:
	//: Returns the width of this window.
	virtual int get_width() const;

	//: Returns the height of this window.
	virtual int get_height() const;

	//: Returns true if fullscreen window.
	virtual bool is_fullscreen() const;

	//: Returns true if window got focus.
	virtual bool has_focus() const;

	//: Returns pixelbuffer interfaces for flipping buffers.
	virtual CL_PixelBuffer &get_buffer(int i);

	//: Returns const versions of the pixelbuffer interfaces.
	virtual const CL_PixelBuffer &get_buffer(int i) const;

	//: Returns the amount of flipping buffers.
	virtual int get_buffer_count() const;

	//: Returns the graphic context of this window.
	virtual CL_GraphicContext *get_gc();

	//: Returns the input context of this window.
	virtual CL_InputContext *get_ic() { return &input_context; }

	//: Input context for all input devices associated with this window.
	CL_InputContext input_context;

	//: Input device for the keyboard.
	CL_InputDevice keyboard;

	//: Input device for the mouse.
	CL_InputDevice mouse;

#ifdef WIN32
	//: Returns the Win32 window handle.
	HWND get_wnd();
#else
	//: Returns the X11 window handle.
	Display *get_wnd();
#endif

//! Operations:
public:
	//: Set window to fullscreen.
	virtual void set_fullscreen(int width, int height, int bpp, int refresh_rate);

	//: Restore to windowed mode.
	virtual void set_windowed();

	//: Change title on window.
	virtual void set_title(const std::string &title);

	//: Set window position and size.
	virtual void set_position(const CL_Rect &pos);

	//: Set window position.
	virtual void set_position(int x, int y);

	//: Set window size.
	virtual void set_size(int width, int height);

	//: Change the buffer count in the flipping system.
	virtual void set_buffer_count(int flipping_buffers);

	//: Copy a region of the backbuffer to the frontbuffer.
	virtual void update(const CL_Rect &rect);

	//: Flip the backbuffer to front.
	virtual void flip(int interval);

	//: Make system cursor visible over window.
	virtual void show_system_cursor();

	//: Make system cursor invisible over window.
	virtual void hide_system_cursor();

	//: Create a window.
	virtual void create_window(const CL_DisplayWindowDescription &desc);

	//: Called by ClanLib keep alive pump.
	virtual void keep_alive();

//! Signals:
public:
	//: Signal emitted when SDL mouse events are to be processed.
	CL_Signal_v1<SDL_Event &> sig_sdl_mouse_event;

	//: Signal emitted when SDL keyboard events are to be processed.
	CL_Signal_v1<SDL_Event &> sig_sdl_keyboard_event;

	//: Signal emitted when SDL joystick events are to be processed.
	CL_Signal_v1<SDL_Event &> sig_sdl_joystick_event;

//! Implementation:
private:
	//: Signal that a new cursor CL_Sprite is available
	void cursor_changed();

	//: Destroy current window handles.
	void destroy_window();
	
	// SDL compatible gc.
	CL_GraphicContext gc;

	//: SDL frame buffer access.
	CL_PixelBuffer buffer_front, buffer_back;

	// main SDL_Surface display window representation object (bot that much an object as SDL is C-code)
	SDL_Surface *screen;

	// event object
	SDL_Event event;

	// manage fullscreen state
	bool fullscreen;
};

#endif

