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;