text: #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
  {
  
  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*					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
  