#ifdef E_TYPEDEFS
typedef enum _E_Client_Screen_Limit
{
    E_CLIENT_OFFSCREEN_LIMIT_ALLOW_PARTIAL = 0,
    E_CLIENT_OFFSCREEN_LIMIT_ALLOW_FULL = 1,
    E_CLIENT_OFFSCREEN_LIMIT_ALLOW_NONE = 2
} E_Client_Screen_Limit;

typedef enum _E_Icon_Preference
{
   E_ICON_PREF_E_DEFAULT,
   E_ICON_PREF_NETWM,
   E_ICON_PREF_USER
} E_Icon_Preference;

typedef enum _E_Direction
{
   E_DIRECTION_UP,
   E_DIRECTION_DOWN,
   E_DIRECTION_LEFT,
   E_DIRECTION_RIGHT
} E_Direction;

typedef enum _E_Transition
{
   E_TRANSITION_LINEAR = 0,
   E_TRANSITION_SINUSOIDAL = 1,
   E_TRANSITION_ACCELERATE = 2,
   E_TRANSITION_DECELERATE = 3,
   E_TRANSITION_ACCELERATE_LOTS = 4,
   E_TRANSITION_DECELERATE_LOTS = 5,
   E_TRANSITION_SINUSOIDAL_LOTS = 6,
   E_TRANSITION_BOUNCE = 7,
   E_TRANSITION_BOUNCE_LOTS = 8
} E_Transition;

typedef enum _E_Stacking
{
   E_STACKING_NONE,
   E_STACKING_ABOVE,
   E_STACKING_BELOW
} E_Stacking;

typedef enum _E_Focus_Policy
{
   E_FOCUS_CLICK,
   E_FOCUS_MOUSE,
   E_FOCUS_SLOPPY,
   E_FOCUS_LAST,
} E_Focus_Policy;

typedef enum
{
   /* same as ecore-x types */
   E_WINDOW_TYPE_UNKNOWN = 0,
   E_WINDOW_TYPE_DESKTOP,
   E_WINDOW_TYPE_DOCK,
   E_WINDOW_TYPE_TOOLBAR,
   E_WINDOW_TYPE_MENU,
   E_WINDOW_TYPE_UTILITY,
   E_WINDOW_TYPE_SPLASH,
   E_WINDOW_TYPE_DIALOG,
   E_WINDOW_TYPE_NORMAL,
   E_WINDOW_TYPE_DROPDOWN_MENU,
   E_WINDOW_TYPE_POPUP_MENU,
   E_WINDOW_TYPE_TOOLTIP,
   E_WINDOW_TYPE_NOTIFICATION,
   E_WINDOW_TYPE_COMBO,
   E_WINDOW_TYPE_DND,
   /* since UNKNOWN was used improperly in comp matching,
    * this value is a placeholder to indicate that we want
    * only type UNKNOWN windows
    */
   E_WINDOW_TYPE_REAL_UNKNOWN = 999
} E_Window_Type;

typedef enum _E_Urgency_Policy
{
   E_ACTIVEHINT_POLICY_IGNORE,
   E_ACTIVEHINT_POLICY_ANIMATE,
   E_ACTIVEHINT_POLICY_ACTIVATE,
   E_ACTIVEHINT_POLICY_ACTIVATE_EXCLUDE,
   E_ACTIVEHINT_POLICY_LAST,
} E_Urgency_Policy;

typedef enum _E_Focus_Setting
{
   E_FOCUS_NONE,
   E_FOCUS_NEW_WINDOW,
   E_FOCUS_NEW_DIALOG,
   E_FOCUS_NEW_DIALOG_IF_OWNER_FOCUSED
} E_Focus_Setting;

typedef enum _E_Maximize
{
   E_MAXIMIZE_NONE = 0x00000000,
   E_MAXIMIZE_FULLSCREEN = 0x00000001,
   E_MAXIMIZE_SMART = 0x00000002,
   E_MAXIMIZE_EXPAND = 0x00000003,
   E_MAXIMIZE_FILL = 0x00000004,
   E_MAXIMIZE_TYPE = 0x0000000f,
   E_MAXIMIZE_VERTICAL = 0x00000010,
   E_MAXIMIZE_HORIZONTAL = 0x00000020,
   E_MAXIMIZE_BOTH = 0x00000030,
   E_MAXIMIZE_LEFT = 0x00000070,
   E_MAXIMIZE_RIGHT = 0x000000b0,
   E_MAXIMIZE_DIRECTION = 0x000000f0
} E_Maximize;

