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
This commit is contained in:
Carsten Haitzler 2002-12-10 06:45:18 +00:00
parent 0471054d09
commit 72b9af03de
12 changed files with 608 additions and 27 deletions

View File

@ -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

View File

@ -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 \

View File

@ -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;
}
}

View File

@ -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

View File

@ -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);
}

View File

@ -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;
}

View File

@ -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

View File

@ -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

View File

@ -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);
}

View File

@ -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 *

View File

@ -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 *

View File

@ -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;