efl/legacy/evas/src/lib/canvas/evas_layer.c

197 lines
4.0 KiB
C
Raw Normal View History

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
if (obj->in_layer) return;
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);
lay->usage++;
2002-11-08 00:02:15 -08:00
obj->layer = lay;
obj->in_layer = 1;
2002-11-08 00:02:15 -08:00
}
void
evas_object_release(Evas_Object *obj, int clean_layer)
{
if (!obj->in_layer) return;
2002-11-08 00:02:15 -08:00
obj->layer->objects = evas_object_list_remove(obj->layer->objects, obj);
obj->layer->usage--;
2002-11-08 00:02:15 -08:00
if (clean_layer)
{
if (obj->layer->usage <= 0)
2002-11-08 00:02:15 -08:00
{
evas_layer_del(obj->layer);
evas_layer_free(obj->layer);
}
}
obj->layer = NULL;
obj->in_layer = 0;
2002-11-08 00:02:15 -08:00
}
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;
}
void
evas_layer_pre_free(Evas_Layer *lay)
{
Evas_Object_List *l;
2005-05-21 19:49:50 -07:00
for (l = (Evas_Object_List *)lay->objects; l; l = l->next)
{
Evas_Object *obj;
2005-05-21 19:49:50 -07:00
obj = (Evas_Object *)l;
if (!obj->smart.parent) evas_object_del(obj);
}
}
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 */
/**
* @defgroup Evas_Object_Layer_Group Object Layer Functions
*
* Functions that retrieve and set the layer that an evas object is on.
2005-05-21 19:49:50 -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
*/
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();
if (evas_object_intercept_call_layer_set(obj, l)) return;
if (obj->smart.parent) 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;
}
e = obj->layer->evas;
evas_object_release(obj, 1);
obj->cur.layer = l;
evas_object_inject(obj, e);
obj->restack = 1;
evas_object_change(obj);
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))
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
}
evas_object_inform_call_restack(obj);
2002-11-08 00:02:15 -08: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
*/
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;
}