typedef enum _E_Fullscreen
{
   /* Resize window */
   E_FULLSCREEN_RESIZE,
   /* Change screen resolution and resize window */
   E_FULLSCREEN_ZOOM
} E_Fullscreen;

typedef enum _E_Window_Placement
{
   E_WINDOW_PLACEMENT_SMART,
   E_WINDOW_PLACEMENT_ANTIGADGET,
   E_WINDOW_PLACEMENT_CURSOR,
   E_WINDOW_PLACEMENT_MANUAL
} E_Window_Placement;

typedef enum E_Client_Property
{
   E_CLIENT_PROPERTY_NONE = 0,
   E_CLIENT_PROPERTY_SIZE = (1 << 0),
   E_CLIENT_PROPERTY_POS = (1 << 1),
   E_CLIENT_PROPERTY_TITLE = (1 << 2),
   E_CLIENT_PROPERTY_ICON = (1 << 3),
   E_CLIENT_PROPERTY_URGENCY = (1 << 4),
   E_CLIENT_PROPERTY_GRAVITY = (1 << 5),
   E_CLIENT_PROPERTY_NETWM_STATE = (1 << 6),
   E_CLIENT_PROPERTY_STICKY = (1 << 7),
   E_CLIENT_PROPERTY_MISC = (1 << 31),
} E_Client_Property;

typedef struct E_Client E_Client;

typedef struct E_Event_Client E_Event_Client;
typedef struct _E_Event_Client_Property E_Event_Client_Property;
typedef struct _E_Client_Pending_Resize E_Client_Pending_Resize;
typedef struct E_Event_Client_Zone_Set E_Event_Client_Zone_Set;
typedef struct E_Event_Client_Desk_Set E_Event_Client_Desk_Set;
typedef struct _E_Client_Hook E_Client_Hook;

typedef enum _E_Client_Hook_Point
{
   E_CLIENT_HOOK_EVAL_PRE_FETCH,
   E_CLIENT_HOOK_EVAL_FETCH,
   E_CLIENT_HOOK_EVAL_PRE_POST_FETCH,
   E_CLIENT_HOOK_EVAL_POST_FETCH,
   E_CLIENT_HOOK_EVAL_PRE_FRAME_ASSIGN,
   E_CLIENT_HOOK_EVAL_POST_FRAME_ASSIGN,
   E_CLIENT_HOOK_EVAL_PRE_NEW_CLIENT,
   E_CLIENT_HOOK_EVAL_POST_NEW_CLIENT,
   E_CLIENT_HOOK_EVAL_END,
   E_CLIENT_HOOK_FOCUS_SET,
   E_CLIENT_HOOK_FOCUS_UNSET,
   E_CLIENT_HOOK_NEW_CLIENT,
   E_CLIENT_HOOK_DESK_SET,
   E_CLIENT_HOOK_MOVE_BEGIN,
   E_CLIENT_HOOK_MOVE_UPDATE,
   E_CLIENT_HOOK_MOVE_END,
   E_CLIENT_HOOK_RESIZE_BEGIN,
   E_CLIENT_HOOK_RESIZE_UPDATE,
   E_CLIENT_HOOK_RESIZE_END,
   E_CLIENT_HOOK_DEL,
   E_CLIENT_HOOK_UNREDIRECT,
   E_CLIENT_HOOK_REDIRECT,
   E_CLIENT_HOOK_UNIGNORE,
   E_CLIENT_HOOK_LAST,
} E_Client_Hook_Point;

typedef void (*E_Client_Move_Intercept_Cb)(E_Client *, int x, int y);
typedef void (*E_Client_Hook_Cb)(void *data, E_Client *ec);
typedef void (*E_Client_Layout_Cb)(void);
#else

#ifndef HAVE_WAYLAND_ONLY
# include <Ecore_X.h>
#endif

#define E_CLIENT_TYPE (int)0xE0b01002

struct E_Event_Client
{
   E_Client *ec;
};

struct E_Event_Client_Desk_Set
{
   E_Client *ec;
   E_Desk *desk;
};

struct E_Event_Client_Zone_Set
{
   E_Client *ec;
   E_Zone *zone;
};

struct _E_Event_Client_Property
{
   E_Client *ec;
   unsigned int property;
};

struct _E_Client_Hook
{
   EINA_INLIST;
   E_Client_Hook_Point hookpoint;
   E_Client_Hook_Cb func;
   void               *data;
   unsigned char       delete_me E_BITFIELD;
};

