Dear Aharon,
After this commit, it's hard to read all the evas informations at a glance.
Information such as min, max, size, position, ... are contracted and we
have to expand them all by manual.
In my opinion, previous output like "min size: -1 -1" looks better for
users.
How do you think?

Thanks in advance.

Daniel Juyung Seo (SeoZ)

On Tue, Jan 29, 2013 at 3:39 PM, Enlightenment SVN <
no-re...@enlightenment.org> wrote:

> Log:
> Clouseau: Added EO info support
>
>   The Clouseau client is compatible with old Clouseau applications
>   supporting EcoreConnEet.
>
>   Signed-off-by: Aharon Hillel <a.hil...@samsung.com>
>
> Author:       jackdanielz
> Date:         2013-01-28 22:39:51 -0800 (Mon, 28 Jan 2013)
> New Revision: 83412
> Trac:         http://trac.enlightenment.org/e/changeset/83412
>
> Modified:
>   trunk/clouseau/src/lib/Clouseau.h trunk/clouseau/src/lib/clouseau_data.c
> trunk/clouseau/src/lib/clouseau_object_information.c
> trunk/clouseau/src/lib/clouseau_private.h
>
> Modified: trunk/clouseau/src/lib/Clouseau.h
> ===================================================================
> --- trunk/clouseau/src/lib/Clouseau.h   2013-01-29 06:37:01 UTC (rev 83411)
> +++ trunk/clouseau/src/lib/Clouseau.h   2013-01-29 06:39:51 UTC (rev 83412)
> @@ -142,6 +142,7 @@
>  struct _Clouseau_Tree_Item
>  {
>     Eina_List *children;
> +   Eina_List *eo_info;          /* A list of Eo_Dbg_Info, to be shown */
>     const char *name;
>     unsigned long long ptr;      /* Just a ptr, we keep the value but not
> accessing mem */
>     Clouseau_Object *info;
>
> Modified: trunk/clouseau/src/lib/clouseau_data.c
> ===================================================================
> --- trunk/clouseau/src/lib/clouseau_data.c      2013-01-29 06:37:01 UTC
> (rev 83411)
> +++ trunk/clouseau/src/lib/clouseau_data.c      2013-01-29 06:39:51 UTC
> (rev 83412)
> @@ -22,11 +22,35 @@
>  static Eet_Data_Descriptor *clouseau_protocol_edd = NULL;
>  static Eet_Data_Descriptor *clouseau_map_point_props_edd = NULL;
>
> +static Eet_Data_Descriptor *eo_string_edd = NULL;
> +static Eet_Data_Descriptor *eo_int_edd = NULL;
> +static Eet_Data_Descriptor *eo_bool_edd = NULL;
> +static Eet_Data_Descriptor *eo_ptr_edd = NULL;
> +static Eet_Data_Descriptor *eo_double_edd = NULL;
> +static Eet_Data_Descriptor *eo_list_edd = NULL;
> +static Eet_Data_Descriptor *eo_dbg_info_edd = NULL;
> +
>  static void
> +_clouseau_eo_info_free(Clouseau_Eo_Dbg_Info *parent)
> +{
> +   Clouseau_Eo_Dbg_Info *eo;
> +
> +   if (parent->type == EO_DBG_INFO_TYPE_LIST)
> +     EINA_LIST_FREE(parent->un_dbg_info.dbg.list, eo)
> +        _clouseau_eo_info_free(eo);
> +
> +   free(parent);
> +}
> +
> +static void
>  _clouseau_tree_item_free(Clouseau_Tree_Item *parent)
>  {
>     Clouseau_Tree_Item *treeit;
> +   Clouseau_Eo_Dbg_Info *eo;
>
> +   EINA_LIST_FREE(parent->eo_info, eo)
> +      _clouseau_eo_info_free(eo);
> +
>     EINA_LIST_FREE(parent->children, treeit)
>       _clouseau_tree_item_free(treeit);
>
> @@ -132,6 +156,8 @@
>
>     EET_DATA_DESCRIPTOR_ADD_LIST(clouseau_tree_edd, Clouseau_Tree_Item,
>                                  "children", children, clouseau_tree_edd);
> +   EET_DATA_DESCRIPTOR_ADD_LIST(clouseau_tree_edd, Clouseau_Tree_Item,
> +                                "eo_info", eo_info, eo_dbg_info_edd);
>     EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_tree_edd, Clouseau_Tree_Item,
>                                   "name", name, EET_T_STRING);
>     EET_DATA_DESCRIPTOR_ADD_BASIC(clouseau_tree_edd, Clouseau_Tree_Item,
> @@ -476,9 +502,217 @@
>                                   extra_props.type, clouseau_union_edd);
>  }
>
> +/* START EO descs */
> +struct _Clouseau_Eo_Dbg_Info_Mapping
> +{
> +   Eo_Dbg_Info_Type u;
> +   const char *name;
> +};
> +typedef struct _Clouseau_Eo_Dbg_Info_Mapping Clouseau_Eo_Dbg_Info_Mapping;
> +
> +static Clouseau_Eo_Dbg_Info_Mapping eet_dbg_info_mapping[] =
> +{
> +     { EO_DBG_INFO_TYPE_STRING, EO_DBG_INFO_TYPE_STRING_STR },
> +     { EO_DBG_INFO_TYPE_INT, EO_DBG_INFO_TYPE_INT_STR },
> +     { EO_DBG_INFO_TYPE_BOOL, EO_DBG_INFO_TYPE_BOOL_STR },
> +     { EO_DBG_INFO_TYPE_PTR, EO_DBG_INFO_TYPE_PTR_STR },
> +     { EO_DBG_INFO_TYPE_DOUBLE, EO_DBG_INFO_TYPE_DOUBLE_STR },
> +     { EO_DBG_INFO_TYPE_LIST, EO_DBG_INFO_TYPE_LIST_STR },
> +     { EO_DBG_INFO_TYPE_UNKNOWN, NULL }
> +};
> +
> +static const char *
> +_dbg_info_union_type_get(const void *data, Eina_Bool  *unknow)
> +{  /* _union_type_get */
> +   const Eo_Dbg_Info_Type *u = data;
> +   int i;
> +
> +   if (unknow)
> +     *unknow = EINA_FALSE;
> +
> +   for (i = 0; eet_dbg_info_mapping[i].name != NULL; ++i)
> +     if (*u == eet_dbg_info_mapping[i].u)
> +       return eet_dbg_info_mapping[i].name;
> +
> +   if (unknow)
> +     *unknow = EINA_TRUE;
> +
> +   return NULL;
> +}
> +
> +static Eina_Bool
> +_dbg_info_union_type_set(const char *type, void *data, Eina_Bool unknow)
> +{  /* same as _union_type_set */
> +   Eo_Dbg_Info_Type *u = data;
> +   int i;
> +
> +   if (unknow)
> +     return EINA_FALSE;
> +
> +   for (i = 0; eet_dbg_info_mapping[i].name != NULL; ++i)
> +     if (strcmp(eet_dbg_info_mapping[i].name, type) == 0)
> +       {
> +          *u = eet_dbg_info_mapping[i].u;
> +          return EINA_TRUE;
> +       }
> +
> +   return EINA_FALSE;
> +}
> +
> +Eet_Data_Descriptor *
> +clouseau_string_desc_make(void)
> +{
> +   Eet_Data_Descriptor *d;
> +
> +   Eet_Data_Descriptor_Class eddc;
> +   EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, Clouseau_st_string);
> +   d = eet_data_descriptor_stream_new(&eddc);
> +
> +   EET_DATA_DESCRIPTOR_ADD_BASIC (d, Clouseau_st_string, "s",
> +         s, EET_T_STRING);
> +
> +   return d;
> +}
> +
> +Eet_Data_Descriptor *
> +clouseau_int_desc_make(void)
> +{
> +   Eet_Data_Descriptor *d;
> +
> +   Eet_Data_Descriptor_Class eddc;
> +   EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, Clouseau_st_int);
> +   d = eet_data_descriptor_stream_new(&eddc);
> +
> +   EET_DATA_DESCRIPTOR_ADD_BASIC (d, Clouseau_st_int, "i",
> +         i, EET_T_INT);
> +
> +   return d;
> +}
> +
> +Eet_Data_Descriptor *
> +clouseau_bool_desc_make(void)
> +{
> +   Eet_Data_Descriptor *d;
> +
> +   Eet_Data_Descriptor_Class eddc;
> +   EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, Clouseau_st_bool);
> +   d = eet_data_descriptor_stream_new(&eddc);
> +
> +   EET_DATA_DESCRIPTOR_ADD_BASIC (d, Clouseau_st_bool, "b",
> +         b, EET_T_UCHAR);
> +
> +   return d;
> +}
> +
> +Eet_Data_Descriptor *
> +clouseau_ptr_desc_make(void)
> +{
> +   Eet_Data_Descriptor *d;
> +
> +   Eet_Data_Descriptor_Class eddc;
> +   EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, Clouseau_st_ptr);
> +   d = eet_data_descriptor_stream_new(&eddc);
> +
> +   EET_DATA_DESCRIPTOR_ADD_BASIC (d, Clouseau_st_ptr, "p",
> +         p, EET_T_ULONG_LONG);
> +
> +   return d;
> +}
> +
> +Eet_Data_Descriptor *
> +clouseau_double_desc_make(void)
> +{
> +   Eet_Data_Descriptor *d;
> +
> +   Eet_Data_Descriptor_Class eddc;
> +   EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, Clouseau_st_double);
> +   d = eet_data_descriptor_stream_new(&eddc);
> +
> +   EET_DATA_DESCRIPTOR_ADD_BASIC (d, Clouseau_st_double, "d",
> +         d, EET_T_DOUBLE);
> +
> +   return d;
> +}
> +
> +Eet_Data_Descriptor *
> +clouseau_list_desc_make(void)
> +{
> +   Eet_Data_Descriptor *d;
> +
> +   Eet_Data_Descriptor_Class eddc;
> +   EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, Clouseau_st_dbg_list);
> +   d = eet_data_descriptor_stream_new(&eddc);
> +
> +   EET_DATA_DESCRIPTOR_ADD_LIST (d, Clouseau_st_dbg_list,
> +         "list", list, eo_dbg_info_edd); /* Carefull, has to be initiated
> */
> +
> +   return d;
> +}
> +
>  static void
> +_clouseau_eo_descs_make(void)
> +{
> +   Eet_Data_Descriptor_Class eddc;
> +
> +   eo_string_edd = clouseau_string_desc_make();
> +   eo_int_edd = clouseau_int_desc_make();
> +   eo_bool_edd = clouseau_bool_desc_make();
> +   eo_ptr_edd = clouseau_ptr_desc_make();
> +   eo_double_edd = clouseau_double_desc_make();
> +
> +   EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Clouseau_Eo_Dbg_Info);
> +   eo_dbg_info_edd = eet_data_descriptor_file_new(&eddc);
> +   EET_DATA_DESCRIPTOR_ADD_BASIC (eo_dbg_info_edd, Clouseau_Eo_Dbg_Info,
> +         "name", name, EET_T_STRING);
> +   EET_DATA_DESCRIPTOR_ADD_BASIC (eo_dbg_info_edd, Clouseau_Eo_Dbg_Info,
> +         "type", type, EET_T_INT);
> +
> +   /* Here because clouseau_list_desc_make() uses eo_dbg_info_edd */
> +   eo_list_edd = clouseau_list_desc_make();
> +
> +   /* for union */
> +   eddc.version = EET_DATA_DESCRIPTOR_CLASS_VERSION;
> +   eddc.func.type_get = _dbg_info_union_type_get;
> +   eddc.func.type_set = _dbg_info_union_type_set;
> +   clouseau_union_edd = eet_data_descriptor_file_new(&eddc);
> +
> +   EET_DATA_DESCRIPTOR_ADD_MAPPING(
> +         clouseau_union_edd, EO_DBG_INFO_TYPE_STRING_STR
> +         ,eo_string_edd);
> +
> +   EET_DATA_DESCRIPTOR_ADD_MAPPING(
> +         clouseau_union_edd, EO_DBG_INFO_TYPE_INT_STR
> +         ,eo_int_edd);
> +
> +   EET_DATA_DESCRIPTOR_ADD_MAPPING(
> +         clouseau_union_edd, EO_DBG_INFO_TYPE_BOOL_STR
> +         ,eo_bool_edd);
> +
> +   EET_DATA_DESCRIPTOR_ADD_MAPPING(
> +         clouseau_union_edd, EO_DBG_INFO_TYPE_PTR_STR
> +         ,eo_ptr_edd);
> +
> +   EET_DATA_DESCRIPTOR_ADD_MAPPING(
> +         clouseau_union_edd, EO_DBG_INFO_TYPE_DOUBLE_STR
> +         ,eo_double_edd);
> +
> +   EET_DATA_DESCRIPTOR_ADD_MAPPING(
> +         clouseau_union_edd, EO_DBG_INFO_TYPE_LIST_STR
> +         ,eo_list_edd);
> +
> +   EET_DATA_DESCRIPTOR_ADD_UNION(eo_dbg_info_edd,
> +         Clouseau_Eo_Dbg_Info,
> +         "un_dbg_info", un_dbg_info,
> +         type, clouseau_union_edd);
> +}
> +/* END EO descs */
> +
> +
> +
> +static void
>  clouseau_data_descriptors_init(void)
>  {
> +   _clouseau_eo_descs_make();
>     _clouseau_bmp_req_desc_make();
>     _clouseau_bmp_info_desc_make();
>     _clouseau_shot_list_desc_make();
> @@ -495,6 +729,14 @@
>  static void
>  clouseau_data_descriptors_shutdown(void)
>  {
> +   eet_data_descriptor_free(eo_string_edd);
> +   eet_data_descriptor_free(eo_int_edd);
> +   eet_data_descriptor_free(eo_bool_edd);
> +   eet_data_descriptor_free(eo_ptr_edd);
> +   eet_data_descriptor_free(eo_double_edd);
> +   eet_data_descriptor_free(eo_list_edd);
> +   eet_data_descriptor_free(eo_dbg_info_edd);
> +
>     eet_data_descriptor_free(clouseau_connect_edd);
>     eet_data_descriptor_free(clouseau_app_add_edd);
>     eet_data_descriptor_free(clouseau_data_req_edd);
> @@ -903,9 +1145,9 @@
>               /* Add the bitmaps to the actuall app data struct */
>               (*a)->view = eina_list_append((*a)->view, st);
>            }
> -
>          free(t);
>       }
> +
>     eet_close(fp);
>
>     return EINA_TRUE;
>
> Modified: trunk/clouseau/src/lib/clouseau_object_information.c
> ===================================================================
> --- trunk/clouseau/src/lib/clouseau_object_information.c        2013-01-29
> 06:37:01 UTC (rev 83411)
> +++ trunk/clouseau/src/lib/clouseau_object_information.c        2013-01-29
> 06:39:51 UTC (rev 83412)
> @@ -1,17 +1,16 @@
>  #include "Clouseau.h"
> -typedef struct _Inf_Clouseau_Tree_Item Inf_Clouseau_Tree_Item;
> -struct _Inf_Clouseau_Tree_Item
> -{
> -   Eina_List *children;
> -   Evas_Object *icon;
> -   const char *string;
> -};
> +#include "clouseau_private.h"
> +#define ELM_INTERNAL_API_ARGESFSDFEFC
> +#include <elm_widget.h>
>
> -static Eina_List *information_tree = NULL;
>  static Evas_Object *prop_list = NULL;
>  static Elm_Genlist_Item_Class itc;
>
>  static void
> +_clouseau_object_dbg_string_build(Clouseau_Eo_Dbg_Info *eo,
> +      char *buf, int buf_size);
> +
> +static void
>  _gl_selected(void *data EINA_UNUSED, Evas_Object *pobj EINA_UNUSED,
>        void *event_info EINA_UNUSED)
>  {
> @@ -23,15 +22,15 @@
>  gl_exp(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void
> *event_info)
>  {
>     Elm_Object_Item *glit = event_info;
> -   Inf_Clouseau_Tree_Item *parent = elm_object_item_data_get(glit);
> -   Inf_Clouseau_Tree_Item *tit;
>     Eina_List *itr;
>
> -   EINA_LIST_FOREACH(parent->children, itr, tit)
> +   Clouseau_Eo_Dbg_Info *eo = elm_object_item_data_get(glit);
> +   Clouseau_Eo_Dbg_Info *child;
> +   EINA_LIST_FOREACH(eo->un_dbg_info.dbg.list, itr, child)
>       {
> -        Elm_Genlist_Item_Type iflag = (tit->children) ?
> +        Elm_Genlist_Item_Type iflag = (child->type ==
> EO_DBG_INFO_TYPE_LIST) ?
>             ELM_GENLIST_ITEM_TREE : ELM_GENLIST_ITEM_NONE;
> -        elm_genlist_item_append(prop_list, &itc, tit, glit,
> +        elm_genlist_item_append(prop_list, &itc, child, glit,
>                iflag, _gl_selected, NULL);
>       }
>  }
> @@ -68,8 +67,10 @@
>  item_text_get(void *data, Evas_Object *obj EINA_UNUSED,
>        const char *part EINA_UNUSED)
>  {
> -   Inf_Clouseau_Tree_Item *tit = data;
> -   return strdup(tit->string);
> +   Clouseau_Eo_Dbg_Info *eo = data;
> +   char buf[1024];
> +   _clouseau_object_dbg_string_build(eo, (char*)buf, 1024);
> +   return strdup(buf);
>  }
>
>  EAPI Evas_Object *
> @@ -93,31 +94,6 @@
>     return prop_list;
>  }
>
> -static void
> -_clouseau_item_tree_item_free(Inf_Clouseau_Tree_Item *parent)
> -{
> -   Inf_Clouseau_Tree_Item *treeit;
> -
> -   EINA_LIST_FREE(parent->children, treeit)
> -     {
> -        _clouseau_item_tree_item_free(treeit);
> -     }
> -
> -   eina_stringshare_del(parent->string);
> -   free(parent);
> -}
> -
> -static void
> -_clouseau_item_tree_free(void)
> -{
> -   Inf_Clouseau_Tree_Item *treeit;
> -
> -   EINA_LIST_FREE(information_tree, treeit)
> -     {
> -        _clouseau_item_tree_item_free(treeit);
> -     }
> -}
> -
>  EAPI void
>  clouseau_object_information_free(Clouseau_Object *oinfo)
>  {
> @@ -166,151 +142,81 @@
>     free(oinfo);
>  }
>
> -EAPI Clouseau_Object *
> -clouseau_object_information_get(Clouseau_Tree_Item *treeit)
> -{
> -   Clouseau_Object *oinfo;
> -   Evas_Object *obj = (void*) (uintptr_t) treeit->ptr;
> -   const Evas_Map *map = NULL;
> +static Eina_List *
> +_clouseau_eo_list_convert(Eo_Dbg_Info *root)
> +{  /* This function converts a list of Eo_Dbg_Info
> +    * to a list of Clouseau_Eo_Dbg_Info.
> +    * This is required because we would like to keep the def of
> +    * Eo_Dbg_Info in EO code. Thus, avoiding API/ABI error if user
> +    * does not do a full update of Clouseau and EO                 */
> +   Eina_List *l;
> +   Eina_List *new_list = NULL;
> +   void *eo;
>
> -   if (!treeit->is_obj)
> -     return NULL;
> +   if (!root && eo_dbg_type_get(root) != EO_DBG_INFO_TYPE_LIST)
> +     return new_list;
> +   Eina_List *root_list = eo_dbg_union_get(root)->list;
>
> -   oinfo = calloc(1, sizeof(Clouseau_Object));
> +   EINA_LIST_FOREACH(root_list, l, eo)
> +     {
> +        Eo_Dbg_Info_Union *un = eo_dbg_union_get(eo);
> +        Clouseau_Eo_Dbg_Info *info = calloc(1, sizeof(*info));
> +        info->type = eo_dbg_type_get(eo);
> +        info->name = eo_dbg_name_get(eo);
>
> -   oinfo->evas_props.pass_events = evas_object_pass_events_get(obj);
> -   oinfo->evas_props.repeat_events = evas_object_repeat_events_get(obj);
> -   oinfo->evas_props.propagate_events =
> evas_object_propagate_events_get(obj);
> -   oinfo->evas_props.has_focus = evas_object_focus_get(obj);
> -   oinfo->evas_props.is_visible = evas_object_visible_get(obj);
> -   oinfo->evas_props.name =
> eina_stringshare_add(evas_object_name_get(obj));
> -   oinfo->evas_props.layer = evas_object_layer_get(obj);
> -   evas_object_geometry_get(obj, &oinfo->evas_props.x,
> &oinfo->evas_props.y,
> -         &oinfo->evas_props.w, &oinfo->evas_props.h);
> -   oinfo->evas_props.scale = evas_object_scale_get(obj);
> +        switch(info->type)
> +          {
> +           case EO_DBG_INFO_TYPE_STRING:
> +              info->un_dbg_info.text.s = un->text;
> +              break;
>
> -   evas_object_size_hint_min_get(obj, &oinfo->evas_props.min_w,
> -         &oinfo->evas_props.min_h);
> -   evas_object_size_hint_max_get(obj, &oinfo->evas_props.max_w,
> -         &oinfo->evas_props.max_h);
> -   evas_object_size_hint_request_get(obj, &oinfo->evas_props.req_w,
> -         &oinfo->evas_props.req_h);
> +           case EO_DBG_INFO_TYPE_INT:
> +              info->un_dbg_info.intg.i = un->i;
> +              break;
>
> -   evas_object_size_hint_align_get(obj, &oinfo->evas_props.align_x,
> -         &oinfo->evas_props.align_y);
> -   evas_object_size_hint_weight_get(obj, &oinfo->evas_props.weight_x,
> -         &oinfo->evas_props.weight_y);
> +           case EO_DBG_INFO_TYPE_BOOL:
> +              info->un_dbg_info.bl.b = un->b;
> +              break;
>
> -   evas_object_color_get(obj, &oinfo->evas_props.r, &oinfo->evas_props.g,
> -         &oinfo->evas_props.b, &oinfo->evas_props.a);
> +           case EO_DBG_INFO_TYPE_PTR:
> +              info->un_dbg_info.ptr.p = (unsigned long long) (unsigned
> long)
> +                 un->ptr;
> +              break;
>
> -   oinfo->evas_props.mode = evas_object_pointer_mode_get(obj);
> +           case EO_DBG_INFO_TYPE_DOUBLE:
> +              info->un_dbg_info.dbl.d = un->dbl;
> +              break;
>
> -   oinfo->evas_props.is_clipper = !!evas_object_clipees_get(obj);
> -   oinfo->evas_props.clipper = (uintptr_t) evas_object_clip_get(obj);
> -   oinfo->evas_props.bt = eina_stringshare_ref(evas_object_data_get(obj,
> ".clouseau.bt"));
> +           case EO_DBG_INFO_TYPE_LIST:
> +              info->un_dbg_info.dbg.list =
> +                 _clouseau_eo_list_convert(eo);
> +              break;
>
> -   map = evas_object_map_get(obj);
> -   if (map)
> -     {  /* Save map coords count info if object has map */
> -        oinfo->evas_props.points_count = evas_map_count_get(map);
> -        if (oinfo->evas_props.points_count)
> -          {
> -             int i;
> -             Clouseau_Evas_Map_Point_Props *p;
> -             oinfo->evas_props.points =
> calloc(oinfo->evas_props.points_count,
> -                   sizeof(Clouseau_Evas_Map_Point_Props));
> -
> -             for(i = 0 ; i < oinfo->evas_props.points_count; i++)
> -               {
> -                  p = &oinfo->evas_props.points[i];
> -                  evas_map_point_coord_get(map, i, &p->x, &p->y, &p->z);
> -               }
> +           default:  /* Unknown Type, keep zero */
> +              break;
>            }
> -     }
>
> -   if (elm_widget_is(obj))
> -     {
> -        oinfo->extra_props.type = CLOUSEAU_OBJ_TYPE_ELM;
> -
> -        oinfo->extra_props.u.elm.type =
> -           eina_stringshare_add(elm_widget_type_get(obj));
> -        oinfo->extra_props.u.elm.style =
> -           eina_stringshare_add(elm_widget_style_get(obj));
> -        oinfo->extra_props.u.elm.scale = elm_widget_scale_get(obj);
> -        oinfo->extra_props.u.elm.has_focus = elm_object_focus_get(obj);
> -        oinfo->extra_props.u.elm.is_disabled =
> elm_widget_disabled_get(obj);
> -        oinfo->extra_props.u.elm.is_mirrored =
> elm_widget_mirrored_get(obj);
> -        oinfo->extra_props.u.elm.is_mirrored_automatic =
> -              elm_widget_mirrored_automatic_get(obj);
> +        new_list = eina_list_append(new_list, info);
>       }
> -   else if (!strcmp("text", evas_object_type_get(obj)))
> -     {
> -        const char *font;
> -        int size;
> -        oinfo->extra_props.type = CLOUSEAU_OBJ_TYPE_TEXT;
>
> -        evas_object_text_font_get(obj, &font, &size);
> -        oinfo->extra_props.u.text.font = eina_stringshare_add(font);
> -        oinfo->extra_props.u.text.size = size;
> -        oinfo->extra_props.u.text.source =
> -           eina_stringshare_add(evas_object_text_font_source_get(obj));
> -       oinfo->extra_props.u.text.text =
> eina_stringshare_add(evas_object_text_text_get(obj));
> -     }
> -   else if (!strcmp("image", evas_object_type_get(obj)))
> -     {
> -        const char *file, *key;
> -        oinfo->extra_props.type = CLOUSEAU_OBJ_TYPE_IMAGE;
> +   return new_list;
> +}
>
> -        evas_object_image_file_get(obj, &file, &key);
> -        oinfo->extra_props.u.image.file = eina_stringshare_add(file);
> -        oinfo->extra_props.u.image.key = eina_stringshare_add(key);
> -        oinfo->extra_props.u.image.source =
> evas_object_image_source_get(obj);
> +EAPI Clouseau_Object *
> +clouseau_object_information_get(Clouseau_Tree_Item *treeit)
> +{
> +   Evas_Object *obj = (void*) (uintptr_t) treeit->ptr;
> +   Eo_Dbg_Info *eo_dbg_info = EO_DBG_INFO_LIST_APPEND(NULL, "");
>
> -        if (evas_object_image_load_error_get(obj) != EVAS_LOAD_ERROR_NONE)
> -          {
> -             oinfo->extra_props.u.image.load_err = eina_stringshare_add(
> -
> evas_load_error_str(evas_object_image_load_error_get(obj)));
> -          }
> -     }
> -   else if (!strcmp("edje", evas_object_type_get(obj)))
> -     {
> -        const char *file, *group;
> -        oinfo->extra_props.type = CLOUSEAU_OBJ_TYPE_EDJE;
> +   if (!treeit->is_obj)
> +     return NULL;
>
> -        edje_object_file_get(obj, &file, &group);
> -        oinfo->extra_props.u.edje.file = eina_stringshare_add(file);
> -        oinfo->extra_props.u.edje.group = eina_stringshare_add(group);
> +   eo_do(obj, eo_dbg_info_get(eo_dbg_info));
> +   treeit->eo_info = _clouseau_eo_list_convert(eo_dbg_info);
>
> -        if (edje_object_load_error_get(obj) != EDJE_LOAD_ERROR_NONE)
> -          {
> -             oinfo->extra_props.u.edje.load_err = eina_stringshare_add(
> -                   edje_load_error_str(edje_object_load_error_get(obj)));
> -          }
> -     }
> -   else if (!strcmp("textblock", evas_object_type_get(obj)))
> -     {
> -        const char *style;
> -        const char *text;
> -        char shorttext[48];
> -        const Evas_Textblock_Style *ts;
> -        oinfo->extra_props.type = CLOUSEAU_OBJ_TYPE_TEXTBLOCK;
> +   eo_dbg_info_free(eo_dbg_info); /* Free original list */
>
> -        ts = evas_object_textblock_style_get(obj);
> -        style = evas_textblock_style_get(ts);
> -        text = evas_object_textblock_text_markup_get(obj);
> -        strncpy(shorttext, text, 38);
> -        if (shorttext[37])
> -          strcpy(shorttext + 37, "\xe2\x80\xa6"); /* HORIZONTAL ELLIPSIS
> */
> -
> -        oinfo->extra_props.u.textblock.style =
> eina_stringshare_add(style);
> -        oinfo->extra_props.u.textblock.text =
> eina_stringshare_add(shorttext);
> -     }
> -   else
> -     {
> -        oinfo->extra_props.type = CLOUSEAU_OBJ_TYPE_OTHER;
> -     }
> -   return oinfo;
> +   return NULL;
>  }
>
>  static const struct {
> @@ -324,82 +230,6 @@
>  # undef POINTER_MODE
>  };
>
> -static void
> -_clouseau_information_buffer_to_tree(Inf_Clouseau_Tree_Item *parent,
> const char *buffer)
> -{
> -   Inf_Clouseau_Tree_Item *item;
> -
> -   item = calloc(1, sizeof (Inf_Clouseau_Tree_Item));
> -   if (!item) return ;
> -   item->string = eina_stringshare_add(buffer);
> -
> -   parent->children = eina_list_append(parent->children, item);
> -}
> -
> -static void
> -_clouseau_information_string_to_tree(Inf_Clouseau_Tree_Item *parent,
> const char *name, const char *value)
> -{
> -   char *buffer;
> -   int length;
> -
> -   if (!value) return ;
> -
> -   length = strlen(name) + 5;
> -   length += strlen(value);
> -   buffer = alloca(length);
> -
> -   snprintf(buffer, length, "%s: '%s'", name, value);
> -   _clouseau_information_buffer_to_tree(parent, buffer);
> -}
> -
> -static void
> -_clouseau_information_geometry_to_tree(Inf_Clouseau_Tree_Item *parent,
> const char *name, int xw, int yh)
> -{
> -   char *buffer;
> -   int length;
> -
> -   length = strlen(name) + 4 + 20;
> -   buffer = alloca(length);
> -
> -   snprintf(buffer, length, "%s: %d %d", name, xw, yh);
> -
> -   _clouseau_information_buffer_to_tree(parent, buffer);
> -}
> -
> -static void
> -_clouseau_information_bool_to_tree(Inf_Clouseau_Tree_Item *parent, const
> char *name, Eina_Bool value)
> -{
> -   _clouseau_information_string_to_tree(parent, name, value ? "EINA_TRUE"
> : "EINA_FALSE");
> -}
> -
> -static void
> -_clouseau_information_double_to_tree(Inf_Clouseau_Tree_Item *parent,
> const char *name, double d)
> -{
> -   char *buffer;
> -   int length;
> -
> -   length = strlen(name) + 3 + 64;
> -   buffer = alloca(length);
> -
> -   snprintf(buffer, length, "%s: %.6lg", name, d);
> -
> -   _clouseau_information_buffer_to_tree(parent, buffer);
> -}
> -
> -static void
> -_clouseau_information_hint_to_tree(Inf_Clouseau_Tree_Item *parent, const
> char *name, double xw, double yh)
> -{
> -   char *buffer;
> -   int length;
> -
> -   length = strlen(name) + 3 + 128;
> -   buffer = alloca(length);
> -
> -   snprintf(buffer, length, "%s: %.6lg %.61g", name, xw, yh);
> -
> -   _clouseau_information_buffer_to_tree(parent, buffer);
> -}
> -
>  static const struct {
>     Clouseau_Object_Type type;
>     const char *name;
> @@ -411,40 +241,66 @@
>    { CLOUSEAU_OBJ_TYPE_TEXTBLOCK, "Textblock" }
>  };
>
> -static const char *
> -_clouseau_type_to_string(Clouseau_Object_Type type)
> -{
> -   unsigned int i;
> +static void
> +_clouseau_object_dbg_string_build(Clouseau_Eo_Dbg_Info *eo,
> +      char *buf, int buf_size)
> +{  /* Build a string from dbg-info in buffer, or return empty buffer */
> +   int i;
> +   *buf = '\0';
> +   switch(eo->type)
> +     {
> +      case EO_DBG_INFO_TYPE_STRING:
> +           {  /* First set flags to say if got info from eo */
> +              snprintf(buf, buf_size, "%s",
> +                    eo->un_dbg_info.text.s);
>
> -   for (i = 0; i < sizeof (_clouseau_types) / sizeof
> (_clouseau_types[0]); ++i)
> -     if (_clouseau_types[i].type == type)
> -       return eina_stringshare_add(_clouseau_types[i].name);
> +              for(i = 0; buf[i]; i++)
> +                buf[i] = tolower(buf[i]);
>
> -   return NULL;
> -}
> +              snprintf(buf, buf_size, "%s: %s",
> +                    eo->name, eo->un_dbg_info.text.s);
> +           }
> +         break;
>
> -static Inf_Clouseau_Tree_Item *
> -_clouseau_type_to_parent(Eina_List **main, const char *name)
> -{
> -   Inf_Clouseau_Tree_Item *item;
> +      case EO_DBG_INFO_TYPE_INT:
> +           {
> +              snprintf(buf, buf_size, "%s: %d",
> +                    eo->name, eo->un_dbg_info.intg.i);
> +           }
> +         break;
>
> -   if (!name) return NULL;
> +      case EO_DBG_INFO_TYPE_BOOL:
> +         snprintf(buf, buf_size, "%s: %s",
> +               eo->name, (eo->un_dbg_info.bl.b) ?
> +               "TRUE" : "FALSE");
> +         break;
>
> -   item = calloc(1, sizeof(Inf_Clouseau_Tree_Item));
> -   item->string = eina_stringshare_add(name);
> +      case EO_DBG_INFO_TYPE_PTR:
> +         snprintf(buf, buf_size, "%s: %llx",
> +               eo->name, eo->un_dbg_info.ptr.p);
> +         break;
>
> -   *main = eina_list_append(*main, item);
> +      case EO_DBG_INFO_TYPE_DOUBLE:
> +         snprintf(buf, buf_size, "%s: %.2f",
> +               eo->name, eo->un_dbg_info.dbl.d);
> +         break;
>
> -   return item;
> +      case EO_DBG_INFO_TYPE_LIST:  /* Just copy class-name */
> +         snprintf(buf, buf_size, "%s", eo->name);
> +         break;
> +
> +      default:
> +         break;
> +     }
>  }
>
>  EAPI void
>  clouseau_object_information_list_populate(Clouseau_Tree_Item *treeit,
> Evas_Object *lb)
>  {
> -   Inf_Clouseau_Tree_Item *main_tit;
>     Clouseau_Object *oinfo;
>     char buf[1024];
>     unsigned int i;
> +   Eo_Dbg_Info *root = EO_DBG_INFO_LIST_APPEND(NULL, "");
>
>     clouseau_object_information_list_clear();
>
> @@ -453,193 +309,189 @@
>
>     oinfo = treeit->info;
>
> -   /* Populate evas properties list */
> -   main_tit = _clouseau_type_to_parent(&information_tree, "Evas");
> +   /* This code is here only for backward compatibility and will be
> removed soon */
> +   if (!treeit->eo_info)
> +     {
> +        /* Populate evas properties list */
> +        Eo_Dbg_Info *group = EO_DBG_INFO_LIST_APPEND(root, "Evas");
> +        Eo_Dbg_Info *node;
>
> -   _clouseau_information_bool_to_tree(main_tit, "Visibility",
> -                                      oinfo->evas_props.is_visible);
> -   _clouseau_information_string_to_tree(main_tit, "Name", oinfo->
> evas_props.name);
> +        EO_DBG_INFO_BOOLEAN_APPEND(group, "Visibility",
> oinfo->evas_props.is_visible);
> +        EO_DBG_INFO_INTEGER_APPEND(group, "Layer",
> oinfo->evas_props.layer);
>
> -   snprintf(buf, sizeof(buf), "Layer: %hd", oinfo->evas_props.layer);
> -   _clouseau_information_buffer_to_tree(main_tit, buf);
> +        node = EO_DBG_INFO_LIST_APPEND(group, "Position");
> +        EO_DBG_INFO_INTEGER_APPEND(node, "x", oinfo->evas_props.x);
> +        EO_DBG_INFO_INTEGER_APPEND(node, "y", oinfo->evas_props.y);
>
> -   _clouseau_information_geometry_to_tree(main_tit, "Position",
> -                                          oinfo->evas_props.x,
> -                                          oinfo->evas_props.y);
> -   _clouseau_information_geometry_to_tree(main_tit, "Size",
> -                                          oinfo->evas_props.w,
> -                                          oinfo->evas_props.h);
> -   _clouseau_information_double_to_tree(main_tit, "Scale",
> oinfo->evas_props.scale);
> +        node = EO_DBG_INFO_LIST_APPEND(group, "Size");
> +        EO_DBG_INFO_INTEGER_APPEND(node, "w", oinfo->evas_props.w);
> +        EO_DBG_INFO_INTEGER_APPEND(node, "h", oinfo->evas_props.h);
>
> +        EO_DBG_INFO_DOUBLE_APPEND(group, "Scale",
> oinfo->evas_props.scale);
> +
>  #if 0
> -   if (evas_object_clip_get(obj))
> -     {
> -        evas_object_geometry_get(evas_object_clip_get(obj), &x, &y, &w,
> &h);
> -        _clouseau_information_geometry_to_tree(main_tit, "Clipper
> position", x, y);
> -        _clouseau_information_geometry_to_tree(main_tit, "Clipper size",
> w, h);
> -     }
> +        if (evas_object_clip_get(obj))
> +          {
> +             evas_object_geometry_get(evas_object_clip_get(obj), &x, &y,
> &w, &h);
> +             _clouseau_information_geometry_to_tree(main_tit, "Clipper
> position", x, y);
> +             _clouseau_information_geometry_to_tree(main_tit, "Clipper
> size", w, h);
> +          }
>  #endif
>
> -   _clouseau_information_geometry_to_tree(main_tit, "Min size",
> -                                          oinfo->evas_props.min_w,
> -                                          oinfo->evas_props.min_h);
> -   _clouseau_information_geometry_to_tree(main_tit, "Max size",
> -                                          oinfo->evas_props.max_w,
> -                                          oinfo->evas_props.max_h);
> -   _clouseau_information_geometry_to_tree(main_tit, "Request size",
> -                                          oinfo->evas_props.req_w,
> -                                          oinfo->evas_props.req_h);
> -   _clouseau_information_hint_to_tree(main_tit, "Align",
> -                                      oinfo->evas_props.align_x,
> -                                      oinfo->evas_props.align_y);
> -   _clouseau_information_hint_to_tree(main_tit, "Weight",
> -                                      oinfo->evas_props.weight_x,
> -                                      oinfo->evas_props.weight_y);
> +        node = EO_DBG_INFO_LIST_APPEND(group, "Min size");
> +        EO_DBG_INFO_INTEGER_APPEND(node, "w", oinfo->evas_props.min_w);
> +        EO_DBG_INFO_INTEGER_APPEND(node, "h", oinfo->evas_props.min_h);
> +        node = EO_DBG_INFO_LIST_APPEND(group, "Max size");
> +        EO_DBG_INFO_INTEGER_APPEND(node, "w", oinfo->evas_props.max_w);
> +        EO_DBG_INFO_INTEGER_APPEND(node, "h", oinfo->evas_props.max_h);
> +        node = EO_DBG_INFO_LIST_APPEND(group, "Request size");
> +        EO_DBG_INFO_INTEGER_APPEND(node, "w", oinfo->evas_props.req_w);
> +        EO_DBG_INFO_INTEGER_APPEND(node, "h", oinfo->evas_props.req_h);
> +        node = EO_DBG_INFO_LIST_APPEND(group, "Align");
> +        EO_DBG_INFO_DOUBLE_APPEND(node, "w", oinfo->evas_props.align_x);
> +        EO_DBG_INFO_DOUBLE_APPEND(node, "h", oinfo->evas_props.align_y);
> +        node = EO_DBG_INFO_LIST_APPEND(group, "Weight");
> +        EO_DBG_INFO_DOUBLE_APPEND(node, "w", oinfo->evas_props.weight_x);
> +        EO_DBG_INFO_DOUBLE_APPEND(node, "h", oinfo->evas_props.weight_y);
>
>  #if 0
> -   evas_object_size_hint_aspect_get(obj, &w, &h);
> -   _clouseau_information_geometry_to_tree(main_tit, "Aspect", w, h);
> +        evas_object_size_hint_aspect_get(obj, &w, &h);
> +        _clouseau_information_geometry_to_tree(main_tit, "Aspect", w, h);
>  #endif
>
> -   snprintf(buf, sizeof(buf), "Color: %d %d %d %d",
> -            oinfo->evas_props.r, oinfo->evas_props.g, oinfo->evas_props.b,
> -            oinfo->evas_props.a);
> -   _clouseau_information_buffer_to_tree(main_tit, buf);
> +        node = EO_DBG_INFO_LIST_APPEND(group, "Color");
> +        EO_DBG_INFO_INTEGER_APPEND(node, "r", oinfo->evas_props.r);
> +        EO_DBG_INFO_INTEGER_APPEND(node, "g", oinfo->evas_props.g);
> +        EO_DBG_INFO_INTEGER_APPEND(node, "b", oinfo->evas_props.b);
> +        EO_DBG_INFO_INTEGER_APPEND(node, "a", oinfo->evas_props.a);
>
> -   _clouseau_information_bool_to_tree(main_tit, "Has focus",
> -                                      oinfo->evas_props.has_focus);
> +        EO_DBG_INFO_BOOLEAN_APPEND(group, "Has focus",
> oinfo->evas_props.has_focus);
>
> -   for (i = 0; i < sizeof (pointer_mode) / sizeof (pointer_mode[0]); ++i)
> -     if (pointer_mode[i].mode == oinfo->evas_props.mode)
> -       {
> -          _clouseau_information_string_to_tree(main_tit, "Pointer mode",
> -                                               pointer_mode[i].text);
> -          break;
> -       }
> +        for (i = 0; i < sizeof (pointer_mode) / sizeof (pointer_mode[0]);
> ++i)
> +           if (pointer_mode[i].mode == oinfo->evas_props.mode)
> +             {
> +                EO_DBG_INFO_TEXT_APPEND(group, "Pointer Mode",
> pointer_mode[i].text);
> +                break;
> +             }
>
> -   _clouseau_information_bool_to_tree(main_tit, "Pass events",
> -                                      oinfo->evas_props.pass_events);
> -   _clouseau_information_bool_to_tree(main_tit, "Repeat events",
> -                                      oinfo->evas_props.repeat_events);
> -   _clouseau_information_bool_to_tree(main_tit, "Propagate events",
> -                                      oinfo->evas_props.propagate_events);
> -   _clouseau_information_bool_to_tree(main_tit, "Has clipees",
> -                                      oinfo->evas_props.is_clipper);
> -   if (oinfo->evas_props.clipper)
> -     {
> -        snprintf(buf, sizeof(buf), "%llx", oinfo->evas_props.clipper);
> -        _clouseau_information_string_to_tree(main_tit, "Clipper", buf);
> -     }
> +        EO_DBG_INFO_BOOLEAN_APPEND(group, "Pass Events",
> oinfo->evas_props.pass_events);
> +        EO_DBG_INFO_BOOLEAN_APPEND(group, "Repeat Events",
> oinfo->evas_props.repeat_events);
> +        EO_DBG_INFO_BOOLEAN_APPEND(group, "Propagate Events",
> oinfo->evas_props.propagate_events);
> +        EO_DBG_INFO_BOOLEAN_APPEND(group, "Has clipees",
> oinfo->evas_props.is_clipper);
> +        if (oinfo->evas_props.clipper)
> +          {
> +             snprintf(buf, sizeof(buf), "%llx",
> oinfo->evas_props.clipper);
> +             EO_DBG_INFO_TEXT_APPEND(group, "Clipper", buf);
> +          }
>
> -   if (oinfo->evas_props.points_count)
> -     {
> -        main_tit = _clouseau_type_to_parent(&main_tit->children, "Evas
> Map");
> -        Clouseau_Evas_Map_Point_Props *p;
> -        for(i = 0 ; (int) i < oinfo->evas_props.points_count; i++)
> +        if (oinfo->evas_props.points_count)
>            {
> -             p = &oinfo->evas_props.points[i];
> +             node = EO_DBG_INFO_LIST_APPEND(group, "Evas Map");
> +             Clouseau_Evas_Map_Point_Props *p;
> +             for(i = 0 ; (int) i < oinfo->evas_props.points_count; i++)
> +               {
> +                  p = &oinfo->evas_props.points[i];
>
> -             snprintf(buf, sizeof(buf), "Coords: %d %d %d", p->x, p->y,
> p->z);
> -             _clouseau_information_buffer_to_tree(main_tit, buf);
> +                  Eo_Dbg_Info *point = EO_DBG_INFO_LIST_APPEND(node,
> "Coords");
> +                  EO_DBG_INFO_INTEGER_APPEND(point, "x", p->x);
> +                  EO_DBG_INFO_INTEGER_APPEND(point, "y", p->y);
> +                  EO_DBG_INFO_INTEGER_APPEND(point, "z", p->z);
> +               }
>            }
> -     }
>
> -   main_tit = _clouseau_type_to_parent(&information_tree,
> -
> _clouseau_type_to_string(oinfo->extra_props.type));
> -   if (main_tit)
> -     {
>          if (oinfo->extra_props.type == CLOUSEAU_OBJ_TYPE_ELM)
>            {
> -             _clouseau_information_string_to_tree(main_tit, "Wid-Type",
> oinfo->extra_props.u.elm.type);
> +             group = EO_DBG_INFO_LIST_APPEND(root, "Elm");
> +             EO_DBG_INFO_TEXT_APPEND(group, "Wid-Type",
> oinfo->extra_props.u.elm.type);
>  #if 0
>               /* Extract actual data from theme? */
>               _clouseau_information_string_to_tree(main_tit, "Theme",
> elm_widget_theme_get(obj));
>  #endif
> -             _clouseau_information_string_to_tree(main_tit, "Style",
> oinfo->extra_props.u.elm.style);
> -             _clouseau_information_double_to_tree(main_tit, "Scale",
> -
>  oinfo->extra_props.u.elm.scale);
> -             _clouseau_information_bool_to_tree(main_tit, "Disabled",
> -
>  oinfo->extra_props.u.elm.is_disabled);
> -             _clouseau_information_bool_to_tree(main_tit, "Has focus",
> -
>  oinfo->extra_props.u.elm.has_focus);
> -             _clouseau_information_bool_to_tree(main_tit, "Mirrored",
> -
>  oinfo->extra_props.u.elm.is_mirrored);
> -             _clouseau_information_bool_to_tree(main_tit, "Automatic
> mirroring",
> -
>  oinfo->extra_props.u.elm.is_mirrored_automatic);
> +             EO_DBG_INFO_TEXT_APPEND(group, "Style",
> oinfo->extra_props.u.elm.style);
> +             EO_DBG_INFO_DOUBLE_APPEND(group, "Scale",
> oinfo->extra_props.u.elm.scale);
> +             EO_DBG_INFO_BOOLEAN_APPEND(group, "Disabled",
> oinfo->extra_props.u.elm.is_disabled);
> +             EO_DBG_INFO_BOOLEAN_APPEND(group, "Has focus",
> oinfo->extra_props.u.elm.has_focus);
> +             EO_DBG_INFO_BOOLEAN_APPEND(group, "Mirrored",
> oinfo->extra_props.u.elm.is_mirrored);
> +             EO_DBG_INFO_BOOLEAN_APPEND(group, "Automatic mirroring",
> oinfo->extra_props.u.elm.is_mirrored_automatic);
>            }
>          else if (oinfo->extra_props.type == CLOUSEAU_OBJ_TYPE_TEXT)
> -          {
> -             _clouseau_information_string_to_tree(main_tit, "Font",
> oinfo->extra_props.u.text.font);
> +          {  /* EVAS_OBJ_TEXT_CLASS */
> +             group = EO_DBG_INFO_LIST_APPEND(root, "Text");
> +             EO_DBG_INFO_TEXT_APPEND(group, "Font",
> oinfo->extra_props.u.text.font);
>
> -             snprintf(buf, sizeof(buf), "Size: %d",
> oinfo->extra_props.u.text.size);
> -             _clouseau_information_buffer_to_tree(main_tit, buf);
> +             EO_DBG_INFO_INTEGER_APPEND(group, "Size",
> oinfo->extra_props.u.text.size);
>
> -             _clouseau_information_string_to_tree(main_tit, "Source",
> oinfo->extra_props.u.text.source);
> -             _clouseau_information_string_to_tree(main_tit, "Text",
> oinfo->extra_props.u.text.text);
> +             EO_DBG_INFO_TEXT_APPEND(group, "Source",
> oinfo->extra_props.u.text.source);
> +             EO_DBG_INFO_TEXT_APPEND(group, "Text",
> oinfo->extra_props.u.text.text);
>            }
>          else if (oinfo->extra_props.type == CLOUSEAU_OBJ_TYPE_IMAGE)
> -          {
> -             _clouseau_information_string_to_tree(main_tit, "Filename",
> oinfo->extra_props.u.image.file);
> -             _clouseau_information_string_to_tree(main_tit, "File key",
> oinfo->extra_props.u.image.key);
> -             snprintf(buf, sizeof(buf), "Source: %p",
> oinfo->extra_props.u.image.source);
> -             _clouseau_information_buffer_to_tree(main_tit, buf);
> +          {  /* EVAS_OBJ_IMAGE_CLASS */
> +             group = EO_DBG_INFO_LIST_APPEND(root, "Image");
> +             EO_DBG_INFO_TEXT_APPEND(group, "Filename",
> oinfo->extra_props.u.image.file);
> +             EO_DBG_INFO_TEXT_APPEND(group, "File key",
> oinfo->extra_props.u.image.key);
> +             EO_DBG_INFO_PTR_APPEND(group, "Source",
> oinfo->extra_props.u.image.source);
>
> -             _clouseau_information_string_to_tree(main_tit, "Load error",
> oinfo->extra_props.u.image.load_err);
> +             if (oinfo->extra_props.u.image.load_err)
> +                EO_DBG_INFO_TEXT_APPEND(group, "Load error",
> oinfo->extra_props.u.image.load_err);
>            }
>          else if (oinfo->extra_props.type == CLOUSEAU_OBJ_TYPE_EDJE)
> -          {
> -             _clouseau_information_string_to_tree(main_tit, "File",
> oinfo->extra_props.u.edje.file);
> -             _clouseau_information_string_to_tree(main_tit, "Group",
> oinfo->extra_props.u.edje.group);
> -             _clouseau_information_string_to_tree(main_tit, "Load error",
> oinfo->extra_props.u.edje.load_err);
> +          {  /* EDJE_OBJ_CLASS */
> +             group = EO_DBG_INFO_LIST_APPEND(root, "Edje");
> +             EO_DBG_INFO_TEXT_APPEND(group, "File",
> oinfo->extra_props.u.edje.file);
> +             EO_DBG_INFO_TEXT_APPEND(group, "Group",
> oinfo->extra_props.u.edje.group);
> +             if (oinfo->extra_props.u.image.load_err)
> +                EO_DBG_INFO_TEXT_APPEND(group, "Load error",
> oinfo->extra_props.u.edje.load_err);
>            }
>          else if (oinfo->extra_props.type == CLOUSEAU_OBJ_TYPE_TEXTBLOCK)
> -          {
> -             _clouseau_information_string_to_tree(main_tit, "Style",
> oinfo->extra_props.u.textblock.style);
> -             _clouseau_information_string_to_tree(main_tit, "Text",
> oinfo->extra_props.u.textblock.text);
> +          {  /* EVAS_OBJ_TEXTBLOCK_CLASS */
> +             group = EO_DBG_INFO_LIST_APPEND(root, "Text Block");
> +             EO_DBG_INFO_TEXT_APPEND(group, "Style",
> oinfo->extra_props.u.textblock.style);
> +             EO_DBG_INFO_TEXT_APPEND(group, "Text",
> oinfo->extra_props.u.textblock.text);
>            }
> -     }
>
> -   /* Update backtrace text */
> -   if (oinfo->evas_props.bt)
> -     {  /* Build backtrace label */
> -        char *k = malloc(strlen("Creation backtrace:\n\n") +
> -              strlen(oinfo->evas_props.bt) + 1);
> +        /* Update backtrace text */
> +        if (oinfo->evas_props.bt)
> +          {  /* Build backtrace label */
> +             char *k = malloc(strlen("Creation backtrace:\n\n") +
> +                   strlen(oinfo->evas_props.bt) + 1);
>
> -        sprintf(k, "Creation backtrace:\n\n%s", oinfo->evas_props.bt);
> -        char *p = elm_entry_utf8_to_markup(k);
> -        elm_object_text_set(lb, p);
> -        free(p);
> -        free(k);
> +             sprintf(k, "Creation backtrace:\n\n%s", oinfo->evas_props.bt
> );
> +             char *p = elm_entry_utf8_to_markup(k);
> +             elm_object_text_set(lb, p);
> +             free(p);
> +             free(k);
> +          }
> +        else
> +           elm_object_text_set(lb, NULL);
> +
> +        /* Convert Old format to Clouseau_eo */
> +        treeit->eo_info = _clouseau_eo_list_convert(root);
> +        eo_dbg_info_free(root);
>       }
> -   else
> -     elm_object_text_set(lb, NULL);
>
> -
> -   /* Actually populate the genlist */
> -   {
> -      Eina_List *itr, *expand_list = NULL, *l, *l_prev;
> -      Inf_Clouseau_Tree_Item *tit;
> -      Elm_Object_Item *expand_it = NULL;
> -
> -      EINA_LIST_FOREACH(information_tree, itr, tit)
> -        {
> -           Elm_Object_Item *git;
> -           git = elm_genlist_item_append(prop_list, &itc, tit, NULL,
> -                                         ELM_GENLIST_ITEM_TREE,
> _gl_selected, NULL);
> -           expand_list = eina_list_append(expand_list, git);
> -
> -        }
> -      EINA_LIST_REVERSE_FOREACH_SAFE(expand_list, l, l_prev, expand_it)
> -        {
> -           elm_genlist_item_expanded_set(expand_it, EINA_TRUE);
> -           expand_list = eina_list_remove_list(expand_list, l);
> -        }
> -   }
> +     {
> +        /* Fetch properties of eo object */
> +        Clouseau_Eo_Dbg_Info *eo;
> +        Eina_List *expand_list = NULL, *l, *l_prev;
> +        Elm_Object_Item *eo_it;
> +        EINA_LIST_FOREACH(treeit->eo_info,l, eo)
> +          {
> +             Elm_Genlist_Item_Type iflag = (eo->type ==
> EO_DBG_INFO_TYPE_LIST) ?
> +                ELM_GENLIST_ITEM_TREE : ELM_GENLIST_ITEM_NONE;
> +             eo_it = elm_genlist_item_append(prop_list, &itc, eo, NULL,
> +                   iflag, _gl_selected, NULL);
> +             expand_list = eina_list_append(expand_list, eo_it);
> +          }
> +        EINA_LIST_REVERSE_FOREACH_SAFE(expand_list, l, l_prev, eo_it)
> +          {
> +             elm_genlist_item_expanded_set(eo_it, EINA_TRUE);
> +             expand_list = eina_list_remove_list(expand_list, l);
> +          }
> +     }
>  }
>
>  EAPI void
>  clouseau_object_information_list_clear(void)
>  {
> -   _clouseau_item_tree_free();
>     elm_genlist_clear(prop_list);
>  }
>
> Modified: trunk/clouseau/src/lib/clouseau_private.h
> ===================================================================
> --- trunk/clouseau/src/lib/clouseau_private.h   2013-01-29 06:37:01 UTC
> (rev 83411)
> +++ trunk/clouseau/src/lib/clouseau_private.h   2013-01-29 06:39:51 UTC
> (rev 83412)
> @@ -1,5 +1,6 @@
>  #ifndef EET_DATA_H
>  #define EET_DATA_H
> +#include <Eo.h>
>  #include "Clouseau.h"
>  #include <Ecore_Con_Eet.h>
>  /*  Global constants  */
> @@ -12,13 +13,13 @@
>
>  #define CLOUSEAU_GUI_CLIENT_CONNECT_STR "CLOUSEAU_GUI_CLIENT_CONNECT"
>  #define CLOUSEAU_APP_CLIENT_CONNECT_STR "CLOUSEAU_APP_CLIENT_CONNECT"
> -#define CLOUSEAU_APP_ADD_STR "CLOUSEAU_APP_ADD"
> -#define CLOUSEAU_DATA_REQ_STR "CLOUSEAU_DATA_REQ"
> -#define CLOUSEAU_TREE_DATA_STR "CLOUSEAU_TREE_DATA"
> -#define CLOUSEAU_APP_CLOSED_STR "CLOUSEAU_APP_CLOSED"
> -#define CLOUSEAU_HIGHLIGHT_STR "CLOUSEAU_HIGHLIGHT"
> -#define CLOUSEAU_BMP_REQ_STR "CLOUSEAU_BMP_REQ"
> -#define CLOUSEAU_BMP_DATA_STR "CLOUSEAU_BMP_DATA"
> +#define CLOUSEAU_APP_ADD_STR            "CLOUSEAU_APP_ADD"
> +#define CLOUSEAU_DATA_REQ_STR           "CLOUSEAU_DATA_REQ"
> +#define CLOUSEAU_TREE_DATA_STR          "CLOUSEAU_TREE_DATA"
> +#define CLOUSEAU_APP_CLOSED_STR         "CLOUSEAU_APP_CLOSED"
> +#define CLOUSEAU_HIGHLIGHT_STR          "CLOUSEAU_HIGHLIGHT"
> +#define CLOUSEAU_BMP_REQ_STR            "CLOUSEAU_BMP_REQ"
> +#define CLOUSEAU_BMP_DATA_STR           "CLOUSEAU_BMP_DATA"
>
>  /* Private function */
>  #define CLOUSEAU_APP_ADD_ENTRY   "clouseau/app"
> @@ -26,6 +27,16 @@
>  #define CLOUSEAU_BMP_LIST_ENTRY  "clouseau/app/shot_list"
>  #define CLOUSEAU_BMP_DATA_ENTRY  "clouseau/app/screenshot"
>
> +/* START - EO EET defs */
> +#define EO_DBG_INFO_TYPE_UNKNOWN_STR      "EO_DBG_INFO_TYPE_UNKNOWN"
> +#define EO_DBG_INFO_TYPE_STRING_STR       "EO_DBG_INFO_TYPE_STRING"
> +#define EO_DBG_INFO_TYPE_INT_STR          "EO_DBG_INFO_TYPE_INT"
> +#define EO_DBG_INFO_TYPE_BOOL_STR         "EO_DBG_INFO_TYPE_BOOL"
> +#define EO_DBG_INFO_TYPE_PTR_STR          "EO_DBG_INFO_TYPE_PTR"
> +#define EO_DBG_INFO_TYPE_DOUBLE_STR       "EO_DBG_INFO_TYPE_DOUBLE"
> +#define EO_DBG_INFO_TYPE_LIST_STR         "EO_DBG_INFO_TYPE_LIST"
> +/* END   - EO EET defs */
> +
>  struct _connect_st
>  {  /* This will be used for APP, GUI client connect */
>     unsigned int pid;
> @@ -129,6 +140,64 @@
>  };
>  typedef struct _data_desc data_desc;
>
> +/* START - EO - debug structs */
> +struct _Clouseau_st_string
> +{
> +   const char *s;
> +};
> +
> +struct _Clouseau_st_int
> +{
> +   int i;
> +};
> +
> +struct _Clouseau_st_bool
> +{
> +   Eina_Bool b;
> +};
> +
> +struct _Clouseau_st_ptr
> +{
> +   unsigned long long p;  /* For pointer value */
> +};
> +
> +struct _Clouseau_st_double
> +{
> +   double d;
> +};
> +
> +struct _Clouseau_st_dbg_list
> +{
> +   Eina_List *list;  /* Sub-List of (Eo_Dbg_Info *) if needed */
> +};
> +
> +/* START - EO - debug structs */
> +typedef struct _Clouseau_st_string Clouseau_st_string;
> +typedef struct _Clouseau_st_int Clouseau_st_int;
> +typedef struct _Clouseau_st_bool Clouseau_st_bool;
> +typedef struct _Clouseau_st_ptr Clouseau_st_ptr;
> +typedef struct _Clouseau_st_double Clouseau_st_double;
> +typedef struct _Clouseau_st_dbg_list Clouseau_st_dbg_list;
> +typedef struct _Clouseau_Eo_Dbg_Info Clouseau_Eo_Dbg_Info;
> +/* END   - EO - debug structs */
> +
> +struct _Clouseau_Eo_Dbg_Info
> +{  /* Debug info composed of a list of Eo_Dbg_Info */
> +   const char *name;
> +   Eo_Dbg_Info_Type type;
> +
> +   union _un_dbg_info
> +     {
> +        Clouseau_st_string text;
> +        Clouseau_st_int intg;
> +        Clouseau_st_bool bl;
> +        Clouseau_st_ptr ptr;
> +        Clouseau_st_double dbl;
> +        Clouseau_st_dbg_list dbg; /* Sub-List of (Eo_Dbg_Info *) if
> needed */
> +     } un_dbg_info;
> +};
> +/* END   - EO - debug structs */
> +
>  /* Exported From Object information */
>  EAPI void clouseau_object_information_free(Clouseau_Object *oinfo);
>  EAPI Clouseau_Object * clouseau_object_information_get(Clouseau_Tree_Item
> *treeit);
>
>
>
> ------------------------------------------------------------------------------
> Master Visual Studio, SharePoint, SQL, ASP.NET, C# 2012, HTML5, CSS,
> MVC, Windows 8 Apps, JavaScript and much more. Keep your skills current
> with LearnDevNow - 3,200 step-by-step video tutorials by Microsoft
> MVPs and experts. ON SALE this month only -- learn more at:
> http://p.sf.net/sfu/learnnow-d2d
> _______________________________________________
> enlightenment-svn mailing list
> enlightenment-...@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/enlightenment-svn
>
------------------------------------------------------------------------------
Free Next-Gen Firewall Hardware Offer
Buy your Sophos next-gen firewall before the end March 2013 
and get the hardware for free! Learn more.
http://p.sf.net/sfu/sophos-d2d-feb
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to