informers now are just event callbacks. makes for a simpler api. interceptors

are done now too - when an interceptor is set it takes over from the actual
call it intercepts and now that call is responsible for doing the
move/resize/raise/lower etc. (method overriding)


SVN revision: 6490
This commit is contained in:
Carsten Haitzler 2002-12-15 00:33:57 +00:00
parent 72b9af03de
commit f837c83cc7
8 changed files with 593 additions and 407 deletions

View File

@ -15,7 +15,12 @@ enum _Evas_Callback_Type
EVAS_CALLBACK_KEY_DOWN, /**< Key Press Event */ EVAS_CALLBACK_KEY_DOWN, /**< Key Press Event */
EVAS_CALLBACK_KEY_UP, /**< Key Release Event */ EVAS_CALLBACK_KEY_UP, /**< Key Release Event */
EVAS_CALLBACK_FOCUS_IN, /**< Focus In Event */ EVAS_CALLBACK_FOCUS_IN, /**< Focus In Event */
EVAS_CALLBACK_FOCUS_OUT /**< Focus Out Event */ EVAS_CALLBACK_FOCUS_OUT, /**< Focus Out Event */
EVAS_CALLBACK_SHOW, /**< Show Event */
EVAS_CALLBACK_HIDE, /**< Hide Event */
EVAS_CALLBACK_MOVE, /**< Move Event */
EVAS_CALLBACK_RESIZE, /**< Resize Event */
EVAS_CALLBACK_RESTACK /**< Restack Event */
}; };
/** /**
@ -413,8 +418,6 @@ extern "C" {
void evas_event_feed_key_down (Evas *e, char *keyname); void evas_event_feed_key_down (Evas *e, char *keyname);
void evas_event_feed_key_up (Evas *e, char *keyname); void evas_event_feed_key_up (Evas *e, char *keyname);
* should we allow multiple objects to have the focus? good question!
void evas_object_focus_set (Evas_Object *o, int focus); void evas_object_focus_set (Evas_Object *o, int focus);
int evas_object_focus_get (Evas_Object *o); int evas_object_focus_get (Evas_Object *o);
@ -439,6 +442,9 @@ extern "C" {
void evas_key_lock_on (Evas *e, char *keyname); void evas_key_lock_on (Evas *e, char *keyname);
void evas_key_lock_off (Evas *e, char *keyname); void evas_key_lock_off (Evas *e, char *keyname);
int evas_object_key_grab (Evas_Object *o, char *keyname, int exclusive);
void evas_object_key_ungrab (Evas_Object *o, char *keyname);
* errr need to add key grabbing/ungrabbing calls. * errr need to add key grabbing/ungrabbing calls.
...end implement */ ...end implement */
@ -451,18 +457,6 @@ extern "C" {
void evas_object_event_callback_add (Evas_Object *obj, Evas_Callback_Type type, void (*func) (void *data, Evas *e, Evas_Object *obj, void *event_info), void *data); void evas_object_event_callback_add (Evas_Object *obj, Evas_Callback_Type type, void (*func) (void *data, Evas *e, Evas_Object *obj, void *event_info), void *data);
void *evas_object_event_callback_del (Evas_Object *obj, Evas_Callback_Type type, void (*func) (void *data, Evas *e, Evas_Object *obj, void *event_info)); void *evas_object_event_callback_del (Evas_Object *obj, Evas_Callback_Type type, void (*func) (void *data, Evas *e, Evas_Object *obj, void *event_info));
void evas_object_inform_show_callback_add (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data);
void *evas_object_inform_show_callback_del (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj));
void evas_object_inform_hide_callback_add (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data);
void *evas_object_inform_hide_callback_del (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj));
void evas_object_inform_move_callback_add (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data);
void *evas_object_inform_move_callback_del (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj));
void evas_object_inform_resize_callback_add (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data);
void *evas_object_inform_resize_callback_del (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj));
void evas_object_inform_restack_callback_add (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data);
void *evas_object_inform_restack_callback_del (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj));
/* FIXME: implement... */
void evas_object_intercept_show_callback_add (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data); void evas_object_intercept_show_callback_add (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data);
void *evas_object_intercept_show_callback_del (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj)); void *evas_object_intercept_show_callback_del (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj));
void evas_object_intercept_hide_callback_add (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data); void evas_object_intercept_hide_callback_add (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data);
@ -481,7 +475,6 @@ extern "C" {
void *evas_object_intercept_stack_below_callback_del (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Object *below)); void *evas_object_intercept_stack_below_callback_del (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Object *below));
void evas_object_intercept_layer_set_callback_add (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, int l), void *data); void evas_object_intercept_layer_set_callback_add (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, int l), void *data);
void *evas_object_intercept_layer_set_callback_del (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, int l)); void *evas_object_intercept_layer_set_callback_del (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, int l));
/* ...end implement */
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -2,6 +2,43 @@
#include "evas_private.h" #include "evas_private.h"
#include "Evas.h" #include "Evas.h"
static void evas_object_event_callback_list_free(Evas_Object_List **list);
static void
evas_object_event_callback_list_free(Evas_Object_List **list)
{
/* MEM OK */
while (*list)
{
Evas_Func_Node *fn;
fn = (Evas_Func_Node *)(*list);
*list = evas_object_list_remove(*list, fn);
free(fn);
}
}
void
evas_object_event_callback_cleanup(Evas_Object *obj)
{
/* MEM OK */
evas_object_event_callback_list_free(&(obj->callbacks.in));
evas_object_event_callback_list_free(&(obj->callbacks.out));
evas_object_event_callback_list_free(&(obj->callbacks.down));
evas_object_event_callback_list_free(&(obj->callbacks.up));
evas_object_event_callback_list_free(&(obj->callbacks.move));
evas_object_event_callback_list_free(&(obj->callbacks.free));
evas_object_event_callback_list_free(&(obj->callbacks.key_down));
evas_object_event_callback_list_free(&(obj->callbacks.key_up));
evas_object_event_callback_list_free(&(obj->callbacks.obj_focus_in));
evas_object_event_callback_list_free(&(obj->callbacks.obj_focus_out));
evas_object_event_callback_list_free(&(obj->callbacks.obj_show));
evas_object_event_callback_list_free(&(obj->callbacks.obj_hide));
evas_object_event_callback_list_free(&(obj->callbacks.obj_move));
evas_object_event_callback_list_free(&(obj->callbacks.obj_resize));
evas_object_event_callback_list_free(&(obj->callbacks.obj_restack));
}
void void
evas_object_event_callback_call(Evas_Object *obj, Evas_Callback_Type type, void *event_info) evas_object_event_callback_call(Evas_Object *obj, Evas_Callback_Type type, void *event_info)
{ {
@ -28,6 +65,33 @@ evas_object_event_callback_call(Evas_Object *obj, Evas_Callback_Type type, void
case EVAS_CALLBACK_FREE: case EVAS_CALLBACK_FREE:
l_mod = &(obj->callbacks.free); l_mod = &(obj->callbacks.free);
break; break;
case EVAS_CALLBACK_KEY_DOWN:
l_mod = &(obj->callbacks.key_down);
break;
case EVAS_CALLBACK_KEY_UP:
l_mod = &(obj->callbacks.key_up);
break;
case EVAS_CALLBACK_FOCUS_IN:
l_mod = &(obj->callbacks.obj_focus_in);
break;
case EVAS_CALLBACK_FOCUS_OUT:
l_mod = &(obj->callbacks.obj_focus_out);
break;
case EVAS_CALLBACK_SHOW:
l_mod = &(obj->callbacks.obj_show);
break;
case EVAS_CALLBACK_HIDE:
l_mod = &(obj->callbacks.obj_hide);
break;
case EVAS_CALLBACK_MOVE:
l_mod = &(obj->callbacks.obj_move);
break;
case EVAS_CALLBACK_RESIZE:
l_mod = &(obj->callbacks.obj_resize);
break;
case EVAS_CALLBACK_RESTACK:
l_mod = &(obj->callbacks.obj_restack);
break;
default: default:
return; return;
break; break;
@ -73,10 +137,12 @@ evas_object_event_callback_call(Evas_Object *obj, Evas_Callback_Type type, void
* The event type @p type to trigger the function mys be one of * The event type @p type to trigger the function mys be one of
* EVAS_CALLBACK_MOUSE_IN, EVAS_CALLBACK_MOUSE_OUT, EVAS_CALLBACK_MOUSE_DOWN, * EVAS_CALLBACK_MOUSE_IN, EVAS_CALLBACK_MOUSE_OUT, EVAS_CALLBACK_MOUSE_DOWN,
* EVAS_CALLBACK_MOUSE_UP, EVAS_CALLBACK_MOUSE_MOVE, EVAS_CALLBACK_FREE, * EVAS_CALLBACK_MOUSE_UP, EVAS_CALLBACK_MOUSE_MOVE, EVAS_CALLBACK_FREE,
* EVAS_CALLBACK_KEY_DOWN, EVAS_CALLBACK_KEY_UP, EVAS_CALLBACK_FOCUS_IN * EVAS_CALLBACK_KEY_DOWN, EVAS_CALLBACK_KEY_UP, EVAS_CALLBACK_FOCUS_IN,
* or EVAS_CALLBACK_FOCUS_OUT. This determines the kind of event that will * EVAS_CALLBACK_FOCUS_OUT, EVAS_CALLBACK_SHOW, EVAS_CALLBACK_HIDE,
* trigger the callback to be called. The @p event_info pointer passed to the * EVAS_CALLBACK_MOVE, EVAS_CALLBACK_RESIZE or EVAS_CALLBACK_RESTACK. This
* callback will be one of the following, depending on the event tiggering it: * determines the kind of event that will trigger the callback to be called.
* The @p event_info pointer passed to the callback will be one of the
* following, depending on the event tiggering it:
* *
* EVAS_CALLBACK_MOUSE_IN: event_info = pointer to Evas_Event_Mouse_In * EVAS_CALLBACK_MOUSE_IN: event_info = pointer to Evas_Event_Mouse_In
* *
@ -151,6 +217,26 @@ evas_object_event_callback_call(Evas_Object *obj, Evas_Callback_Type type, void
* This event is triggered by an object losing the focus. When the callback is * This event is triggered by an object losing the focus. When the callback is
* called the object has already lost the focus. * called the object has already lost the focus.
* *
* EVAS_CALLBACK_SHOW: event_info = NULL
*
* This event is triggered being shown by evas_object_show().
*
* EVAS_CALLBACK_HIDE: event_info = NULL
*
* This event is triggered by an object being hidden by evas_object_hide().
*
* EVAS_CALLBACK_MOVE: event_info = NULL
*
* This event is triggered by an object being moved. evas_object_move() can
* trigger this, as can any object specific manipulations that would mean the
* objects origin could move.
*
* EVAS_CALLBACK_RESIZE: event_info = NULL
*
* This event is triggered by an object being resized. Resizes can be
* triggered by evas_object_resize() or by any object specific calls that may
* cause the object to resize.
*
* Example: * Example:
* @code * @code
* extern Evas_Object *object; * extern Evas_Object *object;
@ -177,6 +263,7 @@ evas_object_event_callback_add(Evas_Object *obj, Evas_Callback_Type type, void (
{ {
/* MEM OK */ /* MEM OK */
Evas_Func_Node *fn; Evas_Func_Node *fn;
Evas_Object_List **l_mod;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return; return;
@ -189,46 +276,60 @@ evas_object_event_callback_add(Evas_Object *obj, Evas_Callback_Type type, void (
if (!fn) return; if (!fn) return;
fn->func = func; fn->func = func;
fn->data = data; fn->data = data;
do
switch (type)
{ {
switch (type) case EVAS_CALLBACK_MOUSE_IN:
{ l_mod = &(obj->callbacks.in);
case EVAS_CALLBACK_MOUSE_IN: break;
obj->callbacks.in = evas_object_list_prepend(obj->callbacks.in, fn); case EVAS_CALLBACK_MOUSE_OUT:
break; l_mod = &(obj->callbacks.out);
case EVAS_CALLBACK_MOUSE_OUT: break;
obj->callbacks.out = evas_object_list_prepend(obj->callbacks.out, fn); case EVAS_CALLBACK_MOUSE_DOWN:
break; l_mod = &(obj->callbacks.down);
case EVAS_CALLBACK_MOUSE_DOWN: break;
obj->callbacks.down = evas_object_list_prepend(obj->callbacks.down, fn); case EVAS_CALLBACK_MOUSE_UP:
break; l_mod = &(obj->callbacks.up);
case EVAS_CALLBACK_MOUSE_UP: break;
obj->callbacks.up = evas_object_list_prepend(obj->callbacks.up, fn); case EVAS_CALLBACK_MOUSE_MOVE:
break; l_mod = &(obj->callbacks.move);
case EVAS_CALLBACK_MOUSE_MOVE: break;
obj->callbacks.move = evas_object_list_prepend(obj->callbacks.move, fn); case EVAS_CALLBACK_FREE:
break; l_mod = &(obj->callbacks.free);
case EVAS_CALLBACK_FREE: break;
obj->callbacks.free = evas_object_list_prepend(obj->callbacks.free, fn); case EVAS_CALLBACK_KEY_DOWN:
break; l_mod = &(obj->callbacks.key_down);
default: break;
free(fn); case EVAS_CALLBACK_KEY_UP:
return; l_mod = &(obj->callbacks.key_up);
break; break;
} case EVAS_CALLBACK_FOCUS_IN:
if (!evas_list_alloc_error()) return; l_mod = &(obj->callbacks.obj_focus_in);
MERR_BAD(); break;
if (!evas_mem_free(sizeof(Evas_List))) case EVAS_CALLBACK_FOCUS_OUT:
{ l_mod = &(obj->callbacks.obj_focus_out);
if (!evas_mem_degrade(sizeof(Evas_List))) break;
{ case EVAS_CALLBACK_SHOW:
MERR_FATAL(); l_mod = &(obj->callbacks.obj_show);
free(fn); break;
return; case EVAS_CALLBACK_HIDE:
} l_mod = &(obj->callbacks.obj_hide);
} break;
case EVAS_CALLBACK_MOVE:
l_mod = &(obj->callbacks.obj_move);
break;
case EVAS_CALLBACK_RESIZE:
l_mod = &(obj->callbacks.obj_resize);
break;
case EVAS_CALLBACK_RESTACK:
l_mod = &(obj->callbacks.obj_restack);
break;
default:
free(fn);
return;
break;
} }
while (evas_list_alloc_error()); *l_mod = evas_object_list_append(*l_mod, fn);
} }
/** /**
@ -242,7 +343,7 @@ evas_object_event_callback_add(Evas_Object *obj, Evas_Callback_Type type, void (
* @p obj which was triggered by the event type @p type and was calling the * @p obj which was triggered by the event type @p type and was calling the
* function @p func when triggered. If the callback is successful it will also * function @p func when triggered. If the callback is successful it will also
* return the data pointer, passed to evas_object_event_callback_add() when * return the data pointer, passed to evas_object_event_callback_add() when
* the callback was added to the object. IF not successful NULL will be * the callback was added to the object. If not successful NULL will be
* returned. * returned.
* *
* Example: * Example:
@ -287,6 +388,33 @@ evas_object_event_callback_del(Evas_Object *obj, Evas_Callback_Type type, void (
case EVAS_CALLBACK_FREE: case EVAS_CALLBACK_FREE:
l_mod = &(obj->callbacks.free); l_mod = &(obj->callbacks.free);
break; break;
case EVAS_CALLBACK_KEY_DOWN:
l_mod = &(obj->callbacks.key_down);
break;
case EVAS_CALLBACK_KEY_UP:
l_mod = &(obj->callbacks.key_up);
break;
case EVAS_CALLBACK_FOCUS_IN:
l_mod = &(obj->callbacks.obj_focus_in);
break;
case EVAS_CALLBACK_FOCUS_OUT:
l_mod = &(obj->callbacks.obj_focus_out);
break;
case EVAS_CALLBACK_SHOW:
l_mod = &(obj->callbacks.obj_show);
break;
case EVAS_CALLBACK_HIDE:
l_mod = &(obj->callbacks.obj_hide);
break;
case EVAS_CALLBACK_MOVE:
l_mod = &(obj->callbacks.obj_move);
break;
case EVAS_CALLBACK_RESIZE:
l_mod = &(obj->callbacks.obj_resize);
break;
case EVAS_CALLBACK_RESTACK:
l_mod = &(obj->callbacks.obj_restack);
break;
default: default:
return NULL; return NULL;
break; break;

View File

@ -113,6 +113,7 @@ evas_object_layer_set(Evas_Object *obj, int l)
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return; return;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
if (evas_object_intercept_call_layer_set(obj, l)) return;
if (obj->cur.layer == l) if (obj->cur.layer == l)
{ {
evas_object_raise(obj); evas_object_raise(obj);

View File

@ -2,284 +2,34 @@
#include "evas_private.h" #include "evas_private.h"
#include "Evas.h" #include "Evas.h"
typedef struct _Evas_Inform_Func_Node Evas_Inform_Func_Node;
struct _Evas_Inform_Func_Node
{
void (*func) (void *data, Evas_Object *obj);
void *data;
};
/* local calls */ /* local calls */
static void evas_object_inform_init(Evas_Object *obj);
static void evas_object_inform_deinit(Evas_Object *obj);
static void evas_object_inform_list_add(Evas_Object *obj, Evas_List **l, void (*func) (void *data, Evas_Object *obj), void *data);
static void *evas_object_inform_list_del(Evas_Object *obj, Evas_List **list, void (*func) (void *data, Evas_Object *obj));
static void evas_object_inform_call(Evas_Object *obj, Evas_List *list);
static void
evas_object_inform_init(Evas_Object *obj)
{
if (!obj->informers)
obj->informers = evas_mem_calloc(sizeof(Evas_Inform_Func));
}
static void
evas_object_inform_deinit(Evas_Object *obj)
{
if (!obj->informers) return;
if ((obj->informers->show) ||
(obj->informers->hide) ||
(obj->informers->move) ||
(obj->informers->resize) ||
(obj->informers->restack)) return;
free(obj->informers);
obj->informers = NULL;
}
static void
evas_object_inform_list_add(Evas_Object *obj, Evas_List **l, void (*func) (void *data, Evas_Object *obj), void *data)
{
Evas_Inform_Func_Node *fn;
fn = evas_mem_calloc(sizeof(Evas_Inform_Func_Node));
if (!fn) return;
fn->func = func;
fn->data = data;
evas_object_inform_init(obj);
if (!obj->informers)
{
free(fn);
return;
}
do
{
*l = evas_list_append(*l, fn);
if (!evas_list_alloc_error()) return;
MERR_BAD();
if (!evas_mem_free(sizeof(Evas_List)))
{
if (!evas_mem_degrade(sizeof(Evas_List)))
{
evas_object_inform_deinit(obj);
MERR_FATAL();
free(fn);
return;
}
}
}
while (evas_list_alloc_error());
}
static void *
evas_object_inform_list_del(Evas_Object *obj, Evas_List **list, void (*func) (void *data, Evas_Object *obj))
{
if (!obj->informers) return NULL;
{
Evas_List *l;
for (l = (*list); l; l = l->next)
{
Evas_Inform_Func_Node *fn;
fn = l->data;
if (fn->func == func)
{
void *data;
data = fn->data;
free(fn);
(*list) = evas_list_remove_list((*list), l);
evas_object_inform_deinit(obj);
return data;
}
}
}
return NULL;
}
static void
evas_object_inform_call(Evas_Object *obj, Evas_List *list)
{
Evas_List *l;
for (l = list; l; l = l->next)
{
Evas_Inform_Func_Node *fn;
fn = l->data;
fn->func(fn->data, obj);
}
}
/* private calls */
void
evas_object_inform_cleanup(Evas_Object *obj)
{
if (!obj->informers) return;
while (obj->informers->show)
{
free(obj->informers->show->data);
obj->informers->show = evas_list_remove(obj->informers->show, obj->informers->show->data);
}
while (obj->informers->hide)
{
free(obj->informers->hide->data);
obj->informers->hide = evas_list_remove(obj->informers->hide, obj->informers->hide->data);
}
while (obj->informers->move)
{
free(obj->informers->move->data);
obj->informers->move = evas_list_remove(obj->informers->move, obj->informers->move->data);
}
while (obj->informers->resize)
{
free(obj->informers->resize->data);
obj->informers->resize = evas_list_remove(obj->informers->resize, obj->informers->resize->data);
}
while (obj->informers->restack)
{
free(obj->informers->restack->data);
obj->informers->restack = evas_list_remove(obj->informers->restack, obj->informers->restack->data);
}
free(obj->informers);
}
void void
evas_object_inform_call_show(Evas_Object *obj) evas_object_inform_call_show(Evas_Object *obj)
{ {
if (!obj->informers) return; evas_object_event_callback_call(obj, EVAS_CALLBACK_SHOW, NULL);
evas_object_inform_call(obj, obj->informers->show);
} }
void void
evas_object_inform_call_hide(Evas_Object *obj) evas_object_inform_call_hide(Evas_Object *obj)
{ {
if (!obj->informers) return; evas_object_event_callback_call(obj, EVAS_CALLBACK_HIDE, NULL);
evas_object_inform_call(obj, obj->informers->hide);
} }
void void
evas_object_inform_call_move(Evas_Object *obj) evas_object_inform_call_move(Evas_Object *obj)
{ {
if (!obj->informers) return; evas_object_event_callback_call(obj, EVAS_CALLBACK_MOVE, NULL);
evas_object_inform_call(obj, obj->informers->move);
} }
void void
evas_object_inform_call_resize(Evas_Object *obj) evas_object_inform_call_resize(Evas_Object *obj)
{ {
if (!obj->informers) return; evas_object_event_callback_call(obj, EVAS_CALLBACK_RESIZE, NULL);
evas_object_inform_call(obj, obj->informers->resize);
} }
void void
evas_object_inform_call_restack(Evas_Object *obj) evas_object_inform_call_restack(Evas_Object *obj)
{ {
if (!obj->informers) return; evas_object_event_callback_call(obj, EVAS_CALLBACK_RESTACK, NULL);
evas_object_inform_call(obj, obj->informers->restack);
}
/* public calls */
void
evas_object_inform_show_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data)
{
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return;
MAGIC_CHECK_END();
if (!func) return;
evas_object_inform_list_add(obj, &(obj->informers->show), func, data);
}
void *
evas_object_inform_show_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj))
{
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return NULL;
MAGIC_CHECK_END();
if (!func) return NULL;
return evas_object_inform_list_del(obj, &(obj->informers->show), func);
}
void
evas_object_inform_hide_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data)
{
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return;
MAGIC_CHECK_END();
if (!func) return;
evas_object_inform_list_add(obj, &(obj->informers->hide), func, data);
}
void *
evas_object_inform_hide_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj))
{
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return NULL;
MAGIC_CHECK_END();
if (!func) return;
return evas_object_inform_list_del(obj, &(obj->informers->hide), func);
}
void
evas_object_inform_move_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data)
{
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return;
MAGIC_CHECK_END();
if (!func) return;
evas_object_inform_list_add(obj, &(obj->informers->move), func, data);
}
void *
evas_object_inform_move_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj))
{
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return NULL;
MAGIC_CHECK_END();
if (!func) return NULL;
return evas_object_inform_list_del(obj, &(obj->informers->move), func);
}
void
evas_object_inform_resize_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data)
{
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return;
MAGIC_CHECK_END();
if (!func) return;
evas_object_inform_list_add(obj, &(obj->informers->resize), func, data);
}
void *
evas_object_inform_resize_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj))
{
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return NULL;
MAGIC_CHECK_END();
if (!func) return NULL;
return evas_object_inform_list_del(obj, &(obj->informers->resize), func);
}
void
evas_object_inform_restack_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data)
{
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return;
MAGIC_CHECK_END();
if (!func) return;
evas_object_inform_list_add(obj, &(obj->informers->restack), func, data);
}
void *
evas_object_inform_restack_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj))
{
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return NULL;
MAGIC_CHECK_END();
if (!func) return NULL;
return evas_object_inform_list_del(obj, &(obj->informers->restack), func);
} }