struct _E_Client_Pending_Resize
{
   int           w, h;
   unsigned int  serial;
};

struct E_Client
{
   E_Object e_obj_inherit;
   EINA_INLIST;

   E_Pixmap *pixmap;
   int depth;
   int x, y, w, h; //frame+client geom
   struct {
      int x, y, w, h; //frame+client geom before move or resize callback
   } pre_cb;
   Eina_Rectangle client; //client geom
   Evas_Object *frame; //comp object
   Evas_Object *agent; //resize agent;
   E_Zone *zone;
   E_Desk *desk;

   Ecore_Poller              *ping_poller;
   Ecore_Timer               *kill_timer;

   E_Client                  *modal;

   E_Client                  *leader;
   Eina_List                 *group;

   E_Client                  *parent;
   Eina_List                 *transients;

   E_Layer                    layer;

   Eina_Rectangle           *shape_rects;
   unsigned int              shape_rects_num;

   Eina_Rectangle           *shape_input_rects;
   unsigned int              shape_input_rects_num;

   Eina_Stringshare         *internal_icon;
   Eina_Stringshare         *internal_icon_key;

   E_Direction               shade_dir;

   E_Comp_Client_Data       *comp_data;

   E_Action                  *cur_mouse_action;

   struct {
      E_Client               *next;
      E_Client               *prev;
      int                     ignore;
      Eina_Bool               focus_skip E_BITFIELD;
   } stack;

   int               border_size; //size of client's border

   struct
   {
      struct
      {
         int x, y, w, h;
         int mx, my;
      } current, last_down[3], last_up[3];
      Eina_Bool in E_BITFIELD;
   } mouse;

   struct
   {
      struct
      {
         int x, y, w, h;
         int mx, my;
         int button;
      } down;
   } moveinfo;

   unsigned char      ignore_first_unmap;
   E_Pointer_Mode     resize_mode;

   struct
   {
      Eina_Bool mapping_change E_BITFIELD;
      Eina_Bool iconic_shading E_BITFIELD;
   } hacks;

   struct
   {
      unsigned char changed E_BITFIELD;
      unsigned char user_selected E_BITFIELD;
      Eina_Stringshare *name;
   } border;

   struct
   {
      int          x, y, w, h;
      E_Layer      layer;
      int          zone;
      E_Maximize   maximized;
      Eina_Bool    frame E_BITFIELD;
      Eina_Bool    set E_BITFIELD;
   } saved;

   struct
   {
      unsigned char valid E_BITFIELD;
      int           x, y, w, h;
      struct
      {
         int x, y, w, h;
      } saved;
   } pre_res_change;

   unsigned char  shaped E_BITFIELD;
   unsigned char  argb E_BITFIELD;

   /* ICCCM */
   struct
   {
      Eina_Stringshare        *title;
      Eina_Stringshare        *name;
      Eina_Stringshare        *class;
      Eina_Stringshare        *icon_name;
      Eina_Stringshare        *machine;
      int                       min_w, min_h;
      int                       max_w, max_h;
      int                       base_w, base_h;
      int                       step_w, step_h;
      int                       start_x, start_y;
      double                    min_aspect, max_aspect;
      Ecore_Window            icon_window;
      Ecore_Window            window_group;
      uint64_t                transient_for;
      Ecore_Window            client_leader;
#ifndef HAVE_WAYLAND_ONLY
      Ecore_X_Window_State_Hint initial_state;
      Ecore_X_Window_State_Hint state;
      Ecore_X_Pixmap            icon_pixmap;
      Ecore_X_Pixmap            icon_mask;
      Ecore_X_Gravity           gravity;
#endif
      Eina_Stringshare         *window_role;
      unsigned char             take_focus E_BITFIELD;
      unsigned char             accepts_focus E_BITFIELD;
      unsigned char             urgent E_BITFIELD;
      unsigned char             delete_request E_BITFIELD;
      unsigned char             request_pos E_BITFIELD;
      struct
      {
         int    argc;
         char **argv;
      } command;
      struct
      {
         unsigned char title E_BITFIELD;
         unsigned char name_class E_BITFIELD;
         unsigned char icon_name E_BITFIELD;
         unsigned char machine E_BITFIELD;
         unsigned char hints E_BITFIELD;
         unsigned char size_pos_hints E_BITFIELD;
         unsigned char protocol E_BITFIELD;
         unsigned char transient_for E_BITFIELD;
         unsigned char client_leader E_BITFIELD;
         unsigned char window_role E_BITFIELD;
         unsigned char state E_BITFIELD;
         unsigned char command E_BITFIELD;
      } fetch;
   } icccm;

