1 #include "evas_common.h"
2 #include "evas_private.h"
4 static void _evas_layer_free(Evas_Layer *lay);
7 evas_object_inject(Evas_Object *obj, Evas *e)
11 if (obj->in_layer) return;
12 lay = evas_layer_find(e, obj->cur.layer);
15 lay = evas_layer_new(e);
16 lay->layer = obj->cur.layer;
19 lay->objects = (Evas_Object *)eina_inlist_append(EINA_INLIST_GET(lay->objects), EINA_INLIST_GET(obj));
26 evas_object_release(Evas_Object *obj, int clean_layer)
28 if (!obj->in_layer) return;
29 obj->layer->objects = (Evas_Object *)eina_inlist_remove(EINA_INLIST_GET(obj->layer->objects), EINA_INLIST_GET(obj));
33 if (obj->layer->usage <= 0)
35 evas_layer_del(obj->layer);
36 _evas_layer_free(obj->layer);
44 evas_layer_new(Evas *e)
48 lay = calloc(1, sizeof(Evas_Layer));
49 if (!lay) return NULL;
55 _evas_layer_free(Evas_Layer *lay)
61 evas_layer_pre_free(Evas_Layer *lay)
65 EINA_INLIST_FOREACH(lay->objects, obj)
67 if ((!obj->smart.parent) && (!obj->delete_me))
73 evas_layer_free_objects(Evas_Layer *lay)
79 obj = (Evas_Object *)lay->objects;
80 evas_object_free(obj, 0);
85 evas_layer_clean(Evas *e)
93 _evas_layer_free(tmp);
98 evas_layer_find(Evas *e, short layer_num)
102 EINA_INLIST_FOREACH(e->layers, layer)
104 if (layer->layer == layer_num) return layer;
110 evas_layer_add(Evas_Layer *lay)
114 EINA_INLIST_FOREACH(lay->evas->layers, layer)
116 if (layer->layer > lay->layer)
118 lay->evas->layers = (Evas_Layer *)eina_inlist_prepend_relative(EINA_INLIST_GET(lay->evas->layers),
119 EINA_INLIST_GET(lay),
120 EINA_INLIST_GET(layer));
124 lay->evas->layers = (Evas_Layer *)eina_inlist_append(EINA_INLIST_GET(lay->evas->layers), EINA_INLIST_GET(lay));
128 evas_layer_del(Evas_Layer *lay)
133 e->layers = (Evas_Layer *)eina_inlist_remove(EINA_INLIST_GET(e->layers), EINA_INLIST_GET(lay));
137 _evas_object_layer_set_child(Evas_Object *obj, Evas_Object *par, short l)
141 if (obj->delete_me) return;
142 if (obj->cur.layer == l) return;
143 e = obj->layer->evas;
144 evas_object_release(obj, 1);
146 obj->layer = par->layer;
148 if (obj->smart.smart)
150 Eina_Inlist *contained;
153 contained = (Eina_Inlist *)evas_object_smart_members_get_direct(obj);
154 EINA_INLIST_FOREACH(contained, member)
156 _evas_object_layer_set_child(member, obj, l);
161 /* public functions */
164 evas_object_layer_set(Evas_Object *obj, short l)
168 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
171 if (obj->delete_me) return;
172 if (evas_object_intercept_call_layer_set(obj, l)) return;
173 if (obj->smart.parent) return;
174 if (obj->cur.layer == l)
176 evas_object_raise(obj);
179 e = obj->layer->evas;
180 evas_object_release(obj, 1);
182 evas_object_inject(obj, e);
184 evas_object_change(obj);
185 if (obj->clip.clipees)
187 evas_object_inform_call_restack(obj);
190 evas_object_change(obj);
191 if (!obj->smart.smart)
193 if (evas_object_is_in_output_rect(obj,
194 obj->layer->evas->pointer.x,
195 obj->layer->evas->pointer.y, 1, 1) &&
197 if (eina_list_data_find(obj->layer->evas->pointer.object.in, obj))
198 evas_event_feed_mouse_move(obj->layer->evas,
199 obj->layer->evas->pointer.x,
200 obj->layer->evas->pointer.y,
201 obj->layer->evas->last_timestamp,
206 Eina_Inlist *contained;
209 contained = (Eina_Inlist *)evas_object_smart_members_get_direct(obj);
210 EINA_INLIST_FOREACH(contained, member)
212 _evas_object_layer_set_child(member, obj, l);
215 evas_object_inform_call_restack(obj);
219 evas_object_layer_get(const Evas_Object *obj)
221 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
224 if (obj->smart.parent)
226 return obj->smart.parent->cur.layer;
228 return obj->cur.layer;