evas: cleanup intercept code and improve performance there a little.

This commit is contained in:
Cedric Bail 2013-08-29 10:53:48 +09:00
parent 62a759de43
commit 85f0749a83
5 changed files with 89 additions and 145 deletions

View File

@ -374,7 +374,7 @@ _clip_unset(Eo *eo_obj, void *_pd, va_list *list EINA_UNUSED)
obj->clip.cache_clipees_answer = eina_list_free(obj->clip.cache_clipees_answer);
/* unclip */
if (evas_object_intercept_call_clip_unset(eo_obj)) return;
if (evas_object_intercept_call_clip_unset(eo_obj, obj)) return;
if (obj->is_smart)
{
eo_do(eo_obj, evas_obj_smart_clip_unset());

View File

@ -193,7 +193,7 @@ _layer_set(Eo *eo_obj, void *_obj, va_list *list)
Evas_Object_Protected_Data *obj = _obj;
if (obj->delete_me) return;
if (evas_object_intercept_call_layer_set(eo_obj, l)) return;
if (evas_object_intercept_call_layer_set(eo_obj, obj, l)) return;
if (obj->smart.parent) return;
if (obj->cur->layer == l)
{

View File

@ -45,137 +45,77 @@ evas_object_intercept_cleanup(Evas_Object *eo_obj)
if (obj->interceptors) free(obj->interceptors);
}
int
evas_object_intercept_call_show(Evas_Object *eo_obj)
{
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJ_CLASS);
int ret;
#define EVAS_OBJECT_INTERCEPT_CALL_SIMPLE(Type) \
int \
evas_object_intercept_call_##Type(Evas_Object *eo_obj, \
Evas_Object_Protected_Data *obj) \
{ \
int ret; \
\
if (!obj->interceptors) return 0; \
if (obj->intercepted) return 0; \
obj->intercepted = EINA_TRUE; \
ret = !!(obj->interceptors->Type.func); \
if (ret) \
obj->interceptors->Type.func(obj->interceptors->Type.data, eo_obj); \
obj->intercepted = EINA_FALSE; \
return ret; \
}
if (!obj->interceptors) return 0;
if (obj->intercepted) return 0;
obj->intercepted = EINA_TRUE;
ret = !!(obj->interceptors->show.func);
if (ret)
obj->interceptors->show.func(obj->interceptors->show.data, eo_obj);
obj->intercepted = EINA_FALSE;
return ret;
}
EVAS_OBJECT_INTERCEPT_CALL_SIMPLE(show);
EVAS_OBJECT_INTERCEPT_CALL_SIMPLE(hide);
EVAS_OBJECT_INTERCEPT_CALL_SIMPLE(raise);
EVAS_OBJECT_INTERCEPT_CALL_SIMPLE(lower);
#define EVAS_OBJECT_INTERCEPT_CALL_GEOMETRY(Type) \
int \
evas_object_intercept_call_##Type(Evas_Object *eo_obj, \
Evas_Object_Protected_Data *obj, \
Evas_Coord a, Evas_Coord b) \
{ \
int ret; \
\
if (!obj->interceptors) return 0; \
if (obj->intercepted) return 0; \
obj->intercepted = EINA_TRUE; \
ret = !!(obj->interceptors->Type.func); \
if (ret) \
obj->interceptors->Type.func(obj->interceptors->Type.data, \
eo_obj, a , b); \
obj->intercepted = EINA_FALSE; \
return ret; \
}
EVAS_OBJECT_INTERCEPT_CALL_GEOMETRY(move);
EVAS_OBJECT_INTERCEPT_CALL_GEOMETRY(resize);
#define EVAS_OBJECT_INTERCEPT_CALL_STACKING(Type) \
int \
evas_object_intercept_call_##Type(Evas_Object *eo_obj, \
Evas_Object_Protected_Data *obj, \
Evas_Object *rel_to) \
{ \
int ret; \
\
if (!obj->interceptors) return 0; \
if (obj->intercepted) return 0; \
obj->intercepted = EINA_TRUE; \
ret = !!(obj->interceptors->Type.func); \
if (ret) \
obj->interceptors->Type.func(obj->interceptors->Type.data, \
eo_obj, rel_to); \
obj->intercepted = EINA_FALSE; \
return ret; \
}
EVAS_OBJECT_INTERCEPT_CALL_STACKING(stack_above);
EVAS_OBJECT_INTERCEPT_CALL_STACKING(stack_below);
int
evas_object_intercept_call_hide(Evas_Object *eo_obj)
evas_object_intercept_call_layer_set(Evas_Object *eo_obj,
Evas_Object_Protected_Data *obj,
int l)
{
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJ_CLASS);
int ret;
if (!obj->interceptors) return 0;
if (obj->intercepted) return 0;
obj->intercepted = EINA_TRUE;
ret = !!(obj->interceptors->hide.func);
if (ret)
obj->interceptors->hide.func(obj->interceptors->hide.data, eo_obj);
obj->intercepted = EINA_FALSE;
return ret;
}
int
evas_object_intercept_call_move(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj, Evas_Coord x, Evas_Coord y)
{
int ret;
if (!obj->interceptors) return 0;
if (obj->intercepted) return 0;
obj->intercepted = EINA_TRUE;
ret = !!(obj->interceptors->move.func);
if (ret)
obj->interceptors->move.func(obj->interceptors->move.data, eo_obj, x, y);
obj->intercepted = EINA_FALSE;
return ret;
}
int
evas_object_intercept_call_resize(Evas_Object *eo_obj, Evas_Coord w, Evas_Coord h)
{
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJ_CLASS);
int ret;
if (!obj->interceptors) return 0;
if (obj->intercepted) return 0;
obj->intercepted = EINA_TRUE;
ret = !!(obj->interceptors->resize.func);
if (ret)
obj->interceptors->resize.func(obj->interceptors->resize.data, eo_obj, w, h);
obj->intercepted = EINA_FALSE;
return ret;
}
int
evas_object_intercept_call_raise(Evas_Object *eo_obj)
{
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJ_CLASS);
int ret;
if (!obj->interceptors) return 0;
if (obj->intercepted) return 0;
obj->intercepted = EINA_TRUE;
ret = !!(obj->interceptors->raise.func);
if (ret)
obj->interceptors->raise.func(obj->interceptors->raise.data, eo_obj);
obj->intercepted = EINA_FALSE;
return ret;
}
int
evas_object_intercept_call_lower(Evas_Object *eo_obj)
{
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJ_CLASS);
int ret;
if (!obj->interceptors) return 0;
if (obj->intercepted) return 0;
obj->intercepted = EINA_TRUE;
ret = !!(obj->interceptors->lower.func);
if (ret)
obj->interceptors->lower.func(obj->interceptors->lower.data, eo_obj);
obj->intercepted = EINA_FALSE;
return ret;
}
int
evas_object_intercept_call_stack_above(Evas_Object *eo_obj, Evas_Object *above)
{
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJ_CLASS);
int ret;
if (!obj->interceptors) return 0;
if (obj->intercepted) return 0;
obj->intercepted = EINA_TRUE;
ret = !!(obj->interceptors->stack_above.func);
if (ret)
obj->interceptors->stack_above.func(obj->interceptors->stack_above.data, eo_obj, above);
obj->intercepted = EINA_FALSE;
return ret;
}
int
evas_object_intercept_call_stack_below(Evas_Object *eo_obj, Evas_Object *below)
{
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJ_CLASS);
int ret;
if (!obj->interceptors) return 0;
if (obj->intercepted) return 0;
obj->intercepted = EINA_TRUE;
ret = !!(obj->interceptors->stack_below.func);
if (ret)
obj->interceptors->stack_below.func(obj->interceptors->stack_below.data, eo_obj, below);
obj->intercepted = EINA_FALSE;
return ret;
}
int
evas_object_intercept_call_layer_set(Evas_Object *eo_obj, int l)
{
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJ_CLASS);
int ret;
if (!obj->interceptors) return 0;
@ -189,9 +129,10 @@ evas_object_intercept_call_layer_set(Evas_Object *eo_obj, int l)
}
int
evas_object_intercept_call_color_set(Evas_Object *eo_obj, int r, int g, int b, int a)
evas_object_intercept_call_color_set(Evas_Object *eo_obj,
Evas_Object_Protected_Data *obj,
int r, int g, int b, int a)
{
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJ_CLASS);
int ret;
if (!obj->interceptors) return 0;
@ -220,9 +161,8 @@ evas_object_intercept_call_clip_set(Evas_Object *eo_obj, Evas_Object_Protected_D
}
int
evas_object_intercept_call_clip_unset(Evas_Object *eo_obj)
evas_object_intercept_call_clip_unset(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj)
{
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJ_CLASS);
int ret;
if (!obj->interceptors) return 0;

