#ifndef _TCUX11_HPP
#define _TCUX11_HPP
/*-------------------------------------------------------------------------
 * drawElements Quality Program Tester Core
 * ----------------------------------------
 *
 * Copyright 2014 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 *//*!
 * \file
 * \brief X11 utilities.
 *//*--------------------------------------------------------------------*/

#include "tcuDefs.hpp"
#include "gluRenderConfig.hpp"
#include "gluPlatform.hpp"
#include "deMutex.hpp"

#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/keysym.h>
#include <X11/Xatom.h>

namespace tcu
{
namespace x11
{
enum
{
	DEFAULT_WINDOW_WIDTH	= 400,
	DEFAULT_WINDOW_HEIGHT	= 300
};

class EventState
{
public:
				EventState	(void);
	virtual		~EventState	(void);
	void		setQuitFlag	(bool quit);
	bool		getQuitFlag	(void);

protected:
	de::Mutex	m_mutex;
	bool		m_quit;

private:
				EventState	(const EventState&);
	EventState&	operator=	(const EventState&);
};

class DisplayBase
{
public:
					DisplayBase		(EventState& platform);
	virtual			~DisplayBase	(void);
	virtual void	processEvents	(void) = 0;

protected:
	EventState&		m_eventState;

private:
					DisplayBase		(const DisplayBase&);
	DisplayBase&	operator=		(const DisplayBase&);
};

class WindowBase
{
public:
							WindowBase		(void);
	virtual					~WindowBase		(void);

	virtual void			setVisibility	(bool visible) = 0;

	virtual void			processEvents	(void) = 0;
	virtual DisplayBase&	getDisplay		(void) = 0;

	virtual void			getDimensions	(int* width, int* height) const = 0;
	virtual void			setDimensions	(int width, int height) = 0;

protected:
	bool					m_visible;

private:
							WindowBase		(const WindowBase&);
	WindowBase&				operator=		(const WindowBase&);
};

class XlibDisplay : public DisplayBase
{
public:
					XlibDisplay		(EventState& platform, const char* name);
	virtual			~XlibDisplay	(void);

	::Display*		getXDisplay		(void) { return m_display;		}
	Atom			getDeleteAtom	(void) { return m_deleteAtom;	}

	::Visual*		getVisual		(VisualID visualID);
	bool			getVisualInfo	(VisualID visualID, XVisualInfo& dst);
	void			processEvents	(void);

protected:
	::Display*		m_display;
	Atom			m_deleteAtom;

private:
					XlibDisplay		(const XlibDisplay&);
	XlibDisplay&	operator=		(const XlibDisplay&);
};

class XlibWindow : public WindowBase
{
public:
					XlibWindow			(XlibDisplay& display, int width, int height,
										::Visual* visual);
					~XlibWindow			(void);

	void			setVisibility	(bool visible);

	void			processEvents	(void);
	DisplayBase&	getDisplay		(void) { return (DisplayBase&)m_display; }
	::Window&		getXID			(void) { return m_window; }

	void			getDimensions	(int* width, int* height) const;
	void			setDimensions	(int width, int height);

protected:
	XlibDisplay&	m_display;
	::Colormap		m_colormap;
	::Window		m_window;

private:
					XlibWindow		(const XlibWindow&);
	XlibWindow&		operator=		(const XlibWindow&);
};

} // x11
} // tcu

#endif // _TCUX11_HPP