   /* MWM */
   struct
   {
#ifndef HAVE_WAYLAND_ONLY
      Ecore_X_MWM_Hint_Func  func;
      Ecore_X_MWM_Hint_Decor decor;
      Ecore_X_MWM_Hint_Input input;
#endif
      unsigned char          exists E_BITFIELD;
      unsigned char          borderless E_BITFIELD;
      struct
      {
         unsigned char hints E_BITFIELD;
      } fetch;
   } mwm;

   /* NetWM */
   struct
   {
      pid_t         pid;
      unsigned int  desktop;
      Eina_Stringshare *name;
      Eina_Stringshare *icon_name;
#ifndef HAVE_WAYLAND_ONLY
      Ecore_X_Icon *icons;
#endif
      int           num_icons;
      unsigned int  user_time;
      unsigned char opacity;
      Eina_Bool     opacity_changed E_BITFIELD; // prevent fetching opacity next prop change
      struct
      {
         int left;
         int right;
         int top;
         int bottom;
         int left_start_y;
         int left_end_y;
         int right_start_y;
         int right_end_y;
         int top_start_x;
         int top_end_x;
         int bottom_start_x;
         int bottom_end_x;
      } strut;
      unsigned char ping E_BITFIELD;
      struct
      {
         unsigned char        request E_BITFIELD;
         unsigned char        alarm E_BITFIELD;
         unsigned int         wait;
         unsigned int         serial;
         double               send_time;
      } sync;

      /* NetWM Window state */
      struct
      {
         unsigned char modal E_BITFIELD;
         unsigned char sticky E_BITFIELD;
         unsigned char maximized_v E_BITFIELD;
         unsigned char maximized_h E_BITFIELD;
         unsigned char shaded E_BITFIELD;
         unsigned char skip_taskbar E_BITFIELD;
         unsigned char skip_pager E_BITFIELD;
         unsigned char hidden E_BITFIELD;
         unsigned char fullscreen E_BITFIELD;
         E_Stacking    stacking;
      } state;

      /* NetWM Window allowed actions */
      struct
      {
         unsigned char move E_BITFIELD;
         unsigned char resize E_BITFIELD;
         unsigned char minimize E_BITFIELD;
         unsigned char shade E_BITFIELD;
         unsigned char stick E_BITFIELD;
         unsigned char maximized_h E_BITFIELD;
         unsigned char maximized_v E_BITFIELD;
         unsigned char fullscreen E_BITFIELD;
         unsigned char change_desktop E_BITFIELD;
         unsigned char close E_BITFIELD;
      } action;
      E_Window_Type  type;
      E_Window_Type *extra_types;
      int                  extra_types_num;
      int                  startup_id;

      struct
      {
         unsigned char name E_BITFIELD;
         unsigned char icon_name E_BITFIELD;
         unsigned char icon E_BITFIELD;
         unsigned char user_time E_BITFIELD;
         unsigned char strut E_BITFIELD;
         unsigned char type E_BITFIELD;
         unsigned char state E_BITFIELD;
         unsigned char opacity E_BITFIELD;
         /* No, fetch on new_client, shouldn't be changed after map.
            unsigned char pid E_BITFIELD;
          */
         /* No, ignore this
            unsigned char desktop E_BITFIELD;
          */
      } fetch;

      struct
      {
         unsigned char state E_BITFIELD;
      } update;
   } netwm;

   /* Extra e stuff */
   struct
   {
      struct
      {
         struct
         {
            int           x, y;

            unsigned char updated E_BITFIELD;
         } video_position;
         Ecore_Window video_parent;
         E_Client      *video_parent_client;
         Eina_List     *video_child;
         struct
         {
            Eina_Stringshare *name;
            Eina_Stringshare **available_list;
            Eina_Stringshare *set;
            Eina_Stringshare *wait;
            E_Desk           *wait_desk;
            E_Object_Delfn   *wait_desk_delfn;
            int               num;
            unsigned char     wait_for_done E_BITFIELD;
            unsigned char     use E_BITFIELD;
         } profile;
         Eina_Bool stack E_BITFIELD;
         unsigned char      centered E_BITFIELD;
         unsigned char      video E_BITFIELD;
      } state;

      struct
      {
         unsigned char state E_BITFIELD;
         unsigned char video_parent E_BITFIELD;
         unsigned char video_position E_BITFIELD;
         unsigned char profile E_BITFIELD;
         unsigned char stack E_BITFIELD;
      } fetch;
   } e;