View File

@ -1,174 +1,472 @@
#include "evas_common.h" #include "evas_common.h"
#include "evas_private.h" #include "evas_private.h"
#include "Evas.h" #include "Evas.h"
/* local calls */
static void evas_object_intercept_init(Evas_Object *obj);
static void evas_object_intercept_deinit(Evas_Object *obj);
static void
evas_object_intercept_init(Evas_Object *obj)
{
/* MEM OK */
if (!obj->interceptors)
obj->interceptors = evas_mem_calloc(sizeof(Evas_Intercept_Func));
}
static void
evas_object_intercept_deinit(Evas_Object *obj)
{
/* MEM OK */
if (!obj->interceptors) return;
if ((obj->interceptors->show.func) ||
(obj->interceptors->hide.func) ||
(obj->interceptors->move.func) ||
(obj->interceptors->resize.func) ||
(obj->interceptors->raise.func) ||
(obj->interceptors->lower.func) ||
(obj->interceptors->stack_above.func) ||
(obj->interceptors->stack_below.func) ||
(obj->interceptors->layer_set.func))
return;
free(obj->interceptors);
obj->interceptors = NULL;
}
/* private calls */
void
evas_object_intercept_cleanup(Evas_Object *obj)
{
/* MEM OK */
if (obj->interceptors) free(obj->interceptors);
}
int
evas_object_intercept_call_show(Evas_Object *obj)
{
/* MEM OK */
int ret;
if (!obj->interceptors) return 0;
if (obj->intercepted) return 0;
obj->intercepted = 1;
ret = obj->interceptors->show.func;
if (obj->interceptors->show.func)
obj->interceptors->show.func(obj->interceptors->show.data, obj);
obj->intercepted = 0;
return ret;
}
int
evas_object_intercept_call_hide(Evas_Object *obj)
{
/* MEM OK */
int ret;
if (!obj->interceptors) return 0;
if (obj->intercepted) return 0;
obj->intercepted = 1;
ret = obj->interceptors->hide.func;
if (obj->interceptors->hide.func)
obj->interceptors->hide.func(obj->interceptors->hide.data, obj);
obj->intercepted = 0;
return ret;
}
int
evas_object_intercept_call_move(Evas_Object *obj, double x, double y)
{
/* MEM OK */
int ret;
if (!obj->interceptors) return 0;
if (obj->intercepted) return 0;
obj->intercepted = 1;
ret = obj->interceptors->move.func;
if (obj->interceptors->move.func)
obj->interceptors->move.func(obj->interceptors->move.data, obj, x, y);
obj->intercepted = 0;
return ret;
}
int
evas_object_intercept_call_resize(Evas_Object *obj, double w, double h)
{
/* MEM OK */
int ret;
if (!obj->interceptors) return 0;
if (obj->intercepted) return 0;
obj->intercepted = 1;
ret = obj->interceptors->resize.func;
if (obj->interceptors->resize.func)
obj->interceptors->resize.func(obj->interceptors->resize.data, obj, w, h);
obj->intercepted = 0;
return ret;
}
int
evas_object_intercept_call_raise(Evas_Object *obj)
{
/* MEM OK */
int ret;
if (!obj->interceptors) return 0;
if (obj->intercepted) return 0;
obj->intercepted = 1;
ret = obj->interceptors->raise.func;
if (obj->interceptors->raise.func)
obj->interceptors->raise.func(obj->interceptors->raise.data, obj);
obj->intercepted = 0;
return ret;
}
int
evas_object_intercept_call_lower(Evas_Object *obj)
{
/* MEM OK */
int ret;
if (!obj->interceptors) return 0;
if (obj->intercepted) return 0;
obj->intercepted = 1;
ret = obj->interceptors->lower.func;
if (obj->interceptors->lower.func)
obj->interceptors->lower.func(obj->interceptors->lower.data, obj);
obj->intercepted = 0;
return ret;
}
int
evas_object_intercept_call_stack_above(Evas_Object *obj, Evas_Object *above)
{
/* MEM OK */
int ret;
if (!obj->interceptors) return 0;
if (obj->intercepted) return 0;
obj->intercepted = 1;
ret = obj->interceptors->stack_above.func;
if (obj->interceptors->stack_above.func)
obj->interceptors->stack_above.func(obj->interceptors->stack_above.data, obj, above);
obj->intercepted = 0;
return ret;
}
int
evas_object_intercept_call_stack_below(Evas_Object *obj, Evas_Object *below)
{
/* MEM OK */
int ret;
if (!obj->interceptors) return 0;
if (obj->intercepted) return 0;
obj->intercepted = 1;
ret = obj->interceptors->stack_below.func;
if (obj->interceptors->stack_below.func)
obj->interceptors->stack_below.func(obj->interceptors->stack_below.data, obj, below);
obj->intercepted = 0;
return ret;
}
int
evas_object_intercept_call_layer_set(Evas_Object *obj, int l)
{
/* MEM OK */
int ret;
if (!obj->interceptors) return 0;
if (obj->intercepted) return 0;
obj->intercepted = 1;
ret = obj->interceptors->layer_set.func;
if (obj->interceptors->layer_set.func)
obj->interceptors->layer_set.func(obj->interceptors->layer_set.data, obj, l);
obj->intercepted = 0;
return ret;
}
/* public calls */
void void
evas_object_intercept_show_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data) evas_object_intercept_show_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data)
{ {
/* MEM OK */
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return; return;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
if (!func) return; if (!func) return;
evas_object_intercept_init(obj);
if (!obj->interceptors) return;
obj->interceptors->show.func = func;
obj->interceptors->show.data = data;
} }
void * void *
evas_object_intercept_show_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj)) evas_object_intercept_show_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj))
{ {
/* MEM OK */
void *data;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return NULL; return NULL;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
if (!func) return NULL; if (!func) return NULL;
return NULL; if (!obj->interceptors) return NULL;
obj->interceptors->show.func = NULL;
data = obj->interceptors->show.data;
obj->interceptors->show.data = NULL;
evas_object_intercept_deinit(obj);
return data;
} }
void void
evas_object_intercept_hide_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data) evas_object_intercept_hide_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data)
{ {
/* MEM OK */
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return; return;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
if (!func) return; if (!func) return;
evas_object_intercept_init(obj);
if (!obj->interceptors) return;
obj->interceptors->hide.func = func;
obj->interceptors->hide.data = data;
} }
void * void *
evas_object_intercept_hide_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj)) evas_object_intercept_hide_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj))
{ {
/* MEM OK */
void *data;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return NULL; return NULL;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
if (!func) return NULL; if (!func) return NULL;
return NULL; if (!obj->interceptors) return NULL;
obj->interceptors->hide.func = NULL;
data = obj->interceptors->hide.data;
obj->interceptors->hide.data = NULL;
evas_object_intercept_deinit(obj);
return data;
} }
void void
evas_object_intercept_move_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, double x, double y), void *data) evas_object_intercept_move_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, double x, double y), void *data)
{ {
/* MEM OK */
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return; return;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
if (!func) return; if (!func) return;
evas_object_intercept_init(obj);
if (!obj->interceptors) return;
obj->interceptors->move.func = func;
obj->interceptors->move.data = data;
} }
void * void *
evas_object_intercept_move_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, double x, double y)) evas_object_intercept_move_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, double x, double y))
{ {
/* MEM OK */
void *data;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return NULL; return NULL;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
if (!func) return NULL; if (!obj->interceptors) return NULL;
return NULL; obj->interceptors->move.func = NULL;
data = obj->interceptors->move.data;
obj->interceptors->move.data = NULL;
evas_object_intercept_deinit(obj);
return data;
} }
void void
evas_object_intercept_resize_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, double w, double h), void *data) evas_object_intercept_resize_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, double w, double h), void *data)
{ {
/* MEM OK */
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return; return;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
if (!func) return; if (!func) return;
evas_object_intercept_init(obj);
if (!obj->interceptors) return;
obj->interceptors->resize.func = func;
obj->interceptors->resize.data = data;
} }
void * void *
evas_object_intercept_resize_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, double w, double h)) evas_object_intercept_resize_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, double w, double h))
{ {
/* MEM OK */
void *data;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return NULL; return NULL;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
if (!func) return NULL; if (!obj->interceptors) return NULL;
return NULL; obj->interceptors->resize.func = NULL;
data = obj->interceptors->resize.data;
obj->interceptors->resize.data = NULL;
evas_object_intercept_deinit(obj);
return data;
} }
void void
evas_object_intercept_raise_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data) evas_object_intercept_raise_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data)
{ {
/* MEM OK */
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return; return;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
if (!func) return; if (!func) return;
evas_object_intercept_init(obj);
if (!obj->interceptors) return;
obj->interceptors->raise.func = func;
obj->interceptors->raise.data = data;
} }
void * void *
evas_object_intercept_raise_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj)) evas_object_intercept_raise_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj))
{ {
/* MEM OK */
void *data;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return NULL; return NULL;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
if (!func) return NULL; if (!obj->interceptors) return NULL;
return NULL; obj->interceptors->raise.func = NULL;
data = obj->interceptors->raise.data;
obj->interceptors->raise.data = NULL;
evas_object_intercept_deinit(obj);
return data;
} }
void void
evas_object_intercept_lower_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data) evas_object_intercept_lower_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data)
{ {
/* MEM OK */
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return; return;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
if (!func) return; if (!func) return;
evas_object_intercept_init(obj);
if (!obj->interceptors) return;
obj->interceptors->lower.func = func;
obj->interceptors->lower.data = data;
} }
void * void *
evas_object_intercept_lower_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj)) evas_object_intercept_lower_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj))
{ {
/* MEM OK */
void *data;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return NULL; return NULL;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
if (!func) return NULL; if (!obj->interceptors) return NULL;
return NULL; obj->interceptors->lower.func = NULL;
data = obj->interceptors->lower.data;
obj->interceptors->lower.data = NULL;
evas_object_intercept_deinit(obj);
return data;
} }
void void
evas_object_intercept_stack_above_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Object *above), void *data) evas_object_intercept_stack_above_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Object *above), void *data)
{ {
/* MEM OK */
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return; return;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
if (!func) return; if (!func) return;
evas_object_intercept_init(obj);
if (!obj->interceptors) return;
obj->interceptors->stack_above.func = func;
obj->interceptors->stack_above.data = data;
} }
void * void *
evas_object_intercept_stack_above_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Object *above)) evas_object_intercept_stack_above_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Object *above))
{ {
/* MEM OK */
void *data;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return NULL; return NULL;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
if (!func) return NULL; if (!obj->interceptors) return NULL;
return NULL; obj->interceptors->stack_above.func = NULL;
data = obj->interceptors->stack_above.data;
obj->interceptors->stack_above.data = NULL;
evas_object_intercept_deinit(obj);
return data;
} }
void void
evas_object_intercept_stack_below_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Object *below), void *data) evas_object_intercept_stack_below_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Object *below), void *data)
{ {
/* MEM OK */
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return; return;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
if (!func) return; if (!func) return;
evas_object_intercept_init(obj);
if (!obj->interceptors) return;
obj->interceptors->stack_below.func = func;
obj->interceptors->stack_below.data = data;
} }
void * void *
evas_object_intercept_stack_below_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Object *below)) evas_object_intercept_stack_below_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Object *below))
{ {
/* MEM OK */
void *data;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return NULL; return NULL;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
if (!func) return NULL; if (!obj->interceptors) return NULL;
return NULL; obj->interceptors->stack_below.func = NULL;
data = obj->interceptors->stack_below.data;
obj->interceptors->stack_below.data = NULL;
evas_object_intercept_deinit(obj);
return data;
} }
void void
evas_object_intercept_layer_set_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, int l), void *data) evas_object_intercept_layer_set_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, int l), void *data)
{ {
/* MEM OK */
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return; return;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
if (!func) return; if (!func) return;
evas_object_intercept_init(obj);
if (!obj->interceptors) return;
obj->interceptors->layer_set.func = func;
obj->interceptors->layer_set.data = data;
} }
void * void *
evas_object_intercept_layer_set_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, int l)) evas_object_intercept_layer_set_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, int l))
{ {
/* MEM OK */
void *data;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return NULL; return NULL;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
if (!func) return NULL; if (!obj->interceptors) return NULL;
return NULL; obj->interceptors->layer_set.func = NULL;
data = obj->interceptors->layer_set.data;
obj->interceptors->layer_set.data = NULL;
evas_object_intercept_deinit(obj);
return data;
} }

