From 72b9af03dedfd491ccd9939388776a93af630cc4 Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Tue, 10 Dec 2002 06:45:18 +0000 Subject: [PATCH] informers & interceptors... meant to "inform" callbacks of when an object has been show, hidden, moved, resized or restacked :) handy for making widgets (ie child widget got resized.. parent can adjust to fit child widget). also interceptors.. designed to allow callbacks to intercept move, resize, show, hide and restacking calls and modiy behavior (handy for widget sets too!) SVN revision: 6488 --- legacy/evas/src/lib/Evas.h | 46 ++- legacy/evas/src/lib/canvas/Makefile.am | 2 + legacy/evas/src/lib/canvas/evas_callbacks.c | 1 + legacy/evas/src/lib/canvas/evas_layer.c | 7 +- .../evas/src/lib/canvas/evas_object_inform.c | 285 ++++++++++++++++++ .../src/lib/canvas/evas_object_intercept.c | 174 +++++++++++ legacy/evas/src/lib/canvas/evas_object_line.c | 2 + legacy/evas/src/lib/canvas/evas_object_main.c | 28 +- .../evas/src/lib/canvas/evas_object_polygon.c | 4 + legacy/evas/src/lib/canvas/evas_object_text.c | 2 + legacy/evas/src/lib/canvas/evas_stack.c | 64 +++- legacy/evas/src/lib/include/evas_private.h | 20 ++ 12 files changed, 608 insertions(+), 27 deletions(-) create mode 100644 legacy/evas/src/lib/canvas/evas_object_inform.c create mode 100644 legacy/evas/src/lib/canvas/evas_object_intercept.c diff --git a/legacy/evas/src/lib/Evas.h b/legacy/evas/src/lib/Evas.h index 73537b1396..f0206bbb22 100644 --- a/legacy/evas/src/lib/Evas.h +++ b/legacy/evas/src/lib/Evas.h @@ -225,6 +225,8 @@ extern "C" { void evas_hash_foreach (Evas_Hash *hash, int (*func) (Evas_Hash *hash, const char *key, void *data, void *fdata), void *fdata); int evas_hash_alloc_error (void); + int evas_alloc_error (void); + Evas *evas_new (void); void evas_free (Evas *e); @@ -301,12 +303,6 @@ extern "C" { void evas_object_image_cache_set (Evas *e, int size); int evas_object_image_cache_get (Evas *e); - /* FIXME: add: - * multiple image format handler code (clean internal api) - * image loader (provided by app) code (callbacks) - * loadable image loader module query etc. code - */ - Evas_Object *evas_object_text_add (Evas *e); void evas_object_text_font_set (Evas_Object *obj, char *font, double size); void evas_object_text_font_get (Evas_Object *obj, char **font, double *size); @@ -324,10 +320,6 @@ extern "C" { int evas_object_text_char_pos_get (Evas_Object *obj, int pos, double *cx, double *cy, double *cw, double *ch); int evas_object_text_char_coords_get (Evas_Object *obj, double x, double y, double *cx, double *cy, double *cw, double *ch); - /* FIXME: add: - * text outline & shadowing code - */ - void evas_object_font_path_clear (Evas *e); void evas_object_font_path_append (Evas *e, char *path); void evas_object_font_path_prepend (Evas *e, char *path); @@ -458,9 +450,39 @@ 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); + void *evas_object_intercept_hide_callback_del (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj)); + void evas_object_intercept_move_callback_add (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, double x, double y), void *data); + void *evas_object_intercept_move_callback_del (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, double x, double y)); + void evas_object_intercept_resize_callback_add (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, double w, double h), void *data); + void *evas_object_intercept_resize_callback_del (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, double w, double h)); + void evas_object_intercept_raise_callback_add (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data); + void *evas_object_intercept_raise_callback_del (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj)); + void evas_object_intercept_lower_callback_add (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data); + void *evas_object_intercept_lower_callback_del (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj)); + void evas_object_intercept_stack_above_callback_add (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Object *above), void *data); + void *evas_object_intercept_stack_above_callback_del (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Object *above)); + void evas_object_intercept_stack_below_callback_add (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Object *below), void *data); + 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 */ - int evas_alloc_error (void); - #ifdef __cplusplus } #endif diff --git a/legacy/evas/src/lib/canvas/Makefile.am b/legacy/evas/src/lib/canvas/Makefile.am index 89a70f5d60..ad213ce59f 100644 --- a/legacy/evas/src/lib/canvas/Makefile.am +++ b/legacy/evas/src/lib/canvas/Makefile.am @@ -26,6 +26,8 @@ evas_name.c \ evas_object_gradient.c \ evas_object_image.c \ evas_object_main.c \ +evas_object_inform.c \ +evas_object_intercept.c \ evas_object_line.c \ evas_object_polygon.c \ evas_object_rectangle.c \ diff --git a/legacy/evas/src/lib/canvas/evas_callbacks.c b/legacy/evas/src/lib/canvas/evas_callbacks.c index a277eb54c6..5ab1966f36 100644 --- a/legacy/evas/src/lib/canvas/evas_callbacks.c +++ b/legacy/evas/src/lib/canvas/evas_callbacks.c @@ -223,6 +223,7 @@ evas_object_event_callback_add(Evas_Object *obj, Evas_Callback_Type type, void ( if (!evas_mem_degrade(sizeof(Evas_List))) { MERR_FATAL(); + free(fn); return; } } diff --git a/legacy/evas/src/lib/canvas/evas_layer.c b/legacy/evas/src/lib/canvas/evas_layer.c index 3064b844f2..5fd2703c90 100644 --- a/legacy/evas/src/lib/canvas/evas_layer.c +++ b/legacy/evas/src/lib/canvas/evas_layer.c @@ -128,7 +128,11 @@ evas_object_layer_set(Evas_Object *obj, int l) obj->cur.layer = l; evas_object_inject(obj, e); obj->restack = 1; - if (obj->clip.clipees) return; + if (obj->clip.clipees) + { + evas_object_inform_call_restack(obj); + return; + } if (!obj->smart.smart) { evas_object_change(obj); @@ -139,6 +143,7 @@ evas_object_layer_set(Evas_Object *obj, int l) if (evas_list_find(obj->layer->evas->pointer.object.in, obj)) evas_event_feed_mouse_move(obj->layer->evas, obj->layer->evas->pointer.x, obj->layer->evas->pointer.y); } + evas_object_inform_call_restack(obj); } int diff --git a/legacy/evas/src/lib/canvas/evas_object_inform.c b/legacy/evas/src/lib/canvas/evas_object_inform.c new file mode 100644 index 0000000000..c4fa60097d --- /dev/null +++ b/legacy/evas/src/lib/canvas/evas_object_inform.c @@ -0,0 +1,285 @@ +#include "evas_common.h" +#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); +} + +void +evas_object_inform_call_hide(Evas_Object *obj) +{ + if (!obj->informers) return; + evas_object_inform_call(obj, obj->informers->hide); +} + +void +evas_object_inform_call_move(Evas_Object *obj) +{ + if (!obj->informers) return; + evas_object_inform_call(obj, obj->informers->move); +} + +void +evas_object_inform_call_resize(Evas_Object *obj) +{ + if (!obj->informers) return; + evas_object_inform_call(obj, obj->informers->resize); +} + +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); +} diff --git a/legacy/evas/src/lib/canvas/evas_object_intercept.c b/legacy/evas/src/lib/canvas/evas_object_intercept.c new file mode 100644 index 0000000000..dbbd66d804 --- /dev/null +++ b/legacy/evas/src/lib/canvas/evas_object_intercept.c @@ -0,0 +1,174 @@ +#include "evas_common.h" +#include "evas_private.h" +#include "Evas.h" + +void +evas_object_intercept_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; +} + +void * +evas_object_intercept_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 NULL; +} + +void +evas_object_intercept_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; +} + +void * +evas_object_intercept_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 NULL; + return NULL; +} + +void +evas_object_intercept_move_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, double x, double y), void *data) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + if (!func) return; +} + +void * +evas_object_intercept_move_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, double x, double y)) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return NULL; + MAGIC_CHECK_END(); + if (!func) return NULL; + return NULL; +} + +void +evas_object_intercept_resize_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, double w, double h), void *data) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + if (!func) return; +} + +void * +evas_object_intercept_resize_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, double w, double h)) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return NULL; + MAGIC_CHECK_END(); + if (!func) return NULL; + return NULL; +} + +void +evas_object_intercept_raise_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; +} + +void * +evas_object_intercept_raise_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 NULL; +} + +void +evas_object_intercept_lower_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; +} + +void * +evas_object_intercept_lower_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 NULL; +} + +void +evas_object_intercept_stack_above_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Object *above), void *data) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + if (!func) return; +} + +void * +evas_object_intercept_stack_above_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Object *above)) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return NULL; + MAGIC_CHECK_END(); + if (!func) return NULL; + return NULL; +} + +void +evas_object_intercept_stack_below_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Object *below), void *data) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + if (!func) return; +} + +void * +evas_object_intercept_stack_below_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Object *below)) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return NULL; + MAGIC_CHECK_END(); + if (!func) return NULL; + return NULL; +} + +void +evas_object_intercept_layer_set_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, int l), void *data) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + if (!func) return; +} + +void * +evas_object_intercept_layer_set_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, int l)) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return NULL; + MAGIC_CHECK_END(); + if (!func) return NULL; + return NULL; +} diff --git a/legacy/evas/src/lib/canvas/evas_object_line.c b/legacy/evas/src/lib/canvas/evas_object_line.c index 98498c5282..43d59d28ba 100644 --- a/legacy/evas/src/lib/canvas/evas_object_line.c +++ b/legacy/evas/src/lib/canvas/evas_object_line.c @@ -131,6 +131,8 @@ evas_object_line_xy_set(Evas_Object *obj, double x1, double y1, double x2, doubl evas_event_feed_mouse_move(obj->layer->evas, obj->layer->evas->pointer.x, obj->layer->evas->pointer.y); + evas_object_inform_call_move(obj); + evas_object_inform_call_resize(obj); } void diff --git a/legacy/evas/src/lib/canvas/evas_object_main.c b/legacy/evas/src/lib/canvas/evas_object_main.c index 5e9b66a9af..e7e9b729ef 100644 --- a/legacy/evas/src/lib/canvas/evas_object_main.c +++ b/legacy/evas/src/lib/canvas/evas_object_main.c @@ -20,6 +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_smart_cleanup(obj); obj->func->free(obj); if (obj->name) @@ -476,7 +477,11 @@ evas_object_move(Evas_Object *obj, double x, double y) obj->smart.smart->func_move(obj, x, y); } if ((obj->cur.geometry.x == x) && - (obj->cur.geometry.y == y)) return; + (obj->cur.geometry.y == y)) + { + evas_object_inform_call_move(obj); + return; + } was = evas_object_is_in_output_rect(obj, obj->layer->evas->pointer.x, obj->layer->evas->pointer.y, 1, 1); @@ -495,6 +500,7 @@ evas_object_move(Evas_Object *obj, double x, double y) obj->layer->evas->pointer.x, obj->layer->evas->pointer.y); } + evas_object_inform_call_move(obj); } void @@ -512,7 +518,11 @@ evas_object_resize(Evas_Object *obj, double w, double h) obj->smart.smart->func_resize(obj, w, h); } if ((obj->cur.geometry.w == w) && - (obj->cur.geometry.h == h)) return; + (obj->cur.geometry.h == h)) + { + evas_object_inform_call_resize(obj); + return; + } was = evas_object_is_in_output_rect(obj, obj->layer->evas->pointer.x, obj->layer->evas->pointer.y, 1, 1); @@ -557,7 +567,11 @@ evas_object_show(Evas_Object *obj) if (obj->smart.smart->func_show) obj->smart.smart->func_show(obj); } - if (obj->cur.visible) return; + if (obj->cur.visible) + { + evas_object_inform_call_show(obj); + return; + } obj->cur.visible = 1; evas_object_change(obj); evas_object_recalc_clippees(obj); @@ -570,6 +584,7 @@ evas_object_show(Evas_Object *obj) obj->layer->evas->pointer.x, obj->layer->evas->pointer.y); } + evas_object_inform_call_show(obj); } void @@ -583,7 +598,11 @@ evas_object_hide(Evas_Object *obj) if (obj->smart.smart->func_hide) obj->smart.smart->func_hide(obj); } - if (!obj->cur.visible) return; + if (!obj->cur.visible) + { + evas_object_inform_call_hide(obj); + return; + } obj->cur.visible = 0; evas_object_change(obj); evas_object_recalc_clippees(obj); @@ -615,6 +634,7 @@ evas_object_hide(Evas_Object *obj) } } } + evas_object_inform_call_hide(obj); } int diff --git a/legacy/evas/src/lib/canvas/evas_object_polygon.c b/legacy/evas/src/lib/canvas/evas_object_polygon.c index 5c4724b997..bec15f22af 100644 --- a/legacy/evas/src/lib/canvas/evas_object_polygon.c +++ b/legacy/evas/src/lib/canvas/evas_object_polygon.c @@ -129,6 +129,8 @@ evas_object_polygon_point_add(Evas_Object *obj, double x, double y) evas_event_feed_mouse_move(obj->layer->evas, obj->layer->evas->pointer.x, obj->layer->evas->pointer.y); + evas_object_inform_call_move(obj); + evas_object_inform_call_resize(obj); } void @@ -165,6 +167,8 @@ evas_object_polygon_points_clear(Evas_Object *obj) evas_event_feed_mouse_move(obj->layer->evas, obj->layer->evas->pointer.x, obj->layer->evas->pointer.y); + evas_object_inform_call_move(obj); + evas_object_inform_call_resize(obj); } diff --git a/legacy/evas/src/lib/canvas/evas_object_text.c b/legacy/evas/src/lib/canvas/evas_object_text.c index 0c50d7d6ff..281cbc0bd3 100644 --- a/legacy/evas/src/lib/canvas/evas_object_text.c +++ b/legacy/evas/src/lib/canvas/evas_object_text.c @@ -265,6 +265,7 @@ evas_object_text_font_set(Evas_Object *obj, char *font, double size) evas_event_feed_mouse_move(obj->layer->evas, obj->layer->evas->pointer.x, obj->layer->evas->pointer.y); + evas_object_inform_call_resize(obj); } void @@ -338,6 +339,7 @@ evas_object_text_text_set(Evas_Object *obj, char *text) evas_event_feed_mouse_move(obj->layer->evas, obj->layer->evas->pointer.x, obj->layer->evas->pointer.y); + evas_object_inform_call_resize(obj); } char * diff --git a/legacy/evas/src/lib/canvas/evas_stack.c b/legacy/evas/src/lib/canvas/evas_stack.c index 8e305b2415..a7cd3fd88f 100644 --- a/legacy/evas/src/lib/canvas/evas_stack.c +++ b/legacy/evas/src/lib/canvas/evas_stack.c @@ -52,10 +52,18 @@ evas_object_raise(Evas_Object *obj) if (obj->smart.smart->func_raise) obj->smart.smart->func_raise(obj); } - if (!(((Evas_Object_List *)obj)->next)) return; + if (!(((Evas_Object_List *)obj)->next)) + { + evas_object_inform_call_restack(obj); + return; + } obj->layer->objects = evas_object_list_remove(obj->layer->objects, obj); obj->layer->objects = evas_object_list_append(obj->layer->objects, obj); - if (obj->clip.clipees) return; + if (obj->clip.clipees) + { + evas_object_inform_call_restack(obj); + return; + } obj->restack = 1; evas_object_change(obj); if (!obj->smart.smart) @@ -66,6 +74,7 @@ evas_object_raise(Evas_Object *obj) obj->cur.visible) evas_event_feed_mouse_move(obj->layer->evas, obj->layer->evas->pointer.x, obj->layer->evas->pointer.y); } + evas_object_inform_call_restack(obj); } void @@ -79,10 +88,18 @@ evas_object_lower(Evas_Object *obj) if (obj->smart.smart->func_lower) obj->smart.smart->func_lower(obj); } - if (!(((Evas_Object_List *)obj)->prev)) return; + if (!(((Evas_Object_List *)obj)->prev)) + { + evas_object_inform_call_restack(obj); + return; + } obj->layer->objects = evas_object_list_remove(obj->layer->objects, obj); obj->layer->objects = evas_object_list_prepend(obj->layer->objects, obj); - if (obj->clip.clipees) return; + if (obj->clip.clipees) + { + evas_object_inform_call_restack(obj); + return; + } obj->restack = 1; evas_object_change(obj); if (!obj->smart.smart) @@ -93,6 +110,7 @@ evas_object_lower(Evas_Object *obj) obj->cur.visible) evas_event_feed_mouse_move(obj->layer->evas, obj->layer->evas->pointer.x, obj->layer->evas->pointer.y); } + evas_object_inform_call_restack(obj); } void @@ -109,11 +127,23 @@ evas_object_stack_above(Evas_Object *obj, Evas_Object *above) if (obj->smart.smart->func_stack_above) obj->smart.smart->func_stack_above(obj, above); } - if (above->layer != obj->layer) return; - if (((Evas_Object_List *)obj)->prev == (Evas_Object_List *)above) return; + if (above->layer != obj->layer) + { + evas_object_inform_call_restack(obj); + return; + } + if (((Evas_Object_List *)obj)->prev == (Evas_Object_List *)above) + { + evas_object_inform_call_restack(obj); + return; + } obj->layer->objects = evas_object_list_remove(obj->layer->objects, obj); obj->layer->objects = evas_object_list_append_relative(obj->layer->objects, obj, above); - if (obj->clip.clipees) return; + if (obj->clip.clipees) + { + evas_object_inform_call_restack(obj); + return; + } obj->restack = 1; evas_object_change(obj); if (!obj->smart.smart) @@ -124,6 +154,7 @@ evas_object_stack_above(Evas_Object *obj, Evas_Object *above) obj->cur.visible) evas_event_feed_mouse_move(obj->layer->evas, obj->layer->evas->pointer.x, obj->layer->evas->pointer.y); } + evas_object_inform_call_restack(obj); } void @@ -140,11 +171,23 @@ evas_object_stack_below(Evas_Object *obj, Evas_Object *below) if (obj->smart.smart->func_stack_below) obj->smart.smart->func_stack_below(obj, below); } - if (below->layer != obj->layer) return; - if (((Evas_Object_List *)obj)->next == (Evas_Object_List *)below) return; + if (below->layer != obj->layer) + { + evas_object_inform_call_restack(obj); + return; + } + if (((Evas_Object_List *)obj)->next == (Evas_Object_List *)below) + { + evas_object_inform_call_restack(obj); + return; + } obj->layer->objects = evas_object_list_remove(obj->layer->objects, obj); obj->layer->objects = evas_object_list_prepend_relative(obj->layer->objects, obj, below); - if (obj->clip.clipees) return; + if (obj->clip.clipees) + { + evas_object_inform_call_restack(obj); + return; + } obj->restack = 1; evas_object_change(obj); if (!obj->smart.smart) @@ -155,6 +198,7 @@ evas_object_stack_below(Evas_Object *obj, Evas_Object *below) obj->cur.visible) evas_event_feed_mouse_move(obj->layer->evas, obj->layer->evas->pointer.x, obj->layer->evas->pointer.y); } + evas_object_inform_call_restack(obj); } Evas_Object * diff --git a/legacy/evas/src/lib/include/evas_private.h b/legacy/evas/src/lib/include/evas_private.h index 682a17b886..e8de53ef65 100644 --- a/legacy/evas/src/lib/include/evas_private.h +++ b/legacy/evas/src/lib/include/evas_private.h @@ -89,6 +89,17 @@ if (_r) \ #define MEM_TRY_CALLOC(_ptr, _size) +typedef struct _Evas_Inform_Func Evas_Inform_Func; + +struct _Evas_Inform_Func +{ + Evas_List *show; + Evas_List *hide; + Evas_List *move; + Evas_List *resize; + Evas_List *restack; +}; + struct _Evas_Smart { DATA32 magic; @@ -258,9 +269,12 @@ struct _Evas_Object int mouse_in : 1; int mouse_grabbed : 1; int pre_render_done : 1; + int intercepted : 1; int delete_me; + Evas_Inform_Func *informers; + struct { Evas_List *elements; } data; @@ -462,6 +476,12 @@ 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_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); extern int _evas_alloc_error;