#ifdef E_TYPEDEFS

typedef struct _E_Gadget E_Gadget;
typedef struct _E_Gadget_Face E_Gadget_Face;
typedef struct _E_Gadget_Change E_Gadget_Change;
typedef struct _E_Gadget_Api E_Gadget_Api;

#else 
#ifndef E_GADGET_H
#define E_GADGET_H

#define E_GADGET_TYPE 0xE0b01021

struct _E_Gadget_Api
{
  E_Module *module;
  const char *name;
  int per_zone; /* 1 - one face per zone, 0 - one per container */
  void (*func_face_init) (void *data, E_Gadget_Face *gadget_face);
  void (*func_face_free) (void *data, E_Gadget_Face *gadget_face);
  void (*func_change) (void *data, E_Gadget_Face *gadget_face, E_Gadman_Client *gmc, E_Gadman_Change change);
  void (*func_menu_init) (void *data, E_Gadget *gadget);
  void (*func_face_menu_init) (void *data, E_Gadget_Face *gadget_face);
  void *data;
};

struct _E_Gadget
{
  E_Object e_obj_inherit;
  Evas_List *faces;

  E_Module *module;
  const char *name;
  E_Menu *menu;

  struct {
    void (*face_init) (void *data, E_Gadget_Face *gadget_face);
    void (*face_free) (void *data, E_Gadget_Face *gadget_face);
    void (*change) (void *data, E_Gadget_Face *gadget_face, E_Gadman_Client *gmc, E_Gadman_Change change);
    void (*menu_init) (void *data, E_Gadget *gadget);
    void (*face_menu_init) (void *data, E_Gadget_Face *gadget_face);
  } funcs;

  void *data;
};

struct _E_Gadget_Face
{
  E_Gadget *gad;
  E_Container *con;
  E_Zone *zone;
  Evas *evas;

  E_Menu *menu;
  void *conf;

  Evas_Object *main_obj;
  Evas_Object *event_obj;
  E_Gadman_Client *gmc;

  void *data;
};

struct _E_Gadget_Change
{
  E_Gadget *gadget;
  E_Gadget_Face *face;
};

EAPI E_Gadget *e_gadget_new(E_Gadget_Api *api);
EAPI void      e_gadget_face_theme_set(E_Gadget_Face *face, char *category, char *group);

#endif
#endif