View File

@ -792,7 +792,7 @@ _size_set(Eo *eo_obj, void *_pd, va_list *list)
if (!obj->layer) return;
if (w < 0) w = 0; if (h < 0) h = 0;
if (evas_object_intercept_call_resize(eo_obj, w, h)) return;
if (evas_object_intercept_call_resize(eo_obj, obj, w, h)) return;
if (obj->doing.in_resize > 0)
{
@ -1373,7 +1373,7 @@ _show(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj)
{
if (!obj->layer) return;
if (obj->delete_me) return;
if (evas_object_intercept_call_show(eo_obj)) return;
if (evas_object_intercept_call_show(eo_obj, obj)) return;
if (obj->is_smart)
{
eo_do(eo_obj, evas_obj_smart_show());
@ -1422,7 +1422,7 @@ _hide(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj)
MAGIC_CHECK_END();
if (!obj->layer) return;
if (obj->delete_me) return;
if (evas_object_intercept_call_hide(eo_obj)) return;
if (evas_object_intercept_call_hide(eo_obj, obj)) return;
if (obj->is_smart)
{
eo_do(eo_obj, evas_obj_smart_hide());
@ -1580,7 +1580,7 @@ _color_set(Eo *eo_obj, void *_pd, va_list *list)
ERR("Evas only handles pre multiplied colors!");
}
if (evas_object_intercept_call_color_set(eo_obj, r, g, b, a)) return;
if (evas_object_intercept_call_color_set(eo_obj, obj, r, g, b, a)) return;
if (obj->is_smart)
{
eo_do(eo_obj, evas_obj_smart_color_set(r, g, b, a));

View File

@ -49,9 +49,10 @@ evas_object_raise(Evas_Object *eo_obj)
void
_raise(Eo *eo_obj, void *_pd, va_list *list EINA_UNUSED)
{
if (evas_object_intercept_call_raise(eo_obj)) return;
Evas_Object_Protected_Data *obj = _pd;
if (evas_object_intercept_call_raise(eo_obj, obj)) return;
if (!((EINA_INLIST_GET(obj))->next))
{
evas_object_inform_call_restack(eo_obj);
@ -105,9 +106,10 @@ evas_object_lower(Evas_Object *eo_obj)
void
_lower(Eo *eo_obj, void *_pd, va_list *list EINA_UNUSED)
{
if (evas_object_intercept_call_lower(eo_obj)) return;
Evas_Object_Protected_Data *obj = _pd;
if (evas_object_intercept_call_lower(eo_obj, obj)) return;
if (!((EINA_INLIST_GET(obj))->prev))
{
evas_object_inform_call_restack(eo_obj);
@ -162,16 +164,17 @@ evas_object_stack_above(Evas_Object *eo_obj, Evas_Object *above)
void
_stack_above(Eo *eo_obj, void *_pd, va_list *list)
{
Evas_Object_Protected_Data *obj = _pd;
Evas_Object *eo_above = va_arg(*list, Evas_Object *);
if (!eo_above) return;
if (eo_obj == eo_above) return;
if (evas_object_intercept_call_stack_above(eo_obj, eo_above)) return;
if (evas_object_intercept_call_stack_above(eo_obj, obj, eo_above)) return;
if (!eo_above)
{
evas_object_raise(eo_obj);
return;
}
Evas_Object_Protected_Data *obj = _pd;
Evas_Object_Protected_Data *above = eo_data_scope_get(eo_above, EVAS_OBJ_CLASS);
if ((EINA_INLIST_GET(obj))->prev == EINA_INLIST_GET(above))
{
@ -250,15 +253,16 @@ void
_stack_below(Eo *eo_obj, void *_pd, va_list *list)
{
Evas_Object *eo_below = va_arg(*list, Evas_Object *);
Evas_Object_Protected_Data *obj = _pd;
if (!eo_below) return;
if (eo_obj == eo_below) return;
if (evas_object_intercept_call_stack_below(eo_obj, eo_below)) return;
if (evas_object_intercept_call_stack_below(eo_obj, obj, eo_below)) return;
if (!eo_below)
{
evas_object_lower(eo_obj);
return;
}
Evas_Object_Protected_Data *obj = _pd;
Evas_Object_Protected_Data *below = eo_data_scope_get(eo_below, EVAS_OBJ_CLASS);
if ((EINA_INLIST_GET(obj))->next == EINA_INLIST_GET(below))
{