Edje smart object是如何定义的?
来源:互联网 发布:淘宝杰斯伯官方旗舰店 编辑:程序博客网 时间:2024/06/12 20:21
Edje_private.h:
typedef struct _Edje_Smart_Api Edje_Smart_Api;
struct _Edje_Smart_Api
{
Evas_Smart_Class base;
int version;
Eina_Bool (*file_set)(Evas_Object *obj, const char *file, const char *group);
};
/* Basic macro to init the Edje Smart API */
#define EDJE_SMART_API_INIT(smart_class_init) {smart_class_init, EDJE_SMART_API_VERSION, NULL}
#define EDJE_SMART_API_INIT_NULL EDJE_SMART_API_INIT(EVAS_SMART_CLASS_INIT_NULL)
#define EDJE_SMART_API_INIT_VERSION EDJE_SMART_API_INIT(EVAS_SMART_CLASS_INIT_VERSION)
#define EDJE_SMART_API_INIT_NAME_VERSION(name) EDJE_SMART_API_INIT(EVAS_SMART_CLASS_INIT_NAME_VERSION(name))
在edje_smart.c中开始进行定义,这里的API是私有的,公共的,将来为所有的edje object服务:
static Edje_Smart_Api _edje_smart_class = EDJE_SMART_API_INIT_NAME_VERSION("edje");
//很简单的一句话,定义这样一个结构变量
展开它:
Static Edje_Smart_Api _edje_smart_class =
{
{
edje, // evas smart class name
EVAS_SMART_CLASS_VERSION, //1
NULL, // add 函数初始化
NULL, // del
NULL, // move
NULL, // resize
NULL, // show
NULL, // hide
NULL, // color_set
NULL, // clip_set
NULL, // clip_unset
NULL, // calculate
NULL, // member_add
NULL, // member_del
NULL, // parent
NULL, // callbacks
NULL, // interfaces
NULL, // data
},
EDJE_SMART_API_VERSION, //
NULL // file_set
};
然后定义一个smart:
static Evas_Smart *_edje_smart = NULL;
这个smart 会用到上面定义的一系列的私有APIs
然后定义一个链表:这个链表很重要,在程序中定义的object, 以及EDC中自定义的所有object, 都会挂到这个链表上面。
Eina_List *_edje_edjes = NULL;
当在一个进程中,第一次调用下面这个函数时,会把前面的全局API给填充一下:
EAPI Evas_Object *
edje_object_add(Evas *evas)
{
if (!_edje_smart)
{
_edje_object_smart_set(&_edje_smart_class); //把edje自己的一组API给填充进去 (参考A)
_edje_smart = evas_smart_class_new((Evas_Smart_Class *)&_edje_smart_class); //分配一块内存给_edje_smart, 同时把上面的一组API绑定给这个_edje_smart
}
return evas_object_smart_add(evas, _edje_smart); //在evas舞台上面,创建一个新的evas smart object, 同时给这个smart object赋予一定的edje自己提供的,定制的API集。
}
A: 填充好后的全局_edje_smart_class这组函数是:
_edje_smart_class =
{
{
edje, // evas smart class name
EVAS_SMART_CLASS_VERSION, //1
_edje_smart_add, // add 函数初始化
_edje_smart_del, // del
_edje_smart_move, // move
_edje_smart_resize, // resize
_edje_smart_show, // show
_edje_smart_hide, // hide
_edje_smart_color_set, // color_set
_edje_smart_clip_set, // clip_set
_edje_smart_clip_unset, // clip_unset
_edje_smart_calculate, // calculate
NULL, // member_add
NULL, // member_del
NULL, // parent
NULL, // callbacks
NULL, // interfaces
NULL, // data
},
EDJE_SMART_API_VERSION, //
_edje_smart_file_set// file_set
};
EAPI Evas_Object *
evas_object_smart_add(Evas *e, Evas_Smart *s)
{
Evas_Object *obj;
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return NULL;
MAGIC_CHECK_END();
MAGIC_CHECK(s, Evas_Smart, MAGIC_SMART);
return NULL;
MAGIC_CHECK_END();
obj = evas_object_new(e); //在evas上面创建一个object,
if (!obj) return NULL;
obj->smart.smart = s; //这个object就有灵性了: 绑定用户定制的API集,这里是edje的API集合
obj->type = s->smart_class->name; //edje
evas_object_smart_init(obj); //初始化一些数据,同时给这个object再绑定一些evas_object所提供的基础API集合:参考B
evas_object_inject(obj, e); // 把这个smart object放到Evas的layer上面
evas_object_smart_use(s);
if (s->smart_class->add) s->smart_class->add(obj); //调用edje提供的API集合中的add函数:_edje_smart_add, 参考C:
return obj;
}
B:
static const Evas_Object_Func object_func =
{
/* methods (compulsory) */
evas_object_smart_free,
evas_object_smart_render,
evas_object_smart_render_pre,
evas_object_smart_render_post,
evas_object_smart_id_get,
evas_object_smart_visual_id_get,
evas_object_smart_engine_data_get,
/* these are optional. NULL = nothing */
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL
};
C:
static void
_edje_smart_add(Evas_Object *obj)
{
Edje *ed;
ed = evas_object_smart_data_get(obj);
if (!ed)
{
const Evas_Smart *smart;
const Evas_Smart_Class *sc;
ed = calloc(1, sizeof(Edje));
if (!ed) return;
smart = evas_object_smart_smart_get(obj);
sc = evas_smart_class_get(smart);
ed->api = (const Edje_Smart_Api *)sc;
evas_object_smart_data_set(obj, ed);
}
ed->evas = evas_object_evas_get(obj);
ed->clipper = evas_object_rectangle_add(ed->evas);
evas_object_static_clip_set(ed->clipper, 1);
evas_object_smart_member_add(ed->clipper, obj);
evas_object_color_set(ed->clipper, 255, 255, 255, 255);
evas_object_move(ed->clipper, -10000, -10000);
evas_object_resize(ed->clipper, 20000, 20000);
evas_object_pass_events_set(ed->clipper, 1);
ed->have_objects = 1;
ed->references = 1;
evas_object_geometry_get(obj, &(ed->x), &(ed->y), &(ed->w), &(ed->h));
ed->obj = obj;
_edje_edjes = eina_list_append(_edje_edjes, obj); //把evas smart object: edje放到一个全局链表中保持;
/*
{
Eina_List *l;
const void *data;
printf("--- EDJE DUMP [%i]/n", eina_list_count(_edje_edjes));
EINA_LIST_FOREACH(_edge_edges, l, data)
{
ed = _edje_fetch(data);
printf("EDJE: %80s | %80s/n", ed->path, ed->part);
}
printf("--- EDJE DUMP [%i]/n", eina_list_count(_edje_edjes));
}
*/
}
- Edje smart object是如何定义的?
- Evas, Smart Objects and Edje 之间的关系(图示)
- PHP_VERSION_ID是如何定义的
- 频谱效率是如何定义的
- 类是如何定义出来的
- 原来Smart Client 是这样的
- 原来Smart Client 是这样的
- java.lang.Object是如何成为默认父类的
- 转:Object-C 消息函数是如何工作的?
- java.lang.Object是如何成为默认父类的
- java.lang.Object是如何成为默认父类的
- SMART目标定义原则
- 如何更好的做计划-SMART原则
- php的老兄传给客户端[object object]数据如何解析,但他坚称是json...
- 如何判断定义的 Use Case 是有用的
- map和reduce的数量是如何定义的
- Revit 里面角度的正方向是如何定义的
- Object C 类的定义
- Qt-VS2008-MySQL驱动编译
- [Android]替换系统的Lock Screen
- Erlang开发建议
- 常用到的Linux编程库
- 进程是准虚拟化的虚拟机—容器虚拟化的原理
- Edje smart object是如何定义的?
- 动态链接库dll,静态链接库lib, 导入库lib
- 索尼遭遇“黑客门” 1000万用户信用卡遭泄漏
- 启用父路径对网站安全的详实介绍
- jquery实现城市三级数据联动的实例
- 演示继承的构造函数执行顺序
- 8年PHP,懂点内核, 能写PHP扩展,5年网站经历+3年webgame经历,找个兼职
- 命令行创建用户
- 面向对象设计的SOLID原则