2002-11-08 00:02:15 -08:00
|
|
|
#include "evas_common.h"
|
|
|
|
#include "evas_private.h"
|
|
|
|
|
|
|
|
void
|
|
|
|
evas_object_inject(Evas_Object *obj, Evas *e)
|
|
|
|
{
|
|
|
|
Evas_Layer *lay;
|
2005-05-21 19:49:50 -07:00
|
|
|
|
2002-11-08 00:02:15 -08:00
|
|
|
lay = evas_layer_find(e, obj->cur.layer);
|
|
|
|
if (!lay)
|
|
|
|
{
|
|
|
|
lay = evas_layer_new(e);
|
|
|
|
lay->layer = obj->cur.layer;
|
|
|
|
evas_layer_add(lay);
|
|
|
|
}
|
2005-05-21 19:49:50 -07:00
|
|
|
lay->objects = evas_object_list_append(lay->objects, obj);
|
2002-11-08 00:02:15 -08:00
|
|
|
obj->layer = lay;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
evas_object_release(Evas_Object *obj, int clean_layer)
|
|
|
|
{
|
|
|
|
obj->layer->objects = evas_object_list_remove(obj->layer->objects, obj);
|
|
|
|
if (clean_layer)
|
|
|
|
{
|
|
|
|
if (!obj->layer->objects)
|
|
|
|
{
|
|
|
|
evas_layer_del(obj->layer);
|
|
|
|
evas_layer_free(obj->layer);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
obj->layer = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
Evas_Layer *
|
|
|
|
evas_layer_new(Evas *e)
|
|
|
|
{
|
|
|
|
Evas_Layer *lay;
|
2005-05-21 19:49:50 -07:00
|
|
|
|
2002-11-08 00:02:15 -08:00
|
|
|
lay = calloc(1, sizeof(Evas_Layer));
|
|
|
|
if (!lay) return NULL;
|
|
|
|
lay->evas = e;
|
|
|
|
return lay;
|
|
|
|
}
|
|
|
|
|
2003-01-09 21:38:47 -08:00
|
|
|
void
|
|
|
|
evas_layer_pre_free(Evas_Layer *lay)
|
|
|
|
{
|
|
|
|
Evas_Object_List *l;
|
2005-05-21 19:49:50 -07:00
|
|
|
|
2003-01-09 21:38:47 -08:00
|
|
|
for (l = (Evas_Object_List *)lay->objects; l; l = l->next)
|
|
|
|
{
|
|
|
|
Evas_Object *obj;
|
2005-05-21 19:49:50 -07:00
|
|
|
|
2003-01-09 21:38:47 -08:00
|
|
|
obj = (Evas_Object *)l;
|
2003-07-29 19:58:10 -07:00
|
|
|
if (!obj->smart.parent) evas_object_del(obj);
|
2003-01-09 21:38:47 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2002-11-08 00:02:15 -08:00
|
|
|
void
|
|
|
|
evas_layer_free(Evas_Layer *lay)
|
|
|
|
{
|
|
|
|
while (lay->objects)
|
|
|
|
{
|
|
|
|
Evas_Object *obj;
|
2005-05-21 19:49:50 -07:00
|
|
|
|
2002-11-08 00:02:15 -08:00
|
|
|
obj = (Evas_Object *)lay->objects;
|
|
|
|
evas_object_free(obj, 0);
|
|
|
|
}
|
|
|
|
free(lay);
|
|
|
|
}
|
|
|
|
|
|
|
|
Evas_Layer *
|
|
|
|
evas_layer_find(Evas *e, int layer_num)
|
|
|
|
{
|
|
|
|
Evas_Object_List *list;
|
2005-05-21 19:49:50 -07:00
|
|
|
|
2002-11-08 00:02:15 -08:00
|
|
|
for (list = (Evas_Object_List *)e->layers; list; list = list->next)
|
|
|
|
{
|
|
|
|
Evas_Layer *layer;
|
2005-05-21 19:49:50 -07:00
|
|
|
|
2002-11-08 00:02:15 -08:00
|
|
|
layer = (Evas_Layer *)list;
|
|
|
|
if (layer->layer == layer_num) return layer;
|
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
evas_layer_add(Evas_Layer *lay)
|
|
|
|
{
|
|
|
|
Evas_Object_List *list;
|
2005-05-21 19:49:50 -07:00
|
|
|
|
2002-11-08 00:02:15 -08:00
|
|
|
for (list = (Evas_Object_List *)lay->evas->layers; list; list = list->next)
|
|
|
|
{
|
|
|
|
Evas_Layer *layer;
|
2005-05-21 19:49:50 -07:00
|
|
|
|
2002-11-08 00:02:15 -08:00
|
|
|
layer = (Evas_Layer *)list;
|
|
|
|
if (layer->layer > lay->layer)
|
|
|
|
{
|
|
|
|
lay->evas->layers = evas_object_list_prepend_relative(lay->evas->layers, lay, layer);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
lay->evas->layers = evas_object_list_append(lay->evas->layers, lay);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
evas_layer_del(Evas_Layer *lay)
|
|
|
|
{
|
|
|
|
Evas_Object_List *ol;
|
|
|
|
Evas *e;
|
2005-05-21 19:49:50 -07:00
|
|
|
|
2002-11-08 00:02:15 -08:00
|
|
|
ol = (Evas_Object_List *)lay;
|
|
|
|
e = lay->evas;
|
|
|
|
e->layers = evas_object_list_remove(e->layers, lay);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* public functions */
|
|
|
|
|
2003-03-04 18:30:20 -08:00
|
|
|
/**
|
2004-08-23 16:04:34 -07:00
|
|
|
* @defgroup Evas_Object_Layer_Group Object Layer Functions
|
2003-03-04 18:30:20 -08:00
|
|
|
*
|
2004-08-23 16:04:34 -07:00
|
|
|
* Functions that retrieve and set the layer that an evas object is on.
|
2005-05-21 19:49:50 -07:00
|
|
|
*
|
2004-08-23 16:04:34 -07:00
|
|
|
* @todo Document which way layers go.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Sets the layer of the evas that the given object will be part of.
|
|
|
|
* @param obj The given evas object.
|
|
|
|
* @param l The number of the layer to place the object on.
|
|
|
|
* @ingroup Evas_Object_Layer_Group
|
2003-03-04 18:30:20 -08:00
|
|
|
*/
|
2002-11-08 00:02:15 -08:00
|
|
|
void
|
|
|
|
evas_object_layer_set(Evas_Object *obj, int l)
|
|
|
|
{
|
|
|
|
Evas *e;
|
2005-05-21 19:49:50 -07:00
|
|
|
|
2002-11-08 00:02:15 -08:00
|
|
|
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
|
|
|
|
return;
|
|
|
|
MAGIC_CHECK_END();
|
2002-12-14 16:33:57 -08:00
|
|
|
if (evas_object_intercept_call_layer_set(obj, l)) return;
|
2005-05-21 19:49:50 -07:00
|
|
|
if (obj->cur.layer == l)
|
2002-11-08 00:02:15 -08:00
|
|
|
{
|
|
|
|
evas_object_raise(obj);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (obj->smart.smart)
|
|
|
|
{
|
2003-10-08 20:05:17 -07:00
|
|
|
if (obj->smart.smart->smart_class->layer_set)
|
|
|
|
obj->smart.smart->smart_class->layer_set(obj, l);
|
2002-11-08 00:02:15 -08:00
|
|
|
}
|
|
|
|
e = obj->layer->evas;
|
|
|
|
evas_object_release(obj, 1);
|
|
|
|
obj->cur.layer = l;
|
|
|
|
evas_object_inject(obj, e);
|
|
|
|
obj->restack = 1;
|
2002-12-09 22:45:18 -08:00
|
|
|
if (obj->clip.clipees)
|
|
|
|
{
|
|
|
|
evas_object_inform_call_restack(obj);
|
|
|
|
return;
|
|
|
|
}
|
2002-11-08 00:02:15 -08:00
|
|
|
if (!obj->smart.smart)
|
|
|
|
{
|
|
|
|
evas_object_change(obj);
|
2005-05-21 19:49:50 -07:00
|
|
|
if (evas_object_is_in_output_rect(obj,
|
|
|
|
obj->layer->evas->pointer.x,
|
2002-11-08 00:02:15 -08:00
|
|
|
obj->layer->evas->pointer.y, 1, 1) &&
|
|
|
|
obj->cur.visible)
|
|
|
|
if (evas_list_find(obj->layer->evas->pointer.object.in, obj))
|
2005-07-25 02:55:47 -07:00
|
|
|
evas_event_feed_mouse_move(obj->layer->evas,
|
|
|
|
obj->layer->evas->pointer.x,
|
|
|
|
obj->layer->evas->pointer.y,
|
|
|
|
obj->layer->evas->last_timestamp,
|
|
|
|
NULL);
|
2002-11-08 00:02:15 -08:00
|
|
|
}
|
2002-12-09 22:45:18 -08:00
|
|
|
evas_object_inform_call_restack(obj);
|
2002-11-08 00:02:15 -08:00
|
|
|
}
|
|
|
|
|
2003-03-04 18:30:20 -08:00
|
|
|
/**
|
2004-08-23 16:04:34 -07:00
|
|
|
* Retrieves the layer of the evas that the given object is part of.
|
|
|
|
* @param obj The given evas object.
|
|
|
|
* @return Number of the layer.
|
|
|
|
* @ingroup Evas_Object_Layer_Group
|
2003-03-04 18:30:20 -08:00
|
|
|
*/
|
2002-11-08 00:02:15 -08:00
|
|
|
int
|
|
|
|
evas_object_layer_get(Evas_Object *obj)
|
|
|
|
{
|
|
|
|
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
|
|
|
|
return 0;
|
|
|
|
MAGIC_CHECK_END();
|
|
|
|
return obj->cur.layer;
|
|
|
|
}
|