   struct
   {
      struct
      {
         unsigned char soft_menu E_BITFIELD;
         unsigned char soft_menus E_BITFIELD;
      } fetch;

      unsigned char soft_menu E_BITFIELD;
      unsigned char soft_menus E_BITFIELD;
   } qtopia;

   struct
   {
      struct
      {
         unsigned char state E_BITFIELD;
         unsigned char vkbd E_BITFIELD;
      } fetch;
#ifndef HAVE_WAYLAND_ONLY
      Ecore_X_Virtual_Keyboard_State state;
#endif
      unsigned char                  have_property E_BITFIELD;
      unsigned char                  vkbd E_BITFIELD;
   } vkbd;

   struct
   {
      unsigned char visible E_BITFIELD;
      unsigned char pos E_BITFIELD;
      unsigned char size E_BITFIELD;
      unsigned char stack E_BITFIELD;
      unsigned char prop E_BITFIELD;
      unsigned char border E_BITFIELD;
      unsigned char reset_gravity E_BITFIELD;
      unsigned char shading E_BITFIELD;
      unsigned char shaded E_BITFIELD;
      unsigned char shape E_BITFIELD;
      unsigned char shape_input E_BITFIELD;
      unsigned char icon E_BITFIELD;
      Eina_Bool internal_state E_BITFIELD;
      Eina_Bool need_maximize E_BITFIELD;
      Eina_Bool need_unmaximize E_BITFIELD;
      Eina_Bool need_rescale E_BITFIELD;
   } changes;

   unsigned int       visible E_BITFIELD; // client is set to be visible by display server (never use this)
   unsigned int       hidden E_BITFIELD; // set when window has been hidden by api and should not be shown
   unsigned int       moving E_BITFIELD;
   unsigned int       focused E_BITFIELD;
   unsigned int       new_client E_BITFIELD;
   unsigned int       re_manage E_BITFIELD; // client is persisting from before E restart
   unsigned int       placed E_BITFIELD;
   unsigned int       shading E_BITFIELD;
   unsigned int       shaded E_BITFIELD;
   unsigned int       iconic E_BITFIELD;
   unsigned int       deskshow E_BITFIELD;
   unsigned int       sticky E_BITFIELD;
   unsigned int       urgent E_BITFIELD;
   unsigned int       shaped_input E_BITFIELD;
   unsigned int       need_shape_merge E_BITFIELD;
   unsigned int       need_shape_export E_BITFIELD;
   unsigned int       fullscreen E_BITFIELD;
   unsigned int       need_fullscreen E_BITFIELD;
   unsigned int       already_unparented E_BITFIELD;
   unsigned int       need_reparent E_BITFIELD;
   unsigned int       button_grabbed E_BITFIELD;
   unsigned int       delete_requested E_BITFIELD;
   unsigned int       ping_ok E_BITFIELD;
   unsigned int       hung E_BITFIELD;
   unsigned int       take_focus E_BITFIELD;
   unsigned int       want_focus E_BITFIELD;
   unsigned int       user_skip_winlist E_BITFIELD;
   E_Maximize         maximized;
   E_Fullscreen       fullscreen_policy;
   unsigned int       borderless E_BITFIELD;
   unsigned char      offer_resistance E_BITFIELD;
   Eina_Stringshare  *bordername;

   unsigned int       lock_user_location E_BITFIELD; /*DONE*/
   unsigned int       lock_client_location E_BITFIELD; /*DONE*/
   unsigned int       lock_user_size E_BITFIELD; /*DONE*/
   unsigned int       lock_client_size E_BITFIELD; /*DONE*/
   unsigned int       lock_user_stacking E_BITFIELD; /*DONE*/
   unsigned int       lock_client_stacking E_BITFIELD; /*DONE*/
   unsigned int       lock_user_iconify E_BITFIELD; /*DONE*/
   unsigned int       lock_client_iconify E_BITFIELD; /*DONE*/
   unsigned int       lock_user_desk E_BITFIELD;
   unsigned int       lock_client_desk E_BITFIELD;
   unsigned int       lock_user_sticky E_BITFIELD; /*DONE*/
   unsigned int       lock_client_sticky E_BITFIELD; /*DONE*/
   unsigned int       lock_user_shade E_BITFIELD; /*DONE*/
   unsigned int       lock_client_shade E_BITFIELD; /*DONE*/
   unsigned int       lock_user_maximize E_BITFIELD; /*DONE*/
   unsigned int       lock_client_maximize E_BITFIELD; /*DONE*/
   unsigned int       lock_user_fullscreen E_BITFIELD; /*DONE*/
   unsigned int       lock_client_fullscreen E_BITFIELD; /*DONE*/
   unsigned int       lock_border E_BITFIELD; /*DONE*/
   unsigned int       lock_close E_BITFIELD; /*DONE*/
   unsigned int       lock_focus_in E_BITFIELD; /*DONE*/
   unsigned int       lock_focus_out E_BITFIELD; /*DONE*/
   unsigned int       lock_life E_BITFIELD; /*DONE*/