View File

@ -20,7 +20,7 @@ void
evas_object_free(Evas_Object *obj, int clean_layer) evas_object_free(Evas_Object *obj, int clean_layer)
{ {
evas_object_event_callback_call(obj, EVAS_CALLBACK_FREE, NULL); evas_object_event_callback_call(obj, EVAS_CALLBACK_FREE, NULL);
evas_object_inform_cleanup(obj); evas_object_intercept_cleanup(obj);
evas_object_smart_cleanup(obj); evas_object_smart_cleanup(obj);
obj->func->free(obj); obj->func->free(obj);
if (obj->name) if (obj->name)
@ -41,54 +41,7 @@ evas_object_free(Evas_Object *obj, int clean_layer)
obj->clip.changes = evas_list_remove(obj->clip.changes, r); obj->clip.changes = evas_list_remove(obj->clip.changes, r);
free(r); free(r);
} }
while (obj->callbacks.in) evas_object_event_callback_cleanup(obj);
{
Evas_Func_Node *fn;
fn = (Evas_Func_Node *)obj->callbacks.in;
obj->callbacks.in = evas_object_list_remove(obj->callbacks.in, fn);
free(fn);
}
while (obj->callbacks.out)
{
Evas_Func_Node *fn;
fn = (Evas_Func_Node *)obj->callbacks.out;
obj->callbacks.out = evas_object_list_remove(obj->callbacks.out, fn);
free(fn);
}
while (obj->callbacks.down)
{
Evas_Func_Node *fn;
fn = (Evas_Func_Node *)obj->callbacks.down;
obj->callbacks.down = evas_object_list_remove(obj->callbacks.down, fn);
free(fn);
}
while (obj->callbacks.up)
{
Evas_Func_Node *fn;
fn = (Evas_Func_Node *)obj->callbacks.up;
obj->callbacks.up = evas_object_list_remove(obj->callbacks.up, fn);
free(fn);
}
while (obj->callbacks.move)
{
Evas_Func_Node *fn;
fn = (Evas_Func_Node *)obj->callbacks.move;
obj->callbacks.move = evas_object_list_remove(obj->callbacks.move, fn);
free(fn);
}
while (obj->callbacks.free)
{
Evas_Func_Node *fn;
fn = (Evas_Func_Node *)obj->callbacks.free;
obj->callbacks.free = evas_object_list_remove(obj->callbacks.free, fn);
free(fn);
}
while (obj->data.elements) while (obj->data.elements)
{ {
Evas_Data_Node *node; Evas_Data_Node *node;
@ -471,6 +424,7 @@ evas_object_move(Evas_Object *obj, double x, double y)
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return; return;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
if (evas_object_intercept_call_move(obj, x, y)) return;
if (obj->smart.smart) if (obj->smart.smart)
{ {
if (obj->smart.smart->func_move) if (obj->smart.smart->func_move)
@ -512,6 +466,7 @@ evas_object_resize(Evas_Object *obj, double w, double h)
return; return;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
if (w < 0.0) w = 0.0; if (h < 0.0) h = 0.0; if (w < 0.0) w = 0.0; if (h < 0.0) h = 0.0;
if (evas_object_intercept_call_resize(obj, w, h)) return;
if (obj->smart.smart) if (obj->smart.smart)
{ {
if (obj->smart.smart->func_resize) if (obj->smart.smart->func_resize)
@ -562,6 +517,7 @@ evas_object_show(Evas_Object *obj)
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return; return;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
if (evas_object_intercept_call_show(obj)) return;
if (obj->smart.smart) if (obj->smart.smart)
{ {
if (obj->smart.smart->func_show) if (obj->smart.smart->func_show)
@ -593,6 +549,7 @@ evas_object_hide(Evas_Object *obj)
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return; return;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
if (evas_object_intercept_call_hide(obj)) return;
if (obj->smart.smart) if (obj->smart.smart)
{ {
if (obj->smart.smart->func_hide) if (obj->smart.smart->func_hide)

View File

@ -47,6 +47,7 @@ evas_object_raise(Evas_Object *obj)
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return; return;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
if (evas_object_intercept_call_raise(obj)) return;
if (obj->smart.smart) if (obj->smart.smart)
{ {
if (obj->smart.smart->func_raise) if (obj->smart.smart->func_raise)
@ -83,6 +84,7 @@ evas_object_lower(Evas_Object *obj)
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return; return;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
if (evas_object_intercept_call_lower(obj)) return;
if (obj->smart.smart) if (obj->smart.smart)
{ {
if (obj->smart.smart->func_lower) if (obj->smart.smart->func_lower)
@ -122,6 +124,7 @@ evas_object_stack_above(Evas_Object *obj, Evas_Object *above)
MAGIC_CHECK(above, Evas_Object, MAGIC_OBJ); MAGIC_CHECK(above, Evas_Object, MAGIC_OBJ);
return; return;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
if (evas_object_intercept_call_stack_above(obj, above)) return;
if (obj->smart.smart) if (obj->smart.smart)
{ {
if (obj->smart.smart->func_stack_above) if (obj->smart.smart->func_stack_above)
@ -166,6 +169,7 @@ evas_object_stack_below(Evas_Object *obj, Evas_Object *below)
MAGIC_CHECK(below, Evas_Object, MAGIC_OBJ); MAGIC_CHECK(below, Evas_Object, MAGIC_OBJ);
return; return;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
if (evas_object_intercept_call_stack_below(obj, below)) return;
if (obj->smart.smart) if (obj->smart.smart)
{ {
if (obj->smart.smart->func_stack_below) if (obj->smart.smart->func_stack_below)

View File

@ -25,27 +25,33 @@ typedef enum _Evas_Callback_Type
EVAS_CALLBACK_KEY_DOWN, EVAS_CALLBACK_KEY_DOWN,
EVAS_CALLBACK_KEY_UP, EVAS_CALLBACK_KEY_UP,
EVAS_CALLBACK_FOCUS_IN, EVAS_CALLBACK_FOCUS_IN,
EVAS_CALLBACK_FOCUS_OUT EVAS_CALLBACK_FOCUS_OUT,
EVAS_CALLBACK_SHOW,
EVAS_CALLBACK_HIDE,
EVAS_CALLBACK_MOVE,
EVAS_CALLBACK_RESIZE,
EVAS_CALLBACK_RESTACK
} Evas_Callback_Type; } Evas_Callback_Type;
typedef struct _Evas_Rectangle Evas_Rectangle; typedef struct _Evas_Rectangle Evas_Rectangle;
struct _Evas_Rectangle
{
int x, y, w, h;
};
typedef struct _Evas Evas; typedef struct _Evas Evas;
typedef struct _Evas_Layer Evas_Layer; typedef struct _Evas_Layer Evas_Layer;
typedef struct _Evas_Object Evas_Object; typedef struct _Evas_Object Evas_Object;
typedef struct _Evas_Data_Node Evas_Data_Node; typedef struct _Evas_Data_Node Evas_Data_Node;
typedef struct _Evas_Func_Node Evas_Func_Node; typedef struct _Evas_Func_Node Evas_Func_Node;
typedef struct _Evas_Func Evas_Func; typedef struct _Evas_Func Evas_Func;
typedef struct _Evas_Object_Func Evas_Object_Func; typedef struct _Evas_Object_Func Evas_Object_Func;
typedef struct _Evas_Key Evas_Key; typedef struct _Evas_Key Evas_Key;
typedef struct _Evas_Modifier Evas_Modifier; typedef struct _Evas_Modifier Evas_Modifier;
typedef struct _Evas_Lock Evas_Lock; typedef struct _Evas_Lock Evas_Lock;
typedef struct _Evas_Smart Evas_Smart; typedef struct _Evas_Smart Evas_Smart;
typedef void Evas_Performance; typedef struct _Evas_Intercept_Func Evas_Intercept_Func;
typedef struct _Evas_Intercept_Func_Basic Evas_Intercept_Func_Basic;
typedef struct _Evas_Intercept_Func_SizePos Evas_Intercept_Func_SizePos;
typedef struct _Evas_Intercept_Func_Obj Evas_Intercept_Func_Obj;
typedef struct _Evas_Intercept_Func_Int Evas_Intercept_Func_Int;
typedef void Evas_Performance;
#define MAGIC_EVAS 0x70777770 #define MAGIC_EVAS 0x70777770
#define MAGIC_OBJ 0x71777770 #define MAGIC_OBJ 0x71777770
@ -88,16 +94,46 @@ if (_r) \
#define MEM_TRY_CALLOC(_ptr, _size) #define MEM_TRY_CALLOC(_ptr, _size)
struct _Evas_Rectangle
typedef struct _Evas_Inform_Func Evas_Inform_Func;
struct _Evas_Inform_Func
{ {
Evas_List *show; int x, y, w, h;
Evas_List *hide; };
Evas_List *move;
Evas_List *resize; struct _Evas_Intercept_Func_Basic
Evas_List *restack; {
void (*func) (void *data, Evas_Object *obj);
void *data;
};
struct _Evas_Intercept_Func_SizePos
{
void (*func) (void *data, Evas_Object *obj, double x, double y);
void *data;
};
struct _Evas_Intercept_Func_Obj
{
void (*func) (void *data, Evas_Object *obj, Evas_Object *obj2);
void *data;
};
struct _Evas_Intercept_Func_Int
{
void (*func) (void *data, Evas_Object *obj, int n);
void *data;
};
struct _Evas_Intercept_Func
{
Evas_Intercept_Func_Basic show;
Evas_Intercept_Func_Basic hide;
Evas_Intercept_Func_SizePos move;
Evas_Intercept_Func_SizePos resize;
Evas_Intercept_Func_Basic raise;
Evas_Intercept_Func_Basic lower;
Evas_Intercept_Func_Obj stack_above;
Evas_Intercept_Func_Obj stack_below;
Evas_Intercept_Func_Int layer_set;
}; };
struct _Evas_Smart struct _Evas_Smart
@ -273,7 +309,7 @@ struct _Evas_Object
int delete_me; int delete_me;
Evas_Inform_Func *informers; Evas_Intercept_Func *interceptors;
struct { struct {
Evas_List *elements; Evas_List *elements;
@ -286,6 +322,15 @@ struct _Evas_Object
Evas_Object_List *up; Evas_Object_List *up;
Evas_Object_List *move; Evas_Object_List *move;
Evas_Object_List *free; Evas_Object_List *free;
Evas_Object_List *key_down;
Evas_Object_List *key_up;
Evas_Object_List *obj_focus_in;
Evas_Object_List *obj_focus_out;
Evas_Object_List *obj_show;
Evas_Object_List *obj_hide;
Evas_Object_List *obj_move;
Evas_Object_List *obj_resize;
Evas_Object_List *obj_restack;
} callbacks; } callbacks;
struct { struct {
@ -476,12 +521,22 @@ void evas_object_smart_unuse(Evas_Smart *s);
void evas_object_smart_del(Evas_Object *obj); void evas_object_smart_del(Evas_Object *obj);
void evas_object_smart_cleanup(Evas_Object *obj); void evas_object_smart_cleanup(Evas_Object *obj);
void *evas_mem_calloc(int size); void *evas_mem_calloc(int size);
void evas_object_inform_cleanup(Evas_Object *obj); void evas_object_event_callback_cleanup(Evas_Object *obj);
void evas_object_inform_call_show(Evas_Object *obj); void evas_object_inform_call_show(Evas_Object *obj);
void evas_object_inform_call_hide(Evas_Object *obj); void evas_object_inform_call_hide(Evas_Object *obj);
void evas_object_inform_call_move(Evas_Object *obj); void evas_object_inform_call_move(Evas_Object *obj);
void evas_object_inform_call_resize(Evas_Object *obj); void evas_object_inform_call_resize(Evas_Object *obj);
void evas_object_inform_call_restack(Evas_Object *obj); void evas_object_inform_call_restack(Evas_Object *obj);
void evas_object_intercept_cleanup(Evas_Object *obj);
int evas_object_intercept_call_show(Evas_Object *obj);
int evas_object_intercept_call_hide(Evas_Object *obj);
int evas_object_intercept_call_move(Evas_Object *obj, double x, double y);
int evas_object_intercept_call_resize(Evas_Object *obj, double w, double h);
int evas_object_intercept_call_raise(Evas_Object *obj);
int evas_object_intercept_call_lower(Evas_Object *obj);
int evas_object_intercept_call_stack_above(Evas_Object *obj, Evas_Object *above);
int evas_object_intercept_call_stack_below(Evas_Object *obj, Evas_Object *below);
int evas_object_intercept_call_layer_set(Evas_Object *obj, int l);
extern int _evas_alloc_error; extern int _evas_alloc_error;