#ifndef _TCUWAYLAND_HPP
#define _TCUWAYLAND_HPP
/*-------------------------------------------------------------------------
 * drawElements Quality Program Tester Core
 * ----------------------------------------
 *
 * Copyright (c) 2014 The Android Open Source Project
 * Copyright (c) 2016 The Khronos Group Inc.
 * Copyright (c) 2016 Mun Gwan-gyeong <elongbug@gmail.com>
 *
 * 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 wayland utilities.
 *//*--------------------------------------------------------------------*/

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

#include <wayland-client.h>
#include <wayland-egl.h>

namespace tcu
{
namespace wayland
{

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 Display
{
public:
							Display					(EventState& platform, const char* name);
	virtual					~Display				(void);

	struct wl_display*		getDisplay				(void) { return m_display;		}
	struct wl_compositor*	getCompositor			(void) { return m_compositor;	}
	struct wl_shell*		getShell				(void) { return m_shell;		}

	void					processEvents			(void);

protected:
	EventState&				m_eventState;
	struct wl_display*		m_display;
	struct wl_registry*		m_registry;
	struct wl_compositor*	m_compositor;
	struct wl_shell*		m_shell;

private:
							Display					(const Display&);
	Display&				operator=				(const Display&);

	static const struct wl_registry_listener		s_registryListener;

	static void				handleGlobal			(void* data, struct wl_registry* registry, uint32_t id, const char* interface, uint32_t version);
	static void				handleGlobalRemove		(void* data, struct wl_registry* registry, uint32_t name);
};

class Window
{
public:
							Window					(Display& display, int width, int height);
							~Window					(void);

	void					setVisibility			(bool visible);

	void					processEvents			(void);
	Display&				getDisplay				(void) { return m_display; }
	void*					getSurface				(void) { return m_surface; }
	void*					getWindow				(void) { return m_window; }

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

protected:

	Display&					m_display;
	struct wl_egl_window*		m_window;
	struct wl_surface*			m_surface;
	struct wl_shell_surface*	m_shellSurface;
	bool						m_visible;

private:
							Window					(const Window&);
	Window&					operator=				(const Window&);

	static const struct wl_shell_surface_listener	s_shellSurfaceListener;

	static void				handlePing				(void* data, struct wl_shell_surface* shellSurface, uint32_t serial);
	static void				handleConfigure			(void* data, struct wl_shell_surface* shellSurface, uint32_t edges, int32_t width, int32_t height);
	static void				handlePopupDone			(void* data, struct wl_shell_surface* shellSurface);
};

} // wayland
} // tcu

#endif // _TCUWAYLAND_HPP