   unsigned int       stolen E_BITFIELD;

   unsigned int       internal E_BITFIELD;
   unsigned int       internal_no_remember E_BITFIELD;
   unsigned int       internal_no_reopen E_BITFIELD;

   unsigned int       next_mouse_action_ignore E_BITFIELD;

   Evas_Object       *internal_elm_win;

   double             ping;

   unsigned char      changed E_BITFIELD;

   unsigned char      icon_preference;

   struct
   {
      int x, y;
      int modified;
   } shelf_fix;

   Eina_List       *stick_desks;
   E_Menu          *border_menu;
   Evas_Object     *color_editor;
   E_Config_Dialog *border_locks_dialog;
   E_Config_Dialog *border_remember_dialog;
   E_Config_Dialog *border_border_dialog;
   E_Dialog        *border_prop_dialog;
   Eina_List       *pending_resize;

   struct
   {
      unsigned char start E_BITFIELD;
      int           x, y;
   } drag;

   Ecore_Timer               *raise_timer;
   E_Client_Move_Intercept_Cb move_intercept_cb;
   E_Remember                *remember;
   E_Remember                *sr_remember;

   Efreet_Desktop            *desktop;
   E_Exec_Instance           *exe_inst;

   unsigned char              comp_hidden   E_BITFIELD;

   unsigned char              post_move   E_BITFIELD;
   unsigned char              post_resize E_BITFIELD;
   unsigned char              post_show E_BITFIELD;
   unsigned char              during_lost E_BITFIELD;

   Ecore_Idle_Enterer        *post_job;

   E_Focus_Policy             focus_policy_override;

   Eina_Stringshare *uuid;

   Eina_List *sinks;
   int volume;
   int volume_min;
   int volume_max;
   unsigned char mute E_BITFIELD;
   unsigned char volume_control_enabled E_BITFIELD;

   Eina_Bool override E_BITFIELD;
   Eina_Bool input_only E_BITFIELD;
   Eina_Bool dialog E_BITFIELD;
   Eina_Bool tooltip E_BITFIELD;
   Eina_Bool redirected E_BITFIELD;
   Eina_Bool unredirected_single E_BITFIELD; //window has been selectively unredirected
   Eina_Bool shape_changed E_BITFIELD;
   Eina_Bool layer_block E_BITFIELD; // client is doing crazy stuff and should not be relayered in protocol
   Eina_Bool ignored E_BITFIELD; // client is comp-ignored
   Eina_Bool no_shape_cut E_BITFIELD; // client shape should not be cut
   Eina_Bool maximize_override E_BITFIELD; // client is doing crazy stuff and should "just do it" when moving/resizing
   Eina_Bool maximize_anims_disabled E_BITFIELD; // client cannot invoke anims or it will break
   Eina_Bool keyboard_resizing E_BITFIELD;

   Eina_Bool on_post_updates E_BITFIELD; // client is on the post update list
};

#define e_client_focus_policy_click(ec) \
  ((ec->focus_policy_override == E_FOCUS_CLICK) || (e_config->focus_policy == E_FOCUS_CLICK))

/* macro for finding misuse of changed flag */
#if 0
# define EC_CHANGED(EC) \
  do { \
     if (e_object_is_del(E_OBJECT(EC))) \
       EINA_LOG_CRIT("CHANGED SET ON DELETED CLIENT!"); \
     EC->changed = 1; \
     INF("%s:%d - EC CHANGED: %p", __FILE__, __LINE__, EC); \
  } while (0)
#else
# define EC_CHANGED(EC) EC->changed = 1
#endif

#define E_CLIENT_FOREACH(EC) \
  for (EC = e_client_bottom_get(); EC; EC = e_client_above_get(EC))

#define E_CLIENT_REVERSE_FOREACH(EC) \
  for (EC = e_client_top_get(); EC; EC = e_client_below_get(EC))


