clouseau/src/lib/clouseau_object_information.c

374 lines
15 KiB
C

#include "clouseau_private.h"
EAPI void
clouseau_object_information_free(Clouseau_Object *oinfo)
{
if (!oinfo)
return;
eina_stringshare_del(oinfo->evas_props.name);
eina_stringshare_del(oinfo->evas_props.bt);
if (oinfo->evas_props.points)
free(oinfo->evas_props.points);
switch (oinfo->extra_props.type)
{
case CLOUSEAU_OBJ_TYPE_ELM:
eina_stringshare_del(oinfo->extra_props.u.elm.type);
eina_stringshare_del(oinfo->extra_props.u.elm.style);
break;
case CLOUSEAU_OBJ_TYPE_TEXT:
eina_stringshare_del(oinfo->extra_props.u.text.font);
eina_stringshare_del(oinfo->extra_props.u.text.source);
eina_stringshare_del(oinfo->extra_props.u.text.text);
break;
case CLOUSEAU_OBJ_TYPE_IMAGE:
eina_stringshare_del(oinfo->extra_props.u.image.file);
eina_stringshare_del(oinfo->extra_props.u.image.key);
eina_stringshare_del(oinfo->extra_props.u.image.load_err);
break;
case CLOUSEAU_OBJ_TYPE_EDJE:
eina_stringshare_del(oinfo->extra_props.u.edje.file);
eina_stringshare_del(oinfo->extra_props.u.edje.group);
eina_stringshare_del(oinfo->extra_props.u.edje.load_err);
break;
case CLOUSEAU_OBJ_TYPE_TEXTBLOCK:
eina_stringshare_del(oinfo->extra_props.u.textblock.style);
eina_stringshare_del(oinfo->extra_props.u.textblock.text);
break;
case CLOUSEAU_OBJ_TYPE_UNKNOWN:
case CLOUSEAU_OBJ_TYPE_OTHER:
break;
default:
break;
}
free(oinfo);
}
static void
_clouseau_eo_from_legacy_convert_helper(Efl_Dbg_Info *new_root, Clouseau_Efl_Dbg_Info *root)
{
switch (root->type)
{
case CLOUSEAU_DBG_INFO_TYPE_STRING:
EFL_DBG_INFO_APPEND(new_root, root->name, EINA_VALUE_TYPE_STRING, root->un_dbg_info.text.s);
break;
case CLOUSEAU_DBG_INFO_TYPE_INT:
EFL_DBG_INFO_APPEND(new_root, root->name, EINA_VALUE_TYPE_INT, root->un_dbg_info.intg.i);
break;
case CLOUSEAU_DBG_INFO_TYPE_BOOL:
EFL_DBG_INFO_APPEND(new_root, root->name, EINA_VALUE_TYPE_CHAR, root->un_dbg_info.bl.b);
break;
case CLOUSEAU_DBG_INFO_TYPE_PTR:
EFL_DBG_INFO_APPEND(new_root, root->name, EINA_VALUE_TYPE_UINT64, root->un_dbg_info.ptr.p);
break;
case CLOUSEAU_DBG_INFO_TYPE_DOUBLE:
EFL_DBG_INFO_APPEND(new_root, root->name, EINA_VALUE_TYPE_DOUBLE, root->un_dbg_info.dbl.d);
break;
case CLOUSEAU_DBG_INFO_TYPE_LIST:
{
Eina_List *l;
Clouseau_Efl_Dbg_Info *eo;
new_root = EFL_DBG_INFO_LIST_APPEND(new_root, root->name);
EINA_LIST_FOREACH(root->un_dbg_info.dbg.list, l, eo)
_clouseau_eo_from_legacy_convert_helper(new_root, eo);
}
break;
default:
// FIXME
printf("Oops, wrong type.\n");
break;
}
}
EAPI void
clouseau_tree_item_from_legacy_convert(Clouseau_Tree_Item *treeit)
{
if (!treeit->eo_info)
return;
Eina_List *root = treeit->eo_info;
Efl_Dbg_Info *new_root = NULL;
Eina_List *l;
Clouseau_Efl_Dbg_Info *eo;
new_root = EFL_DBG_INFO_LIST_APPEND(NULL, "");
EINA_LIST_FOREACH(root, l, eo)
{
_clouseau_eo_from_legacy_convert_helper(new_root, eo);
clouseau_eo_info_free(eo);
}
eina_list_free(treeit->eo_info);
treeit->eo_info = NULL;
treeit->new_eo_info = new_root;
}
static Clouseau_Dbg_Info_Type
_clouseau_eina_value_type_to_clouseau_type(const Eina_Value_Type *type)
{
if (type == EINA_VALUE_TYPE_STRING)
return CLOUSEAU_DBG_INFO_TYPE_STRING;
else if (type == EINA_VALUE_TYPE_INT)
return CLOUSEAU_DBG_INFO_TYPE_INT;
else if (type == EINA_VALUE_TYPE_CHAR)
return CLOUSEAU_DBG_INFO_TYPE_BOOL;
else if (type == EINA_VALUE_TYPE_UINT64)
return CLOUSEAU_DBG_INFO_TYPE_PTR;
else if (type == EINA_VALUE_TYPE_DOUBLE)
return CLOUSEAU_DBG_INFO_TYPE_DOUBLE;
else if (type == EINA_VALUE_TYPE_LIST)
return CLOUSEAU_DBG_INFO_TYPE_LIST;
return CLOUSEAU_DBG_INFO_TYPE_UNKNOWN;
}
/* This function converts a list of Efl_Dbg_Info
* to a list of Clouseau_Efl_Dbg_Info.
* This is required because we would like to keep the def of
* Efl_Dbg_Info in EO code. Thus, avoiding API/ABI error if user
* does not do a full update of Clouseau and EO */
EAPI Eina_List *
clouseau_eo_to_legacy_convert(Efl_Dbg_Info *root)
{
Eina_List *l;
Eina_List *new_list = NULL;
Efl_Dbg_Info *eo;
if (!root && (eina_value_type_get(&(root->value)) != EINA_VALUE_TYPE_LIST))
return new_list;
Eina_Value_List root_list;
eina_value_pget(&(root->value), &root_list);
EINA_LIST_FOREACH(root_list.list, l, eo)
{
Clouseau_Efl_Dbg_Info *info = calloc(1, sizeof(*info));
info->type = _clouseau_eina_value_type_to_clouseau_type(
eina_value_type_get(&(eo->value)));
info->name = eina_stringshare_add(eo->name);
switch (info->type)
{
case CLOUSEAU_DBG_INFO_TYPE_STRING:
{
const char *tmp;
eina_value_get(&(eo->value), &tmp);
info->un_dbg_info.text.s = eina_stringshare_add(tmp);
}
break;
case CLOUSEAU_DBG_INFO_TYPE_INT:
eina_value_get(&(eo->value), &(info->un_dbg_info.intg.i));
break;
case CLOUSEAU_DBG_INFO_TYPE_BOOL:
eina_value_get(&(eo->value), &(info->un_dbg_info.bl.b));
break;
case CLOUSEAU_DBG_INFO_TYPE_PTR:
{
uint64_t tmp;
eina_value_get(&(eo->value), &tmp);
info->un_dbg_info.ptr.p = tmp;
}
break;
case CLOUSEAU_DBG_INFO_TYPE_DOUBLE:
eina_value_get(&(eo->value), &(info->un_dbg_info.dbl.d));
break;
case CLOUSEAU_DBG_INFO_TYPE_LIST:
info->un_dbg_info.dbg.list =
clouseau_eo_to_legacy_convert(eo);
break;
default:
// FIXME
printf("Oops, wrong type.\n");
break;
}
new_list = eina_list_append(new_list, info);
}
return new_list;
}
static const struct {
const char *text;
Evas_Object_Pointer_Mode mode;
} pointer_mode[3] = {
# define POINTER_MODE(Value) { #Value, Value }
POINTER_MODE(EVAS_OBJECT_POINTER_MODE_AUTOGRAB),
POINTER_MODE(EVAS_OBJECT_POINTER_MODE_NOGRAB),
POINTER_MODE(EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN)
# undef POINTER_MODE
};
static const struct {
Clouseau_Object_Type type;
const char *name;
} _clouseau_types[] = {
{ CLOUSEAU_OBJ_TYPE_ELM, "Elementary" },
{ CLOUSEAU_OBJ_TYPE_TEXT, "Text" },
{ CLOUSEAU_OBJ_TYPE_IMAGE, "Image" },
{ CLOUSEAU_OBJ_TYPE_EDJE, "Edje" },
{ CLOUSEAU_OBJ_TYPE_TEXTBLOCK, "Textblock" }
};
EAPI void
clouseau_object_information_list_populate(Clouseau_Tree_Item *treeit)
{
Clouseau_Object *oinfo;
char buf[1024];
unsigned int i;
if (!treeit->is_obj)
return;
oinfo = treeit->info;
/* This code is here only for backward compatibility and will be removed soon */
if (!treeit->eo_info && !treeit->new_eo_info)
{
Efl_Dbg_Info *root = EFL_DBG_INFO_LIST_APPEND(NULL, "");
/* Populate evas properties list */
Efl_Dbg_Info *group = EFL_DBG_INFO_LIST_APPEND(root, "Evas");
Efl_Dbg_Info *node;
EFL_DBG_INFO_APPEND(group, "Visibility", EINA_VALUE_TYPE_CHAR, oinfo->evas_props.is_visible);
EFL_DBG_INFO_APPEND(group, "Layer", EINA_VALUE_TYPE_INT, oinfo->evas_props.layer);
node = EFL_DBG_INFO_LIST_APPEND(group, "Position");
EFL_DBG_INFO_APPEND(node, "x", EINA_VALUE_TYPE_INT, oinfo->evas_props.x);
EFL_DBG_INFO_APPEND(node, "y", EINA_VALUE_TYPE_INT, oinfo->evas_props.y);
node = EFL_DBG_INFO_LIST_APPEND(group, "Size");
EFL_DBG_INFO_APPEND(node, "w", EINA_VALUE_TYPE_INT, oinfo->evas_props.w);
EFL_DBG_INFO_APPEND(node, "h", EINA_VALUE_TYPE_INT, oinfo->evas_props.h);
EFL_DBG_INFO_APPEND(group, "Scale", EINA_VALUE_TYPE_DOUBLE, 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);
}
#endif
node = EFL_DBG_INFO_LIST_APPEND(group, "Min size");
EFL_DBG_INFO_APPEND(node, "w", EINA_VALUE_TYPE_INT, oinfo->evas_props.min_w);
EFL_DBG_INFO_APPEND(node, "h", EINA_VALUE_TYPE_INT, oinfo->evas_props.min_h);
node = EFL_DBG_INFO_LIST_APPEND(group, "Max size");
EFL_DBG_INFO_APPEND(node, "w", EINA_VALUE_TYPE_INT, oinfo->evas_props.max_w);
EFL_DBG_INFO_APPEND(node, "h", EINA_VALUE_TYPE_INT, oinfo->evas_props.max_h);
node = EFL_DBG_INFO_LIST_APPEND(group, "Request size");
EFL_DBG_INFO_APPEND(node, "w", EINA_VALUE_TYPE_INT, oinfo->evas_props.req_w);
EFL_DBG_INFO_APPEND(node, "h", EINA_VALUE_TYPE_INT, oinfo->evas_props.req_h);
node = EFL_DBG_INFO_LIST_APPEND(group, "Align");
EFL_DBG_INFO_APPEND(node, "w", EINA_VALUE_TYPE_DOUBLE, oinfo->evas_props.align_x);
EFL_DBG_INFO_APPEND(node, "h", EINA_VALUE_TYPE_DOUBLE, oinfo->evas_props.align_y);
node = EFL_DBG_INFO_LIST_APPEND(group, "Weight");
EFL_DBG_INFO_APPEND(node, "w", EINA_VALUE_TYPE_DOUBLE, oinfo->evas_props.weight_x);
EFL_DBG_INFO_APPEND(node, "h", EINA_VALUE_TYPE_DOUBLE, 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);
#endif
node = EFL_DBG_INFO_LIST_APPEND(group, "Color");
EFL_DBG_INFO_APPEND(node, "r", EINA_VALUE_TYPE_INT, oinfo->evas_props.r);
EFL_DBG_INFO_APPEND(node, "g", EINA_VALUE_TYPE_INT, oinfo->evas_props.g);
EFL_DBG_INFO_APPEND(node, "b", EINA_VALUE_TYPE_INT, oinfo->evas_props.b);
EFL_DBG_INFO_APPEND(node, "a", EINA_VALUE_TYPE_INT, oinfo->evas_props.a);
EFL_DBG_INFO_APPEND(group, "Has focus", EINA_VALUE_TYPE_CHAR, 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)
{
EFL_DBG_INFO_APPEND(group, "Pointer Mode", EINA_VALUE_TYPE_STRING, pointer_mode[i].text);
break;
}
EFL_DBG_INFO_APPEND(group, "Pass Events", EINA_VALUE_TYPE_CHAR, oinfo->evas_props.pass_events);
EFL_DBG_INFO_APPEND(group, "Repeat Events", EINA_VALUE_TYPE_CHAR, oinfo->evas_props.repeat_events);
EFL_DBG_INFO_APPEND(group, "Propagate Events", EINA_VALUE_TYPE_CHAR, oinfo->evas_props.propagate_events);
EFL_DBG_INFO_APPEND(group, "Has clipees", EINA_VALUE_TYPE_CHAR, oinfo->evas_props.is_clipper);
if (oinfo->evas_props.clipper)
{
snprintf(buf, sizeof(buf), "%llx", oinfo->evas_props.clipper);
EFL_DBG_INFO_APPEND(group, "Clipper", EINA_VALUE_TYPE_STRING, buf);
}
if (oinfo->evas_props.points_count)
{
node = EFL_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];
Efl_Dbg_Info *point = EFL_DBG_INFO_LIST_APPEND(node, "Coords");
EFL_DBG_INFO_APPEND(point, "x", EINA_VALUE_TYPE_INT, p->x);
EFL_DBG_INFO_APPEND(point, "y", EINA_VALUE_TYPE_INT, p->y);
EFL_DBG_INFO_APPEND(point, "z", EINA_VALUE_TYPE_INT, p->z);
}
}
if (oinfo->extra_props.type == CLOUSEAU_OBJ_TYPE_ELM)
{
group = EFL_DBG_INFO_LIST_APPEND(root, "Elm");
EFL_DBG_INFO_APPEND(group, "Wid-Type", EINA_VALUE_TYPE_STRING, 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
EFL_DBG_INFO_APPEND(group, "Style", EINA_VALUE_TYPE_STRING, oinfo->extra_props.u.elm.style);
EFL_DBG_INFO_APPEND(group, "Scale", EINA_VALUE_TYPE_DOUBLE, oinfo->extra_props.u.elm.scale);
EFL_DBG_INFO_APPEND(group, "Disabled", EINA_VALUE_TYPE_CHAR, oinfo->extra_props.u.elm.is_disabled);
EFL_DBG_INFO_APPEND(group, "Has focus", EINA_VALUE_TYPE_CHAR, oinfo->extra_props.u.elm.has_focus);
EFL_DBG_INFO_APPEND(group, "Mirrored", EINA_VALUE_TYPE_CHAR, oinfo->extra_props.u.elm.is_mirrored);
EFL_DBG_INFO_APPEND(group, "Automatic mirroring", EINA_VALUE_TYPE_CHAR, oinfo->extra_props.u.elm.is_mirrored_automatic);
}
else if (oinfo->extra_props.type == CLOUSEAU_OBJ_TYPE_TEXT)
{ /* EVAS_OBJ_TEXT_CLASS */
group = EFL_DBG_INFO_LIST_APPEND(root, "Text");
EFL_DBG_INFO_APPEND(group, "Font", EINA_VALUE_TYPE_STRING, oinfo->extra_props.u.text.font);
EFL_DBG_INFO_APPEND(group, "Size", EINA_VALUE_TYPE_INT, oinfo->extra_props.u.text.size);
EFL_DBG_INFO_APPEND(group, "Source", EINA_VALUE_TYPE_STRING, oinfo->extra_props.u.text.source);
EFL_DBG_INFO_APPEND(group, "Text", EINA_VALUE_TYPE_STRING, oinfo->extra_props.u.text.text);
}
else if (oinfo->extra_props.type == CLOUSEAU_OBJ_TYPE_IMAGE)
{ /* EVAS_OBJ_IMAGE_CLASS */
group = EFL_DBG_INFO_LIST_APPEND(root, "Image");
EFL_DBG_INFO_APPEND(group, "Filename", EINA_VALUE_TYPE_STRING, oinfo->extra_props.u.image.file);
EFL_DBG_INFO_APPEND(group, "File key", EINA_VALUE_TYPE_STRING, oinfo->extra_props.u.image.key);
EFL_DBG_INFO_APPEND(group, "Source", EINA_VALUE_TYPE_UINT64, oinfo->extra_props.u.image.source);
if (oinfo->extra_props.u.image.load_err)
EFL_DBG_INFO_APPEND(group, "Load error", EINA_VALUE_TYPE_STRING, oinfo->extra_props.u.image.load_err);
}
else if (oinfo->extra_props.type == CLOUSEAU_OBJ_TYPE_EDJE)
{ /* EDJE_OBJ_CLASS */
group = EFL_DBG_INFO_LIST_APPEND(root, "Edje");
EFL_DBG_INFO_APPEND(group, "File", EINA_VALUE_TYPE_STRING, oinfo->extra_props.u.edje.file);
EFL_DBG_INFO_APPEND(group, "Group", EINA_VALUE_TYPE_STRING, oinfo->extra_props.u.edje.group);
if (oinfo->extra_props.u.image.load_err)
EFL_DBG_INFO_APPEND(group, "Load error", EINA_VALUE_TYPE_STRING, oinfo->extra_props.u.edje.load_err);
}
else if (oinfo->extra_props.type == CLOUSEAU_OBJ_TYPE_TEXTBLOCK)
{ /* EVAS_OBJ_TEXTBLOCK_CLASS */
group = EFL_DBG_INFO_LIST_APPEND(root, "Text Block");
EFL_DBG_INFO_APPEND(group, "Style", EINA_VALUE_TYPE_STRING, oinfo->extra_props.u.textblock.style);
EFL_DBG_INFO_APPEND(group, "Text", EINA_VALUE_TYPE_STRING, oinfo->extra_props.u.textblock.text);
}
/* Convert Old format to Clouseau_eo */
treeit->new_eo_info = root;
}
}