#ifndef _ECORE_WL2_H_
# define _ECORE_WL2_H_

# include <Eina.h>
# include <Ecore.h>
# include <wayland-client.h>
# include <wayland-cursor.h>
# include <xkbcommon/xkbcommon.h>

# define WL_HIDE_DEPRECATED
# include <wayland-server.h>

# ifdef EAPI
#  undef EAPI
# endif

# ifdef __GNUC__
#  if __GNUC__ >= 4
#   define EAPI __attribute__ ((visibility("default")))
#  else
#   define EAPI
#  endif
# else
#  define EAPI
# endif

# ifdef __cplusplus
extern "C" {
# endif

#define ECORE_WL2_SURFACE_INTERFACE_VERSION 1

/**
 * @file
 * @brief Ecore functions for dealing with the Wayland display protocol
 *
 * @defgroup Ecore_Wl2_Group Ecore_Wl2 - Wayland integration
 * @ingroup Ecore
 *
 * Ecore_Wl2 provides a wrapper and convenience functions for using the
 * Wayland protocol in implementing a window system. Function groups for
 * this part of the library include the following:
 *
 * @li @ref Ecore_Wl2_Init_Group
 * @li @ref Ecore_Wl2_Display_Group
 * @li @ref Ecore_Wl2_Window_Group
 * @li @ref Ecore_Wl2_Input_Group
 */

#  ifndef _ECORE_WL2_WINDOW_PREDEF
/**
 * @ingroup Ecore_Wl2_Group
 *
 * @typedef Ecore_Wl2_Window
 * Type for Ecore_Wl2_Window
 */
typedef struct _Ecore_Wl2_Window Ecore_Wl2_Window;
#  endif

/**
 * @ingroup Ecore_Wl2_Group
 *
 * @typedef Ecore_Wl2_Display
 * Type for Ecore_Wl2_Display
 */
typedef struct _Ecore_Wl2_Display Ecore_Wl2_Display;

/**
 * @ingroup Ecore_Wl2_Group
 *
 * @typedef Ecore_Wl2_Input
 * Type for Ecore_Wl2_Input
 */
typedef struct _Ecore_Wl2_Input Ecore_Wl2_Input;

// TIZEN_ONLY(20190807): Support for wl_egl interface
/**
 * @ingroup Ecore_Wl2_Group
 *
 * @typedef Ecore_Wl2_Egl_Window
 * Type for Ecore_Wl2_Egl_Window
 */
typedef struct _Ecore_Wl2_Egl_Window Ecore_Wl2_Egl_Window;
//

/** @internal */
typedef struct _Ecore_Wl2_Subsurface Ecore_Wl2_Subsurface;
/** @internal */
typedef struct _Ecore_Wl2_Output Ecore_Wl2_Output;
/** @internal */
typedef struct _Ecore_Wl2_Seat Ecore_Wl2_Seat;
/** @internal */
typedef struct _Ecore_Wl2_Pointer Ecore_Wl2_Pointer;
/** @internal */
typedef struct _Ecore_Wl2_Keyboard Ecore_Wl2_Keyboard;
/** @internal */
typedef struct _Ecore_Wl2_Touch Ecore_Wl2_Touch;
/** @internal */
typedef struct _Ecore_Wl2_Offer Ecore_Wl2_Offer;
/** @internal */
typedef struct _Ecore_Wl2_Surface Ecore_Wl2_Surface;
// TIZEN_ONLY(20171109): support a tizen_input_device_manager interface
/** @internal */
typedef struct _Ecore_Wl2_Tizen_Input_Eo_Device Ecore_Wl2_Tizen_Input_Eo_Device;
/** @internal */
typedef struct _Ecore_Wl2_Tizen_Input_Device Ecore_Wl2_Tizen_Input_Device;
//

/**
 * @ingroup Ecore_Wl2_Group
 *
 * @typedef Ecore_Wl2_Event_Connect
 * Type for Ecore_Wl2_Event_Connect
 */
typedef struct _Ecore_Wl2_Event_Connection Ecore_Wl2_Event_Connect;

/**
 * @ingroup Ecore_Wl2_Group
 *
 * @typedef Ecore_Wl2_Event_Disconnect
 * Type for Ecore_Wl2_Event_Disconnect
 */
typedef struct _Ecore_Wl2_Event_Connection Ecore_Wl2_Event_Disconnect;

struct _Ecore_Wl2_Event_Connection
{
   Ecore_Wl2_Display *display;
};

/**
 * @ingroup Ecore_Wl2_Group
 *
 * @typedef Ecore_Wl2_Event_Global
 * Type for _Ecore_Wl2_Event_Global
 */
typedef struct _Ecore_Wl2_Event_Global
{
   Ecore_Wl2_Display *display;
   Eina_Stringshare *interface;
   unsigned int id, version;
} Ecore_Wl2_Event_Global;

/**
 * @ingroup Ecore_Wl2_Group
 *
 * @typedef Ecore_Wl2_Event_Window_Configure
 * Type for Ecore_Wl2_Event_Window_Configure
 */
typedef struct _Ecore_Wl2_Event_Window_Configure
{
   unsigned int win, event_win, edges;
// TIZEN_ONLY
   int x, y;
//
   unsigned int w, h;
   unsigned int states;
} Ecore_Wl2_Event_Window_Configure;

/**
 * @ingroup Ecore_Wl2_Group
 *
 * @typedef Ecore_Wl2_Event_Window_Configure_Complete
 * Type for Ecore_Wl2_Event_Window_Configure_Complete
 */
typedef struct _Ecore_Wl2_Event_Window_Configure_Complete
{
   unsigned int win;
} Ecore_Wl2_Event_Window_Configure_Complete;

/*
 * @ingroup Ecore_Wl2_Group
 *
 * @typedef Ecore_Wl2_Event_Window_Show
 * Type for Ecore_Wl2_Event_Window_Show
 */
typedef struct _Ecore_Wl2_Event_Window_Show
{
   unsigned int win;
   unsigned int parent_win;
   unsigned int event_win;
   // TIZEN_ONLY
   unsigned int data[4];
   //
} Ecore_Wl2_Event_Window_Show;

/*
 * @ingroup Ecore_Wl2_Group
 *
 * @typedef Ecore_Wl2_Event_Window_Hide
 * Type for Ecore_Wl2_Event_Window_Hide
 */
typedef struct _Ecore_Wl2_Event_Window_Hide
{
   unsigned int win;
   unsigned int parent_win;
   unsigned int event_win;
} Ecore_Wl2_Event_Window_Hide;

/*
 * @ingroup Ecore_Wl2_Group
 *
 * @typedef Ecore_Wl2_Event_Window_Activate
 * Type for Ecore_Wl2_Event_Window_Activate
 */
typedef struct _Ecore_Wl2_Event_Window_Activate
{
   unsigned int win;
   unsigned int parent_win;
   unsigned int event_win;
} Ecore_Wl2_Event_Window_Activate;

/*
 * @ingroup Ecore_Wl2_Group
 *
 * @typedef Ecore_Wl2_Event_Window_Deactivate
 * Type for Ecore_Wl2_Event_Window_Deactivate
 */
typedef struct _Ecore_Wl2_Event_Window_Deactivate
{
   unsigned int win;
   unsigned int parent_win;
   unsigned int event_win;
} Ecore_Wl2_Event_Window_Deactivate;

typedef struct _Ecore_Wl2_Event_Window_Common
{
   unsigned int win;
   unsigned int parent_win;
   unsigned int event_win;
} Ecore_Wl2_Event_Window_Common;

/*
 * @ingroup Ecore_Wl2_Group
 *
 * @typedef Ecore_Wl2_Event_Window_Lower
 * Type for Ecore_Wl2_Event_Window_Lower
 */
typedef struct _Ecore_Wl2_Event_Window_Lower
{
   unsigned int win;
   unsigned int timestamp;
} Ecore_Wl2_Event_Window_Lower;

// TIZEN_ONLY(20171107): support a tizen_keyrouter interface
//this enum for keyrouter and client window side
//keycode (8~255)
/*
 * @ingroup Ecore_Wl2_Group
 *
 * @typedef Ecore_Wl2_Window_Keygrab_Mode
 * Type for Ecore_Wl2_Window_Keygrab_Mode
 *
 * @warning third-party application can use ECORE_WL2_WINDOW_KEYGRAB_TOPMOST mode.
 *          don't use other modes. those are not for third-party application.
 */
typedef enum _Ecore_Wl2_Window_Keygrab_Mode
{
   ECORE_WL2_WINDOW_KEYGRAB_UNKNOWN = 0, /**< Unknown keygrab mode */
   ECORE_WL2_WINDOW_KEYGRAB_SHARED = 1, /**< Not for third-party application. Getting the grabbed-key together with the other client windows */
   ECORE_WL2_WINDOW_KEYGRAB_TOPMOST = 2, /**< Getting the grabbed-key only when window is top of the stack */
   ECORE_WL2_WINDOW_KEYGRAB_OVERRIDE_EXCLUSIVE = 3, /**< Not for third-party application Getting the grabbed-key exclusively regardless of window's position. Being overrided the grab by the other client window  */
   ECORE_WL2_WINDOW_KEYGRAB_EXCLUSIVE = 4 /**< Not for third-party application Getting the grabbed-key exclusively regardless of window's position */
} Ecore_Wl2_Window_Keygrab_Mode;

/*
 * @ingroup Ecore_Wl2_Group
 *
 * @typedef Ecore_Wl2_Window_Keygrab_Info
 * Type for Ecore_Wl2_Window_Keygrab_Info
 */
typedef struct _Ecore_Wl2_Window_Keygrab_Info
{
   char *key;
   Ecore_Wl2_Window_Keygrab_Mode mode;
} Ecore_Wl2_Window_Keygrab_Info;
//

/*
 * @ingroup Ecore_Wl2_Group
 *
 * @typedef Ecore_Wl2_Frame_Cb
 * Type for Ecore_Wl2_Frame_Cb
 */
typedef void (*Ecore_Wl2_Frame_Cb)(Ecore_Wl2_Window *win, uint32_t timestamp, void *data);

/*
 * @ingroup Ecore_Wl2_Group
 *
 * @typedef Ecore_Wl2_Frame_Cb_Handle
 * Type for Ecore_Wl2_Frame_Cb_Handle
 */
typedef struct _Ecore_Wl2_Frame_Cb_Handle Ecore_Wl2_Frame_Cb_Handle;

/* matches protocol values */
/** @internal */
typedef enum
{
   ECORE_WL2_DRAG_ACTION_NONE = 0,
   ECORE_WL2_DRAG_ACTION_COPY = 1,
   ECORE_WL2_DRAG_ACTION_MOVE = 2,
   ECORE_WL2_DRAG_ACTION_ASK = 4,
   ECORE_WL2_DRAG_ACTION_LAST = 5,
} Ecore_Wl2_Drag_Action;

/** @internal */
typedef enum
{
  ECORE_WL2_SEAT_CAPABILITIES_NONE = 0,
  ECORE_WL2_SEAT_CAPABILITIES_POINTER = 1,
  ECORE_WL2_SEAT_CAPABILITIES_KEYBOARD = 2,
  ECORE_WL2_SEAT_CAPABILITIES_TOUCH = 4
} Ecore_Wl2_Seat_Capabilities;

/** @internal */
typedef struct _Ecore_Wl2_Global
{
   Eina_Stringshare *interface;
   unsigned int id, version;
   Ecore_Wl2_Display *display;
} Ecore_Wl2_Global;

/** @internal */
typedef struct _Ecore_Wl2_Event_Focus_In
{
   unsigned int window;
   unsigned int timestamp;
   Eo *dev; //The seat device
   Ecore_Wl2_Display *display;
} Ecore_Wl2_Event_Focus_In;

/** @internal */
typedef struct _Ecore_Wl2_Event_Focus_Out
{
   unsigned int window;
   unsigned int timestamp;
   Eo *dev; //The seat device
   Ecore_Wl2_Display *display;
} Ecore_Wl2_Event_Focus_Out;

/** @internal */
typedef struct _Ecore_Wl2_Event_Dnd_Enter
{
   unsigned int win, source;
   Ecore_Wl2_Offer *offer;
   int x, y;
   unsigned int seat;
   Ecore_Wl2_Display *display;
} Ecore_Wl2_Event_Dnd_Enter;

/** @internal */
typedef struct _Ecore_Wl2_Event_Dnd_Leave
{
   unsigned int win, source;
   Ecore_Wl2_Offer *offer;
   unsigned int seat;
   Ecore_Wl2_Display *display;
} Ecore_Wl2_Event_Dnd_Leave;

/** @internal */
typedef struct _Ecore_Wl2_Event_Dnd_Motion
{
   unsigned int win, source;
   Ecore_Wl2_Offer *offer;
   int x, y;
   unsigned int seat;
   Ecore_Wl2_Display *display;
} Ecore_Wl2_Event_Dnd_Motion;

/** @internal */
typedef struct _Ecore_Wl2_Event_Dnd_Drop
{
   unsigned int win, source;
   int x, y;
   Ecore_Wl2_Offer *offer;
   unsigned int seat;
   Ecore_Wl2_Display *display;
} Ecore_Wl2_Event_Dnd_Drop;

/** @internal */
typedef struct _Ecore_Wl2_Event_Dnd_End
{
   unsigned int win, source;
   unsigned int seat;
   Ecore_Wl2_Display *display;
} Ecore_Wl2_Event_Dnd_End;

/** @internal */
struct _Ecore_Wl2_Event_Data_Source_Event
{
   unsigned int win, source;
   Ecore_Wl2_Drag_Action action;
   unsigned int seat;
   uint32_t serial;
   Ecore_Wl2_Display *display;
};

/** @internal */
typedef struct Ecore_Wl2_Event_Data_Source_End
{
   unsigned int win, source;
   Ecore_Wl2_Drag_Action action;
   unsigned int seat;
   uint32_t serial;
   Ecore_Wl2_Display *display;
   Eina_Bool cancelled;
} Ecore_Wl2_Event_Data_Source_End;

/** @internal */
typedef struct _Ecore_Wl2_Event_Data_Source_Event Ecore_Wl2_Event_Data_Source_Drop;
/** @internal */
typedef struct _Ecore_Wl2_Event_Data_Source_Event Ecore_Wl2_Event_Data_Source_Action;

/** @internal */
typedef struct _Ecore_Wl2_Event_Data_Source_Target
{
   char *type;
   unsigned int seat;
   Ecore_Wl2_Display *display;
} Ecore_Wl2_Event_Data_Source_Target;

/** @internal */
typedef struct _Ecore_Wl2_Event_Data_Source_Send
{
   char *type;
   int fd;
   unsigned int seat;
   uint32_t serial;
   Ecore_Wl2_Display *display;
} Ecore_Wl2_Event_Data_Source_Send;

/** @internal */
typedef struct Ecore_Wl2_Event_Seat_Selection
{
   //TIZEN_ONLY(20180724): Supporting copy and paste for cbhm
   int num_types;
   const char **types;
   //
   unsigned int seat;
   Ecore_Wl2_Display *display;
} Ecore_Wl2_Event_Seat_Selection;

/** @internal */
typedef struct _Ecore_Wl2_Event_Seat_Name
{
   Eina_Stringshare *name;
   unsigned int id;
   Ecore_Wl2_Display *display;
} Ecore_Wl2_Event_Seat_Name;

/** @internal */
typedef struct _Ecore_Wl2_Event_Seat_Capabilities
{
   unsigned int id;
   Eina_Bool pointer_enabled : 1;
   Eina_Bool keyboard_enabled : 1;
   Eina_Bool touch_enabled : 1;
   Ecore_Wl2_Display *display;
} Ecore_Wl2_Event_Seat_Capabilities;

/** @internal */
typedef enum
{
   ECORE_WL2_DEVICE_TYPE_SEAT,
   ECORE_WL2_DEVICE_TYPE_POINTER,
   ECORE_WL2_DEVICE_TYPE_KEYBOARD,
   ECORE_WL2_DEVICE_TYPE_TOUCH
} Ecore_Wl2_Device_Type;

/** @internal */
typedef struct _Ecore_Wl2_Event_Device
{
   Eo *dev;
   int window_id;
   unsigned int seat_id;
   Ecore_Wl2_Device_Type type;
} Ecore_Wl2_Event_Device;

/** @internal */
typedef enum
{
   ECORE_WL2_SELECTION_CNP,
   ECORE_WL2_SELECTION_DND
} Ecore_Wl2_Selection_Type;

/** @internal */
typedef enum
{
   ECORE_WL2_WINDOW_STATE_NONE = 0,
   ECORE_WL2_WINDOW_STATE_FULLSCREEN = (1 << 0),
   ECORE_WL2_WINDOW_STATE_MAXIMIZED = (1 << 1),
} Ecore_Wl2_Window_States;

/** @internal */
typedef struct _Ecore_Wl2_Event_Input_Keymap_Changed
{
   unsigned int id;
   Ecore_Wl2_Display *display;
} Ecore_Wl2_Event_Seat_Keymap_Changed;

/** @internal */
typedef struct Ecore_Wl2_Event_Seat_Keyboard_Repeat_Changed
{
   unsigned int id;
   Ecore_Wl2_Display *display;
} Ecore_Wl2_Event_Seat_Keyboard_Repeat_Changed;

/** @internal */
typedef struct _Ecore_Wl2_Event_Sync_Done
{
   Ecore_Wl2_Display *display;
} Ecore_Wl2_Event_Sync_Done;

/** @internal */
typedef struct _Ecore_Wl2_Event_Offer_Data_Ready
{
   Ecore_Wl2_Offer *offer;
   char *data;
   int len;
   const char *mimetype;
   unsigned int seat;
   Ecore_Wl2_Display *display;
} Ecore_Wl2_Event_Offer_Data_Ready;

/** @internal */
typedef struct _Ecore_Wl2_Event_Output_Transform
{
   Ecore_Wl2_Output *output;
   int transform, old_transform;
} Ecore_Wl2_Event_Output_Transform;

/** @internal */
typedef struct _Ecore_Wl2_Event_Window_Rotation
{
   unsigned int win;
   int rotation, w, h, angle;
   Eina_Bool resize : 1;
} Ecore_Wl2_Event_Window_Rotation;

/** @internal */
typedef struct _Ecore_Wl2_Event_Window_Rotation Ecore_Wl2_Event_Window_Rotation_Change_Prepare;
/** @internal */
typedef struct _Ecore_Wl2_Event_Window_Rotation Ecore_Wl2_Event_Window_Rotation_Change_Prepare_Done;
/** @internal */
typedef struct _Ecore_Wl2_Event_Window_Rotation Ecore_Wl2_Event_Window_Rotation_Change_Request;
/** @internal */
typedef struct _Ecore_Wl2_Event_Window_Rotation Ecore_Wl2_Event_Window_Rotation_Change_Done;

/** @internal */
typedef struct _Ecore_Wl2_Event_Window_Iconify_State_Change
{
   unsigned int win;
   unsigned int iconified;
   unsigned int force;
} Ecore_Wl2_Event_Window_Iconify_State_Change;

/** @internal */
typedef enum _Ecore_Wl2_Window_Type
{
   ECORE_WL2_WINDOW_TYPE_NONE,
   ECORE_WL2_WINDOW_TYPE_TOPLEVEL,
   ECORE_WL2_WINDOW_TYPE_MENU,
   ECORE_WL2_WINDOW_TYPE_DND,
   ECORE_WL2_WINDOW_TYPE_CUSTOM,
   ECORE_WL2_WINDOW_TYPE_NOTIFICATION, /** @since 1.20 */
   ECORE_WL2_WINDOW_TYPE_UTILITY, /** @since 1.20 */
   ECORE_WL2_WINDOW_TYPE_DIALOG, /** @since 1.20 */
   ECORE_WL2_WINDOW_TYPE_DOCK, /** @since 1.20 */
   ECORE_WL2_WINDOW_TYPE_SPLASH, /** @since 1.20 */
   ECORE_WL2_WINDOW_TYPE_LAST
} Ecore_Wl2_Window_Type;

// TIZEN_ONLY(20171107): added wl enumerations from ecore_wayland to ecore_wl2
/** @internal */
typedef enum _Ecore_Wl2_Window_Visibility_Type
{
   ECORE_WL2_WINDOW_VISIBILITY_TYPE_UNKNOWN = 0,
   ECORE_WL2_WINDOW_VISIBILITY_TYPE_UNOBSCURED = 1,
   ECORE_WL2_WINDOW_VISIBILITY_TYPE_PARTIALLY_OBSCURED = 2,
   ECORE_WL2_WINDOW_VISIBILITY_TYPE_FULLY_OBSCURED = 3,
   ECORE_WL2_WINDOW_VISIBILITY_TYPE_PRE_UNOBSCURED = 4,
} Ecore_Wl2_Window_Visibility_Type;

/** @internal */
typedef enum _Ecore_Wl2_Window_Stack_Mode
{
   ECORE_WL2_WINDOW_STACK_NONE  = 0,
   ECORE_WL2_WINDOW_STACK_ABOVE = 1,
   ECORE_WL2_WINDOW_STACK_BELOW = 2,
} Ecore_Wl2_Window_Stack_Mode;

/** @internal */
typedef enum _Ecore_Wl2_Conformant_Part_Type
{
   ECORE_WL2_INDICATOR_PART = 0,
   ECORE_WL2_KEYBOARD_PART = 1,
   ECORE_WL2_CLIPBOARD_PART = 2
} Ecore_Wl2_Conformant_Part_Type;

/** @internal */
typedef enum _Ecore_Wl2_Virtual_Keyboard_State
{
   ECORE_WL2_VIRTUAL_KEYBOARD_STATE_UNKNOWN = 0,
   ECORE_WL2_VIRTUAL_KEYBOARD_STATE_OFF,
   ECORE_WL2_VIRTUAL_KEYBOARD_STATE_ON,
} Ecore_Wl2_Virtual_Keyboard_State;

/** @internal */
typedef enum _Ecore_Wl2_Indicator_State
{
   ECORE_WL2_INDICATOR_STATE_UNKNOWN = 0,
   ECORE_WL2_INDICATOR_STATE_OFF,
   ECORE_WL2_INDICATOR_STATE_ON
} Ecore_Wl2_Indicator_State;

/** @internal */
typedef enum _Ecore_Wl2_Indicator_Opacity_Mode
{
   ECORE_WL2_INDICATOR_OPACITY_UNKNOWN = 0,
   ECORE_WL2_INDICATOR_OPAQUE,
   ECORE_WL2_INDICATOR_TRANSLUCENT,
   ECORE_WL2_INDICATOR_TRANSPARENT,
   ECORE_WL2_INDICATOR_BG_TRANSPARENT,
} Ecore_Wl2_Indicator_Opacity_Mode;

/** @internal */
typedef enum _Ecore_Wl2_Indicator_Visible_Type
{
   ECORE_WL2_INDICATOR_VISIBLE_TYPE_HIDDEN = 0,
   ECORE_WL2_INDICATOR_VISIBLE_TYPE_SHOWN,
} Ecore_Wl2_Indicator_Visible_Type;

/** @internal */
typedef enum _Ecore_Wl2_Clipboard_State
{
   ECORE_WL2_CLIPBOARD_STATE_UNKNOWN = 0,
   ECORE_WL2_CLIPBOARD_STATE_OFF,
   ECORE_WL2_CLIPBOARD_STATE_ON
} Ecore_Wl2_Clipboard_State;
//

/** @internal */
typedef struct _Ecore_Wl2_Event_Aux_Hint_Allowed
{
   unsigned int win;
   int id;
   Ecore_Wl2_Display *display;
} Ecore_Wl2_Event_Aux_Hint_Allowed;

/** @internal */
typedef struct _Ecore_Wl2_Event_Aux_Hint_Supported
{
   unsigned int win;
   Ecore_Wl2_Display *display;
} Ecore_Wl2_Event_Aux_Hint_Supported;

/** @internal */
typedef struct Ecore_Wl2_Event_Aux_Message
{
   unsigned int win;
   Eina_Stringshare *key;
   Eina_Stringshare *val;
   Eina_List *options;
   Ecore_Wl2_Display *display;
} Ecore_Wl2_Event_Aux_Message;

/** @internal */
typedef struct Ecore_Wl2_Event_Window_Offscreen
{
   unsigned int win;
} Ecore_Wl2_Event_Window_Offscreen;

/** @internal */
typedef struct _Ecore_Wl2_Buffer Ecore_Wl2_Buffer;

/** @internal */
typedef enum _Ecore_Wl2_Buffer_Type
{
   ECORE_WL2_BUFFER_NONE = 0,
   ECORE_WL2_BUFFER_SHM = 1,
   ECORE_WL2_BUFFER_DMABUF = 2
} Ecore_Wl2_Buffer_Type;

// TIZEN_ONLY(20171107): added wl evet structures from ecore_wayland to ecore_wl2
/** @internal */
typedef struct _Ecore_Wl2_Event_Window_Visibility_Change
{
   unsigned int win;
   int          fully_obscured;
} Ecore_Wl2_Event_Window_Visibility_Change;

/** @internal */
typedef struct _Ecore_Wl2_Event_Window_Pre_Visibility_Change
{
   unsigned int win;
   Ecore_Wl2_Window_Visibility_Type type;
   unsigned int option;
} Ecore_Wl2_Event_Window_Pre_Visibility_Change;

/** @internal */
typedef struct _Ecore_Wl2_Event_Window_Redraw_Request
{
   unsigned int win;
} Ecore_Wl2_Event_Window_Redraw_Request;

/** @internal */
typedef struct _Ecore_Wl2_Event_Dnd_Position
{
   unsigned int win, source;
   struct
     {
        int x, y;
     } position;
} Ecore_Wl2_Event_Dnd_Position;

/** @internal */
typedef struct _Ecore_Wl2_Event_Data_Source_Cancelled
{
   unsigned int win, source;
} Ecore_Wl2_Event_Data_Source_Cancelled;

/** @internal */
typedef struct _Ecore_Wl2_Event_Selection_Data_Ready
{
   char *data;
   int len;
   Eina_Bool done;
   char **types;
   int num_types;
   Ecore_Wl2_Selection_Type sel_type;
} Ecore_Wl2_Event_Selection_Data_Ready;

/** @internal */
typedef struct _Ecore_Wl2_Event_Conformant_Change
{
   unsigned int win;
   Ecore_Wl2_Conformant_Part_Type part_type;
   Eina_Bool state;
} Ecore_Wl2_Event_Conformant_Change;

typedef struct _Ecore_Wl2_Event_Effect
{
   int win;
   unsigned int type;
} Ecore_Wl2_Event_Effect;

/** @internal */
typedef struct _Ecore_Wl2_Event_Effect Ecore_Wl2_Event_Effect_Start;
/** @internal */
typedef struct _Ecore_Wl2_Event_Effect Ecore_Wl2_Event_Effect_End;

/** @internal */
typedef struct _Ecore_Wl2_Event_Ignore_Output_Transform
{
   Ecore_Wl2_Window *win;
   Eina_Bool ignore;
} Ecore_Wl2_Event_Ignore_Output_Transform;

/** @internal */
typedef struct _Ecore_Wl2_Event_Indicator_Flick
{
   unsigned int win;
   int type;
} Ecore_Wl2_Event_Indicator_Flick;

/** @internal */
typedef struct _Ecore_Wl2_Event_Clipboard_Data_Selected
{
   unsigned int win;
} Ecore_Wl2_Event_Clipboard_Data_Selected;
//

/** @internal */
typedef struct _Ecore_Wl2_Keygrab_Info
{
   int key;
   int mode;
   int err;
} Ecore_Wl2_Keygrab_Info;

/** @internal */
typedef struct _Ecore_Wl2_Keyungrab_Info
{
   int key;
   int err;
} Ecore_Wl2_Keyungrab_Info;

/** @internal */
typedef struct _Ecore_Wl2_Surface_Interface
{
   int id;
   int version;

   void *(*setup)(Ecore_Wl2_Window *win);
   void (*destroy)(Ecore_Wl2_Surface *surface, void *priv_data);
   void (*reconfigure)(Ecore_Wl2_Surface *surface, void *priv_data, int w, int h, uint32_t flags, Eina_Bool alpha);
   void *(*data_get)(Ecore_Wl2_Surface *surface, void *priv_data, int *w, int *h);
   int  (*assign)(Ecore_Wl2_Surface *surface, void *priv_data);
   void (*post)(Ecore_Wl2_Surface *surface, void *priv_data, Eina_Rectangle *rects, unsigned int count);
   void (*flush)(Ecore_Wl2_Surface *surface, void *priv_data, Eina_Bool purge);
   void (*set_serial)(Ecore_Wl2_Surface *surface, void *priv_data, unsigned int serial);
} Ecore_Wl2_Surface_Interface;

/** @internal */
typedef void (*Ecore_Wl2_Bind_Cb)(struct wl_client *client, void *data, uint32_t version, uint32_t id);
/** @internal */
typedef void (*Ecore_Wl2_Unbind_Cb)(struct wl_resource *resource);

EAPI extern int ECORE_WL2_EVENT_DISCONNECT; /** @since 1.18 */
EAPI extern int ECORE_WL2_EVENT_CONNECT; /** @since 1.18 */
EAPI extern int ECORE_WL2_EVENT_GLOBAL_ADDED; /** @since 1.17 */
EAPI extern int ECORE_WL2_EVENT_GLOBAL_REMOVED; /** @since 1.17 */
EAPI extern int ECORE_WL2_EVENT_FOCUS_IN; /** @since 1.17 */
EAPI extern int ECORE_WL2_EVENT_FOCUS_OUT; /** @since 1.17 */
EAPI extern int ECORE_WL2_EVENT_DND_ENTER; /** @internal @since 1.17 */
EAPI extern int ECORE_WL2_EVENT_DND_LEAVE; /** @internal @since 1.17 */
EAPI extern int ECORE_WL2_EVENT_DND_MOTION; /** @internal @since 1.17 */
EAPI extern int ECORE_WL2_EVENT_DND_DROP; /** @internal @since 1.17 */
EAPI extern int ECORE_WL2_EVENT_DND_END; /** @internal @since 1.17 */
EAPI extern int ECORE_WL2_EVENT_DATA_SOURCE_END; /** @internal @since 1.18 */
EAPI extern int ECORE_WL2_EVENT_DATA_SOURCE_DROP; /** @internal @since 1.18 */
EAPI extern int ECORE_WL2_EVENT_DATA_SOURCE_ACTION; /** @internal @since 1.18 */
EAPI extern int ECORE_WL2_EVENT_DATA_SOURCE_TARGET; /** @internal @since 1.17 */
EAPI extern int ECORE_WL2_EVENT_DATA_SOURCE_SEND; /** @internal @since 1.17 */
EAPI extern int ECORE_WL2_EVENT_WINDOW_CONFIGURE; /** @since 1.17 */
EAPI extern int ECORE_WL2_EVENT_SYNC_DONE; /** @since 1.17 */
EAPI extern int ECORE_WL2_EVENT_OFFER_DATA_READY; /** @internal @since 1.19 */
EAPI extern int ECORE_WL2_EVENT_SEAT_NAME_CHANGED; /** @since 1.19 */
EAPI extern int ECORE_WL2_EVENT_SEAT_CAPABILITIES_CHANGED; /** @since 1.19 */
EAPI extern int ECORE_WL2_EVENT_DEVICE_ADDED; /** @since 1.19 */
EAPI extern int ECORE_WL2_EVENT_DEVICE_REMOVED; /** @since 1.19 */
EAPI extern int ECORE_WL2_EVENT_WINDOW_CONFIGURE_COMPLETE; /** @since 1.19 */
EAPI extern int ECORE_WL2_EVENT_SEAT_KEYMAP_CHANGED; /** @since 1.20 */
EAPI extern int ECORE_WL2_EVENT_SEAT_KEYBOARD_REPEAT_CHANGED; /** @since 1.20 */
EAPI extern int ECORE_WL2_EVENT_SEAT_SELECTION; /** @internal  @since 1.20 */
EAPI extern int ECORE_WL2_EVENT_OUTPUT_TRANSFORM; /** @since 1.20 */
EAPI extern int ECORE_WL2_EVENT_WINDOW_ROTATE; /** @since 1.20 */
EAPI extern int ECORE_WL2_EVENT_WINDOW_ROTATION_CHANGE_PREPARE; /** @since 1.20 */
EAPI extern int ECORE_WL2_EVENT_WINDOW_ROTATION_CHANGE_PREPARE_DONE; /** @since 1.20 */
EAPI extern int ECORE_WL2_EVENT_WINDOW_ROTATION_CHANGE_REQUEST; /** @since 1.20 */
EAPI extern int ECORE_WL2_EVENT_WINDOW_ROTATION_CHANGE_DONE; /** @since 1.20 */
EAPI extern int ECORE_WL2_EVENT_AUX_HINT_ALLOWED; /** @since 1.20 */
EAPI extern int ECORE_WL2_EVENT_AUX_HINT_SUPPORTED; /** @since 1.20 */
EAPI extern int ECORE_WL2_EVENT_AUX_MESSAGE; /** @since 1.20 */
EAPI extern int ECORE_WL2_EVENT_WINDOW_SHOW; /** @since 1.20 */
EAPI extern int ECORE_WL2_EVENT_WINDOW_HIDE; /** @since 1.20 */
EAPI extern int ECORE_WL2_EVENT_WINDOW_ACTIVATE; /** @since 1.20 */
EAPI extern int ECORE_WL2_EVENT_WINDOW_DEACTIVATE; /** @since 1.20 */
EAPI extern int ECORE_WL2_EVENT_WINDOW_ICONIFY_STATE_CHANGE; /** @since 1.21 */
EAPI extern int ECORE_WL2_EVENT_WINDOW_OFFSCREEN; /** @since 1.21 */
EAPI extern int ECORE_WL2_EVENT_WINDOW_CREATE; /** @since 1.25 */
EAPI extern int ECORE_WL2_EVENT_WINDOW_DESTROY; /** @since 1.25 */
// TIZEN_ONLY(20171107): added wl events from ecore_wayland to ecore_wl2
EAPI extern int ECORE_WL2_EVENT_WINDOW_VISIBILITY_CHANGE;
EAPI extern int ECORE_WL2_EVENT_WINDOW_PRE_VISIBILITY_CHANGE;
EAPI extern int ECORE_WL2_EVENT_WINDOW_LOWER;
EAPI extern int ECORE_WL2_EVENT_WINDOW_REDRAW_REQUEST;
EAPI extern int ECORE_WL2_EVENT_DND_POSITION; /** @internal */
EAPI extern int ECORE_WL2_EVENT_DND_OFFER; /** @internal @since 1.8, but NOT exist currenly */
EAPI extern int ECORE_WL2_EVENT_DATA_SOURCE_CANCELLED; /** @internal @since 1.7, but NOT exist currenly */
EAPI extern int ECORE_WL2_EVENT_SELECTION_DATA_READY; /** @internal @since 1.7, but NOT exist currenly */
EAPI extern int ECORE_WL2_EVENT_CONFORMANT_CHANGE;
EAPI extern int ECORE_WL2_EVENT_EFFECT_START;
EAPI extern int ECORE_WL2_EVENT_EFFECT_END;
EAPI extern int ECORE_WL2_EVENT_IGNORE_OUTPUT_TRANSFORM;
EAPI extern int ECORE_WL2_EVENT_INDICATOR_FLICK; /** @internal */
EAPI extern int ECORE_WL2_EVENT_CLIPBOARD_DATA_SELECTED; /** @internal */
//

/**
 * @defgroup Ecore_Wl2_Init_Group Wayland Library Init and Shutdown Functions
 * @ingroup Ecore_Wl2_Group
 *
 * Functions that start and shutdown the Ecore Wl2 Library.
 */

/**
 * @brief Initialize the Ecore_Wl2 library
 *
 * @return  The number of times the library has been initialized without being
 *          shutdown. 0 is returned if an error occurs.
 *
 * @ingroup Ecore_Wl2_Init_Group
 * @since 1.17
 */
EAPI int ecore_wl2_init(void);

/**
 * @brief Shutdown the Ecore_Wl2 Library
 *
 * In shutting down the library, the Wayland display connection is terminated
 * and any event handlers for it are removed
 *
 * @return  The number of times the library has been initialized without
 *          being shutdown.
 *
 * @ingroup Ecore_Wl2_Init_Group
 * @since 1.17
 */
EAPI int ecore_wl2_shutdown(void);

/**
 * @defgroup Ecore_Wl2_Display_Group Wayland Library Display Functions
 * @ingroup Ecore_Wl2_Group
 *
 * Functions that deal with creating, connecting, or interacting with
 * Wayland displays
 */

/**
 * @brief Connect to an existing Wayland display
 *
 * This function is typically used by clients to connect to an
 * existing Wayland display.
 *
 * @param name The display target name to connect to. If @c NULL, the default
 *             display is assumed.
 *
 * @return The Ecore_Wl2_Display which was connected to
 *
 * @ingroup Ecore_Wl2_Display_Group
 * @since 1.17
 */
EAPI Ecore_Wl2_Display *ecore_wl2_display_connect(const char *name);

/**
 * @brief Disconnect an existing Wayland display
 *
 * This function is typically used by clients to disconnect from an
 * existing Wayland display.
 *
 * @param display The display to disconnect from
 *
 * @ingroup Ecore_Wl2_Display_Group
 * @since 1.17
 */
EAPI void ecore_wl2_display_disconnect(Ecore_Wl2_Display *display);

// TIZEN_ONLY(20190807): Retrieve the existing native wayland display
/**
 * @brief Retrieve the existing native wayland display
 *
 * @note The native wl_display struct is not included in the managed API list
 *       and is provided as a void pointer
 *       if the user needs to call a specific module function using that struct
 *
 * @param display The Ecore_Wl2_Display for which to retrieve the existing
 *                Wayland display from
 *
 * @return The wl_display which this Ecore_Wl2_Display is using
 *         It provided as void type
 *
 * @ingroup Ecore_Wl2_Display_Group
 */
EAPI void *ecore_wl2_display_native_get(Ecore_Wl2_Display *display);
//

/**
 * @brief Retrieves the size of the current screen.
 *
 * @param display The display to get the screen size of
 * @param w where to return the width. May be NULL. Returns 0 on error.
 * @param h where to return the height. May be NULL. Returns 0 on error.
 *
 * @ingroup Ecore_Wl2_Display_Group
 * @since 1.17
 */
EAPI void ecore_wl2_display_screen_size_get(Ecore_Wl2_Display *display, int *w, int *h);

/**
 * @brief Find an Ecore_Wl2_Window based on id
 *
 * @param display The display to search for the window
 * @param id The id of the window to find
 *
 * @return The Ecore_Wl2_Window if found, or NULL if no such window exists
 *
 * @ingroup Ecore_Wl2_Display_Group
 * @since 1.17
 */
EAPI Ecore_Wl2_Window *ecore_wl2_display_window_find(Ecore_Wl2_Display *display, unsigned int id);

/**
 * @brief Gets the connected display object
 *
 * This function is typically used by clients to get an
 * existing Wayland display.
 *
 * @param name The display target name. If @c NULL, the default
 *        display is assumed.
 *
 * @return The Ecore_Wl2_Display which was connected to
 *
 * @ingroup Ecore_Wl2_Display_Group
 * @since 1.24
 */
EAPI Ecore_Wl2_Display *ecore_wl2_connected_display_get(const char *name);

/**
 * @brief Push buffered wayland protocol to compositor
 *
 * Wayland protocol is only actually sent when a flush occurs,
 * so the display should be flushed at appropriate times, such
 * as after a commit.
 *
 * @param display The display to flush
 *
 * @ingroup Ecore_Wl2_Display_Group
 * @since 1.21
 */
EAPI void ecore_wl2_display_flush(Ecore_Wl2_Display *display);

// TIZEN_ONLY(20171107): support a tizen_keyrouter interface
/**
 * @brief The sync request asks the connected display server.
 *
 * Since requests are handled in-order and events are delivered in-order.
 *
 * @param display The display to sync
 *
 * @ingroup Ecore_Wl2_Display_Group
 */
EAPI void ecore_wl2_display_sync(Ecore_Wl2_Display *display);
//

/**
 * @internal
 *
 * Create a new Wayland display
 *
 * @brief This function is typically used to create a new display for
 * use with compositors, or to create a new display for use in nested
 * compositors.
 *
 * @param name The display target name to create. If @c NULL, a default
 *             display name will be assigned.
 * @return The newly created Ecore_Wl2_Display
 *
 * @ingroup Ecore_Wl2_Display_Group
 * @since 1.17
 */
EAPI Ecore_Wl2_Display *ecore_wl2_display_create(const char *name);

/**
 * @internal
 *
 * Destroy an existing Wayland display
 *
 * @brief This function is typically used by servers to terminate an
 * existing Wayland display.
 *
 * @param display The display to terminate
 *
 * @ingroup Ecore_Wl2_Display_Group
 * @since 1.17
 */
EAPI void ecore_wl2_display_destroy(Ecore_Wl2_Display *display);

/**
 * @internal
 *
 * Terminate a Wayland display's main loop
 *
 * @brief This function is typically used by servers to terminate the
 * Wayland display main loop. This is usually only called when a server
 * encounters an error.
 *
 * @param display The Ecore_Wl2_Display to terminate
 *
 * @ingroup Ecore_Wl2_Display_Group
 * @since 1.17
 */
EAPI void ecore_wl2_display_terminate(Ecore_Wl2_Display *display);

/**
 * @internal
 *
 * Retrieve the existing Wayland display
 *
 * @param display The Ecore_Wl2_Display for which to retrieve the existing
 *                Wayland display from
 *
 * @return The wl_display which this Ecore_Wl2_Display is using
 *
 * @ingroup Ecore_Wl2_Display_Group
 * @since 1.17
 */
EAPI struct wl_display *ecore_wl2_display_get(Ecore_Wl2_Display *display);

/**
 * @internal
 *
 * Retrieve the wl_shm from a given Ecore_Wl2_Display
 *
 * @param display The Ecore_Wl2_Display for which to retrieve the existing
 *                Wayland shm interface from
 *
 * @return The wl_shm which this Ecore_Wl2_Display is using
 *
 * @ingroup Ecore_Wl2_Display_Group
 * @since 1.17
 */
EAPI struct wl_shm *ecore_wl2_display_shm_get(Ecore_Wl2_Display *display);

/**
 * @internal
 *
 * Retrieve the wl_dmabuf from a given Ecore_Wl2_Display
 *
 *
 * @param display The Ecore_Wl2_Display for which to retrieve the existing
 *                Wayland dmabuf interface from
 *
 * @return The wl_dmabuf which this Ecore_Wl2_Display is using
 *
 * @ingroup Ecore_Wl2_Display_Group
 *
 * @note This is intended for client use only and should be used only
 *       after ecore_wl2_display_connect().  Also, the return type is
 *       void * instead of zpw_linux_dmabuf_v1 * since we don't want
 *       to change our public API every time the version changes in
 *       wayland-protocols.
 *
 * @since 1.18
 */
EAPI void *ecore_wl2_display_dmabuf_get(Ecore_Wl2_Display *display);

/**
 * @internal
 *
 * Return an Eina_Iterator that can be used to iterate through globals
 *
 * @param display The Ecore_Wl2_Display for which to return a global iterator
 *
 * @note The caller of this function should free the returned Eina_Iterator
 * when finished with it.
 *
 * @ingroup Ecore_Wl2_Display_Group
 * @since 1.17
 */
EAPI Eina_Iterator *ecore_wl2_display_globals_get(Ecore_Wl2_Display *display);

/**
 * @internal
 *
 * Get all the Ecore_Wl2_Input from the display.
 *
 * @param display The display
 *
 * @return A Eina_Iterator of Ecore_Wl2_Input or @c NULL on error
 *
 * @ingroup Ecore_Wl2_Display_Group
 * @since 1.19
 */
EAPI Eina_Iterator *ecore_wl2_display_inputs_get(Ecore_Wl2_Display *display);

/**
 * @internal
 *
 * Find a seat for a given display object using the seat id
 *
 * @param display The display
 * @param id The seat id
 *
 * @return The corresponding Ecore_Wl2_Input object or @c NULL if no match is found
 *
 * @ingroup Ecore_Wl2_Display_Group
 * @since 1.20
 */
EAPI Ecore_Wl2_Input *ecore_wl2_display_input_find(const Ecore_Wl2_Display *display, unsigned int id);

/**
 * @internal
 *
 * Find a seat for a given display object using the seat id
 *
 * @param display The display
 * @param name The seat name
 *
 * @return The corresponding Ecore_Wl2_Input object or @c NULL if no match is found
 *
 * @ingroup Ecore_Wl2_Display_Group
 * @since 1.20
 */
EAPI Ecore_Wl2_Input *ecore_wl2_display_input_find_by_name(const Ecore_Wl2_Display *display, const char *name);

/**
 * @internal
 *
 * Retrieves the Wayland Registry used for the current Wayland display.
 *
 * @param display The display to get the registry of
 *
 * @return The current wayland registry, or NULL on error
 *
 * @ingroup Ecore_Wl2_Display_Group
 * @since 1.17
 */
EAPI struct wl_registry *ecore_wl2_display_registry_get(Ecore_Wl2_Display *display);

/**
 * @internal
 *
 * Check if the display has performed a sync
 *
 * @param display The display
 *
 * @return True if the display sync has occurred
 * @see ECORE_WL2_EVENT_SYNC_DONE
 *
 * @ingroup Ecore_Wl2_Display_Group
 * @since 1.20
 */
EAPI Eina_Bool ecore_wl2_display_sync_is_done(const Ecore_Wl2_Display *display);

/**
 * @internal
 *
 * Get the name of the display object
 *
 * @param display The display
 *
 * @return The name of the display object
 *
 * @ingroup Ecore_Wl2_Display_Group
 * @since 1.20
 */
EAPI const char *ecore_wl2_display_name_get(const Ecore_Wl2_Display *display);

/**
 * @internal
 *
 * Finds an Ecore_Wl2_Window based on wl_surface
 *
 * @param display The display to search for the window
 * @param surface The wl_surface of the window to find
 *
 * @return The Ecore_Wl2_Window if found, or NULL if no such window exists
 *
 * @ingroup Ecore_Wl2_Display_Group
 * @since 1.24
 */
EAPI Ecore_Wl2_Window *ecore_wl2_display_window_find_by_surface(Ecore_Wl2_Display *display, struct wl_surface *surface);

/**
 * @internal
 *
 * Gets the wl_compositor which belongs to this display
 *
 * @param display The Ecore_Wl2_Display to get the compositor of
 *
 * @return The wl_compositor associated with this display
 *
 * @ingroup Ecore_Wl2_Display_Group
 * @since 1.24
 */
EAPI struct wl_compositor *ecore_wl2_display_compositor_get(Ecore_Wl2_Display *display);

/**
 * @internal
 *
 * Return the version of the display's compositor object
 *
 * @param disp the display to get the compositor object version from
 *
 * @return the version of the display's compositor object
 *
 * @ingroup Ecore_Wl2_Display_Group
 * @since 1.17
 */
EAPI int ecore_wl2_display_compositor_version_get(Ecore_Wl2_Display *disp);

/**
 * @defgroup Ecore_Wl2_Window_Group Wayland Library Window Functions
 * @ingroup Ecore_Wl2_Group
 *
 * Functions that deal with creating, destroying, or interacting with
 * Wayland windows
 */

/**
 * @brief Create a new Ecore_Wl2_Window
 *
 * @param display The Ecore_Wl2_Display on which to create this new window
 * @param parent The Ecore_Wl2_Window which is the parent of this window
 * @param x Initial x position of window
 * @param y Initial y position of window
 * @param w Initial width of window
 * @param h Initial height of window
 *
 * @return The Ecore_Wl2_Window that newly creating, or NULL failure
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.17
 */
EAPI Ecore_Wl2_Window *ecore_wl2_window_new(Ecore_Wl2_Display *display, Ecore_Wl2_Window *parent, int x, int y, int w, int h);

/**
 * @brief Get the window id associated with an Ecore_Wl2_Window
 *
 * @param window The Ecore_Wl2_Window of which to retrieve the window id
 *
 * @return The id associated with this window
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.17
 */
EAPI int ecore_wl2_window_id_get(Ecore_Wl2_Window *window);

/**
 * @brief Show a given Ecore_Wl2_Window
 *
 * @param window The Ecore_Wl2_Window to show
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.17
 */
EAPI void ecore_wl2_window_show(Ecore_Wl2_Window *window);

/**
 * @brief Hide a given Ecore_Wl2_Window
 *
 * @param window The Ecore_Wl2_Window to hide
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.17
 */
EAPI void ecore_wl2_window_hide(Ecore_Wl2_Window *window);

/**
 * @brief Free a given Ecore_Wl2_Window
 *
 * @param window The Ecore_Wl2_Window to free
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.17
 */
EAPI void ecore_wl2_window_free(Ecore_Wl2_Window *window);

/**
 * @brief Raise a given Ecore_Wl2_Window
 *
 * @param window The Ecore_Wl2_Window which to raise
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.17
 */
EAPI void ecore_wl2_window_raise(Ecore_Wl2_Window *window);

// TIZEN_ONLY(20171108): tizen window function
/**
 * @brief Lower the target window
 *
 * @note This API call causes the ECORE_WL2_EVENT_WINDOW_LOWER event
 *
 * @param window The target window
 *
 * @ingroup Ecore_Wl2_Window_Group
 */
EAPI void ecore_wl2_window_lower(Ecore_Wl2_Window *window);

/**
 * @brief Activate the target window
 *
 * @param window The target window
 *
 * @ingroup Ecore_Wl2_Window_Group
 */
EAPI void ecore_wl2_window_activate(Ecore_Wl2_Window *window);
//

/**
 * @brief Attach a buffer to a window
 *
 * Note that the GL stack my attach buffers to a surface - we should call this
 * function at that time (with a NULL buffer) to track whether a surface
 * has a valid buffer.  That is, call with implicit true and buffer NULL at
 * the time of glSwapBuffers.
 *
 * @param window The target window
 * @param buffer The buffer to attach
 * @param x X offset from corner
 * @param y Y offset from corner
 * @param implicit True if an external library is doing the actual attaching
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.21
 */
EAPI void ecore_wl2_window_buffer_attach(Ecore_Wl2_Window *win, void *buffer, int x, int y, Eina_Bool implicit);

/**
 * @brief Specifies the area of the window's surface that needs updating
 *        internally calling wl_surface_damage
 *
 * @param window The target window
 * @param rects The rect area that will cause damage
 * @param count The number of rects
 *
 * @ingroup Ecore_Wl2_Window_Group
 */
EAPI void ecore_wl2_window_damage(Ecore_Wl2_Window *window, Eina_Rectangle *rects, unsigned int count);

/**
 * @brief Get if a given window is alpha
 *
 * @param window The window to get if is alpha
 *
 * @return EINA_TRUE if window is alpha, EINA_FALSE otherwise
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.17
 */
EAPI Eina_Bool ecore_wl2_window_alpha_get(Ecore_Wl2_Window *window);

/**
 * @brief Set a given window's alpha property
 *
 * @param window The window on which to set the alpha property
 * @param alpha EINA_TRUE to set window as alpha, EINA_FALSE otherwise
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.17
 */
EAPI void ecore_wl2_window_alpha_set(Ecore_Wl2_Window *window, Eina_Bool alpha);

/**
 * @brief Set the title of a given window
 *
 * @param window The window to set the title of
 * @param title The title of the window
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.17
 */
EAPI void ecore_wl2_window_title_set(Ecore_Wl2_Window *window, const char *title);

/**
 * @brief Get the title of a given window
 *
 * @param window The window to set the title of
 *
 * @return A string if found, or NULL otherwise
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.24
 */
EAPI const char *ecore_wl2_window_title_get(Ecore_Wl2_Window *window);

/**
 * @brief Get which display a given window is using
 *
 * @param window The window to get the display of
 *
 * @return The Ecore_Wl2_Display that this window is using, or NULL otherwise
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.17
 */
EAPI Ecore_Wl2_Display *ecore_wl2_window_display_get(const Ecore_Wl2_Window *window);

/**
 * @brief Set if this window should ignore focus requests
 *
 * @param window The window to set ignore focus requests on
 * @param focus_skip EINA_TRUE if this window should skip focus requests, EINA_FALSE otherwise
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.20
 */
EAPI void ecore_wl2_window_focus_skip_set(Ecore_Wl2_Window *window, Eina_Bool focus_skip);

/**
 * @brief Get if this window ignores focus requests
 *
 * @param window The window to get the focus skip value from
 *
 * @return EINA_TRUE if a window should skip focus requests, EINA_FALSE otherwise
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.20
 */
EAPI Eina_Bool ecore_wl2_window_focus_skip_get(Ecore_Wl2_Window *window);

//TIZEN_ONLY: ecore_wl2: add ecore_wl_window_video_has
/**
 * @brief Register the tizen protocol to provide video through the window's surface.
 *
 * @param window The target window
 * @param has EINA_TRUE to set window has video, EINA_FALSE otherwise
 *
 * @ingroup Ecore_Wl2_Window_Group
 */
EAPI void ecore_wl2_window_video_has(Ecore_Wl2_Window *window, Eina_Bool has);
//

/**
 * @brief Commit the surface of a wayland window.
 *
 * If flush is set this generates a wl_surface_commit(), otherwise it is
 * expected that some other call in the very near future (such as
 * eglSwapBuffers) will cause an implicit flush.
 *
 * A surface that has been commit will be in the "pending" state until
 * the compositor tells us it's time to draw again via a frame callback.
 *
 * @param window The window whose surface we want to commit
 * @param flush EINA_TRUE if we need to flush immediately.
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.21
 */
EAPI void ecore_wl2_window_commit(Ecore_Wl2_Window *window, Eina_Bool flush);

/**
 * @brief Add a callback that fires when the window's surface_frame callback fires
 *
 * @param window The window to add a callback on
 * @param cb The callback
 * @param data User data to provide to the callback handler
 *
 * @return The Ecore_Wl2_Frame_Cb_Handle
 *
 * @see ecore_wl2_window_frame_callback_del
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.21
 */
EAPI Ecore_Wl2_Frame_Cb_Handle *ecore_wl2_window_frame_callback_add(Ecore_Wl2_Window *window, Ecore_Wl2_Frame_Cb cb, void *data);

/**
 * @brief Delete a callback that fires when the window's surface_frame callback fires
 *
 * @param handle The callback handle obtained through ecore_wl2_window_frame_callback_add().
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.21
 */
EAPI void ecore_wl2_window_frame_callback_del(Ecore_Wl2_Frame_Cb_Handle *handle);

// TIZEN_ONLY(20171107): support a tizen_keyrouter interface
/**
 * @platform
 * @brief Sets keygrab value of the window
 * @warning third-party application can use ECORE_WL2_WINDOW_KEYGRAB_TOPMOST mode
 *          without keygrab privilege.
 *          don't use other modes. those are not for third-party application.
 *
 * This function grabs the @c key of window using @c grab_mode
 *
 * @privlevel platform
 * @privilege http://tizen.org/privilege/keygrab
 *
 * @param win The target Ecore_Wl2_Window
 * @param key The string is the keyname to grab
 * @param mod A combination of modifier keys that must be present to
 *              trigger the event. Not supported yet
 * @param not_mod A combination of modifier keys that must not be
 *                present to trigger the event. Not supported yet
 * @param priority Not supported yet
 * @param grab_mode Describes how the key should be grabbed, wrt. focus and
 *                  stacking
 *
 * @return @c true on success, @c false otherwise
 *
 * @exception #TIZEN_ERROR_NONE Successfully set
 * @exception #TIZEN_ERROR_INVALID_PARAMETER Invalid parameter has given
 * @exception #TIZEN_ERROR_ALREADY_IN_PROGRESS The key already has been grabbed
 * @exception #TIZEN_ERROR_PERMISSION_DENIED Privilege permission denied
 *
 * @ingroup Ecore_Wl2_Window_Group
 */
EAPI Eina_Bool ecore_wl2_window_keygrab_set(Ecore_Wl2_Window *win, const char *key, int mod EINA_UNUSED, int not_mod EINA_UNUSED, int priority EINA_UNUSED, Ecore_Wl2_Window_Keygrab_Mode grab_mode);

/**
 * @platform
 * @brief Unsets keygrab value of the window
 * @warning third-party application can use ECORE_WL2_WINDOW_KEYGRAB_TOPMOST mode
 *          without keygrab privilege.
 *          don't use other modes. those are not for third-party application.
 *
 * This function unset keygrab value. Ungrab @c key of window.
 *
 * @privlevel platform
 * @privilege http://tizen.org/privilege/keygrab
 *
 * @param win The target Ecore_Wl2_Window
 * @param key The string is the keyname to grab
 * @param mod A combination of modifier keys that must be present to
 *              trigger the event. Not supported yet
 * @param not_mod A combination of modifier keys that must not be
 *                present to trigger the event. Not supported yet
 *
 * @return @c true on success, @c false otherwise
 *
 * @exception #TIZEN_ERROR_NONE Successfully set
 * @exception #TIZEN_ERROR_INVALID_PARAMETER Invalid parameter has given
 * @exception #TIZEN_ERROR_ALREADY_IN_PROGRESS The key already has been grabbed
 * @exception #TIZEN_ERROR_PERMISSION_DENIED Privilege permission denied
 *
 * @ingroup Ecore_Wl2_Window_Group
 */
EAPI Eina_Bool ecore_wl2_window_keygrab_unset(Ecore_Wl2_Window *win, const char *key, int mod EINA_UNUSED, int any_mod EINA_UNUSED);

/**
 * @platform
 * @brief Sets keygrab values of the window.
 * @warning third-party application can use ECORE_WL2_WINDOW_KEYGRAB_TOPMOST mode
 *          without keygrab privilege.
 *          don't use other modes. those are not for third-party application.
 *
 * The returned list should be freed with @c eina_list_free() when you no
 * longer need it.
 *
 * @privlevel platform
 * @privilege http://tizen.org/privilege/keygrab
 * @param win The window
 * @param infos The list of keys and grab modes for setting keygrab
 *
 * @return NULL, or the list of keys being failed keygrab set.
 *
 * @exception #TIZEN_ERROR_NONE Successfully set
 * @exception #TIZEN_ERROR_INVALID_PARAMETER Invalid parameter has given
 * @exception #TIZEN_ERROR_PERMISSION_DENIED Privilege permission denied
 *
 * @Example
 *
 * Ecore_Wl2_Window_Keygrab_Info *info = malloc(sizeof(Ecore_Wl2_Window_Keygrab_Info));
 * info->key = "XF86AudioLowerVolume";
 * info->mode = ECORE_WL2_WINDOW_KEYGRAB_TOPMOST;
 * infos = eina_list_append(infos, info);
 *
 * ecore_wl2_window_keygrab_list_set(win, infos);
 *
 * @ingroup Ecore_Wl2_Window_Group
 */
EAPI Eina_List *ecore_wl2_window_keygrab_list_set(Ecore_Wl2_Window *win, Eina_List *infos);

/**
 * @platform
 * @brief Unsets keygrab values of the window.
 * @warning third-party application can use ECORE_WL2_WINDOW_KEYGRAB_TOPMOST mode
 *          without keygrab privilege.
 *          don't use other modes. those are not for third-party application.
 *
 * The returned list should be freed with @c eina_list_free() when you no
 * longer need it.
 *
 * @privlevel platform
 * @privilege http://tizen.org/privilege/keygrab
 *
 * @param win The window
 * @param infos The list of infos for unsetting keygrab
 *
 * @return NULL, or the list of keys being failed keygrab unset.
 *
 * @exception #TIZEN_ERROR_NONE Successfully set
 * @exception #TIZEN_ERROR_INVALID_PARAMETER Invalid parameter has given
 * @exception #TIZEN_ERROR_PERMISSION_DENIED Privilege permission denied
 *
 * @Example
 *
 * Ecore_Wl2_Window_Keygrab_Info *info = malloc(sizeof(Ecore_Wl2_Window_Keygrab_Info));
 * info->key = "XF86AudioLowerVolume";
 * infos = eina_list_append(infos, info);
 *
 * ecore_wl2_window_keygrab_list_unset(win, infos);
 *
 * @ingroup Ecore_Wl2_Window_Group
 */
EAPI Eina_List *ecore_wl2_window_keygrab_list_unset(Ecore_Wl2_Window *win, Eina_List *infos);
//

// TIZEN_ONLY(20190807): Support for wl_egl interface
/**
 * @brief Creates wl_egl_window
 *
 * Create wl_egl_window through the connected wl_surface of ecore_wl2_window.
 *
 * @param window The Ecore_Wl2_Window
 * @param w The width of wl_egl_window
 * @param h The height of wl_egl_window
 *
 * @return The newly created Ecore_Wl2_Egl_Window
 *
 * @ingroup Ecore_Wl2_Window_Group
 */
EAPI Ecore_Wl2_Egl_Window *ecore_wl2_egl_window_create(Ecore_Wl2_Window *window, int w, int h);
/**
 * @brief Destroy a given Ecore_Wl2_Egl_Window
 *
 * @param egl_win The Ecore_Wl2_Egl_Window to destroy
 *
 * @ingroup Ecore_Wl2_Window_Group
 */
EAPI void                  ecore_wl2_egl_window_destroy(Ecore_Wl2_Egl_Window *egl_win);
/**
 * @brief Gets the wl_egl_window that this ecore_wl2_egl_window is using.
 *
 * Cast the wl_egl_window struct pointer not included in the Managed API to void pointer
 * This pointer can be used as an argument to the function passed to wl_egl_window.
 *
 * @param egl_win The Ecore_Wl2_Egl_Window
 *
 * @return The wl_egl_window, it provided as void type
 *
 * @ingroup Ecore_Wl2_Window_Group
 */
EAPI void                 *ecore_wl2_egl_window_native_get(Ecore_Wl2_Egl_Window *egl_win);
/**
 * @brief Ecore_Wl2_Egl_Window resize with rotation
 *
 * @param egl_win The Ecore_Wl2_Egl_Window
 * @param dx The x coord resize
 * @param dy The y coord resize
 * @param w The width of Ecore_Wl2_Egl_Window
 * @param h The height of Ecore_Wl2_Egl_Window
 * @param rotation The angle of rotation
 *
 * @ingroup Ecore_Wl2_Window_Group
 */
EAPI void                  ecore_wl2_egl_window_resize_with_rotation(Ecore_Wl2_Egl_Window *egl_win, int dx, int dy, int w, int h, int rotation);
//

//TIZEN_ONLY(20200309): The 3rd party app may needs native surface handle.
/**
 * @brief Get the native surface(wl_surface) which belongs to this window
 *
 * @note The native wl_surface struct is not included in the managed API list
 *       and is provided as a void pointer
 *
 * @param window The Ecore_Wl2_Window to get the surface of
 *
 * @return The wl_surface associated with this window
 *         It provided as void type
 *
 * @ingroup Ecore_Wl2_Window_Group
 */
EAPI void *ecore_wl2_window_native_surface_get(Ecore_Wl2_Window *window);
//

/**
 * @internal
 *
 * Set a callback to be caleld just before the window is closed and freed
 *
 * @param window The window to listen to for a xdg toplevel close callback
 * @param cb The callback function to call being passed data and window
 * @param data The Data pointer to pass as data to the callback
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.24
 */
EAPI void ecore_wl2_window_close_callback_set(Ecore_Wl2_Window *window, void (*cb) (void *data, Ecore_Wl2_Window *win), void *data);

/**
 * @internal
 *
 * Get the wl_surface which belongs to this window
 *
 * @param window The Ecore_Wl2_Window to get the surface of
 *
 * @return The wl_surface associated with this window.
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.17
 */
EAPI struct wl_surface *ecore_wl2_window_surface_get(Ecore_Wl2_Window *window);

/**
 * @internal
 *
 * Get the id of a given Ecore_Wl2_Window
 *
 * @param window The window to return the id of
 *
 * @return The id of the given window, or -1 on failure
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.17
 */
EAPI int ecore_wl2_window_surface_id_get(Ecore_Wl2_Window *window);

/**
 * @internal
 *
 * @see evas_object_size_hint_aspect_set
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.21
 */
EAPI void ecore_wl2_window_aspect_set(Ecore_Wl2_Window *window, int w, int h, unsigned int aspect);

/**
 * @internal
 *
 * @see evas_object_size_hint_aspect_get
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.24
 */
EAPI void ecore_wl2_window_aspect_get(Ecore_Wl2_Window *window, int *w, int *h, unsigned int *aspect);

/**
 * @internal
 *
 * @brief Begin moving a given Ecore_Wl2_Window
 *
 * @param window The Ecore_Wl2_Window which to move
 * @param input The seat on which the move is active on
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.20
 */
EAPI void ecore_wl2_window_move(Ecore_Wl2_Window *window, Ecore_Wl2_Input *input);

/**
 * @internal
 *
 * @brief Begin resizing a given window
 *
 * @param window The Ecore_Wl2_Window which to resize
 * @param input The seat on which the resize is active
 * @param location The edge of the window from which the resize should start
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.20
 */
EAPI void ecore_wl2_window_resize(Ecore_Wl2_Window *window, Ecore_Wl2_Input *input, int location);

// TIZEN_ONLY(20171108): tizen window function
/** @internal */
EAPI void ecore_wl2_window_parent_set(Ecore_Wl2_Window *window, Ecore_Wl2_Window *parent);
/** @internal */
EAPI void ecore_wl2_window_stack_mode_set(Ecore_Wl2_Window *window, Ecore_Wl2_Window_Stack_Mode mode);
/** @internal */
EAPI void ecore_wl2_window_position_set(Ecore_Wl2_Window *window, int x, int y);
/** @internal */
EAPI int ecore_wl2_window_active_angle_get(Ecore_Wl2_Window *window);
//

//TIZEN_ONLY(20171216): add ecore_wl2_window_find
/** @internal */
EAPI Ecore_Wl2_Window *ecore_wl2_window_find(unsigned int id);
//

/**
 * @internal
 *
 * Set a given window's transparent property
 *
 * @param window The window on which to set the transparent property
 * @param transparent EINA_TRUE to set window as transparent,
 *                    EINA_FALSE otherwise
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.17
 */
EAPI void ecore_wl2_window_transparent_set(Ecore_Wl2_Window *window, Eina_Bool transparent);

// TIZEN_ONLY(20171108) : Get a window's transparent property
/** @internal */
EAPI Eina_Bool ecore_wl2_window_transparent_get(Ecore_Wl2_Window *window);
//

/**
 * @internal
 *
 * Set the opaque region of the Ecore_Wl2_Window
 *
 * @param window The window
 * @param x The left point of the region.
 * @param y The top point of the region.
 * @param w The width of the region.
 * @param h The height of the region.
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.17
 */
EAPI void ecore_wl2_window_opaque_region_set(Ecore_Wl2_Window *window, int x, int y, int w, int h);

// TIZEN_ONLY(20160201) : support to handle input rectangle
/** @internal */
EAPI void ecore_wl2_window_input_rect_set(Ecore_Wl2_Window *win, Eina_Rectangle *input_rect);
/** @internal */
EAPI void ecore_wl2_window_input_rect_add(Ecore_Wl2_Window *win, Eina_Rectangle *input_rect);
/** @internal */
EAPI void ecore_wl2_window_input_rect_subtract(Ecore_Wl2_Window *win, Eina_Rectangle *input_rect);
//

/**
 * @internal
 *
 * Get the opaque region of the Ecore_Wl2_Window
 *
 * @param window The window
 * @param x The left point of the region.
 * @param y The top point of the region.
 * @param w The width of the region.
 * @param h The height of the region.
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.24
 */
EAPI void ecore_wl2_window_opaque_region_get(Ecore_Wl2_Window *window, int *x, int *y, int *w, int *h);

/**
 * @internal
 *
 * Set the input region of the Ecore_Wl2_Window.
 *
 * To set an empty region, pass width and height as 0.
 *
 * An empty input region means the entire window surface will accept input.
 *
 * @param window The window to set the input region of
 * @param x The left point of the region.
 * @param y The top point of the region.
 * @param w The width of the region.
 * @param h The height of the region.
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.17
 */
EAPI void ecore_wl2_window_input_region_set(Ecore_Wl2_Window *window, int x, int y, int w, int h);

/**
 * @internal
 *
 * Get the input region of the Ecore_Wl2_Window.
 *
 * @param window The window to set the input region of
 * @param x The left point of the region.
 * @param y The top point of the region.
 * @param w The width of the region.
 * @param h The height of the region.
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.24
 */
EAPI void ecore_wl2_window_input_region_get(Ecore_Wl2_Window *window, int *x, int *y, int *w, int *h);

/**
 * @internal
 *
 * Get if a given window is maximized
 *
 * @param window The window to get the maximized state of
 *
 * @return EINA_TRUE if window is maximized, EINA_FALSE otherwise
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.17
 */
EAPI Eina_Bool ecore_wl2_window_maximized_get(Ecore_Wl2_Window *window);

/**
 * @internal
 *
 * Set the maximized state of a given window
 *
 * @param window The window to set the maximized state of
 * @param maximized EINA_TRUE to set maximized, EINA_FALSE to unset
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.17
 */
EAPI void ecore_wl2_window_maximized_set(Ecore_Wl2_Window *window, Eina_Bool maximized);

/**
 * @internal
 *
 * Get if a given window is fullscreen
 *
 * @param window The window to get the fullscreen state of
 *
 * @return EINA_TRUE if window is fullscreen, EINA_FALSE otherwise
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.17
 */
EAPI Eina_Bool ecore_wl2_window_fullscreen_get(Ecore_Wl2_Window *window);

/**
 * @internal
 *
 * Set the fullscreen state of a given window
 *
 * @param window The window to set the fullscreen state of
 * @param fullscreen EINA_TRUE to set fullscreen, EINA_FALSE to unset
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.17
 */
EAPI void ecore_wl2_window_fullscreen_set(Ecore_Wl2_Window *window, Eina_Bool fullscreen);

/**
 * @internal
 *
 * Get if a given window is rotated
 *
 * @param window The window to get the rotation of
 *
 * @return The amount of rotation for this window, or -1 on failure
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.17
 */
EAPI int ecore_wl2_window_rotation_get(Ecore_Wl2_Window *window);

/**
 * @internal
 *
 * Set the rotation of a given window
 *
 * @param window The window to set the rotation of
 * @param rotation The amount of rotation
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.17
 */
EAPI void ecore_wl2_window_rotation_set(Ecore_Wl2_Window *window, int rotation);

/**
 * @internal
 *
 * Set the class of a given window
 *
 * @param window The window to set the class of
 * @param clas The class of the window
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.17
 */
EAPI void ecore_wl2_window_class_set(Ecore_Wl2_Window *window, const char *clas);

/**
 * @internal
 *
 * Get the class of a given window
 *
 * @param window The window to set the class of
 *
 * @return A string if found, or NULL otherwise
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.24
 */
EAPI const char *ecore_wl2_window_class_get(Ecore_Wl2_Window *window);

/**
 * @internal
 *
 * Get the geometry of a given window
 *
 * @brief The window geometry returned here is the window geometry as
 * recognized by xdg_surface_set_window_geometry. As such, it represents the
 * "visible bounds" of a window from the user's perspective.
 *
 * @param window The window to get the geometry of
 * @param x The left point of the window geometry
 * @param y The top point of the window geometry
 * @param w The width of the window geometry
 * @param h The height of the window geometry
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.17
 */
EAPI void ecore_wl2_window_geometry_get(Ecore_Wl2_Window *window, int *x, int *y, int *w, int *h);

/**
 * @internal
 *
 * Set the geometry of a given window
 *
 * @brief The window geometry referenced here is the window geometry as
 * recognized by xdg_surface_set_window_geometry. As such, it represents the
 * "visible bounds" of a window from the user's perspective.
 *
 * @param window The window to set the geometry of
 * @param x The left point of the window geometry
 * @param y The top point of the window geometry
 * @param w The width of the window geometry
 * @param h The height of the window geometry
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.17
 */
EAPI void ecore_wl2_window_geometry_set(Ecore_Wl2_Window *window, int x, int y, int w, int h);

/**
 * @internal
 *
 * Get the iconified state of a given window
 *
 * @param window The window to get the iconified state of
 *
 * @return EINA_TRUE if window is iconified, EINA_FALSE otherwise
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.17
 */
EAPI Eina_Bool ecore_wl2_window_iconified_get(Ecore_Wl2_Window *window);

/**
 * @internal
 *
 * Iconify a window
 *
 * @param win The window to iconifiy
 * @param iconified The new iconified state to set
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.17
 */
EAPI void ecore_wl2_window_iconified_set(Ecore_Wl2_Window *window, Eina_Bool iconified);

// TIZEN_ONLY(20151231) : handling iconic state on tizen
/** @internal */
EAPI void ecore_wl2_window_iconify_state_update(Ecore_Wl2_Window *window, Eina_Bool iconified, Eina_Bool send_event);
//

/**
 * @internal
 *
 * Set the type of a given window
 *
 * @param window The window to set the type of
 * @param type The Ecore_Wl2_Window_Type to set on the window
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.17
 */
EAPI void ecore_wl2_window_type_set(Ecore_Wl2_Window *window, Ecore_Wl2_Window_Type type);

/**
 * @internal
 *
 * Get the type of a given window
 *
 * @see Ecore_Wl2_Window_Type
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.24
 */
EAPI Ecore_Wl2_Window_Type ecore_wl2_window_type_get(Ecore_Wl2_Window *window);

/**
 * @internal
 *
 * Find the output that a given window is on
 *
 * @param window The window to find the output for
 *
 * @return An Ecore_Wl2_Output if found, or NULL otherwise
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.20
 */
EAPI Ecore_Wl2_Output *ecore_wl2_window_output_find(Ecore_Wl2_Window *window);

/**
 * @internal
 *
 * Set if window rotation is supported by the window manager
 *
 * @param window
 * @param enabled
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.20
 */
EAPI void ecore_wl2_window_wm_rotation_supported_set(Ecore_Wl2_Window *window, Eina_Bool enabled);

/**
 * @internal
 *
 * Get if window rotation is supported by the window manager
 *
 * @param window
 *
 * @return EINA_TRUE if supported, EINA_FALSE otherwise
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.20
 */
EAPI Eina_Bool ecore_wl2_window_wm_rotation_supported_get(Ecore_Wl2_Window *window);

/**
 * @internal
 *
 * Set if an application has set window rotation
 *
 * @param window
 * @param set
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.20
 */
EAPI void ecore_wl2_window_rotation_app_set(Ecore_Wl2_Window *window, Eina_Bool set);

/**
 * @internal
 *
 * Get if an application has set window rotation
 *
 * @param window
 *
 * @return EINA_TRUE if set, EINA_FALSE otherwise
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.20
 */
EAPI Eina_Bool ecore_wl2_window_rotation_app_get(Ecore_Wl2_Window *window);

/**
 * @internal
 *
 * Set preferred rotation on a given window
 *
 * @param window The window to set preferred rotation on
 * @param rot The value of the preferred rotation to set
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.20
 */
EAPI void ecore_wl2_window_preferred_rotation_set(Ecore_Wl2_Window *window, int rot);

/**
 * @internal
 *
 * Get preferred rotation for a given window
 *
 * @param window The window to get preferred rotation from
 *
 * @return Given windows preferred rotation
 *
 * @ingroup Ecore_Wl2_Window
 * @since 1.20
 */
EAPI int ecore_wl2_window_preferred_rotation_get(Ecore_Wl2_Window *window);

/**
 * @internal
 *
 * Set a windows available rotations
 *
 * @param window
 * @param rots
 * @param count
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.20
 */
EAPI void ecore_wl2_window_available_rotations_set(Ecore_Wl2_Window *window, const int *rots, unsigned int count);

/**
 * @internal
 *
 * Get a windows available rotations
 *
 * @param window
 * @param rots
 * @param count
 *
 * @return EINA_TRUE on success, EINA_FALSE otherwise
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.20
 */
EAPI Eina_Bool ecore_wl2_window_available_rotations_get(Ecore_Wl2_Window *window, int **rots, unsigned int *count);
/** @internal */
EAPI void ecore_wl2_window_rotation_change_prepare_send(Ecore_Wl2_Window *window, int rot, int w, int h, Eina_Bool resize);
/** @internal */
EAPI void ecore_wl2_window_rotation_change_prepare_done_send(Ecore_Wl2_Window *window, int rot);
/** @internal */
EAPI void ecore_wl2_window_rotation_change_request_send(Ecore_Wl2_Window *window, int rot);
/** @internal */
EAPI void ecore_wl2_window_rotation_change_done_send(Ecore_Wl2_Window *window, int rot, int w, int h);
// TIZEN_ONLY
/** @internal */
EAPI void ecore_wl2_window_rotation_geometry_set(Ecore_Wl2_Window *win, int rot, int x, int y, int w, int h);
/** @internal */
EAPI void ecore_wl2_window_rotation_changed_callback_set(Ecore_Wl2_Window *win, void *data, void (*func)(Ecore_Wl2_Window *win, int rot, Eina_Bool resize, int w, int h, void *data));
//

/**
 * @internal
 *
 * Get list of supported auxiliary window hints
 *
 * @param window
 *
 * @return An Eina_List of supported auxiliary hints, or NULL otherwise
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.20
 */
EAPI Eina_List *ecore_wl2_window_aux_hints_supported_get(Ecore_Wl2_Window *window);

/**
 * @internal
 *
 * Add a supported auxiliary hint to a given window
 *
 * @param window
 * @param id
 * @param hint
 * @param val
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.20
 */
EAPI void ecore_wl2_window_aux_hint_add(Ecore_Wl2_Window *window, int id, const char *hint, const char *val);

/**
 * @internal
 *
 * Change an auxiliary hint on a given window
 *
 * @param window
 * @param id
 * @param val
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.20
 */
EAPI void ecore_wl2_window_aux_hint_change(Ecore_Wl2_Window *window, int id, const char *val);

/**
 * @internal
 *
 * Delete an auxiliary hint on a given window
 *
 * @param window
 * @param id
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.20
 */
EAPI void ecore_wl2_window_aux_hint_del(Ecore_Wl2_Window *window, int id);

/**
 * @internal
 *
 * @brief Get the activated state of a window
 *
 * @param window The window to get activated state from
 *
 * @return @c EINA_TRUE if activated
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.20
 */
EAPI Eina_Bool ecore_wl2_window_activated_get(const Ecore_Wl2_Window *window);

/**
 * @internal
 *
 * @brief Set the seat for a popup window to be used with grab
 *
 * @param window The window
 * @param input The seat
 *
 * Use this function for desktop shell requests involving popup grabs which require
 * a seat for the grab.
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.20
 */
EAPI void ecore_wl2_window_popup_input_set(Ecore_Wl2_Window *window, Ecore_Wl2_Input *input);

/**
 * @internal
 *
 * @brief Get the seat for a popup window to be used with grab
 *
 * @param window The window
 *
 * @return Returns Ecore_Wl2_Input if the window has an input.
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.24
 */
EAPI Ecore_Wl2_Input *ecore_wl2_window_popup_input_get(Ecore_Wl2_Window *window);

/**
 * @internal
 *
 * Check if a window has a shell surface - without one it can't be visible.
 *
 * @param win The window to check
 *
 * @return Returns true if the window has an associated shell surface.
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.19
 */
EAPI Eina_Bool ecore_wl2_window_shell_surface_exists(Ecore_Wl2_Window *win);

// TIZEN_ONLY(171108) : get shell surface of a given window
/** @internal */
EAPI struct zxdg_surface_v6 *ecore_wl2_window_shell_surface_get(Ecore_Wl2_Window *window);
//

/**
 * @internal
 *
 * Set the role of a given window
 *
 * @param window
 * @param role
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.20
 */
EAPI void ecore_wl2_window_role_set(Ecore_Wl2_Window *window, const char *role);

/**
 * @internal
 *
 * Get the role of a given window
 *
 * @param window The window to set the class role
 *
 * @return A string if found, or NULL otherwise
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.24
 */
EAPI const char *ecore_wl2_window_role_get(Ecore_Wl2_Window *window);

/**
 * @internal
 *
 * Set if a given window is in floating mode
 *
 * @param window The window to set floating mode on
 * @param floating EINA_TRUE if this window should be in floating mode, EINA_FALSE otherwise
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.20
 */
EAPI void ecore_wl2_window_floating_mode_set(Ecore_Wl2_Window *window, Eina_Bool floating);

/**
 * @internal
 *
 * Get if a given window is in floating mode
 *
 * @param window The window to get floating mode
 *
 * @return EINA_TRUE if floating, EINA_FALSE otherwise
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.20
 */
EAPI Eina_Bool ecore_wl2_window_floating_mode_get(Ecore_Wl2_Window *window);

/**
 * @internal
 *
 * Finds a window by surface
 *
 * @param surface The surface to find the window of
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.24
 */
EAPI Ecore_Wl2_Window *ecore_wl2_window_surface_find(struct wl_surface *surface);

/*
 * @internal
 *
 * Check if a wayland window's surface is in the pending state.
 *
 * A surface is pending if it's been commit but we haven't received a
 * frame callback for it yet.  This mean's we're not ready to draw yet.
 *
 * @param window The window whose surface we want to check
 *
 * @return whether the window's surface is pending or not.
 *
 * @since 1.21
 */
EAPI Eina_Bool ecore_wl2_window_pending_get(Ecore_Wl2_Window *window);

/**
 * @internal
 *
 * Get if a given window is resizing
 *
 * @param window The window to check for resizing
 *
 * @return EINA_TRUE if resizing, EINA_FALSE otherwise
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since 1.21
 */
EAPI Eina_Bool ecore_wl2_window_resizing_get(Ecore_Wl2_Window *window);

/**
 * @internal
 *
 * Latch window state at the start of an update
 *
 * When async render takes place we continue to dispatch wayland
 * events from the main loop. We need to defer any changes to
 * window state from those events until the update is complete.
 *
 * Events deferred during an update will automatically fire
 * immediately after the caller calls ecore_wl2_window_commit.
 *
 * @param window The window whose state we want to latch
 *
 * @since 1.21
 */
EAPI void ecore_wl2_window_update_begin(Ecore_Wl2_Window *window);

// TIZEN_ONLY(20171207): add functions to set client's custom cursors
/** @internal */
EAPI void ecore_wl2_window_pointer_set(Ecore_Wl2_Window *win, struct wl_surface *surface, int hot_x, int hot_y);
/** @internal */
EAPI void ecore_wl2_window_cursor_from_name_set(Ecore_Wl2_Window *win, const char *cursor_name);
/** @internal */
EAPI void ecore_wl2_window_cursor_default_restore(Ecore_Wl2_Window *win);
//
// TIZEN_ONLY(20150703) : support conformant
/** @internal */
EAPI void ecore_wl2_window_conformant_set(Ecore_Wl2_Window *win, unsigned int is_conformant);
/** @internal */
EAPI Eina_Bool ecore_wl2_window_conformant_get(Ecore_Wl2_Window *win);
//

// TIZEN_ONLY(20171108) : add functions for indicator
/** @internal */
EAPI void ecore_wl2_window_indicator_geometry_set(Ecore_Wl2_Window *win, int x, int y, int w, int h);
/** @internal */
EAPI Eina_Bool ecore_wl2_window_indicator_geometry_get(Ecore_Wl2_Window *win, int *x, int *y, int *w, int *h);
/** @internal */
EAPI void ecore_wl2_window_indicator_state_set(Ecore_Wl2_Window *win, Ecore_Wl2_Indicator_State state);
/** @internal */
EAPI Ecore_Wl2_Indicator_State ecore_wl2_window_indicator_state_get(Ecore_Wl2_Window *win);
/** @internal */
EAPI void ecore_wl2_window_indicator_opacity_set(Ecore_Wl2_Window *win, Ecore_Wl2_Indicator_Opacity_Mode mode);
/** @internal */
EAPI Ecore_Wl2_Indicator_Opacity_Mode ecore_wl2_window_indicator_opacity_get(Ecore_Wl2_Window *win);
/** @internal */
EAPI void ecore_wl2_indicator_visible_type_set(Ecore_Wl2_Window *win, Ecore_Wl2_Indicator_Visible_Type type);
/** @internal */
EAPI Ecore_Wl2_Indicator_Visible_Type ecore_wl2_indicator_visible_type_get(Ecore_Wl2_Window *win);
//

// TIZEN_ONLY(20171108) : add functions for clipboard
/** @internal */
EAPI void ecore_wl2_window_clipboard_geometry_set(Ecore_Wl2_Window *win, int x, int y, int w, int h);
/** @internal */
EAPI Eina_Bool ecore_wl2_window_clipboard_geometry_get(Ecore_Wl2_Window *win, int *x, int *y, int *w, int *h);
/** @internal */
EAPI void ecore_wl2_window_clipboard_state_set(Ecore_Wl2_Window *win, Ecore_Wl2_Clipboard_State state);
/** @internal */
EAPI Ecore_Wl2_Clipboard_State ecore_wl2_window_clipboard_state_get(Ecore_Wl2_Window *win);
/** @internal */
EAPI void ecore_wl2_clipboard_show(Ecore_Wl2_Window *win);
/** @internal */
EAPI void ecore_wl2_clipboard_hide(Ecore_Wl2_Window *win);
/** @internal */
EAPI Eina_Bool ecore_wl2_clipboard_data_only_set(Eina_Bool data_only);
//

// TIZEN_ONLY(20171108) : add functions for keyboard
/** @internal */
EAPI void ecore_wl2_window_keyboard_geometry_set(Ecore_Wl2_Window *win, int x, int y, int w, int h);
/** @internal */
EAPI Eina_Bool ecore_wl2_window_keyboard_geometry_get(Ecore_Wl2_Window *win, int *x, int *y, int *w, int *h);
/** @internal */
EAPI void ecore_wl2_window_keyboard_state_set(Ecore_Wl2_Window *win, Ecore_Wl2_Virtual_Keyboard_State state);
/** @internal */
EAPI Ecore_Wl2_Virtual_Keyboard_State ecore_wl2_window_keyboard_state_get(Ecore_Wl2_Window *win);
//
// TIZEN_ONLY(20171107): add ecore_wl2_window_input_get() EAPI
/** @internal */
EAPI Ecore_Wl2_Input *ecore_wl2_window_input_get(Ecore_Wl2_Window *win);
//
// TIZEN_ONLY(20200326): add ecore_wl2_window_pointer/keyboard_get() EAPI
/** @internal */
EAPI Ecore_Wl2_Input *ecore_wl2_window_pointer_get(Ecore_Wl2_Window *win);
/** @internal */
EAPI Ecore_Wl2_Input *ecore_wl2_window_keyboard_get(Ecore_Wl2_Window *win);
//
// TIZEN_ONLY(20171114): support a pointer warp
/** @internal */
EAPI Eina_Bool ecore_wl2_window_pointer_warp(Ecore_Wl2_Window *win, int x, int y);
//
//TIZEN_ONLY(20171115): support output transform
/** @internal */
EAPI Eina_Bool ecore_wl2_window_ignore_output_transform_get(Ecore_Wl2_Window *win);
//
//TIZEN_ONLY(20180810): support client demand move resize
/** @internal */
EAPI void ecore_wl2_window_sync_geometry_set(Ecore_Wl2_Window *window, uint32_t serial, int x, int y, int w, int h);
//

/**
 * @defgroup Ecore_Wl2_Input_Group Wayland Library Input Functions
 * @ingroup Ecore_Wl2_Group
 *
 * Functions that deal with creating, destroying, or interacting with
 * Wayland Input
 */

/**
 * Gets default input of a given display
 *
 * @param ewd The display
 *
 * @ingroup Ecore_Wl2_Input_Group
 * @since 1.24
 */
EAPI Ecore_Wl2_Input *ecore_wl2_input_default_input_get(const Ecore_Wl2_Display *ewd);

/**
 * Retrieves the mouse position of the seat
 *
 * @param input The seat
 * @param x where to return the horizontal position. May be NULL. Returns 0 on error.
 * @param y where to return the vertical position. May be NULL. Returns 0 on error.
 * @return @c EINA_TRUE if coords were successfully retrieved
 *
 * @ingroup Ecore_Wl2_Input_Group
 * @since 1.20
 */
EAPI Eina_Bool ecore_wl2_input_pointer_xy_get(const Ecore_Wl2_Input *input, int *x, int *y);

/**
 * @internal
 *
 * Get the wl_seat that an input is using
 *
 * @param input The Ecore_Wl2_Input to get the seat of
 *
 * @return The wl_seat of this input, or NULL otherwise
 *
 * @ingroup Ecore_Wl2_Input_Group
 * @since 1.17
 */
EAPI struct wl_seat *ecore_wl2_input_seat_get(Ecore_Wl2_Input *input);

/**
 * @internal
 *
 * Get the seat capabilities for a given input.
 *
 * @param input The input
 *
 * @ingroup Ecore_Wl2_Input_Group
 * @since 1.19
 */
EAPI Ecore_Wl2_Seat_Capabilities ecore_wl2_input_seat_capabilities_get(Ecore_Wl2_Input *input);

/**
 * @internal
 *
 * Get the wayland's seat id from an input.
 *
 * @param input The input
 *
 * @return The seat id
 *
 * @ingroup Ecore_Wl2_Input_Group
 * @since 1.19
 */
EAPI unsigned int ecore_wl2_input_seat_id_get(Ecore_Wl2_Input *input) EINA_WARN_UNUSED_RESULT;

/**
 * @internal
 *
 * Get the display object of an input
 *
 * @param input The input
 *
 * @return The display
 *
 * @ingroup Ecore_Wl2_Input_Group
 * @since 1.20
 */
EAPI Ecore_Wl2_Display *ecore_wl2_input_display_get(const Ecore_Wl2_Input *input);

/**
 * @internal
 *
 * Get the xkb_keymap object of an input
 *
 * @param input The input
 *
 * @return The xkb_keymap object
 *
 * @ingroup Ecore_Wl2_Input_Group
 * @since 1.20
 */
EAPI struct xkb_keymap *ecore_wl2_input_keymap_get(const Ecore_Wl2_Input *input);

/**
 * @internal
 *
 * Get the name of an input
 *
 * @param input The input
 *
 * @return The name
 *
 * @ingroup Ecore_Wl2_Input_Group
 * @since 1.20
 */
EAPI Eina_Stringshare *ecore_wl2_input_name_get(Ecore_Wl2_Input *input);

/**
 * @internal
 *
 * Get the keyboard repeat rate and delay of an input
 *
 * @param input The input
 * @param rate Pointer to store the repeat rate (in seconds)
 * @param rate Pointer to store the repeat delay (in seconds)
 *
 * @return True if repeat is enabled
 *
 * @ingroup Ecore_Wl2_Input_Group
 * @since 1.20
 */
EAPI Eina_Bool ecore_wl2_input_keyboard_repeat_get(const Ecore_Wl2_Input *input, double *rate, double *delay);

/**
 * @internal
 *
 * Set the keyboard repeat rate and delay of an input
 * @param input The input
 * @param rate Pointer to store the repeat rate (in seconds)
 * @param rate Pointer to store the repeat delay (in seconds)
 * @return True if repeat is enabled
 * @ingroup Ecore_Wl2_Input_Group
 * @since 1.24
 */
EAPI Eina_Bool ecore_wl2_input_keyboard_repeat_set(Ecore_Wl2_Input *input, double rate, double delay);

/**
 * @internal
 *
 * Set a given wl_surface to use as the pointer on a seat
 *
 * @param input The seat to set this surface as the pointer on
 * @param surface The surface to use as the pointer
 * @param hot_x The x coordinate to use as the cursor hot spot
 * @param hot_y The y coordinate to use as the cursor hot spot
 *
 * @ingroup Ecore_Wl2_Input_Group
 * @since 1.20
 */
EAPI void ecore_wl2_input_pointer_set(Ecore_Wl2_Input *input, struct wl_surface *surface, int hot_x, int hot_y);

/**
 * @internal
 *
 * Set a specific cursor on a given input
 *
 * @brief This function will try to find a matching cursor inside the existing
 * cursor theme and set the pointer for the specified seat to be
 * the specified cursor
 *
 * @param input The seat to set the cursor on
 * @param cursor The name of the cursor to try and set
 *
 * @ingroup Ecore_Wl2_Input_Group
 * @since 1.20
 */
EAPI void ecore_wl2_input_cursor_from_name_set(Ecore_Wl2_Input *input, const char *cursor);

// TIZEN_ONLY(20171207): add functions to set client's custom cursors
/** @internal */
EAPI void ecore_wl2_input_pointer_set(Ecore_Wl2_Input *input, struct wl_surface *surface, int hot_x, int hot_y);
/** @internal */
EAPI struct wl_cursor *ecore_wl2_input_cursor_get(Ecore_Wl2_Input *input, const char *cursor_name);
/** @internal */
EAPI void ecore_wl2_input_cursor_size_set(Ecore_Wl2_Input *input, const int size);
/** @internal */
EAPI void ecore_wl2_input_cursor_theme_name_set(Ecore_Wl2_Input *input, const char *cursor_theme_name);
/** @internal */
EAPI void ecore_wl2_input_cursor_default_restore(Ecore_Wl2_Input *input);
//

/**
 * @defgroup Ecore_Wl2_Dnd_Group Wayland Library Drag-n-Drop Functions
 * @ingroup Ecore_Wl2_Group
 *
 * Functions that deal with creating, destroying, or interacting with
 * Wayland Drag-n-Drop
 */

/**
 * @internal
 *
 * Set the types which are supported by a possible drag and drop operation.
 * This call initializes a data source and offeres the given mimetypes
 *
 * @param input the input where to add on the data source
 * @param types a null-terminated array of mimetypes
 *
 * @ingroup Ecore_Wl2_Dnd_Group
 * @since 1.17
 */
EAPI void ecore_wl2_dnd_drag_types_set(Ecore_Wl2_Input *input, const char **types);

/**
 * @internal
 *
 * Start a drag on the given input
 *
 * @param input the input to use
 * @param window the window which is the origin of the drag operation
 * @param drag_window the window which is used as window of the visible hint.
 *
 * @return The serial for the start_drag request
 *
 * @ingroup Ecore_Wl2_Dnd_Group
 * @since 1.17
 */
EAPI uint32_t ecore_wl2_dnd_drag_start(Ecore_Wl2_Input *input, Ecore_Wl2_Window *window, Ecore_Wl2_Window *drag_window);

/**
 * @internal
 *
 * Call wl_data_source.set_actions on an existing source
 *
 * @param input the input to use
 *
 * @see ecore_wl2_dnd_drag_start for a more useful function.
 *
 * @ingroup Ecore_Wl2_Dnd_Group
 * @since 1.20
 */
EAPI void ecore_wl2_dnd_set_actions(Ecore_Wl2_Input *input);

/**
 * @internal
 *
 * End a drag started by a call to ecore_wl2_dnd_drag_start
 *
 * @param input the input object on which the drag was started
 *
 * @ingroup Ecore_Wl2_Dnd_Group
 * @since 1.17
 */
EAPI void ecore_wl2_dnd_drag_end(Ecore_Wl2_Input *input);

/**
 * @internal
 *
 * Get the offer which is currently resposible for the clipboard
 *
 * @param input the input object to use
 *
 * @ingroup Ecore_Wl2_Dnd_Group
 * @since 1.19
 */
EAPI Ecore_Wl2_Offer* ecore_wl2_dnd_selection_get(Ecore_Wl2_Input *input);

/**
 * @internal
 *
 * Set the types which are available from this client
 * Later the event ECORE_WL2_EVENT_DATA_SOURCE_SEND is emitted,
 * where the caller of this api must write the data (encoded in the given mimetype) to the fd
 *
 * @param input the input to provice this types on
 * @param types a null-terminated array of mimetypes supported by the client
 *
 * @return serial of request on success, 0 on failure
 *
 * @ingroup Ecore_Wl2_Dnd_Group
 * @since 1.17
 */
EAPI uint32_t ecore_wl2_dnd_selection_set(Ecore_Wl2_Input *input, const char **types);

/**
 * @internal
 *
 * Clear the selection currently setted on this input.
 *
 * @param input the input to clear
 *
 * @return serial of request on success, 0 on failure
 *
 * @ingroup Ecore_Wl2_Dnd_Group
 * @since 1.17
 */
EAPI uint32_t ecore_wl2_dnd_selection_clear(Ecore_Wl2_Input *input);

/**
 * @defgroup Ecore_Wl2_Output_Group Wayland Library Output Functions
 * @ingroup Ecore_Wl2_Group
 *
 * Functions that deal with creating, destroying, or interacting with
 * Wayland Outputs
 */

/**
 * @internal
 *
 * Return the DPI of a given output
 *
 * This is a simplistic call to get DPI. It does not account for differing
 * DPI in the x and y axes nor does it account for multihead or xinerama and
 * xrandr where different parts of the screen may have different DPI etc.
 *
 * @param output The output to get the DPI of
 *
 * @return the general screen DPI (dots/pixels per inch).
 *
 * @ingroup Ecore_Wl2_Output_Group
 * @since 1.17
 */
EAPI int ecore_wl2_output_dpi_get(Ecore_Wl2_Output *output);

/**
 * @internal
 *
 * Get the current transform of a given output
 *
 * @param output The output to get the transform of
 *
 * @return The output's current transform value
 *
 * @ingroup Ecore_Wl2_Output_Group
 * @since 1.20
 */
EAPI int ecore_wl2_output_transform_get(Ecore_Wl2_Output *output);

/**
 * @internal
 *
 * Disable session recovery for any further connections.  Must be called
 * before connecting.  This is irreversible and not intended for general
 * use.
 *
 * @since 1.19
 */
EAPI void ecore_wl2_session_recovery_disable(void);

/* TODO: doxygen if we are keeping any of the below functions public */
/** @internal */
EAPI Ecore_Wl2_Surface *ecore_wl2_surface_create(Ecore_Wl2_Window *win, Eina_Bool alpha);

// TIZEN_ONLY(20171107): support a tizen_keyrouter interface
EAPI void ecore_wl2_display_sync(Ecore_Wl2_Display *display);
EAPI Eina_Bool ecore_wl2_window_keygrab_set(Ecore_Wl2_Window *win, const char *key, int mod EINA_UNUSED, int not_mod EINA_UNUSED, int priority EINA_UNUSED, Ecore_Wl2_Window_Keygrab_Mode grab_mode);
EAPI Eina_Bool ecore_wl2_window_keygrab_unset(Ecore_Wl2_Window *win, const char *key, int mod EINA_UNUSED, int any_mod EINA_UNUSED);
//
EAPI Eina_List *ecore_wl2_window_keygrab_list_set(Ecore_Wl2_Window *win, Eina_List *infos);
EAPI Eina_List *ecore_wl2_window_keygrab_list_unset(Ecore_Wl2_Window *win, Eina_List *infos);

// TIZEN_ONLY(20171107): add ecore_wl2_window_input_get() EAPI
EAPI Ecore_Wl2_Input *ecore_wl2_window_input_get(Ecore_Wl2_Window *win);
//
// TIZEN_ONLY(20200326): add ecore_wl2_window_pointer/keyboard_get() EAPI
/** @internal */
EAPI Ecore_Wl2_Input *ecore_wl2_window_pointer_get(Ecore_Wl2_Window *win);
/** @internal */
EAPI Ecore_Wl2_Input *ecore_wl2_window_keyboard_get(Ecore_Wl2_Window *win);
//
// TIZEN_ONLY(20171114): support a pointer warp
EAPI Eina_Bool ecore_wl2_window_pointer_warp(Ecore_Wl2_Window *win, int x, int y);
//
// TIZEN_ONLY(20200601): support sync between ui and video
/**
 * @brief Defines the types to create a file descriptor
 * which is used for informing render event on the native surface
 *
 * @see ecore_wl2_window_render_sync_fd_create
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since_tizen 6.0
 */
typedef enum _Ecore_Wl2_Window_Render_Sync_Type
{
   ECORE_WL2_WINDOW_RENDER_SYNC_COMMIT = 0, /**< To get commit event emitted after calling wl_surface_commit */
   ECORE_WL2_WINDOW_RENDER_SYNC_PRESENT = 1 /**< To get presentation event emitted after the compositor draws */
} Ecore_Wl2_Window_Render_Sync_Type;

/**
 * @brief Create a video surface for a given window
 *
 * @param win The window to create a video surface
 * @return @c EINA_TRUE on success, @c EINA_FALSE otherwise
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since_tizen 6.0
 */
EAPI Eina_Bool ecore_wl2_window_video_surface_create(Ecore_Wl2_Window *win);

/**
 * @brief Get video surface for a given window
 *
 * @param win The window to get video surface
 * @return The wl_surface which is used by this window as a video surface
 *         It provided as void type
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since_tizen 6.0
 */
EAPI void *ecore_wl2_window_video_surface_get(Ecore_Wl2_Window *win);

/**
 * @brief Destroy a video surface for a given window
 *
 * @param win The window to destroy a video surface
 * @return @c EINA_TRUE on success, @c EINA_FALSE otherwise
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since_tizen 6.0
 */
EAPI Eina_Bool ecore_wl2_window_video_surface_destroy(Ecore_Wl2_Window *win);

/**
 * @brief Set video surface for a given window to synchronized mode
 *        the default commit behaviour is desynchronized mode.
 *
 * @param win The window to set video surface to synchronized mode
 * @param sync EINA_TRUE to set video surface to synchronized mode,
 *             EINA_FALSE to set video surface to desynchronized mode
 * @return @c EINA_TRUE on success, @c EINA_FALSE otherwise
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since_tizen 6.0
 */
EAPI Eina_Bool ecore_wl2_window_video_surface_sync_set(Ecore_Wl2_Window *win, Eina_Bool sync);

/**
 * @brief Set destination area of video surface for a given window
 *
 * @param win The window to set destination area of video surface
 * @param x  X position of destination area
 * @param y  Y position of destination area
 * @param w  Width of destination area
 * @param h  Height of destination area
 * @return @c EINA_TRUE on success, @c EINA_FALSE otherwise
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since_tizen 6.0
 */
EAPI Eina_Bool ecore_wl2_window_video_surface_destination_set(Ecore_Wl2_Window *win, int x, int y, int w, int h);


/**
 * @brief Create a file descriptor for rendering sync for a given window
 *
 * @param win The window to create a file descriptor for rendering sync
 * @param sync_type The one of #Ecore_Wl2_Window_Render_Sync_Type to create a file descriptor
 * @return The file descriptor. It must be closed manually  by the caller using `close`
 *
 * @ingroup Ecore_Wl2_Window_Group
 * @since_tizen 6.0
 */
EAPI int ecore_wl2_window_render_sync_fd_create(Ecore_Wl2_Window *win, Ecore_Wl2_Window_Render_Sync_Type sync_type);
//

//TIZEN_ONLY(20171108): add a new API to ecore_wl2_sync
/** @internal */
EAPI void ecore_wl2_sync(void);
//

# undef EAPI
# define EAPI

# ifdef __cplusplus
}
# endif

#endif