E_API extern int E_EVENT_CLIENT_ADD;
E_API extern int E_EVENT_CLIENT_REMOVE;
E_API extern int E_EVENT_CLIENT_ZONE_SET;
E_API extern int E_EVENT_CLIENT_DESK_SET;
E_API extern int E_EVENT_CLIENT_RESIZE;
E_API extern int E_EVENT_CLIENT_MOVE;
E_API extern int E_EVENT_CLIENT_SHOW;
E_API extern int E_EVENT_CLIENT_HIDE;
E_API extern int E_EVENT_CLIENT_ICONIFY;
E_API extern int E_EVENT_CLIENT_UNICONIFY;
E_API extern int E_EVENT_CLIENT_STACK;
E_API extern int E_EVENT_CLIENT_FOCUS_IN;
E_API extern int E_EVENT_CLIENT_FOCUS_OUT;
E_API extern int E_EVENT_CLIENT_PROPERTY;
E_API extern int E_EVENT_CLIENT_FULLSCREEN;
E_API extern int E_EVENT_CLIENT_UNFULLSCREEN;



EINTERN void e_client_idler_before(void);
EINTERN Eina_Bool e_client_init(void);
EINTERN void e_client_shutdown(void);
E_API E_Client *e_client_new(E_Pixmap *cp, int first_map, int internal);
E_API void e_client_unignore(E_Client *ec);
E_API void e_client_desk_set(E_Client *ec, E_Desk *desk);
E_API Eina_Bool e_client_comp_grabbed_get(void);
E_API E_Client *e_client_action_get(void);
E_API E_Client *e_client_warping_get(void);
E_API Eina_List *e_clients_immortal_list(void);
E_API void e_client_mouse_in(E_Client *ec, int x, int y);
E_API void e_client_mouse_out(E_Client *ec, int x, int y);
E_API void e_client_mouse_wheel(E_Client *ec, Evas_Point *output, E_Binding_Event_Wheel *ev);
E_API void e_client_mouse_down(E_Client *ec, int button, Evas_Point *output, E_Binding_Event_Mouse_Button *ev);
E_API void e_client_mouse_up(E_Client *ec, int button, Evas_Point *output, E_Binding_Event_Mouse_Button* ev);
E_API void e_client_mouse_move(E_Client *ec, Evas_Point *output);
E_API void e_client_res_change_geometry_save(E_Client *bd);
E_API void e_client_res_change_geometry_restore(E_Client *ec);
E_API void e_client_rescale(E_Client *ec);
E_API void e_client_zone_set(E_Client *ec, E_Zone *zone);
E_API void e_client_geometry_get(E_Client *ec, int *x, int *y, int *w, int *h);
E_API E_Client *e_client_above_get(const E_Client *ec);
E_API E_Client *e_client_below_get(const E_Client *ec);
E_API E_Client *e_client_bottom_get(void);
E_API E_Client *e_client_top_get(void);
E_API unsigned int e_clients_count(void);
E_API void e_client_move_intercept_cb_set(E_Client *ec, E_Client_Move_Intercept_Cb cb);
E_API E_Client_Hook *e_client_hook_add(E_Client_Hook_Point hookpoint, E_Client_Hook_Cb func, const void *data);
E_API void e_client_hook_del(E_Client_Hook *ch);
E_API void e_client_focus_latest_set(E_Client *ec);
E_API void e_client_raise_latest_set(E_Client *ec);
E_API Eina_Bool e_client_focus_track_enabled(void);
E_API void e_client_focus_track_freeze(void);
E_API void e_client_focus_track_thaw(void);
E_API void e_client_refocus(void);
E_API void e_client_focus_set_with_pointer(E_Client *ec);
E_API void e_client_activate(E_Client *ec, Eina_Bool just_do_it);
E_API E_Client *e_client_focused_get(void);
E_API Eina_List *e_client_focus_stack_get(void);
E_API Eina_List *e_client_raise_stack_get(void);
E_API Eina_List *e_client_lost_windows_get(E_Zone *zone);
E_API void e_client_shade(E_Client *ec, E_Direction dir);
E_API void e_client_unshade(E_Client *ec, E_Direction dir);
E_API Eina_Bool e_client_maximize_geometry_get(const E_Client *ec, E_Maximize max, int *mx, int *my, int *mw, int *mh);
E_API void e_client_maximize(E_Client *ec, E_Maximize max);
E_API Eina_Bool e_client_unmaximize_geometry_get(const E_Client *ec, E_Maximize max, int *mx, int *my, int *mw, int *mh);
E_API void e_client_unmaximize(E_Client *ec, E_Maximize max);
E_API void e_client_fullscreen(E_Client *ec, E_Fullscreen policy);
E_API void e_client_unfullscreen(E_Client *ec);
E_API void e_client_iconify(E_Client *ec);
E_API void e_client_uniconify(E_Client *ec);
E_API void e_client_urgent_set(E_Client *ec, Eina_Bool urgent);
E_API void e_client_stick(E_Client *ec);
E_API void e_client_unstick(E_Client *ec);
E_API void e_client_pinned_set(E_Client *ec, Eina_Bool set);
E_API void e_client_prop_misc_changed(E_Client *ec);
E_API void e_client_comp_hidden_set(E_Client *ec, Eina_Bool hidden);
E_API Eina_Bool e_client_border_set(E_Client *ec, const char *name);
E_API void e_client_act_move_keyboard(E_Client *ec);
E_API void e_client_act_resize_keyboard(E_Client *ec);
E_API void e_client_act_move_begin(E_Client *ec, E_Binding_Event_Mouse_Button *ev);
E_API void e_client_act_move_end(E_Client *ec, E_Binding_Event_Mouse_Button *ev EINA_UNUSED);
E_API void e_client_act_resize_begin(E_Client *ec, E_Binding_Event_Mouse_Button *ev);
E_API void e_client_act_resize_end(E_Client *ec, E_Binding_Event_Mouse_Button *ev EINA_UNUSED);
E_API void e_client_act_menu_begin(E_Client *ec, E_Binding_Event_Mouse_Button *ev, int key);
E_API void e_client_act_close_begin(E_Client *ec);
E_API void e_client_act_kill_begin(E_Client *ec);
E_API Evas_Object *e_client_icon_add(E_Client *ec, Evas *evas);
E_API void e_client_ping(E_Client *cw);
E_API void e_client_move_cancel(void);
E_API void e_client_resize_cancel(void);
E_API Eina_Bool e_client_resize_begin(E_Client *ec);
E_API void e_client_frame_recalc(E_Client *ec);
E_API void e_client_signal_move_begin(E_Client *ec, const char *sig, const char *src EINA_UNUSED);
E_API void e_client_signal_move_end(E_Client *ec, const char *sig EINA_UNUSED, const char *src EINA_UNUSED);
E_API void e_client_signal_resize_begin(E_Client *ec, const char *dir, const char *sig, const char *src EINA_UNUSED);
E_API void e_client_signal_resize_end(E_Client *ec, const char *dir EINA_UNUSED, const char *sig EINA_UNUSED, const char *src EINA_UNUSED);
E_API void e_client_resize_limit(const E_Client *ec, int *w, int *h);
E_API E_Client *e_client_under_pointer_get(E_Desk *desk, E_Client *exclude);
E_API int e_client_pointer_warp_to_center_now(E_Client *ec);
E_API int e_client_pointer_warp_to_center(E_Client *ec);
E_API void e_client_redirected_set(E_Client *ec, Eina_Bool set);
E_API void e_client_next_mouse_action_ignore(E_Client *ec);
E_API Eina_Bool e_client_is_stacking(const E_Client *ec);
E_API Eina_Bool e_client_has_xwindow(const E_Client *ec);
E_API Eina_Bool e_client_desk_window_profile_available_check(E_Client *ec, const char *profile);
E_API void      e_client_desk_window_profile_wait_desk_set(E_Client *ec, E_Desk *desk);
E_API void      e_client_layout_cb_set(E_Client_Layout_Cb cb);
E_API Eina_List *e_client_stack_list_prepare(E_Client *ec);
E_API void       e_client_stack_list_finish(Eina_List *list);
E_API E_Client  *e_client_stack_top_get(E_Client *ec);
E_API E_Client  *e_client_stack_bottom_get(E_Client *ec);
E_API E_Client  *e_client_stack_active_adjust(E_Client *ec);
E_API Eina_Bool  e_client_stack_focused_get(E_Client *ec);
E_API Eina_Bool  e_client_stack_iconified_get(E_Client *ec);
E_API Eina_Bool  e_client_stack_urgent_get(E_Client *ec);

YOLO E_API void e_client_focus_stack_set(Eina_List *l);

E_API void e_client_parent_set(E_Client *ec, E_Client *parent);
E_API void e_client_transients_restack(E_Client *ec);
#include "e_client.x"
#endif
