#ifndef _TCULNXX11_HPP
#define _TCULNXX11_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 "tcuLnx.hpp"

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

namespace tcu
{
namespace lnx
{
namespace x11
{

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

	enum DisplayState
	{
		DISPLAY_STATE_UNKNOWN = -1,
		DISPLAY_STATE_UNAVAILABLE,
		DISPLAY_STATE_AVAILABLE
	};

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);
	void			processEvent	(XEvent& event);
	static bool		hasDisplay	(const char* name);

	static DisplayState	s_displayState;

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
} // lnx
} // tcu

#endif // _TCULNXX11_HPP
