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_UP, /**< Key Release 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_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);
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_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.
...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_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_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);
@ -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_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));
/* ...end implement */
#ifdef __cplusplus
}

View File

@ -2,6 +2,43 @@
#include "evas_private.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
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:
l_mod = &(obj->callbacks.free);
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:
return;
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
* 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_KEY_DOWN, EVAS_CALLBACK_KEY_UP, EVAS_CALLBACK_FOCUS_IN
* or EVAS_CALLBACK_FOCUS_OUT. This 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_KEY_DOWN, EVAS_CALLBACK_KEY_UP, EVAS_CALLBACK_FOCUS_IN,
* EVAS_CALLBACK_FOCUS_OUT, EVAS_CALLBACK_SHOW, EVAS_CALLBACK_HIDE,
* EVAS_CALLBACK_MOVE, EVAS_CALLBACK_RESIZE or EVAS_CALLBACK_RESTACK. This
* 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
*
@ -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
* 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:
* @code
* extern Evas_Object *object;
@ -177,6 +263,7 @@ evas_object_event_callback_add(Evas_Object *obj, Evas_Callback_Type type, void (
{
/* MEM OK */
Evas_Func_Node *fn;
Evas_Object_List **l_mod;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return;
@ -189,46 +276,60 @@ evas_object_event_callback_add(Evas_Object *obj, Evas_Callback_Type type, void (
if (!fn) return;
fn->func = func;
fn->data = data;
do
switch (type)
{
switch (type)
{
case EVAS_CALLBACK_MOUSE_IN:
obj->callbacks.in = evas_object_list_prepend(obj->callbacks.in, fn);
break;
case EVAS_CALLBACK_MOUSE_OUT:
obj->callbacks.out = evas_object_list_prepend(obj->callbacks.out, fn);
break;
case EVAS_CALLBACK_MOUSE_DOWN:
obj->callbacks.down = evas_object_list_prepend(obj->callbacks.down, fn);
break;
case EVAS_CALLBACK_MOUSE_UP:
obj->callbacks.up = evas_object_list_prepend(obj->callbacks.up, fn);
break;
case EVAS_CALLBACK_MOUSE_MOVE:
obj->callbacks.move = evas_object_list_prepend(obj->callbacks.move, fn);
break;
case EVAS_CALLBACK_FREE:
obj->callbacks.free = evas_object_list_prepend(obj->callbacks.free, fn);
break;
default:
free(fn);
return;
break;
}
if (!evas_list_alloc_error()) return;
MERR_BAD();
if (!evas_mem_free(sizeof(Evas_List)))
{
if (!evas_mem_degrade(sizeof(Evas_List)))
{
MERR_FATAL();
free(fn);
return;
}
}
case EVAS_CALLBACK_MOUSE_IN:
l_mod = &(obj->callbacks.in);
break;
case EVAS_CALLBACK_MOUSE_OUT:
l_mod = &(obj->callbacks.out);
break;
case EVAS_CALLBACK_MOUSE_DOWN:
l_mod = &(obj->callbacks.down);
break;
case EVAS_CALLBACK_MOUSE_UP:
l_mod = &(obj->callbacks.up);
break;
case EVAS_CALLBACK_MOUSE_MOVE:
l_mod = &(obj->callbacks.move);
break;
case EVAS_CALLBACK_FREE:
l_mod = &(obj->callbacks.free);
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:
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
* 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
* 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.
*
* Example:
@ -287,6 +388,33 @@ evas_object_event_callback_del(Evas_Object *obj, Evas_Callback_Type type, void (
case EVAS_CALLBACK_FREE:
l_mod = &(obj->callbacks.free);
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:
return NULL;
break;

View File

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

View File

@ -2,284 +2,34 @@
#include "evas_private.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 */
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
evas_object_inform_call_show(Evas_Object *obj)
{
if (!obj->informers) return;
evas_object_inform_call(obj, obj->informers->show);
evas_object_event_callback_call(obj, EVAS_CALLBACK_SHOW, NULL);
}
void
evas_object_inform_call_hide(Evas_Object *obj)
{
if (!obj->informers) return;
evas_object_inform_call(obj, obj->informers->hide);
evas_object_event_callback_call(obj, EVAS_CALLBACK_HIDE, NULL);
}
void
evas_object_inform_call_move(Evas_Object *obj)
{
if (!obj->informers) return;
evas_object_inform_call(obj, obj->informers->move);
evas_object_event_callback_call(obj, EVAS_CALLBACK_MOVE, NULL);
}
void
evas_object_inform_call_resize(Evas_Object *obj)
{
if (!obj->informers) return;
evas_object_inform_call(obj, obj->informers->resize);
evas_object_event_callback_call(obj, EVAS_CALLBACK_RESIZE, NULL);
}
void
evas_object_inform_call_restack(Evas_Object *obj)
{
if (!obj->informers) return;
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);
evas_object_event_callback_call(obj, EVAS_CALLBACK_RESTACK, NULL);
}

View File

@ -1,174 +1,472 @@
#include "evas_common.h"
#include "evas_private.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
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);
return;
MAGIC_CHECK_END();
if (!func) return;
evas_object_intercept_init(obj);
if (!obj->interceptors) return;
obj->interceptors->show.func = func;
obj->interceptors->show.data = data;
}
void *
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);
return NULL;
MAGIC_CHECK_END();
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
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);
return;
MAGIC_CHECK_END();
if (!func) return;
evas_object_intercept_init(obj);
if (!obj->interceptors) return;
obj->interceptors->hide.func = func;
obj->interceptors->hide.data = data;
}
void *
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);
return NULL;
MAGIC_CHECK_END();
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
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);
return;
MAGIC_CHECK_END();
if (!func) return;
evas_object_intercept_init(obj);
if (!obj->interceptors) return;
obj->interceptors->move.func = func;
obj->interceptors->move.data = data;
}
void *
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);
return NULL;
MAGIC_CHECK_END();
if (!func) return NULL;
return NULL;
if (!obj->interceptors) 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
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);
return;
MAGIC_CHECK_END();
if (!func) return;
evas_object_intercept_init(obj);
if (!obj->interceptors) return;
obj->interceptors->resize.func = func;
obj->interceptors->resize.data = data;
}
void *
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);
return NULL;
MAGIC_CHECK_END();
if (!func) return NULL;
return NULL;
if (!obj->interceptors) 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
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);
return;
MAGIC_CHECK_END();
if (!func) return;
evas_object_intercept_init(obj);
if (!obj->interceptors) return;
obj->interceptors->raise.func = func;
obj->interceptors->raise.data = data;
}
void *
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);
return NULL;
MAGIC_CHECK_END();
if (!func) return NULL;
return NULL;
if (!obj->interceptors) 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
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);
return;
MAGIC_CHECK_END();
if (!func) return;
evas_object_intercept_init(obj);
if (!obj->interceptors) return;
obj->interceptors->lower.func = func;
obj->interceptors->lower.data = data;
}
void *
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);
return NULL;
MAGIC_CHECK_END();
if (!func) return NULL;
return NULL;
if (!obj->interceptors) 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
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);
return;
MAGIC_CHECK_END();
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 *
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);
return NULL;
MAGIC_CHECK_END();
if (!func) return NULL;
return NULL;
if (!obj->interceptors) 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
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);
return;
MAGIC_CHECK_END();
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 *
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);
return NULL;
MAGIC_CHECK_END();
if (!func) return NULL;
return NULL;
if (!obj->interceptors) 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
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);
return;
MAGIC_CHECK_END();
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 *
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);
return NULL;
MAGIC_CHECK_END();
if (!func) return NULL;
return NULL;
if (!obj->interceptors) 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_event_callback_call(obj, EVAS_CALLBACK_FREE, NULL);
evas_object_inform_cleanup(obj);
evas_object_intercept_cleanup(obj);
evas_object_smart_cleanup(obj);
obj->func->free(obj);
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);
free(r);
}
while (obj->callbacks.in)
{
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);
}
evas_object_event_callback_cleanup(obj);
while (obj->data.elements)
{
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);
return;
MAGIC_CHECK_END();
if (evas_object_intercept_call_move(obj, x, y)) return;
if (obj->smart.smart)
{
if (obj->smart.smart->func_move)
@ -512,6 +466,7 @@ evas_object_resize(Evas_Object *obj, double w, double h)
return;
MAGIC_CHECK_END();
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->func_resize)
@ -562,6 +517,7 @@ evas_object_show(Evas_Object *obj)
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return;
MAGIC_CHECK_END();
if (evas_object_intercept_call_show(obj)) return;
if (obj->smart.smart)
{
if (obj->smart.smart->func_show)
@ -593,6 +549,7 @@ evas_object_hide(Evas_Object *obj)
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return;
MAGIC_CHECK_END();
if (evas_object_intercept_call_hide(obj)) return;
if (obj->smart.smart)
{
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);
return;
MAGIC_CHECK_END();
if (evas_object_intercept_call_raise(obj)) return;
if (obj->smart.smart)
{
if (obj->smart.smart->func_raise)
@ -83,6 +84,7 @@ evas_object_lower(Evas_Object *obj)
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return;
MAGIC_CHECK_END();
if (evas_object_intercept_call_lower(obj)) return;
if (obj->smart.smart)
{
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);
return;
MAGIC_CHECK_END();
if (evas_object_intercept_call_stack_above(obj, above)) return;
if (obj->smart.smart)
{
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);
return;
MAGIC_CHECK_END();
if (evas_object_intercept_call_stack_below(obj, below)) return;
if (obj->smart.smart)
{
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_UP,
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;
typedef struct _Evas_Rectangle Evas_Rectangle;
struct _Evas_Rectangle
{
int x, y, w, h;
};
typedef struct _Evas Evas;
typedef struct _Evas_Layer Evas_Layer;
typedef struct _Evas_Object Evas_Object;
typedef struct _Evas_Data_Node Evas_Data_Node;
typedef struct _Evas_Func_Node Evas_Func_Node;
typedef struct _Evas_Func Evas_Func;
typedef struct _Evas_Object_Func Evas_Object_Func;
typedef struct _Evas_Key Evas_Key;
typedef struct _Evas_Modifier Evas_Modifier;
typedef struct _Evas_Lock Evas_Lock;
typedef struct _Evas_Smart Evas_Smart;
typedef void Evas_Performance;
typedef struct _Evas Evas;
typedef struct _Evas_Layer Evas_Layer;
typedef struct _Evas_Object Evas_Object;
typedef struct _Evas_Data_Node Evas_Data_Node;
typedef struct _Evas_Func_Node Evas_Func_Node;
typedef struct _Evas_Func Evas_Func;
typedef struct _Evas_Object_Func Evas_Object_Func;
typedef struct _Evas_Key Evas_Key;
typedef struct _Evas_Modifier Evas_Modifier;
typedef struct _Evas_Lock Evas_Lock;
typedef struct _Evas_Smart Evas_Smart;
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_OBJ 0x71777770
@ -88,16 +94,46 @@ if (_r) \
#define MEM_TRY_CALLOC(_ptr, _size)
typedef struct _Evas_Inform_Func Evas_Inform_Func;
struct _Evas_Inform_Func
struct _Evas_Rectangle
{
Evas_List *show;
Evas_List *hide;
Evas_List *move;
Evas_List *resize;
Evas_List *restack;
int x, y, w, h;
};
struct _Evas_Intercept_Func_Basic
{
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
@ -273,7 +309,7 @@ struct _Evas_Object
int delete_me;
Evas_Inform_Func *informers;
Evas_Intercept_Func *interceptors;
struct {
Evas_List *elements;
@ -286,6 +322,15 @@ struct _Evas_Object
Evas_Object_List *up;
Evas_Object_List *move;
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;
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_cleanup(Evas_Object *obj);
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_hide(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_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;